| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | /*	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"),	() => require("../../schemas/plugins/ids/OccurrenceChunkIdsPlugin.json"),	{		name: "Occurrence Order Chunk Ids Plugin",		baseDataPath: "options"	});const PLUGIN_NAME = "OccurrenceChunkIdsPlugin";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(PLUGIN_NAME, compilation => {			compilation.hooks.chunkIds.tap(PLUGIN_NAME, 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);				}				/** @type {Chunk[]} */				const chunksInOccurrenceOrder = [...chunks].sort((a, b) => {					if (prioritiseInitial) {						const aEntryOccurs =							/** @type {number} */							(occursInInitialChunksMap.get(a));						const bEntryOccurs =							/** @type {number} */							(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;
 |