File size: 3,174 Bytes
4cadbaf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
 * @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