From 5c08f4ffd688d7164a972b55904c30c1bb7be0d4 Mon Sep 17 00:00:00 2001 From: overlookmotel Date: Sat, 31 Dec 2022 11:01:50 +0000 Subject: [PATCH] fix(jest-environment-node): Fix non-configurable globals (#13687) --- CHANGELOG.md | 1 + packages/jest-environment-node/src/index.ts | 74 +++++++++++++-------- 2 files changed, 46 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c4c69ff3817..12947b26e001 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ ### Fixes +- `[jest-environment-node]` fix non-configurable globals ([#13687](https://github.com/facebook/jest/pull/13687)) - `[@jest/expect-utils]` `toMatchObject` should handle `Symbol` properties ([#13639](https://github.com/facebook/jest/pull/13639)) - `[jest-resolve]` Add global paths to `require.resolve.paths` ([#13633](https://github.com/facebook/jest/pull/13633)) diff --git a/packages/jest-environment-node/src/index.ts b/packages/jest-environment-node/src/index.ts index a48507a99e2c..f6cdf550083d 100644 --- a/packages/jest-environment-node/src/index.ts +++ b/packages/jest-environment-node/src/index.ts @@ -78,35 +78,51 @@ export default class NodeEnvironment implements JestEnvironment { const contextGlobals = new Set(Object.getOwnPropertyNames(global)); for (const [nodeGlobalsKey, descriptor] of nodeGlobals) { if (!contextGlobals.has(nodeGlobalsKey)) { - Object.defineProperty(global, nodeGlobalsKey, { - configurable: descriptor.configurable, - enumerable: descriptor.enumerable, - get() { - // @ts-expect-error: no index signature - const val = globalThis[nodeGlobalsKey] as unknown; - - // override lazy getter - Object.defineProperty(global, nodeGlobalsKey, { - configurable: descriptor.configurable, - enumerable: descriptor.enumerable, - value: val, - writable: - descriptor.writable === true || - // Node 19 makes performance non-readable. This is probably not the correct solution. - nodeGlobalsKey === 'performance', - }); - return val; - }, - set(val: unknown) { - // override lazy getter - Object.defineProperty(global, nodeGlobalsKey, { - configurable: descriptor.configurable, - enumerable: descriptor.enumerable, - value: val, - writable: true, - }); - }, - }); + if (descriptor.configurable) { + Object.defineProperty(global, nodeGlobalsKey, { + configurable: true, + enumerable: descriptor.enumerable, + get() { + // @ts-expect-error: no index signature + const val = globalThis[nodeGlobalsKey] as unknown; + + // override lazy getter + Object.defineProperty(global, nodeGlobalsKey, { + configurable: true, + enumerable: descriptor.enumerable, + value: val, + writable: + descriptor.writable === true || + // Node 19 makes performance non-readable. This is probably not the correct solution. + nodeGlobalsKey === 'performance', + }); + return val; + }, + set(val: unknown) { + // override lazy getter + Object.defineProperty(global, nodeGlobalsKey, { + configurable: true, + enumerable: descriptor.enumerable, + value: val, + writable: true, + }); + }, + }); + } else if ('value' in descriptor) { + Object.defineProperty(global, nodeGlobalsKey, { + configurable: false, + enumerable: descriptor.enumerable, + writable: descriptor.writable, + value: descriptor.value + }); + } else { + Object.defineProperty(global, nodeGlobalsKey, { + configurable: false, + enumerable: descriptor.enumerable, + get: descriptor.get, + set: descriptor.set + }); + } } }