Skip to content

Commit 3dfa75e

Browse files
committed
generate source map names globally
1 parent 3dc0d4e commit 3dfa75e

1 file changed

Lines changed: 42 additions & 22 deletions

File tree

lib/SourceMapDevToolPlugin.js

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@ class SourceMapDevToolPlugin {
4646
compiler.plugin("compilation", compilation => {
4747
new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
4848
compilation.plugin("after-optimize-chunk-assets", function(chunks) {
49-
let allModules = [];
50-
let allModuleFilenames = [];
49+
const moduleToSourceNameMapping = new Map();
5150
const tasks = [];
5251
chunks.forEach(function(chunk) {
5352
chunk.files.filter(ModuleFilenameHelpers.matchObject.bind(undefined, options)).map(function(file) {
@@ -84,40 +83,61 @@ class SourceMapDevToolPlugin {
8483
const module = compilation.findModule(source);
8584
return module || source;
8685
});
87-
const moduleFilenames = modules.map(module => ModuleFilenameHelpers.createFilename(module, moduleFilenameTemplate, requestShortener));
86+
for(const module of modules) {
87+
if(!moduleToSourceNameMapping.get(module)) {
88+
moduleToSourceNameMapping.set(module, ModuleFilenameHelpers.createFilename(module, moduleFilenameTemplate, requestShortener));
89+
}
90+
}
8891
task.modules = modules;
89-
task.moduleFilenames = moduleFilenames;
9092
return task;
9193
}).forEach(task => {
92-
allModules = allModules.concat(task.modules);
93-
allModuleFilenames = allModuleFilenames.concat(task.moduleFilenames);
9494
tasks.push(task);
9595
});
9696
});
97-
allModuleFilenames = ModuleFilenameHelpers.replaceDuplicates(allModuleFilenames, (filename, i) => ModuleFilenameHelpers.createFilename(allModules[i], fallbackModuleFilenameTemplate, requestShortener), (ai, bi) => {
98-
let a = allModules[ai];
99-
let b = allModules[bi];
100-
a = !a ? "" : typeof a === "string" ? a : a.identifier();
101-
b = !b ? "" : typeof b === "string" ? b : b.identifier();
102-
return a.length - b.length;
103-
});
104-
allModuleFilenames = ModuleFilenameHelpers.replaceDuplicates(allModuleFilenames, (filename, i, n) => {
105-
for(let j = 0; j < n; j++)
106-
filename += "*";
107-
return filename;
108-
});
109-
tasks.forEach(task => {
110-
task.moduleFilenames = allModuleFilenames.slice(0, task.moduleFilenames.length);
111-
allModuleFilenames = allModuleFilenames.slice(task.moduleFilenames.length);
97+
const usedNamesSet = new Set(moduleToSourceNameMapping.values());
98+
const conflictDetectionSet = new Set();
99+
100+
// all modules in defined order (longest identifier first)
101+
const allModules = Array.from(moduleToSourceNameMapping.keys()).sort((a, b) => {
102+
const ai = typeof a === "string" ? a : a.identifier();
103+
const bi = typeof b === "string" ? b : b.identifier();
104+
return ai.length - bi.length;
112105
});
106+
107+
// find modules with conflicting source names
108+
for(const module of allModules) {
109+
let sourceName = moduleToSourceNameMapping.get(module);
110+
let hasName = conflictDetectionSet.has(sourceName);
111+
if(!hasName) {
112+
conflictDetectionSet.add(sourceName);
113+
continue;
114+
}
115+
116+
// try the fallback name first
117+
sourceName = ModuleFilenameHelpers.createFilename(module, fallbackModuleFilenameTemplate, requestShortener);
118+
hasName = usedNamesSet.has(sourceName);
119+
if(!hasName) {
120+
moduleToSourceNameMapping.set(module, sourceName);
121+
usedNamesSet.add(sourceName);
122+
continue;
123+
}
124+
125+
// elsewise just append stars until we have a valid name
126+
do {
127+
sourceName += "*";
128+
hasName = usedNamesSet.has(sourceName);
129+
} while(hasName);
130+
moduleToSourceNameMapping.set(module, sourceName);
131+
usedNamesSet.add(sourceName);
132+
}
113133
tasks.forEach(function(task) {
114134
const chunk = task.chunk;
115135
const file = task.file;
116136
const asset = task.asset;
117137
const sourceMap = task.sourceMap;
118138
const source = task.source;
119-
const moduleFilenames = task.moduleFilenames;
120139
const modules = task.modules;
140+
const moduleFilenames = modules.map(m => moduleToSourceNameMapping.get(m));
121141
sourceMap.sources = moduleFilenames;
122142
if(sourceMap.sourcesContent && !options.noSources) {
123143
sourceMap.sourcesContent = sourceMap.sourcesContent.map((content, i) => `${content}\n\n\n${ModuleFilenameHelpers.createFooter(modules[i], requestShortener)}`);

0 commit comments

Comments
 (0)