UNPKG

1.68 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6
7const { RawSource } = require("webpack-sources");
8const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
9
10const cache = new WeakMap();
11
12class 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
61module.exports = EvalDevToolModuleTemplatePlugin;