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 | |