@@ -9,6 +9,10 @@ const { NativeModule } = require('internal/bootstrap/loaders');
99const { extname } = require ( 'path' ) ;
1010const { realpathSync } = require ( 'fs' ) ;
1111const { getOptionValue } = require ( 'internal/options' ) ;
12+ const {
13+ Module : CJSModule
14+ } = require ( 'internal/modules/cjs/loader' ) ;
15+
1216
1317const preserveSymlinks = getOptionValue ( '--preserve-symlinks' ) ;
1418const preserveSymlinksMain = getOptionValue ( '--preserve-symlinks-main' ) ;
@@ -93,7 +97,32 @@ function resolve(specifier, parentURL) {
9397 throw new ERR_INPUT_TYPE_NOT_ALLOWED ( ) ;
9498 }
9599
96- let url = moduleWrapResolve ( specifier , parentURL ) ;
100+ let url ;
101+ try {
102+ url = moduleWrapResolve ( specifier , parentURL ) ;
103+ } catch ( error ) {
104+ try {
105+ // By default ES Modules does not support extensionless files.
106+ // The idea is make suggestions when file ext is not provided
107+ // Example: import pkg from './meow'
108+ // Ref: https://github.com/nodejs/node/issues/30603
109+
110+ // Create a fake CJS Module using parentURL.
111+ const currentModule = new CJSModule ( parentURL ) ;
112+ // Resolve our especifier e.g: 'file'
113+ // using as module parent our current module.
114+ // So with our fake parent, paths to search in CJS will be provided.
115+ const cjsResolved = CJSModule . _resolveFilename ( specifier ,
116+ currentModule ,
117+ false ) ;
118+ if ( cjsResolved ) {
119+ error . message += '\nCJS would resolved: ' + cjsResolved ;
120+ }
121+ } catch ( cjsError ) { // eslint-disable-line no-unused-vars
122+ // ignore
123+ }
124+ throw error ;
125+ }
97126
98127 if ( isMain ? ! preserveSymlinksMain : ! preserveSymlinks ) {
99128 const real = realpathSync ( fileURLToPath ( url ) , {
0 commit comments