@@ -38,7 +38,7 @@ const {
38
38
forceDefaultLoader,
39
39
} = require ( 'internal/modules/esm/utils' ) ;
40
40
const { kImplicitTypeAttribute } = require ( 'internal/modules/esm/assert' ) ;
41
- const { ModuleWrap, kEvaluating, kEvaluated } = internalBinding ( 'module_wrap' ) ;
41
+ const { ModuleWrap, kEvaluating, kEvaluated, kEvaluationPhase , kSourcePhase } = internalBinding ( 'module_wrap' ) ;
42
42
const {
43
43
urlToFilename,
44
44
} = require ( 'internal/modules/helpers' ) ;
@@ -236,8 +236,7 @@ class ModuleLoader {
236
236
async executeModuleJob ( url , wrap , isEntryPoint = false ) {
237
237
const { ModuleJob } = require ( 'internal/modules/esm/module_job' ) ;
238
238
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 ) ;
241
240
this . loadCache . set ( url , undefined , job ) ;
242
241
const { module } = await job . run ( isEntryPoint ) ;
243
242
return module ;
@@ -273,11 +272,12 @@ class ModuleLoader {
273
272
* @param {string } [parentURL] The URL of the module where the module request is initiated.
274
273
* It's undefined if it's from the root module.
275
274
* @param {ImportAttributes } importAttributes Attributes from the import statement or expression.
275
+ * @param {number } phase Import phase.
276
276
* @returns {Promise<ModuleJobBase> }
277
277
*/
278
- async getModuleJobForImport ( specifier , parentURL , importAttributes ) {
278
+ async getModuleJobForImport ( specifier , parentURL , importAttributes , phase ) {
279
279
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 ) ;
281
281
}
282
282
283
283
/**
@@ -287,11 +287,12 @@ class ModuleLoader {
287
287
* @param {string } specifier See {@link getModuleJobForImport}
288
288
* @param {string } [parentURL] See {@link getModuleJobForImport}
289
289
* @param {ImportAttributes } importAttributes See {@link getModuleJobForImport}
290
+ * @param {number } phase Import phase.
290
291
* @returns {Promise<ModuleJobBase> }
291
292
*/
292
- getModuleJobForRequireInImportedCJS ( specifier , parentURL , importAttributes ) {
293
+ getModuleJobForRequireInImportedCJS ( specifier , parentURL , importAttributes , phase ) {
293
294
const resolveResult = this . resolveSync ( specifier , parentURL , importAttributes ) ;
294
- return this . #getJobFromResolveResult( resolveResult , parentURL , importAttributes , true ) ;
295
+ return this . #getJobFromResolveResult( resolveResult , parentURL , importAttributes , phase , true ) ;
295
296
}
296
297
297
298
/**
@@ -300,16 +301,21 @@ class ModuleLoader {
300
301
* @param {{ format: string, url: string } } resolveResult Resolved module request.
301
302
* @param {string } [parentURL] See {@link getModuleJobForImport}
302
303
* @param {ImportAttributes } importAttributes See {@link getModuleJobForImport}
304
+ * @param {number } phase Import phase.
303
305
* @param {boolean } isForRequireInImportedCJS Whether this is done for require() in imported CJS.
304
306
* @returns {ModuleJobBase }
305
307
*/
306
- #getJobFromResolveResult( resolveResult , parentURL , importAttributes , isForRequireInImportedCJS = false ) {
308
+ #getJobFromResolveResult( resolveResult , parentURL , importAttributes , phase ,
309
+ isForRequireInImportedCJS = false ) {
307
310
const { url, format } = resolveResult ;
308
311
const resolvedImportAttributes = resolveResult . importAttributes ?? importAttributes ;
309
312
let job = this . loadCache . get ( url , resolvedImportAttributes . type ) ;
310
313
311
314
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 ) ;
313
319
}
314
320
315
321
return job ;
@@ -360,7 +366,7 @@ class ModuleLoader {
360
366
const inspectBrk = ( isMain && getOptionValue ( '--inspect-brk' ) ) ;
361
367
362
368
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 ) ;
364
370
this . loadCache . set ( url , kImplicitTypeAttribute , job ) ;
365
371
mod [ kRequiredModuleSymbol ] = job . module ;
366
372
return { wrap : job . module , namespace : job . runSync ( ) . namespace } ;
@@ -372,9 +378,10 @@ class ModuleLoader {
372
378
* @param {string } specifier Specifier of the the imported module.
373
379
* @param {string } parentURL Where the import comes from.
374
380
* @param {object } importAttributes import attributes from the import statement.
381
+ * @param {number } phase The import phase.
375
382
* @returns {ModuleJobBase }
376
383
*/
377
- getModuleJobForRequire ( specifier , parentURL , importAttributes ) {
384
+ getModuleJobForRequire ( specifier , parentURL , importAttributes , phase ) {
378
385
const parsed = URLParse ( specifier ) ;
379
386
if ( parsed != null ) {
380
387
const protocol = parsed . protocol ;
@@ -405,6 +412,7 @@ class ModuleLoader {
405
412
}
406
413
throw new ERR_REQUIRE_CYCLE_MODULE ( message ) ;
407
414
}
415
+ job . ensurePhase ( phase ) ;
408
416
// Otherwise the module could be imported before but the evaluation may be already
409
417
// completed (e.g. the require call is lazy) so it's okay. We will return the
410
418
// module now and check asynchronicity of the entire graph later, after the
@@ -446,7 +454,7 @@ class ModuleLoader {
446
454
447
455
const inspectBrk = ( isMain && getOptionValue ( '--inspect-brk' ) ) ;
448
456
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 ) ;
450
458
451
459
this . loadCache . set ( url , importAttributes . type , job ) ;
452
460
return job ;
@@ -526,13 +534,14 @@ class ModuleLoader {
526
534
* by the time this returns. Otherwise it may still have pending module requests.
527
535
* @param {string } url The URL that was resolved for this module.
528
536
* @param {ImportAttributes } importAttributes See {@link getModuleJobForImport}
537
+ * @param {number } phase Import phase.
529
538
* @param {string } [parentURL] See {@link getModuleJobForImport}
530
539
* @param {string } [format] The format hint possibly returned by the `resolve` hook
531
540
* @param {boolean } isForRequireInImportedCJS Whether this module job is created for require()
532
541
* in imported CJS.
533
542
* @returns {ModuleJobBase } The (possibly pending) module job
534
543
*/
535
- #createModuleJob( url , importAttributes , parentURL , format , isForRequireInImportedCJS ) {
544
+ #createModuleJob( url , importAttributes , phase , parentURL , format , isForRequireInImportedCJS ) {
536
545
const context = { format, importAttributes } ;
537
546
538
547
const isMain = parentURL === undefined ;
@@ -558,6 +567,7 @@ class ModuleLoader {
558
567
url ,
559
568
importAttributes ,
560
569
moduleOrModulePromise ,
570
+ phase ,
561
571
isMain ,
562
572
inspectBrk ,
563
573
isForRequireInImportedCJS ,
@@ -575,11 +585,18 @@ class ModuleLoader {
575
585
* @param {string } parentURL Path of the parent importing the module.
576
586
* @param {Record<string, string> } importAttributes Validations for the
577
587
* module import.
588
+ * @param {number } [phase] The phase of the import.
589
+ * @param {boolean } [isEntryPoint] Whether this is the realm-level entry point.
578
590
* @returns {Promise<ModuleExports> }
579
591
*/
580
- async import ( specifier , parentURL , importAttributes , isEntryPoint = false ) {
592
+ async import ( specifier , parentURL , importAttributes , phase = kEvaluationPhase , isEntryPoint = false ) {
581
593
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
+ }
583
600
const { module } = await moduleJob . run ( isEntryPoint ) ;
584
601
return module . getNamespace ( ) ;
585
602
} , {
0 commit comments