From e9562447323034288f0164526f3aa4cad76b210e Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 23 Feb 2022 09:14:05 +0100 Subject: [PATCH 1/5] feat: make `context` argument to test environments mandatory --- CHANGELOG.md | 2 ++ packages/jest-environment-jsdom/src/index.ts | 6 ++---- packages/jest-environment-node/src/index.ts | 9 +++++++-- packages/jest-environment/src/index.ts | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5db60d539e4..14e7942d41ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,10 @@ - `[jest-environment-jsdom]` [**BREAKING**] Upgrade jsdom to 19.0.0 ([#12290](https://github.com/facebook/jest/pull/12290)) - `[jest-environment-jsdom]` [**BREAKING**] Add default `browser` condition to `exportConditions` for `jsdom` environment ([#11924](https://github.com/facebook/jest/pull/11924)) - `[jest-environment-jsdom]` [**BREAKING**] Pass global config to Jest environment constructor for `jsdom` environment ([#12461](https://github.com/facebook/jest/pull/12461)) +- `[jest-environment-jsdom]` [**BREAKING**] Second argument `context` to constructor is mandatory ([#12469](https://github.com/facebook/jest/pull/12469)) - `[jest-environment-node]` [**BREAKING**] Add default `node` and `node-addon` conditions to `exportConditions` for `node` environment ([#11924](https://github.com/facebook/jest/pull/11924)) - `[jest-environment-node]` [**BREAKING**] Pass global config to Jest environment constructor for `node` environment ([#12461](https://github.com/facebook/jest/pull/12461)) +- `[jest-environment-node]` [**BREAKING**] Second argument `context` to constructor is mandatory ([#12469](https://github.com/facebook/jest/pull/12469)) - `[@jest/expect]` New module which extends `expect` with `jest-snapshot` matchers ([#12404](https://github.com/facebook/jest/pull/12404), [#12410](https://github.com/facebook/jest/pull/12410), [#12418](https://github.com/facebook/jest/pull/12418)) - `[@jest/expect-utils]` New module exporting utils for `expect` ([#12323](https://github.com/facebook/jest/pull/12323)) - `[jest-mock]` Improve `isMockFunction` to infer types of passed function ([#12442](https://github.com/facebook/jest/pull/12442)) diff --git a/packages/jest-environment-jsdom/src/index.ts b/packages/jest-environment-jsdom/src/index.ts index 27f0c6dde71d..6134b6136c63 100644 --- a/packages/jest-environment-jsdom/src/index.ts +++ b/packages/jest-environment-jsdom/src/index.ts @@ -34,7 +34,7 @@ export default class JSDOMEnvironment implements JestEnvironment { private errorEventListener: ((event: Event & {error: Error}) => void) | null; moduleMocker: ModuleMocker | null; - constructor(config: JestEnvironmentConfig, options?: EnvironmentContext) { + constructor(config: JestEnvironmentConfig, context: EnvironmentContext) { const {projectConfig} = config; this.dom = new JSDOM( typeof projectConfig.testEnvironmentOptions.html === 'string' @@ -50,9 +50,7 @@ export default class JSDOMEnvironment implements JestEnvironment { : undefined, runScripts: 'dangerously', url: projectConfig.testURL, - virtualConsole: new VirtualConsole().sendTo( - options?.console || console, - ), + virtualConsole: new VirtualConsole().sendTo(context.console ?? console), ...projectConfig.testEnvironmentOptions, }, ); diff --git a/packages/jest-environment-node/src/index.ts b/packages/jest-environment-node/src/index.ts index 21382dacd404..e49d7b162c00 100644 --- a/packages/jest-environment-node/src/index.ts +++ b/packages/jest-environment-node/src/index.ts @@ -6,7 +6,11 @@ */ import {Context, createContext, runInContext} from 'vm'; -import type {JestEnvironment, JestEnvironmentConfig} from '@jest/environment'; +import type { + EnvironmentContext, + JestEnvironment, + JestEnvironmentConfig, +} from '@jest/environment'; import {LegacyFakeTimers, ModernFakeTimers} from '@jest/fake-timers'; import type {Global} from '@jest/types'; import {ModuleMocker} from 'jest-mock'; @@ -25,7 +29,8 @@ export default class NodeEnvironment implements JestEnvironment { global: Global.Global; moduleMocker: ModuleMocker | null; - constructor(config: JestEnvironmentConfig) { + // while `context` is unused, it should always be passed + constructor(config: JestEnvironmentConfig, _context: EnvironmentContext) { const {projectConfig} = config; this.context = createContext(); const global = (this.global = runInContext( diff --git a/packages/jest-environment/src/index.ts b/packages/jest-environment/src/index.ts index 1cfd2f47f473..c3de797637ba 100644 --- a/packages/jest-environment/src/index.ts +++ b/packages/jest-environment/src/index.ts @@ -34,7 +34,7 @@ export interface JestEnvironmentConfig { } export declare class JestEnvironment { - constructor(config: JestEnvironmentConfig, context?: EnvironmentContext); + constructor(config: JestEnvironmentConfig, context: EnvironmentContext); global: Global.Global; fakeTimers: LegacyFakeTimers | null; fakeTimersModern: ModernFakeTimers | null; From 236fe5e6625e4084154bd62b984d0f84352c6814 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 23 Feb 2022 09:24:47 +0100 Subject: [PATCH 2/5] repl --- packages/jest-repl/src/cli/runtime-cli.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/jest-repl/src/cli/runtime-cli.ts b/packages/jest-repl/src/cli/runtime-cli.ts index 909a30a067cf..37b0350b1f75 100644 --- a/packages/jest-repl/src/cli/runtime-cli.ts +++ b/packages/jest-repl/src/cli/runtime-cli.ts @@ -80,14 +80,18 @@ export async function run( projectConfig.testEnvironment, ); - const environment = new Environment({ - globalConfig, - projectConfig, - }); + const customConsole = new CustomConsole(process.stdout, process.stderr); + const environment = new Environment( + { + globalConfig, + projectConfig, + }, + {console: customConsole, docblockPragmas: {}, testPath: filePath}, + ); setGlobal( environment.global as unknown as typeof globalThis, 'console', - new CustomConsole(process.stdout, process.stderr), + customConsole, ); setGlobal( environment.global as unknown as typeof globalThis, From a782735b0ff75a01b056190073c091993528adc2 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 23 Feb 2022 09:27:05 +0100 Subject: [PATCH 3/5] chore: tweak `setGlobal` types --- packages/jest-repl/src/cli/runtime-cli.ts | 18 +++--------------- packages/jest-runner/src/runTest.ts | 6 +----- packages/jest-util/src/setGlobal.ts | 4 +++- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/packages/jest-repl/src/cli/runtime-cli.ts b/packages/jest-repl/src/cli/runtime-cli.ts index 37b0350b1f75..c5c444e3de5b 100644 --- a/packages/jest-repl/src/cli/runtime-cli.ts +++ b/packages/jest-repl/src/cli/runtime-cli.ts @@ -88,21 +88,9 @@ export async function run( }, {console: customConsole, docblockPragmas: {}, testPath: filePath}, ); - setGlobal( - environment.global as unknown as typeof globalThis, - 'console', - customConsole, - ); - setGlobal( - environment.global as unknown as typeof globalThis, - 'jestProjectConfig', - projectConfig, - ); - setGlobal( - environment.global as unknown as typeof globalThis, - 'jestGlobalConfig', - globalConfig, - ); + setGlobal(environment.global, 'console', customConsole); + setGlobal(environment.global, 'jestProjectConfig', projectConfig); + setGlobal(environment.global, 'jestGlobalConfig', globalConfig); const runtime = new Runtime( projectConfig, diff --git a/packages/jest-runner/src/runTest.ts b/packages/jest-runner/src/runTest.ts index 83c0c7695571..9e0e06f9f8ae 100644 --- a/packages/jest-runner/src/runTest.ts +++ b/packages/jest-runner/src/runTest.ts @@ -162,11 +162,7 @@ async function runTestInternal( ? new LeakDetector(environment) : null; - setGlobal( - environment.global as unknown as typeof globalThis, - 'console', - testConsole, - ); + setGlobal(environment.global, 'console', testConsole); const runtime = new Runtime( projectConfig, diff --git a/packages/jest-util/src/setGlobal.ts b/packages/jest-util/src/setGlobal.ts index 18f6cf4c1067..78fe7eb75c87 100644 --- a/packages/jest-util/src/setGlobal.ts +++ b/packages/jest-util/src/setGlobal.ts @@ -5,8 +5,10 @@ * LICENSE file in the root directory of this source tree. */ +import type {Global} from '@jest/types'; + export default function setGlobal( - globalToMutate: typeof globalThis, + globalToMutate: typeof globalThis | Global.Global, key: string, value: unknown, ): void { From 6314bbbd41c86fcf5c3c158f45bdd622a0de4552 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 23 Feb 2022 09:28:44 +0100 Subject: [PATCH 4/5] no fallback --- packages/jest-environment-jsdom/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/jest-environment-jsdom/src/index.ts b/packages/jest-environment-jsdom/src/index.ts index 6134b6136c63..6be6adab7683 100644 --- a/packages/jest-environment-jsdom/src/index.ts +++ b/packages/jest-environment-jsdom/src/index.ts @@ -50,7 +50,7 @@ export default class JSDOMEnvironment implements JestEnvironment { : undefined, runScripts: 'dangerously', url: projectConfig.testURL, - virtualConsole: new VirtualConsole().sendTo(context.console ?? console), + virtualConsole: new VirtualConsole().sendTo(context.console), ...projectConfig.testEnvironmentOptions, }, ); From 3095aadf15258b6f11aec7e87509d80f8f775b85 Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Wed, 23 Feb 2022 09:57:21 +0100 Subject: [PATCH 5/5] unit --- .../src/__tests__/jsdom_environment.test.ts | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts b/packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts index dfc48b6ab017..f724598efebc 100644 --- a/packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts +++ b/packages/jest-environment-jsdom/src/__tests__/jsdom_environment.test.ts @@ -10,10 +10,13 @@ import JSDomEnvironment from '../'; describe('JSDomEnvironment', () => { it('should configure setTimeout/setInterval to use the browser api', () => { - const env = new JSDomEnvironment({ - globalConfig: makeGlobalConfig(), - projectConfig: makeProjectConfig(), - }); + const env = new JSDomEnvironment( + { + globalConfig: makeGlobalConfig(), + projectConfig: makeProjectConfig(), + }, + {console, docblockPragmas: {}, testPath: __filename}, + ); env.fakeTimers!.useFakeTimers(); @@ -26,23 +29,29 @@ describe('JSDomEnvironment', () => { }); it('has modern fake timers implementation', () => { - const env = new JSDomEnvironment({ - globalConfig: makeGlobalConfig(), - projectConfig: makeProjectConfig(), - }); + const env = new JSDomEnvironment( + { + globalConfig: makeGlobalConfig(), + projectConfig: makeProjectConfig(), + }, + {console, docblockPragmas: {}, testPath: __filename}, + ); expect(env.fakeTimersModern).toBeDefined(); }); it('should respect userAgent option', () => { - const env = new JSDomEnvironment({ - globalConfig: makeGlobalConfig(), - projectConfig: makeProjectConfig({ - testEnvironmentOptions: { - userAgent: 'foo', - }, - }), - }); + const env = new JSDomEnvironment( + { + globalConfig: makeGlobalConfig(), + projectConfig: makeProjectConfig({ + testEnvironmentOptions: { + userAgent: 'foo', + }, + }), + }, + {console, docblockPragmas: {}, testPath: __filename}, + ); expect(env.dom.window.navigator.userAgent).toEqual('foo'); }); @@ -60,10 +69,13 @@ describe('JSDomEnvironment', () => { * will be called, so please make sure the global.document is still available at this point. */ it('should not set the global.document to null too early', () => { - const env = new JSDomEnvironment({ - globalConfig: makeGlobalConfig(), - projectConfig: makeProjectConfig(), - }); + const env = new JSDomEnvironment( + { + globalConfig: makeGlobalConfig(), + projectConfig: makeProjectConfig(), + }, + {console, docblockPragmas: {}, testPath: __filename}, + ); const originalCloseFn = env.global.close.bind(env.global); env.global.close = () => {