From cd53ab5427811bddbed1c30d3733e1df87bb23f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20Iwa=C5=84czuk?= Date: Mon, 20 Mar 2023 14:05:13 -0400 Subject: refactor(ext/node): untangle dependencies between js files (#18284) Moving some code around in `ext/node` is it's a bit better well defined and makes it possible for others to embed it. I expect to see no difference in startup perf with this change. --- ext/node/polyfills/00_globals.js | 72 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 ext/node/polyfills/00_globals.js (limited to 'ext/node/polyfills/00_globals.js') diff --git a/ext/node/polyfills/00_globals.js b/ext/node/polyfills/00_globals.js new file mode 100644 index 000000000..9952d86aa --- /dev/null +++ b/ext/node/polyfills/00_globals.js @@ -0,0 +1,72 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +// deno-lint-ignore-file + +const primordials = globalThis.__bootstrap.primordials; +const { + ArrayPrototypeFilter, + Proxy, + ReflectDefineProperty, + ReflectDeleteProperty, + ReflectGet, + ReflectGetOwnPropertyDescriptor, + ReflectHas, + ReflectOwnKeys, + ReflectSet, + Set, + SetPrototypeHas, +} = primordials; + +const nodeGlobals = {}; +const nodeGlobalThis = new Proxy(globalThis, { + get(target, prop) { + if (ReflectHas(nodeGlobals, prop)) { + return ReflectGet(nodeGlobals, prop); + } else { + return ReflectGet(target, prop); + } + }, + set(target, prop, value) { + if (ReflectHas(nodeGlobals, prop)) { + return ReflectSet(nodeGlobals, prop, value); + } else { + return ReflectSet(target, prop, value); + } + }, + has(target, prop) { + return ReflectHas(nodeGlobals, prop) || ReflectHas(target, prop); + }, + deleteProperty(target, prop) { + const nodeDeleted = ReflectDeleteProperty(nodeGlobals, prop); + const targetDeleted = ReflectDeleteProperty(target, prop); + return nodeDeleted || targetDeleted; + }, + ownKeys(target) { + const targetKeys = ReflectOwnKeys(target); + const nodeGlobalsKeys = ReflectOwnKeys(nodeGlobals); + const nodeGlobalsKeySet = new Set(nodeGlobalsKeys); + return [ + ...ArrayPrototypeFilter( + targetKeys, + (k) => !SetPrototypeHas(nodeGlobalsKeySet, k), + ), + ...nodeGlobalsKeys, + ]; + }, + defineProperty(target, prop, desc) { + if (ReflectHas(nodeGlobals, prop)) { + return ReflectDefineProperty(nodeGlobals, prop, desc); + } else { + return ReflectDefineProperty(target, prop, desc); + } + }, + getOwnPropertyDescriptor(target, prop) { + if (ReflectHas(nodeGlobals, prop)) { + return ReflectGetOwnPropertyDescriptor(nodeGlobals, prop); + } else { + return ReflectGetOwnPropertyDescriptor(target, prop); + } + }, +}); + +export { nodeGlobals, nodeGlobalThis }; -- cgit v1.2.3