mirror of
https://github.com/zebrajr/node.git
synced 2025-12-06 00:20:08 +01:00
lib: enforce using primordials.globalThis instead of global
PR-URL: https://github.com/nodejs/node/pull/38230 Backport-PR-URL: https://github.com/nodejs/node/pull/39448 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
parent
ea9003a559
commit
d4f96bb926
|
|
@ -29,6 +29,8 @@ rules:
|
|||
- error
|
||||
- name: globalThis
|
||||
message: "Use `const { globalThis } = primordials;` instead of the global."
|
||||
- name: global
|
||||
message: "Use `const { globalThis } = primordials;` instead of `global`."
|
||||
# Custom rules in tools/eslint-rules
|
||||
node-core/lowercase-name-for-primitive: error
|
||||
node-core/non-ascii-character: error
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ const {
|
|||
ObjectGetPrototypeOf,
|
||||
ObjectSetPrototypeOf,
|
||||
SymbolToStringTag,
|
||||
globalThis,
|
||||
} = primordials;
|
||||
const config = internalBinding('config');
|
||||
const { deprecate } = require('internal/util');
|
||||
|
|
@ -119,34 +120,35 @@ if (!config.noBrowserGlobals) {
|
|||
// Override global console from the one provided by the VM
|
||||
// to the one implemented by Node.js
|
||||
// https://console.spec.whatwg.org/#console-namespace
|
||||
exposeNamespace(global, 'console', createGlobalConsole(global.console));
|
||||
exposeNamespace(globalThis, 'console',
|
||||
createGlobalConsole(globalThis.console));
|
||||
|
||||
const { URL, URLSearchParams } = require('internal/url');
|
||||
// https://url.spec.whatwg.org/#url
|
||||
exposeInterface(global, 'URL', URL);
|
||||
exposeInterface(globalThis, 'URL', URL);
|
||||
// https://url.spec.whatwg.org/#urlsearchparams
|
||||
exposeInterface(global, 'URLSearchParams', URLSearchParams);
|
||||
exposeInterface(globalThis, 'URLSearchParams', URLSearchParams);
|
||||
|
||||
const {
|
||||
TextEncoder, TextDecoder
|
||||
} = require('internal/encoding');
|
||||
// https://encoding.spec.whatwg.org/#textencoder
|
||||
exposeInterface(global, 'TextEncoder', TextEncoder);
|
||||
exposeInterface(globalThis, 'TextEncoder', TextEncoder);
|
||||
// https://encoding.spec.whatwg.org/#textdecoder
|
||||
exposeInterface(global, 'TextDecoder', TextDecoder);
|
||||
exposeInterface(globalThis, 'TextDecoder', TextDecoder);
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope
|
||||
const timers = require('timers');
|
||||
defineOperation(global, 'clearInterval', timers.clearInterval);
|
||||
defineOperation(global, 'clearTimeout', timers.clearTimeout);
|
||||
defineOperation(global, 'setInterval', timers.setInterval);
|
||||
defineOperation(global, 'setTimeout', timers.setTimeout);
|
||||
defineOperation(globalThis, 'clearInterval', timers.clearInterval);
|
||||
defineOperation(globalThis, 'clearTimeout', timers.clearTimeout);
|
||||
defineOperation(globalThis, 'setInterval', timers.setInterval);
|
||||
defineOperation(globalThis, 'setTimeout', timers.setTimeout);
|
||||
|
||||
defineOperation(global, 'queueMicrotask', queueMicrotask);
|
||||
defineOperation(globalThis, 'queueMicrotask', queueMicrotask);
|
||||
|
||||
// Non-standard extensions:
|
||||
defineOperation(global, 'clearImmediate', timers.clearImmediate);
|
||||
defineOperation(global, 'setImmediate', timers.setImmediate);
|
||||
defineOperation(globalThis, 'clearImmediate', timers.clearImmediate);
|
||||
defineOperation(globalThis, 'setImmediate', timers.setImmediate);
|
||||
}
|
||||
|
||||
// Set the per-Environment callback that will be called
|
||||
|
|
@ -280,7 +282,7 @@ function setupProcessObject() {
|
|||
value: 'process'
|
||||
});
|
||||
// Make process globally available to users by putting it on the global proxy
|
||||
ObjectDefineProperty(global, 'process', {
|
||||
ObjectDefineProperty(globalThis, 'process', {
|
||||
value: process,
|
||||
enumerable: false,
|
||||
writable: true,
|
||||
|
|
@ -289,7 +291,7 @@ function setupProcessObject() {
|
|||
}
|
||||
|
||||
function setupGlobalProxy() {
|
||||
ObjectDefineProperty(global, SymbolToStringTag, {
|
||||
ObjectDefineProperty(globalThis, SymbolToStringTag, {
|
||||
value: 'global',
|
||||
writable: false,
|
||||
enumerable: false,
|
||||
|
|
@ -306,7 +308,7 @@ function setupBuffer() {
|
|||
delete bufferBinding.setBufferPrototype;
|
||||
delete bufferBinding.zeroFill;
|
||||
|
||||
ObjectDefineProperty(global, 'Buffer', {
|
||||
ObjectDefineProperty(globalThis, 'Buffer', {
|
||||
value: Buffer,
|
||||
enumerable: false,
|
||||
writable: true,
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ const {
|
|||
SafeMap,
|
||||
SafeWeakMap,
|
||||
StringPrototypeStartsWith,
|
||||
globalThis,
|
||||
} = primordials;
|
||||
|
||||
const {
|
||||
|
|
@ -290,7 +291,7 @@ function initializeDeprecations() {
|
|||
// deprecation path for these in ES Modules.
|
||||
// See https://github.com/nodejs/node/pull/26334.
|
||||
let _process = process;
|
||||
ObjectDefineProperty(global, 'process', {
|
||||
ObjectDefineProperty(globalThis, 'process', {
|
||||
get() {
|
||||
return _process;
|
||||
},
|
||||
|
|
@ -302,7 +303,7 @@ function initializeDeprecations() {
|
|||
});
|
||||
|
||||
let _Buffer = Buffer;
|
||||
ObjectDefineProperty(global, 'Buffer', {
|
||||
ObjectDefineProperty(globalThis, 'Buffer', {
|
||||
get() {
|
||||
return _Buffer;
|
||||
},
|
||||
|
|
@ -321,7 +322,7 @@ function initializeAbortController() {
|
|||
AbortController,
|
||||
AbortSignal
|
||||
} = require('internal/abort_controller');
|
||||
ObjectDefineProperties(global, {
|
||||
ObjectDefineProperties(globalThis, {
|
||||
AbortController: {
|
||||
writable: true,
|
||||
enumerable: false,
|
||||
|
|
|
|||
|
|
@ -3,6 +3,10 @@
|
|||
// User passed `-e` or `--eval` arguments to Node without `-i` or
|
||||
// `--interactive`.
|
||||
|
||||
const {
|
||||
globalThis,
|
||||
} = primordials;
|
||||
|
||||
const {
|
||||
prepareMainThreadExecution
|
||||
} = require('internal/bootstrap/pre_execution');
|
||||
|
|
@ -12,7 +16,7 @@ const { addBuiltinLibsToObject } = require('internal/modules/cjs/helpers');
|
|||
const { getOptionValue } = require('internal/options');
|
||||
|
||||
prepareMainThreadExecution();
|
||||
addBuiltinLibsToObject(global);
|
||||
addBuiltinLibsToObject(globalThis);
|
||||
markBootstrapComplete();
|
||||
|
||||
const source = getOptionValue('--eval');
|
||||
|
|
|
|||
|
|
@ -195,6 +195,7 @@ primordials.SafeWeakSet = makeSafe(
|
|||
'Math',
|
||||
'Reflect'
|
||||
].forEach((name) => {
|
||||
// eslint-disable-next-line no-restricted-globals
|
||||
copyPropsRenamed(global[name], primordials, name);
|
||||
});
|
||||
|
||||
|
|
@ -235,6 +236,7 @@ primordials.SafeWeakSet = makeSafe(
|
|||
'WeakMap',
|
||||
'WeakSet',
|
||||
].forEach((name) => {
|
||||
// eslint-disable-next-line no-restricted-globals
|
||||
const original = global[name];
|
||||
primordials[name] = original;
|
||||
copyPropsRenamed(original, primordials, name);
|
||||
|
|
@ -247,6 +249,7 @@ primordials.SafeWeakSet = makeSafe(
|
|||
[
|
||||
'Promise',
|
||||
].forEach((name) => {
|
||||
// eslint-disable-next-line no-restricted-globals
|
||||
const original = global[name];
|
||||
primordials[name] = original;
|
||||
copyPropsRenamedBound(original, primordials, name);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
const {
|
||||
Array,
|
||||
ArrayIsArray,
|
||||
ArrayPrototypeFilter,
|
||||
BigIntPrototypeValueOf,
|
||||
BooleanPrototypeValueOf,
|
||||
DatePrototypeGetTime,
|
||||
|
|
@ -41,7 +42,9 @@ const {
|
|||
ObjectSetPrototypeOf,
|
||||
ReflectApply,
|
||||
RegExp,
|
||||
RegExpPrototypeExec,
|
||||
RegExpPrototypeToString,
|
||||
SafeSet,
|
||||
SafeStringIterator,
|
||||
Set,
|
||||
SetPrototypeGetSize,
|
||||
|
|
@ -55,6 +58,7 @@ const {
|
|||
TypedArrayPrototypeGetLength,
|
||||
TypedArrayPrototypeGetSymbolToStringTag,
|
||||
Uint8Array,
|
||||
globalThis,
|
||||
uncurryThis,
|
||||
} = primordials;
|
||||
|
||||
|
|
@ -120,8 +124,11 @@ const { NativeModule } = require('internal/bootstrap/loaders');
|
|||
|
||||
let hexSlice;
|
||||
|
||||
const builtInObjects = new Set(
|
||||
ObjectGetOwnPropertyNames(global).filter((e) => /^[A-Z][a-zA-Z0-9]+$/.test(e))
|
||||
const builtInObjects = new SafeSet(
|
||||
ArrayPrototypeFilter(
|
||||
ObjectGetOwnPropertyNames(globalThis),
|
||||
(e) => RegExpPrototypeExec(/^[A-Z][a-zA-Z0-9]+$/, e) !== null
|
||||
)
|
||||
);
|
||||
|
||||
// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot
|
||||
|
|
|
|||
10
lib/repl.js
10
lib/repl.js
|
|
@ -43,6 +43,7 @@
|
|||
'use strict';
|
||||
|
||||
const {
|
||||
ArrayPrototypeForEach,
|
||||
Error,
|
||||
MathMax,
|
||||
NumberIsNaN,
|
||||
|
|
@ -67,6 +68,7 @@ const {
|
|||
SyntaxError,
|
||||
SyntaxErrorPrototype,
|
||||
WeakSet,
|
||||
globalThis,
|
||||
} = primordials;
|
||||
|
||||
const {
|
||||
|
|
@ -984,7 +986,7 @@ REPLServer.prototype.close = function close() {
|
|||
REPLServer.prototype.createContext = function() {
|
||||
let context;
|
||||
if (this.useGlobal) {
|
||||
context = global;
|
||||
context = globalThis;
|
||||
} else {
|
||||
sendInspectorCommand((session) => {
|
||||
session.post('Runtime.enable');
|
||||
|
|
@ -996,13 +998,13 @@ REPLServer.prototype.createContext = function() {
|
|||
}, () => {
|
||||
context = vm.createContext();
|
||||
});
|
||||
for (const name of ObjectGetOwnPropertyNames(global)) {
|
||||
ArrayPrototypeForEach(ObjectGetOwnPropertyNames(globalThis), (name) => {
|
||||
// Only set properties that do not already exist as a global builtin.
|
||||
if (!globalBuiltins.has(name)) {
|
||||
ObjectDefineProperty(context, name,
|
||||
ObjectGetOwnPropertyDescriptor(global, name));
|
||||
ObjectGetOwnPropertyDescriptor(globalThis, name));
|
||||
}
|
||||
}
|
||||
});
|
||||
context.global = context;
|
||||
const _console = new Console(this.output);
|
||||
ObjectDefineProperty(context, 'console', {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user