保誠-保戶業務員媒合平台
HelenHuang
2022-06-09 9bdb95c9e34cef640534e5e5a1e2225a80442000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
    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 = /** @type {string} */ (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;