| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "use strict"; |
| const createHash = require("./util/createHash"); |
| |
| const validateOptions = require("schema-utils"); |
| const schema = require("../schemas/plugins/HashedModuleIdsPlugin.json"); |
| |
| /** @typedef {import("../declarations/plugins/HashedModuleIdsPlugin").HashedModuleIdsPluginOptions} HashedModuleIdsPluginOptions */ |
| |
| class HashedModuleIdsPlugin { |
| /** |
| * @param {HashedModuleIdsPluginOptions=} options options object |
| */ |
| constructor(options) { |
| if (!options) options = {}; |
| |
| validateOptions(schema, options, "Hashed Module Ids Plugin"); |
| |
| /** @type {HashedModuleIdsPluginOptions} */ |
| this.options = Object.assign( |
| { |
| context: null, |
| hashFunction: "md4", |
| hashDigest: "base64", |
| hashDigestLength: 4 |
| }, |
| options |
| ); |
| } |
| |
| apply(compiler) { |
| const options = this.options; |
| compiler.hooks.compilation.tap("HashedModuleIdsPlugin", compilation => { |
| const usedIds = new Set(); |
| compilation.hooks.beforeModuleIds.tap( |
| "HashedModuleIdsPlugin", |
| modules => { |
| for (const module of modules) { |
| if (module.id === null && module.libIdent) { |
| const id = module.libIdent({ |
| context: this.options.context || compiler.options.context |
| }); |
| const hash = createHash(options.hashFunction); |
| hash.update(id); |
| const hashId = hash.digest(options.hashDigest); |
| let len = options.hashDigestLength; |
| while (usedIds.has(hashId.substr(0, len))) len++; |
| module.id = hashId.substr(0, len); |
| usedIds.add(module.id); |
| } |
| } |
| } |
| ); |
| }); |
| } |
| } |
| |
| module.exports = HashedModuleIdsPlugin; |