@@ -167,18 +167,22 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
167167 asyncLib . parallel (
168168 [
169169 callback => {
170+ const results = [ ] ;
171+ const yield_ = obj => results . push ( obj ) ;
172+
170173 contextResolver . resolve (
171174 { } ,
172175 context ,
173176 resource ,
174177 {
175178 fileDependencies,
176179 missingDependencies,
177- contextDependencies
180+ contextDependencies,
181+ yield : yield_
178182 } ,
179- ( err , result ) => {
183+ err => {
180184 if ( err ) return callback ( err ) ;
181- callback ( null , result ) ;
185+ callback ( null , results ) ;
182186 }
183187 ) ;
184188 } ,
@@ -213,15 +217,25 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
213217 contextDependencies
214218 } ) ;
215219 }
216-
220+ let [ contextResult , loaderResult ] = result ;
221+ if ( contextResult . length > 1 ) {
222+ const first = contextResult [ 0 ] ;
223+ contextResult = contextResult . filter ( r => r . path ) ;
224+ if ( contextResult . length === 0 ) contextResult . push ( first ) ;
225+ }
217226 this . hooks . afterResolve . callAsync (
218227 {
219228 addon :
220229 loadersPrefix +
221- result [ 1 ] . join ( "!" ) +
222- ( result [ 1 ] . length > 0 ? "!" : "" ) ,
223- resource : result [ 0 ] ,
230+ loaderResult . join ( "!" ) +
231+ ( loaderResult . length > 0 ? "!" : "" ) ,
232+ resource :
233+ contextResult . length > 1
234+ ? contextResult . map ( r => r . path )
235+ : contextResult [ 0 ] . path ,
224236 resolveDependencies : this . resolveDependencies . bind ( this ) ,
237+ resourceQuery : contextResult [ 0 ] . query ,
238+ resourceFragment : contextResult [ 0 ] . fragment ,
225239 ...beforeResolveResult
226240 } ,
227241 ( err , result ) => {
@@ -278,26 +292,28 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
278292 } = options ;
279293 if ( ! regExp || ! resource ) return callback ( null , [ ] ) ;
280294
281- const addDirectoryChecked = ( directory , visited , callback ) => {
295+ let severalContexts = false ;
296+ const addDirectoryChecked = ( ctx , directory , visited , callback ) => {
282297 fs . realpath ( directory , ( err , realPath ) => {
283298 if ( err ) return callback ( err ) ;
284299 if ( visited . has ( realPath ) ) return callback ( null , [ ] ) ;
285300 let recursionStack ;
286301 addDirectory (
302+ ctx ,
287303 directory ,
288- ( dir , callback ) => {
304+ ( _ , dir , callback ) => {
289305 if ( recursionStack === undefined ) {
290306 recursionStack = new Set ( visited ) ;
291307 recursionStack . add ( realPath ) ;
292308 }
293- addDirectoryChecked ( dir , recursionStack , callback ) ;
309+ addDirectoryChecked ( ctx , dir , recursionStack , callback ) ;
294310 } ,
295311 callback
296312 ) ;
297313 } ) ;
298314 } ;
299315
300- const addDirectory = ( directory , addSubDirectory , callback ) => {
316+ const addDirectory = ( ctx , directory , addSubDirectory , callback ) => {
301317 fs . readdir ( directory , ( err , files ) => {
302318 if ( err ) return callback ( err ) ;
303319 const processedFiles = cmf . hooks . contextModuleFiles . call (
@@ -324,16 +340,15 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
324340
325341 if ( stat . isDirectory ( ) ) {
326342 if ( ! recursive ) return callback ( ) ;
327- addSubDirectory ( subResource , callback ) ;
343+ addSubDirectory ( ctx , subResource , callback ) ;
328344 } else if (
329345 stat . isFile ( ) &&
330346 ( ! include || subResource . match ( include ) )
331347 ) {
332348 const obj = {
333- context : resource ,
349+ context : ctx ,
334350 request :
335- "." +
336- subResource . substr ( resource . length ) . replace ( / \\ / g, "/" )
351+ "." + subResource . substr ( ctx . length ) . replace ( / \\ / g, "/" )
337352 } ;
338353
339354 this . hooks . alternativeRequests . callAsync (
@@ -344,8 +359,11 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
344359 alternatives = alternatives
345360 . filter ( obj => regExp . test ( obj . request ) )
346361 . map ( obj => {
362+ const request = severalContexts
363+ ? join ( fs , obj . context , obj . request )
364+ : obj . request ;
347365 const dep = new ContextElementDependency (
348- obj . request + resourceQuery + resourceFragment ,
366+ request + resourceQuery + resourceFragment ,
349367 obj . request ,
350368 typePrefix ,
351369 category ,
@@ -382,12 +400,38 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
382400 } ) ;
383401 } ;
384402
385- if ( typeof fs . realpath === "function" ) {
386- addDirectoryChecked ( resource , new Set ( ) , callback ) ;
403+ const addSubDirectory = ( ctx , dir , callback ) =>
404+ addDirectory ( ctx , dir , addSubDirectory , callback ) ;
405+
406+ const visitResource = ( resource , callback ) => {
407+ if ( typeof fs . realpath === "function" ) {
408+ addDirectoryChecked ( resource , resource , new Set ( ) , callback ) ;
409+ } else {
410+ addDirectory ( resource , resource , addSubDirectory , callback ) ;
411+ }
412+ } ;
413+
414+ if ( typeof resource === "string" ) {
415+ visitResource ( resource , callback ) ;
387416 } else {
388- const addSubDirectory = ( dir , callback ) =>
389- addDirectory ( dir , addSubDirectory , callback ) ;
390- addDirectory ( resource , addSubDirectory , callback ) ;
417+ severalContexts = true ;
418+ asyncLib . map ( resource , visitResource , ( err , result ) => {
419+ if ( err ) return callback ( err ) ;
420+
421+ // result dependencies should have unique userRequest
422+ // ordered by resolve result
423+ const temp = new Set ( ) ;
424+ const res = [ ] ;
425+ for ( let i = 0 ; i < result . length ; i ++ ) {
426+ const inner = result [ i ] ;
427+ for ( const el of inner ) {
428+ if ( temp . has ( el . userRequest ) ) continue ;
429+ res . push ( el ) ;
430+ temp . add ( el . userRequest ) ;
431+ }
432+ }
433+ callback ( null , res ) ;
434+ } ) ;
391435 }
392436 }
393437} ;
0 commit comments