From 8cdb4baf4b92ded8ea9cb5e671e2ab645eba1f0d Mon Sep 17 00:00:00 2001 From: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> Date: Sat, 17 Sep 2022 17:13:39 +0200 Subject: [PATCH] fixup! esm,loaders: tidy ESMLoader internals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ObjectCreate(null) → {__proto__:null} --- lib/internal/modules/esm/assert.js | 4 +--- .../modules/esm/create_dynamic_module.js | 5 ++--- lib/internal/modules/esm/get_format.js | 7 +++---- lib/internal/modules/esm/loader.js | 17 ++++++++--------- lib/internal/modules/esm/module_job.js | 3 +-- lib/internal/modules/run_main.js | 3 +-- lib/internal/process/esm_loader.js | 3 +-- test/es-module/test-esm-loader-hooks.mjs | 8 ++++---- 8 files changed, 21 insertions(+), 29 deletions(-) diff --git a/lib/internal/modules/esm/assert.js b/lib/internal/modules/esm/assert.js index f0f8387bea1cbf..27ab0711923719 100644 --- a/lib/internal/modules/esm/assert.js +++ b/lib/internal/modules/esm/assert.js @@ -3,7 +3,6 @@ const { ArrayPrototypeFilter, ArrayPrototypeIncludes, - ObjectCreate, ObjectValues, ObjectPrototypeHasOwnProperty, } = primordials; @@ -52,8 +51,7 @@ const supportedAssertionTypes = ArrayPrototypeFilter( * @returns {true} * @throws {TypeError} If the format and assertion type are incompatible. */ -function validateAssertions(url, format, - importAssertions = ObjectCreate(null)) { +function validateAssertions(url, format, importAssertions = { __proto__: null }) { const validType = formatTypeMap[format]; switch (validType) { diff --git a/lib/internal/modules/esm/create_dynamic_module.js b/lib/internal/modules/esm/create_dynamic_module.js index f7c20083b6c918..1ad9848e64631c 100644 --- a/lib/internal/modules/esm/create_dynamic_module.js +++ b/lib/internal/modules/esm/create_dynamic_module.js @@ -4,7 +4,6 @@ const { ArrayPrototypeJoin, ArrayPrototypeMap, JSONStringify, - ObjectCreate, SafeSet, } = primordials; @@ -40,12 +39,12 @@ import.meta.done(); const readyfns = new SafeSet(); const reflect = { - exports: ObjectCreate(null), + exports: { __proto__: null }, onReady: (cb) => { readyfns.add(cb); }, }; if (imports.length) - reflect.imports = ObjectCreate(null); + reflect.imports = { __proto__: null }; callbackMap.set(m, { initializeImportMeta: (meta, wrap) => { diff --git a/lib/internal/modules/esm/get_format.js b/lib/internal/modules/esm/get_format.js index 950a769227c03f..a7329d279bb075 100644 --- a/lib/internal/modules/esm/get_format.js +++ b/lib/internal/modules/esm/get_format.js @@ -1,8 +1,6 @@ 'use strict'; const { RegExpPrototypeExec, - ObjectAssign, - ObjectCreate, ObjectPrototypeHasOwnProperty, PromisePrototypeThen, PromiseResolve, @@ -25,13 +23,14 @@ const { getPackageType, getPackageScopeConfig } = require('internal/modules/esm/ const { URL, fileURLToPath } = require('internal/url'); const { ERR_UNKNOWN_FILE_EXTENSION } = require('internal/errors').codes; -const protocolHandlers = ObjectAssign(ObjectCreate(null), { +const protocolHandlers = { + '__proto__': null, 'data:': getDataProtocolModuleFormat, 'file:': getFileProtocolModuleFormat, 'http:': getHttpProtocolModuleFormat, 'https:': getHttpProtocolModuleFormat, 'node:'() { return 'builtin'; }, -}); +}; /** * @param {URL} parsed diff --git a/lib/internal/modules/esm/loader.js b/lib/internal/modules/esm/loader.js index 5a5b0df8a47fbb..17ddcd639c5550 100644 --- a/lib/internal/modules/esm/loader.js +++ b/lib/internal/modules/esm/loader.js @@ -10,7 +10,6 @@ const { ArrayPrototypePush, FunctionPrototypeCall, ObjectAssign, - ObjectCreate, ObjectDefineProperty, ObjectSetPrototypeOf, RegExpPrototypeExec, @@ -269,7 +268,7 @@ class ESMLoader { transformSource, }) { const obsoleteHooks = []; - const acceptedHooks = ObjectCreate(null); + const acceptedHooks = { __proto__: null }; if (getGlobalPreloadCode) { globalPreload ??= getGlobalPreloadCode; @@ -414,7 +413,7 @@ class ESMLoader { // We can skip cloning if there are no user-provided loaders because // the Node.js default resolve hook does not use import assertions. importAssertionsForResolve = ObjectAssign( - ObjectCreate(null), + { __proto__: null }, importAssertions, ); } @@ -531,11 +530,11 @@ class ESMLoader { if (!wasArr) { return namespaces[0]; } // We can skip the pairing below for (let i = 0; i < count; i++) { - const namespace = ObjectCreate(null); - namespace.url = specifiers[i]; - namespace.exports = namespaces[i]; - - namespaces[i] = namespace; + namespaces[i] = { + __proto__: null, + url: specifiers[i], + exports: namespaces[i], + }; } return namespaces; @@ -787,7 +786,7 @@ class ESMLoader { async resolve( originalSpecifier, parentURL, - importAssertions = ObjectCreate(null) + importAssertions = { __proto__: null } ) { const isMain = parentURL === undefined; diff --git a/lib/internal/modules/esm/module_job.js b/lib/internal/modules/esm/module_job.js index 2dd69b32f77cb5..cdbdbdd2427e34 100644 --- a/lib/internal/modules/esm/module_job.js +++ b/lib/internal/modules/esm/module_job.js @@ -5,7 +5,6 @@ const { ArrayPrototypePush, ArrayPrototypeSome, FunctionPrototype, - ObjectCreate, ObjectSetPrototypeOf, PromiseResolve, PromisePrototypeThen, @@ -50,7 +49,7 @@ const isCommonJSGlobalLikeNotDefinedError = (errorMessage) => class ModuleJob { // `loader` is the Loader instance used for loading dependencies. // `moduleProvider` is a function - constructor(loader, url, importAssertions = ObjectCreate(null), + constructor(loader, url, importAssertions = { __proto: null }, moduleProvider, isMain, inspectBrk) { this.loader = loader; this.importAssertions = importAssertions; diff --git a/lib/internal/modules/run_main.js b/lib/internal/modules/run_main.js index daaa153516c424..86938a27b6ca1f 100644 --- a/lib/internal/modules/run_main.js +++ b/lib/internal/modules/run_main.js @@ -1,7 +1,6 @@ 'use strict'; const { - ObjectCreate, StringPrototypeEndsWith, } = primordials; const CJSLoader = require('internal/modules/cjs/loader'); @@ -60,7 +59,7 @@ function runMainESM(mainPath) { handleMainPromise(loadESM((esmLoader) => { const main = path.isAbsolute(mainPath) ? pathToFileURL(mainPath).href : mainPath; - return esmLoader.import(main, undefined, ObjectCreate(null)); + return esmLoader.import(main, undefined, { __proto__: null }); })); } diff --git a/lib/internal/process/esm_loader.js b/lib/internal/process/esm_loader.js index 473cea48cafe64..73b421e9bb6986 100644 --- a/lib/internal/process/esm_loader.js +++ b/lib/internal/process/esm_loader.js @@ -2,7 +2,6 @@ const { ArrayIsArray, - ObjectCreate, } = primordials; const { @@ -92,7 +91,7 @@ function loadModulesInIsolation(specifiers, loaders = []) { return internalEsmLoader.import( specifiers, pathToFileURL(cwd).href, - ObjectCreate(null), + { __proto__: null }, ); } diff --git a/test/es-module/test-esm-loader-hooks.mjs b/test/es-module/test-esm-loader-hooks.mjs index d314a4d9aa0a5e..2704fe1a52ccce 100644 --- a/test/es-module/test-esm-loader-hooks.mjs +++ b/test/es-module/test-esm-loader-hooks.mjs @@ -12,10 +12,10 @@ const { ESMLoader } = esmLoaderModule; const esmLoader = new ESMLoader(); const originalSpecifier = 'foo/bar'; - const importAssertions = Object.assign( - Object.create(null), - { type: 'json' }, - ); + const importAssertions = { + __proto__: null, + type: 'json', + }; const parentURL = 'file:///entrypoint.js'; const resolvedURL = 'file:///foo/bar.js'; const suggestedFormat = 'test';