You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.1 KiB
80 lines
2.1 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const { find } = require("../util/SetHelpers"); |
|
const { |
|
compareModulesByPreOrderIndexOrIdentifier, |
|
compareModulesByPostOrderIndexOrIdentifier |
|
} = require("../util/comparators"); |
|
|
|
/** @typedef {import("../Compiler")} Compiler */ |
|
|
|
class ChunkModuleIdRangePlugin { |
|
constructor(options) { |
|
this.options = options; |
|
} |
|
|
|
/** |
|
* Apply the plugin |
|
* @param {Compiler} compiler the compiler instance |
|
* @returns {void} |
|
*/ |
|
apply(compiler) { |
|
const options = this.options; |
|
compiler.hooks.compilation.tap("ChunkModuleIdRangePlugin", compilation => { |
|
const moduleGraph = compilation.moduleGraph; |
|
compilation.hooks.moduleIds.tap("ChunkModuleIdRangePlugin", modules => { |
|
const chunkGraph = compilation.chunkGraph; |
|
const chunk = find( |
|
compilation.chunks, |
|
chunk => chunk.name === options.name |
|
); |
|
if (!chunk) { |
|
throw new Error( |
|
`ChunkModuleIdRangePlugin: Chunk with name '${options.name}"' was not found` |
|
); |
|
} |
|
|
|
let chunkModules; |
|
if (options.order) { |
|
let cmpFn; |
|
switch (options.order) { |
|
case "index": |
|
case "preOrderIndex": |
|
cmpFn = compareModulesByPreOrderIndexOrIdentifier(moduleGraph); |
|
break; |
|
case "index2": |
|
case "postOrderIndex": |
|
cmpFn = compareModulesByPostOrderIndexOrIdentifier(moduleGraph); |
|
break; |
|
default: |
|
throw new Error( |
|
"ChunkModuleIdRangePlugin: unexpected value of order" |
|
); |
|
} |
|
chunkModules = chunkGraph.getOrderedChunkModules(chunk, cmpFn); |
|
} else { |
|
chunkModules = Array.from(modules) |
|
.filter(m => { |
|
return chunkGraph.isModuleInChunk(m, chunk); |
|
}) |
|
.sort(compareModulesByPreOrderIndexOrIdentifier(moduleGraph)); |
|
} |
|
|
|
let currentId = options.start || 0; |
|
for (let i = 0; i < chunkModules.length; i++) { |
|
const m = chunkModules[i]; |
|
if (m.needId && chunkGraph.getModuleId(m) === null) { |
|
chunkGraph.setModuleId(m, currentId++); |
|
} |
|
if (options.end && currentId > options.end) break; |
|
} |
|
}); |
|
}); |
|
} |
|
} |
|
module.exports = ChunkModuleIdRangePlugin;
|
|
|