From a95f7a0c2558ab22aade93b9905c6f47a3aa6ab6 Mon Sep 17 00:00:00 2001 From: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> Date: Fri, 18 Feb 2022 19:55:58 +0100 Subject: [PATCH] esm: remove erroneous `context.parentURL` property passed to `load` hook PR-URL: https://github.com/nodejs/node/pull/41975 Reviewed-By: Geoffrey Booth Reviewed-By: Benjamin Gruenbaum Reviewed-By: Antoine du Hamel --- lib/internal/modules/esm/loader.js | 1 - test/es-module/test-esm-loader-hooks.mjs | 76 ++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 test/es-module/test-esm-loader-hooks.mjs diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index d5e0b61af6a309..61e609d9ad6c62 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -282,7 +282,6 @@ class ESMLoader { } = await this.load(url, { format, importAssertions, - parentURL, }); const translator = translators.get(finalFormat); diff --git a/test/es-module/test-esm-loader-hooks.mjs b/test/es-module/test-esm-loader-hooks.mjs new file mode 100644 index 00000000000000..57a203342ac49c --- /dev/null +++ b/test/es-module/test-esm-loader-hooks.mjs @@ -0,0 +1,76 @@ +// Flags: --expose-internals +import { mustCall } from '../common/index.mjs'; +import esmLoaderModule from 'internal/modules/esm/loader'; +import assert from 'assert'; + +const { ESMLoader } = esmLoaderModule; + +/** + * Verify custom hooks are called with appropriate arguments. + */ +{ + const esmLoader = new ESMLoader(); + + const originalSpecifier = 'foo/bar'; + const importAssertions = Object.assign( + Object.create(null), + { type: 'json' }, + ); + const parentURL = 'file:///entrypoint.js'; + const resolvedURL = 'file:///foo/bar.js'; + const suggestedFormat = 'test'; + + function resolve(specifier, context, defaultResolve) { + assert.strictEqual(specifier, originalSpecifier); + // Ensure `context` has all and only the properties it's supposed to + assert.deepStrictEqual(Object.keys(context), [ + 'conditions', + 'importAssertions', + 'parentURL', + ]); + assert.ok(Array.isArray(context.conditions)); + assert.deepStrictEqual(context.importAssertions, importAssertions); + assert.strictEqual(context.parentURL, parentURL); + assert.strictEqual(typeof defaultResolve, 'function'); + + return { + format: suggestedFormat, + url: resolvedURL, + }; + } + + function load(resolvedURL, context, defaultLoad) { + assert.strictEqual(resolvedURL, resolvedURL); + assert.ok(new URL(resolvedURL)); + // Ensure `context` has all and only the properties it's supposed to + assert.deepStrictEqual(Object.keys(context), [ + 'format', + 'importAssertions', + ]); + assert.strictEqual(context.format, suggestedFormat); + assert.deepStrictEqual(context.importAssertions, importAssertions); + assert.strictEqual(typeof defaultLoad, 'function'); + + // This doesn't matter (just to avoid errors) + return { + format: 'module', + source: '', + }; + } + + const customLoader = { + // Ensure ESMLoader actually calls the custom hooks + resolve: mustCall(resolve), + load: mustCall(load), + }; + + esmLoader.addCustomLoaders(customLoader); + + // Manually trigger hooks (since ESMLoader is not actually running) + const job = await esmLoader.getModuleJob( + originalSpecifier, + parentURL, + importAssertions, + ); + await job.modulePromise; +}