保誠-保戶業務員媒合平台
Tomas
2022-05-19 957a1f10a06fdbb76f1a0ba94fe44126c613fee3
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Tobias Koppers @sokra
*/
"use strict";
 
const { RawSource } = require("webpack-sources");
const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
const { absolutify } = require("./util/identifier");
 
const cache = new WeakMap();
 
class EvalSourceMapDevToolModuleTemplatePlugin {
    constructor(compilation, options) {
        this.compilation = compilation;
        this.sourceMapComment =
            options.append || "//# sourceURL=[module]\n//# sourceMappingURL=[url]";
        this.moduleFilenameTemplate =
            options.moduleFilenameTemplate ||
            "webpack://[namespace]/[resource-path]?[hash]";
        this.namespace = options.namespace || "";
        this.options = options;
    }
 
    apply(moduleTemplate) {
        const self = this;
        const options = this.options;
        const matchModule = ModuleFilenameHelpers.matchObject.bind(
            ModuleFilenameHelpers,
            options
        );
        moduleTemplate.hooks.module.tap(
            "EvalSourceMapDevToolModuleTemplatePlugin",
            (source, module) => {
                const cachedSource = cache.get(source);
                if (cachedSource !== undefined) {
                    return cachedSource;
                }
 
                if (!matchModule(module.resource)) {
                    return source;
                }
 
                /** @type {{ [key: string]: TODO; }} */
                let sourceMap;
                let content;
                if (source.sourceAndMap) {
                    const sourceAndMap = source.sourceAndMap(options);
                    sourceMap = sourceAndMap.map;
                    content = sourceAndMap.source;
                } else {
                    sourceMap = source.map(options);
                    content = source.source();
                }
                if (!sourceMap) {
                    return source;
                }
 
                // Clone (flat) the sourcemap to ensure that the mutations below do not persist.
                sourceMap = Object.keys(sourceMap).reduce((obj, key) => {
                    obj[key] = sourceMap[key];
                    return obj;
                }, {});
                const context = this.compilation.compiler.options.context;
                const modules = sourceMap.sources.map(source => {
                    if (source.startsWith("webpack://")) {
                        source = absolutify(context, source.slice(10));
                    }
                    const module = self.compilation.findModule(source);
                    return module || source;
                });
                let moduleFilenames = modules.map(module => {
                    return ModuleFilenameHelpers.createFilename(
                        module,
                        {
                            moduleFilenameTemplate: self.moduleFilenameTemplate,
                            namespace: self.namespace
                        },
                        moduleTemplate.runtimeTemplate.requestShortener
                    );
                });
                moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(
                    moduleFilenames,
                    (filename, i, n) => {
                        for (let j = 0; j < n; j++) filename += "*";
                        return filename;
                    }
                );
                sourceMap.sources = moduleFilenames;
                sourceMap.sourceRoot = options.sourceRoot || "";
                sourceMap.file = `${module.id}.js`;
 
                const footer =
                    self.sourceMapComment.replace(
                        /\[url\]/g,
                        `data:application/json;charset=utf-8;base64,${Buffer.from(
                            JSON.stringify(sourceMap),
                            "utf8"
                        ).toString("base64")}`
                    ) + `\n//# sourceURL=webpack-internal:///${module.id}\n`; // workaround for chrome bug
 
                const evalSource = new RawSource(
                    `eval(${JSON.stringify(content + footer)});`
                );
 
                cache.set(source, evalSource);
 
                return evalSource;
            }
        );
        moduleTemplate.hooks.hash.tap(
            "EvalSourceMapDevToolModuleTemplatePlugin",
            hash => {
                hash.update("eval-source-map");
                hash.update("2");
            }
        );
    }
}
module.exports = EvalSourceMapDevToolModuleTemplatePlugin;