@@ -35,26 +35,60 @@ type resolve = (
35
35
recursiveCall ?: boolean ,
36
36
) => MaybePromise < Resolved > ;
37
37
38
- const extensions = [ '.js' , '.json' , '.ts' , '.tsx' , '.jsx' ] as const ;
38
+ const mappedExtensions : Record < string , string [ ] > = {
39
+ '.js' : [ '.ts' , '.tsx' ] ,
40
+ '.jsx' : [ '.ts' , '.tsx' ] ,
41
+ '.cjs' : [ '.cts' ] ,
42
+ '.mjs' : [ '.mts' ] ,
43
+ '' : [ '.ts' , '.js' , '.json' , '.tsx' , '.jsx' ] ,
44
+ } ;
45
+
46
+ function resolveTsAlternativeSpecifiers ( specifier : string ) {
47
+ const alternativePaths = mappedExtensions [ '' ] . map ( alternativeExtension => ( {
48
+ specifier,
49
+ specifierExtension : '' ,
50
+ alternativeExtension,
51
+ } ) ) ;
52
+ const specifierExtension = path . extname ( specifier ) ;
53
+ if ( ! specifierExtension ) {
54
+ return alternativePaths ;
55
+ }
56
+ const extensionsToTry = mappedExtensions [ specifierExtension ] ?? [ ] ;
57
+ specifier = specifier . slice ( 0 , specifier . length - specifierExtension . length ) ;
58
+ return [
59
+ // Try using subextension first
60
+ ...alternativePaths ,
61
+ ...extensionsToTry . map ( alternativeExtension => ( {
62
+ specifier,
63
+ specifierExtension,
64
+ alternativeExtension,
65
+ } ) ) ,
66
+ ] ;
67
+ }
39
68
40
69
async function tryExtensions (
41
70
specifier : string ,
42
71
context : Context ,
43
72
defaultResolve : resolve ,
44
73
) {
45
74
let error ;
46
- for ( const extension of extensions ) {
75
+ for ( const alternativePath of resolveTsAlternativeSpecifiers ( specifier ) ) {
76
+ const {
77
+ specifier : alternativeSpecifier ,
78
+ specifierExtension,
79
+ alternativeExtension,
80
+ } = alternativePath ;
47
81
try {
48
82
return await resolve (
49
- specifier + extension ,
83
+ ` ${ alternativeSpecifier } ${ alternativeExtension } ` ,
50
84
context ,
51
85
defaultResolve ,
52
86
true ,
53
87
) ;
54
88
} catch ( _error : any ) {
55
89
if ( error === undefined ) {
56
90
const { message } = _error ;
57
- _error . message = _error . message . replace ( `${ extension } '` , "'" ) ;
91
+ _error . message = _error . message . replace ( `${ alternativeExtension } '` , ` ${ specifierExtension } '` ) ;
58
92
_error . stack = _error . stack . replace ( message , _error . message ) ;
59
93
error = _error ;
60
94
}
0 commit comments