Skip to content

Commit 15e8349

Browse files
committed
Find duplicates globally. Don't fallback shortest.
fixes webpack#363
1 parent f2a28a7 commit 15e8349

File tree

2 files changed

+91
-48
lines changed

2 files changed

+91
-48
lines changed

lib/ModuleFilenameHelpers.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,23 @@ ModuleFilenameHelpers.createFooter = function createFooter(module, requestShorte
9393
}
9494
};
9595

96-
ModuleFilenameHelpers.replaceDuplicates = function replaceDuplicates(array, fn) {
96+
ModuleFilenameHelpers.replaceDuplicates = function replaceDuplicates(array, fn, comparator) {
9797
var countMap = {};
9898
var posMap = {};
99-
array.forEach(function(item) {
100-
countMap[item] = (countMap[item] || 0) + 1;
99+
array.forEach(function(item, idx) {
100+
countMap[item] = (countMap[item] || []);
101+
countMap[item].push(idx);
101102
posMap[item] = 0;
102103
});
104+
if(comparator) {
105+
Object.keys(countMap).forEach(function(item) {
106+
countMap[item].sort(comparator);
107+
});
108+
}
103109
return array.map(function(item, i) {
104-
if(countMap[item] > 1) {
110+
if(countMap[item].length > 1) {
111+
if(comparator && countMap[item][0] === i)
112+
return item;
105113
return fn(item, i, posMap[item]++);
106114
} else return item;
107115
});

lib/SourceMapDevToolPlugin.js

Lines changed: 79 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@ SourceMapDevToolPlugin.prototype.apply = function(compiler) {
2727
module.useSourceMap = true;
2828
});
2929
compilation.plugin("after-optimize-chunk-assets", function(chunks) {
30+
var allModules = [];
31+
var allModuleFilenames = [];
32+
var tasks = [];
3033
chunks.forEach(function(chunk) {
31-
chunk.files.slice().forEach(function(file) {
34+
chunk.files.slice().map(function(file) {
3235
var asset = this.assets[file];
3336
if(asset.__SourceMapDevTool_Data) {
3437
var data = asset.__SourceMapDevTool_Data;
@@ -39,53 +42,85 @@ SourceMapDevToolPlugin.prototype.apply = function(compiler) {
3942
}
4043
var sourceMap = asset.map();
4144
if(sourceMap) {
42-
var modules = sourceMap.sources.map(function(source) {
43-
var module = compilation.findModule(source);
44-
return module || source;
45-
});
46-
var moduleFilenames = modules.map(function(module) {
47-
return ModuleFilenameHelpers.createFilename(module, moduleFilenameTemplate, requestShortener);
48-
});
49-
moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(moduleFilenames, function(filename, i) {
50-
return ModuleFilenameHelpers.createFilename(modules[i], fallbackModuleFilenameTemplate, requestShortener);
51-
});
52-
moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(moduleFilenames, function(filename, i, n) {
53-
for(var j = 0; j < n; j++)
54-
filename += "*";
55-
return filename;
56-
});
57-
sourceMap.sources = moduleFilenames;
58-
if(sourceMap.sourcesContent) {
59-
sourceMap.sourcesContent = sourceMap.sourcesContent.map(function(content, i) {
60-
return content + "\n\n\n" + ModuleFilenameHelpers.createFooter(modules[i], requestShortener);
61-
});
62-
}
63-
sourceMap.sourceRoot = "";
64-
sourceMap.file = file;
65-
asset.__SourceMapDevTool_Data = {};
66-
if(sourceMapFilename) {
67-
var filename = file, query = "";
68-
var idx = filename.indexOf("?");
69-
if(idx >= 0) {
70-
query = filename.substr(idx);
71-
filename = filename.substr(0, idx);
72-
}
73-
var sourceMapFile = sourceMapFilename
74-
.replace(Template.REGEXP_FILE, filename)
75-
.replace(Template.REGEXP_QUERY, query)
76-
.replace(Template.REGEXP_FILEBASE, basename(filename))
77-
.replace(Template.REGEXP_HASH, this.hash)
78-
.replace(Template.REGEXP_ID, chunk.id);
79-
var sourceMapUrl = path.relative(path.dirname(file), sourceMapFile).replace(/\\/g, "/");
80-
asset.__SourceMapDevTool_Data[file] = this.assets[file] = new ConcatSource(asset, sourceMappingURLComment.replace(/\[url\]/g, sourceMapUrl));
81-
asset.__SourceMapDevTool_Data[sourceMapFile] = this.assets[sourceMapFile] = new RawSource(JSON.stringify(sourceMap));
82-
chunk.files.push(sourceMapFile);
83-
} else {
84-
asset.__SourceMapDevTool_Data[file] = this.assets[file] = new ConcatSource(asset, sourceMappingURLComment.replace(/\[url\]/g, "data:application/json;base64," + new Buffer(JSON.stringify(sourceMap)).toString("base64")));
45+
return {
46+
chunk: chunk,
47+
file: file,
48+
asset: asset,
49+
sourceMap: sourceMap
8550
}
8651
}
52+
}, this).filter(Boolean).map(function(task) {
53+
var modules = task.sourceMap.sources.map(function(source) {
54+
var module = compilation.findModule(source);
55+
return module || source;
56+
});
57+
var moduleFilenames = modules.map(function(module) {
58+
return ModuleFilenameHelpers.createFilename(module, moduleFilenameTemplate, requestShortener);
59+
});
60+
task.modules = modules;
61+
task.moduleFilenames = moduleFilenames;
62+
return task;
63+
}, this).forEach(function(task) {
64+
allModules = allModules.concat(task.modules);
65+
allModuleFilenames = allModuleFilenames.concat(task.moduleFilenames);
66+
tasks.push(task);
8767
}, this);
8868
}, this);
69+
allModuleFilenames = ModuleFilenameHelpers.replaceDuplicates(allModuleFilenames, function(filename, i) {
70+
return ModuleFilenameHelpers.createFilename(allModules[i], fallbackModuleFilenameTemplate, requestShortener);
71+
}, function(ai, bi) {
72+
var a = allModules[ai];
73+
var b = allModules[bi];
74+
a = typeof a === "string" ? a : a.identifier();
75+
b = typeof b === "string" ? b : b.identifier();
76+
return a.length - b.length;
77+
});
78+
allModuleFilenames = ModuleFilenameHelpers.replaceDuplicates(allModuleFilenames, function(filename, i, n) {
79+
for(var j = 0; j < n; j++)
80+
filename += "*";
81+
return filename;
82+
});
83+
tasks.forEach(function(task) {
84+
task.moduleFilenames = allModuleFilenames.slice(0, task.moduleFilenames.length);
85+
allModuleFilenames = allModuleFilenames.slice(task.moduleFilenames.length);
86+
}, this);
87+
tasks.forEach(function(task) {
88+
var chunk = task.chunk;
89+
var file = task.file;
90+
var asset = task.asset;
91+
var sourceMap = task.sourceMap;
92+
var moduleFilenames = task.moduleFilenames;
93+
var modules = task.modules;
94+
sourceMap.sources = moduleFilenames;
95+
if(sourceMap.sourcesContent) {
96+
sourceMap.sourcesContent = sourceMap.sourcesContent.map(function(content, i) {
97+
return content + "\n\n\n" + ModuleFilenameHelpers.createFooter(modules[i], requestShortener);
98+
});
99+
}
100+
sourceMap.sourceRoot = "";
101+
sourceMap.file = file;
102+
asset.__SourceMapDevTool_Data = {};
103+
if(sourceMapFilename) {
104+
var filename = file, query = "";
105+
var idx = filename.indexOf("?");
106+
if(idx >= 0) {
107+
query = filename.substr(idx);
108+
filename = filename.substr(0, idx);
109+
}
110+
var sourceMapFile = sourceMapFilename
111+
.replace(Template.REGEXP_FILE, filename)
112+
.replace(Template.REGEXP_QUERY, query)
113+
.replace(Template.REGEXP_FILEBASE, basename(filename))
114+
.replace(Template.REGEXP_HASH, this.hash)
115+
.replace(Template.REGEXP_ID, chunk.id);
116+
var sourceMapUrl = path.relative(path.dirname(file), sourceMapFile).replace(/\\/g, "/");
117+
asset.__SourceMapDevTool_Data[file] = this.assets[file] = new ConcatSource(asset, sourceMappingURLComment.replace(/\[url\]/g, sourceMapUrl));
118+
asset.__SourceMapDevTool_Data[sourceMapFile] = this.assets[sourceMapFile] = new RawSource(JSON.stringify(sourceMap));
119+
chunk.files.push(sourceMapFile);
120+
} else {
121+
asset.__SourceMapDevTool_Data[file] = this.assets[file] = new ConcatSource(asset, sourceMappingURLComment.replace(/\[url\]/g, "data:application/json;base64," + new Buffer(JSON.stringify(sourceMap)).toString("base64")));
122+
}
123+
}, this);
89124
});
90125
});
91126
};

0 commit comments

Comments
 (0)