From d5991ae05f8a686e9c4923ef7313a45e72fef9fb Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Fri, 18 Nov 2022 17:19:45 +0100 Subject: [PATCH 1/2] Merge pull request #217 from storybookjs/fix/setup-page-not-defined Make setup-page globally available for index.json mode compatibility --- package.json | 1 - playwright/jest-setup.js | 7 +- src/csf/transformCsf.ts | 11 +- src/playwright/hooks.ts | 5 +- src/playwright/transformPlaywright.test.ts | 57 ++++------ src/playwright/transformPlaywright.ts | 23 ++-- .../transformPlaywrightJson.test.ts | 104 ++++++++++-------- src/typings.d.ts | 8 +- 8 files changed, 101 insertions(+), 115 deletions(-) diff --git a/package.json b/package.json index 486fb0d5..375ee1a7 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,6 @@ "can-bind-to-host": "^1.1.1", "commander": "^9.0.0", "expect-playwright": "^0.8.0", - "global": "^4.4.0", "jest": "^28.0.0", "jest-junit": "^14.0.0", "jest-playwright-preset": "^2.0.0", diff --git a/playwright/jest-setup.js b/playwright/jest-setup.js index bf0d2bb4..222efea0 100644 --- a/playwright/jest-setup.js +++ b/playwright/jest-setup.js @@ -1,4 +1,4 @@ -const { getTestRunnerConfig, setPreRender, setPostRender } = require('../dist/cjs'); +const { getTestRunnerConfig, setPreRender, setPostRender, setupPage } = require('../dist/cjs'); const testRunnerConfig = getTestRunnerConfig(process.env.STORYBOOK_CONFIG_DIR); if (testRunnerConfig) { @@ -13,4 +13,7 @@ if (testRunnerConfig) { } } -global.__sbCollectCoverage = process.env.STORYBOOK_COLLECT_COVERAGE === 'true'; +// If the transformed tests need a dependency, it has to be globally available +// in order to work both in defaul (file transformation) and stories/index.json mode. +globalThis.__sbSetupPage = setupPage; +globalThis.__sbCollectCoverage = process.env.STORYBOOK_COLLECT_COVERAGE === 'true'; diff --git a/src/csf/transformCsf.ts b/src/csf/transformCsf.ts index 1a5f207d..4356fe9d 100644 --- a/src/csf/transformCsf.ts +++ b/src/csf/transformCsf.ts @@ -5,8 +5,6 @@ import generate from '@babel/generator'; import { toId, storyNameFromExport } from '@storybook/csf'; import dedent from 'ts-dedent'; -const logger = console; - export interface TestContext { storyExport?: t.Identifier; name: t.Literal; @@ -15,11 +13,10 @@ export interface TestContext { } type TemplateResult = t.Statement | t.Statement[]; type FilePrefixer = () => TemplateResult; -type TestPrefixer = (context: TestContext) => TemplateResult; +export type TestPrefixer = (context: TestContext) => TemplateResult; interface TransformOptions { clearBody?: boolean; - filePrefixer?: FilePrefixer; beforeEachPrefixer?: FilePrefixer; testPrefixer?: TestPrefixer; insertTestIfEmpty?: boolean; @@ -87,7 +84,6 @@ const makeArray = (templateResult: TemplateResult) => export const transformCsf = ( code: string, { - filePrefixer, clearBody = false, testPrefixer, beforeEachPrefixer, @@ -124,11 +120,6 @@ export const transformCsf = ( let result = ''; - // FIXME: insert between imports - if (filePrefixer) { - const { code: prefixCode } = generate(t.program(makeArray(filePrefixer())), {}); - result = `${prefixCode}\n`; - } if (!clearBody) result = `${result}${code}\n`; if (allTests.length) { const describe = makeDescribe( diff --git a/src/playwright/hooks.ts b/src/playwright/hooks.ts index 52cc1930..67249eed 100644 --- a/src/playwright/hooks.ts +++ b/src/playwright/hooks.ts @@ -1,4 +1,3 @@ -import global from 'global'; import type { Page } from 'playwright'; import type { StoryContext } from '@storybook/csf'; @@ -17,11 +16,11 @@ export interface TestRunnerConfig { } export const setPreRender = (preRender: TestHook) => { - global.__sbPreRender = preRender; + globalThis.__sbPreRender = preRender; }; export const setPostRender = (postRender: TestHook) => { - global.__sbPostRender = postRender; + globalThis.__sbPostRender = postRender; }; export const getStoryContext = async (page: Page, context: TestContext): Promise => { diff --git a/src/playwright/transformPlaywright.test.ts b/src/playwright/transformPlaywright.test.ts index 63967496..ae63647c 100644 --- a/src/playwright/transformPlaywright.test.ts +++ b/src/playwright/transformPlaywright.test.ts @@ -47,12 +47,6 @@ describe('Playwright', () => { filename ) ).toMatchInlineSnapshot(` - import global from 'global'; - - const { - setupPage - } = require('@storybook/test-runner'); - if (!require.main) { describe("Example/foo/bar", () => { describe("A", () => { @@ -73,8 +67,8 @@ describe('Playwright', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -84,11 +78,11 @@ describe('Playwright', () => { id: "example-foo-bar--a" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -107,8 +101,9 @@ describe('Playwright', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/foo/bar"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -130,12 +125,6 @@ describe('Playwright', () => { filename ) ).toMatchInlineSnapshot(` - import global from 'global'; - - const { - setupPage - } = require('@storybook/test-runner'); - if (!require.main) { describe("Example/foo/bar", () => { describe("A", () => { @@ -156,8 +145,8 @@ describe('Playwright', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -167,11 +156,11 @@ describe('Playwright', () => { id: "example-foo-bar--a" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -190,8 +179,9 @@ describe('Playwright', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/foo/bar"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -214,12 +204,6 @@ describe('Playwright', () => { filename ) ).toMatchInlineSnapshot(` - import global from 'global'; - - const { - setupPage - } = require('@storybook/test-runner'); - if (!require.main) { describe("Example/Header", () => { describe("A", () => { @@ -240,8 +224,8 @@ describe('Playwright', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -251,11 +235,11 @@ describe('Playwright', () => { id: "example-header--a" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -274,8 +258,9 @@ describe('Playwright', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; diff --git a/src/playwright/transformPlaywright.ts b/src/playwright/transformPlaywright.ts index b6ee8023..e6484334 100644 --- a/src/playwright/transformPlaywright.ts +++ b/src/playwright/transformPlaywright.ts @@ -4,13 +4,9 @@ import { userOrAutoTitle } from '@storybook/store'; import { getStorybookMetadata } from '../util'; import { transformCsf } from '../csf/transformCsf'; +import type { TestPrefixer } from '../csf/transformCsf'; import dedent from 'ts-dedent'; -const filePrefixer = template(` - import global from 'global'; - const { setupPage } = require('@storybook/test-runner'); -`); - const coverageErrorMessage = dedent` [Test runner] An error occurred when evaluating code coverage: The code in this story is not instrumented, which means the coverage setup is likely not correct. @@ -28,19 +24,19 @@ export const testPrefixer = template( page.evaluate(({ id, err }) => __throwError(id, err), { id: %%id%%, err: err.message }); }); - if(global.__sbPreRender) { - await global.__sbPreRender(page, context); + if(globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ id, hasPlayFn }) => __test(id, hasPlayFn), { id: %%id%%, }); - if(global.__sbPostRender) { - await global.__sbPostRender(page, context); + if(globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if(global.__sbCollectCoverage) { + if(globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { throw new Error(\`${coverageErrorMessage}\`); @@ -56,8 +52,9 @@ export const testPrefixer = template( await testFn(); } catch(err) { if(err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${%%title%%}/\${%%name%%}". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -68,7 +65,7 @@ export const testPrefixer = template( { plugins: ['jsx'], } -); +) as any as TestPrefixer; const makeTitleFactory = (filename: string) => { const { workingDir, normalizedStoriesEntries } = getStorybookMetadata(); @@ -79,8 +76,6 @@ const makeTitleFactory = (filename: string) => { export const transformPlaywright = (src: string, filename: string) => { const result = transformCsf(src, { - filePrefixer, - // @ts-ignore testPrefixer, insertTestIfEmpty: true, clearBody: true, diff --git a/src/playwright/transformPlaywrightJson.test.ts b/src/playwright/transformPlaywrightJson.test.ts index bbabd6ae..6aa84b67 100644 --- a/src/playwright/transformPlaywrightJson.test.ts +++ b/src/playwright/transformPlaywrightJson.test.ts @@ -47,8 +47,8 @@ describe('Playwright Json', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -58,11 +58,11 @@ describe('Playwright Json', () => { id: \\"example-header--logged-in\\" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -81,8 +81,9 @@ describe('Playwright Json', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: \\"\${\\"Example/Header\\"}/\${\\"Logged In\\"}\\". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -108,8 +109,8 @@ describe('Playwright Json', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -119,11 +120,11 @@ describe('Playwright Json', () => { id: \\"example-header--logged-out\\" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -142,8 +143,9 @@ describe('Playwright Json', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: \\"\${\\"Example/Header\\"}/\${\\"Logged Out\\"}\\". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -171,8 +173,8 @@ describe('Playwright Json', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -182,11 +184,11 @@ describe('Playwright Json', () => { id: \\"example-page--logged-in\\" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -205,8 +207,9 @@ describe('Playwright Json', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: \\"\${\\"Example/Page\\"}/\${\\"Logged In\\"}\\". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -259,8 +262,8 @@ describe('Playwright Json', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -270,11 +273,11 @@ describe('Playwright Json', () => { id: \\"example-page--logged-in\\" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -293,8 +296,9 @@ describe('Playwright Json', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: \\"\${\\"Example/Page\\"}/\${\\"Logged In\\"}\\". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -375,8 +379,8 @@ describe('Playwright Json', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -386,11 +390,11 @@ describe('Playwright Json', () => { id: \\"example-header--logged-in\\" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -409,8 +413,9 @@ describe('Playwright Json', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: \\"\${\\"Example/Header\\"}/\${\\"Logged In\\"}\\". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -436,8 +441,8 @@ describe('Playwright Json', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -447,11 +452,11 @@ describe('Playwright Json', () => { id: \\"example-header--logged-out\\" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -470,8 +475,9 @@ describe('Playwright Json', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: \\"\${\\"Example/Header\\"}/\${\\"Logged Out\\"}\\". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -499,8 +505,8 @@ describe('Playwright Json', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -510,11 +516,11 @@ describe('Playwright Json', () => { id: \\"example-page--logged-in\\" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -533,8 +539,9 @@ describe('Playwright Json', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: \\"\${\\"Example/Page\\"}/\${\\"Logged In\\"}\\". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; @@ -600,8 +607,8 @@ describe('Playwright Json', () => { }); }); - if (global.__sbPreRender) { - await global.__sbPreRender(page, context); + if (globalThis.__sbPreRender) { + await globalThis.__sbPreRender(page, context); } const result = await page.evaluate(({ @@ -611,11 +618,11 @@ describe('Playwright Json', () => { id: \\"example-page--logged-in\\" }); - if (global.__sbPostRender) { - await global.__sbPostRender(page, context); + if (globalThis.__sbPostRender) { + await globalThis.__sbPostRender(page, context); } - if (global.__sbCollectCoverage) { + if (globalThis.__sbCollectCoverage) { const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); if (!isCoverageSetupCorrectly) { @@ -634,8 +641,9 @@ describe('Playwright Json', () => { await testFn(); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { + console.log(\`An error occurred in the following story, most likely because of a navigation: \\"\${\\"Example/Page\\"}/\${\\"Logged In\\"}\\". Retrying...\`); await jestPlaywright.resetPage(); - await setupPage(global.page); + await globalThis.__sbSetupPage(globalThis.page); await testFn(); } else { throw err; diff --git a/src/typings.d.ts b/src/typings.d.ts index 2f4eb9cf..4bf84d6a 100644 --- a/src/typings.d.ts +++ b/src/typings.d.ts @@ -1 +1,7 @@ -declare module 'global'; +import { TestHook } from './playwright/hooks'; + +declare global { + var __sbPreRender: TestHook; + var __sbPostRender: TestHook; + var __getContext: (storyId: string) => any; +} From cef77d12a55d2b48e43f7ffe444dca934a71c0c3 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 22 Oct 2022 11:51:42 +0800 Subject: [PATCH 2/2] Merge pull request #209 from bryanjtc/dependency-fix Fix missing dependencies --- package.json | 6 ++++-- yarn.lock | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 375ee1a7..37b77e5f 100644 --- a/package.json +++ b/package.json @@ -58,8 +58,6 @@ "devDependencies": { "@auto-it/released": "^10.37.1", "@babel/cli": "^7.12.1", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.8", "@jest/types": "^28.1.3", "@storybook/addon-coverage": "^0.0.1", "@storybook/addon-essentials": "^6.5.0", @@ -109,6 +107,8 @@ "@babel/preset-env": "^7.19.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.8", "@storybook/core-common": "^6.5.0", "@storybook/csf": "0.0.2--canary.4566f4d.1", "@storybook/csf-tools": "^6.5.0", @@ -117,6 +117,8 @@ "commander": "^9.0.0", "expect-playwright": "^0.8.0", "jest": "^28.0.0", + "jest-environment-node":"^28.0.0", + "jest-circus":"^28.0.0", "jest-junit": "^14.0.0", "jest-playwright-preset": "^2.0.0", "jest-runner": "^28.0.0", diff --git a/yarn.lock b/yarn.lock index 8402307a..4b85af83 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8006,7 +8006,7 @@ jest-changed-files@^28.1.3: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^28.1.3: +jest-circus@^28.0.0, jest-circus@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== @@ -8125,7 +8125,7 @@ jest-each@^28.1.3: jest-util "^28.1.3" pretty-format "^28.1.3" -jest-environment-node@^28.1.3: +jest-environment-node@^28.0.0, jest-environment-node@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==