| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const { DEFAULTS } = require("../config/defaults");
- const {
- compareModulesByPreOrderIndexOrIdentifier
- } = require("../util/comparators");
- const createHash = require("../util/createHash");
- const {
- getFullModuleName,
- getUsedModuleIdsAndModules
- } = require("./IdHelpers");
- /** @typedef {import("../../declarations/plugins/ids/HashedModuleIdsPlugin").HashedModuleIdsPluginOptions} HashedModuleIdsPluginOptions */
- /** @typedef {import("../Compiler")} Compiler */
- const PLUGIN_NAME = "HashedModuleIdsPlugin";
- class HashedModuleIdsPlugin {
- /**
- * Creates an instance of HashedModuleIdsPlugin.
- * @param {HashedModuleIdsPluginOptions=} options options object
- */
- constructor(options = {}) {
- /** @type {HashedModuleIdsPluginOptions} */
- this.options = options;
- }
- /**
- * Applies the plugin by registering its hooks on the compiler.
- * @param {Compiler} compiler the compiler instance
- * @returns {void}
- */
- apply(compiler) {
- compiler.hooks.validate.tap(PLUGIN_NAME, () => {
- compiler.validate(
- () => require("../../schemas/plugins/ids/HashedModuleIdsPlugin.json"),
- this.options,
- {
- name: "Hashed Module Ids Plugin",
- baseDataPath: "options"
- },
- (options) =>
- require("../../schemas/plugins/ids/HashedModuleIdsPlugin.check")(
- options
- )
- );
- });
- compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation) => {
- compilation.hooks.moduleIds.tap(PLUGIN_NAME, () => {
- const chunkGraph = compilation.chunkGraph;
- const context = this.options.context
- ? this.options.context
- : compiler.context;
- const [usedIds, modules] = getUsedModuleIdsAndModules(compilation);
- const modulesInNaturalOrder = modules.sort(
- compareModulesByPreOrderIndexOrIdentifier(compilation.moduleGraph)
- );
- for (const module of modulesInNaturalOrder) {
- const ident = getFullModuleName(module, context, compiler.root);
- const hash = createHash(
- this.options.hashFunction || DEFAULTS.HASH_FUNCTION
- );
- hash.update(ident || "");
- const hashId = hash.digest(this.options.hashDigest || "base64");
- let len = this.options.hashDigestLength || 4;
- while (usedIds.has(hashId.slice(0, len))) {
- /** @type {number} */ (len)++;
- }
- const moduleId = hashId.slice(0, len);
- chunkGraph.setModuleId(module, moduleId);
- usedIds.add(moduleId);
- }
- });
- });
- }
- }
- module.exports = HashedModuleIdsPlugin;
|