@@ -31,6 +31,7 @@ function lazyTypes() {
3131}
3232
3333const { containsModuleSyntax } = internalBinding ( 'contextify' ) ;
34+ const { BuiltinModule } = require ( 'internal/bootstrap/realm' ) ;
3435const assert = require ( 'internal/assert' ) ;
3536const { readFileSync } = require ( 'fs' ) ;
3637const { dirname, extname, isAbsolute } = require ( 'path' ) ;
@@ -58,6 +59,17 @@ const asyncESM = require('internal/process/esm_loader');
5859const { emitWarningSync } = require ( 'internal/process/warning' ) ;
5960const { internalCompileFunction } = require ( 'internal/vm' ) ;
6061
62+ // Lazy-loading to avoid circular dependencies.
63+ let getSourceSync ;
64+ /**
65+ * @param {Parameters<typeof import('./load').getSourceSync>[0] } url
66+ * @returns {ReturnType<typeof import('./load').getSourceSync> }
67+ */
68+ function getSource ( url ) {
69+ getSourceSync ??= require ( 'internal/modules/esm/load' ) . getSourceSync ;
70+ return getSourceSync ( url ) ;
71+ }
72+
6173/** @type {import('deps/cjs-module-lexer/lexer.js').parse } */
6274let cjsParse ;
6375/**
@@ -225,21 +237,19 @@ function loadCJSModule(module, source, url, filename) {
225237 // eslint-disable-next-line func-name-matching,func-style
226238 const requireFn = function require ( specifier ) {
227239 let importAttributes = kEmptyObject ;
228- if ( ! StringPrototypeStartsWith ( specifier , 'node:' ) ) {
240+ if ( ! StringPrototypeStartsWith ( specifier , 'node:' ) && ! BuiltinModule . normalizeRequirableId ( specifier ) ) {
229241 // TODO: do not depend on the monkey-patchable CJS loader here.
230242 const path = CJSModule . _resolveFilename ( specifier , module ) ;
231- if ( specifier !== path ) {
232- switch ( extname ( path ) ) {
233- case '.json' :
234- importAttributes = { __proto__ : null , type : 'json' } ;
235- break ;
236- case '.node' :
237- return CJSModule . _load ( specifier , module ) ;
238- default :
243+ switch ( extname ( path ) ) {
244+ case '.json' :
245+ importAttributes = { __proto__ : null , type : 'json' } ;
246+ break ;
247+ case '.node' :
248+ return CJSModule . _load ( specifier , module ) ;
249+ default :
239250 // fall through
240- }
241- specifier = `${ pathToFileURL ( path ) } ` ;
242251 }
252+ specifier = `${ pathToFileURL ( path ) } ` ;
243253 }
244254 const job = asyncESM . esmLoader . getModuleJobSync ( specifier , url , importAttributes ) ;
245255 job . runSync ( ) ;
@@ -276,7 +286,8 @@ function createCJSModuleWrap(url, source, isMain, loadCJS = loadCJSModule) {
276286 debug ( `Translating CJSModule ${ url } ` ) ;
277287
278288 const filename = StringPrototypeStartsWith ( url , 'file://' ) ? fileURLToPath ( url ) : url ;
279- source = stringify ( source ) ;
289+ // In case the source was not provided by the `load` step, we need fetch it now.
290+ source = stringify ( source ?? getSource ( new URL ( url ) ) . source ) ;
280291
281292 const { exportNames, module } = cjsPreparseModuleExports ( filename , source ) ;
282293 cjsCache . set ( url , module ) ;
0 commit comments