diff --git a/lib/internal/loader/ModuleJob.js b/lib/internal/loader/ModuleJob.js index 2d6325b85c..db37765b20 100644 --- a/lib/internal/loader/ModuleJob.js +++ b/lib/internal/loader/ModuleJob.js @@ -6,9 +6,6 @@ const { decorateErrorStack } = require('internal/util'); const assert = require('assert'); const resolvedPromise = SafePromise.resolve(); -const enableDebug = (process.env.NODE_DEBUG || '').match(/\besm\b/) || - process.features.debug; - /* A ModuleJob tracks the loading of a single Module, and the ModuleJobs of * its dependencies, over time. */ class ModuleJob { @@ -27,7 +24,6 @@ class ModuleJob { // Wait for the ModuleWrap instance being linked with all dependencies. const link = async () => { - const dependencyJobs = []; ({ module: this.module, reflect: this.reflect } = await this.modulePromise); if (inspectBrk) { @@ -35,17 +31,17 @@ class ModuleJob { initWrapper(this.module.instantiate, this.module); } assert(this.module instanceof ModuleWrap); - this.module.link(async (dependencySpecifier) => { - const dependencyJobPromise = - this.loader.getModuleJob(dependencySpecifier, url); - dependencyJobs.push(dependencyJobPromise); - const dependencyJob = await dependencyJobPromise; - return (await dependencyJob.modulePromise).module; + + const dependencyJobs = []; + const promises = this.module.link(async (specifier) => { + const jobPromise = this.loader.getModuleJob(specifier, url); + dependencyJobs.push(jobPromise); + return (await (await jobPromise).modulePromise).module; }); - if (enableDebug) { - // Make sure all dependencies are entered into the list synchronously. - Object.freeze(dependencyJobs); - } + + if (promises !== undefined) + await SafePromise.all(promises); + return SafePromise.all(dependencyJobs); }; // Promise for the list of all dependencyJobs. diff --git a/src/module_wrap.cc b/src/module_wrap.cc index ba07fcdc79..daa7f9036a 100644 --- a/src/module_wrap.cc +++ b/src/module_wrap.cc @@ -171,6 +171,9 @@ void ModuleWrap::Link(const FunctionCallbackInfo& args) { Local mod_context = obj->context_.Get(isolate); Local module = obj->module_.Get(isolate); + Local promises = Array::New(isolate, + module->GetModuleRequestsLength()); + // call the dependency resolve callbacks for (int i = 0; i < module->GetModuleRequestsLength(); i++) { Local specifier = module->GetModuleRequest(i); @@ -193,9 +196,11 @@ void ModuleWrap::Link(const FunctionCallbackInfo& args) { } Local resolve_promise = resolve_return_value.As(); obj->resolve_cache_[specifier_std].Reset(env->isolate(), resolve_promise); + + promises->Set(mod_context, specifier, resolve_promise).FromJust(); } - args.GetReturnValue().Set(that); + args.GetReturnValue().Set(promises); } void ModuleWrap::Instantiate(const FunctionCallbackInfo& args) {