| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "use strict"; |
| |
| const GraphHelpers = require("../GraphHelpers"); |
| |
| class EnsureChunkConditionsPlugin { |
| apply(compiler) { |
| compiler.hooks.compilation.tap( |
| "EnsureChunkConditionsPlugin", |
| compilation => { |
| const handler = chunks => { |
| let changed = false; |
| for (const module of compilation.modules) { |
| if (!module.chunkCondition) continue; |
| const sourceChunks = new Set(); |
| const chunkGroups = new Set(); |
| for (const chunk of module.chunksIterable) { |
| if (!module.chunkCondition(chunk)) { |
| sourceChunks.add(chunk); |
| for (const group of chunk.groupsIterable) { |
| chunkGroups.add(group); |
| } |
| } |
| } |
| if (sourceChunks.size === 0) continue; |
| const targetChunks = new Set(); |
| chunkGroupLoop: for (const chunkGroup of chunkGroups) { |
| // Can module be placed in a chunk of this group? |
| for (const chunk of chunkGroup.chunks) { |
| if (module.chunkCondition(chunk)) { |
| targetChunks.add(chunk); |
| continue chunkGroupLoop; |
| } |
| } |
| // We reached the entrypoint: fail |
| if (chunkGroup.isInitial()) { |
| throw new Error( |
| "Cannot fullfil chunk condition of " + module.identifier() |
| ); |
| } |
| // Try placing in all parents |
| for (const group of chunkGroup.parentsIterable) { |
| chunkGroups.add(group); |
| } |
| } |
| for (const sourceChunk of sourceChunks) { |
| GraphHelpers.disconnectChunkAndModule(sourceChunk, module); |
| } |
| for (const targetChunk of targetChunks) { |
| GraphHelpers.connectChunkAndModule(targetChunk, module); |
| } |
| } |
| if (changed) return true; |
| }; |
| compilation.hooks.optimizeChunksBasic.tap( |
| "EnsureChunkConditionsPlugin", |
| handler |
| ); |
| compilation.hooks.optimizeExtractedChunksBasic.tap( |
| "EnsureChunkConditionsPlugin", |
| handler |
| ); |
| } |
| ); |
| } |
| } |
| module.exports = EnsureChunkConditionsPlugin; |