@@ -8,6 +8,8 @@ import { tsconfigPathsMatcher, allowJs } from '../../utils/tsconfig.js';
8
8
9
9
type ResolveFilename = typeof Module . _resolveFilename ;
10
10
11
+ type SimpleResolve = ( request : string ) => string ;
12
+
11
13
const nodeModulesPath = `${ path . sep } node_modules${ path . sep } ` ;
12
14
13
15
export const interopCjsExports = (
@@ -39,11 +41,9 @@ export const interopCjsExports = (
39
41
* Typescript gives .ts, .cts, or .mts priority over actual .js, .cjs, or .mjs extensions
40
42
*/
41
43
const resolveTsFilename = (
42
- nextResolve : ResolveFilename ,
44
+ resolve : SimpleResolve ,
43
45
request : string ,
44
46
parent : Module . Parent ,
45
- isMain : boolean ,
46
- options ?: Record < PropertyKey , unknown > ,
47
47
) => {
48
48
if (
49
49
! ( parent ?. filename && tsExtensionsPattern . test ( parent . filename ) )
@@ -59,12 +59,7 @@ const resolveTsFilename = (
59
59
60
60
for ( const tryTsPath of tsPath ) {
61
61
try {
62
- return nextResolve (
63
- tryTsPath ,
64
- parent ,
65
- isMain ,
66
- options ,
67
- ) ;
62
+ return resolve ( tryTsPath ) ;
68
63
} catch ( error ) {
69
64
const { code } = error as NodeError ;
70
65
if (
@@ -77,6 +72,19 @@ const resolveTsFilename = (
77
72
}
78
73
} ;
79
74
75
+ const extensions = [ '.ts' , '.tsx' , '.jsx' ] as const ;
76
+
77
+ const tryExtensions = (
78
+ resolve : SimpleResolve ,
79
+ request : string ,
80
+ ) => {
81
+ for ( const extension of extensions ) {
82
+ try {
83
+ return resolve ( request + extension ) ;
84
+ } catch { }
85
+ }
86
+ } ;
87
+
80
88
export const createResolveFilename = (
81
89
nextResolve : ResolveFilename ,
82
90
) : ResolveFilename => (
@@ -99,39 +107,66 @@ export const createResolveFilename = (
99
107
request = fileURLToPath ( request ) ;
100
108
}
101
109
110
+ const resolve : SimpleResolve = request_ => nextResolve (
111
+ request_ ,
112
+ parent ,
113
+ isMain ,
114
+ options ,
115
+ ) ;
116
+
102
117
// Resolve TS path alias
103
118
if (
104
119
tsconfigPathsMatcher
105
120
106
- // bare specifier
107
- && ! isRelativePath ( request )
121
+ // bare specifier
122
+ && ! isRelativePath ( request )
108
123
109
- // Dependency paths should not be resolved using tsconfig.json
110
- && ! parent ?. filename ?. includes ( nodeModulesPath )
124
+ // Dependency paths should not be resolved using tsconfig.json
125
+ && ! parent ?. filename ?. includes ( nodeModulesPath )
111
126
) {
112
127
const possiblePaths = tsconfigPathsMatcher ( request ) ;
113
128
114
129
for ( const possiblePath of possiblePaths ) {
115
- const tsFilename = resolveTsFilename ( nextResolve , possiblePath , parent , isMain , options ) ;
130
+ const tsFilename = resolveTsFilename ( resolve , possiblePath , parent ) ;
116
131
if ( tsFilename ) {
117
132
return tsFilename + query ;
118
133
}
119
134
120
135
try {
121
- return nextResolve (
122
- possiblePath ,
123
- parent ,
124
- isMain ,
125
- options ,
126
- ) + query ;
127
- } catch { }
136
+ return resolve ( possiblePath ) + query ;
137
+ } catch {
138
+ /**
139
+ * Try order:
140
+ * https://github.com/nodejs/node/blob/v22.2.0/lib/internal/modules/cjs/loader.js#L410-L413
141
+ */
142
+ const resolved = (
143
+ tryExtensions ( resolve , possiblePath )
144
+ || tryExtensions ( resolve , path . resolve ( possiblePath , 'index' ) )
145
+ ) ;
146
+ if ( resolved ) {
147
+ return resolved + query ;
148
+ }
149
+ }
128
150
}
129
151
}
130
152
131
- const tsFilename = resolveTsFilename ( nextResolve , request , parent , isMain , options ) ;
153
+ // If extension exists
154
+ const tsFilename = resolveTsFilename ( resolve , request , parent ) ;
132
155
if ( tsFilename ) {
133
156
return tsFilename + query ;
134
157
}
135
158
136
- return nextResolve ( request , parent , isMain , options ) + query ;
159
+ try {
160
+ return resolve ( request ) + query ;
161
+ } catch ( error ) {
162
+ const resolved = (
163
+ tryExtensions ( resolve , request )
164
+ || tryExtensions ( resolve , path . resolve ( request , 'index' ) )
165
+ ) ;
166
+ if ( resolved ) {
167
+ return resolved + query ;
168
+ }
169
+
170
+ throw error ;
171
+ }
137
172
} ;
0 commit comments