Spaces:
Sleeping
Sleeping
/** | |
* @license | |
* Copyright 2018 Google Inc. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
function isAsync (chunk) { | |
if ('canBeInitial' in chunk) { | |
return !chunk.canBeInitial() | |
} else { | |
return !chunk.isInitial() | |
} | |
} | |
function getChunkEntryNames (chunk) { | |
if ('groupsIterable' in chunk) { | |
return Array.from(new Set(getNames(chunk.groupsIterable))) | |
} else { | |
return chunk.entrypoints.map(e => e.options.name) | |
} | |
} | |
function getNames (groups, processed = new Set()) { | |
const Entrypoint = require('webpack/lib/Entrypoint') | |
const names = [] | |
for (const group of groups) { | |
if (group instanceof Entrypoint) { | |
// entrypoint | |
if (group.options.name) { | |
names.push(group.options.name) | |
} | |
} else if (!processed.has(group)) { | |
processed.add(group) | |
names.push(...getNames(group.parentsIterable, processed)) | |
} | |
} | |
return names | |
} | |
function extractChunks ({ compilation, optionsInclude }) { | |
let includeChunks | |
let includeType | |
let includeEntryPoints | |
if (optionsInclude && typeof optionsInclude === 'object') { | |
includeType = optionsInclude.type | |
includeChunks = optionsInclude.chunks | |
includeEntryPoints = optionsInclude.entries | |
} else { | |
if (Array.isArray(optionsInclude)) { | |
includeChunks = optionsInclude | |
} else { | |
includeType = optionsInclude | |
} | |
} | |
let chunks = compilation.chunks | |
if (Array.isArray(includeChunks)) { | |
chunks = chunks.filter((chunk) => { | |
return chunk.name && includeChunks.includes(chunk.name) | |
}) | |
} | |
if (Array.isArray(includeEntryPoints)) { | |
chunks = chunks.filter(chunk => { | |
const names = getChunkEntryNames(chunk) | |
return names.some(name => includeEntryPoints.includes(name)) | |
}) | |
} | |
// 'asyncChunks' are chunks intended for lazy/async loading usually generated as | |
// part of code-splitting with import() or require.ensure(). By default, asyncChunks | |
// get wired up using link rel=preload when using this plugin. This behaviour can be | |
// configured to preload all types of chunks or just prefetch chunks as needed. | |
if (includeType === undefined || includeType === 'asyncChunks') { | |
return chunks.filter(isAsync) | |
} | |
if (includeType === 'initial') { | |
return chunks.filter(chunk => !isAsync(chunk)) | |
} | |
if (includeType === 'allChunks') { | |
// Async chunks, vendor chunks, normal chunks. | |
return chunks | |
} | |
if (includeType === 'allAssets') { | |
// Every asset, regardless of which chunk it's in. | |
// Wrap it in a single, "psuedo-chunk" return value. | |
return [{ files: Object.keys(compilation.assets) }] | |
} | |
return chunks | |
} | |
module.exports = extractChunks | |