Projekt

Obecné

Profil

Stáhnout (3.35 KB) Statistiky
| Větev: | Revize:
1
/*
2
	MIT License http://www.opensource.org/licenses/mit-license.php
3
	Author Tobias Koppers @sokra
4
*/
5
"use strict";
6

    
7
const { RawSource } = require("webpack-sources");
8
const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
9
const { absolutify } = require("./util/identifier");
10

    
11
const cache = new WeakMap();
12

    
13
class EvalSourceMapDevToolModuleTemplatePlugin {
14
	constructor(compilation, options) {
15
		this.compilation = compilation;
16
		this.sourceMapComment =
17
			options.append || "//# sourceURL=[module]\n//# sourceMappingURL=[url]";
18
		this.moduleFilenameTemplate =
19
			options.moduleFilenameTemplate ||
20
			"webpack://[namespace]/[resource-path]?[hash]";
21
		this.namespace = options.namespace || "";
22
		this.options = options;
23
	}
24

    
25
	apply(moduleTemplate) {
26
		const self = this;
27
		const options = this.options;
28
		const matchModule = ModuleFilenameHelpers.matchObject.bind(
29
			ModuleFilenameHelpers,
30
			options
31
		);
32
		moduleTemplate.hooks.module.tap(
33
			"EvalSourceMapDevToolModuleTemplatePlugin",
34
			(source, module) => {
35
				const cachedSource = cache.get(source);
36
				if (cachedSource !== undefined) {
37
					return cachedSource;
38
				}
39

    
40
				if (!matchModule(module.resource)) {
41
					return source;
42
				}
43

    
44
				/** @type {{ [key: string]: TODO; }} */
45
				let sourceMap;
46
				let content;
47
				if (source.sourceAndMap) {
48
					const sourceAndMap = source.sourceAndMap(options);
49
					sourceMap = sourceAndMap.map;
50
					content = sourceAndMap.source;
51
				} else {
52
					sourceMap = source.map(options);
53
					content = source.source();
54
				}
55
				if (!sourceMap) {
56
					return source;
57
				}
58

    
59
				// Clone (flat) the sourcemap to ensure that the mutations below do not persist.
60
				sourceMap = Object.keys(sourceMap).reduce((obj, key) => {
61
					obj[key] = sourceMap[key];
62
					return obj;
63
				}, {});
64
				const context = this.compilation.compiler.options.context;
65
				const modules = sourceMap.sources.map(source => {
66
					if (source.startsWith("webpack://")) {
67
						source = absolutify(context, source.slice(10));
68
					}
69
					const module = self.compilation.findModule(source);
70
					return module || source;
71
				});
72
				let moduleFilenames = modules.map(module => {
73
					return ModuleFilenameHelpers.createFilename(
74
						module,
75
						{
76
							moduleFilenameTemplate: self.moduleFilenameTemplate,
77
							namespace: self.namespace
78
						},
79
						moduleTemplate.runtimeTemplate.requestShortener
80
					);
81
				});
82
				moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(
83
					moduleFilenames,
84
					(filename, i, n) => {
85
						for (let j = 0; j < n; j++) filename += "*";
86
						return filename;
87
					}
88
				);
89
				sourceMap.sources = moduleFilenames;
90
				sourceMap.sourceRoot = options.sourceRoot || "";
91
				sourceMap.file = `${module.id}.js`;
92

    
93
				const footer =
94
					self.sourceMapComment.replace(
95
						/\[url\]/g,
96
						`data:application/json;charset=utf-8;base64,${Buffer.from(
97
							JSON.stringify(sourceMap),
98
							"utf8"
99
						).toString("base64")}`
100
					) + `\n//# sourceURL=webpack-internal:///${module.id}\n`; // workaround for chrome bug
101

    
102
				const evalSource = new RawSource(
103
					`eval(${JSON.stringify(content + footer)});`
104
				);
105

    
106
				cache.set(source, evalSource);
107

    
108
				return evalSource;
109
			}
110
		);
111
		moduleTemplate.hooks.hash.tap(
112
			"EvalSourceMapDevToolModuleTemplatePlugin",
113
			hash => {
114
				hash.update("eval-source-map");
115
				hash.update("2");
116
			}
117
		);
118
	}
119
}
120
module.exports = EvalSourceMapDevToolModuleTemplatePlugin;
(45-45/144)