Skip to content

Commit

Permalink
lib: enforce using primordials.globalThis instead of global
Browse files Browse the repository at this point in the history
PR-URL: #38230
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>
  • Loading branch information
aduh95 committed Apr 17, 2021
1 parent 7d688d4 commit d756d2b
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 30 deletions.
2 changes: 2 additions & 0 deletions lib/.eslintrc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
48 changes: 25 additions & 23 deletions lib/internal/bootstrap/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ const {
ReflectGet,
ReflectSet,
SymbolToStringTag,
globalThis,
} = primordials;
const config = internalBinding('config');
const { deprecate } = require('internal/util');
Expand Down Expand Up @@ -189,61 +190,62 @@ 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);

const {
AbortController,
AbortSignal,
} = require('internal/abort_controller');
exposeInterface(global, 'AbortController', AbortController);
exposeInterface(global, 'AbortSignal', AbortSignal);
exposeInterface(globalThis, 'AbortController', AbortController);
exposeInterface(globalThis, 'AbortSignal', AbortSignal);

const {
EventTarget,
Event,
} = require('internal/event_target');
exposeInterface(global, 'EventTarget', EventTarget);
exposeInterface(global, 'Event', Event);
exposeInterface(globalThis, 'EventTarget', EventTarget);
exposeInterface(globalThis, 'Event', Event);
const {
MessageChannel,
MessagePort,
MessageEvent,
} = require('internal/worker/io');
exposeInterface(global, 'MessageChannel', MessageChannel);
exposeInterface(global, 'MessagePort', MessagePort);
exposeInterface(global, 'MessageEvent', MessageEvent);
exposeInterface(globalThis, 'MessageChannel', MessageChannel);
exposeInterface(globalThis, 'MessagePort', MessagePort);
exposeInterface(globalThis, 'MessageEvent', MessageEvent);

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

defineLazyGlobal(global, 'performance', () => {
defineLazyGlobal(globalThis, 'performance', () => {
const { performance } = require('perf_hooks');
return performance;
});

// 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
Expand Down Expand Up @@ -388,7 +390,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,
Expand All @@ -397,7 +399,7 @@ function setupProcessObject() {
}

function setupGlobalProxy() {
ObjectDefineProperty(global, SymbolToStringTag, {
ObjectDefineProperty(globalThis, SymbolToStringTag, {
value: 'global',
writable: false,
enumerable: false,
Expand All @@ -418,7 +420,7 @@ function setupBuffer() {
delete bufferBinding.setBufferPrototype;
delete bufferBinding.zeroFill;

ObjectDefineProperties(global, {
ObjectDefineProperties(globalThis, {
'Buffer': {
value: Buffer,
enumerable: false,
Expand Down
5 changes: 3 additions & 2 deletions lib/internal/bootstrap/pre_execution.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const {
SafeMap,
SafeWeakMap,
StringPrototypeStartsWith,
globalThis,
} = primordials;

const {
Expand Down Expand Up @@ -302,7 +303,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;
},
Expand All @@ -314,7 +315,7 @@ function initializeDeprecations() {
});

let _Buffer = Buffer;
ObjectDefineProperty(global, 'Buffer', {
ObjectDefineProperty(globalThis, 'Buffer', {
get() {
return _Buffer;
},
Expand Down
6 changes: 5 additions & 1 deletion lib/internal/main/eval_string.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand All @@ -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');
Expand Down
3 changes: 3 additions & 0 deletions lib/internal/per_context/primordials.js
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ function copyPrototype(src, dest, prefix) {
'Math',
'Reflect',
].forEach((name) => {
// eslint-disable-next-line no-restricted-globals
copyPropsRenamed(global[name], primordials, name);
});

Expand Down Expand Up @@ -198,6 +199,7 @@ function copyPrototype(src, dest, prefix) {
'WeakRef',
'WeakSet',
].forEach((name) => {
// eslint-disable-next-line no-restricted-globals
const original = global[name];
primordials[name] = original;
copyPropsRenamed(original, primordials, name);
Expand All @@ -210,6 +212,7 @@ function copyPrototype(src, dest, prefix) {
[
'Promise',
].forEach((name) => {
// eslint-disable-next-line no-restricted-globals
const original = global[name];
primordials[name] = original;
copyPropsRenamedBound(original, primordials, name);
Expand Down
3 changes: 2 additions & 1 deletion lib/internal/util/inspect.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ const {
TypedArrayPrototypeGetLength,
TypedArrayPrototypeGetSymbolToStringTag,
Uint8Array,
globalThis,
uncurryThis,
} = primordials;

Expand Down Expand Up @@ -144,7 +145,7 @@ let hexSlice;

const builtInObjects = new SafeSet(
ArrayPrototypeFilter(
ObjectGetOwnPropertyNames(global),
ObjectGetOwnPropertyNames(globalThis),
(e) => RegExpPrototypeTest(/^[A-Z][a-zA-Z0-9]+$/, e)
)
);
Expand Down
7 changes: 4 additions & 3 deletions lib/repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ const {
Symbol,
SyntaxError,
SyntaxErrorPrototype,
globalThis,
} = primordials;

const {
Expand Down Expand Up @@ -1009,7 +1010,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');
Expand All @@ -1021,11 +1022,11 @@ REPLServer.prototype.createContext = function() {
}, () => {
context = vm.createContext();
});
ArrayPrototypeForEach(ObjectGetOwnPropertyNames(global), (name) => {
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;
Expand Down

0 comments on commit d756d2b

Please sign in to comment.