Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 973253b

Browse filesBrowse files
authored
Merge pull request #5844 from MagicDuck/master
adding `output.devtoolNamespace` option
2 parents 33c7970 + 982e44f commit 973253b
Copy full SHA for 973253b
Expand file treeCollapse file tree

14 files changed

+108
-21
lines changed

‎lib/EvalDevToolModulePlugin.js

Copy file name to clipboardExpand all lines: lib/EvalDevToolModulePlugin.js
+9-4Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,19 @@
77
const EvalDevToolModuleTemplatePlugin = require("./EvalDevToolModuleTemplatePlugin");
88

99
class EvalDevToolModulePlugin {
10-
constructor(sourceUrlComment, moduleFilenameTemplate) {
11-
this.sourceUrlComment = sourceUrlComment;
12-
this.moduleFilenameTemplate = moduleFilenameTemplate;
10+
constructor(options) {
11+
this.sourceUrlComment = options.sourceUrlComment;
12+
this.moduleFilenameTemplate = options.moduleFilenameTemplate;
13+
this.namespace = options.namespace;
1314
}
1415

1516
apply(compiler) {
1617
compiler.plugin("compilation", (compilation) => {
17-
compilation.moduleTemplates.javascript.apply(new EvalDevToolModuleTemplatePlugin(this.sourceUrlComment, this.moduleFilenameTemplate));
18+
compilation.moduleTemplates.javascript.apply(new EvalDevToolModuleTemplatePlugin({
19+
sourceUrlComment: this.sourceUrlComment,
20+
moduleFilenameTemplate: this.moduleFilenameTemplate,
21+
namespace: this.namespace
22+
}));
1823
});
1924
}
2025
}

‎lib/EvalDevToolModuleTemplatePlugin.js

Copy file name to clipboardExpand all lines: lib/EvalDevToolModuleTemplatePlugin.js
+8-4Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,19 @@ const RawSource = require("webpack-sources").RawSource;
88
const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
99

1010
class EvalDevToolModuleTemplatePlugin {
11-
constructor(sourceUrlComment, moduleFilenameTemplate) {
12-
this.sourceUrlComment = sourceUrlComment || "\n//# sourceURL=[url]";
13-
this.moduleFilenameTemplate = moduleFilenameTemplate || "webpack:///[resourcePath]?[loaders]";
11+
constructor(options) {
12+
this.sourceUrlComment = options.sourceUrlComment || "\n//# sourceURL=[url]";
13+
this.moduleFilenameTemplate = options.moduleFilenameTemplate || "webpack://[namespace]/[resourcePath]?[loaders]";
14+
this.namespace = options.namespace || "";
1415
}
1516

1617
apply(moduleTemplate) {
1718
moduleTemplate.plugin("module", (source, module) => {
1819
const content = source.source();
19-
const str = ModuleFilenameHelpers.createFilename(module, this.moduleFilenameTemplate, moduleTemplate.requestShortener);
20+
const str = ModuleFilenameHelpers.createFilename(module, {
21+
moduleFilenameTemplate: this.moduleFilenameTemplate,
22+
namespace: this.namespace
23+
}, moduleTemplate.requestShortener);
2024
const footer = ["\n",
2125
ModuleFilenameHelpers.createFooter(module, moduleTemplate.requestShortener),
2226
this.sourceUrlComment.replace(/\[url\]/g, encodeURI(str).replace(/%2F/g, "/").replace(/%20/g, "_").replace(/%5E/g, "^").replace(/%5C/g, "\\").replace(/^\//, ""))

‎lib/EvalSourceMapDevToolModuleTemplatePlugin.js

Copy file name to clipboardExpand all lines: lib/EvalSourceMapDevToolModuleTemplatePlugin.js
+6-2Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ class EvalSourceMapDevToolModuleTemplatePlugin {
1111
constructor(compilation, options) {
1212
this.compilation = compilation;
1313
this.sourceMapComment = options.append || "//# sourceURL=[module]\n//# sourceMappingURL=[url]";
14-
this.moduleFilenameTemplate = options.moduleFilenameTemplate || "webpack:///[resource-path]?[hash]";
14+
this.moduleFilenameTemplate = options.moduleFilenameTemplate || "webpack://[namespace]/[resource-path]?[hash]";
15+
this.namespace = options.namespace || "";
1516
this.options = options;
1617
}
1718

@@ -45,7 +46,10 @@ class EvalSourceMapDevToolModuleTemplatePlugin {
4546
return module || source;
4647
});
4748
let moduleFilenames = modules.map(module => {
48-
return ModuleFilenameHelpers.createFilename(module, self.moduleFilenameTemplate, moduleTemplate.requestShortener);
49+
return ModuleFilenameHelpers.createFilename(module, {
50+
moduleFilenameTemplate: self.moduleFilenameTemplate,
51+
namespace: self.namespace
52+
}, moduleTemplate.requestShortener);
4953
});
5054
moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(moduleFilenames, (filename, i, n) => {
5155
for(let j = 0; j < n; j++)

‎lib/ModuleFilenameHelpers.js

Copy file name to clipboardExpand all lines: lib/ModuleFilenameHelpers.js
+17-6Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ ModuleFilenameHelpers.ID = "[id]";
2626
ModuleFilenameHelpers.REGEXP_ID = /\[id\]/gi;
2727
ModuleFilenameHelpers.HASH = "[hash]";
2828
ModuleFilenameHelpers.REGEXP_HASH = /\[hash\]/gi;
29+
ModuleFilenameHelpers.NAMESPACE = "[namespace]";
30+
ModuleFilenameHelpers.REGEXP_NAMESPACE = /\[namespace\]/gi;
2931

3032
const getAfter = (str, token) => {
3133
const idx = str.indexOf(token);
@@ -48,7 +50,14 @@ const asRegExp = test => {
4850
return test;
4951
};
5052

51-
ModuleFilenameHelpers.createFilename = (module, moduleFilenameTemplate, requestShortener) => {
53+
ModuleFilenameHelpers.createFilename = (module, options, requestShortener) => {
54+
const opts = Object.assign({
55+
namespace: "",
56+
moduleFilenameTemplate: ""
57+
}, typeof options === "object" ? options : {
58+
moduleFilenameTemplate: options
59+
});
60+
5261
let absoluteResourcePath;
5362
let hash;
5463
let identifier;
@@ -73,8 +82,8 @@ ModuleFilenameHelpers.createFilename = (module, moduleFilenameTemplate, requestS
7382
const allLoaders = getBefore(identifier, "!");
7483
const query = getAfter(resource, "?");
7584
const resourcePath = resource.substr(0, resource.length - query.length);
76-
if(typeof moduleFilenameTemplate === "function") {
77-
return moduleFilenameTemplate({
85+
if(typeof opts.moduleFilenameTemplate === "function") {
86+
return opts.moduleFilenameTemplate({
7887
identifier: identifier,
7988
shortIdentifier: shortIdentifier,
8089
resource: resource,
@@ -83,10 +92,11 @@ ModuleFilenameHelpers.createFilename = (module, moduleFilenameTemplate, requestS
8392
allLoaders: allLoaders,
8493
query: query,
8594
moduleId: moduleId,
86-
hash: hash
95+
hash: hash,
96+
namespace: opts.namespace
8797
});
8898
}
89-
return moduleFilenameTemplate
99+
return opts.moduleFilenameTemplate
90100
.replace(ModuleFilenameHelpers.REGEXP_ALL_LOADERS_RESOURCE, identifier)
91101
.replace(ModuleFilenameHelpers.REGEXP_LOADERS_RESOURCE, shortIdentifier)
92102
.replace(ModuleFilenameHelpers.REGEXP_RESOURCE, resource)
@@ -96,7 +106,8 @@ ModuleFilenameHelpers.createFilename = (module, moduleFilenameTemplate, requestS
96106
.replace(ModuleFilenameHelpers.REGEXP_LOADERS, loaders)
97107
.replace(ModuleFilenameHelpers.REGEXP_QUERY, query)
98108
.replace(ModuleFilenameHelpers.REGEXP_ID, moduleId)
99-
.replace(ModuleFilenameHelpers.REGEXP_HASH, hash);
109+
.replace(ModuleFilenameHelpers.REGEXP_HASH, hash)
110+
.replace(ModuleFilenameHelpers.REGEXP_NAMESPACE, opts.namespace);
100111
};
101112

102113
ModuleFilenameHelpers.createFooter = (module, requestShortener) => {

‎lib/SourceMapDevToolPlugin.js

Copy file name to clipboardExpand all lines: lib/SourceMapDevToolPlugin.js
+12-4Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,17 @@ class SourceMapDevToolPlugin {
5858
if(!options) options = {};
5959
this.sourceMapFilename = options.filename;
6060
this.sourceMappingURLComment = options.append === false ? false : options.append || "\n//# sourceMappingURL=[url]";
61-
this.moduleFilenameTemplate = options.moduleFilenameTemplate || "webpack:///[resourcePath]";
62-
this.fallbackModuleFilenameTemplate = options.fallbackModuleFilenameTemplate || "webpack:///[resourcePath]?[hash]";
61+
this.moduleFilenameTemplate = options.moduleFilenameTemplate || "webpack://[namespace]/[resourcePath]";
62+
this.fallbackModuleFilenameTemplate = options.fallbackModuleFilenameTemplate || "webpack://[namespace]/[resourcePath]?[hash]";
63+
this.namespace = options.namespace || "";
6364
this.options = options;
6465
}
6566

6667
apply(compiler) {
6768
const sourceMapFilename = this.sourceMapFilename;
6869
const sourceMappingURLComment = this.sourceMappingURLComment;
6970
const moduleFilenameTemplate = this.moduleFilenameTemplate;
71+
const namespace = this.namespace;
7072
const fallbackModuleFilenameTemplate = this.fallbackModuleFilenameTemplate;
7173
const requestShortener = new RequestShortener(compiler.context);
7274
const options = this.options;
@@ -95,7 +97,10 @@ class SourceMapDevToolPlugin {
9597
for(let idx = 0; idx < modules.length; idx++) {
9698
const module = modules[idx];
9799
if(!moduleToSourceNameMapping.get(module)) {
98-
moduleToSourceNameMapping.set(module, ModuleFilenameHelpers.createFilename(module, moduleFilenameTemplate, requestShortener));
100+
moduleToSourceNameMapping.set(module, ModuleFilenameHelpers.createFilename(module, {
101+
moduleFilenameTemplate: moduleFilenameTemplate,
102+
namespace: namespace
103+
}, requestShortener));
99104
}
100105
}
101106

@@ -128,7 +133,10 @@ class SourceMapDevToolPlugin {
128133
}
129134

130135
// try the fallback name first
131-
sourceName = ModuleFilenameHelpers.createFilename(module, fallbackModuleFilenameTemplate, requestShortener);
136+
sourceName = ModuleFilenameHelpers.createFilename(module, {
137+
moduleFilenameTemplate: fallbackModuleFilenameTemplate,
138+
namespace: namespace
139+
}, requestShortener);
132140
hasName = usedNamesSet.has(sourceName);
133141
if(!hasName) {
134142
moduleToSourceNameMapping.set(module, sourceName);

‎lib/WebpackOptionsApply.js

Copy file name to clipboardExpand all lines: lib/WebpackOptionsApply.js
+7-1Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ class WebpackOptionsApply extends OptionsApply {
206206
ExternalsPlugin = require("./ExternalsPlugin");
207207
compiler.apply(new ExternalsPlugin(options.output.libraryTarget, options.externals));
208208
}
209+
209210
let noSources;
210211
let legacy;
211212
let modern;
@@ -233,6 +234,7 @@ class WebpackOptionsApply extends OptionsApply {
233234
columns: cheap ? false : true,
234235
lineToLine: options.output.devtoolLineToLine,
235236
noSources: noSources,
237+
namespace: options.output.devtoolNamespace
236238
}));
237239
} else if(options.devtool && options.devtool.indexOf("eval") >= 0) {
238240
legacy = options.devtool.indexOf("@") >= 0;
@@ -241,7 +243,11 @@ class WebpackOptionsApply extends OptionsApply {
241243
legacy ? "\n//@ sourceURL=[url]" :
242244
modern ? "\n//# sourceURL=[url]" :
243245
null;
244-
compiler.apply(new EvalDevToolModulePlugin(comment, options.output.devtoolModuleFilenameTemplate));
246+
compiler.apply(new EvalDevToolModulePlugin({
247+
sourceUrlComment: comment,
248+
moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
249+
namespace: options.output.devtoolNamespace
250+
}));
245251
}
246252
compiler.apply(
247253
new JavascriptModulesPlugin(),

‎lib/WebpackOptionsDefaulter.js

Copy file name to clipboardExpand all lines: lib/WebpackOptionsDefaulter.js
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class WebpackOptionsDefaulter extends OptionsDefaulter {
5656
this.set("output.jsonpFunction", "make", (options) => {
5757
return Template.toIdentifier("webpackJsonp" + options.output.library);
5858
});
59+
this.set("output.devtoolNamespace", "make", (options) => {
60+
return options.output.library || "";
61+
});
5962
this.set("output.libraryTarget", "var");
6063
this.set("output.path", process.cwd());
6164
this.set("output.sourceMapFilename", "[file].map[query]");

‎schemas/webpackOptionsSchema.json

Copy file name to clipboardExpand all lines: schemas/webpackOptionsSchema.json
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,10 @@
323323
}
324324
]
325325
},
326+
"devtoolNamespace": {
327+
"description": "Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to `output.library` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries.",
328+
"type": "string"
329+
},
326330
"filename": {
327331
"description": "Specifies the name of each output file on disk. You must **not** specify an absolute path here! The `output.path` option determines the location on disk the files are written to, filename is used solely for naming the individual files.",
328332
"type": "string",
+8Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
it("should include webpack://mylibrary/./test.js in SourceMap", function() {
2+
var fs = require("fs");
3+
var source = fs.readFileSync(__filename + ".map", "utf-8");
4+
var map = JSON.parse(source);
5+
map.sources.should.containEql("webpack://mylibrary/./test.js");
6+
});
7+
8+
require.include("./test.js");
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var foo = {};
2+
3+
module.exports = foo;
+10Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = {
2+
output: {
3+
library: "mylibrary"
4+
},
5+
node: {
6+
__dirname: false,
7+
__filename: false
8+
},
9+
devtool: "cheap-source-map"
10+
};
+8Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
it("should include webpack://mynamespace/./test.js in SourceMap", function() {
2+
var fs = require("fs");
3+
var source = fs.readFileSync(__filename + ".map", "utf-8");
4+
var map = JSON.parse(source);
5+
map.sources.should.containEql("webpack://mynamespace/./test.js");
6+
});
7+
8+
require.include("./test.js");
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
var foo = {};
2+
3+
module.exports = foo;
+10Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
module.exports = {
2+
output: {
3+
devtoolNamespace: "mynamespace"
4+
},
5+
node: {
6+
__dirname: false,
7+
__filename: false
8+
},
9+
devtool: "cheap-source-map"
10+
};

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.