@@ -8,6 +8,8 @@ import { tsconfigPathsMatcher, allowJs } from '../../utils/tsconfig.js';
88
99type ResolveFilename = typeof Module . _resolveFilename ;
1010
11+ type SimpleResolve = ( request : string ) => string ;
12+
1113const nodeModulesPath = `${ path . sep } node_modules${ path . sep } ` ;
1214
1315export const interopCjsExports = (
@@ -39,11 +41,9 @@ export const interopCjsExports = (
3941 * Typescript gives .ts, .cts, or .mts priority over actual .js, .cjs, or .mjs extensions
4042 */
4143const resolveTsFilename = (
42- nextResolve : ResolveFilename ,
44+ resolve : SimpleResolve ,
4345 request : string ,
4446 parent : Module . Parent ,
45- isMain : boolean ,
46- options ?: Record < PropertyKey , unknown > ,
4747) => {
4848 if (
4949 ! ( parent ?. filename && tsExtensionsPattern . test ( parent . filename ) )
@@ -59,12 +59,7 @@ const resolveTsFilename = (
5959
6060 for ( const tryTsPath of tsPath ) {
6161 try {
62- return nextResolve (
63- tryTsPath ,
64- parent ,
65- isMain ,
66- options ,
67- ) ;
62+ return resolve ( tryTsPath ) ;
6863 } catch ( error ) {
6964 const { code } = error as NodeError ;
7065 if (
@@ -77,6 +72,19 @@ const resolveTsFilename = (
7772 }
7873} ;
7974
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+
8088export const createResolveFilename = (
8189 nextResolve : ResolveFilename ,
8290) : ResolveFilename => (
@@ -99,39 +107,66 @@ export const createResolveFilename = (
99107 request = fileURLToPath ( request ) ;
100108 }
101109
110+ const resolve : SimpleResolve = request_ => nextResolve (
111+ request_ ,
112+ parent ,
113+ isMain ,
114+ options ,
115+ ) ;
116+
102117 // Resolve TS path alias
103118 if (
104119 tsconfigPathsMatcher
105120
106- // bare specifier
107- && ! isRelativePath ( request )
121+ // bare specifier
122+ && ! isRelativePath ( request )
108123
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 )
111126 ) {
112127 const possiblePaths = tsconfigPathsMatcher ( request ) ;
113128
114129 for ( const possiblePath of possiblePaths ) {
115- const tsFilename = resolveTsFilename ( nextResolve , possiblePath , parent , isMain , options ) ;
130+ const tsFilename = resolveTsFilename ( resolve , possiblePath , parent ) ;
116131 if ( tsFilename ) {
117132 return tsFilename + query ;
118133 }
119134
120135 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+ }
128150 }
129151 }
130152
131- const tsFilename = resolveTsFilename ( nextResolve , request , parent , isMain , options ) ;
153+ // If extension exists
154+ const tsFilename = resolveTsFilename ( resolve , request , parent ) ;
132155 if ( tsFilename ) {
133156 return tsFilename + query ;
134157 }
135158
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+ }
137172} ;
0 commit comments