1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const { compareChunksNatural } = require("../util/comparators");
- const createSchemaValidation = require("../util/create-schema-validation");
- const { assignAscendingChunkIds } = require("./IdHelpers");
- /** @typedef {import("../../declarations/plugins/ids/OccurrenceChunkIdsPlugin").OccurrenceChunkIdsPluginOptions} OccurrenceChunkIdsPluginOptions */
- /** @typedef {import("../Chunk")} Chunk */
- /** @typedef {import("../Compiler")} Compiler */
- /** @typedef {import("../Module")} Module */
- const validate = createSchemaValidation(
- require("../../schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js"),
- () => require("../../schemas/plugins/ids/OccurrenceChunkIdsPlugin.json"),
- {
- name: "Occurrence Order Chunk Ids Plugin",
- baseDataPath: "options"
- }
- );
- class OccurrenceChunkIdsPlugin {
- /**
- * @param {OccurrenceChunkIdsPluginOptions=} options options object
- */
- constructor(options = {}) {
- validate(options);
- this.options = options;
- }
- /**
- * Apply the plugin
- * @param {Compiler} compiler the compiler instance
- * @returns {void}
- */
- apply(compiler) {
- const prioritiseInitial = this.options.prioritiseInitial;
- compiler.hooks.compilation.tap("OccurrenceChunkIdsPlugin", compilation => {
- compilation.hooks.chunkIds.tap("OccurrenceChunkIdsPlugin", chunks => {
- const chunkGraph = compilation.chunkGraph;
- /** @type {Map<Chunk, number>} */
- const occursInInitialChunksMap = new Map();
- const compareNatural = compareChunksNatural(chunkGraph);
- for (const c of chunks) {
- let occurs = 0;
- for (const chunkGroup of c.groupsIterable) {
- for (const parent of chunkGroup.parentsIterable) {
- if (parent.isInitial()) occurs++;
- }
- }
- occursInInitialChunksMap.set(c, occurs);
- }
- const chunksInOccurrenceOrder = Array.from(chunks).sort((a, b) => {
- if (prioritiseInitial) {
- const aEntryOccurs = occursInInitialChunksMap.get(a);
- const bEntryOccurs = occursInInitialChunksMap.get(b);
- if (aEntryOccurs > bEntryOccurs) return -1;
- if (aEntryOccurs < bEntryOccurs) return 1;
- }
- const aOccurs = a.getNumberOfGroups();
- const bOccurs = b.getNumberOfGroups();
- if (aOccurs > bOccurs) return -1;
- if (aOccurs < bOccurs) return 1;
- return compareNatural(a, b);
- });
- assignAscendingChunkIds(chunksInOccurrenceOrder, compilation);
- });
- });
- }
- }
- module.exports = OccurrenceChunkIdsPlugin;
|