@@ -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,20 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
213
217
contextDependencies
214
218
} ) ;
215
219
}
216
-
220
+ const [ contextResult , loaderResult ] = result ;
217
221
this . hooks . afterResolve . callAsync (
218
222
{
219
223
addon :
220
224
loadersPrefix +
221
- result [ 1 ] . join ( "!" ) +
222
- ( result [ 1 ] . length > 0 ? "!" : "" ) ,
223
- resource : result [ 0 ] ,
225
+ loaderResult . join ( "!" ) +
226
+ ( loaderResult . length > 0 ? "!" : "" ) ,
227
+ resource :
228
+ contextResult . length > 1
229
+ ? contextResult . map ( r => r . path )
230
+ : contextResult [ 0 ] . path ,
224
231
resolveDependencies : this . resolveDependencies . bind ( this ) ,
232
+ resourceQuery : contextResult [ 0 ] . query ,
233
+ resourceFragment : contextResult [ 0 ] . fragment ,
225
234
...beforeResolveResult
226
235
} ,
227
236
( err , result ) => {
@@ -278,26 +287,28 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
278
287
} = options ;
279
288
if ( ! regExp || ! resource ) return callback ( null , [ ] ) ;
280
289
281
- const addDirectoryChecked = ( directory , visited , callback ) => {
290
+ let severalContexts = false ;
291
+ const addDirectoryChecked = ( ctx , directory , visited , callback ) => {
282
292
fs . realpath ( directory , ( err , realPath ) => {
283
293
if ( err ) return callback ( err ) ;
284
294
if ( visited . has ( realPath ) ) return callback ( null , [ ] ) ;
285
295
let recursionStack ;
286
296
addDirectory (
297
+ ctx ,
287
298
directory ,
288
- ( dir , callback ) => {
299
+ ( _ , dir , callback ) => {
289
300
if ( recursionStack === undefined ) {
290
301
recursionStack = new Set ( visited ) ;
291
302
recursionStack . add ( realPath ) ;
292
303
}
293
- addDirectoryChecked ( dir , recursionStack , callback ) ;
304
+ addDirectoryChecked ( ctx , dir , recursionStack , callback ) ;
294
305
} ,
295
306
callback
296
307
) ;
297
308
} ) ;
298
309
} ;
299
310
300
- const addDirectory = ( directory , addSubDirectory , callback ) => {
311
+ const addDirectory = ( ctx , directory , addSubDirectory , callback ) => {
301
312
fs . readdir ( directory , ( err , files ) => {
302
313
if ( err ) return callback ( err ) ;
303
314
const processedFiles = cmf . hooks . contextModuleFiles . call (
@@ -324,16 +335,15 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
324
335
325
336
if ( stat . isDirectory ( ) ) {
326
337
if ( ! recursive ) return callback ( ) ;
327
- addSubDirectory ( subResource , callback ) ;
338
+ addSubDirectory ( ctx , subResource , callback ) ;
328
339
} else if (
329
340
stat . isFile ( ) &&
330
341
( ! include || subResource . match ( include ) )
331
342
) {
332
343
const obj = {
333
- context : resource ,
344
+ context : ctx ,
334
345
request :
335
- "." +
336
- subResource . substr ( resource . length ) . replace ( / \\ / g, "/" )
346
+ "." + subResource . substr ( ctx . length ) . replace ( / \\ / g, "/" )
337
347
} ;
338
348
339
349
this . hooks . alternativeRequests . callAsync (
@@ -344,8 +354,11 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
344
354
alternatives = alternatives
345
355
. filter ( obj => regExp . test ( obj . request ) )
346
356
. map ( obj => {
357
+ const request = severalContexts
358
+ ? join ( fs , obj . context , obj . request )
359
+ : obj . request ;
347
360
const dep = new ContextElementDependency (
348
- obj . request + resourceQuery + resourceFragment ,
361
+ request + resourceQuery + resourceFragment ,
349
362
obj . request ,
350
363
typePrefix ,
351
364
category ,
@@ -382,12 +395,38 @@ module.exports = class ContextModuleFactory extends ModuleFactory {
382
395
} ) ;
383
396
} ;
384
397
385
- if ( typeof fs . realpath === "function" ) {
386
- addDirectoryChecked ( resource , new Set ( ) , callback ) ;
398
+ const addSubDirectory = ( ctx , dir , callback ) =>
399
+ addDirectory ( ctx , dir , addSubDirectory , callback ) ;
400
+
401
+ const visitResource = ( resource , callback ) => {
402
+ if ( typeof fs . realpath === "function" ) {
403
+ addDirectoryChecked ( resource , resource , new Set ( ) , callback ) ;
404
+ } else {
405
+ addDirectory ( resource , resource , addSubDirectory , callback ) ;
406
+ }
407
+ } ;
408
+
409
+ if ( typeof resource === "string" ) {
410
+ visitResource ( resource , callback ) ;
387
411
} else {
388
- const addSubDirectory = ( dir , callback ) =>
389
- addDirectory ( dir , addSubDirectory , callback ) ;
390
- addDirectory ( resource , addSubDirectory , callback ) ;
412
+ severalContexts = true ;
413
+ asyncLib . map ( resource , visitResource , ( err , result ) => {
414
+ if ( err ) return callback ( err ) ;
415
+
416
+ // result dependencies should have unique userRequest
417
+ // ordered by resolve result
418
+ const temp = new Set ( ) ;
419
+ const res = [ ] ;
420
+ for ( let i = 0 ; i < result . length ; i ++ ) {
421
+ const inner = result [ i ] ;
422
+ for ( const el of inner ) {
423
+ if ( temp . has ( el . userRequest ) ) continue ;
424
+ res . push ( el ) ;
425
+ temp . add ( el . userRequest ) ;
426
+ }
427
+ }
428
+ callback ( null , res ) ;
429
+ } ) ;
391
430
}
392
431
}
393
432
} ;
0 commit comments