From 962362d23b6ca1ca74a4fe836e1241af7ad1609e Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Tue, 5 Mar 2019 08:19:42 +0100 Subject: [PATCH] Resolve a situation where different default exports referencing the same original variable would be rendered as two different imports of a chunk which have the same name --- src/Chunk.ts | 12 +++++++----- .../_config.js | 7 +++++++ .../_expected/amd/generated-chunk.js | 8 ++++++++ .../_expected/amd/main1.js | 5 +++++ .../_expected/amd/main2.js | 5 +++++ .../_expected/cjs/generated-chunk.js | 6 ++++++ .../_expected/cjs/main1.js | 5 +++++ .../_expected/cjs/main2.js | 5 +++++ .../_expected/es/generated-chunk.js | 3 +++ .../_expected/es/main1.js | 3 +++ .../_expected/es/main2.js | 3 +++ .../_expected/system/generated-chunk.js | 14 ++++++++++++++ .../_expected/system/main1.js | 14 ++++++++++++++ .../_expected/system/main2.js | 14 ++++++++++++++ .../foo.js | 1 + .../main1.js | 4 ++++ .../main2.js | 4 ++++ .../proxy1.js | 3 +++ .../proxy2.js | 3 +++ 19 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_config.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/generated-chunk.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main1.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main2.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/generated-chunk.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main1.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main2.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/generated-chunk.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main1.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main2.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/generated-chunk.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main1.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main2.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/foo.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main1.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main2.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy1.js create mode 100644 test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy2.js diff --git a/src/Chunk.ts b/src/Chunk.ts index 5b2f2b81d75..b278a01ba34 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -830,21 +830,23 @@ export default class Chunk { } const importsAsArray = Array.from(this.imports); + const renderedImports = new Set(); const dependencies: ChunkDependencies = []; for (const dep of this.dependencies) { const imports: ImportSpecifier[] = []; for (const variable of importsAsArray) { + const renderedVariable = + variable instanceof ExportDefaultVariable && variable.referencesOriginal() + ? variable.getOriginalVariable() + : variable; if ( (variable.module instanceof Module ? variable.module.chunk === dep : variable.module === dep) && - !( - variable instanceof ExportDefaultVariable && - variable.referencesOriginal() && - this.imports.has(variable.getOriginalVariable()) - ) + !renderedImports.has(renderedVariable) ) { + renderedImports.add(renderedVariable); const local = variable.getName(); const imported = variable.module instanceof ExternalModule diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_config.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_config.js new file mode 100644 index 00000000000..a393eccd704 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: + 'do not import variables that reference an original if another variable referencing it is already imported', + options: { + input: ['main1', 'main2'] + } +}; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/generated-chunk.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/generated-chunk.js new file mode 100644 index 00000000000..a142f34df0d --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/generated-chunk.js @@ -0,0 +1,8 @@ +define(['exports'], function (exports) { 'use strict'; + + const foo = {}; + + exports.foo = foo; + exports.bar = foo; + +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main1.js new file mode 100644 index 00000000000..302e4c4da46 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main1.js @@ -0,0 +1,5 @@ +define(['./generated-chunk.js'], function (__chunk_1) { 'use strict'; + + console.log(__chunk_1.bar, __chunk_1.bar); + +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main2.js new file mode 100644 index 00000000000..302e4c4da46 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/amd/main2.js @@ -0,0 +1,5 @@ +define(['./generated-chunk.js'], function (__chunk_1) { 'use strict'; + + console.log(__chunk_1.bar, __chunk_1.bar); + +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/generated-chunk.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/generated-chunk.js new file mode 100644 index 00000000000..a76e69f06f0 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/generated-chunk.js @@ -0,0 +1,6 @@ +'use strict'; + +const foo = {}; + +exports.foo = foo; +exports.bar = foo; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main1.js new file mode 100644 index 00000000000..b3cc08fc4d9 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main1.js @@ -0,0 +1,5 @@ +'use strict'; + +var __chunk_1 = require('./generated-chunk.js'); + +console.log(__chunk_1.bar, __chunk_1.bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main2.js new file mode 100644 index 00000000000..b3cc08fc4d9 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/cjs/main2.js @@ -0,0 +1,5 @@ +'use strict'; + +var __chunk_1 = require('./generated-chunk.js'); + +console.log(__chunk_1.bar, __chunk_1.bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/generated-chunk.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/generated-chunk.js new file mode 100644 index 00000000000..1127b4cd6fa --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/generated-chunk.js @@ -0,0 +1,3 @@ +const foo = {}; + +export { foo as a, foo as b }; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main1.js new file mode 100644 index 00000000000..9b81ff8ea20 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main1.js @@ -0,0 +1,3 @@ +import { a as bar } from './generated-chunk.js'; + +console.log(bar, bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main2.js new file mode 100644 index 00000000000..9b81ff8ea20 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/es/main2.js @@ -0,0 +1,3 @@ +import { a as bar } from './generated-chunk.js'; + +console.log(bar, bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/generated-chunk.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/generated-chunk.js new file mode 100644 index 00000000000..ef91eda0278 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/generated-chunk.js @@ -0,0 +1,14 @@ +System.register([], function (exports, module) { + 'use strict'; + return { + execute: function () { + + const foo = {}; + + exports('a', foo); + + exports('b', foo); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main1.js new file mode 100644 index 00000000000..01df6b33d3c --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main1.js @@ -0,0 +1,14 @@ +System.register(['./generated-chunk.js'], function (exports, module) { + 'use strict'; + var bar; + return { + setters: [function (module) { + bar = module.a; + }], + execute: function () { + + console.log(bar, bar); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main2.js new file mode 100644 index 00000000000..01df6b33d3c --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/_expected/system/main2.js @@ -0,0 +1,14 @@ +System.register(['./generated-chunk.js'], function (exports, module) { + 'use strict'; + var bar; + return { + setters: [function (module) { + bar = module.a; + }], + execute: function () { + + console.log(bar, bar); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/foo.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/foo.js new file mode 100644 index 00000000000..71658c1342b --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/foo.js @@ -0,0 +1 @@ +export const foo = {}; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main1.js new file mode 100644 index 00000000000..59f67869aef --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main1.js @@ -0,0 +1,4 @@ +import foo from './proxy1'; +import bar from './proxy2'; + +console.log(foo, bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main2.js new file mode 100644 index 00000000000..59f67869aef --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/main2.js @@ -0,0 +1,4 @@ +import foo from './proxy1'; +import bar from './proxy2'; + +console.log(foo, bar); diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy1.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy1.js new file mode 100644 index 00000000000..f57be3ed80e --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy1.js @@ -0,0 +1,3 @@ +import { foo } from './foo'; + +export default foo; diff --git a/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy2.js b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy2.js new file mode 100644 index 00000000000..f57be3ed80e --- /dev/null +++ b/test/chunking-form/samples/deduplicate-imports-referencing-originals-2/proxy2.js @@ -0,0 +1,3 @@ +import { foo } from './foo'; + +export default foo;