diff --git a/src/Chunk.ts b/src/Chunk.ts index e52dcad8642..b71fcf8cd79 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -337,8 +337,7 @@ export default class Chunk { const dependencies: Set = new Set(); const dynamicDependencies: Set = new Set(); for (const module of this.orderedModules) { - this.addChunksFromDependencies(module.dependencies, dependencies); - this.addChunksFromDependencies(module.getReexportModules(), dependencies); + this.addChunksFromDependencies(module.getTransitiveDependencies(), dependencies); this.addChunksFromDependencies(module.dynamicDependencies, dynamicDependencies); this.setUpModuleImports(module); } diff --git a/src/Module.ts b/src/Module.ts index df0d6a0f880..857bd781681 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -212,6 +212,7 @@ export default class Module { private magicString: MagicString; private namespaceVariable: NamespaceVariable = undefined; private transformDependencies: string[]; + private transitiveReexports: string[]; constructor(graph: Graph, id: string, moduleSideEffects: boolean, isEntry: boolean) { this.id = id; @@ -311,37 +312,27 @@ export default class Module { ); } - getReexportModules() { - return this.getReexports().map(exportName => this.getVariableForExportName(exportName).module); - } - - getReexports(walkedModuleIds = new Set()) { - // avoid infinite recursion when using circular `export * from X` - if (walkedModuleIds.has(this.id)) { - return []; + getReexports(): string[] { + if (this.transitiveReexports) { + return this.transitiveReexports; } - walkedModuleIds.add(this.id); - - const reexports = Object.create(null); + // to avoid infinite recursion when using circular `export * from X` + this.transitiveReexports = []; + const reexports = new Set(); for (const name in this.reexports) { - reexports[name] = true; + reexports.add(name); } - - this.exportAllModules.forEach(module => { - if (module.isExternal) { - reexports[`*${module.id}`] = true; - return; - } - - for (const name of (module) - .getExports() - .concat((module).getReexports(walkedModuleIds))) { - if (name !== 'default') reexports[name] = true; + for (const module of this.exportAllModules) { + if (module instanceof ExternalModule) { + reexports.add(`*${module.id}`); + } else { + for (const name of module.getExports().concat(module.getReexports())) { + if (name !== 'default') reexports.add(name); + } } - }); - - return Object.keys(reexports); + } + return (this.transitiveReexports = Array.from(reexports)); } getRenderedExports() { @@ -355,6 +346,12 @@ export default class Module { return { renderedExports, removedExports }; } + getTransitiveDependencies() { + return this.dependencies.concat( + this.getReexports().map(exportName => this.getVariableForExportName(exportName).module) + ); + } + getVariableForExportName(name: string, isExportAllSearch?: boolean): Variable | null { if (name[0] === '*') { if (name.length === 1) { diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_config.js b/test/chunking-form/samples/preserve-modules-nested-export/_config.js index 888c45ee79d..454bc294b9b 100644 --- a/test/chunking-form/samples/preserve-modules-nested-export/_config.js +++ b/test/chunking-form/samples/preserve-modules-nested-export/_config.js @@ -1,7 +1,7 @@ module.exports = { description: 'confirm exports are preserved when exporting a module', options: { - input: ['main1.js', 'main2.js'], + input: 'main.js', preserveModules: true } }; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/dep.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/dep.js deleted file mode 100644 index 226b31a03e4..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/dep.js +++ /dev/null @@ -1,7 +0,0 @@ -define(['exports'], function (exports) { 'use strict'; - - const foo = 1; - - exports.foo = foo; - -}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/inner/more_inner/something.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/inner/more_inner/something.js new file mode 100644 index 00000000000..ab26f5b0c1b --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/inner/more_inner/something.js @@ -0,0 +1,7 @@ +define(['exports'], function (exports) { 'use strict'; + + const Something = 'Hello World'; + + exports.Something = Something; + +}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/inner/some_effect.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/inner/some_effect.js new file mode 100644 index 00000000000..621699a15d1 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/inner/some_effect.js @@ -0,0 +1,5 @@ +define(function () { 'use strict'; + + console.log('side-effect'); + +}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main.js new file mode 100644 index 00000000000..ada967244e0 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main.js @@ -0,0 +1,9 @@ +define(['exports', './inner/more_inner/something', './inner/some_effect'], function (exports, __chunk_1, __chunk_3) { 'use strict'; + + + + exports.Something = __chunk_1.Something; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main1.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main1.js deleted file mode 100644 index f6df6912f6b..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main1.js +++ /dev/null @@ -1,9 +0,0 @@ -define(['exports', './dep'], function (exports, __chunk_1) { 'use strict'; - - - - exports.foo = __chunk_1.foo; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main2.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main2.js deleted file mode 100644 index f6df6912f6b..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/amd/main2.js +++ /dev/null @@ -1,9 +0,0 @@ -define(['exports', './dep'], function (exports, __chunk_1) { 'use strict'; - - - - exports.foo = __chunk_1.foo; - - Object.defineProperty(exports, '__esModule', { value: true }); - -}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/dep.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/dep.js deleted file mode 100644 index 5ea7cf19376..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/dep.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -const foo = 1; - -exports.foo = foo; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/inner/more_inner/something.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/inner/more_inner/something.js new file mode 100644 index 00000000000..12aa3ba79a7 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/inner/more_inner/something.js @@ -0,0 +1,5 @@ +'use strict'; + +const Something = 'Hello World'; + +exports.Something = Something; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/inner/some_effect.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/inner/some_effect.js new file mode 100644 index 00000000000..28e48ebec94 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/inner/some_effect.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('side-effect'); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main.js new file mode 100644 index 00000000000..35c480bcd14 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main.js @@ -0,0 +1,10 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var __chunk_1 = require('./inner/more_inner/something.js'); +require('./inner/some_effect.js'); + + + +exports.Something = __chunk_1.Something; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main1.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main1.js deleted file mode 100644 index d76e26a40a8..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main1.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var __chunk_1 = require('./dep.js'); - - - -exports.foo = __chunk_1.foo; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main2.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main2.js deleted file mode 100644 index d76e26a40a8..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/cjs/main2.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict'; - -Object.defineProperty(exports, '__esModule', { value: true }); - -var __chunk_1 = require('./dep.js'); - - - -exports.foo = __chunk_1.foo; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/dep.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/dep.js deleted file mode 100644 index a106a6bfc30..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/dep.js +++ /dev/null @@ -1,3 +0,0 @@ -const foo = 1; - -export { foo }; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/inner/more_inner/something.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/inner/more_inner/something.js new file mode 100644 index 00000000000..636a4132444 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/inner/more_inner/something.js @@ -0,0 +1,3 @@ +const Something = 'Hello World'; + +export { Something }; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/inner/some_effect.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/inner/some_effect.js new file mode 100644 index 00000000000..4ca9b41c411 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/inner/some_effect.js @@ -0,0 +1 @@ +console.log('side-effect'); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main.js new file mode 100644 index 00000000000..efa908a5a5b --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main.js @@ -0,0 +1,2 @@ +export { Something } from './inner/more_inner/something.js'; +import './inner/some_effect.js'; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main1.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main1.js deleted file mode 100644 index d5eae06078e..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main1.js +++ /dev/null @@ -1 +0,0 @@ -export { foo } from './dep.js'; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main2.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main2.js deleted file mode 100644 index d5eae06078e..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/es/main2.js +++ /dev/null @@ -1 +0,0 @@ -export { foo } from './dep.js'; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/inner/more_inner/something.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/inner/more_inner/something.js new file mode 100644 index 00000000000..ed96995d13f --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/inner/more_inner/something.js @@ -0,0 +1,10 @@ +System.register([], function (exports, module) { + 'use strict'; + return { + execute: function () { + + const Something = exports('Something', 'Hello World'); + + } + }; +}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/dep.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/inner/some_effect.js similarity index 76% rename from test/chunking-form/samples/preserve-modules-nested-export/_expected/system/dep.js rename to test/chunking-form/samples/preserve-modules-nested-export/_expected/system/inner/some_effect.js index 5de3e70c4fc..105920b8c73 100644 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/dep.js +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/inner/some_effect.js @@ -3,7 +3,7 @@ System.register([], function (exports, module) { return { execute: function () { - const foo = exports('foo', 1); + console.log('side-effect'); } }; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main.js new file mode 100644 index 00000000000..92e86086762 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main.js @@ -0,0 +1,13 @@ +System.register(['./inner/more_inner/something.js', './inner/some_effect.js'], function (exports, module) { + 'use strict'; + return { + setters: [function (module) { + exports('Something', module.Something); + }, function () {}], + execute: function () { + + + + } + }; +}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main1.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main1.js deleted file mode 100644 index 6741f0abb9c..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main1.js +++ /dev/null @@ -1,13 +0,0 @@ -System.register(['./dep.js'], function (exports, module) { - 'use strict'; - return { - setters: [function (module) { - exports('foo', module.foo); - }], - execute: function () { - - - - } - }; -}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main2.js b/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main2.js deleted file mode 100644 index 6741f0abb9c..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/_expected/system/main2.js +++ /dev/null @@ -1,13 +0,0 @@ -System.register(['./dep.js'], function (exports, module) { - 'use strict'; - return { - setters: [function (module) { - exports('foo', module.foo); - }], - execute: function () { - - - - } - }; -}); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/dep.js b/test/chunking-form/samples/preserve-modules-nested-export/dep.js deleted file mode 100644 index 4ac60a12c1a..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/dep.js +++ /dev/null @@ -1,3 +0,0 @@ -const foo = 1; - -export { foo }; \ No newline at end of file diff --git a/test/chunking-form/samples/preserve-modules-nested-export/inner/index.js b/test/chunking-form/samples/preserve-modules-nested-export/inner/index.js new file mode 100644 index 00000000000..b46f14091cf --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/inner/index.js @@ -0,0 +1,2 @@ +export * from './more_inner/index'; +import './some_effect'; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/inner/more_inner/index.js b/test/chunking-form/samples/preserve-modules-nested-export/inner/more_inner/index.js new file mode 100644 index 00000000000..93e297c24fb --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/inner/more_inner/index.js @@ -0,0 +1 @@ +export * from './something'; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/inner/more_inner/something.js b/test/chunking-form/samples/preserve-modules-nested-export/inner/more_inner/something.js new file mode 100644 index 00000000000..60e3455d002 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/inner/more_inner/something.js @@ -0,0 +1 @@ +export const Something = 'Hello World'; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/inner/some_effect.js b/test/chunking-form/samples/preserve-modules-nested-export/inner/some_effect.js new file mode 100644 index 00000000000..4ca9b41c411 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/inner/some_effect.js @@ -0,0 +1 @@ +console.log('side-effect'); diff --git a/test/chunking-form/samples/preserve-modules-nested-export/main.js b/test/chunking-form/samples/preserve-modules-nested-export/main.js new file mode 100644 index 00000000000..ee0c7608365 --- /dev/null +++ b/test/chunking-form/samples/preserve-modules-nested-export/main.js @@ -0,0 +1 @@ +export * from './inner/index'; diff --git a/test/chunking-form/samples/preserve-modules-nested-export/main1.js b/test/chunking-form/samples/preserve-modules-nested-export/main1.js deleted file mode 100644 index 9aa8e6f1b1a..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/main1.js +++ /dev/null @@ -1 +0,0 @@ -export { foo } from './dep'; \ No newline at end of file diff --git a/test/chunking-form/samples/preserve-modules-nested-export/main2.js b/test/chunking-form/samples/preserve-modules-nested-export/main2.js deleted file mode 100644 index a050307883f..00000000000 --- a/test/chunking-form/samples/preserve-modules-nested-export/main2.js +++ /dev/null @@ -1 +0,0 @@ -export { foo } from './main1.js'; \ No newline at end of file