From c4881911e9a9b31c6ca8662738ccdb254b9f13f9 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Sep 2018 14:18:20 -0400 Subject: [PATCH 1/4] add failing test for #2461 --- test/hooks/index.js | 64 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/test/hooks/index.js b/test/hooks/index.js index 28e8abb8a42..13d8a848e26 100644 --- a/test/hooks/index.js +++ b/test/hooks/index.js @@ -829,13 +829,13 @@ module.exports = input; plugins: [ loader({ input: `alert('hello')` }), { - name: name, + name, buildStart() { this.cache.set('asdf', 'asdf'); } }, { - name: name, + name, buildStart() { this.cache.set('asdf', 'asdf'); } @@ -845,7 +845,7 @@ module.exports = input; .catch(err => { assert.equal(err.code, 'PLUGIN_ERROR'); assert.equal(err.pluginCode, 'DUPLICATE_PLUGIN_NAME'); - assert.equal(err.message.includes(name), true) + assert.equal(err.message.includes(name), true); }); }); }); @@ -1073,4 +1073,62 @@ module.exports = input; assert.equal(renderErrorCount, 1, 'renderError count'); }); }); + + it('assigns chunk IDs before creating outputBundle chunks', () => { + const chunks = []; + return rollup + .rollup({ + input: 'input', + experimentalCodeSplitting: true, + plugins: [ + loader({ + input: `export default [import('a'), import('b')];`, + a: `import c from 'c'; import d from 'd'; export default () => c();`, + b: `import c from 'c'; export default () => c();`, + c: `export default () => console.log('c');`, + d: `export default {};` + }), + { + renderChunk(code, chunk, options) { + chunks.push({ + fileName: chunk.fileName, + imports: chunk.imports, + modules: Object.keys(chunk.modules) + }); + } + } + ] + }) + .then(bundle => + bundle.generate({ + entryFileNames: '[name].js', + chunkFileNames: '[name].js', + format: 'esm' + }) + ) + .then(() => { + assert.deepEqual(chunks, [ + { + fileName: 'input.js', + imports: [], + modules: ['input'] + }, + { + fileName: 'chunk.js', + imports: [], + modules: ['c'] + }, + { + fileName: 'a.js', + imports: ['chunk.js'], + modules: ['d', 'a'] + }, + { + fileName: 'b.js', + imports: ['chunk.js'], + modules: ['b'] + } + ]); + }); + }); }); From 7d6ea6985deb191b95b472fb48cde2bc8fc8e83d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Sep 2018 14:21:34 -0400 Subject: [PATCH 2/4] update test so that it actually fails --- test/hooks/index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/hooks/index.js b/test/hooks/index.js index 13d8a848e26..3731792a773 100644 --- a/test/hooks/index.js +++ b/test/hooks/index.js @@ -1074,7 +1074,7 @@ module.exports = input; }); }); - it('assigns chunk IDs before creating outputBundle chunks', () => { + it.only('assigns chunk IDs before creating outputBundle chunks', () => { const chunks = []; return rollup .rollup({ @@ -1083,7 +1083,7 @@ module.exports = input; plugins: [ loader({ input: `export default [import('a'), import('b')];`, - a: `import c from 'c'; import d from 'd'; export default () => c();`, + a: `import d from 'd'; import c from 'c'; export default () => c();`, b: `import c from 'c'; export default () => c();`, c: `export default () => console.log('c');`, d: `export default {};` @@ -1113,16 +1113,16 @@ module.exports = input; imports: [], modules: ['input'] }, - { - fileName: 'chunk.js', - imports: [], - modules: ['c'] - }, { fileName: 'a.js', imports: ['chunk.js'], modules: ['d', 'a'] }, + { + fileName: 'chunk.js', + imports: [], + modules: ['c'] + }, { fileName: 'b.js', imports: ['chunk.js'], From 676ecaee5f86ef0763aec39a84623a861012e9d2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Sep 2018 14:22:42 -0400 Subject: [PATCH 3/4] assign chunk IDs before creating outputBundle chunks --- src/rollup/index.ts | 14 ++++++++------ test/hooks/index.js | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/rollup/index.ts b/src/rollup/index.ts index 5f5da26e4cc..eb235f67469 100644 --- a/src/rollup/index.ts +++ b/src/rollup/index.ts @@ -284,9 +284,6 @@ export default function rollup( // name all chunks for (let i = 0; i < chunks.length; i++) { const chunk = chunks[i]; - const imports = chunk.getImportIds(); - const exports = chunk.getExportNames(); - const modules = chunk.renderedModules; if (chunk === singleChunk) { singleChunk.id = basename( @@ -308,13 +305,18 @@ export default function rollup( } chunk.generateId(pattern, patternName, addons, outputOptions, outputBundle); } + } + + // assign to outputBundle + for (let i = 0; i < chunks.length; i++) { + const chunk = chunks[i]; outputBundle[chunk.id] = { fileName: chunk.id, isEntry: chunk.entryModule !== undefined, - imports, - exports, - modules, + imports: chunk.getImportIds(), + exports: chunk.getExportNames(), + modules: chunk.renderedModules, code: undefined, map: undefined }; diff --git a/test/hooks/index.js b/test/hooks/index.js index 3731792a773..628ece9564f 100644 --- a/test/hooks/index.js +++ b/test/hooks/index.js @@ -1074,7 +1074,7 @@ module.exports = input; }); }); - it.only('assigns chunk IDs before creating outputBundle chunks', () => { + it('assigns chunk IDs before creating outputBundle chunks', () => { const chunks = []; return rollup .rollup({ From 6c959e8eadbb3449c18d41cc38de85c04f325c66 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 29 Sep 2018 19:46:30 -0400 Subject: [PATCH 4/4] deconflict chunk names --- src/rollup/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/rollup/index.ts b/src/rollup/index.ts index eb235f67469..0aa7ed63ff8 100644 --- a/src/rollup/index.ts +++ b/src/rollup/index.ts @@ -282,6 +282,7 @@ export default function rollup( } // name all chunks + const usedIds: Record = {}; for (let i = 0; i < chunks.length; i++) { const chunk = chunks[i]; @@ -303,7 +304,8 @@ export default function rollup( pattern = outputOptions.chunkFileNames || '[name]-[hash].js'; patternName = 'output.chunkFileNames'; } - chunk.generateId(pattern, patternName, addons, outputOptions, outputBundle); + chunk.generateId(pattern, patternName, addons, outputOptions, usedIds); + usedIds[chunk.id] = true; } }