From 1738215510cd31a9cfc942d06593f6edd944f408 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 10 Feb 2022 09:11:40 +0100 Subject: [PATCH] Sort manual chunks generated via a function by name (#4397) * Sort manual chunks via functions are sorted by name * Improve test --- src/Bundle.ts | 11 +++++++++-- .../samples/manual-chunks-function/_config.js | 17 ++++++++++++++++- .../_expected/amd/generated-chunk-b.js | 4 ++++ .../_expected/amd/main-a.js | 4 ++++ .../_expected/cjs/generated-chunk-b.js | 4 ++++ .../_expected/cjs/main-a.js | 4 ++++ .../_expected/es/generated-chunk-b.js | 4 ++++ .../_expected/es/main-a.js | 4 ++++ .../_expected/system/generated-chunk-b.js | 4 ++++ .../_expected/system/main-a.js | 4 ++++ .../samples/manual-chunks-function/dep2-a.js | 1 + .../samples/manual-chunks-function/dep2-b.js | 1 + .../samples/manual-chunks-function/dep3-a.js | 1 + .../samples/manual-chunks-function/dep3-b.js | 1 + .../samples/manual-chunks-function/main-a.js | 5 +++++ 15 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 test/chunking-form/samples/manual-chunks-function/dep2-a.js create mode 100644 test/chunking-form/samples/manual-chunks-function/dep2-b.js create mode 100644 test/chunking-form/samples/manual-chunks-function/dep3-a.js create mode 100644 test/chunking-form/samples/manual-chunks-function/dep3-b.js diff --git a/src/Bundle.ts b/src/Bundle.ts index 8fcac9d9bd3..fc48ccdf18e 100644 --- a/src/Bundle.ts +++ b/src/Bundle.ts @@ -156,7 +156,7 @@ export default class Bundle { } private assignManualChunks(getManualChunk: GetManualChunk): Map { - const manualChunkAliasByEntry = new Map(); + const manualChunkAliasesWithEntry: [alias: string, module: Module][] = []; const manualChunksApi = { getModuleIds: () => this.graph.modulesById.keys(), getModuleInfo: this.graph.getModuleInfo @@ -165,10 +165,17 @@ export default class Bundle { if (module instanceof Module) { const manualChunkAlias = getManualChunk(module.id, manualChunksApi); if (typeof manualChunkAlias === 'string') { - addModuleToManualChunk(manualChunkAlias, module, manualChunkAliasByEntry); + manualChunkAliasesWithEntry.push([manualChunkAlias, module]); } } } + manualChunkAliasesWithEntry.sort(([aliasA], [aliasB]) => + aliasA > aliasB ? 1 : aliasA < aliasB ? -1 : 0 + ); + const manualChunkAliasByEntry = new Map(); + for (const [alias, module] of manualChunkAliasesWithEntry) { + addModuleToManualChunk(alias, module, manualChunkAliasByEntry); + } return manualChunkAliasByEntry; } diff --git a/test/chunking-form/samples/manual-chunks-function/_config.js b/test/chunking-form/samples/manual-chunks-function/_config.js index 1c3e6daf708..0407d6a0236 100644 --- a/test/chunking-form/samples/manual-chunks-function/_config.js +++ b/test/chunking-form/samples/manual-chunks-function/_config.js @@ -1,3 +1,5 @@ +const assert = require('assert'); + module.exports = { description: 'allows to define manual chunks via a function', options: { @@ -8,6 +10,19 @@ module.exports = { return `chunk-${id[id.length - 4]}`; } } - } + }, + plugins: [ + { + generateBundle(options, bundle) { + // This also asserts the sorting order, which should be alphabetical + // between the manual chunks + assert.deepStrictEqual(Object.keys(bundle), [ + 'main-a.js', + 'generated-chunk-b.js', + 'generated-chunk-c.js' + ]); + } + } + ] } }; diff --git a/test/chunking-form/samples/manual-chunks-function/_expected/amd/generated-chunk-b.js b/test/chunking-form/samples/manual-chunks-function/_expected/amd/generated-chunk-b.js index 4e491fbabc2..e4b9bf7102d 100644 --- a/test/chunking-form/samples/manual-chunks-function/_expected/amd/generated-chunk-b.js +++ b/test/chunking-form/samples/manual-chunks-function/_expected/amd/generated-chunk-b.js @@ -4,4 +4,8 @@ define((function () { 'use strict'; console.log('dep-b'); + console.log('dep2-b'); + + console.log('dep3-b'); + })); diff --git a/test/chunking-form/samples/manual-chunks-function/_expected/amd/main-a.js b/test/chunking-form/samples/manual-chunks-function/_expected/amd/main-a.js index e3934b106ef..072c08147ab 100644 --- a/test/chunking-form/samples/manual-chunks-function/_expected/amd/main-a.js +++ b/test/chunking-form/samples/manual-chunks-function/_expected/amd/main-a.js @@ -4,6 +4,10 @@ define(['./generated-chunk-c', './generated-chunk-b'], (function (chunkC, chunkB console.log('dep-a'); + console.log('dep2-a'); + + console.log('dep3-a'); + console.log('main-a'); })); diff --git a/test/chunking-form/samples/manual-chunks-function/_expected/cjs/generated-chunk-b.js b/test/chunking-form/samples/manual-chunks-function/_expected/cjs/generated-chunk-b.js index 51b3d3e3d98..37b480ce3e7 100644 --- a/test/chunking-form/samples/manual-chunks-function/_expected/cjs/generated-chunk-b.js +++ b/test/chunking-form/samples/manual-chunks-function/_expected/cjs/generated-chunk-b.js @@ -3,3 +3,7 @@ console.log('dep2'); console.log('dep-b'); + +console.log('dep2-b'); + +console.log('dep3-b'); diff --git a/test/chunking-form/samples/manual-chunks-function/_expected/cjs/main-a.js b/test/chunking-form/samples/manual-chunks-function/_expected/cjs/main-a.js index 2d8f820fd93..6f6c77f9901 100644 --- a/test/chunking-form/samples/manual-chunks-function/_expected/cjs/main-a.js +++ b/test/chunking-form/samples/manual-chunks-function/_expected/cjs/main-a.js @@ -7,4 +7,8 @@ console.log('dep1'); console.log('dep-a'); +console.log('dep2-a'); + +console.log('dep3-a'); + console.log('main-a'); diff --git a/test/chunking-form/samples/manual-chunks-function/_expected/es/generated-chunk-b.js b/test/chunking-form/samples/manual-chunks-function/_expected/es/generated-chunk-b.js index 16fb2a90267..76ec1c37d7d 100644 --- a/test/chunking-form/samples/manual-chunks-function/_expected/es/generated-chunk-b.js +++ b/test/chunking-form/samples/manual-chunks-function/_expected/es/generated-chunk-b.js @@ -1,3 +1,7 @@ console.log('dep2'); console.log('dep-b'); + +console.log('dep2-b'); + +console.log('dep3-b'); diff --git a/test/chunking-form/samples/manual-chunks-function/_expected/es/main-a.js b/test/chunking-form/samples/manual-chunks-function/_expected/es/main-a.js index d3864b7146c..64402f5149a 100644 --- a/test/chunking-form/samples/manual-chunks-function/_expected/es/main-a.js +++ b/test/chunking-form/samples/manual-chunks-function/_expected/es/main-a.js @@ -5,4 +5,8 @@ console.log('dep1'); console.log('dep-a'); +console.log('dep2-a'); + +console.log('dep3-a'); + console.log('main-a'); diff --git a/test/chunking-form/samples/manual-chunks-function/_expected/system/generated-chunk-b.js b/test/chunking-form/samples/manual-chunks-function/_expected/system/generated-chunk-b.js index 5dd8fc97482..94aac7ede61 100644 --- a/test/chunking-form/samples/manual-chunks-function/_expected/system/generated-chunk-b.js +++ b/test/chunking-form/samples/manual-chunks-function/_expected/system/generated-chunk-b.js @@ -7,6 +7,10 @@ System.register([], (function () { console.log('dep-b'); + console.log('dep2-b'); + + console.log('dep3-b'); + }) }; })); diff --git a/test/chunking-form/samples/manual-chunks-function/_expected/system/main-a.js b/test/chunking-form/samples/manual-chunks-function/_expected/system/main-a.js index dac8db86d06..ac6e11d5dbd 100644 --- a/test/chunking-form/samples/manual-chunks-function/_expected/system/main-a.js +++ b/test/chunking-form/samples/manual-chunks-function/_expected/system/main-a.js @@ -8,6 +8,10 @@ System.register(['./generated-chunk-c.js', './generated-chunk-b.js'], (function console.log('dep-a'); + console.log('dep2-a'); + + console.log('dep3-a'); + console.log('main-a'); }) diff --git a/test/chunking-form/samples/manual-chunks-function/dep2-a.js b/test/chunking-form/samples/manual-chunks-function/dep2-a.js new file mode 100644 index 00000000000..a36794d741a --- /dev/null +++ b/test/chunking-form/samples/manual-chunks-function/dep2-a.js @@ -0,0 +1 @@ +console.log('dep2-a'); diff --git a/test/chunking-form/samples/manual-chunks-function/dep2-b.js b/test/chunking-form/samples/manual-chunks-function/dep2-b.js new file mode 100644 index 00000000000..0497bb3e651 --- /dev/null +++ b/test/chunking-form/samples/manual-chunks-function/dep2-b.js @@ -0,0 +1 @@ +console.log('dep2-b'); diff --git a/test/chunking-form/samples/manual-chunks-function/dep3-a.js b/test/chunking-form/samples/manual-chunks-function/dep3-a.js new file mode 100644 index 00000000000..4a39d2d9a27 --- /dev/null +++ b/test/chunking-form/samples/manual-chunks-function/dep3-a.js @@ -0,0 +1 @@ +console.log('dep3-a'); diff --git a/test/chunking-form/samples/manual-chunks-function/dep3-b.js b/test/chunking-form/samples/manual-chunks-function/dep3-b.js new file mode 100644 index 00000000000..63138d71943 --- /dev/null +++ b/test/chunking-form/samples/manual-chunks-function/dep3-b.js @@ -0,0 +1 @@ +console.log('dep3-b'); diff --git a/test/chunking-form/samples/manual-chunks-function/main-a.js b/test/chunking-form/samples/manual-chunks-function/main-a.js index cf97f330a79..5357d3deb1c 100644 --- a/test/chunking-form/samples/manual-chunks-function/main-a.js +++ b/test/chunking-form/samples/manual-chunks-function/main-a.js @@ -1,4 +1,9 @@ +import './dep-c'; import './dep-a'; +import './dep2-a' +import './dep3-a' import './dep-b'; +import './dep2-b' +import './dep3-b' console.log('main-a');