@@ -17,6 +17,7 @@ const {
1717  mimeToFormat, 
1818}  =  require ( 'internal/modules/esm/formats' ) ; 
1919
20+ const  detectModule  =  getOptionValue ( '--experimental-detect-module' ) ; 
2021const  experimentalNetworkImports  = 
2122  getOptionValue ( '--experimental-network-imports' ) ; 
2223const  {  containsModuleSyntax }  =  internalBinding ( 'contextify' ) ; 
@@ -33,6 +34,17 @@ const protocolHandlers = {
3334  'node:' ( )  {  return  'builtin' ;  } , 
3435} ; 
3536
37+ /** 
38+  * Determine whether the given ambiguous source contains CommonJS or ES module syntax. 
39+  * @param  {string | Buffer | undefined } source 
40+  * @param  {URL } url 
41+  */ 
42+ function  detectModuleFormat ( source ,  url )  { 
43+   if  ( ! source )  {  return  detectModule  ? null  : 'commonjs' ;  } 
44+   if  ( ! detectModule )  {  return  'commonjs' ;  } 
45+   return  containsModuleSyntax ( `${ source }  ` ,  fileURLToPath ( url ) ,  url )  ? 'module'  : 'commonjs' ; 
46+ } 
47+ 
3648/** 
3749 * @param  {URL } parsed 
3850 * @returns  {string | null } 
@@ -112,26 +124,23 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE
112124      default : {  // The user did not pass `--experimental-default-type`. 
113125        // `source` is undefined when this is called from `defaultResolve`; 
114126        // but this gets called again from `defaultLoad`/`defaultLoadSync`. 
115-         if  ( getOptionValue ( '--experimental-detect-module' ) )  { 
116-           const  format  =  source  ?
117-             ( containsModuleSyntax ( `${ source }  ` ,  fileURLToPath ( url ) ,  url )  ? 'module'  : 'commonjs' )  :
118-             null ; 
119-           if  ( format  ===  'module' )  { 
120-             // This module has a .js extension, a package.json with no `type` field, and ESM syntax. 
121-             // Warn about the missing `type` field so that the user can avoid the performance penalty of detection. 
122-             typelessPackageJsonFilesWarnedAbout  ??=  new  SafeSet ( ) ; 
123-             if  ( ! typelessPackageJsonFilesWarnedAbout . has ( pjsonPath ) )  { 
124-               const  warning  =  `${ url }   parsed as an ES module because module syntax was detected;`  + 
125-               ` to avoid the performance penalty of syntax detection, add "type": "module" to ${ pjsonPath }  ` ; 
126-               process . emitWarning ( warning ,  { 
127-                 code : 'MODULE_TYPELESS_PACKAGE_JSON' , 
128-               } ) ; 
129-               typelessPackageJsonFilesWarnedAbout . add ( pjsonPath ) ; 
130-             } 
127+         // For ambiguous files (no type field, .js extension) we return 
128+         // undefined from `resolve` and re-run the check in `load`. 
129+         const  format  =  detectModuleFormat ( source ,  url ) ; 
130+         if  ( format  ===  'module' )  { 
131+           // This module has a .js extension, a package.json with no `type` field, and ESM syntax. 
132+           // Warn about the missing `type` field so that the user can avoid the performance penalty of detection. 
133+           typelessPackageJsonFilesWarnedAbout  ??=  new  SafeSet ( ) ; 
134+           if  ( ! typelessPackageJsonFilesWarnedAbout . has ( pjsonPath ) )  { 
135+             const  warning  =  `${ url }   parsed as an ES module because module syntax was detected;`  + 
136+             ` to avoid the performance penalty of syntax detection, add "type": "module" to ${ pjsonPath }  ` ; 
137+             process . emitWarning ( warning ,  { 
138+               code : 'MODULE_TYPELESS_PACKAGE_JSON' , 
139+             } ) ; 
140+             typelessPackageJsonFilesWarnedAbout . add ( pjsonPath ) ; 
131141          } 
132-           return  format ; 
133142        } 
134-         return  'commonjs' ; 
143+         return  format ; 
135144      } 
136145    } 
137146  } 
@@ -154,15 +163,14 @@ function getFileProtocolModuleFormat(url, context = { __proto__: null }, ignoreE
154163        return  'commonjs' ; 
155164      } 
156165      default : {  // The user did not pass `--experimental-default-type`. 
157-         if  ( getOptionValue ( '--experimental-detect-module' ) )  { 
158-           if  ( ! source )  {  return  null ;  } 
159-           const  format  =  getFormatOfExtensionlessFile ( url ) ; 
160-           if  ( format  ===  'module' )  { 
161-             return  containsModuleSyntax ( `${ source }  ` ,  fileURLToPath ( url ) ,  url )  ? 'module'  : 'commonjs' ; 
162-           } 
166+         if  ( ! source )  { 
167+           return  null ; 
168+         } 
169+         const  format  =  getFormatOfExtensionlessFile ( url ) ; 
170+         if  ( format  ===  'wasm' )  { 
163171          return  format ; 
164172        } 
165-         return  'commonjs' ; 
173+         return  detectModuleFormat ( source ,   url ) ; 
166174      } 
167175    } 
168176  } 
0 commit comments