summaryrefslogtreecommitdiff
path: root/ext/node/polyfills/00_globals.js
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-03-20 14:05:13 -0400
committerGitHub <noreply@github.com>2023-03-20 14:05:13 -0400
commitcd53ab5427811bddbed1c30d3733e1df87bb23f9 (patch)
tree0e2ea8e1b45f2d1d4acd20b666ae1d52d40940c6 /ext/node/polyfills/00_globals.js
parentd78db7c0910aded010c2faee9a8c0f128f513985 (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.js72
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 };