diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-03-20 14:05:13 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-20 14:05:13 -0400 |
commit | cd53ab5427811bddbed1c30d3733e1df87bb23f9 (patch) | |
tree | 0e2ea8e1b45f2d1d4acd20b666ae1d52d40940c6 /ext/node/polyfills/00_globals.js | |
parent | d78db7c0910aded010c2faee9a8c0f128f513985 (diff) |
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.
Diffstat (limited to 'ext/node/polyfills/00_globals.js')
-rw-r--r-- | ext/node/polyfills/00_globals.js | 72 |
1 files changed, 72 insertions, 0 deletions
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 }; |