in packages/jest-runtime/src/index.ts [429:529]
private async loadEsmModule(
modulePath: string,
query = '',
): Promise<VMModule> {
const cacheKey = modulePath + query;
if (this._fileTransformsMutex.has(cacheKey)) {
await this._fileTransformsMutex.get(cacheKey);
}
if (!this._esmoduleRegistry.has(cacheKey)) {
invariant(
typeof this._environment.getVmContext === 'function',
'ES Modules are only supported if your test environment has the `getVmContext` function',
);
const context = this._environment.getVmContext();
invariant(context, 'Test environment has been torn down');
let transformResolve: () => void;
let transformReject: (error?: unknown) => void;
this._fileTransformsMutex.set(
cacheKey,
new Promise((resolve, reject) => {
transformResolve = resolve;
transformReject = reject;
}),
);
invariant(
transformResolve! && transformReject!,
'Promise initialization should be sync - please report this bug to Jest!',
);
if (this._resolver.isCoreModule(modulePath)) {
const core = this._importCoreModule(modulePath, context);
this._esmoduleRegistry.set(cacheKey, core);
transformResolve();
return core;
}
const transformedCode = await this.transformFileAsync(modulePath, {
isInternalModule: false,
supportsDynamicImport: true,
supportsExportNamespaceFrom: true,
supportsStaticESM: true,
supportsTopLevelAwait,
});
try {
const module = new SourceTextModule(transformedCode, {
context,
identifier: modulePath,
importModuleDynamically: async (
specifier: string,
referencingModule: VMModule,
) => {
invariant(
runtimeSupportsVmModules,
'You need to run with a version of node that supports ES Modules in the VM API. See https://jestjs.io/docs/ecmascript-modules',
);
const module = await this.resolveModule(
specifier,
referencingModule.identifier,
referencingModule.context,
);
return this.linkAndEvaluateModule(module);
},
initializeImportMeta(meta: ImportMeta) {
meta.url = pathToFileURL(modulePath).href;
},
});
invariant(
!this._esmoduleRegistry.has(cacheKey),
`Module cache already has entry ${cacheKey}. This is a bug in Jest, please report it!`,
);
this._esmoduleRegistry.set(cacheKey, module);
transformResolve();
} catch (error) {
transformReject(error);
throw error;
}
}
const module = this._esmoduleRegistry.get(cacheKey);
invariant(
module,
'Module cache does not contain module. This is a bug in Jest, please open up an issue',
);
return module;
}