Skip to content

Commit

Permalink
feat(src): Flush chunks by ID
Browse files Browse the repository at this point in the history
resolving chunk using aggressive code splitting and chunking with IDs and not chunknames

BREAKING CHANGE: Significent changes to internal resolution system.
  • Loading branch information
ScriptedAlchemy committed Jun 12, 2018
1 parent 88dbc97 commit 9bd3e37
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 24 deletions.
2 changes: 1 addition & 1 deletion __tests__/flushChunks.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ describe('unit tests', () => {
bootstrap: ['bootstrap.js'],
main: ['main.js', 'main.css']
}
const outputFiles = filesFromChunks(entryNames, assetsByChunkName)
const outputFiles = filesFromChunks(entryNames, { assetsByChunkName })

expect(outputFiles).toEqual(['bootstrap.js', 'main.js', 'main.css'])
})
Expand Down
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
"main": "dist/flushChunks.js",
"typings": "index.d.ts",
"author": "James Gillmore <james@faceyspacey.com>",
"contributors": [
"Zack Jackson <zackary.l.jackson@gmail.com>"
],
"license": "MIT",
"scripts": {
"build": "babel src -d dist",
Expand Down
58 changes: 35 additions & 23 deletions src/flushChunks.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,7 @@ export default (stats: Stats, opts: Options): Api =>

const flushChunks = (stats: Stats, isWebpack: boolean, opts: Options = {}) => {
const beforeEntries = opts.before || defaults.before
const { assetsByChunkName, namedChunkGroups } = stats
const ffc = (assets, isWebpack = false) =>
filesFromChunks(assets, assetsByChunkName, namedChunkGroups, isWebpack)
const ffc = (assets, isWebpack) => filesFromChunks(assets, stats, isWebpack)

const jsBefore = ffc(beforeEntries)

Expand Down Expand Up @@ -92,11 +90,7 @@ const flushFiles = (stats: Stats, opts: Options2) =>

const flushFilesPure = (stats: Stats, isWebpack: boolean, opts: Options2) => {
const files = opts.chunkNames
? filesFromChunks(
opts.chunkNames,
stats.assetsByChunkName,
stats.namedChunkGroups
)
? filesFromChunks(opts.chunkNames, stats)
: flush(opts.moduleIds || [], stats, opts.rootDir, isWebpack)

const filter = opts.filter
Expand Down Expand Up @@ -181,6 +175,17 @@ const createFilesByModuleId = (stats: Stats): FilesMap => {
}, {})
}

const findChunkById = ({ chunks }) => {
if (!chunks) {
return {}
}
const filesByChunk = chunks.reduce((chunks, chunk) => {
chunks[chunk.id] = chunk.files
return chunks
}, {})
return filesByChunk
}

/** HELPERS */

const isUnique = (v: string, i: number, self: Files): boolean =>
Expand All @@ -198,11 +203,12 @@ const concatFilesAtKeys = (
[]
)

const filesByChunkName = (name, assetsByChunkName) => {
if (!assetsByChunkName || !assetsByChunkName[name]) {
const filesByChunkName = (name, namedChunkGroups) => {
if (!namedChunkGroups || !namedChunkGroups[name]) {
return [name]
}
return assetsByChunkName[name].chunks

return namedChunkGroups[name].chunks
}

const hasChunk = (entry, assets, checkChunkNames) => {
Expand All @@ -218,41 +224,47 @@ const hasChunk = (entry, assets, checkChunkNames) => {

const chunksToResolve = ({
chunkNames,
assetsByChunkName,
assets,
stats,
checkChunkNames
}: {
chunkNames: Files,
assets: FilesMap,
assetsByChunkName: Object,
stats: Object,
checkChunkNames?: boolean
}): Array<string> =>
chunkNames
.reduce((names, name) => {
if (!hasChunk(name, assets, checkChunkNames)) {
if (!hasChunk(name, stats.assetsByChunkName, checkChunkNames)) {
return names
}
const files = filesByChunkName(name, assetsByChunkName)
const files = filesByChunkName(name, stats.namedChunkGroups)
names.push(...files)
return names
}, [])
.filter(isUnique)

const filesFromChunks = (
chunkNames: Files,
assets: FilesMap,
assetsByChunkName: Object,
stats: Object,
checkChunkNames?: boolean
): Files => {
const entryToFiles = entry => assets[entry] || assets[`${entry}-`]
const chunksByID = findChunkById(stats)

const entryToFiles = entry => {
if (typeof entry === 'number') {
return chunksByID[entry]
}
return (
stats.assetsByChunkName[entry] || stats.assetsByChunkName[`${entry}-`]
)
}

const chunksWithAssets = chunksToResolve({
chunkNames,
assetsByChunkName,
assets,
stats,
checkChunkNames
})

return [].concat(...chunksWithAssets.map(entryToFiles))
return [].concat(...chunksWithAssets.map(entryToFiles)).filter(chunk => chunk)
}

/** EXPORTS FOR TESTS */
Expand Down

0 comments on commit 9bd3e37

Please sign in to comment.