@@ -33,6 +33,7 @@ const {
33
33
Stats,
34
34
} = require ( 'fs' ) ;
35
35
const { getOptionValue } = require ( 'internal/options' ) ;
36
+ const pendingDeprecation = getOptionValue ( '--pending-deprecation' ) ;
36
37
// Do not eagerly grab .manifest, it may be in TDZ
37
38
const policy = getOptionValue ( '--experimental-policy' ) ?
38
39
require ( 'internal/process/policy' ) :
@@ -98,6 +99,23 @@ function emitTrailingSlashPatternDeprecation(match, pjsonUrl, base) {
98
99
) ;
99
100
}
100
101
102
+ const doubleSlashRegEx = / [ / \\ ] [ / \\ ] / ;
103
+
104
+ function emitInvalidSegmentDeprecation ( target , request , match , pjsonUrl , base ) {
105
+ if ( ! pendingDeprecation ) { return ; }
106
+ const pjsonPath = fileURLToPath ( pjsonUrl ) ;
107
+ const double = RegExpPrototypeExec ( doubleSlashRegEx , target ) !== null ;
108
+ process . emitWarning (
109
+ `Use of deprecated ${ double ? 'double slash' :
110
+ 'leading or trailing slash matching' } resolving "${ target } " for module ` +
111
+ `request "${ request } " ${ request !== match ? `matched to "${ match } " ` : ''
112
+ } in the "exports" field module resolution of the package at ${ pjsonPath } ${
113
+ base ? ` imported from ${ fileURLToPath ( base ) } ` : '' } .`,
114
+ 'DeprecationWarning' ,
115
+ 'DEP0166'
116
+ ) ;
117
+ }
118
+
101
119
/**
102
120
* @param {URL } url
103
121
* @param {URL } packageJSONUrl
@@ -344,15 +362,17 @@ function throwExportsNotFound(subpath, packageJSONUrl, base) {
344
362
345
363
/**
346
364
*
347
- * @param {string | URL } subpath
365
+ * @param {string } request
366
+ * @param {string } match
348
367
* @param {URL } packageJSONUrl
349
368
* @param {boolean } internal
350
369
* @param {string | URL | undefined } base
351
370
*/
352
- function throwInvalidSubpath ( subpath , packageJSONUrl , internal , base ) {
353
- const reason = `request is not a valid subpath for the "${ internal ?
354
- 'imports' : 'exports' } " resolution of ${ fileURLToPath ( packageJSONUrl ) } `;
355
- throw new ERR_INVALID_MODULE_SPECIFIER ( subpath , reason ,
371
+ function throwInvalidSubpath ( request , match , packageJSONUrl , internal , base ) {
372
+ const reason = `request is not a valid match in pattern "${ match } " for the "${
373
+ internal ? 'imports' : 'exports' } " resolution of ${
374
+ fileURLToPath ( packageJSONUrl ) } `;
375
+ throw new ERR_INVALID_MODULE_SPECIFIER ( request , reason ,
356
376
base && fileURLToPath ( base ) ) ;
357
377
}
358
378
@@ -368,12 +388,22 @@ function throwInvalidPackageTarget(
368
388
internal , base && fileURLToPath ( base ) ) ;
369
389
}
370
390
371
- const invalidSegmentRegEx = / ( ^ | \\ | \/ ) ( ( \. | % 2 e ) ( \. | % 2 e ) ? | ( n | % 6 e | % 4 e ) ( o | % 6 f | % 4 f ) ( d | % 6 4 | % 4 4 ) ( e | % 6 5 | % 4 5 ) ( _ | % 5 f ) ( m | % 6 d | % 4 d ) ( o | % 6 f | % 4 f ) ( d | % 6 4 | % 4 4 ) ( u | % 7 5 | % 5 5 ) ( l | % 6 c | % 4 c ) ( e | % 6 5 | % 4 5 ) ( s | % 7 3 | % 5 3 ) ) ( \\ | \/ | $ ) / i;
391
+ const invalidSegmentRegEx = / ( ^ | \\ | \/ ) ( ( \. | % 2 e ) ( \. | % 2 e ) ? | ( n | % 6 e | % 4 e ) ( o | % 6 f | % 4 f ) ( d | % 6 4 | % 4 4 ) ( e | % 6 5 | % 4 5 ) ( _ | % 5 f ) ( m | % 6 d | % 4 d ) ( o | % 6 f | % 4 f ) ( d | % 6 4 | % 4 4 ) ( u | % 7 5 | % 5 5 ) ( l | % 6 c | % 4 c ) ( e | % 6 5 | % 4 5 ) ( s | % 7 3 | % 5 3 ) ) ? ( \\ | \/ | $ ) / i;
392
+ const deprecatedInvalidSegmentRegEx = / ( ^ | \\ | \/ ) ( ( \. | % 2 e ) ( \. | % 2 e ) ? | ( n | % 6 e | % 4 e ) ( o | % 6 f | % 4 f ) ( d | % 6 4 | % 4 4 ) ( e | % 6 5 | % 4 5 ) ( _ | % 5 f ) ( m | % 6 d | % 4 d ) ( o | % 6 f | % 4 f ) ( d | % 6 4 | % 4 4 ) ( u | % 7 5 | % 5 5 ) ( l | % 6 c | % 4 c ) ( e | % 6 5 | % 4 5 ) ( s | % 7 3 | % 5 3 ) ) ( \\ | \/ | $ ) / i;
372
393
const invalidPackageNameRegEx = / ^ \. | % | \\ / ;
373
394
const patternRegEx = / \* / g;
374
395
375
396
function resolvePackageTargetString (
376
- target , subpath , match , packageJSONUrl , base , pattern , internal , conditions ) {
397
+ target ,
398
+ subpath ,
399
+ match ,
400
+ packageJSONUrl ,
401
+ base ,
402
+ pattern ,
403
+ internal ,
404
+ isPathMap ,
405
+ conditions ,
406
+ ) {
377
407
378
408
if ( subpath !== '' && ! pattern && target [ target . length - 1 ] !== '/' )
379
409
throwInvalidPackageTarget ( match , target , packageJSONUrl , internal , base ) ;
@@ -399,8 +429,21 @@ function resolvePackageTargetString(
399
429
throwInvalidPackageTarget ( match , target , packageJSONUrl , internal , base ) ;
400
430
}
401
431
402
- if ( RegExpPrototypeExec ( invalidSegmentRegEx , StringPrototypeSlice ( target , 2 ) ) !== null )
403
- throwInvalidPackageTarget ( match , target , packageJSONUrl , internal , base ) ;
432
+ if ( RegExpPrototypeExec ( invalidSegmentRegEx , StringPrototypeSlice ( target , 2 ) ) !== null ) {
433
+ if ( RegExpPrototypeExec ( deprecatedInvalidSegmentRegEx , StringPrototypeSlice ( target , 2 ) ) === null ) {
434
+ if ( ! isPathMap ) {
435
+ const request = pattern ?
436
+ StringPrototypeReplace ( match , '*' , ( ) => subpath ) :
437
+ match + subpath ;
438
+ const resolvedTarget = pattern ?
439
+ RegExpPrototypeSymbolReplace ( patternRegEx , target , ( ) => subpath ) :
440
+ target ;
441
+ emitInvalidSegmentDeprecation ( resolvedTarget , request , match , packageJSONUrl , base ) ;
442
+ }
443
+ } else {
444
+ throwInvalidPackageTarget ( match , target , packageJSONUrl , internal , base ) ;
445
+ }
446
+ }
404
447
405
448
const resolved = new URL ( target , packageJSONUrl ) ;
406
449
const resolvedPath = resolved . pathname ;
@@ -412,18 +455,22 @@ function resolvePackageTargetString(
412
455
if ( subpath === '' ) return resolved ;
413
456
414
457
if ( RegExpPrototypeExec ( invalidSegmentRegEx , subpath ) !== null ) {
415
- const request = pattern ?
416
- StringPrototypeReplace ( match , '*' , ( ) => subpath ) : match + subpath ;
417
- throwInvalidSubpath ( request , packageJSONUrl , internal , base ) ;
458
+ const request = pattern ? StringPrototypeReplace ( match , '*' , ( ) => subpath ) : match + subpath ;
459
+ if ( RegExpPrototypeExec ( deprecatedInvalidSegmentRegEx , subpath ) === null ) {
460
+ if ( ! isPathMap ) {
461
+ const resolvedTarget = pattern ?
462
+ RegExpPrototypeSymbolReplace ( patternRegEx , target , ( ) => subpath ) :
463
+ target ;
464
+ emitInvalidSegmentDeprecation ( resolvedTarget , request , match , packageJSONUrl , base ) ;
465
+ }
466
+ } else {
467
+ throwInvalidSubpath ( request , match , packageJSONUrl , internal , base ) ;
468
+ }
418
469
}
419
470
420
471
if ( pattern ) {
421
472
return new URL (
422
- RegExpPrototypeSymbolReplace (
423
- patternRegEx ,
424
- resolved . href ,
425
- ( ) => subpath
426
- )
473
+ RegExpPrototypeSymbolReplace ( patternRegEx , resolved . href , ( ) => subpath )
427
474
) ;
428
475
}
429
476
@@ -441,11 +488,11 @@ function isArrayIndex(key) {
441
488
}
442
489
443
490
function resolvePackageTarget ( packageJSONUrl , target , subpath , packageSubpath ,
444
- base , pattern , internal , conditions ) {
491
+ base , pattern , internal , isPathMap , conditions ) {
445
492
if ( typeof target === 'string' ) {
446
493
return resolvePackageTargetString (
447
494
target , subpath , packageSubpath , packageJSONUrl , base , pattern , internal ,
448
- conditions ) ;
495
+ isPathMap , conditions ) ;
449
496
} else if ( ArrayIsArray ( target ) ) {
450
497
if ( target . length === 0 ) {
451
498
return null ;
@@ -458,7 +505,7 @@ function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath,
458
505
try {
459
506
resolveResult = resolvePackageTarget (
460
507
packageJSONUrl , targetItem , subpath , packageSubpath , base , pattern ,
461
- internal , conditions ) ;
508
+ internal , isPathMap , conditions ) ;
462
509
} catch ( e ) {
463
510
lastException = e ;
464
511
if ( e . code === 'ERR_INVALID_PACKAGE_TARGET' ) {
@@ -494,7 +541,7 @@ function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath,
494
541
const conditionalTarget = target [ key ] ;
495
542
const resolveResult = resolvePackageTarget (
496
543
packageJSONUrl , conditionalTarget , subpath , packageSubpath , base ,
497
- pattern , internal , conditions ) ;
544
+ pattern , internal , isPathMap , conditions ) ;
498
545
if ( resolveResult === undefined )
499
546
continue ;
500
547
return resolveResult ;
@@ -557,7 +604,8 @@ function packageExportsResolve(
557
604
! StringPrototypeEndsWith ( packageSubpath , '/' ) ) {
558
605
const target = exports [ packageSubpath ] ;
559
606
const resolveResult = resolvePackageTarget (
560
- packageJSONUrl , target , '' , packageSubpath , base , false , false , conditions
607
+ packageJSONUrl , target , '' , packageSubpath , base , false , false , false ,
608
+ conditions
561
609
) ;
562
610
563
611
if ( resolveResult == null ) {
@@ -608,6 +656,7 @@ function packageExportsResolve(
608
656
base ,
609
657
true ,
610
658
false ,
659
+ StringPrototypeEndsWith ( packageSubpath , '/' ) ,
611
660
conditions ) ;
612
661
613
662
if ( resolveResult == null ) {
@@ -654,7 +703,8 @@ function packageImportsResolve(name, base, conditions) {
654
703
if ( ObjectPrototypeHasOwnProperty ( imports , name ) &&
655
704
! StringPrototypeIncludes ( name , '*' ) ) {
656
705
const resolveResult = resolvePackageTarget (
657
- packageJSONUrl , imports [ name ] , '' , name , base , false , true , conditions
706
+ packageJSONUrl , imports [ name ] , '' , name , base , false , true , false ,
707
+ conditions
658
708
) ;
659
709
if ( resolveResult != null ) {
660
710
return resolveResult ;
@@ -687,7 +737,7 @@ function packageImportsResolve(name, base, conditions) {
687
737
const resolveResult = resolvePackageTarget ( packageJSONUrl , target ,
688
738
bestMatchSubpath ,
689
739
bestMatch , base , true ,
690
- true , conditions ) ;
740
+ true , false , conditions ) ;
691
741
if ( resolveResult != null ) {
692
742
return resolveResult ;
693
743
}
0 commit comments