1 |
|
2 |
|
3 |
|
4 |
|
5 | "use strict";
|
6 |
|
7 | const { RawSource } = require("webpack-sources");
|
8 | const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
|
9 |
|
10 | const cache = new WeakMap();
|
11 |
|
12 | class EvalDevToolModuleTemplatePlugin {
|
13 | constructor(options) {
|
14 | this.sourceUrlComment = options.sourceUrlComment || "\n//# sourceURL=[url]";
|
15 | this.moduleFilenameTemplate =
|
16 | options.moduleFilenameTemplate ||
|
17 | "webpack://[namespace]/[resourcePath]?[loaders]";
|
18 | this.namespace = options.namespace || "";
|
19 | }
|
20 |
|
21 | apply(moduleTemplate) {
|
22 | moduleTemplate.hooks.module.tap(
|
23 | "EvalDevToolModuleTemplatePlugin",
|
24 | (source, module) => {
|
25 | const cacheEntry = cache.get(source);
|
26 | if (cacheEntry !== undefined) return cacheEntry;
|
27 | const content = source.source();
|
28 | const str = ModuleFilenameHelpers.createFilename(
|
29 | module,
|
30 | {
|
31 | moduleFilenameTemplate: this.moduleFilenameTemplate,
|
32 | namespace: this.namespace
|
33 | },
|
34 | moduleTemplate.runtimeTemplate.requestShortener
|
35 | );
|
36 | const footer =
|
37 | "\n" +
|
38 | this.sourceUrlComment.replace(
|
39 | /\[url\]/g,
|
40 | encodeURI(str)
|
41 | .replace(/%2F/g, "/")
|
42 | .replace(/%20/g, "_")
|
43 | .replace(/%5E/g, "^")
|
44 | .replace(/%5C/g, "\\")
|
45 | .replace(/^\//, "")
|
46 | );
|
47 | const result = new RawSource(
|
48 | `eval(${JSON.stringify(content + footer)});`
|
49 | );
|
50 | cache.set(source, result);
|
51 | return result;
|
52 | }
|
53 | );
|
54 | moduleTemplate.hooks.hash.tap("EvalDevToolModuleTemplatePlugin", hash => {
|
55 | hash.update("EvalDevToolModuleTemplatePlugin");
|
56 | hash.update("2");
|
57 | });
|
58 | }
|
59 | }
|
60 |
|
61 | module.exports = EvalDevToolModuleTemplatePlugin;
|