@@ -319,3 +319,283 @@ describe("resolve", () => {
319
319
} ) ;
320
320
} ) ;
321
321
} ) ;
322
+
323
+ const isWin32 = process . platform === "win32" ;
324
+
325
+ describe ( `resolve based on path-type: ${ isWin32 ? "win32" : "posix" } (${
326
+ path . sep
327
+ } )`, ( ) => {
328
+ // path.join/path.resolve work based on process.platform,
329
+ // and we only have to actualize independently passed paths with platform-based separator
330
+ // to make sure that it works the same on different platforms
331
+
332
+ testResolve (
333
+ "absolute path" ,
334
+ fixtures ,
335
+ path . join ( fixtures , "main1.js" ) ,
336
+ path . join ( fixtures , "main1.js" )
337
+ ) ;
338
+
339
+ testResolve (
340
+ "file with .js" ,
341
+ fixtures ,
342
+ `.${ path . sep } main1.js` ,
343
+ path . join ( fixtures , "main1.js" )
344
+ ) ;
345
+ testResolve (
346
+ "file without extension" ,
347
+ fixtures ,
348
+ `.${ path . sep } main1` ,
349
+ path . join ( fixtures , "main1.js" )
350
+ ) ;
351
+ testResolve (
352
+ "another file with .js" ,
353
+ fixtures ,
354
+ `.${ path . sep } a.js` ,
355
+ path . join ( fixtures , "a.js" )
356
+ ) ;
357
+ testResolve (
358
+ "another file without extension" ,
359
+ fixtures ,
360
+ `.${ path . sep } a` ,
361
+ path . join ( fixtures , "a.js" )
362
+ ) ;
363
+ testResolve (
364
+ "file in module with .js" ,
365
+ fixtures ,
366
+ `m1${ path . sep } a.js` ,
367
+ path . join ( fixtures , "node_modules" , "m1" , "a.js" )
368
+ ) ;
369
+ testResolve (
370
+ "file in module without extension" ,
371
+ fixtures ,
372
+ `m1${ path . sep } a` ,
373
+ path . join ( fixtures , "node_modules" , "m1" , "a.js" )
374
+ ) ;
375
+ testResolve (
376
+ "another file in module without extension" ,
377
+ fixtures ,
378
+ `complexm${ path . sep } step1` ,
379
+ path . join ( fixtures , "node_modules" , "complexm" , "step1.js" )
380
+ ) ;
381
+ testResolve (
382
+ "from submodule to file in sibling module" ,
383
+ path . join ( fixtures , "node_modules" , "complexm" ) ,
384
+ `m2${ path . sep } b.js` ,
385
+ path . join ( fixtures , "node_modules" , "m2" , "b.js" )
386
+ ) ;
387
+ testResolve (
388
+ "from submodule to file in sibling of parent module" ,
389
+ path . join ( fixtures , "node_modules" , "complexm" , "web_modules" , "m1" ) ,
390
+ `m2${ path . sep } b.js` ,
391
+ path . join ( fixtures , "node_modules" , "m2" , "b.js" )
392
+ ) ;
393
+ testResolve (
394
+ "from nested directory to overwritten file in module" ,
395
+ path . join ( fixtures , "multiple_modules" ) ,
396
+ `m1${ path . sep } a.js` ,
397
+ path . join ( fixtures , "multiple_modules" , "node_modules" , "m1" , "a.js" )
398
+ ) ;
399
+ testResolve (
400
+ "from nested directory to not overwritten file in module" ,
401
+ path . join ( fixtures , "multiple_modules" ) ,
402
+ `m1${ path . sep } b.js` ,
403
+ path . join ( fixtures , "node_modules" , "m1" , "b.js" )
404
+ ) ;
405
+
406
+ testResolve (
407
+ "file with query" ,
408
+ fixtures ,
409
+ `.${ path . sep } main1.js?query` ,
410
+ path . join ( fixtures , "main1.js" ) + "?query"
411
+ ) ;
412
+ testResolve (
413
+ "file with fragment" ,
414
+ fixtures ,
415
+ `.${ path . sep } main1.js#fragment` ,
416
+ path . join ( fixtures , "main1.js" ) + "#fragment"
417
+ ) ;
418
+ testResolve (
419
+ "file with fragment and query" ,
420
+ fixtures ,
421
+ `.${ path . sep } main1.js#fragment?query` ,
422
+ path . join ( fixtures , "main1.js" ) + "#fragment?query"
423
+ ) ;
424
+ testResolve (
425
+ "file with query and fragment" ,
426
+ fixtures ,
427
+ `.${ path . sep } main1.js?#fragment` ,
428
+ path . join ( fixtures , "main1.js" ) + "?#fragment"
429
+ ) ;
430
+
431
+ testResolve (
432
+ "file in module with query" ,
433
+ fixtures ,
434
+ `m1${ path . sep } a?query` ,
435
+ path . join ( fixtures , "node_modules" , "m1" , "a.js" ) + "?query"
436
+ ) ;
437
+ testResolve (
438
+ "file in module with fragment" ,
439
+ fixtures ,
440
+ `m1${ path . sep } a#fragment` ,
441
+ path . join ( fixtures , "node_modules" , "m1" , "a.js" ) + "#fragment"
442
+ ) ;
443
+ testResolve (
444
+ "file in module with fragment and query" ,
445
+ fixtures ,
446
+ `m1${ path . sep } a#fragment?query` ,
447
+ path . join ( fixtures , "node_modules" , "m1" , "a.js" ) + "#fragment?query"
448
+ ) ;
449
+ testResolve (
450
+ "file in module with query and fragment" ,
451
+ fixtures ,
452
+ `m1${ path . sep } a?#fragment` ,
453
+ path . join ( fixtures , "node_modules" , "m1" , "a.js" ) + "?#fragment"
454
+ ) ;
455
+
456
+ testResolveContext (
457
+ "context for fixtures" ,
458
+ fixtures ,
459
+ `.${ path . sep } ` ,
460
+ fixtures
461
+ ) ;
462
+ testResolveContext (
463
+ "context for fixtures/lib" ,
464
+ fixtures ,
465
+ `.${ path . sep } lib` ,
466
+ path . join ( fixtures , "lib" )
467
+ ) ;
468
+ testResolveContext (
469
+ "context for fixtures with .." ,
470
+ fixtures ,
471
+ `.${ path . sep } lib${ path . sep } ..${ path . sep } ..${ path . sep } fixtures${ path . sep } .${ path . sep } lib${ path . sep } ..` ,
472
+ fixtures
473
+ ) ;
474
+
475
+ testResolveContext (
476
+ "context for fixtures with query" ,
477
+ fixtures ,
478
+ `.${ path . sep } ?query` ,
479
+ fixtures + "?query"
480
+ ) ;
481
+
482
+ testResolve (
483
+ "differ between directory and file, resolve file" ,
484
+ fixtures ,
485
+ `.${ path . sep } dirOrFile` ,
486
+ path . join ( fixtures , "dirOrFile.js" )
487
+ ) ;
488
+ testResolve (
489
+ "differ between directory and file, resolve directory" ,
490
+ fixtures ,
491
+ `.${ path . sep } dirOrFile${ path . sep } ` ,
492
+ path . join ( fixtures , "dirOrFile" , "index.js" )
493
+ ) ;
494
+
495
+ testResolve (
496
+ "find node_modules outside of node_modules" ,
497
+ path . join ( fixtures , "browser-module" , "node_modules" ) ,
498
+ `m1${ path . sep } a` ,
499
+ path . join ( fixtures , "node_modules" , "m1" , "a.js" )
500
+ ) ;
501
+
502
+ testResolve (
503
+ "don't crash on main field pointing to self" ,
504
+ fixtures ,
505
+ `.${ path . sep } main-field-self` ,
506
+ path . join ( fixtures , "main-field-self" , "index.js" )
507
+ ) ;
508
+
509
+ testResolve (
510
+ "don't crash on main field pointing to self" ,
511
+ fixtures ,
512
+ `.${ path . sep } main-field-self2` ,
513
+ path . join ( fixtures , "main-field-self2" , "index.js" )
514
+ ) ;
515
+
516
+ testResolve (
517
+ "handle fragment edge case (no fragment)" ,
518
+ fixtures ,
519
+ `.${ path . sep } no#fragment${ path . sep } #${ path . sep } #` ,
520
+ path . join ( fixtures , "no\0#fragment/\0#" , "\0#.js" )
521
+ ) ;
522
+
523
+ testResolve (
524
+ "handle fragment edge case (fragment)" ,
525
+ fixtures ,
526
+ `.${ path . sep } no#fragment${ path . sep } #${ path . sep } ` ,
527
+ path . join ( fixtures , "no.js" ) + `#fragment${ path . sep } #${ path . sep } `
528
+ ) ;
529
+
530
+ testResolve (
531
+ "handle fragment escaping" ,
532
+ fixtures ,
533
+ `.${ path . sep } no\0#fragment${ path . sep } \0#${ path . sep } \0##fragment` ,
534
+ path . join ( fixtures , "no\0#fragment/\0#" , "\0#.js" ) + "#fragment"
535
+ ) ;
536
+
537
+ it ( "should correctly resolve" , function ( done ) {
538
+ const issue238 = path . resolve ( fixtures , "issue-238" ) ;
539
+
540
+ issue238Resolve (
541
+ path . resolve ( issue238 , "./src/common" ) ,
542
+ "config/myObjectFile" ,
543
+ function ( err , filename ) {
544
+ if ( err ) done ( err ) ;
545
+ expect ( filename ) . toBeDefined ( ) ;
546
+ expect ( filename ) . toEqual (
547
+ path . resolve ( issue238 , "./src/common/config/myObjectFile.js" )
548
+ ) ;
549
+ done ( ) ;
550
+ }
551
+ ) ;
552
+ } ) ;
553
+
554
+ it ( "should correctly resolve with preferRelative" , function ( done ) {
555
+ preferRelativeResolve ( fixtures , "main1.js" , function ( err , filename ) {
556
+ if ( err ) done ( err ) ;
557
+ expect ( filename ) . toBeDefined ( ) ;
558
+ expect ( filename ) . toEqual ( path . join ( fixtures , "main1.js" ) ) ;
559
+ done ( ) ;
560
+ } ) ;
561
+ } ) ;
562
+
563
+ it ( `should correctly resolve with preferRelative (separator: ${ path . sep } )` , function ( done ) {
564
+ preferRelativeResolve (
565
+ fixtures ,
566
+ `m1${ path . sep } a.js` ,
567
+ function ( err , filename ) {
568
+ if ( err ) done ( err ) ;
569
+ expect ( filename ) . toBeDefined ( ) ;
570
+ expect ( filename ) . toEqual (
571
+ path . join ( fixtures , "node_modules" , "m1" , "a.js" )
572
+ ) ;
573
+ done ( ) ;
574
+ }
575
+ ) ;
576
+ } ) ;
577
+
578
+ it ( "should not crash when passing undefined as path" , done => {
579
+ // @ts -expect-error testing invalid arguments
580
+ resolve ( fixtures , undefined , err => {
581
+ expect ( err ) . toBeInstanceOf ( Error ) ;
582
+ done ( ) ;
583
+ } ) ;
584
+ } ) ;
585
+
586
+ it ( `should not crash when passing undefined as context (separator: ${ path . sep } )` , done => {
587
+ // @ts -expect-error testing invalid arguments
588
+ resolve ( { } , undefined , `.${ path . sep } test${ path . sep } resolve.js` , err => {
589
+ expect ( err ) . toBeInstanceOf ( Error ) ;
590
+ done ( ) ;
591
+ } ) ;
592
+ } ) ;
593
+
594
+ it ( "should not crash when passing undefined everywhere" , done => {
595
+ // @ts -expect-error testing invalid arguments
596
+ resolve ( undefined , undefined , undefined , undefined , err => {
597
+ expect ( err ) . toBeInstanceOf ( Error ) ;
598
+ done ( ) ;
599
+ } ) ;
600
+ } ) ;
601
+ } ) ;
0 commit comments