@@ -167,18 +167,22 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
167
167
asyncLib . parallel (
168
168
[
169
169
callback => {
170
+ const results = [ ] ;
171
+ const yield_ = obj => results . push ( obj ) ;
172
+
170
173
contextResolver . resolve (
171
174
{ } ,
172
175
context ,
173
176
resource ,
174
177
{
175
178
fileDependencies,
176
179
missingDependencies,
177
- contextDependencies
180
+ contextDependencies,
181
+ yield : yield_
178
182
} ,
179
- ( err , result ) => {
183
+ err => {
180
184
if ( err ) return callback ( err ) ;
181
- callback ( null , result ) ;
185
+ callback ( null , results ) ;
182
186
}
183
187
) ;
184
188
} ,
@@ -213,15 +217,25 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
213
217
contextDependencies
214
218
} ) ;
215
219
}
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
+ }
217
226
this . hooks . afterResolve . callAsync (
218
227
{
219
228
addon :
220
229
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 ,
224
236
resolveDependencies : this . resolveDependencies . bind ( this ) ,
237
+ resourceQuery : contextResult [ 0 ] . query ,
238
+ resourceFragment : contextResult [ 0 ] . fragment ,
225
239
...beforeResolveResult
226
240
} ,
227
241
( err , result ) => {
@@ -278,26 +292,28 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
278
292
} = options ;
279
293
if ( ! regExp || ! resource ) return callback ( null , [ ] ) ;
280
294
281
- const addDirectoryChecked = ( directory , visited , callback ) => {
295
+ let severalContexts = false ;
296
+ const addDirectoryChecked = ( ctx , directory , visited , callback ) => {
282
297
fs . realpath ( directory , ( err , realPath ) => {
283
298
if ( err ) return callback ( err ) ;
284
299
if ( visited . has ( realPath ) ) return callback ( null , [ ] ) ;
285
300
let recursionStack ;
286
301
addDirectory (
302
+ ctx ,
287
303
directory ,
288
- ( dir , callback ) => {
304
+ ( _ , dir , callback ) => {
289
305
if ( recursionStack === undefined ) {
290
306
recursionStack = new Set ( visited ) ;
291
307
recursionStack . add ( realPath ) ;
292
308
}
293
- addDirectoryChecked ( dir , recursionStack , callback ) ;
309
+ addDirectoryChecked ( ctx , dir , recursionStack , callback ) ;
294
310
} ,
295
311
callback
296
312
) ;
297
313
} ) ;
298
314
} ;
299
315
300
- const addDirectory = ( directory , addSubDirectory , callback ) => {
316
+ const addDirectory = ( ctx , directory , addSubDirectory , callback ) => {
301
317
fs . readdir ( directory , ( err , files ) => {
302
318
if ( err ) return callback ( err ) ;
303
319
const processedFiles = cmf . hooks . contextModuleFiles . call (
@@ -324,16 +340,15 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
324
340
325
341
if ( stat . isDirectory ( ) ) {
326
342
if ( ! recursive ) return callback ( ) ;
327
- addSubDirectory ( subResource , callback ) ;
343
+ addSubDirectory ( ctx , subResource , callback ) ;
328
344
} else if (
329
345
stat . isFile ( ) &&
330
346
( ! include || subResource . match ( include ) )
331
347
) {
332
348
const obj = {
333
- context : resource ,
349
+ context : ctx ,
334
350
request :
335
- "." +
336
- subResource . substr ( resource . length ) . replace ( / \\ / g, "/" )
351
+ "." + subResource . substr ( ctx . length ) . replace ( / \\ / g, "/" )
337
352
} ;
338
353
339
354
this . hooks . alternativeRequests . callAsync (
@@ -344,8 +359,11 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
344
359
alternatives = alternatives
345
360
. filter ( obj => regExp . test ( obj . request ) )
346
361
. map ( obj => {
362
+ const request = severalContexts
363
+ ? join ( fs , obj . context , obj . request )
364
+ : obj . request ;
347
365
const dep = new ContextElementDependency (
348
- obj . request + resourceQuery + resourceFragment ,
366
+ request + resourceQuery + resourceFragment ,
349
367
obj . request ,
350
368
typePrefix ,
351
369
category ,
@@ -382,12 +400,38 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
382
400
} ) ;
383
401
} ;
384
402
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 ) ;
387
416
} 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
+ } ) ;
391
435
}
392
436
}
393
437
} ;
0 commit comments