@@ -38,7 +38,7 @@ const {
3838 forceDefaultLoader,
3939} = require ( 'internal/modules/esm/utils' ) ;
4040const { kImplicitTypeAttribute } = require ( 'internal/modules/esm/assert' ) ;
41- const { ModuleWrap, kEvaluating, kEvaluated } = internalBinding ( 'module_wrap' ) ;
41+ const { ModuleWrap, kEvaluating, kEvaluated, kEvaluationPhase , kSourcePhase } = internalBinding ( 'module_wrap' ) ;
4242const {
4343 urlToFilename,
4444} = require ( 'internal/modules/helpers' ) ;
@@ -236,8 +236,7 @@ class ModuleLoader {
236236 async executeModuleJob ( url , wrap , isEntryPoint = false ) {
237237 const { ModuleJob } = require ( 'internal/modules/esm/module_job' ) ;
238238 const module = await onImport . tracePromise ( async ( ) => {
239- const job = new ModuleJob (
240- this , url , undefined , wrap , false , false ) ;
239+ const job = new ModuleJob ( this , url , undefined , wrap , kEvaluationPhase , false , false ) ;
241240 this . loadCache . set ( url , undefined , job ) ;
242241 const { module } = await job . run ( isEntryPoint ) ;
243242 return module ;
@@ -273,11 +272,12 @@ class ModuleLoader {
273272 * @param {string } [parentURL] The URL of the module where the module request is initiated.
274273 * It's undefined if it's from the root module.
275274 * @param {ImportAttributes } importAttributes Attributes from the import statement or expression.
275+ * @param {number } phase Import phase.
276276 * @returns {Promise<ModuleJobBase> }
277277 */
278- async getModuleJobForImport ( specifier , parentURL , importAttributes ) {
278+ async getModuleJobForImport ( specifier , parentURL , importAttributes , phase ) {
279279 const resolveResult = await this . resolve ( specifier , parentURL , importAttributes ) ;
280- return this . #getJobFromResolveResult( resolveResult , parentURL , importAttributes , false ) ;
280+ return this . #getJobFromResolveResult( resolveResult , parentURL , importAttributes , phase , false ) ;
281281 }
282282
283283 /**
@@ -287,11 +287,12 @@ class ModuleLoader {
287287 * @param {string } specifier See {@link getModuleJobForImport}
288288 * @param {string } [parentURL] See {@link getModuleJobForImport}
289289 * @param {ImportAttributes } importAttributes See {@link getModuleJobForImport}
290+ * @param {number } phase Import phase.
290291 * @returns {Promise<ModuleJobBase> }
291292 */
292- getModuleJobForRequireInImportedCJS ( specifier , parentURL , importAttributes ) {
293+ getModuleJobForRequireInImportedCJS ( specifier , parentURL , importAttributes , phase ) {
293294 const resolveResult = this . resolveSync ( specifier , parentURL , importAttributes ) ;
294- return this . #getJobFromResolveResult( resolveResult , parentURL , importAttributes , true ) ;
295+ return this . #getJobFromResolveResult( resolveResult , parentURL , importAttributes , phase , true ) ;
295296 }
296297
297298 /**
@@ -300,16 +301,21 @@ class ModuleLoader {
300301 * @param {{ format: string, url: string } } resolveResult Resolved module request.
301302 * @param {string } [parentURL] See {@link getModuleJobForImport}
302303 * @param {ImportAttributes } importAttributes See {@link getModuleJobForImport}
304+ * @param {number } phase Import phase.
303305 * @param {boolean } isForRequireInImportedCJS Whether this is done for require() in imported CJS.
304306 * @returns {ModuleJobBase }
305307 */
306- #getJobFromResolveResult( resolveResult , parentURL , importAttributes , isForRequireInImportedCJS = false ) {
308+ #getJobFromResolveResult( resolveResult , parentURL , importAttributes , phase ,
309+ isForRequireInImportedCJS = false ) {
307310 const { url, format } = resolveResult ;
308311 const resolvedImportAttributes = resolveResult . importAttributes ?? importAttributes ;
309312 let job = this . loadCache . get ( url , resolvedImportAttributes . type ) ;
310313
311314 if ( job === undefined ) {
312- job = this . #createModuleJob( url , resolvedImportAttributes , parentURL , format , isForRequireInImportedCJS ) ;
315+ job = this . #createModuleJob( url , resolvedImportAttributes , phase , parentURL , format ,
316+ isForRequireInImportedCJS ) ;
317+ } else {
318+ job . ensurePhase ( phase ) ;
313319 }
314320
315321 return job ;
@@ -360,7 +366,7 @@ class ModuleLoader {
360366 const inspectBrk = ( isMain && getOptionValue ( '--inspect-brk' ) ) ;
361367
362368 const { ModuleJobSync } = require ( 'internal/modules/esm/module_job' ) ;
363- job = new ModuleJobSync ( this , url , kEmptyObject , wrap , isMain , inspectBrk ) ;
369+ job = new ModuleJobSync ( this , url , kEmptyObject , wrap , kEvaluationPhase , isMain , inspectBrk ) ;
364370 this . loadCache . set ( url , kImplicitTypeAttribute , job ) ;
365371 mod [ kRequiredModuleSymbol ] = job . module ;
366372 return { wrap : job . module , namespace : job . runSync ( ) . namespace } ;
@@ -372,9 +378,10 @@ class ModuleLoader {
372378 * @param {string } specifier Specifier of the the imported module.
373379 * @param {string } parentURL Where the import comes from.
374380 * @param {object } importAttributes import attributes from the import statement.
381+ * @param {number } phase The import phase.
375382 * @returns {ModuleJobBase }
376383 */
377- getModuleJobForRequire ( specifier , parentURL , importAttributes ) {
384+ getModuleJobForRequire ( specifier , parentURL , importAttributes , phase ) {
378385 const parsed = URLParse ( specifier ) ;
379386 if ( parsed != null ) {
380387 const protocol = parsed . protocol ;
@@ -405,6 +412,7 @@ class ModuleLoader {
405412 }
406413 throw new ERR_REQUIRE_CYCLE_MODULE ( message ) ;
407414 }
415+ job . ensurePhase ( phase ) ;
408416 // Otherwise the module could be imported before but the evaluation may be already
409417 // completed (e.g. the require call is lazy) so it's okay. We will return the
410418 // module now and check asynchronicity of the entire graph later, after the
@@ -446,7 +454,7 @@ class ModuleLoader {
446454
447455 const inspectBrk = ( isMain && getOptionValue ( '--inspect-brk' ) ) ;
448456 const { ModuleJobSync } = require ( 'internal/modules/esm/module_job' ) ;
449- job = new ModuleJobSync ( this , url , importAttributes , wrap , isMain , inspectBrk ) ;
457+ job = new ModuleJobSync ( this , url , importAttributes , wrap , phase , isMain , inspectBrk ) ;
450458
451459 this . loadCache . set ( url , importAttributes . type , job ) ;
452460 return job ;
@@ -526,13 +534,14 @@ class ModuleLoader {
526534 * by the time this returns. Otherwise it may still have pending module requests.
527535 * @param {string } url The URL that was resolved for this module.
528536 * @param {ImportAttributes } importAttributes See {@link getModuleJobForImport}
537+ * @param {number } phase Import phase.
529538 * @param {string } [parentURL] See {@link getModuleJobForImport}
530539 * @param {string } [format] The format hint possibly returned by the `resolve` hook
531540 * @param {boolean } isForRequireInImportedCJS Whether this module job is created for require()
532541 * in imported CJS.
533542 * @returns {ModuleJobBase } The (possibly pending) module job
534543 */
535- #createModuleJob( url , importAttributes , parentURL , format , isForRequireInImportedCJS ) {
544+ #createModuleJob( url , importAttributes , phase , parentURL , format , isForRequireInImportedCJS ) {
536545 const context = { format, importAttributes } ;
537546
538547 const isMain = parentURL === undefined ;
@@ -558,6 +567,7 @@ class ModuleLoader {
558567 url ,
559568 importAttributes ,
560569 moduleOrModulePromise ,
570+ phase ,
561571 isMain ,
562572 inspectBrk ,
563573 isForRequireInImportedCJS ,
@@ -575,11 +585,18 @@ class ModuleLoader {
575585 * @param {string } parentURL Path of the parent importing the module.
576586 * @param {Record<string, string> } importAttributes Validations for the
577587 * module import.
588+ * @param {number } [phase] The phase of the import.
589+ * @param {boolean } [isEntryPoint] Whether this is the realm-level entry point.
578590 * @returns {Promise<ModuleExports> }
579591 */
580- async import ( specifier , parentURL , importAttributes , isEntryPoint = false ) {
592+ async import ( specifier , parentURL , importAttributes , phase = kEvaluationPhase , isEntryPoint = false ) {
581593 return onImport . tracePromise ( async ( ) => {
582- const moduleJob = await this . getModuleJobForImport ( specifier , parentURL , importAttributes ) ;
594+ const moduleJob = await this . getModuleJobForImport ( specifier , parentURL , importAttributes ,
595+ phase ) ;
596+ if ( phase === kSourcePhase ) {
597+ const module = await moduleJob . modulePromise ;
598+ return module . getModuleSourceObject ( ) ;
599+ }
583600 const { module } = await moduleJob . run ( isEntryPoint ) ;
584601 return module . getNamespace ( ) ;
585602 } , {
0 commit comments