From fa395e856ea1dcdd1e814712278fb4543429acd6 Mon Sep 17 00:00:00 2001 From: Alec Larson Date: Tue, 4 Jun 2019 16:10:59 -0400 Subject: [PATCH 1/2] test: "export *" before named export --- .../export-all-before-named/_config.js | 7 ++++++ .../export-all-before-named/_expected/amd.js | 22 +++++++++++++++++++ .../export-all-before-named/_expected/cjs.js | 22 +++++++++++++++++++ .../export-all-before-named/_expected/es.js | 4 ++++ .../_expected/system.js | 19 ++++++++++++++++ .../samples/export-all-before-named/main.js | 2 ++ .../export-all-before-named/path-plus.js | 3 +++ 7 files changed, 79 insertions(+) create mode 100644 test/form/samples/export-all-before-named/_config.js create mode 100644 test/form/samples/export-all-before-named/_expected/amd.js create mode 100644 test/form/samples/export-all-before-named/_expected/cjs.js create mode 100644 test/form/samples/export-all-before-named/_expected/es.js create mode 100644 test/form/samples/export-all-before-named/_expected/system.js create mode 100644 test/form/samples/export-all-before-named/main.js create mode 100644 test/form/samples/export-all-before-named/path-plus.js diff --git a/test/form/samples/export-all-before-named/_config.js b/test/form/samples/export-all-before-named/_config.js new file mode 100644 index 00000000000..11461d6ba46 --- /dev/null +++ b/test/form/samples/export-all-before-named/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: 'external `export *` must not interfere with internal exports', + options: { + options: { output: { name: 'exposedInternals' } }, + external: ['path'] + } +}; diff --git a/test/form/samples/export-all-before-named/_expected/amd.js b/test/form/samples/export-all-before-named/_expected/amd.js new file mode 100644 index 00000000000..eebdfa12a2a --- /dev/null +++ b/test/form/samples/export-all-before-named/_expected/amd.js @@ -0,0 +1,22 @@ +define(['exports', 'path'], function (exports, path) { 'use strict'; + + + + Object.keys(path).forEach(function (key) { + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return path[key]; + } + }); + }); + Object.defineProperty(exports, 'isRelative', { + enumerable: true, + get: function () { + return path.isRelative; + } + }); + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/form/samples/export-all-before-named/_expected/cjs.js b/test/form/samples/export-all-before-named/_expected/cjs.js new file mode 100644 index 00000000000..a60cf7aba6c --- /dev/null +++ b/test/form/samples/export-all-before-named/_expected/cjs.js @@ -0,0 +1,22 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var path = require('path'); + + + +Object.keys(path).forEach(function (key) { + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return path[key]; + } + }); +}); +Object.defineProperty(exports, 'isRelative', { + enumerable: true, + get: function () { + return path.isRelative; + } +}); diff --git a/test/form/samples/export-all-before-named/_expected/es.js b/test/form/samples/export-all-before-named/_expected/es.js new file mode 100644 index 00000000000..8cc1f4cd07a --- /dev/null +++ b/test/form/samples/export-all-before-named/_expected/es.js @@ -0,0 +1,4 @@ +export * from 'path'; +export function isRelative(path) { + return path[0] === '.'; +} diff --git a/test/form/samples/export-all-before-named/_expected/system.js b/test/form/samples/export-all-before-named/_expected/system.js new file mode 100644 index 00000000000..01169709775 --- /dev/null +++ b/test/form/samples/export-all-before-named/_expected/system.js @@ -0,0 +1,19 @@ +System.register(['path'], function (exports) { + 'use strict'; + var _starExcludes = { default: 1, isRelative: 1 }; + return { + setters: [function (module) { + var _setter = {}; + for (var _$p in module) { + if (!_starExcludes[_$p]) _setter[_$p] = module[_$p]; + } + _setter.isRelative = module.isRelative; + exports(_setter); + }], + execute: function () { + + + + } + }; +}); diff --git a/test/form/samples/export-all-before-named/main.js b/test/form/samples/export-all-before-named/main.js new file mode 100644 index 00000000000..fe51ad3016f --- /dev/null +++ b/test/form/samples/export-all-before-named/main.js @@ -0,0 +1,2 @@ +export * from 'path'; +export * from './path-plus.js'; diff --git a/test/form/samples/export-all-before-named/path-plus.js b/test/form/samples/export-all-before-named/path-plus.js new file mode 100644 index 00000000000..60815fcec92 --- /dev/null +++ b/test/form/samples/export-all-before-named/path-plus.js @@ -0,0 +1,3 @@ +export function isRelative(path) { + return path[0] === '.'; +} From 067824d96e63d13f4ebb09dad9b00337e5e4a367 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sat, 15 Jun 2019 09:20:00 +0200 Subject: [PATCH 2/2] Prioritize local exports over external exports when resolving export all modules --- src/Module.ts | 19 +++++++++------ .../export-all-before-named/_config.js | 4 ++-- .../export-all-before-named/_expected/amd.js | 17 ++++++-------- .../export-all-before-named/_expected/cjs.js | 17 ++++++-------- .../export-all-before-named/_expected/es.js | 7 ++++-- .../export-all-before-named/_expected/iife.js | 20 ++++++++++++++++ .../_expected/system.js | 9 +++++--- .../export-all-before-named/_expected/umd.js | 23 +++++++++++++++++++ .../export-all-before-named/internal.js | 3 +++ .../samples/export-all-before-named/main.js | 4 ++-- .../export-all-before-named/path-plus.js | 3 --- 11 files changed, 87 insertions(+), 39 deletions(-) create mode 100644 test/form/samples/export-all-before-named/_expected/iife.js create mode 100644 test/form/samples/export-all-before-named/_expected/umd.js create mode 100644 test/form/samples/export-all-before-named/internal.js delete mode 100644 test/form/samples/export-all-before-named/path-plus.js diff --git a/src/Module.ts b/src/Module.ts index 8c24293c905..36869e483ac 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -426,8 +426,7 @@ export default class Module { } if (name !== 'default') { - for (let i = 0; i < this.exportAllModules.length; i += 1) { - const module = this.exportAllModules[i]; + for (const module of this.exportAllModules) { const declaration = module.getVariableForExportName(name, true); if (declaration) return declaration; @@ -502,10 +501,16 @@ export default class Module { this.addModulesToSpecifiers(this.importDescriptions); this.addModulesToSpecifiers(this.reexports); - this.exportAllModules = this.exportAllSources.map(source => { - const id = this.resolvedIds[source].id; - return this.graph.moduleById.get(id) as any; - }); + this.exportAllModules = this.exportAllSources + .map(source => { + const id = this.resolvedIds[source].id; + return this.graph.moduleById.get(id) as Module | ExternalModule; + }) + .sort((moduleA, moduleB) => { + const aExternal = moduleA instanceof ExternalModule; + const bExternal = moduleB instanceof ExternalModule; + return aExternal === bExternal ? 0 : aExternal ? 1 : -1; + }); } render(options: RenderOptions): MagicString { @@ -631,7 +636,7 @@ export default class Module { const otherModule = importDeclaration.module as Module | ExternalModule; if (otherModule instanceof Module && importDeclaration.name === '*') { - return (otherModule).getOrCreateNamespace(); + return otherModule.getOrCreateNamespace(); } const declaration = otherModule.getVariableForExportName(importDeclaration.name); diff --git a/test/form/samples/export-all-before-named/_config.js b/test/form/samples/export-all-before-named/_config.js index 11461d6ba46..b738dc58cd2 100644 --- a/test/form/samples/export-all-before-named/_config.js +++ b/test/form/samples/export-all-before-named/_config.js @@ -1,7 +1,7 @@ module.exports = { description: 'external `export *` must not interfere with internal exports', options: { - options: { output: { name: 'exposedInternals' } }, - external: ['path'] + output: { name: 'exposedInternals' }, + external: ['external'] } }; diff --git a/test/form/samples/export-all-before-named/_expected/amd.js b/test/form/samples/export-all-before-named/_expected/amd.js index eebdfa12a2a..287823703f2 100644 --- a/test/form/samples/export-all-before-named/_expected/amd.js +++ b/test/form/samples/export-all-before-named/_expected/amd.js @@ -1,21 +1,18 @@ -define(['exports', 'path'], function (exports, path) { 'use strict'; +define(['exports', 'external'], function (exports, external) { 'use strict'; + function internalFn(path) { + return path[0] === '.'; + } - - Object.keys(path).forEach(function (key) { + Object.keys(external).forEach(function (key) { Object.defineProperty(exports, key, { enumerable: true, get: function () { - return path[key]; + return external[key]; } }); }); - Object.defineProperty(exports, 'isRelative', { - enumerable: true, - get: function () { - return path.isRelative; - } - }); + exports.internalFn = internalFn; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/test/form/samples/export-all-before-named/_expected/cjs.js b/test/form/samples/export-all-before-named/_expected/cjs.js index a60cf7aba6c..876085e6b6c 100644 --- a/test/form/samples/export-all-before-named/_expected/cjs.js +++ b/test/form/samples/export-all-before-named/_expected/cjs.js @@ -2,21 +2,18 @@ Object.defineProperty(exports, '__esModule', { value: true }); -var path = require('path'); +var external = require('external'); +function internalFn(path) { + return path[0] === '.'; +} - -Object.keys(path).forEach(function (key) { +Object.keys(external).forEach(function (key) { Object.defineProperty(exports, key, { enumerable: true, get: function () { - return path[key]; + return external[key]; } }); }); -Object.defineProperty(exports, 'isRelative', { - enumerable: true, - get: function () { - return path.isRelative; - } -}); +exports.internalFn = internalFn; diff --git a/test/form/samples/export-all-before-named/_expected/es.js b/test/form/samples/export-all-before-named/_expected/es.js index 8cc1f4cd07a..2339e751c6f 100644 --- a/test/form/samples/export-all-before-named/_expected/es.js +++ b/test/form/samples/export-all-before-named/_expected/es.js @@ -1,4 +1,7 @@ -export * from 'path'; -export function isRelative(path) { +export * from 'external'; + +function internalFn(path) { return path[0] === '.'; } + +export { internalFn }; diff --git a/test/form/samples/export-all-before-named/_expected/iife.js b/test/form/samples/export-all-before-named/_expected/iife.js new file mode 100644 index 00000000000..55d0cb30fa9 --- /dev/null +++ b/test/form/samples/export-all-before-named/_expected/iife.js @@ -0,0 +1,20 @@ +var exposedInternals = (function (exports, external) { + 'use strict'; + + function internalFn(path) { + return path[0] === '.'; + } + + Object.keys(external).forEach(function (key) { + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return external[key]; + } + }); + }); + exports.internalFn = internalFn; + + return exports; + +}({}, external)); diff --git a/test/form/samples/export-all-before-named/_expected/system.js b/test/form/samples/export-all-before-named/_expected/system.js index 01169709775..3325a7ce5ed 100644 --- a/test/form/samples/export-all-before-named/_expected/system.js +++ b/test/form/samples/export-all-before-named/_expected/system.js @@ -1,18 +1,21 @@ -System.register(['path'], function (exports) { +System.register('exposedInternals', ['external'], function (exports) { 'use strict'; - var _starExcludes = { default: 1, isRelative: 1 }; + var _starExcludes = { internalFn: 1, default: 1 }; return { setters: [function (module) { var _setter = {}; for (var _$p in module) { if (!_starExcludes[_$p]) _setter[_$p] = module[_$p]; } - _setter.isRelative = module.isRelative; exports(_setter); }], execute: function () { + exports('internalFn', internalFn); + function internalFn(path) { + return path[0] === '.'; + } } }; diff --git a/test/form/samples/export-all-before-named/_expected/umd.js b/test/form/samples/export-all-before-named/_expected/umd.js new file mode 100644 index 00000000000..8781813e164 --- /dev/null +++ b/test/form/samples/export-all-before-named/_expected/umd.js @@ -0,0 +1,23 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('external')) : + typeof define === 'function' && define.amd ? define(['exports', 'external'], factory) : + (global = global || self, factory(global.exposedInternals = {}, global.external)); +}(this, function (exports, external) { 'use strict'; + + function internalFn(path) { + return path[0] === '.'; + } + + Object.keys(external).forEach(function (key) { + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return external[key]; + } + }); + }); + exports.internalFn = internalFn; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/test/form/samples/export-all-before-named/internal.js b/test/form/samples/export-all-before-named/internal.js new file mode 100644 index 00000000000..dcfc856b8c6 --- /dev/null +++ b/test/form/samples/export-all-before-named/internal.js @@ -0,0 +1,3 @@ +export function internalFn(path) { + return path[0] === '.'; +} diff --git a/test/form/samples/export-all-before-named/main.js b/test/form/samples/export-all-before-named/main.js index fe51ad3016f..ddc3e8e07fc 100644 --- a/test/form/samples/export-all-before-named/main.js +++ b/test/form/samples/export-all-before-named/main.js @@ -1,2 +1,2 @@ -export * from 'path'; -export * from './path-plus.js'; +export * from 'external'; +export * from './internal.js'; diff --git a/test/form/samples/export-all-before-named/path-plus.js b/test/form/samples/export-all-before-named/path-plus.js deleted file mode 100644 index 60815fcec92..00000000000 --- a/test/form/samples/export-all-before-named/path-plus.js +++ /dev/null @@ -1,3 +0,0 @@ -export function isRelative(path) { - return path[0] === '.'; -}