1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-11-25 15:29:32 -05:00
denoland-deno/ext/node/polyfills/00_globals.js
Bartek Iwańczuk cd53ab5427
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.
2023-03-20 14:05:13 -04:00

72 lines
1.9 KiB
JavaScript

// 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 };