123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /**
- * @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
|