@@ -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