Skip to content

Commit

Permalink
Fix output sorting
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Dec 20, 2018
1 parent 477c0f1 commit 97a7a2c
Show file tree
Hide file tree
Showing 5 changed files with 95 additions and 68 deletions.
25 changes: 20 additions & 5 deletions src/rollup/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -360,16 +360,31 @@ export default function rollup(rawInputOptions: GenericConfigObject): Promise<Ro
}
}

enum SortingFileType {
ENTRY_CHUNK = 0,
SECONDARY_CHUNK = 1,
ASSET = 2
}

function getSortingFileType(file: OutputAsset | OutputChunk): SortingFileType {
if ((<OutputAsset>file).isAsset) {
return SortingFileType.ASSET;
}
if ((<OutputChunk>file).isEntry) {
return SortingFileType.ENTRY_CHUNK;
}
return SortingFileType.SECONDARY_CHUNK;
}

function createOutput(outputBundle: Record<string, OutputChunk | OutputAsset>): RollupOutput {
return {
output: Object.keys(outputBundle)
.map(fileName => outputBundle[fileName])
.sort((outputFileA, outputFileB) => {
// sort by entry chunks, shared chunks, then assets
if (isOutputAsset(outputFileA)) return isOutputAsset(outputFileB) ? 0 : 1;
if (isOutputAsset(outputFileB)) return -1;
if (outputFileA.isEntry) return outputFileB.isEntry ? 0 : -1;
outputFileB.isEntry ? 1 : 0;
const fileTypeA = getSortingFileType(outputFileA);
const fileTypeB = getSortingFileType(outputFileB);
if (fileTypeA === fileTypeB) return 0;
return fileTypeA < fileTypeB ? -1 : 1;
})
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ module.exports = {
.generate({ format: 'esm' })
.then(generated =>
assert.deepEqual(generated.output.map(chunk => chunk.fileName), [
'main.js',
'_virtual/_virtualModule.js',
'_virtual/_virtualModule2.js',
'main.js'
'_virtual/_virtualModule2.js'
])
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ module.exports = {
.generate({ format: 'esm' })
.then(generated =>
assert.deepEqual(generated.output.map(chunk => chunk.fileName), [
'main.js',
'_virtual/_virtualModule',
'lib/lib.js',
'main.js'
'lib/lib.js'
])
);
}
Expand Down
102 changes: 43 additions & 59 deletions test/misc/bundle-information.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,56 +26,36 @@ describe('The bundle object', () => {
.then(({ output }) => {
assert.deepEqual(
output.map(chunk => chunk.fileName),
['generated-chunk-d6db1a1e.js', 'input1-6792d712.js', 'input2-82fc6fc0.js'],
['input1-6792d712.js', 'input2-82fc6fc0.js', 'generated-chunk-d6db1a1e.js'],
'fileName'
);
assert.deepEqual(
output.map(chunk => chunk.code),
[
'console.log("shared");\n',
`import './generated-chunk-d6db1a1e.js';\n\nconsole.log("input1");const out = true;\n\nexport { out };\n`,
`import './generated-chunk-d6db1a1e.js';\n\nconsole.log("input2");var input2 = 42;\n\nexport default input2;\n`
`import './generated-chunk-d6db1a1e.js';\n\nconsole.log("input2");var input2 = 42;\n\nexport default input2;\n`,
'console.log("shared");\n'
],
'code'
);
assert.deepEqual(output.map(chunk => chunk.map), [null, null, null], 'map');
assert.deepEqual(output.map(chunk => chunk.isEntry), [false, true, true], 'isEntry');
assert.deepEqual(
output.map(chunk => chunk.name),
['chunk', 'input1', 'input2'],
'name'
);
assert.deepEqual(output.map(chunk => chunk.isEntry), [true, true, false], 'isEntry');
assert.deepEqual(output.map(chunk => chunk.name), ['input1', 'input2', 'chunk'], 'name');
assert.deepEqual(
output.map(chunk => chunk.facadeModuleId),
[null, 'input1', 'input2'],
['input1', 'input2', null],
'facadeModuleId'
);
assert.deepEqual(
output.map(chunk => chunk.imports),
[[], ['generated-chunk-d6db1a1e.js'], ['generated-chunk-d6db1a1e.js']],
[['generated-chunk-d6db1a1e.js'], ['generated-chunk-d6db1a1e.js'], []],
'imports'
);
assert.deepEqual(
output.map(chunk => chunk.dynamicImports),
[[], [], []],
'dynamicImports'
);
assert.deepEqual(
output.map(chunk => chunk.exports),
[[], ['out'], ['default']],
'exports'
);
assert.deepEqual(output.map(chunk => chunk.dynamicImports), [[], [], []], 'dynamicImports');
assert.deepEqual(output.map(chunk => chunk.exports), [['out'], ['default'], []], 'exports');
assert.deepEqual(
output.map(chunk => chunk.modules),
[
{
shared: {
originalLength: 49,
removedExports: ['unused'],
renderedExports: [],
renderedLength: 22
}
},
{
input1: {
originalLength: 62,
Expand All @@ -91,6 +71,14 @@ describe('The bundle object', () => {
renderedExports: ['default'],
renderedLength: 38
}
},
{
shared: {
originalLength: 49,
removedExports: ['unused'],
renderedExports: [],
renderedLength: 22
}
}
],
'modules'
Expand Down Expand Up @@ -121,18 +109,18 @@ describe('The bundle object', () => {
.then(({ output }) => {
assert.deepEqual(
output.map(chunk => chunk.fileName),
['generated-input2.js', 'input1.js', 'input2.js'],
['input1.js', 'input2.js', 'generated-input2.js'],
'fileName'
);
assert.deepEqual(
output.map(chunk => Object.keys(chunk.modules)),
[['shared', 'input2'], ['input1'], []],
[['input1'], [], ['shared', 'input2']],
'modules'
);
assert.deepEqual(output.map(chunk => chunk.isEntry), [false, true, true], 'isEntry');
assert.deepEqual(output.map(chunk => chunk.isEntry), [true, true, false], 'isEntry');
assert.deepEqual(
output.map(chunk => chunk.facadeModuleId),
[null, 'input1', 'input2'],
['input1', 'input2', null],
'facadeModuleId'
);
});
Expand Down Expand Up @@ -162,12 +150,12 @@ describe('The bundle object', () => {
.then(({ output }) => {
assert.deepEqual(
output.map(chunk => chunk.fileName),
['input22.js', 'input1.js', 'input2.js'],
['input1.js', 'input2.js', 'input22.js'],
'fileName'
);
assert.deepEqual(
output.map(chunk => chunk.facadeModuleId),
[null, 'input1', 'input2'],
['input1', 'input2', null],
'facadeModuleId'
);
});
Expand Down Expand Up @@ -251,12 +239,12 @@ describe('The bundle object', () => {
.then(({ output }) => {
assert.deepEqual(
output.map(chunk => chunk.fileName),
['input1.js', 'generated-chunk.js', 'input2.js', 'generated-chunk2.js'],
['input1.js', 'input2.js', 'generated-chunk.js', 'generated-chunk2.js'],
'fileName'
);
assert.deepEqual(
output.map(chunk => Object.keys(chunk.modules)),
[['input1'], ['dep', 'dynamic'], ['input2'], []],
[['input1'], ['input2'], ['dep', 'dynamic'], []],
'modules'
);
assert.deepEqual(
Expand All @@ -266,7 +254,7 @@ describe('The bundle object', () => {
);
assert.deepEqual(
output.map(chunk => chunk.facadeModuleId),
['input1', null, 'input2', 'dynamic'],
['input1', 'input2', null, 'dynamic'],
'facadeModuleId'
);
assert.deepEqual(
Expand Down Expand Up @@ -302,57 +290,45 @@ describe('The bundle object', () => {
.then(({ output }) => {
assert.deepEqual(
output.map(chunk => chunk.fileName),
['_virtual/other', '_virtual/input', '_virtual/dynamic1', '_virtual/dynamic2'],
['_virtual/input', '_virtual/dynamic1', '_virtual/other', '_virtual/dynamic2'],
'fileName'
);
assert.deepEqual(
output.map(chunk => chunk.isEntry),
[false, true, true, false],
'isEntry'
);
assert.deepEqual(output.map(chunk => chunk.isEntry), [true, true, false, false], 'isEntry');
assert.deepEqual(
output.map(chunk => chunk.code),
[
'const other = "other";\n\nexport { other };\n',
`import { other } from './other';
console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).then(([{dynamic1}, {dynamic2}]) => console.log(dynamic1, dynamic2));\n`,
'const dynamic1 = "dynamic1";\n\nexport { dynamic1 };\n',
'const other = "other";\n\nexport { other };\n',
'const dynamic2 = "dynamic2";\n\nexport { dynamic2 };\n'
],
'code'
);
assert.deepEqual(
output.map(chunk => chunk.name),
['chunk', 'input', 'dynamic1', 'chunk'],
['input', 'dynamic1', 'chunk', 'chunk'],
'name'
);
assert.deepEqual(
output.map(chunk => chunk.imports),
[[], ['_virtual/other'], [], []],
[['_virtual/other'], [], [], []],
'imports'
);
assert.deepEqual(
output.map(chunk => chunk.exports),
[['other'], [], ['dynamic1'], ['dynamic2']],
[[], ['dynamic1'], ['other'], ['dynamic2']],
'exports'
);
assert.deepEqual(
output.map(chunk => chunk.dynamicImports),
[[], ['_virtual/dynamic1', '_virtual/dynamic2'], [], []],
[['_virtual/dynamic1', '_virtual/dynamic2'], [], [], []],
'dynamicImports'
);
assert.deepEqual(
output.map(chunk => chunk.modules),
[
{
other: {
originalLength: 28,
removedExports: [],
renderedExports: ['other'],
renderedLength: 22
}
},
{
input: {
originalLength: 169,
Expand All @@ -369,6 +345,14 @@ console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).the
renderedLength: 28
}
},
{
other: {
originalLength: 28,
removedExports: [],
renderedExports: ['other'],
renderedLength: 22
}
},
{
dynamic2: {
originalLength: 34,
Expand All @@ -382,12 +366,12 @@ console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).the
);
assert.deepEqual(
output.map(chunk => chunk.isDynamicEntry),
[false, false, true, true],
[false, true, false, true],
'isDynamicEntry'
);
assert.deepEqual(
output.map(chunk => chunk.facadeModuleId),
['other', 'input', 'dynamic1', 'dynamic2'],
['input', 'dynamic1', 'other', 'dynamic2'],
'facadeModuleId'
);
});
Expand Down
28 changes: 28 additions & 0 deletions test/misc/misc.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,34 @@ describe('misc', () => {
});
});

it('sorts chunks in the output', () => {
const warnings = [];

return rollup
.rollup({
input: ['main1', 'main2'],
plugins: [
loader({
main1: 'import "dep";console.log("main1");',
main2: 'import "dep";console.log("main2");',
dep: 'console.log("dep");import("dyndep");',
dyndep: 'console.log("dyndep");'
})
],
onwarn: warning => warnings.push(warning)
})
.then(bundle => bundle.generate({ format: 'es' }))
.then(({ output }) => {
assert.equal(warnings.length, 0);
assert.deepEqual(output.map(({ fileName }) => fileName), [
'main1.js',
'main2.js',
'chunk-82df00d2.js',
'chunk-b9217e30.js'
]);
});
});

it('ignores falsy plugins', () => {
return rollup.rollup({
input: 'x',
Expand Down

0 comments on commit 97a7a2c

Please sign in to comment.