@@ -35,26 +35,60 @@ type resolve = (
3535 recursiveCall ?: boolean ,
3636) => MaybePromise < Resolved > ;
3737
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+ }
3968
4069async function tryExtensions (
4170 specifier : string ,
4271 context : Context ,
4372 defaultResolve : resolve ,
4473) {
4574 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 ;
4781 try {
4882 return await resolve (
49- specifier + extension ,
83+ ` ${ alternativeSpecifier } ${ alternativeExtension } ` ,
5084 context ,
5185 defaultResolve ,
5286 true ,
5387 ) ;
5488 } catch ( _error : any ) {
5589 if ( error === undefined ) {
5690 const { message } = _error ;
57- _error . message = _error . message . replace ( `${ extension } '` , "'" ) ;
91+ _error . message = _error . message . replace ( `${ alternativeExtension } '` , ` ${ specifierExtension } '` ) ;
5892 _error . stack = _error . stack . replace ( message , _error . message ) ;
5993 error = _error ;
6094 }
0 commit comments