@@ -18,6 +18,9 @@ const {
1818  StringPrototypeSplit, 
1919  StringPrototypeStartsWith, 
2020}  =  primordials ; 
21+ let  debug  =  require ( 'internal/util/debuglog' ) . debuglog ( 'esm' ,  ( fn )  =>  { 
22+   debug  =  fn ; 
23+ } ) ; 
2124
2225const  {  ModuleWrap,  kEvaluated }  =  internalBinding ( 'module_wrap' ) ; 
2326
@@ -48,8 +51,7 @@ const isCommonJSGlobalLikeNotDefinedError = (errorMessage) =>
4851  ) ; 
4952
5053class  ModuleJobBase  { 
51-   constructor ( loader ,  url ,  importAttributes ,  moduleWrapMaybePromise ,  isMain ,  inspectBrk )  { 
52-     this . loader  =  loader ; 
54+   constructor ( url ,  importAttributes ,  moduleWrapMaybePromise ,  isMain ,  inspectBrk )  { 
5355    this . importAttributes  =  importAttributes ; 
5456    this . isMain  =  isMain ; 
5557    this . inspectBrk  =  inspectBrk ; 
@@ -62,11 +64,13 @@ class ModuleJobBase {
6264/* A ModuleJob tracks the loading of a single Module, and the ModuleJobs of 
6365 * its dependencies, over time. */ 
6466class  ModuleJob  extends  ModuleJobBase  { 
67+   #loader =  null ; 
6568  // `loader` is the Loader instance used for loading dependencies. 
6669  constructor ( loader ,  url ,  importAttributes  =  {  __proto__ : null  } , 
6770              moduleProvider ,  isMain ,  inspectBrk ,  sync  =  false )  { 
6871    const  modulePromise  =  ReflectApply ( moduleProvider ,  loader ,  [ url ,  isMain ] ) ; 
69-     super ( loader ,  url ,  importAttributes ,  modulePromise ,  isMain ,  inspectBrk ) ; 
72+     super ( url ,  importAttributes ,  modulePromise ,  isMain ,  inspectBrk ) ; 
73+     this . #loader =  loader ; 
7074    // Expose the promise to the ModuleWrap directly for linking below. 
7175    // `this.module` is also filled in below. 
7276    this . modulePromise  =  modulePromise ; 
@@ -89,7 +93,8 @@ class ModuleJob extends ModuleJobBase {
8993      // these `link` callbacks depending on each other. 
9094      const  dependencyJobs  =  [ ] ; 
9195      const  promises  =  this . module . link ( async  ( specifier ,  attributes )  =>  { 
92-         const  job  =  await  this . loader . getModuleJob ( specifier ,  url ,  attributes ) ; 
96+         const  job  =  await  this . #loader. getModuleJob ( specifier ,  url ,  attributes ) ; 
97+         debug ( `async link() ${ this . url }   -> ${ specifier }  ` ,  job ) ; 
9398        ArrayPrototypePush ( dependencyJobs ,  job ) ; 
9499        return  job . modulePromise ; 
95100      } ) ; 
@@ -121,6 +126,8 @@ class ModuleJob extends ModuleJobBase {
121126  async  _instantiate ( )  { 
122127    const  jobsInGraph  =  new  SafeSet ( ) ; 
123128    const  addJobsToDependencyGraph  =  async  ( moduleJob )  =>  { 
129+       debug ( `async addJobsToDependencyGraph() ${ this . url }  ` ,  moduleJob ) ; 
130+ 
124131      if  ( jobsInGraph . has ( moduleJob ) )  { 
125132        return ; 
126133      } 
@@ -156,7 +163,7 @@ class ModuleJob extends ModuleJobBase {
156163        const  {  1 : childSpecifier ,  2 : name  }  =  RegExpPrototypeExec ( 
157164          / m o d u l e   ' ( .* ) '   d o e s   n o t   p r o v i d e   a n   e x p o r t   n a m e d   ' ( .+ ) ' / , 
158165          e . message ) ; 
159-         const  {  url : childFileURL  }  =  await  this . loader . resolve ( 
166+         const  {  url : childFileURL  }  =  await  this . # loader. resolve ( 
160167          childSpecifier , 
161168          parentFileUrl , 
162169          kEmptyObject , 
@@ -167,7 +174,7 @@ class ModuleJob extends ModuleJobBase {
167174          // in the import attributes and some formats require them; but we only 
168175          // care about CommonJS for the purposes of this error message. 
169176          ( {  format }  = 
170-             await  this . loader . load ( childFileURL ) ) ; 
177+             await  this . # loader. load ( childFileURL ) ) ; 
171178        }  catch  { 
172179          // Continue regardless of error. 
173180        } 
@@ -257,18 +264,27 @@ class ModuleJob extends ModuleJobBase {
257264// All the steps are ensured to be synchronous and it throws on instantiating 
258265// an asynchronous graph. 
259266class  ModuleJobSync  extends  ModuleJobBase  { 
267+   #loader =  null ; 
260268  constructor ( loader ,  url ,  importAttributes ,  moduleWrap ,  isMain ,  inspectBrk )  { 
261-     super ( loader ,   url ,  importAttributes ,  moduleWrap ,  isMain ,  inspectBrk ,  true ) ; 
269+     super ( url ,  importAttributes ,  moduleWrap ,  isMain ,  inspectBrk ,  true ) ; 
262270    assert ( this . module  instanceof  ModuleWrap ) ; 
271+     this . #loader =  loader ; 
263272    const  moduleRequests  =  this . module . getModuleRequestsSync ( ) ; 
273+     const  linked  =  [ ] ; 
264274    for  ( let  i  =  0 ;  i  <  moduleRequests . length ;  ++ i )  { 
265275      const  {  0 : specifier ,  1 : attributes  }  =  moduleRequests [ i ] ; 
266-       const  wrap  =  this . loader . getModuleWrapForRequire ( specifier ,  url ,  attributes ) ; 
276+       const  job  =  this . # loader. getModuleWrapForRequire ( specifier ,  url ,  attributes ) ; 
267277      const  isLast  =  ( i  ===  moduleRequests . length  -  1 ) ; 
268278      // TODO(joyeecheung): make the resolution callback deal with both promisified 
269279      // an raw module wraps, then we don't need to wrap it with a promise here. 
270-       this . module . cacheResolvedWrapsSync ( specifier ,  PromiseResolve ( wrap ) ,  isLast ) ; 
280+       this . module . cacheResolvedWrapsSync ( specifier ,  PromiseResolve ( job . module ) ,  isLast ) ; 
281+       ArrayPrototypePush ( linked ,  job ) ; 
271282    } 
283+     this . linked  =  linked ; 
284+   } 
285+ 
286+   get  modulePromise ( )  { 
287+     return  PromiseResolve ( this . module ) ; 
272288  } 
273289
274290  async  run ( )  { 
0 commit comments