From 8c39869e1d87934345c46fbace3f991187bfaf3b Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 30 Jun 2025 15:48:44 +0200 Subject: [PATCH 01/29] wip --- package.json | 10 +- src/config/jest-playwright.ts | 4 +- src/csf/transformCsf.ts | 3 +- src/playwright/hooks.ts | 1 + src/playwright/transformPlaywright.test.ts | 18 +- src/playwright/transformPlaywright.ts | 9 +- src/playwright/transformPlaywrightJson.ts | 1 + src/setup-page-script.ts | 2 + src/test-storybook.ts | 5 +- src/util/getStorybookMain.test.ts | 39 ++-- src/util/getStorybookMain.ts | 45 +++-- src/util/getStorybookMetadata.test.ts | 37 ++-- src/util/getStorybookMetadata.ts | 6 +- src/util/getTestRunnerConfig.ts | 1 + storybook-internal-modules.d.ts | 73 ++++++++ test-runner-jest.config.js | 1 + yarn.lock | 197 +++++++++++---------- 17 files changed, 283 insertions(+), 169 deletions(-) create mode 100644 storybook-internal-modules.d.ts diff --git a/package.json b/package.json index 4b4c264c..655d3c79 100644 --- a/package.json +++ b/package.json @@ -76,10 +76,10 @@ "@babel/preset-env": "^7.19.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", - "@storybook/addon-a11y": "next", + "@storybook/addon-a11y": "0.0.0-pr-31819-sha-8b752a73", "@storybook/addon-coverage": "^1.0.0", - "@storybook/addon-docs": "next", - "@storybook/react-vite": "next", + "@storybook/addon-docs": "0.0.0-pr-31819-sha-8b752a73", + "@storybook/react-vite": "0.0.0-pr-31819-sha-8b752a73", "@types/jest": "^29.0.0", "@types/node": "^16.4.1", "@types/node-fetch": "^2.6.11", @@ -101,7 +101,7 @@ "react": "^17.0.1", "react-dom": "^17.0.1", "read-pkg-up": "^7.0.1", - "storybook": "next", + "storybook": "0.0.0-pr-31819-sha-8b752a73", "tempy": "^1.0.1", "ts-dedent": "^2.0.0", "ts-jest": "^29.0.0", @@ -111,7 +111,7 @@ "wait-on": "^7.2.0" }, "peerDependencies": { - "storybook": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0" + "storybook": "0.0.0-pr-31819-sha-8b752a73" }, "engines": { "node": ">=20.0.0" diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 4fab6d3f..46474aec 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -1,4 +1,5 @@ import path from 'path'; +// @ts-ignore import { getProjectRoot } from 'storybook/internal/common'; import type { Config } from '@jest/types'; @@ -83,8 +84,9 @@ export const getJestConfig = (): Config.InitialOptions => { '^.+\\.(story|stories)\\.[jt]sx?$': require.resolve( `${TEST_RUNNER_PATH}/playwright/transform` ), - '^.+\\.[jt]sx?$': swcJestPath, + '^.+\\.[jt]sx?$': [swcJestPath, { module: { type: 'commonjs' } }], }, + transformIgnorePatterns: ['node_modules/(?!(storybook|@storybook)/)'], snapshotSerializers: [jestSerializerHtmlPath], testEnvironmentOptions: { 'jest-playwright': { diff --git a/src/csf/transformCsf.ts b/src/csf/transformCsf.ts index c004a16e..2435be3e 100644 --- a/src/csf/transformCsf.ts +++ b/src/csf/transformCsf.ts @@ -1,5 +1,7 @@ /* eslint-disable no-underscore-dangle */ +// @ts-ignore import { toId, storyNameFromExport, combineTags } from 'storybook/internal/csf'; +// @ts-ignore import { loadCsf } from 'storybook/internal/csf-tools'; import * as t from '@babel/types'; import generate from '@babel/generator'; @@ -124,7 +126,6 @@ export const transformCsf = ( const annotations = csf._storyAnnotations[key]; acc[key] = {}; if (annotations?.play) { - // @ts-expect-error type mismatch – check later acc[key].play = annotations.play; } diff --git a/src/playwright/hooks.ts b/src/playwright/hooks.ts index d316b936..111a58a1 100644 --- a/src/playwright/hooks.ts +++ b/src/playwright/hooks.ts @@ -1,4 +1,5 @@ import type { BrowserContext, Page } from 'playwright'; +// @ts-ignore import type { StoryContextForEnhancers } from 'storybook/internal/csf'; export type TestContext = { diff --git a/src/playwright/transformPlaywright.test.ts b/src/playwright/transformPlaywright.test.ts index 09006641..2d0d8c3d 100644 --- a/src/playwright/transformPlaywright.test.ts +++ b/src/playwright/transformPlaywright.test.ts @@ -30,14 +30,16 @@ describe('Playwright', () => { beforeEach(() => { const relativeSpy = jest.spyOn(path, 'relative'); relativeSpy.mockReturnValueOnce('stories/basic/Header.stories.js'); - jest.spyOn(storybookMain, 'getStorybookMain').mockImplementation(() => ({ - stories: [ - { - directory: '../stories/basic', - titlePrefix: 'Example', - }, - ], - })); + jest.spyOn(storybookMain, 'getStorybookMain').mockImplementation(() => + Promise.resolve({ + stories: [ + { + directory: '../stories/basic', + titlePrefix: 'Example', + }, + ], + }) + ); delete process.env.STORYBOOK_INCLUDE_TAGS; delete process.env.STORYBOOK_EXCLUDE_TAGS; diff --git a/src/playwright/transformPlaywright.ts b/src/playwright/transformPlaywright.ts index 818296c3..ca7be361 100644 --- a/src/playwright/transformPlaywright.ts +++ b/src/playwright/transformPlaywright.ts @@ -1,5 +1,6 @@ import { relative } from 'path'; import template from '@babel/template'; +// @ts-ignore import { userOrAutoTitle } from 'storybook/internal/preview-api'; import dedent from 'ts-dedent'; @@ -79,21 +80,21 @@ export const testPrefixer: TestPrefixer = (context) => { )({ ...context }); }; -const makeTitleFactory = (filename: string) => { - const { workingDir, normalizedStoriesEntries } = getStorybookMetadata(); +const makeTitleFactory = async (filename: string) => { + const { workingDir, normalizedStoriesEntries } = await getStorybookMetadata(); const filePath = `./${relative(workingDir, filename)}`; return (userTitle: string) => userOrAutoTitle(filePath, normalizedStoriesEntries, userTitle) as string; }; -export const transformPlaywright = (src: string, filename: string) => { +export const transformPlaywright = async (src: string, filename: string) => { const tags = process.env.STORYBOOK_PREVIEW_TAGS?.split(',') ?? []; const transformOptions = { testPrefixer, insertTestIfEmpty: true, clearBody: true, - makeTitle: makeTitleFactory(filename), + makeTitle: await makeTitleFactory(filename), previewAnnotations: { tags }, }; diff --git a/src/playwright/transformPlaywrightJson.ts b/src/playwright/transformPlaywrightJson.ts index 9a8b1238..52fd8a4e 100644 --- a/src/playwright/transformPlaywrightJson.ts +++ b/src/playwright/transformPlaywrightJson.ts @@ -1,5 +1,6 @@ import * as t from '@babel/types'; import generate from '@babel/generator'; +// @ts-ignore import { ComponentTitle, StoryId, StoryName, toId } from 'storybook/internal/csf'; import { testPrefixer } from './transformPlaywright'; diff --git a/src/setup-page-script.ts b/src/setup-page-script.ts index b81e8563..7e30eceb 100644 --- a/src/setup-page-script.ts +++ b/src/setup-page-script.ts @@ -4,7 +4,9 @@ * This file is a template to the content which is injected to the Playwright page via the ./setup-page.ts file. * setup-page.ts will read the contents of this file and replace values that use {{x}} pattern, and they should be put right below: */ +// @ts-ignore import { PreviewWeb } from 'storybook/internal/preview-api'; +// @ts-ignore import { StoryContext } from 'storybook/internal/csf'; type ConsoleMethod = diff --git a/src/test-storybook.ts b/src/test-storybook.ts index 8004e530..58c6c636 100644 --- a/src/test-storybook.ts +++ b/src/test-storybook.ts @@ -7,8 +7,11 @@ import canBindToHost from 'can-bind-to-host'; import dedent from 'ts-dedent'; import path, { join, resolve } from 'path'; import tempy from 'tempy'; +// @ts-ignore import { getInterpretedFile } from 'storybook/internal/common'; +// @ts-ignore import { readConfig } from 'storybook/internal/csf-tools'; +// @ts-ignore import { telemetry } from 'storybook/internal/telemetry'; import { glob } from 'glob'; @@ -378,7 +381,7 @@ const main = async () => { } const { storiesPaths, lazyCompilation, disableTelemetry, enableCrashReports } = - getStorybookMetadata(); + await getStorybookMetadata(); if (!shouldRunIndexJson) { process.env.STORYBOOK_STORIES_PATTERN = storiesPaths; diff --git a/src/util/getStorybookMain.test.ts b/src/util/getStorybookMain.test.ts index 0ac9dc8f..ec0e3c94 100644 --- a/src/util/getStorybookMain.test.ts +++ b/src/util/getStorybookMain.test.ts @@ -1,32 +1,39 @@ import { getStorybookMain, resetStorybookMainCache, storybookMainConfig } from './getStorybookMain'; -import * as coreCommon from 'storybook/internal/common'; -jest.mock('storybook/internal/common'); +jest.mock('storybook/internal/common', () => ({ + serverRequire: jest.fn(), +})); describe('getStorybookMain', () => { beforeEach(() => { resetStorybookMainCache(); + jest.clearAllMocks(); }); - it('should throw an error if no configuration is found', () => { - expect(() => getStorybookMain('.storybook')).toThrowErrorMatchingSnapshot(); + it('should throw an error if no configuration is found', async () => { + (require('storybook/internal/common').serverRequire as jest.Mock).mockRejectedValueOnce( + new Error('Module not found') + ); + await expect(getStorybookMain('.storybook')).rejects.toThrowErrorMatchingSnapshot(); }); describe('no stories', () => { - it('should throw an error if no stories are defined', () => { - jest.spyOn(coreCommon, 'serverRequire').mockImplementation(() => ({})); + it('should throw an error if no stories are defined', async () => { + (require('storybook/internal/common').serverRequire as jest.Mock).mockResolvedValueOnce({}); - expect(() => getStorybookMain('.storybook')).toThrowErrorMatchingSnapshot(); + await expect(getStorybookMain('.storybook')).rejects.toThrowErrorMatchingSnapshot(); }); - it('should throw an error if stories list is empty', () => { - jest.spyOn(coreCommon, 'serverRequire').mockImplementation(() => ({ stories: [] })); + it('should throw an error if stories list is empty', async () => { + (require('storybook/internal/common').serverRequire as jest.Mock).mockResolvedValueOnce({ + stories: [], + }); - expect(() => getStorybookMain('.storybook')).toThrowErrorMatchingSnapshot(); + await expect(getStorybookMain('.storybook')).rejects.toThrowErrorMatchingSnapshot(); }); }); - it('should return mainjs', () => { + it('should return mainjs', async () => { const mockedMain = { stories: [ { @@ -36,13 +43,15 @@ describe('getStorybookMain', () => { ], }; - jest.spyOn(coreCommon, 'serverRequire').mockImplementation(() => mockedMain); + (require('storybook/internal/common').serverRequire as jest.Mock).mockResolvedValueOnce( + mockedMain + ); - const res = getStorybookMain('.storybook'); + const res = await getStorybookMain('.storybook'); expect(res).toMatchObject(mockedMain); }); - it('should return the configDir value if it exists', () => { + it('should return the configDir value if it exists', async () => { const mockedMain = { stories: [ { @@ -53,7 +62,7 @@ describe('getStorybookMain', () => { }; storybookMainConfig.set('configDir', mockedMain); - const res = getStorybookMain('.storybook'); + const res = await getStorybookMain('.storybook'); expect(res).toMatchObject(mockedMain); }); }); diff --git a/src/util/getStorybookMain.ts b/src/util/getStorybookMain.ts index 90d66c16..0b309a23 100644 --- a/src/util/getStorybookMain.ts +++ b/src/util/getStorybookMain.ts @@ -1,36 +1,47 @@ import { join, resolve } from 'path'; +// @ts-ignore import { serverRequire } from 'storybook/internal/common'; +// @ts-ignore import type { StorybookConfig } from 'storybook/internal/types'; import dedent from 'ts-dedent'; export const storybookMainConfig = new Map(); -export const getStorybookMain = (configDir = '.storybook') => { +export const getStorybookMain = async (configDir = '.storybook') => { if (storybookMainConfig.has(configDir)) { return storybookMainConfig.get(configDir) as StorybookConfig; - } else { - storybookMainConfig.set(configDir, serverRequire(join(resolve(configDir), 'main'))); } - const mainConfig = storybookMainConfig.get(configDir); + try { + const mainConfig = await serverRequire(join(resolve(configDir), 'main')); + console.log('getStorybookMain', mainConfig); - if (!mainConfig) { - throw new Error( - `Could not load main.js in ${configDir}. Is the "${configDir}" config directory correct? You can change it by using --config-dir ` - ); - } + if (!mainConfig) { + throw new Error( + `Could not load main.js in ${configDir}. Is the "${configDir}" config directory correct? You can change it by using --config-dir ` + ); + } - if (!mainConfig.stories || mainConfig.stories.length === 0) { + if (!mainConfig.stories || mainConfig.stories.length === 0) { + throw new Error( + dedent` + Could not find stories in main.js in "${configDir}". + If you are using a mono-repository, please run the test-runner only against your sub-package, which contains a .storybook folder with "stories" defined in main.js. + You can change the config directory by using --config-dir + ` + ); + } + + storybookMainConfig.set(configDir, mainConfig); + return mainConfig; + } catch (error) { + if (error instanceof Error) { + throw error; + } throw new Error( - dedent` - Could not find stories in main.js in "${configDir}". - If you are using a mono-repository, please run the test-runner only against your sub-package, which contains a .storybook folder with "stories" defined in main.js. - You can change the config directory by using --config-dir - ` + `Could not load main.js in ${configDir}. Is the "${configDir}" config directory correct? You can change it by using --config-dir ` ); } - - return mainConfig; }; export function resetStorybookMainCache() { diff --git a/src/util/getStorybookMetadata.test.ts b/src/util/getStorybookMetadata.test.ts index 1a5c103a..0b3096f1 100644 --- a/src/util/getStorybookMetadata.test.ts +++ b/src/util/getStorybookMetadata.test.ts @@ -4,7 +4,6 @@ import * as storybookMain from './getStorybookMain'; import { getStorybookMetadata } from './getStorybookMetadata'; jest.mock('storybook/internal/common', () => ({ - ...jest.requireActual('storybook/internal/common'), getProjectRoot: jest.fn(() => '/foo/bar'), normalizeStories: jest.fn(() => [ { @@ -22,18 +21,18 @@ describe('getStorybookMetadata', () => { process.env.STORYBOOK_CONFIG_DIR = undefined; }); - it('should return configDir coming from environment variable', () => { + it('should return configDir coming from environment variable', async () => { const mockedMain: Pick = { stories: [], }; - jest.spyOn(storybookMain, 'getStorybookMain').mockReturnValueOnce(mockedMain); + jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; - const { configDir } = getStorybookMetadata(); + const { configDir } = await getStorybookMetadata(); expect(configDir).toEqual(process.env.STORYBOOK_CONFIG_DIR); }); - it('should return storiesPath with default glob from CSF3 style config', () => { + it('should return storiesPath with default glob from CSF3 style config', async () => { const mockedMain: Pick = { stories: [ { @@ -43,28 +42,28 @@ describe('getStorybookMetadata', () => { ], }; - jest.spyOn(storybookMain, 'getStorybookMain').mockReturnValueOnce(mockedMain); + jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; - const { storiesPaths } = getStorybookMetadata(); + const { storiesPaths } = await getStorybookMetadata(); expect(storiesPaths).toMatchInlineSnapshot( `"/foo/bar/stories/basic/**/*.stories.@(mdx|tsx|ts|jsx|js)"` ); }); - it('should return storiesPath with glob defined in CSF2 style config', () => { + it('should return storiesPath with glob defined in CSF2 style config', async () => { const mockedMain: Pick = { stories: ['../**/stories/*.stories.@(js|ts)'], }; - jest.spyOn(storybookMain, 'getStorybookMain').mockReturnValueOnce(mockedMain); + jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; - const { storiesPaths } = getStorybookMetadata(); + const { storiesPaths } = await getStorybookMetadata(); expect(storiesPaths).toMatchInlineSnapshot( `"/foo/bar/stories/basic/**/*.stories.@(mdx|tsx|ts|jsx|js)"` ); }); - it('should return storiesPath from mixed CSF2 and CSF3 style config', () => { + it('should return storiesPath from mixed CSF2 and CSF3 style config', async () => { const mockedMain: Pick = { stories: [ { @@ -75,29 +74,29 @@ describe('getStorybookMetadata', () => { ], }; - jest.spyOn(storybookMain, 'getStorybookMain').mockReturnValueOnce(mockedMain); + jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; - const { storiesPaths } = getStorybookMetadata(); + const { storiesPaths } = await getStorybookMetadata(); expect(storiesPaths).toMatchInlineSnapshot( `"/foo/bar/stories/basic/**/*.stories.@(mdx|tsx|ts|jsx|js)"` ); }); - it('should return lazyCompilation=false when unset', () => { + it('should return lazyCompilation=false when unset', async () => { const mockedMain: Pick = { stories: [] }; - jest.spyOn(storybookMain, 'getStorybookMain').mockReturnValueOnce(mockedMain); + jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; - expect(getStorybookMetadata().lazyCompilation).toBe(false); + expect((await getStorybookMetadata()).lazyCompilation).toBe(false); }); - it('should return lazyCompilation=true when set', () => { + it('should return lazyCompilation=true when set', async () => { const mockedMain: Pick = { stories: [], core: { builder: { name: 'webpack5', options: { lazyCompilation: true } } }, }; - jest.spyOn(storybookMain, 'getStorybookMain').mockReturnValueOnce(mockedMain); + jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; - expect(getStorybookMetadata().lazyCompilation).toBe(true); + expect((await getStorybookMetadata()).lazyCompilation).toBe(true); }); }); diff --git a/src/util/getStorybookMetadata.ts b/src/util/getStorybookMetadata.ts index bf496bd8..d019585d 100644 --- a/src/util/getStorybookMetadata.ts +++ b/src/util/getStorybookMetadata.ts @@ -1,14 +1,16 @@ import { join } from 'path'; +// @ts-ignore import { normalizeStories, getProjectRoot } from 'storybook/internal/common'; +// @ts-ignore import { StoriesEntry } from 'storybook/internal/types'; import { getStorybookMain } from './getStorybookMain'; -export const getStorybookMetadata = () => { +export const getStorybookMetadata = async () => { const workingDir = getProjectRoot(); const configDir = process.env.STORYBOOK_CONFIG_DIR ?? '.storybook'; - const main = getStorybookMain(configDir); + const main = await getStorybookMain(configDir); const normalizedStoriesEntries = normalizeStories(main.stories as StoriesEntry[], { configDir, workingDir, diff --git a/src/util/getTestRunnerConfig.ts b/src/util/getTestRunnerConfig.ts index 4b3307ad..a0882443 100644 --- a/src/util/getTestRunnerConfig.ts +++ b/src/util/getTestRunnerConfig.ts @@ -1,4 +1,5 @@ import { join, resolve } from 'path'; +// @ts-ignore import { serverRequire } from 'storybook/internal/common'; import { TestRunnerConfig } from '../playwright/hooks'; diff --git a/storybook-internal-modules.d.ts b/storybook-internal-modules.d.ts new file mode 100644 index 00000000..266b21ea --- /dev/null +++ b/storybook-internal-modules.d.ts @@ -0,0 +1,73 @@ +// Global type declarations for Storybook internal modules +declare module 'storybook/internal/common' { + export interface StorybookConfig { + framework?: string; + stories?: string[]; + addons?: string[]; + [key: string]: any; + } + + export function getProjectRoot(): string; + export function getStorybookMain(): any; + export function getStorybookConfig(): StorybookConfig; +} + +declare module 'storybook/internal/csf-tools' { + export interface Story { + id: string; + name: string; + parameters?: any; + [key: string]: any; + } + + export interface StoryIndex { + stories: Record; + } + + export function loadStoryIndex(storybookUrl: string): Promise; + export function getStoriesJsonData(storybookUrl: string): Promise; +} + +declare module 'storybook/internal/telemetry' { + export function getTelemetry(): any; + export function trackEvent(event: string, data?: any): void; +} + +declare module 'storybook/internal/csf' { + export interface StoryContext { + id: string; + name: string; + kind: string; + parameters: any; + args: any; + globals: any; + [key: string]: any; + } + + export interface Story { + id: string; + name: string; + parameters?: any; + [key: string]: any; + } +} + +declare module 'storybook/internal/preview-api' { + export interface PreviewAPI { + [key: string]: any; + } + + export function getPreviewAPI(): PreviewAPI; +} + +import { TestHook } from './src/playwright/hooks'; +import { type setupPage } from './src/setup-page'; +import type { StoryContext } from 'storybook/internal/csf'; + +declare global { + var __sbPreVisit: TestHook; + var __sbPostVisit: TestHook; + var __getContext: (storyId: string) => StoryContext; + var __sbSetupPage: typeof setupPage; + var __sbCollectCoverage: boolean; +} diff --git a/test-runner-jest.config.js b/test-runner-jest.config.js index 1a4b886b..8b3d1cc1 100644 --- a/test-runner-jest.config.js +++ b/test-runner-jest.config.js @@ -22,6 +22,7 @@ module.exports = { globalTeardown: './playwright/global-teardown.js', testEnvironment: './playwright/custom-environment.js', setupFilesAfterEnv: ['./playwright/jest-setup.js'], + // transformIgnorePatterns for the storybook package and make sure swc jest ignores it too // use local build when the package is referred moduleNameMapper: { '@storybook/test-runner': '/dist/index.js', diff --git a/yarn.lock b/yarn.lock index 2457dc54..9320590e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2788,15 +2788,15 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-a11y@npm:next": - version: 9.1.0-alpha.6 - resolution: "@storybook/addon-a11y@npm:9.1.0-alpha.6" +"@storybook/addon-a11y@npm:0.0.0-pr-31819-sha-8b752a73": + version: 0.0.0-pr-31819-sha-8b752a73 + resolution: "@storybook/addon-a11y@npm:0.0.0-pr-31819-sha-8b752a73" dependencies: "@storybook/global": "npm:^5.0.0" axe-core: "npm:^4.2.0" peerDependencies: - storybook: ^9.1.0-alpha.6 - checksum: 10/a403bb52e3c93cd4e2abc4fdace4b4d88d288949bfa1509b420aea5ecdbe1a01162fcbb51b9ee0aa7f99aa19f9d60d5008e67671e50173481126d38e4d76ee7e + storybook: ^0.0.0-pr-31819-sha-8b752a73 + checksum: 10/bdd97b22de1f5731e35f96ae49222bd0b4bc0f61cc78cfb07d109318da00590092136c726b3a638cc92124e32932dadcd7af2df77f79448ce0b18a5116820c5b languageName: node linkType: hard @@ -2816,44 +2816,44 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-docs@npm:next": - version: 9.1.0-alpha.6 - resolution: "@storybook/addon-docs@npm:9.1.0-alpha.6" +"@storybook/addon-docs@npm:0.0.0-pr-31819-sha-8b752a73": + version: 0.0.0-pr-31819-sha-8b752a73 + resolution: "@storybook/addon-docs@npm:0.0.0-pr-31819-sha-8b752a73" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:9.1.0-alpha.6" + "@storybook/csf-plugin": "npm:0.0.0-pr-31819-sha-8b752a73" "@storybook/icons": "npm:^1.2.12" - "@storybook/react-dom-shim": "npm:9.1.0-alpha.6" + "@storybook/react-dom-shim": "npm:0.0.0-pr-31819-sha-8b752a73" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.1.0-alpha.6 - checksum: 10/60f5bc26df1bc4fdab6eb6af50920a29df4a9999f25b1301e180d16a0ccf57b2bc5f95343b00e6fe0c0640fc2d7643325fa905423c9ab21252d8bf892bbdaff5 + storybook: ^0.0.0-pr-31819-sha-8b752a73 + checksum: 10/e03abc12beff89cd3521b46778497256e3570208acd99476c09550e8f3a6df9560d775d9ba47d5f35c50c1482b2c51ff249acce030fba5e7337f0f6cb3b3342e languageName: node linkType: hard -"@storybook/builder-vite@npm:9.1.0-alpha.6": - version: 9.1.0-alpha.6 - resolution: "@storybook/builder-vite@npm:9.1.0-alpha.6" +"@storybook/builder-vite@npm:0.0.0-pr-31819-sha-8b752a73": + version: 0.0.0-pr-31819-sha-8b752a73 + resolution: "@storybook/builder-vite@npm:0.0.0-pr-31819-sha-8b752a73" dependencies: - "@storybook/csf-plugin": "npm:9.1.0-alpha.6" + "@storybook/csf-plugin": "npm:0.0.0-pr-31819-sha-8b752a73" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.1.0-alpha.6 - vite: ^5.0.0 || ^6.0.0 - checksum: 10/01ceb27cc0d07079b276e4fb01bda2c229d0307ad78aa463b278bb72ed6879224192dda0e8de92f1eefa347d3df77da079e4a34109bdca47de52c8479f90f5bc + storybook: ^0.0.0-pr-31819-sha-8b752a73 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + checksum: 10/c947e14c16c604d37796f333ad6e7a4c796a4b4ab426c4060366710aee385441a169797fd02ee4102baca5efa594f9510f261a4be8d6afb8e90d06d79055302c languageName: node linkType: hard -"@storybook/csf-plugin@npm:9.1.0-alpha.6": - version: 9.1.0-alpha.6 - resolution: "@storybook/csf-plugin@npm:9.1.0-alpha.6" +"@storybook/csf-plugin@npm:0.0.0-pr-31819-sha-8b752a73": + version: 0.0.0-pr-31819-sha-8b752a73 + resolution: "@storybook/csf-plugin@npm:0.0.0-pr-31819-sha-8b752a73" dependencies: unplugin: "npm:^1.3.1" peerDependencies: - storybook: ^9.1.0-alpha.6 - checksum: 10/322a50a2c53bef5d6108bda9193c43c4021b8d16ce6b8f57091247cdc5d12c8c89543e04413ac8ea0f6329fd5f40c213fc967a0736a93258f0f003dca028772a + storybook: ^0.0.0-pr-31819-sha-8b752a73 + checksum: 10/c16993fc66ec258f4705c272cfe636002c8675fb99133137bb3fb28ee51a6eda1133eabfb83db7a9bc2d6c6ed56e689a037bcf2819961b1a4b67e2077809fd39 languageName: node linkType: hard @@ -2874,25 +2874,25 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:9.1.0-alpha.6": - version: 9.1.0-alpha.6 - resolution: "@storybook/react-dom-shim@npm:9.1.0-alpha.6" +"@storybook/react-dom-shim@npm:0.0.0-pr-31819-sha-8b752a73": + version: 0.0.0-pr-31819-sha-8b752a73 + resolution: "@storybook/react-dom-shim@npm:0.0.0-pr-31819-sha-8b752a73" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.0-alpha.6 - checksum: 10/892f8e000e0d99e296047ae816ac8e9ab7c386e3d74960e1363bfbd46cfc0214283a6392e3aefdd3c9f7f8c0eda4181e889d62d9977b7648fc5de882ea095ed6 + storybook: ^0.0.0-pr-31819-sha-8b752a73 + checksum: 10/4b772322c76c7529cb4ea2997224c72b97ad2aea89bdc2158634ae8a95e57d300ed276e234345333e65726aed067cddde5e87188421d27f69581f4a184025a63 languageName: node linkType: hard -"@storybook/react-vite@npm:next": - version: 9.1.0-alpha.6 - resolution: "@storybook/react-vite@npm:9.1.0-alpha.6" +"@storybook/react-vite@npm:0.0.0-pr-31819-sha-8b752a73": + version: 0.0.0-pr-31819-sha-8b752a73 + resolution: "@storybook/react-vite@npm:0.0.0-pr-31819-sha-8b752a73" dependencies: "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.0" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:9.1.0-alpha.6" - "@storybook/react": "npm:9.1.0-alpha.6" + "@storybook/builder-vite": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/react": "npm:0.0.0-pr-31819-sha-8b752a73" find-up: "npm:^7.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" @@ -2901,27 +2901,27 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.0-alpha.6 - vite: ^5.0.0 || ^6.0.0 - checksum: 10/45a2828a6140ec45a0adfb35c327c14dccda58d3b43ecb66225f29b7060d020378ff6b1b3527e403cb60e443a337c1159d0037513853a1fa11255741c0f79385 + storybook: ^0.0.0-pr-31819-sha-8b752a73 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + checksum: 10/c43c1a80f56fe964419edeaa33815e67ce021c554e076211086655999fee295afd83405c11675487faddb7ad27e4c2305484232d3aae35520a8385b4eaccc0b4 languageName: node linkType: hard -"@storybook/react@npm:9.1.0-alpha.6": - version: 9.1.0-alpha.6 - resolution: "@storybook/react@npm:9.1.0-alpha.6" +"@storybook/react@npm:0.0.0-pr-31819-sha-8b752a73": + version: 0.0.0-pr-31819-sha-8b752a73 + resolution: "@storybook/react@npm:0.0.0-pr-31819-sha-8b752a73" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:9.1.0-alpha.6" + "@storybook/react-dom-shim": "npm:0.0.0-pr-31819-sha-8b752a73" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.1.0-alpha.6 + storybook: ^0.0.0-pr-31819-sha-8b752a73 typescript: ">= 4.9.x" peerDependenciesMeta: typescript: optional: true - checksum: 10/9289ad692cfd1433b0ff159528530573865fc06ca8683b19a9bfc584fb0daccaaa4c103e7dec57677fb92938ca7989d7edb7f7a1e6c23940b2cbb7dad1607ec3 + checksum: 10/42cdb22798a3c9c486422af1582ba2af4fb5047b6deedbbd6258470c77ad8bfdc033a1d11514a6a07080b94130cfe0325431aad9e95145c27ac9492755e35653 languageName: node linkType: hard @@ -2939,10 +2939,10 @@ __metadata: "@babel/template": "npm:^7.22.5" "@babel/types": "npm:^7.22.5" "@jest/types": "npm:^29.6.3" - "@storybook/addon-a11y": "npm:next" + "@storybook/addon-a11y": "npm:0.0.0-pr-31819-sha-8b752a73" "@storybook/addon-coverage": "npm:^1.0.0" - "@storybook/addon-docs": "npm:next" - "@storybook/react-vite": "npm:next" + "@storybook/addon-docs": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/react-vite": "npm:0.0.0-pr-31819-sha-8b752a73" "@swc/core": "npm:^1.5.22" "@swc/jest": "npm:^0.2.23" "@types/jest": "npm:^29.0.0" @@ -2977,7 +2977,7 @@ __metadata: react: "npm:^17.0.1" react-dom: "npm:^17.0.1" read-pkg-up: "npm:^7.0.1" - storybook: "npm:next" + storybook: "npm:0.0.0-pr-31819-sha-8b752a73" tempy: "npm:^1.0.1" ts-dedent: "npm:^2.0.0" ts-jest: "npm:^29.0.0" @@ -2986,7 +2986,7 @@ __metadata: vite: "npm:^6.3.2" wait-on: "npm:^7.2.0" peerDependencies: - storybook: ^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0 + storybook: 0.0.0-pr-31819-sha-8b752a73 bin: test-storybook: ./dist/test-storybook.js languageName: unknown @@ -3229,6 +3229,15 @@ __metadata: languageName: node linkType: hard +"@types/chai@npm:^5.2.2": + version: 5.2.2 + resolution: "@types/chai@npm:5.2.2" + dependencies: + "@types/deep-eql": "npm:*" + checksum: 10/de425e7b02cc1233a93923866e019dffbafa892774813940b780ebb1ac9f8a8c57b7438c78686bf4e5db05cd3fc8a970fedf6b83638543995ecca88ef2060668 + languageName: node + linkType: hard + "@types/command-line-args@npm:^5.0.0": version: 5.2.3 resolution: "@types/command-line-args@npm:5.2.3" @@ -3243,6 +3252,13 @@ __metadata: languageName: node linkType: hard +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: 10/249a27b0bb22f6aa28461db56afa21ec044fa0e303221a62dff81831b20c8530502175f1a49060f7099e7be06181078548ac47c668de79ff9880241968d43d0c + languageName: node + linkType: hard + "@types/doctrine@npm:^0.0.9": version: 0.0.9 resolution: "@types/doctrine@npm:0.0.9" @@ -3425,44 +3441,45 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:3.0.9": - version: 3.0.9 - resolution: "@vitest/expect@npm:3.0.9" +"@vitest/expect@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/expect@npm:3.2.4" dependencies: - "@vitest/spy": "npm:3.0.9" - "@vitest/utils": "npm:3.0.9" + "@types/chai": "npm:^5.2.2" + "@vitest/spy": "npm:3.2.4" + "@vitest/utils": "npm:3.2.4" chai: "npm:^5.2.0" tinyrainbow: "npm:^2.0.0" - checksum: 10/09fc02ae3a639d5db23705a393ef571001f7f1006f7527529ec7807699b739788d5b54b71cb917c56379874b006f2de49933585694927b23c0d50787f96b9e94 + checksum: 10/dc69ce886c13714dfbbff78f2d2cb7eb536017e82301a73c42d573a9e9d2bf91005ac7abd9b977adf0a3bd431209f45a8ac2418029b68b0a377e092607c843ce languageName: node linkType: hard -"@vitest/pretty-format@npm:3.0.9": - version: 3.0.9 - resolution: "@vitest/pretty-format@npm:3.0.9" +"@vitest/pretty-format@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/pretty-format@npm:3.2.4" dependencies: tinyrainbow: "npm:^2.0.0" - checksum: 10/cfcdda2c72cf16a5e76ad2c9b014a4e36fea3988389613497cad5a2491ebc380ded4397afc95c32a2bd2734b0386996df76f6c5cbfc6be561262b8d112fb7a27 + checksum: 10/8dd30cbf956e01fbab042fe651fb5175d9f0cd00b7b569a46cd98df89c4fec47dab12916201ad6e09a4f25f2a2ec8927a4bfdc61118593097f759c90b18a51d4 languageName: node linkType: hard -"@vitest/spy@npm:3.0.9": - version: 3.0.9 - resolution: "@vitest/spy@npm:3.0.9" +"@vitest/spy@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/spy@npm:3.2.4" dependencies: - tinyspy: "npm:^3.0.2" - checksum: 10/967b403293c9325292be4843753bf8ae516ec158df2372a14bec98c9bfb233fa6bbf76cb319cf1a9ea1b5ab795e3abff68ca66fa7523045562d7449a95ed8bf9 + tinyspy: "npm:^4.0.3" + checksum: 10/7d38c299f42a8c7e5e41652b203af98ca54e63df69c3b072d0e401d5a57fbbba3e39d8538ac1b3022c26718a6388d0bcc222bc2f07faab75942543b9247c007d languageName: node linkType: hard -"@vitest/utils@npm:3.0.9": - version: 3.0.9 - resolution: "@vitest/utils@npm:3.0.9" +"@vitest/utils@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/utils@npm:3.2.4" dependencies: - "@vitest/pretty-format": "npm:3.0.9" - loupe: "npm:^3.1.3" + "@vitest/pretty-format": "npm:3.2.4" + loupe: "npm:^3.1.4" tinyrainbow: "npm:^2.0.0" - checksum: 10/c77e2a4a5c62dabc57c0d27536428e6b4f9a7998b59161deb82cf797e1d6cb61a7531bef19f079c4bdca7b48fd656b48e4d1bcfb4a5bdf3c177931670a287163 + checksum: 10/7f12ef63bd8ee13957744d1f336b0405f164ade4358bf9dfa531f75bbb58ffac02bf61aba65724311ddbc50b12ba54853a169e59c6b837c16086173b9a480710 languageName: node linkType: hard @@ -4924,17 +4941,6 @@ __metadata: languageName: node linkType: hard -"esbuild-register@npm:^3.5.0": - version: 3.5.0 - resolution: "esbuild-register@npm:3.5.0" - dependencies: - debug: "npm:^4.3.4" - peerDependencies: - esbuild: ">=0.12 <1" - checksum: 10/af6874ce9b5fcdb0974c9d9e9f16530a5b9bd80c699b2ba9d7ace33439c1af1be6948535c775d9a6439e2bf23fb31cfd54ac882cfa38308a3f182039f4b98a01 - languageName: node - linkType: hard - "esbuild@npm:^0.17.6": version: 0.17.19 resolution: "esbuild@npm:0.17.19" @@ -7117,10 +7123,10 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.3": - version: 3.1.3 - resolution: "loupe@npm:3.1.3" - checksum: 10/9e98c34daf0eba48ccc603595e51f2ae002110982d84879cf78c51de2c632f0c571dfe82ce4210af60c32203d06b443465c269bda925076fe6d9b612cc65c321 +"loupe@npm:^3.1.4": + version: 3.1.4 + resolution: "loupe@npm:3.1.4" + checksum: 10/06ab1893731f167f2ce71f464a8a68372dc4cb807ecae20f9b844660c93813a298ca76bcd747ba6568b057af725ea63f0034ba3140c8f1d1fbb482d797e593ef languageName: node linkType: hard @@ -9069,18 +9075,17 @@ __metadata: languageName: node linkType: hard -"storybook@npm:next": - version: 9.1.0-alpha.6 - resolution: "storybook@npm:9.1.0-alpha.6" +"storybook@npm:0.0.0-pr-31819-sha-8b752a73": + version: 0.0.0-pr-31819-sha-8b752a73 + resolution: "storybook@npm:0.0.0-pr-31819-sha-8b752a73" dependencies: "@storybook/global": "npm:^5.0.0" "@testing-library/jest-dom": "npm:^6.6.3" "@testing-library/user-event": "npm:^14.6.1" - "@vitest/expect": "npm:3.0.9" - "@vitest/spy": "npm:3.0.9" + "@vitest/expect": "npm:3.2.4" + "@vitest/spy": "npm:3.2.4" better-opn: "npm:^3.0.2" esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" - esbuild-register: "npm:^3.5.0" recast: "npm:^0.23.5" semver: "npm:^7.6.2" ws: "npm:^8.18.0" @@ -9090,8 +9095,8 @@ __metadata: prettier: optional: true bin: - storybook: ./bin/index.cjs - checksum: 10/06b80378bbb385a128230d3c811a5cf4ea74866fa7fbda18fafe3b14b6d64490c806d9237a4f5c1c8d6a42cdf28161c54fadb4d7a24cb384d51799f2e386c157 + storybook: ./dist/bin/dispatcher.js + checksum: 10/d0984f7f86649558984cc209456fd90449699718153b4b6e2e6180983d3f6b9903f28cc7e70c8870a49d56ceed948f19cc89f4d931de5684ec1c8e02f8f627c1 languageName: node linkType: hard @@ -9416,10 +9421,10 @@ __metadata: languageName: node linkType: hard -"tinyspy@npm:^3.0.2": - version: 3.0.2 - resolution: "tinyspy@npm:3.0.2" - checksum: 10/5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 +"tinyspy@npm:^4.0.3": + version: 4.0.3 + resolution: "tinyspy@npm:4.0.3" + checksum: 10/b6a3ed40dd76a2b3c020250cf1401506b456509d1fb9dba0c7b0e644d258dac722843b85c57ccc36c8687db1e7978cb6adcc43e3b71c475910c085b96d41cb53 languageName: node linkType: hard From 4720a97431b4972b19d70b2c1c8bdf79e0bb8bb3 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 7 Jul 2025 11:34:42 +0200 Subject: [PATCH 02/29] wip --- .storybook/test-runner.ts | 4 +- jest.config.js | 12 +- package.json | 35 +- playwright/custom-environment.js | 7 +- playwright/global-setup.js | 8 +- playwright/global-teardown.js | 8 +- playwright/jest-setup.js | 2 +- playwright/test-runner-jest.config.js | 4 +- playwright/transform.js | 38 +- src/config/jest-playwright.test.ts | 12 +- src/config/jest-playwright.ts | 20 +- src/csf/transformCsf.ts | 6 +- src/playwright/index.ts | 17 +- src/playwright/transformPlaywright.ts | 2 +- src/playwright/transformPlaywrightJson.ts | 6 +- src/setup-page.ts | 13 +- src/test-storybook.ts | 13 +- src/util/getStorybookMain.ts | 1 - src/util/getTagOptions.ts | 4 +- src/util/getTestRunnerConfig.ts | 6 +- test-runner-jest.config.js | 11 +- tsconfig.json | 10 +- tsup.config.ts | 27 +- yarn.lock | 2799 +++++++++++---------- 24 files changed, 1693 insertions(+), 1372 deletions(-) diff --git a/.storybook/test-runner.ts b/.storybook/test-runner.ts index 01ac6d02..4f8fe04d 100644 --- a/.storybook/test-runner.ts +++ b/.storybook/test-runner.ts @@ -1,7 +1,7 @@ import { toMatchImageSnapshot } from 'jest-image-snapshot'; -import { getStoryContext, waitForPageReady } from '../dist'; -import type { TestRunnerConfig } from '../dist'; +import { getStoryContext, waitForPageReady } from '../dist/index.js'; +import type { TestRunnerConfig } from '../dist/index.js'; const snapshotsDir = process.env.SNAPSHOTS_DIR || '__snapshots__'; const customSnapshotsDir = `${process.cwd()}/${snapshotsDir}`; diff --git a/jest.config.js b/jest.config.js index fec48d9a..3f466bbc 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,11 +1,11 @@ -module.exports = { +export default { testMatch: ['**/*.test.ts'], moduleNameMapper: { - '@storybook/test-runner/playwright/global-setup': '/playwright/global-setup', - '@storybook/test-runner/playwright/global-teardown': '/playwright/global-teardown', + '@storybook/test-runner/playwright/global-setup': '/playwright/global-setup.js', + '@storybook/test-runner/playwright/global-teardown': '/playwright/global-teardown.js', '@storybook/test-runner/playwright/custom-environment': - '/playwright/custom-environment', - '@storybook/test-runner/playwright/jest-setup': '/playwright/jest-setup', - '@storybook/test-runner/playwright/transform': '/playwright/transform', + '/playwright/custom-environment.js', + '@storybook/test-runner/playwright/jest-setup': '/playwright/jest-setup.js', + '@storybook/test-runner/playwright/transform': '/playwright/transform.js', }, }; diff --git a/package.json b/package.json index 655d3c79..e3ca6e64 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "@storybook/test-runner", "version": "0.22.1", "description": "Test runner for Storybook stories", + "type": "module", "keywords": [ "storybook-addons", "test", @@ -16,11 +17,11 @@ }, "license": "MIT", "author": "shilman", - "main": "dist/index.js", + "main": "dist/index.mjs", "module": "dist/index.mjs", "types": "dist/index.d.ts", "bin": { - "test-storybook": "./dist/test-storybook.js" + "test-storybook": "./dist/test-storybook.mjs" }, "files": [ "dist", @@ -55,18 +56,20 @@ "@babel/generator": "^7.22.5", "@babel/template": "^7.22.5", "@babel/types": "^7.22.5", - "@jest/types": "^29.6.3", + "@jest/types": "^30.0.1", "@swc/core": "^1.5.22", - "@swc/jest": "^0.2.23", + "@swc/jest": "^0.2.38", + "@types/node-fetch": "^2.6.12", "expect-playwright": "^0.8.0", - "jest": "^29.6.4", - "jest-circus": "^29.6.4", - "jest-environment-node": "^29.6.4", + "jest": "^30.0.4", + "jest-circus": "^30.0.4", + "jest-environment-node": "^30.0.4", "jest-junit": "^16.0.0", "jest-playwright-preset": "^4.0.0", - "jest-runner": "^29.6.4", + "jest-runner": "^30.0.4", "jest-serializer-html": "^7.1.0", - "jest-watch-typeahead": "^2.0.0", + "jest-watch-typeahead": "^3.0.1", + "node-fetch": "^3.3.2", "nyc": "^15.1.0", "playwright": "^1.14.0" }, @@ -80,12 +83,11 @@ "@storybook/addon-coverage": "^1.0.0", "@storybook/addon-docs": "0.0.0-pr-31819-sha-8b752a73", "@storybook/react-vite": "0.0.0-pr-31819-sha-8b752a73", - "@types/jest": "^29.0.0", - "@types/node": "^16.4.1", - "@types/node-fetch": "^2.6.11", + "@types/jest": "^30.0.0", + "@types/node": "^24.0.10", "@vitejs/plugin-react": "^4.0.3", "auto": "^11.1.6", - "babel-jest": "^29.0.0", + "babel-jest": "^30.0.4", "babel-loader": "^8.1.0", "babel-plugin-istanbul": "^6.1.1", "can-bind-to-host": "^1.1.1", @@ -95,7 +97,6 @@ "husky": "^8.0.0", "jest-image-snapshot": "^6.2.0", "lint-staged": "^13.0.3", - "node-fetch": "^2", "pkg-up": "^5.0.0", "prettier": "^2.8.1", "react": "^17.0.1", @@ -104,9 +105,9 @@ "storybook": "0.0.0-pr-31819-sha-8b752a73", "tempy": "^1.0.1", "ts-dedent": "^2.0.0", - "ts-jest": "^29.0.0", - "tsup": "^6.5.0", - "typescript": "~4.9.4", + "ts-jest": "^29.4.0", + "tsup": "^8.5.0", + "typescript": "^5.8.3", "vite": "^6.3.2", "wait-on": "^7.2.0" }, diff --git a/playwright/custom-environment.js b/playwright/custom-environment.js index fcf6632d..f23ae43b 100644 --- a/playwright/custom-environment.js +++ b/playwright/custom-environment.js @@ -1,6 +1,5 @@ -const { setupPage } = require('../dist'); - -const PlaywrightEnvironment = require('jest-playwright-preset/lib/PlaywrightEnvironment').default; +import { setupPage } from '../dist/index.js'; +import PlaywrightEnvironment from 'jest-playwright-preset/lib/PlaywrightEnvironment.js'; class CustomEnvironment extends PlaywrightEnvironment { async setup() { @@ -17,4 +16,4 @@ class CustomEnvironment extends PlaywrightEnvironment { } } -module.exports = CustomEnvironment; +export default CustomEnvironment; diff --git a/playwright/global-setup.js b/playwright/global-setup.js index 4c7686f5..b87251ef 100644 --- a/playwright/global-setup.js +++ b/playwright/global-setup.js @@ -1,6 +1,6 @@ -// global-setup.js -const { globalSetup: playwrightGlobalSetup } = require('jest-playwright-preset'); +// global-setup.mjs +import { globalSetup as playwrightGlobalSetup } from 'jest-playwright-preset'; -module.exports = async function globalSetup(globalConfig) { +export default async function globalSetup(globalConfig) { return playwrightGlobalSetup(globalConfig); -}; +} diff --git a/playwright/global-teardown.js b/playwright/global-teardown.js index f0335486..7c1feecc 100644 --- a/playwright/global-teardown.js +++ b/playwright/global-teardown.js @@ -1,7 +1,7 @@ -// global-teardown.js -const { globalTeardown: playwrightGlobalTeardown } = require('jest-playwright-preset'); +// global-teardown.mjs +import { globalTeardown as playwrightGlobalTeardown } from 'jest-playwright-preset'; -module.exports = async function globalTeardown(globalConfig) { +export default async function globalTeardown(globalConfig) { // Your global teardown await playwrightGlobalTeardown(globalConfig); -}; +} diff --git a/playwright/jest-setup.js b/playwright/jest-setup.js index 7e319565..083134e3 100644 --- a/playwright/jest-setup.js +++ b/playwright/jest-setup.js @@ -1,4 +1,4 @@ -const { getTestRunnerConfig, setPreVisit, setPostVisit, setupPage } = require('../dist'); +import { getTestRunnerConfig, setPreVisit, setPostVisit, setupPage } from '../dist/index.js'; const testRunnerConfig = getTestRunnerConfig(process.env.STORYBOOK_CONFIG_DIR); if (testRunnerConfig) { diff --git a/playwright/test-runner-jest.config.js b/playwright/test-runner-jest.config.js index 297a9fb1..fe7a5445 100644 --- a/playwright/test-runner-jest.config.js +++ b/playwright/test-runner-jest.config.js @@ -1,4 +1,4 @@ -const { getJestConfig } = require('../dist'); +import { getJestConfig } from '../dist/index.js'; // The default Jest configuration comes from @storybook/test-runner const testRunnerConfig = getJestConfig(); @@ -6,7 +6,7 @@ const testRunnerConfig = getJestConfig(); /** * @type {import('@jest/types').Config.InitialOptions} */ -module.exports = { +export default { ...testRunnerConfig, /** Add your own overrides below, and make sure * to merge testRunnerConfig properties with your own diff --git a/playwright/transform.js b/playwright/transform.js index b2e6b2f6..1ab17ba2 100644 --- a/playwright/transform.js +++ b/playwright/transform.js @@ -1,17 +1,39 @@ -const { transformSync: swcTransform } = require('@swc/core'); -const { transformPlaywright } = require('../dist'); +import { transform as swcTransform } from '@swc/core'; +import { transformPlaywright } from '../dist/index.js'; -module.exports = { - process(src, filename) { - const csfTest = transformPlaywright(src, filename); - - const result = swcTransform(csfTest, { +// Only export async version - force Jest to use it +async function processAsync(src, filename) { + console.log('processAsync filename', filename); + try { + const csfTest = await transformPlaywright(src, filename); + console.log({ csfTest }); + const result = await swcTransform(csfTest, { filename, + isModule: true, module: { - type: 'commonjs', + type: 'es6', + }, + jsc: { + parser: { + syntax: 'typescript', + tsx: true, // Enable JSX support + }, + target: 'es2015', // Set target for compatibility }, }); return { code: result ? result.code : src }; + } catch (error) { + console.error('Transform error:', error); + return { code: src }; + } +} + +// Export only the async version +export default { + process: (src, filename) => { + console.log('processSync filename', filename); + return { code: src }; }, + processAsync, }; diff --git a/src/config/jest-playwright.test.ts b/src/config/jest-playwright.test.ts index b382a6da..df16fcde 100644 --- a/src/config/jest-playwright.test.ts +++ b/src/config/jest-playwright.test.ts @@ -12,7 +12,7 @@ describe('getJestConfig', () => { transform: { '^.+\\.(story|stories)\\.[jt]sx?$': `${path.dirname( require.resolve('@storybook/test-runner/playwright/transform') - )}/transform.js`, + )}/transform.mjs`, '^.+\\.[jt]sx?$': path.resolve('../test-runner/node_modules/@swc/jest'), }, snapshotSerializers: [path.resolve('../test-runner/node_modules/jest-serializer-html')], @@ -30,11 +30,11 @@ describe('getJestConfig', () => { watchPathIgnorePatterns: ['coverage', '.nyc_output', '.cache'], roots: undefined, runner: path.resolve('../test-runner/node_modules/jest-playwright-preset/runner.js'), - globalSetup: path.resolve('playwright/global-setup.js'), - globalTeardown: path.resolve('playwright/global-teardown.js'), - testEnvironment: path.resolve('playwright/custom-environment.js'), + globalSetup: path.resolve('playwright/global-setup.mjs'), + globalTeardown: path.resolve('playwright/global-teardown.mjs'), + testEnvironment: path.resolve('playwright/custom-environment.mjs'), setupFilesAfterEnv: [ - path.resolve('playwright/jest-setup.js'), + path.resolve('playwright/jest-setup.mjs'), path.resolve('../test-runner/node_modules/expect-playwright/lib'), path.resolve('../test-runner/node_modules/jest-playwright-preset/lib/extends.js'), ], @@ -82,7 +82,7 @@ describe('getJestConfig', () => { transform: { '^.+\\.(story|stories)\\.[jt]sx?$': `${path.dirname( require.resolve('@storybook/test-runner/playwright/transform') - )}/transform.js`, + )}/transform.mjs`, '^.+\\.[jt]sx?$': path.dirname(require.resolve('@swc/jest')), }, snapshotSerializers: [path.dirname(require.resolve('jest-serializer-html'))], diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 46474aec..44ef6fc6 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -10,23 +10,23 @@ const getTestRunnerPath = () => process.env.STORYBOOK_TEST_RUNNER_PATH ?? '@stor * Depending on the user's project and package manager, it's possible that jest-playwright-preset * is going to be located in @storybook/test-runner/node_modules OR in the root node_modules * - * By setting `preset: 'jest-playwright-preset` the change of resolution issues is higher, because + * By setting `preset: 'jest-playwright-preset' the change of resolution issues is higher, because * the lib might be installed inside of @storybook/test-runner/node_modules but references as if it was * in the root node_modules. * - * This function does the same thing as `preset: 'jest-playwright-preset` but makes sure that the + * This function does the same thing as `preset: 'jest-playwright-preset' but makes sure that the * necessary moving parts are all required within the correct path. * */ const getJestPlaywrightConfig = (): Config.InitialOptions => { const TEST_RUNNER_PATH = getTestRunnerPath(); const presetBasePath = path.dirname( require.resolve('jest-playwright-preset', { - paths: [path.join(__dirname, '../node_modules')], + paths: [path.join(import.meta.dirname, '../node_modules')], }) ); const expectPlaywrightPath = path.dirname( require.resolve('expect-playwright', { - paths: [path.join(__dirname, '../node_modules')], + paths: [path.join(import.meta.dirname, '../node_modules')], }) ); return { @@ -54,19 +54,19 @@ export const getJestConfig = (): Config.InitialOptions => { const jestJunitPath = path.dirname( require.resolve('jest-junit', { - paths: [path.join(__dirname, '../node_modules')], + paths: [path.join(import.meta.dirname, '../node_modules')], }) ); const jestSerializerHtmlPath = path.dirname( require.resolve('jest-serializer-html', { - paths: [path.join(__dirname, '../node_modules')], + paths: [path.join(import.meta.dirname, '../node_modules')], }) ); const swcJestPath = path.dirname( require.resolve('@swc/jest', { - paths: [path.join(__dirname, '../node_modules')], + paths: [path.join(import.meta.dirname, '../node_modules')], }) ); @@ -82,11 +82,11 @@ export const getJestConfig = (): Config.InitialOptions => { testMatch, transform: { '^.+\\.(story|stories)\\.[jt]sx?$': require.resolve( - `${TEST_RUNNER_PATH}/playwright/transform` + `${TEST_RUNNER_PATH}/playwright/transform.js` ), - '^.+\\.[jt]sx?$': [swcJestPath, { module: { type: 'commonjs' } }], + '^.+\\.[jt]sx?$': swcJestPath, }, - transformIgnorePatterns: ['node_modules/(?!(storybook|@storybook)/)'], + // transformIgnorePatterns: ['node_modules/(?!(storybook|@storybook)/)'], snapshotSerializers: [jestSerializerHtmlPath], testEnvironmentOptions: { 'jest-playwright': { diff --git a/src/csf/transformCsf.ts b/src/csf/transformCsf.ts index 2435be3e..81b4a6da 100644 --- a/src/csf/transformCsf.ts +++ b/src/csf/transformCsf.ts @@ -102,7 +102,7 @@ const makeBeforeEach = (beforeEachPrefixer: FilePrefixer) => { const makeArray = (templateResult: TemplateResult) => Array.isArray(templateResult) ? templateResult : [templateResult]; -export const transformCsf = ( +export const transformCsf = async ( code: string, { clearBody = false, @@ -113,7 +113,7 @@ export const transformCsf = ( previewAnnotations = { tags: [] }, }: TransformOptions & { previewAnnotations?: Record } ) => { - const { includeTags, excludeTags, skipTags } = getTagOptions(); + const { includeTags, excludeTags, skipTags } = await getTagOptions(); const csf = loadCsf(code, { makeTitle: makeTitle ?? ((userTitle: string) => userTitle) }); csf.parse(); @@ -126,7 +126,7 @@ export const transformCsf = ( const annotations = csf._storyAnnotations[key]; acc[key] = {}; if (annotations?.play) { - acc[key].play = annotations.play; + acc[key].play = annotations.play as t.Node; } acc[key].tags = combineTags( diff --git a/src/playwright/index.ts b/src/playwright/index.ts index e24e8811..68bba598 100644 --- a/src/playwright/index.ts +++ b/src/playwright/index.ts @@ -1,14 +1,21 @@ -import { transformSync as swcTransform } from '@swc/core'; +import { transform as swcTransform } from '@swc/core'; import { transformPlaywright } from './transformPlaywright'; -export const process = (src: string, filename: string) => { - const csfTest = transformPlaywright(src, filename); +console.log('FUI CHAMADO'); +throw new Error('teste'); +export const processAsync = async (src: string, filename: string) => { + const csfTest = await transformPlaywright(src, filename); - const result = swcTransform(csfTest, { + const result = await swcTransform(csfTest, { filename, + isModule: true, module: { - type: 'commonjs', + type: 'es6', }, }); return result ? result.code : src; }; + +export const process = (src: string) => { + return src; +}; diff --git a/src/playwright/transformPlaywright.ts b/src/playwright/transformPlaywright.ts index ca7be361..122a9ffc 100644 --- a/src/playwright/transformPlaywright.ts +++ b/src/playwright/transformPlaywright.ts @@ -98,6 +98,6 @@ export const transformPlaywright = async (src: string, filename: string) => { previewAnnotations: { tags }, }; - const result = transformCsf(src, transformOptions); + const result = await transformCsf(src, transformOptions); return result; }; diff --git a/src/playwright/transformPlaywrightJson.ts b/src/playwright/transformPlaywrightJson.ts index 52fd8a4e..a3f1331a 100644 --- a/src/playwright/transformPlaywrightJson.ts +++ b/src/playwright/transformPlaywrightJson.ts @@ -141,7 +141,9 @@ function groupByTitleId(entries: T[]) { * Generate one test file per component so that Jest can * run them in parallel. */ -export const transformPlaywrightJson = (index: V3StoriesIndex | V4Index | UnsupportedVersion) => { +export const transformPlaywrightJson = async ( + index: V3StoriesIndex | V4Index | UnsupportedVersion +) => { let titleIdToEntries: Record; if (index.v === 3) { const titleIdToStories = groupByTitleId( @@ -158,7 +160,7 @@ export const transformPlaywrightJson = (index: V3StoriesIndex | V4Index | Unsupp throw new Error(`Unsupported version ${index.v}`); } - const { includeTags, excludeTags, skipTags } = getTagOptions(); + const { includeTags, excludeTags, skipTags } = await getTagOptions(); const titleIdToTest = Object.entries(titleIdToEntries).reduce>( (acc, [titleId, entries]) => { diff --git a/src/setup-page.ts b/src/setup-page.ts index ab9cd03a..64912565 100644 --- a/src/setup-page.ts +++ b/src/setup-page.ts @@ -36,7 +36,10 @@ export const setupPage = async (page: Page, browserContext: BrowserContext) => { const failOnConsole = process.env.TEST_CHECK_CONSOLE; const viewMode = process.env.VIEW_MODE ?? 'story'; - const renderedEvent = viewMode === 'docs' ? 'globalThis.__STORYBOOK_MODULE_CORE_EVENTS__.DOCS_RENDERED' : 'globalThis.__STORYBOOK_MODULE_CORE_EVENTS__.STORY_FINISHED ?? globalThis.__STORYBOOK_MODULE_CORE_EVENTS__.STORY_RENDERED'; + const renderedEvent = + viewMode === 'docs' + ? 'globalThis.__STORYBOOK_MODULE_CORE_EVENTS__.DOCS_RENDERED' + : 'globalThis.__STORYBOOK_MODULE_CORE_EVENTS__.STORY_FINISHED ?? globalThis.__STORYBOOK_MODULE_CORE_EVENTS__.STORY_RENDERED'; const { packageJson } = (await readPackageUp()) as NormalizedReadResult; const { version: testRunnerVersion } = packageJson; @@ -51,7 +54,7 @@ export const setupPage = async (page: Page, browserContext: BrowserContext) => { ); } - const testRunnerConfig = getTestRunnerConfig() || {}; + const testRunnerConfig = (await getTestRunnerConfig()) || {}; if (testRunnerConfig?.prepare) { await testRunnerConfig.prepare({ page, browserContext, testRunnerConfig }); } else { @@ -70,15 +73,15 @@ export const setupPage = async (page: Page, browserContext: BrowserContext) => { }); const finalStorybookUrl = referenceURL ?? targetURL ?? ''; - const testRunnerPackageLocation = await pkgUp({ cwd: __dirname }); + const testRunnerPackageLocation = await pkgUp({ cwd: import.meta.dirname }); if (!testRunnerPackageLocation) throw new Error('Could not find test-runner package location'); const scriptLocation = path.join( path.dirname(testRunnerPackageLocation), 'dist', - 'setup-page-script.mjs' + 'setup-page-script.js' ); - // read the content of setup-page-script.mjs and replace the placeholders with the actual values + // read the content of setup-page-script.js and replace the placeholders with the actual values const content = (await readFile(scriptLocation, 'utf-8')) .replaceAll('{{storybookUrl}}', finalStorybookUrl) .replaceAll('{{failOnConsole}}', failOnConsole ?? 'false') diff --git a/src/test-storybook.ts b/src/test-storybook.ts index 58c6c636..6dfdf6cf 100644 --- a/src/test-storybook.ts +++ b/src/test-storybook.ts @@ -3,7 +3,7 @@ import fs from 'fs'; import { execSync } from 'child_process'; import fetch from 'node-fetch'; -import canBindToHost from 'can-bind-to-host'; +import { canBindToHost } from 'can-bind-to-host'; import dedent from 'ts-dedent'; import path, { join, resolve } from 'path'; import tempy from 'tempy'; @@ -129,7 +129,7 @@ async function executeJestPlaywright(args: JestOptions) { // Always prefer jest installed via the test runner. If it's hoisted, it will get it from root node_modules const jestPath = path.dirname( require.resolve('jest', { - paths: [path.join(__dirname, '../@storybook/test-runner/node_modules')], + paths: [path.join(import.meta.dirname, '../@storybook/test-runner/node_modules')], }) ); const jest = require(jestPath); @@ -146,7 +146,7 @@ async function executeJestPlaywright(args: JestOptions) { const jestConfigPath = userDefinedJestConfig || - path.resolve(__dirname, path.join('..', 'playwright', 'test-runner-jest.config.js')); + path.resolve(import.meta.dirname, path.join('..', 'playwright', 'test-runner-jest.config.js')); argv.push('--config', jestConfigPath); @@ -215,7 +215,7 @@ async function getIndexTempDir(url: string) { let tmpDir: string; try { const indexJson = await getIndexJson(url); - const titleIdToTest = transformPlaywrightJson(indexJson); + const titleIdToTest = await transformPlaywrightJson(indexJson); tmpDir = tempy.directory(); for (const [titleId, test] of Object.entries(titleIdToTest)) { @@ -235,7 +235,7 @@ async function getIndexTempDir(url: string) { } function ejectConfiguration() { - const origin = path.resolve(__dirname, '../playwright/test-runner-jest.config.js'); + const origin = path.resolve(import.meta.dirname, '../playwright/test-runner-jest.config.js'); const destination = path.resolve('test-runner-jest.config.js'); const fileAlreadyExists = fs.existsSync(destination); @@ -285,7 +285,8 @@ const main = async () => { process.env.STORYBOOK_CONFIG_DIR = runnerOptions.configDir; - const testRunnerConfig = getTestRunnerConfig(runnerOptions.configDir) ?? ({} as TestRunnerConfig); + const testRunnerConfig = + (await getTestRunnerConfig(runnerOptions.configDir)) ?? ({} as TestRunnerConfig); if (testRunnerConfig.preVisit && testRunnerConfig.preRender) { throw new Error( diff --git a/src/util/getStorybookMain.ts b/src/util/getStorybookMain.ts index 0b309a23..cb571983 100644 --- a/src/util/getStorybookMain.ts +++ b/src/util/getStorybookMain.ts @@ -14,7 +14,6 @@ export const getStorybookMain = async (configDir = '.storybook') => { try { const mainConfig = await serverRequire(join(resolve(configDir), 'main')); - console.log('getStorybookMain', mainConfig); if (!mainConfig) { throw new Error( diff --git a/src/util/getTagOptions.ts b/src/util/getTagOptions.ts index 0a72d942..2be39a02 100644 --- a/src/util/getTagOptions.ts +++ b/src/util/getTagOptions.ts @@ -11,8 +11,8 @@ type TagOptions = { * 1. Test runner config 'tags' object * 2. Environment variables (takes precedence) */ -export function getTagOptions() { - const config = getTestRunnerConfig(); +export async function getTagOptions() { + const config = await getTestRunnerConfig(); let tagOptions = { includeTags: config?.tags?.include || ['test'], diff --git a/src/util/getTestRunnerConfig.ts b/src/util/getTestRunnerConfig.ts index a0882443..001910b4 100644 --- a/src/util/getTestRunnerConfig.ts +++ b/src/util/getTestRunnerConfig.ts @@ -6,15 +6,15 @@ import { TestRunnerConfig } from '../playwright/hooks'; let testRunnerConfig: TestRunnerConfig; let loaded = false; -export const getTestRunnerConfig = ( +export const getTestRunnerConfig = async ( configDir = process.env.STORYBOOK_CONFIG_DIR ?? '.storybook' -): TestRunnerConfig | undefined => { +): Promise => { // testRunnerConfig can be undefined if (loaded) { return testRunnerConfig; } - testRunnerConfig = serverRequire(join(resolve(configDir), 'test-runner')); + testRunnerConfig = await serverRequire(join(resolve(configDir), 'test-runner')); loaded = true; return testRunnerConfig; }; diff --git a/test-runner-jest.config.js b/test-runner-jest.config.js index 8b3d1cc1..aee3212d 100644 --- a/test-runner-jest.config.js +++ b/test-runner-jest.config.js @@ -1,21 +1,24 @@ // !!! This file is used as an override to the test-runner configuration for this repo only !!! // If you want to create your own override for your project, run test-storybook eject instead -const path = require('path'); +import path from 'path'; +import { fileURLToPath } from 'url'; + // we override the path here so that when running the test-runner locally, it resolves to local files instead when calling require.resolve +const __dirname = path.dirname(fileURLToPath(import.meta.url)); process.env.STORYBOOK_TEST_RUNNER_PATH = path.resolve(__dirname); -const { getJestConfig } = require('./dist'); +import { getJestConfig } from './dist/index.js'; const testRunnerConfig = getJestConfig(); /** * @type {import('@jest/types').Config.InitialOptions} */ -module.exports = { +export default { ...testRunnerConfig, cacheDirectory: 'node_modules/.cache/storybook/test-runner', transform: { - '^.+\\.(story|stories)\\.[jt]sx?$': './playwright/transform', + '^.+\\.(story|stories)\\.[jt]sx?$': './playwright/transform.js', '^.+\\.[jt]sx?$': '@swc/jest', }, globalSetup: './playwright/global-setup.js', diff --git a/tsconfig.json b/tsconfig.json index ba12020e..32e04f60 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,18 +8,18 @@ "incremental": false, "isolatedModules": true, "jsx": "react", - "lib": ["es2017", "dom"], - "module": "commonjs", + "lib": ["ES2024", "dom"], + "module": "esnext", "noImplicitAny": true, "rootDir": "./src", "skipLibCheck": true, - "target": "es2020", + "target": "esnext", "types": ["jest", "node"], - "moduleResolution": "node", + "moduleResolution": "bundler", "strict": true, "noEmit": true, "noUnusedLocals": true, - "noUnusedParameters": true, + "noUnusedParameters": true }, "include": ["src/**/*.ts"] } diff --git a/tsup.config.ts b/tsup.config.ts index f0474e64..ebede2b9 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,19 +1,35 @@ +import { dedent } from 'ts-dedent'; import { defineConfig } from 'tsup'; +import { builtinModules } from 'node:module'; export default defineConfig([ { clean: true, entry: ['./src/index.ts', './src/test-storybook.ts'], - format: ['cjs', 'esm'], + format: ['esm'], splitting: false, dts: true, minify: false, treeshake: false, bundle: true, - platform: 'node', - external: ['@storybook/test-runner'], + platform: 'neutral', + external: [ + '@storybook/test-runner', + ...[...builtinModules, 'module'].flatMap((m) => [m, `node:${m}`]), + ], + outExtension: ({ format }) => ({ + js: `.${format === 'esm' ? 'js' : 'cjs'}`, + }), esbuildOptions(options) { - options.platform = 'node'; + options.platform = 'neutral'; + }, + banner: { + js: dedent` + import ESM_COMPAT_Module from "node:module"; + import { fileURLToPath as ESM_COMPAT_fileURLToPath } from 'node:url'; + const __filename = ESM_COMPAT_fileURLToPath(import.meta.url); + const require = ESM_COMPAT_Module.createRequire(import.meta.url); + `, }, }, { @@ -23,5 +39,8 @@ export default defineConfig([ bundle: false, treeshake: false, platform: 'browser', + outExtension: ({ format }) => ({ + js: `.${format === 'esm' ? 'js' : 'cjs'}`, + }), }, ]); diff --git a/yarn.lock b/yarn.lock index 9320590e..f14ce55a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -168,57 +168,57 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0": - version: 7.26.2 - resolution: "@babel/code-frame@npm:7.26.2" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/code-frame@npm:7.27.1" dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.27.1" js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/db2c2122af79d31ca916755331bb4bac96feb2b334cdaca5097a6b467fdd41963b89b14b6836a14f083de7ff887fc78fa1b3c10b14e743d33e12dbfe5ee3d223 + picocolors: "npm:^1.1.1" + checksum: 10/721b8a6e360a1fa0f1c9fe7351ae6c874828e119183688b533c477aa378f1010f37cc9afbfc4722c686d1f5cdd00da02eab4ba7278a0c504fa0d7a321dcd4fdf languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.25.9": - version: 7.26.2 - resolution: "@babel/compat-data@npm:7.26.2" - checksum: 10/ed9eed6b62ce803ef4a320b1dac76b0302abbb29c49dddf96f3e3207d9717eb34e299a8651bb1582e9c3346ead74b6d595ffced5b3dae718afa08b18741f8402 +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.27.2": + version: 7.28.0 + resolution: "@babel/compat-data@npm:7.28.0" + checksum: 10/1a56a5e48c7259f72cc4329adeca38e72fd650ea09de267ea4aa070e3da91e5c265313b6656823fff77d64a8bab9554f276c66dade9355fdc0d8604deea015aa languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.22.5, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9, @babel/core@npm:^7.7.5": - version: 7.26.0 - resolution: "@babel/core@npm:7.26.0" +"@babel/core@npm:^7.12.3, @babel/core@npm:^7.18.9, @babel/core@npm:^7.22.5, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9, @babel/core@npm:^7.27.4, @babel/core@npm:^7.7.5": + version: 7.28.0 + resolution: "@babel/core@npm:7.28.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.0" - "@babel/generator": "npm:^7.26.0" - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.0" - "@babel/parser": "npm:^7.26.0" - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.28.0" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-module-transforms": "npm:^7.27.3" + "@babel/helpers": "npm:^7.27.6" + "@babel/parser": "npm:^7.28.0" + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.28.0" + "@babel/types": "npm:^7.28.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/65767bfdb1f02e80d3af4f138066670ef8fdd12293de85ef151758a901c191c797e86d2e99b11c4cdfca33c72385ecaf38bbd7fa692791ec44c77763496b9b93 + checksum: 10/1c86eec8d76053f7b1c5f65296d51d7b8ac00f80d169ff76d3cd2e7d85ab222eb100d40cc3314f41b96c8cc06e9abab21c63d246161f0f3f70ef14c958419c33 languageName: node linkType: hard -"@babel/generator@npm:^7.22.5, @babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.7.2": - version: 7.26.2 - resolution: "@babel/generator@npm:7.26.2" +"@babel/generator@npm:^7.22.5, @babel/generator@npm:^7.27.5, @babel/generator@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/generator@npm:7.28.0" dependencies: - "@babel/parser": "npm:^7.26.2" - "@babel/types": "npm:^7.26.0" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" + "@babel/parser": "npm:^7.28.0" + "@babel/types": "npm:^7.28.0" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" jsesc: "npm:^3.0.2" - checksum: 10/71ace82b5b07a554846a003624bfab93275ccf73cdb9f1a37a4c1094bf9dc94bb677c67e8b8c939dbd6c5f0eda2e8f268aa2b0d9c3b9511072565660e717e045 + checksum: 10/064c5ba4c07ecd7600377bd0022d5f6bdb3b35e9ff78d9378f6bd1e656467ca902c091647222ab2f0d2967f6d6c0ca33157d37dd9b1c51926c9b0e1527ab9b92 languageName: node linkType: hard @@ -240,16 +240,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-compilation-targets@npm:7.25.9" +"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: - "@babel/compat-data": "npm:^7.25.9" - "@babel/helper-validator-option": "npm:^7.25.9" + "@babel/compat-data": "npm:^7.27.2" + "@babel/helper-validator-option": "npm:^7.27.1" browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10/8053fbfc21e8297ab55c8e7f9f119e4809fa7e505268691e1bedc2cf5e7a5a7de8c60ad13da2515378621b7601c42e101d2d679904da395fa3806a1edef6b92e + checksum: 10/bd53c30a7477049db04b655d11f4c3500aea3bcbc2497cf02161de2ecf994fec7c098aabbcebe210ffabc2ecbdb1e3ffad23fb4d3f18723b814f423ea1749fe8 languageName: node linkType: hard @@ -315,6 +315,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10/91445f7edfde9b65dcac47f4f858f68dc1661bf73332060ab67ad7cc7b313421099a2bfc4bda30c3db3842cfa1e86fffbb0d7b2c5205a177d91b22c8d7d9cb47 + languageName: node + linkType: hard + "@babel/helper-hoist-variables@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-hoist-variables@npm:7.22.5" @@ -334,26 +341,26 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" +"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-module-imports@npm:7.27.1" dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/e090be5dee94dda6cd769972231b21ddfae988acd76b703a480ac0c96f3334557d70a965bf41245d6ee43891e7571a8b400ccf2b2be5803351375d0f4e5bcf08 + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/58e792ea5d4ae71676e0d03d9fef33e886a09602addc3bd01388a98d87df9fcfd192968feb40ac4aedb7e287ec3d0c17b33e3ecefe002592041a91d8a1998a8d languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3, @babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helper-module-transforms@npm:7.26.0" +"@babel/helper-module-transforms@npm:^7.23.3, @babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-module-transforms@npm:7.27.3" dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.3" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/9841d2a62f61ad52b66a72d08264f23052d533afc4ce07aec2a6202adac0bfe43014c312f94feacb3291f4c5aafe681955610041ece2c276271adce3f570f2f5 + checksum: 10/47abc90ceb181b4bdea9bf1717adf536d1b5e5acb6f6d8a7a4524080318b5ca8a99e6d58677268c596bad71077d1d98834d2c3815f2443e6d3f287962300f15d languageName: node linkType: hard @@ -366,10 +373,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.25.9 - resolution: "@babel/helper-plugin-utils@npm:7.25.9" - checksum: 10/e347d87728b1ab10b6976d46403941c8f9008c045ea6d99997a7ffca7b852dc34b6171380f7b17edf94410e0857ff26f3a53d8618f11d73744db86e8ca9b8c64 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.27.1 + resolution: "@babel/helper-plugin-utils@npm:7.27.1" + checksum: 10/96136c2428888e620e2ec493c25888f9ceb4a21099dcf3dd4508ea64b58cdedbd5a9fb6c7b352546de84d6c24edafe482318646932a22c449ebd16d16c22d864 languageName: node linkType: hard @@ -428,24 +435,24 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10/0ae29cc2005084abdae2966afdb86ed14d41c9c37db02c3693d5022fba9f5d59b011d039380b8e537c34daf117c549f52b452398f576e908fb9db3c7abbb3a00 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e +"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-identifier@npm:7.27.1" + checksum: 10/75041904d21bdc0cd3b07a8ac90b11d64cd3c881e89cb936fa80edd734bf23c35e6bd1312611e8574c4eab1f3af0f63e8a5894f4699e9cfdf70c06fcf4252320 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 10/9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d +"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.25.9, @babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 languageName: node linkType: hard @@ -460,24 +467,24 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helpers@npm:7.26.0" +"@babel/helpers@npm:^7.27.6": + version: 7.27.6 + resolution: "@babel/helpers@npm:7.27.6" dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.26.0" - checksum: 10/fd4757f65d10b64cfdbf4b3adb7ea6ffff9497c53e0786452f495d1f7794da7e0898261b4db65e1c62bbb9a360d7d78a1085635c23dfc3af2ab6dcba06585f86 + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.27.6" + checksum: 10/33c1ab2b42f05317776a4d67c5b00d916dbecfbde38a9406a1300ad3ad6e0380a2f6fcd3361369119a82a7d3c20de6e66552d147297f17f656cf17912605aa97 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/parser@npm:7.26.2" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/parser@npm:7.28.0" dependencies: - "@babel/types": "npm:^7.26.0" + "@babel/types": "npm:^7.28.0" bin: parser: ./bin/babel-parser.js - checksum: 10/8baee43752a3678ad9f9e360ec845065eeee806f1fdc8e0f348a8a0e13eef0959dabed4a197c978896c493ea205c804d0a1187cc52e4a1ba017c7935bab4983d + checksum: 10/2c14a0d2600bae9ab81924df0a85bbd34e427caa099c260743f7c6c12b2042e743e776043a0d1a2573229ae648f7e66a80cfb26fc27e2a9eb59b55932d44c817 languageName: node linkType: hard @@ -548,7 +555,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": +"@babel/plugin-syntax-class-properties@npm:^7.12.13": version: 7.12.13 resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: @@ -603,18 +610,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.23.3" +"@babel/plugin-syntax-import-attributes@npm:^7.23.3, @babel/plugin-syntax-import-attributes@npm:^7.24.7": + version: 7.27.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9aed7661ffb920ca75df9f494757466ca92744e43072e0848d87fa4aa61a3f2ee5a22198ac1959856c036434b5614a8f46f1fb70298835dbe28220cdd1d4c11e + checksum: 10/97973982fff1bbf86b3d1df13380567042887c50e2ae13a400d02a8ff2c9742a60a75e279bfb73019e1cd9710f04be5e6ab81f896e6678dcfcec8b135e8896cf languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.10.4, @babel/plugin-syntax-import-meta@npm:^7.8.3": +"@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: @@ -636,18 +643,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.22.5, @babel/plugin-syntax-jsx@npm:^7.25.9, @babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.25.9 - resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" +"@babel/plugin-syntax-jsx@npm:^7.22.5, @babel/plugin-syntax-jsx@npm:^7.25.9, @babel/plugin-syntax-jsx@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563 + checksum: 10/c6d1324cff286a369aa95d99b8abd21dd07821b5d3affd5fe7d6058c84cff9190743287826463ee57a7beecd10fa1e4bc99061df532ee14e188c1c8937b13e3a languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: @@ -669,7 +676,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3": +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: @@ -724,7 +731,7 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.14.5, @babel/plugin-syntax-top-level-await@npm:^7.8.3": +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": version: 7.14.5 resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: @@ -735,14 +742,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.25.9, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.25.9 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" +"@babel/plugin-syntax-typescript@npm:^7.25.9, @babel/plugin-syntax-typescript@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0e9821e8ba7d660c36c919654e4144a70546942ae184e85b8102f2322451eae102cbfadbcadd52ce077a2b44b400ee52394c616feab7b5b9f791b910e933fd33 + checksum: 10/87836f7e32af624c2914c73cd6b9803cf324e07d43f61dbb973c6a86f75df725e12540d91fac7141c14b697aa9268fd064220998daced156e96ac3062d7afb41 languageName: node linkType: hard @@ -1567,39 +1574,39 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.25.9, @babel/template@npm:^7.3.3": - version: 7.25.9 - resolution: "@babel/template@npm:7.25.9" +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5, @babel/template@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/template@npm:7.27.2" dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/e861180881507210150c1335ad94aff80fd9e9be6202e1efa752059c93224e2d5310186ddcdd4c0f0b0fc658ce48cb47823f15142b5c00c8456dde54f5de80b2 + "@babel/code-frame": "npm:^7.27.1" + "@babel/parser": "npm:^7.27.2" + "@babel/types": "npm:^7.27.1" + checksum: 10/fed15a84beb0b9340e5f81566600dbee5eccd92e4b9cc42a944359b1aa1082373391d9d5fc3656981dff27233ec935d0bc96453cf507f60a4b079463999244d8 languageName: node linkType: hard -"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/traverse@npm:7.25.9" +"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/traverse@npm:7.28.0" dependencies: - "@babel/code-frame": "npm:^7.25.9" - "@babel/generator": "npm:^7.25.9" - "@babel/parser": "npm:^7.25.9" - "@babel/template": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" + "@babel/code-frame": "npm:^7.27.1" + "@babel/generator": "npm:^7.28.0" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.0" + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.28.0" debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10/7431614d76d4a053e429208db82f2846a415833f3d9eb2e11ef72eeb3c64dfd71f4a4d983de1a4a047b36165a1f5a64de8ca2a417534cc472005c740ffcb9c6a + checksum: 10/c1c24b12b6cb46241ec5d11ddbd2989d6955c282715cbd8ee91a09fe156b3bdb0b88353ac33329c2992113e3dfb5198f616c834f8805bb3fa85da1f864bec5f3 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": - version: 7.26.0 - resolution: "@babel/types@npm:7.26.0" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4": + version: 7.28.0 + resolution: "@babel/types@npm:7.28.0" dependencies: - "@babel/helper-string-parser": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10/40780741ecec886ed9edae234b5eb4976968cc70d72b4e5a40d55f83ff2cc457de20f9b0f4fe9d858350e43dab0ea496e7ef62e2b2f08df699481a76df02cd6e + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10/2f28b84efb5005d1e85fc3944219c284400c42aeefc1f6e10500a74fed43b3dfb4f9e349a5d6e0e3fc24f5d241c513b30ef00ede2885535ce7a0a4e111c2098e languageName: node linkType: hard @@ -1619,6 +1626,34 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:^1.4.3": + version: 1.4.3 + resolution: "@emnapi/core@npm:1.4.3" + dependencies: + "@emnapi/wasi-threads": "npm:1.0.2" + tslib: "npm:^2.4.0" + checksum: 10/b511f66b897d2019835391544fdf11f4fa0ce06cc1181abfa17c7d4cf03aaaa4fc8a64fcd30bb3f901de488d0a6f370b53a8de2215a898f5a4ac98015265b3b7 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.3": + version: 1.4.3 + resolution: "@emnapi/runtime@npm:1.4.3" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/4f90852a1a5912982cc4e176b6420556971bcf6a85ee23e379e2455066d616219751367dcf43e6a6eaf41ea7e95ba9dc830665a52b5d979dfe074237d19578f8 + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.2": + version: 1.0.2 + resolution: "@emnapi/wasi-threads@npm:1.0.2" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/e82941776665eb958c2084728191d6b15a94383449975c4621b67a1c8217e1c0ec11056a693906c76863cb96f782f8be500510ecec6874e3f5da35a8e7968cfd + languageName: node + linkType: hard + "@endemolshinegroup/cosmiconfig-typescript-loader@npm:^3.0.2": version: 3.0.2 resolution: "@endemolshinegroup/cosmiconfig-typescript-loader@npm:3.0.2" @@ -1640,13 +1675,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-arm64@npm:0.17.19" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/android-arm64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/android-arm64@npm:0.25.3" @@ -1654,13 +1682,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-arm@npm:0.17.19" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - "@esbuild/android-arm@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/android-arm@npm:0.25.3" @@ -1668,13 +1689,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/android-x64@npm:0.17.19" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - "@esbuild/android-x64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/android-x64@npm:0.25.3" @@ -1682,13 +1696,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/darwin-arm64@npm:0.17.19" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/darwin-arm64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/darwin-arm64@npm:0.25.3" @@ -1696,13 +1703,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/darwin-x64@npm:0.17.19" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - "@esbuild/darwin-x64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/darwin-x64@npm:0.25.3" @@ -1710,13 +1710,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/freebsd-arm64@npm:0.17.19" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/freebsd-arm64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/freebsd-arm64@npm:0.25.3" @@ -1724,13 +1717,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/freebsd-x64@npm:0.17.19" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/freebsd-x64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/freebsd-x64@npm:0.25.3" @@ -1738,13 +1724,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-arm64@npm:0.17.19" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/linux-arm64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-arm64@npm:0.25.3" @@ -1752,13 +1731,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-arm@npm:0.17.19" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - "@esbuild/linux-arm@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-arm@npm:0.25.3" @@ -1766,13 +1738,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-ia32@npm:0.17.19" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/linux-ia32@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-ia32@npm:0.25.3" @@ -1780,13 +1745,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-loong64@npm:0.17.19" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - "@esbuild/linux-loong64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-loong64@npm:0.25.3" @@ -1794,13 +1752,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-mips64el@npm:0.17.19" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - "@esbuild/linux-mips64el@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-mips64el@npm:0.25.3" @@ -1808,13 +1759,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-ppc64@npm:0.17.19" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - "@esbuild/linux-ppc64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-ppc64@npm:0.25.3" @@ -1822,13 +1766,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-riscv64@npm:0.17.19" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - "@esbuild/linux-riscv64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-riscv64@npm:0.25.3" @@ -1836,13 +1773,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-s390x@npm:0.17.19" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - "@esbuild/linux-s390x@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-s390x@npm:0.25.3" @@ -1850,13 +1780,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/linux-x64@npm:0.17.19" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - "@esbuild/linux-x64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/linux-x64@npm:0.25.3" @@ -1871,13 +1794,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/netbsd-x64@npm:0.17.19" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/netbsd-x64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/netbsd-x64@npm:0.25.3" @@ -1892,13 +1808,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/openbsd-x64@npm:0.17.19" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - "@esbuild/openbsd-x64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/openbsd-x64@npm:0.25.3" @@ -1906,13 +1815,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/sunos-x64@npm:0.17.19" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - "@esbuild/sunos-x64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/sunos-x64@npm:0.25.3" @@ -1920,13 +1822,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-arm64@npm:0.17.19" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - "@esbuild/win32-arm64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/win32-arm64@npm:0.25.3" @@ -1934,13 +1829,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-ia32@npm:0.17.19" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - "@esbuild/win32-ia32@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/win32-ia32@npm:0.25.3" @@ -1948,13 +1836,6 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.17.19": - version: 0.17.19 - resolution: "@esbuild/win32-x64@npm:0.17.19" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - "@esbuild/win32-x64@npm:0.25.3": version: 0.25.3 resolution: "@esbuild/win32-x64@npm:0.25.3" @@ -2012,161 +1893,193 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/console@npm:29.7.0" +"@jest/console@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/console@npm:30.0.4" dependencies: - "@jest/types": "npm:^29.6.3" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - chalk: "npm:^4.0.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" + chalk: "npm:^4.1.2" + jest-message-util: "npm:30.0.2" + jest-util: "npm:30.0.2" slash: "npm:^3.0.0" - checksum: 10/4a80c750e8a31f344233cb9951dee9b77bf6b89377cb131f8b3cde07ff218f504370133a5963f6a786af4d2ce7f85642db206ff7a15f99fe58df4c38ac04899e + checksum: 10/75d1066a8cab4b5e880e1f25e70f290f6b2ffac94e4825f4e6649c63569ed29051a6642e9d2dad14f18d46f14eb3b6d2caa41160a0da02257eaf633cb9901737 languageName: node linkType: hard -"@jest/core@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/core@npm:29.7.0" +"@jest/core@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/core@npm:30.0.4" dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/reporters": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" + "@jest/console": "npm:30.0.4" + "@jest/pattern": "npm:30.0.1" + "@jest/reporters": "npm:30.0.4" + "@jest/test-result": "npm:30.0.4" + "@jest/transform": "npm:30.0.4" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-changed-files: "npm:^29.7.0" - jest-config: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-resolve-dependencies: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.2.0" + exit-x: "npm:^0.2.2" + graceful-fs: "npm:^4.2.11" + jest-changed-files: "npm:30.0.2" + jest-config: "npm:30.0.4" + jest-haste-map: "npm:30.0.2" + jest-message-util: "npm:30.0.2" + jest-regex-util: "npm:30.0.1" + jest-resolve: "npm:30.0.2" + jest-resolve-dependencies: "npm:30.0.4" + jest-runner: "npm:30.0.4" + jest-runtime: "npm:30.0.4" + jest-snapshot: "npm:30.0.4" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + jest-watcher: "npm:30.0.4" + micromatch: "npm:^4.0.8" + pretty-format: "npm:30.0.2" slash: "npm:^3.0.0" - strip-ansi: "npm:^6.0.0" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - checksum: 10/ab6ac2e562d083faac7d8152ec1cc4eccc80f62e9579b69ed40aedf7211a6b2d57024a6cd53c4e35fd051c39a236e86257d1d99ebdb122291969a0a04563b51e + checksum: 10/6e880306a01ec3c9697b95a29b45f088d731640fd022c67d5d4da29b1f3f27f29e89aefa6b940a04cd7e534aac91dac6d20b09469feae8ed946f1e82fb609b4a languageName: node linkType: hard -"@jest/create-cache-key-function@npm:^27.4.2": - version: 27.5.1 - resolution: "@jest/create-cache-key-function@npm:27.5.1" +"@jest/create-cache-key-function@npm:^29.7.0": + version: 29.7.0 + resolution: "@jest/create-cache-key-function@npm:29.7.0" dependencies: - "@jest/types": "npm:^27.5.1" - checksum: 10/dbafbad1dc7e9008d9e25995e02d528ca7f4a3ffd829a69316dd345f7ecaa83ef9878476ee1bea37f38cf8ba9167ff972a17007c70cb91bdab0f158df3c58073 + "@jest/types": "npm:^29.6.3" + checksum: 10/061ef63b13ec8c8e5d08e4456f03b5cf8c7f9c1cab4fed8402e1479153cafce6eea80420e308ef62027abb7e29b825fcfa06551856bd021d98e92e381bf91723 languageName: node linkType: hard -"@jest/environment@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/environment@npm:29.7.0" +"@jest/diff-sequences@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/diff-sequences@npm:30.0.1" + checksum: 10/0ddb7c7ba92d6057a2ee51a9cfc2155b77cca707fe959167466ea02dcb0687018cc3c22b9622f25f3a417d6ad370e2d4dcfedf9f1410dc9c02954a7484423cc7 + languageName: node + linkType: hard + +"@jest/environment@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/environment@npm:30.0.4" dependencies: - "@jest/fake-timers": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" + "@jest/fake-timers": "npm:30.0.4" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - jest-mock: "npm:^29.7.0" - checksum: 10/90b5844a9a9d8097f2cf107b1b5e57007c552f64315da8c1f51217eeb0a9664889d3f145cdf8acf23a84f4d8309a6675e27d5b059659a004db0ea9546d1c81a8 + jest-mock: "npm:30.0.2" + checksum: 10/d3fbb1f8263928d110a87ac6ab5a33221a54609fd56b2ce60bffadf7ea9cf2f4e3ae7929c5072d25b55fd4bf672dc785339443963860cc0ceeb269e74e8bd4c4 languageName: node linkType: hard -"@jest/expect-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect-utils@npm:29.7.0" +"@jest/expect-utils@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/expect-utils@npm:30.0.4" dependencies: - jest-get-type: "npm:^29.6.3" - checksum: 10/ef8d379778ef574a17bde2801a6f4469f8022a46a5f9e385191dc73bb1fc318996beaed4513fbd7055c2847227a1bed2469977821866534593a6e52a281499ee + "@jest/get-type": "npm:30.0.1" + checksum: 10/6ddee414ba9c179b7a57c88bd402da1e009551471f3d7fdd9bcb6dce99e3e8e2ce453693b893c025e829883f994650e76266188273c1f60395eec84b06311b77 languageName: node linkType: hard -"@jest/expect@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/expect@npm:29.7.0" +"@jest/expect@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/expect@npm:30.0.4" dependencies: - expect: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - checksum: 10/fea6c3317a8da5c840429d90bfe49d928e89c9e89fceee2149b93a11b7e9c73d2f6e4d7cdf647163da938fc4e2169e4490be6bae64952902bc7a701033fd4880 + expect: "npm:30.0.4" + jest-snapshot: "npm:30.0.4" + checksum: 10/9dbf6085a2502783a5993c194c86973a973837b4481c91de30d6db6264ad2091f015bb1fb01e60017ee82f96314aca41f833d077a50ead477510be39f076fa84 languageName: node linkType: hard -"@jest/fake-timers@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/fake-timers@npm:29.7.0" +"@jest/fake-timers@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/fake-timers@npm:30.0.4" dependencies: - "@jest/types": "npm:^29.6.3" - "@sinonjs/fake-timers": "npm:^10.0.2" + "@jest/types": "npm:30.0.1" + "@sinonjs/fake-timers": "npm:^13.0.0" "@types/node": "npm:*" - jest-message-util: "npm:^29.7.0" - jest-mock: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10/9b394e04ffc46f91725ecfdff34c4e043eb7a16e1d78964094c9db3fde0b1c8803e45943a980e8c740d0a3d45661906de1416ca5891a538b0660481a3a828c27 + jest-message-util: "npm:30.0.2" + jest-mock: "npm:30.0.2" + jest-util: "npm:30.0.2" + checksum: 10/42b1e05c1e06a16e3964643f22cfa06a34fef282f3cb43f18b66caf6b1fa04a8a2ce79bb047f81b51007dc48efabd8200c0805bc394ca4fcbbe55f069419775b languageName: node linkType: hard -"@jest/globals@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/globals@npm:29.7.0" +"@jest/get-type@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/get-type@npm:30.0.1" + checksum: 10/bd6cb2fe1661b652f06e5c6f7ef5aa37247a5b4bf04aad8ce6a8a8ba659efaf983bab9d52755be8cf92478f8d894c024de2fbddf4c3f6be804b808a20dfc347b + languageName: node + linkType: hard + +"@jest/globals@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/globals@npm:30.0.4" dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - jest-mock: "npm:^29.7.0" - checksum: 10/97dbb9459135693ad3a422e65ca1c250f03d82b2a77f6207e7fa0edd2c9d2015fbe4346f3dc9ebff1678b9d8da74754d4d440b7837497f8927059c0642a22123 + "@jest/environment": "npm:30.0.4" + "@jest/expect": "npm:30.0.4" + "@jest/types": "npm:30.0.1" + jest-mock: "npm:30.0.2" + checksum: 10/5dda77a36d768c57389603e1d22d05ac24c916f2e82f3766f57398ae8a835cfb69746c75b76906abdbc1e39da0c1863f68a93167c20317f38bade7500c861b71 languageName: node linkType: hard -"@jest/reporters@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/reporters@npm:29.7.0" +"@jest/pattern@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/pattern@npm:30.0.1" + dependencies: + "@types/node": "npm:*" + jest-regex-util: "npm:30.0.1" + checksum: 10/afd03b4d3eadc9c9970cf924955dee47984a7e767901fe6fa463b17b246f0ddeec07b3e82c09715c54bde3c8abb92074160c0d79967bd23778724f184e7f5b7b + languageName: node + linkType: hard + +"@jest/reporters@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/reporters@npm:30.0.4" dependencies: "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" + "@jest/console": "npm:30.0.4" + "@jest/test-result": "npm:30.0.4" + "@jest/transform": "npm:30.0.4" + "@jest/types": "npm:30.0.1" + "@jridgewell/trace-mapping": "npm:^0.3.25" "@types/node": "npm:*" - chalk: "npm:^4.0.0" - collect-v8-coverage: "npm:^1.0.0" - exit: "npm:^0.1.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" + chalk: "npm:^4.1.2" + collect-v8-coverage: "npm:^1.0.2" + exit-x: "npm:^0.2.2" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.11" istanbul-lib-coverage: "npm:^3.0.0" istanbul-lib-instrument: "npm:^6.0.0" istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" + istanbul-lib-source-maps: "npm:^5.0.0" istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" + jest-message-util: "npm:30.0.2" + jest-util: "npm:30.0.2" + jest-worker: "npm:30.0.2" slash: "npm:^3.0.0" - string-length: "npm:^4.0.1" - strip-ansi: "npm:^6.0.0" + string-length: "npm:^4.0.2" v8-to-istanbul: "npm:^9.0.1" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - checksum: 10/a17d1644b26dea14445cedd45567f4ba7834f980be2ef74447204e14238f121b50d8b858fde648083d2cd8f305f81ba434ba49e37a5f4237a6f2a61180cc73dc + checksum: 10/2005270e2f778741ae1117d181d2fd4ffa3bdd6fa69764a14e70978c90d4601b1538df83d0f4990e87d0452460407736869dd586a5c519b50607660c588f0a8a + languageName: node + linkType: hard + +"@jest/schemas@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/schemas@npm:30.0.1" + dependencies: + "@sinclair/typebox": "npm:^0.34.0" + checksum: 10/067d4c3f38f2d8267d3ed6cc813252c3be580035fe7e2c0fa187323ef4978233ebadb1477808aec048440a8d0f480f71f92c5f02f98bf66c59bf802da1a0b254 languageName: node linkType: hard @@ -2179,74 +2092,88 @@ __metadata: languageName: node linkType: hard -"@jest/source-map@npm:^29.6.3": - version: 29.6.3 - resolution: "@jest/source-map@npm:29.6.3" +"@jest/snapshot-utils@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/snapshot-utils@npm:30.0.4" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.18" - callsites: "npm:^3.0.0" - graceful-fs: "npm:^4.2.9" - checksum: 10/bcc5a8697d471396c0003b0bfa09722c3cd879ad697eb9c431e6164e2ea7008238a01a07193dfe3cbb48b1d258eb7251f6efcea36f64e1ebc464ea3c03ae2deb + "@jest/types": "npm:30.0.1" + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" + natural-compare: "npm:^1.4.0" + checksum: 10/baf70f72c20968f69e5df9704afa94ad1533703b9ce01257091317e7c33529fc02fc16d178cf184c00c5b99235c8eab0a0ea562b48eea5218f1ae7c3d6d79295 languageName: node linkType: hard -"@jest/test-result@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-result@npm:29.7.0" +"@jest/source-map@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/source-map@npm:30.0.1" dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - "@types/istanbul-lib-coverage": "npm:^2.0.0" - collect-v8-coverage: "npm:^1.0.0" - checksum: 10/c073ab7dfe3c562bff2b8fee6cc724ccc20aa96bcd8ab48ccb2aa309b4c0c1923a9e703cea386bd6ae9b71133e92810475bb9c7c22328fc63f797ad3324ed189 + "@jridgewell/trace-mapping": "npm:^0.3.25" + callsites: "npm:^3.1.0" + graceful-fs: "npm:^4.2.11" + checksum: 10/161b27cdf8d9d80fd99374d55222b90478864c6990514be6ebee72b7184a034224c9aceed12c476f3a48d48601bf8ed2e0c047a5a81bd907dc192ebe71365ed4 languageName: node linkType: hard -"@jest/test-sequencer@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/test-sequencer@npm:29.7.0" +"@jest/test-result@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/test-result@npm:30.0.4" + dependencies: + "@jest/console": "npm:30.0.4" + "@jest/types": "npm:30.0.1" + "@types/istanbul-lib-coverage": "npm:^2.0.6" + collect-v8-coverage: "npm:^1.0.2" + checksum: 10/8b4183fbb8722a5d141abf079e177e83afe16d7c58889544a953a598e78077e0186e3b13d9b1343f01ded4791f1b840e49030bc27305f3109fcefd4afbbf6454 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/test-sequencer@npm:30.0.4" dependencies: - "@jest/test-result": "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" + "@jest/test-result": "npm:30.0.4" + graceful-fs: "npm:^4.2.11" + jest-haste-map: "npm:30.0.2" slash: "npm:^3.0.0" - checksum: 10/4420c26a0baa7035c5419b0892ff8ffe9a41b1583ec54a10db3037cd46a7e29dd3d7202f8aa9d376e9e53be5f8b1bc0d16e1de6880a6d319b033b01dc4c8f639 + checksum: 10/390bd726e50538d88eacfd6615bc1b4fb6f4ab7b034c0eef5b1ca2860474d126f60aa9615e8143defcbc2fb3d192f7557f0ed47f24d9fee2567fb1432a017a15 languageName: node linkType: hard -"@jest/transform@npm:^29.7.0": - version: 29.7.0 - resolution: "@jest/transform@npm:29.7.0" +"@jest/transform@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/transform@npm:30.0.4" dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/types": "npm:^29.6.3" - "@jridgewell/trace-mapping": "npm:^0.3.18" - babel-plugin-istanbul: "npm:^6.1.1" - chalk: "npm:^4.0.0" + "@babel/core": "npm:^7.27.4" + "@jest/types": "npm:30.0.1" + "@jridgewell/trace-mapping": "npm:^0.3.25" + babel-plugin-istanbul: "npm:^7.0.0" + chalk: "npm:^4.1.2" convert-source-map: "npm:^2.0.0" fast-json-stable-stringify: "npm:^2.1.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - micromatch: "npm:^4.0.4" - pirates: "npm:^4.0.4" + graceful-fs: "npm:^4.2.11" + jest-haste-map: "npm:30.0.2" + jest-regex-util: "npm:30.0.1" + jest-util: "npm:30.0.2" + micromatch: "npm:^4.0.8" + pirates: "npm:^4.0.7" slash: "npm:^3.0.0" - write-file-atomic: "npm:^4.0.2" - checksum: 10/30f42293545ab037d5799c81d3e12515790bb58513d37f788ce32d53326d0d72ebf5b40f989e6896739aa50a5f77be44686e510966370d58511d5ad2637c68c1 + write-file-atomic: "npm:^5.0.1" + checksum: 10/aa66bf05a64cbf7cf765cef8053fc703fedef1c15ae4110d114cb08b9ceddb2db0403b4a009f2696d0794aed4d3463341b3e3591a16fc6284548ce7b8b24d74b languageName: node linkType: hard -"@jest/types@npm:^27.5.1": - version: 27.5.1 - resolution: "@jest/types@npm:27.5.1" +"@jest/types@npm:30.0.1, @jest/types@npm:^30.0.1": + version: 30.0.1 + resolution: "@jest/types@npm:30.0.1" dependencies: - "@types/istanbul-lib-coverage": "npm:^2.0.0" - "@types/istanbul-reports": "npm:^3.0.0" + "@jest/pattern": "npm:30.0.1" + "@jest/schemas": "npm:30.0.1" + "@types/istanbul-lib-coverage": "npm:^2.0.6" + "@types/istanbul-reports": "npm:^3.0.4" "@types/node": "npm:*" - "@types/yargs": "npm:^16.0.0" - chalk: "npm:^4.0.0" - checksum: 10/d3ca1655673539c54665f3e9135dc70887feb6b667b956e712c38f42e513ae007d3593b8075aecea8f2db7119f911773010f17f93be070b1725fbc6225539b6e + "@types/yargs": "npm:^17.0.33" + chalk: "npm:^4.1.2" + checksum: 10/43f4ffedfec4d88869d74c259a027e45798444c09e4c52f59a1e7124c43d54e908d7b93d81da5260075d421d6f42087b12cb6c83da580b088c987f9d18b5d879 languageName: node linkType: hard @@ -2281,14 +2208,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.12 + resolution: "@jridgewell/gen-mapping@npm:0.3.12" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/sourcemap-codec": "npm:^1.5.0" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 + checksum: 10/151667531566417a940d4dd0a319724979f7a90b9deb9f1617344e1183887d78c835bc1a9209c1ee10fc8a669cdd7ac8120a43a2b6bc8d0d5dd18a173059ff4b languageName: node linkType: hard @@ -2299,17 +2225,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.4 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.4" + checksum: 10/f677787f52224c6c971a7a41b7a074243240a6917fa75eceb9f7a442866f374fb0522b505e0496ee10a650c5936727e76d11bf36a6d0ae9e6c3b726c9e284cc7 languageName: node linkType: hard @@ -2323,13 +2242,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.29 + resolution: "@jridgewell/trace-mapping@npm:0.3.29" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + checksum: 10/64e1ce0dc3a9e56b0118eaf1b2f50746fd59a36de37516cc6855b5370d5f367aa8229e1237536d738262e252c70ee229619cb04e3f3b822146ee3eb1b7ab297f languageName: node linkType: hard @@ -2358,6 +2277,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.11": + version: 0.2.11 + resolution: "@napi-rs/wasm-runtime@npm:0.2.11" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10/e30fe3060474c5018e160231df0531d62b5e22f4736ecd49c04ca6cadacb2acf59b9205435794cd5b898e41e2e3ddb6523e93b97799bd1f4d0751557de6e38e4 + languageName: node + linkType: hard + "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3": version: 2.1.8-no-fsevents.3 resolution: "@nicolo-ribaudo/chokidar-2@npm:2.1.8-no-fsevents.3" @@ -2584,6 +2514,13 @@ __metadata: languageName: node linkType: hard +"@pkgr/core@npm:^0.2.4": + version: 0.2.7 + resolution: "@pkgr/core@npm:0.2.7" + checksum: 10/b16959878940f3d3016b79a4b2c23fd518aaec6b47295baa3154fbcf6574fee644c51023bb69069fa3ea9cdcaca40432818f54695f11acc0ae326cf56676e4d1 + languageName: node + linkType: hard + "@rollup/pluginutils@npm:^5.0.2": version: 5.0.5 resolution: "@rollup/pluginutils@npm:5.0.5" @@ -2600,142 +2537,142 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.40.0" +"@rollup/rollup-android-arm-eabi@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.44.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-android-arm64@npm:4.40.0" +"@rollup/rollup-android-arm64@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-android-arm64@npm:4.44.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.40.0" +"@rollup/rollup-darwin-arm64@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.44.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.40.0" +"@rollup/rollup-darwin-x64@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.44.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.40.0" +"@rollup/rollup-freebsd-arm64@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.44.1" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.40.0" +"@rollup/rollup-freebsd-x64@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.44.1" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.40.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.44.1" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.40.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.44.1" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.40.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.44.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.40.0" +"@rollup/rollup-linux-arm64-musl@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.44.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.40.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.44.1" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.40.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.44.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.40.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.44.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.40.0" +"@rollup/rollup-linux-riscv64-musl@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.44.1" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.40.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.44.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.40.0" +"@rollup/rollup-linux-x64-gnu@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.44.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.40.0" +"@rollup/rollup-linux-x64-musl@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.44.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.40.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.44.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.40.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.44.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.40.0": - version: 4.40.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.40.0" +"@rollup/rollup-win32-x64-msvc@npm:4.44.1": + version: 4.44.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.44.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2770,21 +2707,28 @@ __metadata: languageName: node linkType: hard -"@sinonjs/commons@npm:^3.0.0": - version: 3.0.0 - resolution: "@sinonjs/commons@npm:3.0.0" +"@sinclair/typebox@npm:^0.34.0": + version: 0.34.37 + resolution: "@sinclair/typebox@npm:0.34.37" + checksum: 10/bd2ba20a9f7446a353719bc0e6dfab75a13e47af6470fb792e418c585a4eb3bae4f806f87e4067efe2fb0c7686de11e6cf11823a1fe13660892e51cefcfceaea + languageName: node + linkType: hard + +"@sinonjs/commons@npm:^3.0.1": + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" dependencies: type-detect: "npm:4.0.8" - checksum: 10/086720ae0bc370829322df32612205141cdd44e592a8a9ca97197571f8f970352ea39d3bda75b347c43789013ddab36b34b59e40380a49bdae1c2df3aa85fe4f + checksum: 10/a0af217ba7044426c78df52c23cedede6daf377586f3ac58857c565769358ab1f44ebf95ba04bbe38814fba6e316ca6f02870a009328294fc2c555d0f85a7117 languageName: node linkType: hard -"@sinonjs/fake-timers@npm:^10.0.2": - version: 10.3.0 - resolution: "@sinonjs/fake-timers@npm:10.3.0" +"@sinonjs/fake-timers@npm:^13.0.0": + version: 13.0.5 + resolution: "@sinonjs/fake-timers@npm:13.0.5" dependencies: - "@sinonjs/commons": "npm:^3.0.0" - checksum: 10/78155c7bd866a85df85e22028e046b8d46cf3e840f72260954f5e3ed5bd97d66c595524305a6841ffb3f681a08f6e5cef572a2cce5442a8a232dc29fb409b83e + "@sinonjs/commons": "npm:^3.0.1" + checksum: 10/11ee417968fc4dce1896ab332ac13f353866075a9d2a88ed1f6258f17cc4f7d93e66031b51fcddb8c203aa4d53fd980b0ae18aba06269f4682164878a992ec3f languageName: node linkType: hard @@ -2938,19 +2882,19 @@ __metadata: "@babel/preset-typescript": "npm:^7.18.6" "@babel/template": "npm:^7.22.5" "@babel/types": "npm:^7.22.5" - "@jest/types": "npm:^29.6.3" + "@jest/types": "npm:^30.0.1" "@storybook/addon-a11y": "npm:0.0.0-pr-31819-sha-8b752a73" "@storybook/addon-coverage": "npm:^1.0.0" "@storybook/addon-docs": "npm:0.0.0-pr-31819-sha-8b752a73" "@storybook/react-vite": "npm:0.0.0-pr-31819-sha-8b752a73" "@swc/core": "npm:^1.5.22" - "@swc/jest": "npm:^0.2.23" - "@types/jest": "npm:^29.0.0" - "@types/node": "npm:^16.4.1" - "@types/node-fetch": "npm:^2.6.11" + "@swc/jest": "npm:^0.2.38" + "@types/jest": "npm:^30.0.0" + "@types/node": "npm:^24.0.10" + "@types/node-fetch": "npm:^2.6.12" "@vitejs/plugin-react": "npm:^4.0.3" auto: "npm:^11.1.6" - babel-jest: "npm:^29.0.0" + babel-jest: "npm:^30.0.4" babel-loader: "npm:^8.1.0" babel-plugin-istanbul: "npm:^6.1.1" can-bind-to-host: "npm:^1.1.1" @@ -2959,17 +2903,17 @@ __metadata: expect-playwright: "npm:^0.8.0" glob: "npm:^10.2.2" husky: "npm:^8.0.0" - jest: "npm:^29.6.4" - jest-circus: "npm:^29.6.4" - jest-environment-node: "npm:^29.6.4" + jest: "npm:^30.0.4" + jest-circus: "npm:^30.0.4" + jest-environment-node: "npm:^30.0.4" jest-image-snapshot: "npm:^6.2.0" jest-junit: "npm:^16.0.0" jest-playwright-preset: "npm:^4.0.0" - jest-runner: "npm:^29.6.4" + jest-runner: "npm:^30.0.4" jest-serializer-html: "npm:^7.1.0" - jest-watch-typeahead: "npm:^2.0.0" + jest-watch-typeahead: "npm:^3.0.1" lint-staged: "npm:^13.0.3" - node-fetch: "npm:^2" + node-fetch: "npm:^3.3.2" nyc: "npm:^15.1.0" pkg-up: "npm:^5.0.0" playwright: "npm:^1.14.0" @@ -2980,15 +2924,15 @@ __metadata: storybook: "npm:0.0.0-pr-31819-sha-8b752a73" tempy: "npm:^1.0.1" ts-dedent: "npm:^2.0.0" - ts-jest: "npm:^29.0.0" - tsup: "npm:^6.5.0" - typescript: "npm:~4.9.4" + ts-jest: "npm:^29.4.0" + tsup: "npm:^8.5.0" + typescript: "npm:^5.8.3" vite: "npm:^6.3.2" wait-on: "npm:^7.2.0" peerDependencies: storybook: 0.0.0-pr-31819-sha-8b752a73 bin: - test-storybook: ./dist/test-storybook.js + test-storybook: ./dist/test-storybook.mjs languageName: unknown linkType: soft @@ -3115,15 +3059,16 @@ __metadata: languageName: node linkType: hard -"@swc/jest@npm:^0.2.23": - version: 0.2.29 - resolution: "@swc/jest@npm:0.2.29" +"@swc/jest@npm:^0.2.38": + version: 0.2.38 + resolution: "@swc/jest@npm:0.2.38" dependencies: - "@jest/create-cache-key-function": "npm:^27.4.2" + "@jest/create-cache-key-function": "npm:^29.7.0" + "@swc/counter": "npm:^0.1.3" jsonc-parser: "npm:^3.2.0" peerDependencies: "@swc/core": "*" - checksum: 10/a9cec28769ccbd3f007c56992b431e27490a6baa9f025656f3d1e2e786ebd3afabf4b66e7a79a0b5ed2dc192182a7a2652c7e2d533aa246a8dd1a2cdaac4b630 + checksum: 10/3aaf557425e806890ebefea35334b7795e9f8ddf6f82d634d865ef917333cca4208190af1a9610c134c0e3b7a6a1aea4ec77a659e3ca5965be7aace65ce80c97 languageName: node linkType: hard @@ -3188,7 +3133,16 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.3": +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/aa58e64753a420ad1eefaf7bacef3dda61d74f9336925943d9244132d5b48d9242f734f1e707fd5ccfa6dd1d8ec8e6debc234b4dedb3a5b0d8486d1f373350b2 + languageName: node + linkType: hard + +"@types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.3, @types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -3220,7 +3174,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6, @types/babel__traverse@npm:^7.18.0": +"@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.18.0": version: 7.20.4 resolution: "@types/babel__traverse@npm:7.20.4" dependencies: @@ -3266,30 +3220,14 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.7": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: 10/419c845ece767ad4b21171e6e5b63dabb2eb46b9c0d97361edcd9cabbf6a95fcadb91d89b5fa098d1336fa0b8fceaea82fca97a2ef3971f5c86e53031e157b21 - languageName: node - linkType: hard - -"@types/estree@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 - languageName: node - linkType: hard - -"@types/graceful-fs@npm:^4.1.3": - version: 4.1.9 - resolution: "@types/graceful-fs@npm:4.1.9" - dependencies: - "@types/node": "npm:*" - checksum: 10/79d746a8f053954bba36bd3d94a90c78de995d126289d656fb3271dd9f1229d33f678da04d10bce6be440494a5a73438e2e363e92802d16b8315b051036c5256 +"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.0": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10/25a4c16a6752538ffde2826c2cc0c6491d90e69cd6187bef4a006dd2c3c45469f049e643d7e516c515f21484dc3d48fd5c870be158a5beb72f5baf3dc43e4099 languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1, @types/istanbul-lib-coverage@npm:^2.0.4": +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1, @types/istanbul-lib-coverage@npm:^2.0.4, @types/istanbul-lib-coverage@npm:^2.0.6": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" checksum: 10/3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 @@ -3305,7 +3243,7 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-reports@npm:^3.0.0": +"@types/istanbul-reports@npm:^3.0.0, @types/istanbul-reports@npm:^3.0.4": version: 3.0.4 resolution: "@types/istanbul-reports@npm:3.0.4" dependencies: @@ -3314,13 +3252,13 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^29.0.0": - version: 29.5.8 - resolution: "@types/jest@npm:29.5.8" +"@types/jest@npm:^30.0.0": + version: 30.0.0 + resolution: "@types/jest@npm:30.0.0" dependencies: - expect: "npm:^29.0.0" - pretty-format: "npm:^29.0.0" - checksum: 10/a8194e26c642780d5b2e22170ac538f7975e04aeaa76d87f8e5ac921f7a8fffc5252029a9e6efacdb0ec4b45320322c8e1f27a5338083f49efbd3c6021314f7e + expect: "npm:^30.0.0" + pretty-format: "npm:^30.0.0" + checksum: 10/cdeaa924c68b5233d9ff92861a89e7042df2b0f197633729bcf3a31e65bd4e9426e751c5665b5ac2de0b222b33f100a5502da22aefce3d2c62931c715e88f209 languageName: node linkType: hard @@ -3338,13 +3276,13 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.6.11": - version: 2.6.11 - resolution: "@types/node-fetch@npm:2.6.11" +"@types/node-fetch@npm:^2.6.12": + version: 2.6.12 + resolution: "@types/node-fetch@npm:2.6.12" dependencies: "@types/node": "npm:*" form-data: "npm:^4.0.0" - checksum: 10/c416df8f182ec3826278ea42557fda08f169a48a05e60722d9c8edd4e5b2076ae281c6b6601ad406035b7201f885b0257983b61c26b3f9eb0f41192a807b5de5 + checksum: 10/8107c479da83a3114fcbfa882eba95ee5175cccb5e4dd53f737a96f2559ae6262f662176b8457c1656de09ec393cc7b20a266c077e4bfb21e929976e1cf4d0f9 languageName: node linkType: hard @@ -3357,10 +3295,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^16.4.1": - version: 16.18.61 - resolution: "@types/node@npm:16.18.61" - checksum: 10/ea2fdb3876f77ef8be0bdeee7b0c301a6bf27ab743f55a10486725d8ddd51b84edea7c219e9d09fd24650e8b14c040207a48169bd396915e7a989bac1a7c0bee +"@types/node@npm:^24.0.10": + version: 24.0.10 + resolution: "@types/node@npm:24.0.10" + dependencies: + undici-types: "npm:~7.8.0" + checksum: 10/ff8921c515d72fbc0a11ff282096e2d2e11ac04a2e9c7f765bcec5cb69cd367a88ab5dd556dc162ac98b9212957939b7ae80f12f3fc90db10c82135affd6d120 languageName: node linkType: hard @@ -3385,7 +3325,7 @@ __metadata: languageName: node linkType: hard -"@types/stack-utils@npm:^2.0.0": +"@types/stack-utils@npm:^2.0.3": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" checksum: 10/72576cc1522090fe497337c2b99d9838e320659ac57fa5560fcbdcbafcf5d0216c6b3a0a8a4ee4fdb3b1f5e3420aa4f6223ab57b82fef3578bec3206425c6cf5 @@ -3408,21 +3348,154 @@ __metadata: languageName: node linkType: hard -"@types/yargs@npm:^16.0.0": - version: 16.0.8 - resolution: "@types/yargs@npm:16.0.8" +"@types/yargs@npm:^17.0.33, @types/yargs@npm:^17.0.8": + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" dependencies: "@types/yargs-parser": "npm:*" - checksum: 10/8dce5176c55c5dc82128dde875d68d3514a83ecd3c014092e17e431ea9b25176699f3ab48378ce968519e339b00137372f2276e7ca1f272c4ddcc83f54da4f1c + checksum: 10/16f6681bf4d99fb671bf56029141ed01db2862e3db9df7fc92d8bea494359ac96a1b4b1c35a836d1e95e665fb18ad753ab2015fc0db663454e8fd4e5d5e2ef91 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.3.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm-eabi@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.10.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm64@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-android-arm64@npm:1.10.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.10.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-x64@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.10.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-freebsd-x64@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.10.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.10.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.10.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.10.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-musl@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.10.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.10.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.10.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.10.1" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.10.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-gnu@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.10.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-musl@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.10.1" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@types/yargs@npm:^17.0.8": - version: 17.0.31 - resolution: "@types/yargs@npm:17.0.31" +"@unrs/resolver-binding-wasm32-wasi@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.10.1" dependencies: - "@types/yargs-parser": "npm:*" - checksum: 10/9b180fc289cc7342a584e9e552dd667d60e6e0a436be67ed8feee681cb22de1ebffacd6a1e29c5905049850c10bb1c9db45d957cfd01a97f58b33e290b233b1f + "@napi-rs/wasm-runtime": "npm:^0.2.11" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.10.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.10.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-x64-msvc@npm:1.10.1": + version: 1.10.1 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.10.1" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3506,12 +3579,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.10.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" +"acorn@npm:^8.10.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 + checksum: 10/77f2de5051a631cf1729c090e5759148459cdb76b5f5c70f890503d629cf5052357b0ce783c0f976dd8a93c5150f59f6d18df1def3f502396a20f81282482fa4 languageName: node linkType: hard @@ -3571,7 +3644,7 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1": +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -3589,12 +3662,12 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^6.0.0": - version: 6.2.0 - resolution: "ansi-escapes@npm:6.2.0" +"ansi-escapes@npm:^7.0.0": + version: 7.0.0 + resolution: "ansi-escapes@npm:7.0.0" dependencies: - type-fest: "npm:^3.0.0" - checksum: 10/442f91b04650b35bc4815f47c20412d69ddbba5d4bf22f72ec03be352fca2de6819c7e3f4dfd17816ee4e0c6c965fe85e6f1b3f09683996a8d12fd366afd924e + environment: "npm:^1.0.0" + checksum: 10/2d0e2345087bd7ae6bf122b9cc05ee35560d40dcc061146edcdc02bc2d7c7c50143cd12a22e69a0b5c0f62b948b7bc9a4539ee888b80f5bd33cdfd82d01a70ab languageName: node linkType: hard @@ -3630,7 +3703,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^5.0.0": +"ansi-styles@npm:^5.2.0": version: 5.2.0 resolution: "ansi-styles@npm:5.2.0" checksum: 10/d7f4e97ce0623aea6bc0d90dcd28881ee04cba06c570b97fd3391bd7a268eedfd9d5e2dd4fdcbdd82b8105df5faf6f24aaedc08eaf3da898e702db5948f63469 @@ -3651,7 +3724,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": +"anymatch@npm:^3.1.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -3755,6 +3828,13 @@ __metadata: languageName: node linkType: hard +"async@npm:^3.2.3": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10/cb6e0561a3c01c4b56a799cc8bab6ea5fef45f069ab32500b6e19508db270ef2dffa55e5aed5865c5526e9907b1f8be61b27530823b411ffafb5e1538c86c368 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -3816,20 +3896,20 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^29.0.0, babel-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "babel-jest@npm:29.7.0" +"babel-jest@npm:30.0.4, babel-jest@npm:^30.0.4": + version: 30.0.4 + resolution: "babel-jest@npm:30.0.4" dependencies: - "@jest/transform": "npm:^29.7.0" - "@types/babel__core": "npm:^7.1.14" - babel-plugin-istanbul: "npm:^6.1.1" - babel-preset-jest: "npm:^29.6.3" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" + "@jest/transform": "npm:30.0.4" + "@types/babel__core": "npm:^7.20.5" + babel-plugin-istanbul: "npm:^7.0.0" + babel-preset-jest: "npm:30.0.1" + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" slash: "npm:^3.0.0" peerDependencies: - "@babel/core": ^7.8.0 - checksum: 10/8a0953bd813b3a8926008f7351611055548869e9a53dd36d6e7e96679001f71e65fd7dbfe253265c3ba6a4e630dc7c845cf3e78b17d758ef1880313ce8fba258 + "@babel/core": ^7.11.0 + checksum: 10/d037075c343dfdf77fc3a22c3cafb9cd1966f002426439a7c66d12af37e74bbb7040b867bf7691004f4802134bac32fa040a473db86163afae4847ef33c9bf0a languageName: node linkType: hard @@ -3861,15 +3941,27 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-plugin-jest-hoist@npm:29.6.3" +"babel-plugin-istanbul@npm:^7.0.0": + version: 7.0.0 + resolution: "babel-plugin-istanbul@npm:7.0.0" dependencies: - "@babel/template": "npm:^7.3.3" - "@babel/types": "npm:^7.3.3" - "@types/babel__core": "npm:^7.1.14" - "@types/babel__traverse": "npm:^7.0.6" - checksum: 10/9bfa86ec4170bd805ab8ca5001ae50d8afcb30554d236ba4a7ffc156c1a92452e220e4acbd98daefc12bf0216fccd092d0a2efed49e7e384ec59e0597a926d65 + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@istanbuljs/load-nyc-config": "npm:^1.0.0" + "@istanbuljs/schema": "npm:^0.1.3" + istanbul-lib-instrument: "npm:^6.0.2" + test-exclude: "npm:^6.0.0" + checksum: 10/4df567f29161c7f50737ed1884c7f08203f4d0cb1684c499fca374fcf5059396eacb02f8f727bf7a82bbf3e50b9f4a24bcb026a1678f63940d8f0f78546e3774 + languageName: node + linkType: hard + +"babel-plugin-jest-hoist@npm:30.0.1": + version: 30.0.1 + resolution: "babel-plugin-jest-hoist@npm:30.0.1" + dependencies: + "@babel/template": "npm:^7.27.2" + "@babel/types": "npm:^7.27.3" + "@types/babel__core": "npm:^7.20.5" + checksum: 10/4d8d0eb3726fb16b85322449fff15fa48404ef92dae48f9b0c956f6d504208e604e4e40fe71665433cb21f35be0faf5b2b11732330f67b3add66728edcfbcb93 languageName: node linkType: hard @@ -3909,37 +4001,40 @@ __metadata: languageName: node linkType: hard -"babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" +"babel-preset-current-node-syntax@npm:^1.1.0": + version: 1.1.0 + resolution: "babel-preset-current-node-syntax@npm:1.1.0" dependencies: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-bigint": "npm:^7.8.3" - "@babel/plugin-syntax-class-properties": "npm:^7.8.3" - "@babel/plugin-syntax-import-meta": "npm:^7.8.3" + "@babel/plugin-syntax-class-properties": "npm:^7.12.13" + "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" + "@babel/plugin-syntax-import-meta": "npm:^7.10.4" "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.8.3" + "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-top-level-await": "npm:^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/94561959cb12bfa80867c9eeeace7c3d48d61707d33e55b4c3fdbe82fc745913eb2dbfafca62aef297421b38aadcb58550e5943f50fbcebbeefd70ce2bed4b74 + checksum: 10/46331111ae72b7121172fd9e6a4a7830f651ad44bf26dbbf77b3c8a60a18009411a3eacb5e72274004290c110371230272109957d5224d155436b4794ead2f1b languageName: node linkType: hard -"babel-preset-jest@npm:^29.6.3": - version: 29.6.3 - resolution: "babel-preset-jest@npm:29.6.3" +"babel-preset-jest@npm:30.0.1": + version: 30.0.1 + resolution: "babel-preset-jest@npm:30.0.1" dependencies: - babel-plugin-jest-hoist: "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" + babel-plugin-jest-hoist: "npm:30.0.1" + babel-preset-current-node-syntax: "npm:^1.1.0" peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/aa4ff2a8a728d9d698ed521e3461a109a1e66202b13d3494e41eea30729a5e7cc03b3a2d56c594423a135429c37bf63a9fa8b0b9ce275298be3095a88c69f6fb + "@babel/core": ^7.11.0 + checksum: 10/fa37b0fa11baffd983f42663c7a4db61d9b10704bd061333950c3d2a191457930e68e172a93f6675d85cd6a1315fd6954143bda5709a3ba38ef7bd87a13d0aa6 languageName: node linkType: hard @@ -4029,7 +4124,7 @@ __metadata: languageName: node linkType: hard -"bs-logger@npm:0.x": +"bs-logger@npm:^0.2.6": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" dependencies: @@ -4054,18 +4149,18 @@ __metadata: languageName: node linkType: hard -"bundle-require@npm:^4.0.0": - version: 4.0.2 - resolution: "bundle-require@npm:4.0.2" +"bundle-require@npm:^5.1.0": + version: 5.1.0 + resolution: "bundle-require@npm:5.1.0" dependencies: load-tsconfig: "npm:^0.2.3" peerDependencies: - esbuild: ">=0.17" - checksum: 10/22178607249adb52cc76e409add67930b81cdc6507ed8cbd7b162dc2824ce53c51b669d01bf073e9b7cd9d98f10f3dbf9a3285345813085b856d437cdc97e162 + esbuild: ">=0.18" + checksum: 10/735e0220055b9bdac20bea48ec1e10dc3a205232c889ef54767900bebdc721959c4ccb221e4ea434d7ddcd693a8a4445c3d0598e4040ee313ce0ac3aae3e6178 languageName: node linkType: hard -"cac@npm:^6.7.12": +"cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" checksum: 10/002769a0fbfc51c062acd2a59df465a2a947916b02ac50b56c69ec6c018ee99ac3e7f4dd7366334ea847f1ecacf4defaa61bcd2ac283db50156ce1f1d8c8ad42 @@ -4104,7 +4199,7 @@ __metadata: languageName: node linkType: hard -"callsites@npm:^3.0.0": +"callsites@npm:^3.0.0, callsites@npm:^3.1.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" checksum: 10/072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 @@ -4118,7 +4213,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.2.0": +"camelcase@npm:^6.3.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" checksum: 10/8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d @@ -4182,7 +4277,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0": +"chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -4199,13 +4294,6 @@ __metadata: languageName: node linkType: hard -"char-regex@npm:^2.0.0": - version: 2.0.1 - resolution: "char-regex@npm:2.0.1" - checksum: 10/fadd100b963c160a70192e47e122c654cadf447c2c8f23b0bda4dc9ef1a02c993abbb0f21f50e2e58f90a8453ca019b3c86f001688cb42fb7b54af4e661b1ada - languageName: node - linkType: hard - "check-error@npm:^2.1.1": version: 2.1.1 resolution: "check-error@npm:2.1.1" @@ -4213,7 +4301,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.0, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3": +"chokidar@npm:^3.4.0, chokidar@npm:^3.5.3": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -4232,6 +4320,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^4.0.3": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10/bf2a575ea5596000e88f5db95461a9d59ad2047e939d5a4aac59dd472d126be8f1c1ff3c7654b477cf532d18f42a97279ef80ee847972fd2a25410bf00b80b59 + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -4239,17 +4336,17 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^3.2.0": - version: 3.9.0 - resolution: "ci-info@npm:3.9.0" - checksum: 10/75bc67902b4d1c7b435497adeb91598f6d52a3389398e44294f6601b20cfef32cf2176f7be0eb961d9e085bb333a8a5cae121cb22f81cf238ae7f58eb80e9397 +"ci-info@npm:^4.2.0": + version: 4.2.0 + resolution: "ci-info@npm:4.2.0" + checksum: 10/928d8457f3476ffc4a66dec93b9cdf1944d5e60dba69fbd6a0fc95b652386f6ef64857f6e32372533210ef6d8954634af2c7693d7c07778ee015f3629a5e0dd9 languageName: node linkType: hard -"cjs-module-lexer@npm:^1.0.0": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 10/f96a5118b0a012627a2b1c13bd2fcb92509778422aaa825c5da72300d6dcadfb47134dd2e9d97dfa31acd674891dd91642742772d19a09a8adc3e56bd2f5928c +"cjs-module-lexer@npm:^2.1.0": + version: 2.1.0 + resolution: "cjs-module-lexer@npm:2.1.0" + checksum: 10/97cf8e7ddbf685ce0fe1a89349f42a015e89ddf02f1f0d764ddb8a07bd642d58a036c21b5cae078cdf6a96b332b95f806948d772adcd2c346ce5a897f5feefb7 languageName: node linkType: hard @@ -4308,7 +4405,7 @@ __metadata: languageName: node linkType: hard -"collect-v8-coverage@npm:^1.0.0": +"collect-v8-coverage@npm:^1.0.2": version: 1.0.2 resolution: "collect-v8-coverage@npm:1.0.2" checksum: 10/30ea7d5c9ee51f2fdba4901d4186c5b7114a088ef98fd53eda3979da77eed96758a2cae81cc6d97e239aaea6065868cf908b24980663f7b7e96aa291b3e12fa4 @@ -4472,6 +4569,20 @@ __metadata: languageName: node linkType: hard +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 10/4ebcfb1c6a3b25276734ec5722e88768eb61fc02f98e11960b845c5c62bc27fd05f493d2a8244d9675b24ef95afe4c0d511cdcad02c72f5eeea463cc26687999 + languageName: node + linkType: hard + +"consola@npm:^3.4.0": + version: 3.4.2 + resolution: "consola@npm:3.4.2" + checksum: 10/32192c9f50d7cac27c5d7c4ecd3ff3679aea863e6bf5bd6a9cc2b05d1cd78addf5dae71df08c54330c142be8e7fbd46f051030129b57c6aacdd771efe409c4b2 + languageName: node + linkType: hard + "convert-source-map@npm:^1.6.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" @@ -4508,23 +4619,6 @@ __metadata: languageName: node linkType: hard -"create-jest@npm:^29.7.0": - version: 29.7.0 - resolution: "create-jest@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - exit: "npm:^0.1.2" - graceful-fs: "npm:^4.2.9" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - prompts: "npm:^2.0.1" - bin: - create-jest: bin/create-jest.js - checksum: 10/847b4764451672b4174be4d5c6d7d63442ec3aa5f3de52af924e4d996d87d7801c18e125504f25232fc75840f6625b3ac85860fac6ce799b5efae7bdcaf4a2b7 - languageName: node - linkType: hard - "create-require@npm:^1.1.0": version: 1.1.1 resolution: "create-require@npm:1.1.1" @@ -4567,6 +4661,13 @@ __metadata: languageName: node linkType: hard +"data-uri-to-buffer@npm:^4.0.0": + version: 4.0.1 + resolution: "data-uri-to-buffer@npm:4.0.1" + checksum: 10/0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c + languageName: node + linkType: hard + "date-fns@npm:^2.29.1": version: 2.30.0 resolution: "date-fns@npm:2.30.0" @@ -4576,15 +4677,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4": - version: 4.3.7 - resolution: "debug@npm:4.3.7" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.1 + resolution: "debug@npm:4.4.1" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a + checksum: 10/8e2709b2144f03c7950f8804d01ccb3786373df01e406a0f66928e47001cf2d336cbed9ee137261d4f90d68d8679468c755e3548ed83ddacdc82b194d2468afe languageName: node linkType: hard @@ -4614,15 +4715,15 @@ __metadata: languageName: node linkType: hard -"dedent@npm:^1.0.0": - version: 1.5.1 - resolution: "dedent@npm:1.5.1" +"dedent@npm:^1.6.0": + version: 1.6.0 + resolution: "dedent@npm:1.6.0" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: 10/fc00a8bc3dfb7c413a778dc40ee8151b6c6ff35159d641f36ecd839c1df5c6e0ec5f4992e658c82624a1a62aaecaffc23b9c965ceb0bbf4d698bfc16469ac27d + checksum: 10/f100cb11001309f2185c4334c6f29e5323c1e73b7b75e3b1893bc71ef53cd13fb80534efc8fa7163a891ede633e310a9c600ba38c363cc9d14a72f238fe47078 languageName: node linkType: hard @@ -4640,7 +4741,7 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.0.0, deepmerge@npm:^4.2.2": +"deepmerge@npm:^4.0.0, deepmerge@npm:^4.3.1": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 10/058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529 @@ -4700,20 +4801,13 @@ __metadata: languageName: node linkType: hard -"detect-newline@npm:^3.0.0": +"detect-newline@npm:^3.1.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" checksum: 10/ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 languageName: node linkType: hard -"diff-sequences@npm:^29.6.3": - version: 29.6.3 - resolution: "diff-sequences@npm:29.6.3" - checksum: 10/179daf9d2f9af5c57ad66d97cb902a538bcf8ed64963fa7aa0c329b3de3665ce2eb6ffdc2f69f29d445fa4af2517e5e55e5b6e00c00a9ae4f43645f97f7078cb - languageName: node - linkType: hard - "diff@npm:^4.0.1": version: 4.0.2 resolution: "diff@npm:4.0.2" @@ -4821,6 +4915,17 @@ __metadata: languageName: node linkType: hard +"ejs@npm:^3.1.10": + version: 3.1.10 + resolution: "ejs@npm:3.1.10" + dependencies: + jake: "npm:^10.8.5" + bin: + ejs: bin/cli.js + checksum: 10/a9cb7d7cd13b7b1cd0be5c4788e44dd10d92f7285d2f65b942f33e127230c054f99a42db4d99f766d8dbc6c57e94799593ee66a14efd7c8dd70c4812bf6aa384 + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.5.41": version: 1.5.50 resolution: "electron-to-chromium@npm:1.5.50" @@ -4918,6 +5023,13 @@ __metadata: languageName: node linkType: hard +"environment@npm:^1.0.0": + version: 1.1.0 + resolution: "environment@npm:1.1.0" + checksum: 10/dd3c1b9825e7f71f1e72b03c2344799ac73f2e9ef81b78ea8b373e55db021786c6b9f3858ea43a436a2c4611052670ec0afe85bc029c384cc71165feee2f4ba6 + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -4941,83 +5053,6 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.17.6": - version: 0.17.19 - resolution: "esbuild@npm:0.17.19" - dependencies: - "@esbuild/android-arm": "npm:0.17.19" - "@esbuild/android-arm64": "npm:0.17.19" - "@esbuild/android-x64": "npm:0.17.19" - "@esbuild/darwin-arm64": "npm:0.17.19" - "@esbuild/darwin-x64": "npm:0.17.19" - "@esbuild/freebsd-arm64": "npm:0.17.19" - "@esbuild/freebsd-x64": "npm:0.17.19" - "@esbuild/linux-arm": "npm:0.17.19" - "@esbuild/linux-arm64": "npm:0.17.19" - "@esbuild/linux-ia32": "npm:0.17.19" - "@esbuild/linux-loong64": "npm:0.17.19" - "@esbuild/linux-mips64el": "npm:0.17.19" - "@esbuild/linux-ppc64": "npm:0.17.19" - "@esbuild/linux-riscv64": "npm:0.17.19" - "@esbuild/linux-s390x": "npm:0.17.19" - "@esbuild/linux-x64": "npm:0.17.19" - "@esbuild/netbsd-x64": "npm:0.17.19" - "@esbuild/openbsd-x64": "npm:0.17.19" - "@esbuild/sunos-x64": "npm:0.17.19" - "@esbuild/win32-arm64": "npm:0.17.19" - "@esbuild/win32-ia32": "npm:0.17.19" - "@esbuild/win32-x64": "npm:0.17.19" - dependenciesMeta: - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10/86ada7cad6d37a3445858fee31ca39fc6c0436c7c00b2e07b9ce308235be67f36aefe0dda25da9ab08653fde496d1e759d6ad891ce9479f9e1fb4964c8f2a0fa - languageName: node - linkType: hard - "esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0, esbuild@npm:^0.25.0": version: 0.25.3 resolution: "esbuild@npm:0.25.3" @@ -5191,7 +5226,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0": +"execa@npm:^5.0.0, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -5208,6 +5243,13 @@ __metadata: languageName: node linkType: hard +"exit-x@npm:^0.2.2": + version: 0.2.2 + resolution: "exit-x@npm:0.2.2" + checksum: 10/ee043053e6c1e237adf5ad9c4faf9f085b606f64a4ff859e2b138fab63fe642711d00c9af452a9134c4c92c55f752e818bfabab78c24d345022db163f3137027 + languageName: node + linkType: hard + "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -5231,16 +5273,17 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0, expect@npm:^29.7.0": - version: 29.7.0 - resolution: "expect@npm:29.7.0" +"expect@npm:30.0.4, expect@npm:^30.0.0": + version: 30.0.4 + resolution: "expect@npm:30.0.4" dependencies: - "@jest/expect-utils": "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10/63f97bc51f56a491950fb525f9ad94f1916e8a014947f8d8445d3847a665b5471b768522d659f5e865db20b6c2033d2ac10f35fcbd881a4d26407a4f6f18451a + "@jest/expect-utils": "npm:30.0.4" + "@jest/get-type": "npm:30.0.1" + jest-matcher-utils: "npm:30.0.4" + jest-message-util: "npm:30.0.2" + jest-mock: "npm:30.0.2" + jest-util: "npm:30.0.2" + checksum: 10/ae2f50eba05614060dbf0340dde110df4d659a10075d9d3a550bc6501ed24c00b379021fc56786a64259a39a30737ef73c51e9711e1cd2ff13f81606c059bd18 languageName: node linkType: hard @@ -5294,7 +5337,7 @@ __metadata: languageName: node linkType: hard -"fb-watchman@npm:^2.0.0": +"fb-watchman@npm:^2.0.2": version: 2.0.2 resolution: "fb-watchman@npm:2.0.2" dependencies: @@ -5315,6 +5358,16 @@ __metadata: languageName: node linkType: hard +"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": + version: 3.2.0 + resolution: "fetch-blob@npm:3.2.0" + dependencies: + node-domexception: "npm:^1.0.0" + web-streams-polyfill: "npm:^3.0.3" + checksum: 10/5264ecceb5fdc19eb51d1d0359921f12730941e333019e673e71eb73921146dceabcb0b8f534582be4497312d656508a439ad0f5edeec2b29ab2e10c72a1f86b + languageName: node + linkType: hard + "figures@npm:^2.0.0": version: 2.0.0 resolution: "figures@npm:2.0.0" @@ -5324,6 +5377,15 @@ __metadata: languageName: node linkType: hard +"filelist@npm:^1.0.4": + version: 1.0.4 + resolution: "filelist@npm:1.0.4" + dependencies: + minimatch: "npm:^5.0.1" + checksum: 10/4b436fa944b1508b95cffdfc8176ae6947b92825483639ef1b9a89b27d82f3f8aa22b21eed471993f92709b431670d4e015b39c087d435a61e1bb04564cf51de + languageName: node + linkType: hard + "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -5425,6 +5487,17 @@ __metadata: languageName: node linkType: hard +"fix-dts-default-cjs-exports@npm:^1.0.0": + version: 1.0.1 + resolution: "fix-dts-default-cjs-exports@npm:1.0.1" + dependencies: + magic-string: "npm:^0.30.17" + mlly: "npm:^1.7.4" + rollup: "npm:^4.34.8" + checksum: 10/3324418bb63c93b6b22a808e242d220caba804860c24218b2912abc4525525334fcdcb62d22be6472a8d84ee2ad4165bc79554140c3369eb11d23220cdd986ce + languageName: node + linkType: hard + "follow-redirects@npm:^1.15.0": version: 1.15.3 resolution: "follow-redirects@npm:1.15.3" @@ -5466,6 +5539,15 @@ __metadata: languageName: node linkType: hard +"formdata-polyfill@npm:^4.0.10": + version: 4.0.10 + resolution: "formdata-polyfill@npm:4.0.10" + dependencies: + fetch-blob: "npm:^3.1.2" + checksum: 10/9b5001d2edef3c9449ac3f48bd4f8cc92e7d0f2e7c1a5c8ba555ad4e77535cc5cf621fabe49e97f304067037282dd9093b9160a3cb533e46420b446c4e6bc06f + languageName: node + linkType: hard + "fp-ts@npm:^2.5.3": version: 2.16.1 resolution: "fp-ts@npm:2.16.1" @@ -5529,7 +5611,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": +"fsevents@npm:^2.3.3, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -5548,7 +5630,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A^2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A^2.3.3#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -5628,20 +5710,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.6": - version: 7.1.6 - resolution: "glob@npm:7.1.6" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.0.4" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10/7d6ec98bc746980d5fe4d764b9c7ada727e3fbd2a7d85cd96dd95fb18638c9c54a70c692fd2ab5d68a186dc8cd9d6a4192d3df220beed891f687db179c430237 - languageName: node - linkType: hard - "glob@npm:^10.0.0, glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.4.5 resolution: "glob@npm:10.4.5" @@ -5701,7 +5769,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.1, globby@npm:^11.0.3": +"globby@npm:^11.0.1": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -5736,7 +5804,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 @@ -5924,15 +5992,15 @@ __metadata: languageName: node linkType: hard -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" +"import-local@npm:^3.2.0": + version: 3.2.0 + resolution: "import-local@npm:3.2.0" dependencies: pkg-dir: "npm:^4.2.0" resolve-cwd: "npm:^3.0.0" bin: import-local-fixture: fixtures/cli.js - checksum: 10/bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + checksum: 10/0b0b0b412b2521739fbb85eeed834a3c34de9bc67e670b3d0b86248fc460d990a7b116ad056c084b87a693ef73d1f17268d6a5be626bb43c998a8b1c8a230004 languageName: node linkType: hard @@ -6045,7 +6113,7 @@ __metadata: languageName: node linkType: hard -"is-generator-fn@npm:^2.0.0": +"is-generator-fn@npm:^2.1.0": version: 2.1.0 resolution: "is-generator-fn@npm:2.1.0" checksum: 10/a6ad5492cf9d1746f73b6744e0c43c0020510b59d56ddcb78a91cbc173f09b5e6beff53d75c9c5a29feb618bfef2bf458e025ecf3a57ad2268e2fb2569f56215 @@ -6202,7 +6270,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-instrument@npm:^6.0.0, istanbul-lib-instrument@npm:^6.0.1": +"istanbul-lib-instrument@npm:^6.0.0, istanbul-lib-instrument@npm:^6.0.1, istanbul-lib-instrument@npm:^6.0.2": version: 6.0.3 resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: @@ -6251,6 +6319,17 @@ __metadata: languageName: node linkType: hard +"istanbul-lib-source-maps@npm:^5.0.0": + version: 5.0.6 + resolution: "istanbul-lib-source-maps@npm:5.0.6" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.23" + debug: "npm:^4.1.1" + istanbul-lib-coverage: "npm:^3.0.0" + checksum: 10/569dd0a392ee3464b1fe1accbaef5cc26de3479eacb5b91d8c67ebb7b425d39fd02247d85649c3a0e9c29b600809fa60b5af5a281a75a89c01f385b1e24823a2 + languageName: node + linkType: hard + "istanbul-reports@npm:^3.0.2, istanbul-reports@npm:^3.1.3": version: 3.1.5 resolution: "istanbul-reports@npm:3.1.5" @@ -6274,6 +6353,20 @@ __metadata: languageName: node linkType: hard +"jake@npm:^10.8.5": + version: 10.9.2 + resolution: "jake@npm:10.9.2" + dependencies: + async: "npm:^3.2.3" + chalk: "npm:^4.0.2" + filelist: "npm:^1.0.4" + minimatch: "npm:^3.1.2" + bin: + jake: bin/cli.js + checksum: 10/3be324708f99f031e0aec49ef8fd872eb4583cbe8a29a0c875f554f6ac638ee4ea5aa759bb63723fd54f77ca6d7db851eaa78353301734ed3700db9cb109a0cd + languageName: node + linkType: hard + "java-properties@npm:^1.0.0": version: 1.0.2 resolution: "java-properties@npm:1.0.2" @@ -6281,184 +6374,181 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-changed-files@npm:29.7.0" +"jest-changed-files@npm:30.0.2": + version: 30.0.2 + resolution: "jest-changed-files@npm:30.0.2" dependencies: - execa: "npm:^5.0.0" - jest-util: "npm:^29.7.0" + execa: "npm:^5.1.1" + jest-util: "npm:30.0.2" p-limit: "npm:^3.1.0" - checksum: 10/3d93742e56b1a73a145d55b66e96711fbf87ef89b96c2fab7cfdfba8ec06612591a982111ca2b712bb853dbc16831ec8b43585a2a96b83862d6767de59cbf83d + checksum: 10/34899f908f4ed5c95e9993ca31a49faaa1b641d557277238388348f875a3cb04f358ed411de6e496e353cb68c85a53819a53b6e5cfffe20b13c303d601c78ac7 languageName: node linkType: hard -"jest-circus@npm:^29.6.4, jest-circus@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-circus@npm:29.7.0" +"jest-circus@npm:30.0.4, jest-circus@npm:^30.0.4": + version: 30.0.4 + resolution: "jest-circus@npm:30.0.4" dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/expect": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" + "@jest/environment": "npm:30.0.4" + "@jest/expect": "npm:30.0.4" + "@jest/test-result": "npm:30.0.4" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - chalk: "npm:^4.0.0" + chalk: "npm:^4.1.2" co: "npm:^4.6.0" - dedent: "npm:^1.0.0" - is-generator-fn: "npm:^2.0.0" - jest-each: "npm:^29.7.0" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" + dedent: "npm:^1.6.0" + is-generator-fn: "npm:^2.1.0" + jest-each: "npm:30.0.2" + jest-matcher-utils: "npm:30.0.4" + jest-message-util: "npm:30.0.2" + jest-runtime: "npm:30.0.4" + jest-snapshot: "npm:30.0.4" + jest-util: "npm:30.0.2" p-limit: "npm:^3.1.0" - pretty-format: "npm:^29.7.0" - pure-rand: "npm:^6.0.0" + pretty-format: "npm:30.0.2" + pure-rand: "npm:^7.0.0" slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10/716a8e3f40572fd0213bcfc1da90274bf30d856e5133af58089a6ce45089b63f4d679bd44e6be9d320e8390483ebc3ae9921981993986d21639d9019b523123d + stack-utils: "npm:^2.0.6" + checksum: 10/bbd713a4936919f9b0851993aea707466049358414abfefd0d1805bbab9e7702d3138ac876c2341ca4372bf05059d501e3bf0f9e37bff7c714e860b96fde9376 languageName: node linkType: hard -"jest-cli@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-cli@npm:29.7.0" +"jest-cli@npm:30.0.4": + version: 30.0.4 + resolution: "jest-cli@npm:30.0.4" dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - create-jest: "npm:^29.7.0" - exit: "npm:^0.1.2" - import-local: "npm:^3.0.2" - jest-config: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - yargs: "npm:^17.3.1" + "@jest/core": "npm:30.0.4" + "@jest/test-result": "npm:30.0.4" + "@jest/types": "npm:30.0.1" + chalk: "npm:^4.1.2" + exit-x: "npm:^0.2.2" + import-local: "npm:^3.2.0" + jest-config: "npm:30.0.4" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + yargs: "npm:^17.7.2" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true bin: - jest: bin/jest.js - checksum: 10/6cc62b34d002c034203065a31e5e9a19e7c76d9e8ef447a6f70f759c0714cb212c6245f75e270ba458620f9c7b26063cd8cf6cd1f7e3afd659a7cc08add17307 + jest: ./bin/jest.js + checksum: 10/dd15284405bdf62ba76f316270ddaaa76517b5ea75003bfefc6d652a6a5c0e9a9ba38a1daf13c17acfd0d8d4f7ffb332e89256429ed264ef5a5effa3bf412c5c languageName: node linkType: hard -"jest-config@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-config@npm:29.7.0" +"jest-config@npm:30.0.4": + version: 30.0.4 + resolution: "jest-config@npm:30.0.4" dependencies: - "@babel/core": "npm:^7.11.6" - "@jest/test-sequencer": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-jest: "npm:^29.7.0" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - deepmerge: "npm:^4.2.2" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-circus: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-runner: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - micromatch: "npm:^4.0.4" + "@babel/core": "npm:^7.27.4" + "@jest/get-type": "npm:30.0.1" + "@jest/pattern": "npm:30.0.1" + "@jest/test-sequencer": "npm:30.0.4" + "@jest/types": "npm:30.0.1" + babel-jest: "npm:30.0.4" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.2.0" + deepmerge: "npm:^4.3.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.11" + jest-circus: "npm:30.0.4" + jest-docblock: "npm:30.0.1" + jest-environment-node: "npm:30.0.4" + jest-regex-util: "npm:30.0.1" + jest-resolve: "npm:30.0.2" + jest-runner: "npm:30.0.4" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + micromatch: "npm:^4.0.8" parse-json: "npm:^5.2.0" - pretty-format: "npm:^29.7.0" + pretty-format: "npm:30.0.2" slash: "npm:^3.0.0" strip-json-comments: "npm:^3.1.1" peerDependencies: "@types/node": "*" + esbuild-register: ">=3.4.0" ts-node: ">=9.0.0" peerDependenciesMeta: "@types/node": optional: true + esbuild-register: + optional: true ts-node: optional: true - checksum: 10/6bdf570e9592e7d7dd5124fc0e21f5fe92bd15033513632431b211797e3ab57eaa312f83cc6481b3094b72324e369e876f163579d60016677c117ec4853cf02b + checksum: 10/0bd9a8300b36c05accc4120429c7c100d4a73652b13c669756c8f4beaa2fc5e1e8936b7486209d8938a33e127254e594cb7a29c950bbe72d92b4ec906815a208 languageName: node linkType: hard -"jest-diff@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-diff@npm:29.7.0" +"jest-diff@npm:30.0.4": + version: 30.0.4 + resolution: "jest-diff@npm:30.0.4" dependencies: - chalk: "npm:^4.0.0" - diff-sequences: "npm:^29.6.3" - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10/6f3a7eb9cd9de5ea9e5aa94aed535631fa6f80221832952839b3cb59dd419b91c20b73887deb0b62230d06d02d6b6cf34ebb810b88d904bb4fe1e2e4f0905c98 + "@jest/diff-sequences": "npm:30.0.1" + "@jest/get-type": "npm:30.0.1" + chalk: "npm:^4.1.2" + pretty-format: "npm:30.0.2" + checksum: 10/4501182ea681741e18f594589ae9baa0d889a92b48d477344ab8f1ce943c5988b9361c50a51670afc72a64bf4698622045806d24c3074906bc12760729377186 languageName: node linkType: hard -"jest-docblock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-docblock@npm:29.7.0" +"jest-docblock@npm:30.0.1": + version: 30.0.1 + resolution: "jest-docblock@npm:30.0.1" dependencies: - detect-newline: "npm:^3.0.0" - checksum: 10/8d48818055bc96c9e4ec2e217a5a375623c0d0bfae8d22c26e011074940c202aa2534a3362294c81d981046885c05d304376afba9f2874143025981148f3e96d + detect-newline: "npm:^3.1.0" + checksum: 10/92ebee39282e764cd64bbfffe4a1bbae323e3b01684028c7206aada198314522a8ebe6892660d2ddeeb9a4b8d270a90da8af0fc654502a428e412867d732a459 languageName: node linkType: hard -"jest-each@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-each@npm:29.7.0" +"jest-each@npm:30.0.2": + version: 30.0.2 + resolution: "jest-each@npm:30.0.2" dependencies: - "@jest/types": "npm:^29.6.3" - chalk: "npm:^4.0.0" - jest-get-type: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - pretty-format: "npm:^29.7.0" - checksum: 10/bd1a077654bdaa013b590deb5f7e7ade68f2e3289180a8c8f53bc8a49f3b40740c0ec2d3a3c1aee906f682775be2bebbac37491d80b634d15276b0aa0f2e3fda + "@jest/get-type": "npm:30.0.1" + "@jest/types": "npm:30.0.1" + chalk: "npm:^4.1.2" + jest-util: "npm:30.0.2" + pretty-format: "npm:30.0.2" + checksum: 10/5dd3e43d657a6c779c3db665a67a2888e80c27a4d38a63763328c3b56d602f7e4414a278b536107eb0581c54fd890f14a1231946796846023640bc62947cecb2 languageName: node linkType: hard -"jest-environment-node@npm:^29.6.4, jest-environment-node@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-environment-node@npm:29.7.0" +"jest-environment-node@npm:30.0.4, jest-environment-node@npm:^30.0.4": + version: 30.0.4 + resolution: "jest-environment-node@npm:30.0.4" dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/fake-timers": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" + "@jest/environment": "npm:30.0.4" + "@jest/fake-timers": "npm:30.0.4" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - jest-mock: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - checksum: 10/9cf7045adf2307cc93aed2f8488942e39388bff47ec1df149a997c6f714bfc66b2056768973770d3f8b1bf47396c19aa564877eb10ec978b952c6018ed1bd637 + jest-mock: "npm:30.0.2" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" + checksum: 10/37f4f5aa622d04f3541bafa21e44f6bdde6b4b5b98dcb3c752bec6f50f3f4a4a85311b1a0c559102a048247c9cc0db872c822b7d2191fb806f4087d0c269ac39 languageName: node linkType: hard -"jest-get-type@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-get-type@npm:29.6.3" - checksum: 10/88ac9102d4679d768accae29f1e75f592b760b44277df288ad76ce5bf038c3f5ce3719dea8aa0f035dac30e9eb034b848ce716b9183ad7cc222d029f03e92205 - languageName: node - linkType: hard - -"jest-haste-map@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-haste-map@npm:29.7.0" +"jest-haste-map@npm:30.0.2": + version: 30.0.2 + resolution: "jest-haste-map@npm:30.0.2" dependencies: - "@jest/types": "npm:^29.6.3" - "@types/graceful-fs": "npm:^4.1.3" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - anymatch: "npm:^3.0.3" - fb-watchman: "npm:^2.0.0" - fsevents: "npm:^2.3.2" - graceful-fs: "npm:^4.2.9" - jest-regex-util: "npm:^29.6.3" - jest-util: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" - micromatch: "npm:^4.0.4" + anymatch: "npm:^3.1.3" + fb-watchman: "npm:^2.0.2" + fsevents: "npm:^2.3.3" + graceful-fs: "npm:^4.2.11" + jest-regex-util: "npm:30.0.1" + jest-util: "npm:30.0.2" + jest-worker: "npm:30.0.2" + micromatch: "npm:^4.0.8" walker: "npm:^1.0.8" dependenciesMeta: fsevents: optional: true - checksum: 10/8531b42003581cb18a69a2774e68c456fb5a5c3280b1b9b77475af9e346b6a457250f9d756bfeeae2fe6cbc9ef28434c205edab9390ee970a919baddfa08bb85 + checksum: 10/7b62fff11833d7668ccb03bee6ce3fed026accb34b24cb723bbb3ebbec665509f968f2c042ab8e6402313d8d9ff02f26827d8cd1f98665f5e22765e32508d8af languageName: node linkType: hard @@ -6495,53 +6585,53 @@ __metadata: languageName: node linkType: hard -"jest-leak-detector@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-leak-detector@npm:29.7.0" +"jest-leak-detector@npm:30.0.2": + version: 30.0.2 + resolution: "jest-leak-detector@npm:30.0.2" dependencies: - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10/e3950e3ddd71e1d0c22924c51a300a1c2db6cf69ec1e51f95ccf424bcc070f78664813bef7aed4b16b96dfbdeea53fe358f8aeaaea84346ae15c3735758f1605 + "@jest/get-type": "npm:30.0.1" + pretty-format: "npm:30.0.2" + checksum: 10/bb570d6aeb5187efa0a929d58104819e725ac7dbe4b57d0b9aa8a4ed456c75be64cf13ab28ced59f13a383a24ac87dcfa2867b4fcb2648f784bd2138e5756511 languageName: node linkType: hard -"jest-matcher-utils@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-matcher-utils@npm:29.7.0" +"jest-matcher-utils@npm:30.0.4": + version: 30.0.4 + resolution: "jest-matcher-utils@npm:30.0.4" dependencies: - chalk: "npm:^4.0.0" - jest-diff: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - pretty-format: "npm:^29.7.0" - checksum: 10/981904a494299cf1e3baed352f8a3bd8b50a8c13a662c509b6a53c31461f94ea3bfeffa9d5efcfeb248e384e318c87de7e3baa6af0f79674e987482aa189af40 + "@jest/get-type": "npm:30.0.1" + chalk: "npm:^4.1.2" + jest-diff: "npm:30.0.4" + pretty-format: "npm:30.0.2" + checksum: 10/9b0911e7be555c66bdccb231bde749ea16e02acd290f9ae01006862142e59a206330872e813bc146d1feab62d0245ababc19f4a97ecef7964f364f78717a737c languageName: node linkType: hard -"jest-message-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-message-util@npm:29.7.0" +"jest-message-util@npm:30.0.2": + version: 30.0.2 + resolution: "jest-message-util@npm:30.0.2" dependencies: - "@babel/code-frame": "npm:^7.12.13" - "@jest/types": "npm:^29.6.3" - "@types/stack-utils": "npm:^2.0.0" - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - micromatch: "npm:^4.0.4" - pretty-format: "npm:^29.7.0" + "@babel/code-frame": "npm:^7.27.1" + "@jest/types": "npm:30.0.1" + "@types/stack-utils": "npm:^2.0.3" + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" + micromatch: "npm:^4.0.8" + pretty-format: "npm:30.0.2" slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.3" - checksum: 10/31d53c6ed22095d86bab9d14c0fa70c4a92c749ea6ceece82cf30c22c9c0e26407acdfbdb0231435dc85a98d6d65ca0d9cbcd25cd1abb377fe945e843fb770b9 + stack-utils: "npm:^2.0.6" + checksum: 10/61b67d807d18eeea114088e33e29a88e59293fd96adee52e64fddbf9523409bc5e4cf71a8c623150a4b4870337430a4b38f19622119f4dc7d06081230dd63e01 languageName: node linkType: hard -"jest-mock@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-mock@npm:29.7.0" +"jest-mock@npm:30.0.2": + version: 30.0.2 + resolution: "jest-mock@npm:30.0.2" dependencies: - "@jest/types": "npm:^29.6.3" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - jest-util: "npm:^29.7.0" - checksum: 10/ae51d1b4f898724be5e0e52b2268a68fcd876d9b20633c864a6dd6b1994cbc48d62402b0f40f3a1b669b30ebd648821f086c26c08ffde192ced951ff4670d51c + jest-util: "npm:30.0.2" + checksum: 10/79d13e7374f736919d9ad82858ba59771b7452b0c40fe5452aa3f5f07b2563f9d597e007f7c0ff8ed8fa9cdf12abe049868a6dd7b76d23995532039e894184f6 languageName: node linkType: hard @@ -6564,7 +6654,7 @@ __metadata: languageName: node linkType: hard -"jest-pnp-resolver@npm:^1.2.2": +"jest-pnp-resolver@npm:^1.2.3": version: 1.2.3 resolution: "jest-pnp-resolver@npm:1.2.3" peerDependencies: @@ -6594,96 +6684,96 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^29.0.0, jest-regex-util@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-regex-util@npm:29.6.3" - checksum: 10/0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a +"jest-regex-util@npm:30.0.1, jest-regex-util@npm:^30.0.0": + version: 30.0.1 + resolution: "jest-regex-util@npm:30.0.1" + checksum: 10/fa8dac80c3e94db20d5e1e51d1bdf101cf5ede8f4e0b8f395ba8b8ea81e71804ffd747452a6bb6413032865de98ac656ef8ae43eddd18d980b6442a2764ed562 languageName: node linkType: hard -"jest-resolve-dependencies@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve-dependencies@npm:29.7.0" +"jest-resolve-dependencies@npm:30.0.4": + version: 30.0.4 + resolution: "jest-resolve-dependencies@npm:30.0.4" dependencies: - jest-regex-util: "npm:^29.6.3" - jest-snapshot: "npm:^29.7.0" - checksum: 10/1e206f94a660d81e977bcfb1baae6450cb4a81c92e06fad376cc5ea16b8e8c6ea78c383f39e95591a9eb7f925b6a1021086c38941aa7c1b8a6a813c2f6e93675 + jest-regex-util: "npm:30.0.1" + jest-snapshot: "npm:30.0.4" + checksum: 10/459d22c14bcd6c14412e2773e6c375de52243f2a0fb3b89d4f5d43cbe252de8d925cd9177592f679cb694394d94f3e7b94cbb88465df601da76201148e01d735 languageName: node linkType: hard -"jest-resolve@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-resolve@npm:29.7.0" +"jest-resolve@npm:30.0.2": + version: 30.0.2 + resolution: "jest-resolve@npm:30.0.2" dependencies: - chalk: "npm:^4.0.0" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-pnp-resolver: "npm:^1.2.2" - jest-util: "npm:^29.7.0" - jest-validate: "npm:^29.7.0" - resolve: "npm:^1.20.0" - resolve.exports: "npm:^2.0.0" + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" + jest-haste-map: "npm:30.0.2" + jest-pnp-resolver: "npm:^1.2.3" + jest-util: "npm:30.0.2" + jest-validate: "npm:30.0.2" slash: "npm:^3.0.0" - checksum: 10/faa466fd9bc69ea6c37a545a7c6e808e073c66f46ab7d3d8a6ef084f8708f201b85d5fe1799789578b8b47fa1de47b9ee47b414d1863bc117a49e032ba77b7c7 + unrs-resolver: "npm:^1.7.11" + checksum: 10/364324b396f30e122f848264b3a4b23c8689673566b98cb3cfadb8ad2cf61406fefb221e6cda2842d52865b2cd6ab612fa55a3f31a15ae0efbfc1c2cbb55d681 languageName: node linkType: hard -"jest-runner@npm:^29.6.4, jest-runner@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runner@npm:29.7.0" +"jest-runner@npm:30.0.4, jest-runner@npm:^30.0.4": + version: 30.0.4 + resolution: "jest-runner@npm:30.0.4" dependencies: - "@jest/console": "npm:^29.7.0" - "@jest/environment": "npm:^29.7.0" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" + "@jest/console": "npm:30.0.4" + "@jest/environment": "npm:30.0.4" + "@jest/test-result": "npm:30.0.4" + "@jest/transform": "npm:30.0.4" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - chalk: "npm:^4.0.0" + chalk: "npm:^4.1.2" emittery: "npm:^0.13.1" - graceful-fs: "npm:^4.2.9" - jest-docblock: "npm:^29.7.0" - jest-environment-node: "npm:^29.7.0" - jest-haste-map: "npm:^29.7.0" - jest-leak-detector: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-resolve: "npm:^29.7.0" - jest-runtime: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - jest-watcher: "npm:^29.7.0" - jest-worker: "npm:^29.7.0" + exit-x: "npm:^0.2.2" + graceful-fs: "npm:^4.2.11" + jest-docblock: "npm:30.0.1" + jest-environment-node: "npm:30.0.4" + jest-haste-map: "npm:30.0.2" + jest-leak-detector: "npm:30.0.2" + jest-message-util: "npm:30.0.2" + jest-resolve: "npm:30.0.2" + jest-runtime: "npm:30.0.4" + jest-util: "npm:30.0.2" + jest-watcher: "npm:30.0.4" + jest-worker: "npm:30.0.2" p-limit: "npm:^3.1.0" source-map-support: "npm:0.5.13" - checksum: 10/9d8748a494bd90f5c82acea99be9e99f21358263ce6feae44d3f1b0cd90991b5df5d18d607e73c07be95861ee86d1cbab2a3fc6ca4b21805f07ac29d47c1da1e + checksum: 10/b6e03e3407e1f1ec21e662e5c7399d7bb20072d9bf94eb07ab5890a2ddb05fb270bd7c12d0a63f9a3cc3f4fa9d33e2f2d1c891dbeb3e0e60188930a46a5ecdf1 languageName: node linkType: hard -"jest-runtime@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-runtime@npm:29.7.0" - dependencies: - "@jest/environment": "npm:^29.7.0" - "@jest/fake-timers": "npm:^29.7.0" - "@jest/globals": "npm:^29.7.0" - "@jest/source-map": "npm:^29.6.3" - "@jest/test-result": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" +"jest-runtime@npm:30.0.4": + version: 30.0.4 + resolution: "jest-runtime@npm:30.0.4" + dependencies: + "@jest/environment": "npm:30.0.4" + "@jest/fake-timers": "npm:30.0.4" + "@jest/globals": "npm:30.0.4" + "@jest/source-map": "npm:30.0.1" + "@jest/test-result": "npm:30.0.4" + "@jest/transform": "npm:30.0.4" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - chalk: "npm:^4.0.0" - cjs-module-lexer: "npm:^1.0.0" - collect-v8-coverage: "npm:^1.0.0" - glob: "npm:^7.1.3" - graceful-fs: "npm:^4.2.9" - jest-haste-map: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-mock: "npm:^29.7.0" - jest-regex-util: "npm:^29.6.3" - jest-resolve: "npm:^29.7.0" - jest-snapshot: "npm:^29.7.0" - jest-util: "npm:^29.7.0" + chalk: "npm:^4.1.2" + cjs-module-lexer: "npm:^2.1.0" + collect-v8-coverage: "npm:^1.0.2" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.11" + jest-haste-map: "npm:30.0.2" + jest-message-util: "npm:30.0.2" + jest-mock: "npm:30.0.2" + jest-regex-util: "npm:30.0.1" + jest-resolve: "npm:30.0.2" + jest-snapshot: "npm:30.0.4" + jest-util: "npm:30.0.2" slash: "npm:^3.0.0" strip-bom: "npm:^4.0.0" - checksum: 10/59eb58eb7e150e0834a2d0c0d94f2a0b963ae7182cfa6c63f2b49b9c6ef794e5193ef1634e01db41420c36a94cefc512cdd67a055cd3e6fa2f41eaf0f82f5a20 + checksum: 10/532db3c65087ddebf24737d805f2682e8fa335c86d6543062abedcf471303407bfc15d23f0c79dd96e6b381e97b607ec06f1042f120da271d6b48c5b8c33851d languageName: node linkType: hard @@ -6696,123 +6786,125 @@ __metadata: languageName: node linkType: hard -"jest-snapshot@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-snapshot@npm:29.7.0" - dependencies: - "@babel/core": "npm:^7.11.6" - "@babel/generator": "npm:^7.7.2" - "@babel/plugin-syntax-jsx": "npm:^7.7.2" - "@babel/plugin-syntax-typescript": "npm:^7.7.2" - "@babel/types": "npm:^7.3.3" - "@jest/expect-utils": "npm:^29.7.0" - "@jest/transform": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - babel-preset-current-node-syntax: "npm:^1.0.0" - chalk: "npm:^4.0.0" - expect: "npm:^29.7.0" - graceful-fs: "npm:^4.2.9" - jest-diff: "npm:^29.7.0" - jest-get-type: "npm:^29.6.3" - jest-matcher-utils: "npm:^29.7.0" - jest-message-util: "npm:^29.7.0" - jest-util: "npm:^29.7.0" - natural-compare: "npm:^1.4.0" - pretty-format: "npm:^29.7.0" - semver: "npm:^7.5.3" - checksum: 10/cb19a3948256de5f922d52f251821f99657339969bf86843bd26cf3332eae94883e8260e3d2fba46129a27c3971c1aa522490e460e16c7fad516e82d10bbf9f8 - languageName: node - linkType: hard - -"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-util@npm:29.7.0" - dependencies: - "@jest/types": "npm:^29.6.3" +"jest-snapshot@npm:30.0.4": + version: 30.0.4 + resolution: "jest-snapshot@npm:30.0.4" + dependencies: + "@babel/core": "npm:^7.27.4" + "@babel/generator": "npm:^7.27.5" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.27.1" + "@babel/types": "npm:^7.27.3" + "@jest/expect-utils": "npm:30.0.4" + "@jest/get-type": "npm:30.0.1" + "@jest/snapshot-utils": "npm:30.0.4" + "@jest/transform": "npm:30.0.4" + "@jest/types": "npm:30.0.1" + babel-preset-current-node-syntax: "npm:^1.1.0" + chalk: "npm:^4.1.2" + expect: "npm:30.0.4" + graceful-fs: "npm:^4.2.11" + jest-diff: "npm:30.0.4" + jest-matcher-utils: "npm:30.0.4" + jest-message-util: "npm:30.0.2" + jest-util: "npm:30.0.2" + pretty-format: "npm:30.0.2" + semver: "npm:^7.7.2" + synckit: "npm:^0.11.8" + checksum: 10/2ecffd4cd476c5fc496bfb23c52367bfda3b3d084c0297ffa86a4199fab3407e4dd133ab0df284aa69bc9d8339cdd5e3d87b93191f8fd77e78f4e4411fc73d36 + languageName: node + linkType: hard + +"jest-util@npm:30.0.2": + version: 30.0.2 + resolution: "jest-util@npm:30.0.2" + dependencies: + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - chalk: "npm:^4.0.0" - ci-info: "npm:^3.2.0" - graceful-fs: "npm:^4.2.9" - picomatch: "npm:^2.2.3" - checksum: 10/30d58af6967e7d42bd903ccc098f3b4d3859ed46238fbc88d4add6a3f10bea00c226b93660285f058bc7a65f6f9529cf4eb80f8d4707f79f9e3a23686b4ab8f3 + chalk: "npm:^4.1.2" + ci-info: "npm:^4.2.0" + graceful-fs: "npm:^4.2.11" + picomatch: "npm:^4.0.2" + checksum: 10/7fe3a9062ceac438e691037b0a246cee89b5f0f17e59d7226d00a6d2676c8a5cec4182e242722c2ea86863c46f2f23361e477d6039e0472ac0ec4bb6acef8551 languageName: node linkType: hard -"jest-validate@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-validate@npm:29.7.0" +"jest-validate@npm:30.0.2": + version: 30.0.2 + resolution: "jest-validate@npm:30.0.2" dependencies: - "@jest/types": "npm:^29.6.3" - camelcase: "npm:^6.2.0" - chalk: "npm:^4.0.0" - jest-get-type: "npm:^29.6.3" + "@jest/get-type": "npm:30.0.1" + "@jest/types": "npm:30.0.1" + camelcase: "npm:^6.3.0" + chalk: "npm:^4.1.2" leven: "npm:^3.1.0" - pretty-format: "npm:^29.7.0" - checksum: 10/8ee1163666d8eaa16d90a989edba2b4a3c8ab0ffaa95ad91b08ca42b015bfb70e164b247a5b17f9de32d096987cada63ed8491ab82761bfb9a28bc34b27ae161 + pretty-format: "npm:30.0.2" + checksum: 10/9bc273b9785f955fb926a69a6316b9feb6d5fc4960683060925f21a6869194ac7156445aab92031e320880c230da2d406720cb97ea5e250a04fe88a5a401c6e8 languageName: node linkType: hard -"jest-watch-typeahead@npm:^2.0.0": - version: 2.2.2 - resolution: "jest-watch-typeahead@npm:2.2.2" +"jest-watch-typeahead@npm:^3.0.1": + version: 3.0.1 + resolution: "jest-watch-typeahead@npm:3.0.1" dependencies: - ansi-escapes: "npm:^6.0.0" + ansi-escapes: "npm:^7.0.0" chalk: "npm:^5.2.0" - jest-regex-util: "npm:^29.0.0" - jest-watcher: "npm:^29.0.0" + jest-regex-util: "npm:^30.0.0" + jest-watcher: "npm:^30.0.0" slash: "npm:^5.0.0" - string-length: "npm:^5.0.1" + string-length: "npm:^6.0.0" strip-ansi: "npm:^7.0.1" peerDependencies: - jest: ^27.0.0 || ^28.0.0 || ^29.0.0 - checksum: 10/8685277ce1b96ec775882111ec55ce90a862cc57acb21ce94f8ac44a25f6fb34c7a7ce119e07b2d8ff5353a8d9e4f981cf96fa35532f71ddba6ca8fedc05bd8e + jest: ^30.0.0 + checksum: 10/dbaaa6d9929079482655c05af9f9c8491fa04aa5a24460b540b8383e78bb6bc6580cddbf8e2b15cfc34d68e610c19f5ccb8f0b0a5aea7f00affb3d976ec152ed languageName: node linkType: hard -"jest-watcher@npm:^29.0.0, jest-watcher@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-watcher@npm:29.7.0" +"jest-watcher@npm:30.0.4, jest-watcher@npm:^30.0.0": + version: 30.0.4 + resolution: "jest-watcher@npm:30.0.4" dependencies: - "@jest/test-result": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" + "@jest/test-result": "npm:30.0.4" + "@jest/types": "npm:30.0.1" "@types/node": "npm:*" - ansi-escapes: "npm:^4.2.1" - chalk: "npm:^4.0.0" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" emittery: "npm:^0.13.1" - jest-util: "npm:^29.7.0" - string-length: "npm:^4.0.1" - checksum: 10/4f616e0345676631a7034b1d94971aaa719f0cd4a6041be2aa299be437ea047afd4fe05c48873b7963f5687a2f6c7cbf51244be8b14e313b97bfe32b1e127e55 + jest-util: "npm:30.0.2" + string-length: "npm:^4.0.2" + checksum: 10/78117aa1064e34edd02bfb94bbc4fd124a24bf29a06f65f838124bf017ae0b1aee4b9f7285d0e8f79b3e3c16ac5715eb9ac2d2cd6109360b74cc8187947324db languageName: node linkType: hard -"jest-worker@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-worker@npm:29.7.0" +"jest-worker@npm:30.0.2": + version: 30.0.2 + resolution: "jest-worker@npm:30.0.2" dependencies: "@types/node": "npm:*" - jest-util: "npm:^29.7.0" + "@ungap/structured-clone": "npm:^1.3.0" + jest-util: "npm:30.0.2" merge-stream: "npm:^2.0.0" - supports-color: "npm:^8.0.0" - checksum: 10/364cbaef00d8a2729fc760227ad34b5e60829e0869bd84976bdfbd8c0d0f9c2f22677b3e6dd8afa76ed174765351cd12bae3d4530c62eefb3791055127ca9745 + supports-color: "npm:^8.1.1" + checksum: 10/d1e3dad5737de4dbe0622ab2d557ee544ab9667ae36e0ed9f459f9a56e0bd1dbdbe5184ff18f85e2ee51a468370a08ed7cc85a8a3bb41c41b43ce96c2dcf7f2c languageName: node linkType: hard -"jest@npm:^29.6.4": - version: 29.7.0 - resolution: "jest@npm:29.7.0" +"jest@npm:^30.0.4": + version: 30.0.4 + resolution: "jest@npm:30.0.4" dependencies: - "@jest/core": "npm:^29.7.0" - "@jest/types": "npm:^29.6.3" - import-local: "npm:^3.0.2" - jest-cli: "npm:^29.7.0" + "@jest/core": "npm:30.0.4" + "@jest/types": "npm:30.0.1" + import-local: "npm:^3.2.0" + jest-cli: "npm:30.0.4" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true bin: - jest: bin/jest.js - checksum: 10/97023d78446098c586faaa467fbf2c6b07ff06e2c85a19e3926adb5b0effe9ac60c4913ae03e2719f9c01ae8ffd8d92f6b262cedb9555ceeb5d19263d8c6362a + jest: ./bin/jest.js + checksum: 10/58e27fc167670808ad4e07eb659e1a75472d1f98bd8faef1ebf9b936e4bc11ee69560c15f91fcb5bf17cff48e0d144060dac072eac08adaf3ecf94cc7e6ed5ac languageName: node linkType: hard @@ -6829,7 +6921,7 @@ __metadata: languageName: node linkType: hard -"joycon@npm:^3.0.1": +"joycon@npm:^3.1.1": version: 3.1.1 resolution: "joycon@npm:3.1.1" checksum: 10/4b36e3479144ec196425f46b3618f8a96ce7e1b658f091a309cd4906215f5b7a402d7df331a3e0a09681381a658d0c5f039cb3cf6907e0a1e17ed847f5d37775 @@ -6915,13 +7007,20 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:2.1.0, lilconfig@npm:^2.0.5": +"lilconfig@npm:2.1.0": version: 2.1.0 resolution: "lilconfig@npm:2.1.0" checksum: 10/b1314a2e55319013d5e7d7d08be39015829d2764a1eaee130129545d40388499d81b1c31b0f9b3417d4db12775a88008b72ec33dd06e0184cf7503b32ca7cc0b languageName: node linkType: hard +"lilconfig@npm:^3.1.1": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 10/b932ce1af94985f0efbe8896e57b1f814a48c8dbd7fc0ef8469785c6303ed29d0090af3ccad7e36b626bfca3a4dc56cc262697e9a8dd867623cf09a39d54e4c3 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -7061,7 +7160,7 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:4.x": +"lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" checksum: 10/192b2168f310c86f303580b53acf81ab029761b9bd9caa9506a019ffea5f3363ea98d7e39e7e11e6b9917066c9d36a09a11f6fe16f812326390d8f3a54a1a6da @@ -7116,14 +7215,7 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0": - version: 3.1.2 - resolution: "loupe@npm:3.1.2" - checksum: 10/8f5734e53fb64cd914aa7d986e01b6d4c2e3c6c56dcbd5428d71c2703f0ab46b5ab9f9eeaaf2b485e8a1c43f865bdd16ec08ae1a661c8f55acdbd9f4d59c607a - languageName: node - linkType: hard - -"loupe@npm:^3.1.4": +"loupe@npm:^3.1.0, loupe@npm:^3.1.4": version: 3.1.4 resolution: "loupe@npm:3.1.4" checksum: 10/06ab1893731f167f2ce71f464a8a68372dc4cb807ecae20f9b844660c93813a298ca76bcd747ba6568b057af725ea63f0034ba3140c8f1d1fbb482d797e593ef @@ -7146,12 +7238,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.0": - version: 0.30.5 - resolution: "magic-string@npm:0.30.5" +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.17": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.4.15" - checksum: 10/c8a6b25f813215ca9db526f3a407d6dc0bf35429c2b8111d6f1c2cf6cf6afd5e2d9f9cd189416a0e3959e20ecd635f73639f9825c73de1074b29331fe36ace59 + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10/2f71af2b0afd78c2e9012a29b066d2c8ba45a9cd0c8070f7fd72de982fb1c403b4e3afdb1dae00691d56885ede66b772ef6bedf765e02e3a7066208fe2fec4aa languageName: node linkType: hard @@ -7183,7 +7275,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x, make-error@npm:^1, make-error@npm:^1.1.1": +"make-error@npm:^1, make-error@npm:^1.1.1, make-error@npm:^1.3.6": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: 10/b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -7258,7 +7350,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4": +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -7305,7 +7397,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -7314,6 +7406,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/126b36485b821daf96d33b5c821dac600cc1ab36c87e7a532594f9b1652b1fa89a1eebcaad4dff17c764dce1a7ac1531327f190fed5f97d8f6e5f889c116c429 + languageName: node + linkType: hard + "minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" @@ -7423,6 +7524,18 @@ __metadata: languageName: node linkType: hard +"mlly@npm:^1.7.4": + version: 1.7.4 + resolution: "mlly@npm:1.7.4" + dependencies: + acorn: "npm:^8.14.0" + pathe: "npm:^2.0.1" + pkg-types: "npm:^1.3.0" + ufo: "npm:^1.5.4" + checksum: 10/1b36163d38c2331f8ae480e6a11da3d15927a2148d729fcd9df6d0059ca74869aa693931bd1f762f82eb534b84c921bdfbc036eb0e4da4faeb55f1349d254f35 + languageName: node + linkType: hard + "module-alias@npm:^2.2.2": version: 2.2.3 resolution: "module-alias@npm:2.2.3" @@ -7464,6 +7577,15 @@ __metadata: languageName: node linkType: hard +"napi-postinstall@npm:^0.3.0": + version: 0.3.0 + resolution: "napi-postinstall@npm:0.3.0" + bin: + napi-postinstall: lib/cli.js + checksum: 10/4cddb80320a895015fd7e566b7c5866197f7bbb808fb37c6f99c4d68138a19d8d801b1025c9fb38f78ff266734fe3a0b4717cf792a4a8f062cfbde5ed7144114 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -7485,6 +7607,13 @@ __metadata: languageName: node linkType: hard +"node-domexception@npm:^1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: 10/e332522f242348c511640c25a6fc7da4f30e09e580c70c6b13cb0be83c78c3e71c8d4665af2527e869fc96848924a4316ae7ec9014c091e2156f41739d4fa233 + languageName: node + linkType: hard + "node-fetch@npm:2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -7499,7 +7628,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2, node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -7513,6 +7642,17 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:^3.3.2": + version: 3.3.2 + resolution: "node-fetch@npm:3.3.2" + dependencies: + data-uri-to-buffer: "npm:^4.0.0" + fetch-blob: "npm:^3.1.4" + formdata-polyfill: "npm:^4.0.10" + checksum: 10/24207ca8c81231c7c59151840e3fded461d67a31cf3e3b3968e12201a42f89ce4a0b5fb7079b1fa0a4655957b1ca9257553200f03a9f668b45ebad265ca5593d + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.0.1 resolution: "node-gyp@npm:10.0.1" @@ -7952,6 +8092,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^2.0.1": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d + languageName: node + linkType: hard + "pathval@npm:^2.0.0": version: 2.0.0 resolution: "pathval@npm:2.0.0" @@ -7966,7 +8113,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 10/60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc @@ -8003,10 +8150,10 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.1, pirates@npm:^4.0.4": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 10/d02dda76f4fec1cbdf395c36c11cf26f76a644f9f9a1bfa84d3167d0d3154d5289aacc72677aa20d599bb4a6937a471de1b65c995e2aea2d8687cbcd7e43ea5f +"pirates@npm:^4.0.1, pirates@npm:^4.0.7": + version: 4.0.7 + resolution: "pirates@npm:4.0.7" + checksum: 10/2427f371366081ae42feb58214f04805d6b41d6b84d74480ebcc9e0ddbd7105a139f7c653daeaf83ad8a1a77214cf07f64178e76de048128fec501eab3305a96 languageName: node linkType: hard @@ -8040,6 +8187,17 @@ __metadata: languageName: node linkType: hard +"pkg-types@npm:^1.3.0": + version: 1.3.1 + resolution: "pkg-types@npm:1.3.1" + dependencies: + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.4" + pathe: "npm:^2.0.1" + checksum: 10/6d491f2244597b24fb59a50e3c258f27da3839555d2a4e112b31bcf536e9359fc4edc98639cd74d2cf16fcd4269e5a09d99fc05d89e2acc896a2f027c2f6ec44 + languageName: node + linkType: hard + "pkg-up@npm:^5.0.0": version: 5.0.0 resolution: "pkg-up@npm:5.0.0" @@ -8087,21 +8245,26 @@ __metadata: languageName: node linkType: hard -"postcss-load-config@npm:^3.0.1": - version: 3.1.4 - resolution: "postcss-load-config@npm:3.1.4" +"postcss-load-config@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-load-config@npm:6.0.1" dependencies: - lilconfig: "npm:^2.0.5" - yaml: "npm:^1.10.2" + lilconfig: "npm:^3.1.1" peerDependencies: + jiti: ">=1.21.0" postcss: ">=8.0.9" - ts-node: ">=9.0.0" + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: optional: true - checksum: 10/75fa409d77b96e6f53e99f680c550f25ca8922c1150d3d368ded1f6bd8e0d4d67a615fe1f1c5d409aefb6e66fb4b5e48e86856d581329913de84578def078b19 + yaml: + optional: true + checksum: 10/1691cfc94948a9373d4f7b3b7a8500cfaf8cb2dcc2107c14f90f2a711a9892a362b0866894ac5bb723455fa685a15116d9ed3252188689c4502b137c19d6bdc4 languageName: node linkType: hard @@ -8125,14 +8288,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": - version: 29.7.0 - resolution: "pretty-format@npm:29.7.0" +"pretty-format@npm:30.0.2, pretty-format@npm:^30.0.0": + version: 30.0.2 + resolution: "pretty-format@npm:30.0.2" dependencies: - "@jest/schemas": "npm:^29.6.3" - ansi-styles: "npm:^5.0.0" - react-is: "npm:^18.0.0" - checksum: 10/dea96bc83c83cd91b2bfc55757b6b2747edcaac45b568e46de29deee80742f17bc76fe8898135a70d904f4928eafd8bb693cd1da4896e8bdd3c5e82cadf1d2bb + "@jest/schemas": "npm:30.0.1" + ansi-styles: "npm:^5.2.0" + react-is: "npm:^18.3.1" + checksum: 10/82b2f0c8771fcf072b33ca6a748b95beac589db4f98deafda1a29579ce47adf322909ea2fff9d46672ac075dda1aba2bde7f955609bfdf76f867e0ff77b5c19d languageName: node linkType: hard @@ -8171,7 +8334,7 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1, prompts@npm:^2.4.1": +"prompts@npm:^2.4.1": version: 2.4.2 resolution: "prompts@npm:2.4.2" dependencies: @@ -8195,10 +8358,10 @@ __metadata: languageName: node linkType: hard -"pure-rand@npm:^6.0.0": - version: 6.0.4 - resolution: "pure-rand@npm:6.0.4" - checksum: 10/34fed0abe99d3db7ddc459c12e1eda6bff05db6a17f2017a1ae12202271ccf276fb223b442653518c719671c1b339bbf97f27ba9276dba0997c89e45c4e6a3bf +"pure-rand@npm:^7.0.0": + version: 7.0.1 + resolution: "pure-rand@npm:7.0.1" + checksum: 10/c61a576fda5032ec9763ecb000da4a8f19263b9e2f9ae9aa2759c8fbd9dc6b192b2ce78391ebd41abb394a5fedb7bcc4b03c9e6141ac8ab20882dd5717698b80 languageName: node linkType: hard @@ -8274,10 +8437,10 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: 10/200cd65bf2e0be7ba6055f647091b725a45dd2a6abef03bf2380ce701fd5edccee40b49b9d15edab7ac08a762bf83cb4081e31ec2673a5bfb549a36ba21570df +"react-is@npm:^18.3.1": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 languageName: node linkType: hard @@ -8339,6 +8502,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 10/7b817c265940dba90bb9c94d82920d76c3a35ea2d67f9f9d8bd936adcfe02d50c802b14be3dd2e725e002dddbe2cc1c7a0edfb1bc3a365c9dfd5a61e612eea1e + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -8525,14 +8695,7 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^2.0.0": - version: 2.0.2 - resolution: "resolve.exports@npm:2.0.2" - checksum: 10/f1cc0b6680f9a7e0345d783e0547f2a5110d8336b3c2a4227231dd007271ffd331fd722df934f017af90bae0373920ca0d4005da6f76cb3176c8ae426370f893 - languageName: node - linkType: hard - -"resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.1, resolve@npm:^1.22.8": +"resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.22.1, resolve@npm:^1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -8554,7 +8717,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -8629,45 +8792,31 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^3.2.5": - version: 3.29.5 - resolution: "rollup@npm:3.29.5" - dependencies: - fsevents: "npm:~2.3.2" - dependenciesMeta: - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10/5ce0e5f1d9288d4954db93993477f894eb3042ec98a7c9c19980e53b1f58296481e3dc6c2b1a2a3680b20eb6c3fe64ed97942d5ff29df658a059647c33b3593c - languageName: node - linkType: hard - -"rollup@npm:^4.34.9": - version: 4.40.0 - resolution: "rollup@npm:4.40.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.40.0" - "@rollup/rollup-android-arm64": "npm:4.40.0" - "@rollup/rollup-darwin-arm64": "npm:4.40.0" - "@rollup/rollup-darwin-x64": "npm:4.40.0" - "@rollup/rollup-freebsd-arm64": "npm:4.40.0" - "@rollup/rollup-freebsd-x64": "npm:4.40.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.40.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.40.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.40.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.40.0" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.40.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.40.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.40.0" - "@rollup/rollup-linux-riscv64-musl": "npm:4.40.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.40.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.40.0" - "@rollup/rollup-linux-x64-musl": "npm:4.40.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.40.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.40.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.40.0" - "@types/estree": "npm:1.0.7" +"rollup@npm:^4.34.8, rollup@npm:^4.34.9": + version: 4.44.1 + resolution: "rollup@npm:4.44.1" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.44.1" + "@rollup/rollup-android-arm64": "npm:4.44.1" + "@rollup/rollup-darwin-arm64": "npm:4.44.1" + "@rollup/rollup-darwin-x64": "npm:4.44.1" + "@rollup/rollup-freebsd-arm64": "npm:4.44.1" + "@rollup/rollup-freebsd-x64": "npm:4.44.1" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.44.1" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.44.1" + "@rollup/rollup-linux-arm64-gnu": "npm:4.44.1" + "@rollup/rollup-linux-arm64-musl": "npm:4.44.1" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.44.1" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.44.1" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.44.1" + "@rollup/rollup-linux-riscv64-musl": "npm:4.44.1" + "@rollup/rollup-linux-s390x-gnu": "npm:4.44.1" + "@rollup/rollup-linux-x64-gnu": "npm:4.44.1" + "@rollup/rollup-linux-x64-musl": "npm:4.44.1" + "@rollup/rollup-win32-arm64-msvc": "npm:4.44.1" + "@rollup/rollup-win32-ia32-msvc": "npm:4.44.1" + "@rollup/rollup-win32-x64-msvc": "npm:4.44.1" + "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -8714,7 +8863,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/59976247cd855bc48b7192c82a6751bd04213e5a265109c652a6c43bde9056038c6399c0cf50ea3001edd5c11bb878a59e1055bb651b3bd6bbd0373c0345ed0c + checksum: 10/4130fcc4fb7df4364bfbdf78f277c0c2afc881812b3d01bd498b709da180ce69ff359af003d187d7c554576956dbc66d85468f4fc62b4b42b87839cd095ee9fd languageName: node linkType: hard @@ -8796,12 +8945,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.2": - version: 7.6.3 - resolution: "semver@npm:7.6.3" +"semver@npm:^7.0.0, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.2, semver@npm:^7.7.2": + version: 7.7.2 + resolution: "semver@npm:7.7.2" bin: semver: bin/semver.js - checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + checksum: 10/7a24cffcaa13f53c09ce55e05efe25cd41328730b2308678624f8b9f5fc3093fc4d189f47950f0b811ff8f3c3039c24a2c36717ba7961615c682045bf03e1dda languageName: node linkType: hard @@ -9066,7 +9215,7 @@ __metadata: languageName: node linkType: hard -"stack-utils@npm:^2.0.3": +"stack-utils@npm:^2.0.6": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" dependencies: @@ -9107,7 +9256,7 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^4.0.1": +"string-length@npm:^4.0.2": version: 4.0.2 resolution: "string-length@npm:4.0.2" dependencies: @@ -9117,13 +9266,12 @@ __metadata: languageName: node linkType: hard -"string-length@npm:^5.0.1": - version: 5.0.1 - resolution: "string-length@npm:5.0.1" +"string-length@npm:^6.0.0": + version: 6.0.0 + resolution: "string-length@npm:6.0.0" dependencies: - char-regex: "npm:^2.0.0" - strip-ansi: "npm:^7.0.1" - checksum: 10/71f73b8c8a743e01dcd001bcf1b197db78d5e5e53b12bd898cddaf0961be09f947dfd8c429783db3694b55b05cb5a51de6406c5085ff1aaa10c4771440c8396d + strip-ansi: "npm:^7.1.0" + checksum: 10/b171e9e193ec292ad71f8b2a36e20478bf1bac8cd5beec062fb126942d627dfd9311959e271e9ab7b0a383d16b85b9e25a183d15786e30f22104d152e7627f99 languageName: node linkType: hard @@ -9167,7 +9315,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.0.1": +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": version: 7.1.0 resolution: "strip-ansi@npm:7.1.0" dependencies: @@ -9236,13 +9384,13 @@ __metadata: languageName: node linkType: hard -"sucrase@npm:^3.20.3": - version: 3.34.0 - resolution: "sucrase@npm:3.34.0" +"sucrase@npm:^3.35.0": + version: 3.35.0 + resolution: "sucrase@npm:3.35.0" dependencies: "@jridgewell/gen-mapping": "npm:^0.3.2" commander: "npm:^4.0.0" - glob: "npm:7.1.6" + glob: "npm:^10.3.10" lines-and-columns: "npm:^1.1.6" mz: "npm:^2.7.0" pirates: "npm:^4.0.1" @@ -9250,7 +9398,7 @@ __metadata: bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: 10/b64d154a7a7eaa4b39668c3124bd08cd505f683d36ac4fb94def6491fb3af155b24b6e41b55011e38582e7d59c440af79ffba8709f3da78aeedf2f07b6d51d84 + checksum: 10/bc601558a62826f1c32287d4fdfa4f2c09fe0fec4c4d39d0e257fd9116d7d6227a18309721d4185ec84c9dc1af0d5ec0e05a42a337fbb74fc293e068549aacbe languageName: node linkType: hard @@ -9272,7 +9420,7 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^8.0.0, supports-color@npm:^8.1.0": +"supports-color@npm:^8.1.0, supports-color@npm:^8.1.1": version: 8.1.1 resolution: "supports-color@npm:8.1.1" dependencies: @@ -9298,6 +9446,15 @@ __metadata: languageName: node linkType: hard +"synckit@npm:^0.11.8": + version: 0.11.8 + resolution: "synckit@npm:0.11.8" + dependencies: + "@pkgr/core": "npm:^0.2.4" + checksum: 10/9bb2cf11edaf31ba781f1c719dd58087323201bda6392254538aef4dea216aa02a32e25f06643bcfa1c1a2c95e0d84186d82cfb66f9a0ab3a2be4816c696a8a3 + languageName: node + linkType: hard + "table-layout@npm:^1.0.2": version: 1.0.2 resolution: "table-layout@npm:1.0.2" @@ -9404,13 +9561,20 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.12": - version: 0.2.13 - resolution: "tinyglobby@npm:0.2.13" +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10/b9d5fed3166fb1acd1e7f9a89afcd97ccbe18b9c1af0278e429455f6976d69271ba2d21797e7c36d57d6b05025e525d2882d88c2ab435b60d1ddf2fea361de57 + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12": + version: 0.2.14 + resolution: "tinyglobby@npm:0.2.14" dependencies: fdir: "npm:^6.4.4" picomatch: "npm:^4.0.2" - checksum: 10/b04557ee58ad2be5f2d2cbb4b441476436c92bb45ba2e1fc464d686b793392b305ed0bcb8b877429e9b5036bdd46770c161a08384c0720b6682b7cd6ac80e403 + checksum: 10/3d306d319718b7cc9d79fb3f29d8655237aa6a1f280860a217f93417039d0614891aee6fc47c5db315f4fcc6ac8d55eb8e23e2de73b2c51a431b42456d9e5764 languageName: node linkType: hard @@ -9483,36 +9647,43 @@ __metadata: languageName: node linkType: hard -"ts-jest@npm:^29.0.0": - version: 29.1.1 - resolution: "ts-jest@npm:29.1.1" +"ts-jest@npm:^29.4.0": + version: 29.4.0 + resolution: "ts-jest@npm:29.4.0" dependencies: - bs-logger: "npm:0.x" - fast-json-stable-stringify: "npm:2.x" - jest-util: "npm:^29.0.0" + bs-logger: "npm:^0.2.6" + ejs: "npm:^3.1.10" + fast-json-stable-stringify: "npm:^2.1.0" json5: "npm:^2.2.3" - lodash.memoize: "npm:4.x" - make-error: "npm:1.x" - semver: "npm:^7.5.3" - yargs-parser: "npm:^21.0.1" + lodash.memoize: "npm:^4.1.2" + make-error: "npm:^1.3.6" + semver: "npm:^7.7.2" + type-fest: "npm:^4.41.0" + yargs-parser: "npm:^21.1.1" peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/types": ^29.0.0 - babel-jest: ^29.0.0 - jest: ^29.0.0 + "@jest/transform": ^29.0.0 || ^30.0.0 + "@jest/types": ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 typescript: ">=4.3 <6" peerDependenciesMeta: "@babel/core": optional: true + "@jest/transform": + optional: true "@jest/types": optional: true babel-jest: optional: true esbuild: optional: true + jest-util: + optional: true bin: ts-jest: cli.js - checksum: 10/30e8259baba95dd786e64f7c18b864e904598f3ba07911be4d9bd29ca9c3c0024bad4ccf8ec0abd2a2fa14b06622cbbadff1b3be822189c657196442d33ee6ca + checksum: 10/fe501f3d9946ec52db78ae0ac6cfd72942b1c1f5d657c12db321c9d570f0f499e83eb6c7e26074cd11dfe534a6a09c676947e7a63ee08fcda552aabcdeb6c592 languageName: node linkType: hard @@ -9600,36 +9771,42 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.5.0": +"tslib@npm:^2, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 languageName: node linkType: hard -"tsup@npm:^6.5.0": - version: 6.7.0 - resolution: "tsup@npm:6.7.0" +"tsup@npm:^8.5.0": + version: 8.5.0 + resolution: "tsup@npm:8.5.0" dependencies: - bundle-require: "npm:^4.0.0" - cac: "npm:^6.7.12" - chokidar: "npm:^3.5.1" - debug: "npm:^4.3.1" - esbuild: "npm:^0.17.6" - execa: "npm:^5.0.0" - globby: "npm:^11.0.3" - joycon: "npm:^3.0.1" - postcss-load-config: "npm:^3.0.1" + bundle-require: "npm:^5.1.0" + cac: "npm:^6.7.14" + chokidar: "npm:^4.0.3" + consola: "npm:^3.4.0" + debug: "npm:^4.4.0" + esbuild: "npm:^0.25.0" + fix-dts-default-cjs-exports: "npm:^1.0.0" + joycon: "npm:^3.1.1" + picocolors: "npm:^1.1.1" + postcss-load-config: "npm:^6.0.1" resolve-from: "npm:^5.0.0" - rollup: "npm:^3.2.5" + rollup: "npm:^4.34.8" source-map: "npm:0.8.0-beta.0" - sucrase: "npm:^3.20.3" + sucrase: "npm:^3.35.0" + tinyexec: "npm:^0.3.2" + tinyglobby: "npm:^0.2.11" tree-kill: "npm:^1.2.2" peerDependencies: + "@microsoft/api-extractor": ^7.36.0 "@swc/core": ^1 postcss: ^8.4.12 - typescript: ">=4.1.0" + typescript: ">=4.5.0" peerDependenciesMeta: + "@microsoft/api-extractor": + optional: true "@swc/core": optional: true postcss: @@ -9639,7 +9816,7 @@ __metadata: bin: tsup: dist/cli-default.js tsup-node: dist/cli-node.js - checksum: 10/fd666b3b3e81abb3e2a11896395154522cee334ff4952e9ceeee1c7e5cf752a7ea710e155fe49bdcae5e88dd999d75debc12a68c20d0a9bb9b0be3d7d77a193c + checksum: 10/426f5de085fb7f3321a1d7910af4a56279341e571f9fb0b28be1a44ff0efa7fdd4e886eadd86b00a500696b3a76fc4e8b19567389ac64c345b559f860c3c6f9f languageName: node linkType: hard @@ -9685,10 +9862,10 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^3.0.0": - version: 3.13.1 - resolution: "type-fest@npm:3.13.1" - checksum: 10/9a8a2359ada34c9b3affcaf3a8f73ee14c52779e89950db337ce66fb74c3399776c697c99f2532e9b16e10e61cfdba3b1c19daffb93b338b742f0acd0117ce12 +"type-fest@npm:^4.41.0": + version: 4.41.0 + resolution: "type-fest@npm:4.41.0" + checksum: 10/617ace794ac0893c2986912d28b3065ad1afb484cad59297835a0807dc63286c39e8675d65f7de08fafa339afcb8fe06a36e9a188b9857756ae1e92ee8bda212 languageName: node linkType: hard @@ -9708,23 +9885,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:~4.9.4": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" +"typescript@npm:^5.8.3": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/458f7220ab11e0fc191514cc41be1707645ec9a8c2d609448a448e18c522cef9646f58728f6811185a4c35613dacdf6c98cf8965c88b3541d0288c47291e4300 + checksum: 10/65c40944c51b513b0172c6710ee62e951b70af6f75d5a5da745cb7fab132c09ae27ffdf7838996e3ed603bb015dadd099006658046941bd0ba30340cc563ae92 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A~4.9.4#optional!builtin": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" +"typescript@patch:typescript@npm%3A^5.8.3#optional!builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=cef18b" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/5659316360b5cc2d6f5931b346401fa534107b68b60179cf14970e27978f0936c1d5c46f4b5b8175f8cba0430f522b3ce355b4b724c0ea36ce6c0347fab25afd + checksum: 10/98470634034ec37fd9ea61cc82dcf9a27950d0117a4646146b767d085a2ec14b137aae9642a83d1c62732d7fdcdac19bb6288b0bb468a72f7a06ae4e1d2c72c9 languageName: node linkType: hard @@ -9742,6 +9919,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.5.4": + version: 1.6.1 + resolution: "ufo@npm:1.6.1" + checksum: 10/088a68133b93af183b093e5a8730a40fe7fd675d3dc0656ea7512f180af45c92300c294f14d4d46d4b2b553e3e52d3b13d4856b9885e620e7001edf85531234e + languageName: node + linkType: hard + "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -9749,6 +9933,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~7.8.0": + version: 7.8.0 + resolution: "undici-types@npm:7.8.0" + checksum: 10/fcff3fbab234f067fbd69e374ee2c198ba74c364ceaf6d93db7ca267e784457b5518cd01d0d2329b075f412574205ea3172a9a675facb49b4c9efb7141cd80b7 + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" @@ -9833,6 +10024,73 @@ __metadata: languageName: node linkType: hard +"unrs-resolver@npm:^1.7.11": + version: 1.10.1 + resolution: "unrs-resolver@npm:1.10.1" + dependencies: + "@unrs/resolver-binding-android-arm-eabi": "npm:1.10.1" + "@unrs/resolver-binding-android-arm64": "npm:1.10.1" + "@unrs/resolver-binding-darwin-arm64": "npm:1.10.1" + "@unrs/resolver-binding-darwin-x64": "npm:1.10.1" + "@unrs/resolver-binding-freebsd-x64": "npm:1.10.1" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.10.1" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.10.1" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.10.1" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.10.1" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.10.1" + "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.10.1" + "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.10.1" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.10.1" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.10.1" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.10.1" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.10.1" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.10.1" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.10.1" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.10.1" + napi-postinstall: "npm:^0.3.0" + dependenciesMeta: + "@unrs/resolver-binding-android-arm-eabi": + optional: true + "@unrs/resolver-binding-android-arm64": + optional: true + "@unrs/resolver-binding-darwin-arm64": + optional: true + "@unrs/resolver-binding-darwin-x64": + optional: true + "@unrs/resolver-binding-freebsd-x64": + optional: true + "@unrs/resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/resolver-binding-linux-arm-musleabihf": + optional: true + "@unrs/resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/resolver-binding-linux-arm64-musl": + optional: true + "@unrs/resolver-binding-linux-ppc64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-musl": + optional: true + "@unrs/resolver-binding-linux-s390x-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-musl": + optional: true + "@unrs/resolver-binding-wasm32-wasi": + optional: true + "@unrs/resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/resolver-binding-win32-ia32-msvc": + optional: true + "@unrs/resolver-binding-win32-x64-msvc": + optional: true + checksum: 10/ee09b8eb16880bbd6c10f8776706afe68fc7567d512beecb41d1e6d478397ed9a7c0b1aa61ee1063a5dd3bb57f24e6d3f93b206c57d5e0e63cad73ebf77f8255 + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.1.1": version: 1.1.1 resolution: "update-browserslist-db@npm:1.1.1" @@ -10020,6 +10278,13 @@ __metadata: languageName: node linkType: hard +"web-streams-polyfill@npm:^3.0.3": + version: 3.3.3 + resolution: "web-streams-polyfill@npm:3.3.3" + checksum: 10/8e7e13501b3834094a50abe7c0b6456155a55d7571312b89570012ef47ec2a46d766934768c50aabad10a9c30dd764a407623e8bfcc74fcb58495c29130edea9 + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -10171,13 +10436,13 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^4.0.2": - version: 4.0.2 - resolution: "write-file-atomic@npm:4.0.2" +"write-file-atomic@npm:^5.0.1": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" dependencies: imurmurhash: "npm:^0.1.4" - signal-exit: "npm:^3.0.7" - checksum: 10/3be1f5508a46c190619d5386b1ac8f3af3dbe951ed0f7b0b4a0961eed6fc626bd84b50cf4be768dabc0a05b672f5d0c5ee7f42daa557b14415d18c3a13c7d246 + signal-exit: "npm:^4.0.1" + checksum: 10/648efddba54d478d0e4330ab6f239976df3b9752b123db5dc9405d9b5af768fa9d70ce60c52fdbe61d1200d24350bc4fbcbaf09288496c2be050de126bd95b7e languageName: node linkType: hard @@ -10238,7 +10503,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^1.10.0, yaml@npm:^1.10.2": +"yaml@npm:^1.10.0": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: 10/e088b37b4d4885b70b50c9fa1b7e54bd2e27f5c87205f9deaffd1fb293ab263d9c964feadb9817a7b129a5bf30a06582cb08750f810568ecc14f3cdbabb79cb3 @@ -10255,7 +10520,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": +"yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e @@ -10281,7 +10546,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.3.1": +"yargs@npm:^17.3.1, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: From 659e613fc366cd90963df466942d60ce609eb6c6 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 7 Jul 2025 11:43:01 +0200 Subject: [PATCH 03/29] fix --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index e3ca6e64..929aa361 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,11 @@ }, "license": "MIT", "author": "shilman", - "main": "dist/index.mjs", - "module": "dist/index.mjs", + "main": "dist/index.js", + "module": "dist/index.js", "types": "dist/index.d.ts", "bin": { - "test-storybook": "./dist/test-storybook.mjs" + "test-storybook": "./dist/test-storybook.js" }, "files": [ "dist", From 217b3085c797869751d280f07fd938ebc4701d27 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 7 Jul 2025 11:44:02 +0200 Subject: [PATCH 04/29] fix --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index f14ce55a..ee8e4947 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2932,7 +2932,7 @@ __metadata: peerDependencies: storybook: 0.0.0-pr-31819-sha-8b752a73 bin: - test-storybook: ./dist/test-storybook.mjs + test-storybook: ./dist/test-storybook.js languageName: unknown linkType: soft From f910288d78752a62c87d3b88d2c00dfbe0fe8710 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 7 Jul 2025 13:31:24 +0200 Subject: [PATCH 05/29] experiment --- src/config/jest-playwright.ts | 5 +++-- src/csf/transformCsf.ts | 7 +++++-- src/playwright/transformPlaywright.ts | 5 ++++- src/playwright/transformPlaywrightJson.ts | 5 ++++- src/test-storybook.ts | 2 +- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 44ef6fc6..3905d247 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -84,9 +84,10 @@ export const getJestConfig = (): Config.InitialOptions => { '^.+\\.(story|stories)\\.[jt]sx?$': require.resolve( `${TEST_RUNNER_PATH}/playwright/transform.js` ), - '^.+\\.[jt]sx?$': swcJestPath, + '^.+\\.[jt]sx?$': 'babel-jest', }, - // transformIgnorePatterns: ['node_modules/(?!(storybook|@storybook)/)'], + extensionsToTreatAsEsm: ['.js', '.jsx', '.ts', '.tsx'], + transformIgnorePatterns: ['node_modules/(?!(storybook|@storybook)/)'], snapshotSerializers: [jestSerializerHtmlPath], testEnvironmentOptions: { 'jest-playwright': { diff --git a/src/csf/transformCsf.ts b/src/csf/transformCsf.ts index 81b4a6da..6d07b699 100644 --- a/src/csf/transformCsf.ts +++ b/src/csf/transformCsf.ts @@ -4,11 +4,14 @@ import { toId, storyNameFromExport, combineTags } from 'storybook/internal/csf'; // @ts-ignore import { loadCsf } from 'storybook/internal/csf-tools'; import * as t from '@babel/types'; -import generate from '@babel/generator'; +import babelGenerate from '@babel/generator'; import dedent from 'ts-dedent'; import { getTagOptions } from '../util/getTagOptions'; +// Handle both ESM and CJS patterns +const generate = (babelGenerate as any).default ?? babelGenerate; + export interface TestContext { storyExport?: t.Identifier; name: t.Literal; @@ -189,7 +192,7 @@ export const transformCsf = async ( const { code: describeCode } = generate(describe, {}); result = dedent` ${result} - if (!require.main) { + if (import.meta.url === undefined) { ${describeCode} } `; diff --git a/src/playwright/transformPlaywright.ts b/src/playwright/transformPlaywright.ts index 122a9ffc..76929303 100644 --- a/src/playwright/transformPlaywright.ts +++ b/src/playwright/transformPlaywright.ts @@ -1,5 +1,8 @@ import { relative } from 'path'; -import template from '@babel/template'; +import babelTemplate from '@babel/template'; + +// Handle both ESM and CJS patterns +const template = (babelTemplate as any).default ?? babelTemplate; // @ts-ignore import { userOrAutoTitle } from 'storybook/internal/preview-api'; import dedent from 'ts-dedent'; diff --git a/src/playwright/transformPlaywrightJson.ts b/src/playwright/transformPlaywrightJson.ts index a3f1331a..69fb0356 100644 --- a/src/playwright/transformPlaywrightJson.ts +++ b/src/playwright/transformPlaywrightJson.ts @@ -1,5 +1,8 @@ import * as t from '@babel/types'; -import generate from '@babel/generator'; +import babelGenerate from '@babel/generator'; + +// Handle both ESM and CJS patterns +const generate = (babelGenerate as any).default ?? babelGenerate; // @ts-ignore import { ComponentTitle, StoryId, StoryName, toId } from 'storybook/internal/csf'; diff --git a/src/test-storybook.ts b/src/test-storybook.ts index 6dfdf6cf..78c9e48f 100644 --- a/src/test-storybook.ts +++ b/src/test-storybook.ts @@ -132,7 +132,7 @@ async function executeJestPlaywright(args: JestOptions) { paths: [path.join(import.meta.dirname, '../@storybook/test-runner/node_modules')], }) ); - const jest = require(jestPath); + const jest = await import(jestPath); const argv = args.slice(2); // jest configs could either come in the root dir, or inside of the Storybook config dir From 70a2f9312fd76f4cd6bb312dbc48f564116c6a5d Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 7 Jul 2025 14:54:52 +0200 Subject: [PATCH 06/29] fix --- src/config/jest-playwright.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 3905d247..e3dc4abe 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -64,11 +64,11 @@ export const getJestConfig = (): Config.InitialOptions => { }) ); - const swcJestPath = path.dirname( - require.resolve('@swc/jest', { - paths: [path.join(import.meta.dirname, '../node_modules')], - }) - ); + // const swcJestPath = path.dirname( + // require.resolve('@swc/jest', { + // paths: [path.join(import.meta.dirname, '../node_modules')], + // }) + // ); const reporters = STORYBOOK_JUNIT ? ['default', jestJunitPath] : ['default']; From 8fd8132fb4579b5a11f9f4ff0bd760bfb90e6614 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 7 Jul 2025 15:07:16 +0200 Subject: [PATCH 07/29] more experiments --- playwright/custom-environment.js | 5 ++++- src/config/jest-playwright.ts | 2 +- src/csf/transformCsf.ts | 4 +--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/playwright/custom-environment.js b/playwright/custom-environment.js index f23ae43b..c1ba73e9 100644 --- a/playwright/custom-environment.js +++ b/playwright/custom-environment.js @@ -1,5 +1,8 @@ import { setupPage } from '../dist/index.js'; -import PlaywrightEnvironment from 'jest-playwright-preset/lib/PlaywrightEnvironment.js'; +import _PlaywrightEnvironment from 'jest-playwright-preset/lib/PlaywrightEnvironment.js'; + +// @ts-expect-error check later +const PlaywrightEnvironment = _PlaywrightEnvironment.default ?? _PlaywrightEnvironment; class CustomEnvironment extends PlaywrightEnvironment { async setup() { diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index e3dc4abe..4d35a7f1 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -86,7 +86,7 @@ export const getJestConfig = (): Config.InitialOptions => { ), '^.+\\.[jt]sx?$': 'babel-jest', }, - extensionsToTreatAsEsm: ['.js', '.jsx', '.ts', '.tsx'], + extensionsToTreatAsEsm: ['.jsx', '.ts', '.tsx'], transformIgnorePatterns: ['node_modules/(?!(storybook|@storybook)/)'], snapshotSerializers: [jestSerializerHtmlPath], testEnvironmentOptions: { diff --git a/src/csf/transformCsf.ts b/src/csf/transformCsf.ts index 6d07b699..7c351175 100644 --- a/src/csf/transformCsf.ts +++ b/src/csf/transformCsf.ts @@ -192,9 +192,7 @@ export const transformCsf = async ( const { code: describeCode } = generate(describe, {}); result = dedent` ${result} - if (import.meta.url === undefined) { - ${describeCode} - } + ${describeCode} `; } else if (insertTestIfEmpty) { // When there are no tests at all, we skip. The reason is that the file already went through Jest's transformation, From 10734a193d9a106a5807af73c9f81adf2b0e369d Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 7 Jul 2025 15:48:55 +0200 Subject: [PATCH 08/29] experiment --- src/config/jest-playwright.ts | 24 ++++----------------- src/test-storybook.ts | 39 +++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 4d35a7f1..388b95c8 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -19,16 +19,8 @@ const getTestRunnerPath = () => process.env.STORYBOOK_TEST_RUNNER_PATH ?? '@stor * */ const getJestPlaywrightConfig = (): Config.InitialOptions => { const TEST_RUNNER_PATH = getTestRunnerPath(); - const presetBasePath = path.dirname( - require.resolve('jest-playwright-preset', { - paths: [path.join(import.meta.dirname, '../node_modules')], - }) - ); - const expectPlaywrightPath = path.dirname( - require.resolve('expect-playwright', { - paths: [path.join(import.meta.dirname, '../node_modules')], - }) - ); + const presetBasePath = path.dirname(require.resolve('jest-playwright-preset')); + const expectPlaywrightPath = path.dirname(require.resolve('expect-playwright')); return { runner: path.join(presetBasePath, 'runner.js'), globalSetup: require.resolve(`${TEST_RUNNER_PATH}/playwright/global-setup.js`), @@ -52,17 +44,9 @@ export const getJestConfig = (): Config.InitialOptions => { STORYBOOK_JUNIT, } = process.env; - const jestJunitPath = path.dirname( - require.resolve('jest-junit', { - paths: [path.join(import.meta.dirname, '../node_modules')], - }) - ); + const jestJunitPath = path.dirname(require.resolve('jest-junit')); - const jestSerializerHtmlPath = path.dirname( - require.resolve('jest-serializer-html', { - paths: [path.join(import.meta.dirname, '../node_modules')], - }) - ); + const jestSerializerHtmlPath = path.dirname(require.resolve('jest-serializer-html')); // const swcJestPath = path.dirname( // require.resolve('@swc/jest', { diff --git a/src/test-storybook.ts b/src/test-storybook.ts index 78c9e48f..2a590950 100644 --- a/src/test-storybook.ts +++ b/src/test-storybook.ts @@ -5,8 +5,11 @@ import { execSync } from 'child_process'; import fetch from 'node-fetch'; import { canBindToHost } from 'can-bind-to-host'; import dedent from 'ts-dedent'; -import path, { join, resolve } from 'path'; +import path from 'path'; +import { join, resolve } from 'path'; import tempy from 'tempy'; +import { fileURLToPath } from 'url'; +import { createRequire } from 'module'; // @ts-ignore import { getInterpretedFile } from 'storybook/internal/common'; // @ts-ignore @@ -15,11 +18,16 @@ import { readConfig } from 'storybook/internal/csf-tools'; import { telemetry } from 'storybook/internal/telemetry'; import { glob } from 'glob'; -import { JestOptions, getCliOptions } from './util/getCliOptions'; -import { getStorybookMetadata } from './util/getStorybookMetadata'; -import { getTestRunnerConfig } from './util/getTestRunnerConfig'; -import { transformPlaywrightJson } from './playwright/transformPlaywrightJson'; -import { TestRunnerConfig } from './playwright/hooks'; +import { JestOptions, getCliOptions } from './util/getCliOptions.js'; +import { getStorybookMetadata } from './util/getStorybookMetadata.js'; +import { getTestRunnerConfig } from './util/getTestRunnerConfig.js'; +import { transformPlaywrightJson } from './playwright/transformPlaywrightJson.js'; +import { TestRunnerConfig } from './playwright/hooks.js'; + +// Get the current file's directory in ESM +const __filename2 = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename2); +const require = createRequire(import.meta.url); // Do this as the first thing so that any code reading it knows the right env. process.env.BABEL_ENV = 'test'; @@ -51,10 +59,11 @@ const cleanup = () => { } }; -function getNycBinPath() { - const nycPath = path.join(require.resolve('nyc/package.json')); - const nycBin = require(nycPath).bin.nyc; - const nycBinFullPath = path.join(path.dirname(nycPath), nycBin); +async function getNycBinPath() { + const nycPkgUrl = new URL('nyc/package.json', import.meta.url); + const { bin } = await import(nycPkgUrl.href, { assert: { type: 'json' } }); + const nycBin = bin.nyc; + const nycBinFullPath = path.join(path.dirname(fileURLToPath(nycPkgUrl)), nycBin); return nycBinFullPath; } @@ -83,7 +92,7 @@ async function reportCoverage() { // --check-coverage if we want to break if coverage reaches certain threshold // .nycrc will be respected for thresholds etc. https://www.npmjs.com/package/nyc#coverage-thresholds if (process.env.JEST_SHARD !== 'true') { - const nycBinFullPath = getNycBinPath(); + const nycBinFullPath = await getNycBinPath(); execSync( `node ${nycBinFullPath} report --reporter=text --reporter=lcov -t ${coverageFolder} --report-dir ${coverageFolder}`, { @@ -129,10 +138,10 @@ async function executeJestPlaywright(args: JestOptions) { // Always prefer jest installed via the test runner. If it's hoisted, it will get it from root node_modules const jestPath = path.dirname( require.resolve('jest', { - paths: [path.join(import.meta.dirname, '../@storybook/test-runner/node_modules')], + paths: [path.join(__dirname, '../@storybook/test-runner/node_modules')], }) ); - const jest = await import(jestPath); + const { default: jest } = await import(path.join(jestPath, 'index.js')); const argv = args.slice(2); // jest configs could either come in the root dir, or inside of the Storybook config dir @@ -146,7 +155,7 @@ async function executeJestPlaywright(args: JestOptions) { const jestConfigPath = userDefinedJestConfig || - path.resolve(import.meta.dirname, path.join('..', 'playwright', 'test-runner-jest.config.js')); + path.resolve(__dirname, path.join('..', 'playwright', 'test-runner-jest.config.js')); argv.push('--config', jestConfigPath); @@ -235,7 +244,7 @@ async function getIndexTempDir(url: string) { } function ejectConfiguration() { - const origin = path.resolve(import.meta.dirname, '../playwright/test-runner-jest.config.js'); + const origin = path.resolve(__dirname, '../playwright/test-runner-jest.config.js'); const destination = path.resolve('test-runner-jest.config.js'); const fileAlreadyExists = fs.existsSync(destination); From 6833c215e173d7170dcbc2e76ce0492951311b4a Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 7 Jul 2025 16:31:45 +0200 Subject: [PATCH 09/29] wip --- playwright/transform.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/playwright/transform.js b/playwright/transform.js index 1ab17ba2..80951a4b 100644 --- a/playwright/transform.js +++ b/playwright/transform.js @@ -3,10 +3,9 @@ import { transformPlaywright } from '../dist/index.js'; // Only export async version - force Jest to use it async function processAsync(src, filename) { - console.log('processAsync filename', filename); try { const csfTest = await transformPlaywright(src, filename); - console.log({ csfTest }); + // This swc transform might not be needed const result = await swcTransform(csfTest, { filename, isModule: true, @@ -16,9 +15,9 @@ async function processAsync(src, filename) { jsc: { parser: { syntax: 'typescript', - tsx: true, // Enable JSX support + tsx: true, }, - target: 'es2015', // Set target for compatibility + target: 'es2015', }, }); @@ -29,11 +28,6 @@ async function processAsync(src, filename) { } } -// Export only the async version export default { - process: (src, filename) => { - console.log('processSync filename', filename); - return { code: src }; - }, processAsync, }; From 9d2bec55c13ae2abbe5dad3bb4b74402bb357a11 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Wed, 9 Jul 2025 11:55:08 +0200 Subject: [PATCH 10/29] remove transformIgnorePatterns --- src/config/jest-playwright.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 388b95c8..1031d184 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -71,7 +71,6 @@ export const getJestConfig = (): Config.InitialOptions => { '^.+\\.[jt]sx?$': 'babel-jest', }, extensionsToTreatAsEsm: ['.jsx', '.ts', '.tsx'], - transformIgnorePatterns: ['node_modules/(?!(storybook|@storybook)/)'], snapshotSerializers: [jestSerializerHtmlPath], testEnvironmentOptions: { 'jest-playwright': { From 7cffe9e7f5aaca8bf31662c5b74e969b6e96b537 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 9 Jul 2025 14:05:29 +0200 Subject: [PATCH 11/29] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 929aa361..cdf95c7a 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "wait-on": "^7.2.0" }, "peerDependencies": { - "storybook": "0.0.0-pr-31819-sha-8b752a73" + "storybook": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0" }, "engines": { "node": ">=20.0.0" From 93dc6cceaf47755c5411b59856f2882d30d30da2 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 9 Jul 2025 14:08:48 +0200 Subject: [PATCH 12/29] Update storybook peerDependencies version in yarn.lock --- yarn.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index ee8e4947..98680bc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2930,7 +2930,7 @@ __metadata: vite: "npm:^6.3.2" wait-on: "npm:^7.2.0" peerDependencies: - storybook: 0.0.0-pr-31819-sha-8b752a73 + storybook: ^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0 bin: test-storybook: ./dist/test-storybook.js languageName: unknown From bd1811ab0c8b49ff2349eba71881d93378fce094 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 23 Jul 2025 09:34:05 +0200 Subject: [PATCH 13/29] dedupe lockfile --- yarn.lock | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/yarn.lock b/yarn.lock index 98680bc7..88fd4936 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3286,16 +3286,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": - version: 20.9.0 - resolution: "@types/node@npm:20.9.0" - dependencies: - undici-types: "npm:~5.26.4" - checksum: 10/a934f7645ed117a27857147403b0c657ffbca578c8f280e4c21d27dfb43e58dc4f24c4319d4335b8a4fa08e28fb2dc905a5bd5e4bc8878047164c56c1b162139 - languageName: node - linkType: hard - -"@types/node@npm:^24.0.10": +"@types/node@npm:*, @types/node@npm:^24.0.10": version: 24.0.10 resolution: "@types/node@npm:24.0.10" dependencies: @@ -9926,13 +9917,6 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10/0097779d94bc0fd26f0418b3a05472410408877279141ded2bd449167be1aed7ea5b76f756562cb3586a07f251b90799bab22d9019ceba49c037c76445f7cddd - languageName: node - linkType: hard - "undici-types@npm:~7.8.0": version: 7.8.0 resolution: "undici-types@npm:7.8.0" From 5476b850d8e99604575e2b1ff5e1d863592ad26a Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 23 Jul 2025 09:37:32 +0200 Subject: [PATCH 14/29] use latest canary of esm build of storybook --- package.json | 8 +- yarn.lock | 203 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 123 insertions(+), 88 deletions(-) diff --git a/package.json b/package.json index cdf95c7a..adca098f 100644 --- a/package.json +++ b/package.json @@ -79,10 +79,10 @@ "@babel/preset-env": "^7.19.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", - "@storybook/addon-a11y": "0.0.0-pr-31819-sha-8b752a73", + "@storybook/addon-a11y": "0.0.0-pr-31819-sha-7e336af7", "@storybook/addon-coverage": "^1.0.0", - "@storybook/addon-docs": "0.0.0-pr-31819-sha-8b752a73", - "@storybook/react-vite": "0.0.0-pr-31819-sha-8b752a73", + "@storybook/addon-docs": "0.0.0-pr-31819-sha-7e336af7", + "@storybook/react-vite": "0.0.0-pr-31819-sha-7e336af7", "@types/jest": "^30.0.0", "@types/node": "^24.0.10", "@vitejs/plugin-react": "^4.0.3", @@ -102,7 +102,7 @@ "react": "^17.0.1", "react-dom": "^17.0.1", "read-pkg-up": "^7.0.1", - "storybook": "0.0.0-pr-31819-sha-8b752a73", + "storybook": "0.0.0-pr-31819-sha-7e336af7", "tempy": "^1.0.1", "ts-dedent": "^2.0.0", "ts-jest": "^29.4.0", diff --git a/yarn.lock b/yarn.lock index 88fd4936..f4ab52fe 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2191,20 +2191,20 @@ __metadata: languageName: node linkType: hard -"@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.0": - version: 0.6.0 - resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.0" +"@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.1": + version: 0.6.1 + resolution: "@joshwooding/vite-plugin-react-docgen-typescript@npm:0.6.1" dependencies: glob: "npm:^10.0.0" magic-string: "npm:^0.30.0" react-docgen-typescript: "npm:^2.2.2" peerDependencies: typescript: ">= 4.3.x" - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/c418ea1719a7642706ac806abcd30e23562f2debaf16f0fe8b6d8037b113b8cab87e6afca159d5f4fa0321548bace93c266c6581af3e0341f5596b95be16747e + checksum: 10/a82b6005378ccda13250fcfeaa04ec2ba17d1c2923b5bba5907d5b2fd658c661b29c1215eb1c0fe305b390bee89ec77c684aa68506262734c3bb3cd76d8a6963 languageName: node linkType: hard @@ -2732,15 +2732,15 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-a11y@npm:0.0.0-pr-31819-sha-8b752a73": - version: 0.0.0-pr-31819-sha-8b752a73 - resolution: "@storybook/addon-a11y@npm:0.0.0-pr-31819-sha-8b752a73" +"@storybook/addon-a11y@npm:0.0.0-pr-31819-sha-7e336af7": + version: 0.0.0-pr-31819-sha-7e336af7 + resolution: "@storybook/addon-a11y@npm:0.0.0-pr-31819-sha-7e336af7" dependencies: "@storybook/global": "npm:^5.0.0" axe-core: "npm:^4.2.0" peerDependencies: - storybook: ^0.0.0-pr-31819-sha-8b752a73 - checksum: 10/bdd97b22de1f5731e35f96ae49222bd0b4bc0f61cc78cfb07d109318da00590092136c726b3a638cc92124e32932dadcd7af2df77f79448ce0b18a5116820c5b + storybook: ^0.0.0-pr-31819-sha-7e336af7 + checksum: 10/f7314295d597b9e530436451f9881553a44196e4b894a36877ff4f01d5678f89702b257f641b78e52efb20d1957a47f5e6a403d26b4e30bcf264b599527765a0 languageName: node linkType: hard @@ -2760,44 +2760,57 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-docs@npm:0.0.0-pr-31819-sha-8b752a73": - version: 0.0.0-pr-31819-sha-8b752a73 - resolution: "@storybook/addon-docs@npm:0.0.0-pr-31819-sha-8b752a73" +"@storybook/addon-docs@npm:0.0.0-pr-31819-sha-7e336af7": + version: 0.0.0-pr-31819-sha-7e336af7 + resolution: "@storybook/addon-docs@npm:0.0.0-pr-31819-sha-7e336af7" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/csf-plugin": "npm:0.0.0-pr-31819-sha-7e336af7" "@storybook/icons": "npm:^1.2.12" - "@storybook/react-dom-shim": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/react-dom-shim": "npm:0.0.0-pr-31819-sha-7e336af7" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^0.0.0-pr-31819-sha-8b752a73 - checksum: 10/e03abc12beff89cd3521b46778497256e3570208acd99476c09550e8f3a6df9560d775d9ba47d5f35c50c1482b2c51ff249acce030fba5e7337f0f6cb3b3342e + storybook: ^0.0.0-pr-31819-sha-7e336af7 + checksum: 10/b6a97b8d2f05635b72f566d904133c8a52b1b2e60104dae42980c62400d099c8a6635a1a331d8214ad8b8ccd7a6f0aae749ec697bf4b5b842f61234c163bb74b languageName: node linkType: hard -"@storybook/builder-vite@npm:0.0.0-pr-31819-sha-8b752a73": - version: 0.0.0-pr-31819-sha-8b752a73 - resolution: "@storybook/builder-vite@npm:0.0.0-pr-31819-sha-8b752a73" +"@storybook/builder-vite@npm:0.0.0-pr-31819-sha-7e336af7": + version: 0.0.0-pr-31819-sha-7e336af7 + resolution: "@storybook/builder-vite@npm:0.0.0-pr-31819-sha-7e336af7" dependencies: - "@storybook/csf-plugin": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/csf-plugin": "npm:0.0.0-pr-31819-sha-7e336af7" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^0.0.0-pr-31819-sha-8b752a73 + storybook: ^0.0.0-pr-31819-sha-7e336af7 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10/c947e14c16c604d37796f333ad6e7a4c796a4b4ab426c4060366710aee385441a169797fd02ee4102baca5efa594f9510f261a4be8d6afb8e90d06d79055302c + checksum: 10/8f614a114f6719d25eeb9eede04488a952818b55c7451a7a35a767fe4f0e7c65a3871c73488d4d0784d6caade3bca4e2e8e57d7cbe60369f9bf2e3f7f8c27d4f languageName: node linkType: hard -"@storybook/csf-plugin@npm:0.0.0-pr-31819-sha-8b752a73": - version: 0.0.0-pr-31819-sha-8b752a73 - resolution: "@storybook/csf-plugin@npm:0.0.0-pr-31819-sha-8b752a73" +"@storybook/csf-plugin@npm:0.0.0-pr-31819-sha-7e336af7": + version: 0.0.0-pr-31819-sha-7e336af7 + resolution: "@storybook/csf-plugin@npm:0.0.0-pr-31819-sha-7e336af7" dependencies: - unplugin: "npm:^1.3.1" + unplugin: "npm:^2.3.5" peerDependencies: - storybook: ^0.0.0-pr-31819-sha-8b752a73 - checksum: 10/c16993fc66ec258f4705c272cfe636002c8675fb99133137bb3fb28ee51a6eda1133eabfb83db7a9bc2d6c6ed56e689a037bcf2819961b1a4b67e2077809fd39 + esbuild: "*" + rollup: "*" + storybook: ^0.0.0-pr-31819-sha-7e336af7 + vite: "*" + webpack: "*" + peerDependenciesMeta: + esbuild: + optional: true + rollup: + optional: true + vite: + optional: true + webpack: + optional: true + checksum: 10/e3a5861fcd57e6305cdf40a629f199b40de4cd64d352645d6b3e83c69d9c797911fd8b82fd46663b8ce90e770daec93638b3ff9cacb04cda222559fb3602e113 languageName: node linkType: hard @@ -2808,7 +2821,7 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^1.2.12": +"@storybook/icons@npm:^1.2.12, @storybook/icons@npm:^1.4.0": version: 1.4.0 resolution: "@storybook/icons@npm:1.4.0" peerDependencies: @@ -2818,54 +2831,54 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:0.0.0-pr-31819-sha-8b752a73": - version: 0.0.0-pr-31819-sha-8b752a73 - resolution: "@storybook/react-dom-shim@npm:0.0.0-pr-31819-sha-8b752a73" +"@storybook/react-dom-shim@npm:0.0.0-pr-31819-sha-7e336af7": + version: 0.0.0-pr-31819-sha-7e336af7 + resolution: "@storybook/react-dom-shim@npm:0.0.0-pr-31819-sha-7e336af7" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^0.0.0-pr-31819-sha-8b752a73 - checksum: 10/4b772322c76c7529cb4ea2997224c72b97ad2aea89bdc2158634ae8a95e57d300ed276e234345333e65726aed067cddde5e87188421d27f69581f4a184025a63 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^0.0.0-pr-31819-sha-7e336af7 + checksum: 10/2a9317c180473d8ae0aa7de66856193e3b41f8dd3f031e4c367bbd80ed155217d4e428c240891d66e8458025ee1ba6f6b8564423bfb98b1ac2c4ae77ede8212e languageName: node linkType: hard -"@storybook/react-vite@npm:0.0.0-pr-31819-sha-8b752a73": - version: 0.0.0-pr-31819-sha-8b752a73 - resolution: "@storybook/react-vite@npm:0.0.0-pr-31819-sha-8b752a73" +"@storybook/react-vite@npm:0.0.0-pr-31819-sha-7e336af7": + version: 0.0.0-pr-31819-sha-7e336af7 + resolution: "@storybook/react-vite@npm:0.0.0-pr-31819-sha-7e336af7" dependencies: - "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.0" + "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.1" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:0.0.0-pr-31819-sha-8b752a73" - "@storybook/react": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/builder-vite": "npm:0.0.0-pr-31819-sha-7e336af7" + "@storybook/react": "npm:0.0.0-pr-31819-sha-7e336af7" find-up: "npm:^7.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" resolve: "npm:^1.22.8" tsconfig-paths: "npm:^4.2.0" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^0.0.0-pr-31819-sha-8b752a73 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^0.0.0-pr-31819-sha-7e336af7 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10/c43c1a80f56fe964419edeaa33815e67ce021c554e076211086655999fee295afd83405c11675487faddb7ad27e4c2305484232d3aae35520a8385b4eaccc0b4 + checksum: 10/a65ecfc2e38743c49e4e439464d47dbad44f4284b0201f696351757835ecf898457a3753967a5854b086bd4a79ac08dc33be35aafbc063fad18f86c5ee2b9b4a languageName: node linkType: hard -"@storybook/react@npm:0.0.0-pr-31819-sha-8b752a73": - version: 0.0.0-pr-31819-sha-8b752a73 - resolution: "@storybook/react@npm:0.0.0-pr-31819-sha-8b752a73" +"@storybook/react@npm:0.0.0-pr-31819-sha-7e336af7": + version: 0.0.0-pr-31819-sha-7e336af7 + resolution: "@storybook/react@npm:0.0.0-pr-31819-sha-7e336af7" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/react-dom-shim": "npm:0.0.0-pr-31819-sha-7e336af7" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^0.0.0-pr-31819-sha-8b752a73 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^0.0.0-pr-31819-sha-7e336af7 typescript: ">= 4.9.x" peerDependenciesMeta: typescript: optional: true - checksum: 10/42cdb22798a3c9c486422af1582ba2af4fb5047b6deedbbd6258470c77ad8bfdc033a1d11514a6a07080b94130cfe0325431aad9e95145c27ac9492755e35653 + checksum: 10/bb02c088d5492c3587dd8aaf687b826f4ac3a4135a10437ee9d623934412d03e7d818bc983f3fc6224051e3fc1d0fbd90c7310117618ca7da2f45dab5c9a8803 languageName: node linkType: hard @@ -2883,10 +2896,10 @@ __metadata: "@babel/template": "npm:^7.22.5" "@babel/types": "npm:^7.22.5" "@jest/types": "npm:^30.0.1" - "@storybook/addon-a11y": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/addon-a11y": "npm:0.0.0-pr-31819-sha-7e336af7" "@storybook/addon-coverage": "npm:^1.0.0" - "@storybook/addon-docs": "npm:0.0.0-pr-31819-sha-8b752a73" - "@storybook/react-vite": "npm:0.0.0-pr-31819-sha-8b752a73" + "@storybook/addon-docs": "npm:0.0.0-pr-31819-sha-7e336af7" + "@storybook/react-vite": "npm:0.0.0-pr-31819-sha-7e336af7" "@swc/core": "npm:^1.5.22" "@swc/jest": "npm:^0.2.38" "@types/jest": "npm:^30.0.0" @@ -2921,7 +2934,7 @@ __metadata: react: "npm:^17.0.1" react-dom: "npm:^17.0.1" read-pkg-up: "npm:^7.0.1" - storybook: "npm:0.0.0-pr-31819-sha-8b752a73" + storybook: "npm:0.0.0-pr-31819-sha-7e336af7" tempy: "npm:^1.0.1" ts-dedent: "npm:^2.0.0" ts-jest: "npm:^29.4.0" @@ -3518,6 +3531,25 @@ __metadata: languageName: node linkType: hard +"@vitest/mocker@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/mocker@npm:3.2.4" + dependencies: + "@vitest/spy": "npm:3.2.4" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10/5e92431b6ed9fc1679060e4caef3e4623f4750542a5d7cd944774f8217c4d231e273202e8aea00bab33260a5a9222ecb7005d80da0348c3c829bd37d123071a8 + languageName: node + linkType: hard + "@vitest/pretty-format@npm:3.2.4": version: 3.2.4 resolution: "@vitest/pretty-format@npm:3.2.4" @@ -3570,7 +3602,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.10.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.9.0": +"acorn@npm:^8.14.0, acorn@npm:^8.14.1, acorn@npm:^8.4.1, acorn@npm:^8.9.0": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -4292,7 +4324,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.0, chokidar@npm:^3.5.3": +"chokidar@npm:^3.4.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -5186,6 +5218,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10/a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -9215,14 +9256,16 @@ __metadata: languageName: node linkType: hard -"storybook@npm:0.0.0-pr-31819-sha-8b752a73": - version: 0.0.0-pr-31819-sha-8b752a73 - resolution: "storybook@npm:0.0.0-pr-31819-sha-8b752a73" +"storybook@npm:0.0.0-pr-31819-sha-7e336af7": + version: 0.0.0-pr-31819-sha-7e336af7 + resolution: "storybook@npm:0.0.0-pr-31819-sha-7e336af7" dependencies: "@storybook/global": "npm:^5.0.0" + "@storybook/icons": "npm:^1.4.0" "@testing-library/jest-dom": "npm:^6.6.3" "@testing-library/user-event": "npm:^14.6.1" "@vitest/expect": "npm:3.2.4" + "@vitest/mocker": "npm:3.2.4" "@vitest/spy": "npm:3.2.4" better-opn: "npm:^3.0.2" esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" @@ -9236,7 +9279,7 @@ __metadata: optional: true bin: storybook: ./dist/bin/dispatcher.js - checksum: 10/d0984f7f86649558984cc209456fd90449699718153b4b6e2e6180983d3f6b9903f28cc7e70c8870a49d56ceed948f19cc89f4d931de5684ec1c8e02f8f627c1 + checksum: 10/8f57c79dde18b14d03a276170a6ae65c58f1f0bada2f17839f84d0acde88b2f57dc6845889c585df814a1c236f0986e718be3d9b526bf5ddbc2522c033d112c5 languageName: node linkType: hard @@ -9996,15 +10039,14 @@ __metadata: languageName: node linkType: hard -"unplugin@npm:^1.3.1": - version: 1.5.0 - resolution: "unplugin@npm:1.5.0" +"unplugin@npm:^2.3.5": + version: 2.3.5 + resolution: "unplugin@npm:2.3.5" dependencies: - acorn: "npm:^8.10.0" - chokidar: "npm:^3.5.3" - webpack-sources: "npm:^3.2.3" - webpack-virtual-modules: "npm:^0.5.0" - checksum: 10/4a867f2630b932c34983a4b7c741624789752677ea1a6e3e73ca68a716e7214d50d7855fb4d0e02b4a58f81aaee2def021d54365929be03a57c4b25911ae89c1 + acorn: "npm:^8.14.1" + picomatch: "npm:^4.0.2" + webpack-virtual-modules: "npm:^0.6.2" + checksum: 10/93956b472c66ba452599d64343ef3c2440f8279bdc449f399f9c884307934f9b383fa09c646f998f0cf1488204e993316f9a2e483d6cf01f45fd618f401942dd languageName: node linkType: hard @@ -10283,17 +10325,10 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10/a661f41795d678b7526ae8a88cd1b3d8ce71a7d19b6503da8149b2e667fc7a12f9b899041c1665d39e38245ed3a59ab68de648ea31040c3829aa695a5a45211d - languageName: node - linkType: hard - -"webpack-virtual-modules@npm:^0.5.0": - version: 0.5.0 - resolution: "webpack-virtual-modules@npm:0.5.0" - checksum: 10/65a8f90c7e6609ba1c4ad2697bb83ae662485893fb545f6aa9a74e3a5d7485bbc50ef057c5bc3feca25d3153ebf9c097c233cbe4d67b52418bc84348dfb20c1a +"webpack-virtual-modules@npm:^0.6.2": + version: 0.6.2 + resolution: "webpack-virtual-modules@npm:0.6.2" + checksum: 10/d9a0d035f7ec0c7f1055aaf88bfe48b7f96458043916a1b2926d9012fd61de3810a6b768e31a8cd4b3c84a9b6d55824361a9dd20aaf9f5ccfb6f017af216a178 languageName: node linkType: hard From 12b71b187b16851a49dcf358c9e1365e22401a28 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Wed, 23 Jul 2025 11:00:33 +0200 Subject: [PATCH 15/29] Refactor Babel configuration to ESM syntax, update package.json to enable module type, and upgrade Jest and SWC dependencies. Adjust Playwright setup for ESM compatibility and clean up TypeScript ignore comments across multiple files. --- .babelrc.js | 2 +- package.json | 7 +- playwright/jest-setup.js | 2 +- src/config/jest-playwright.ts | 12 +- src/csf/transformCsf.ts | 2 - src/playwright/hooks.ts | 1 - src/playwright/transformPlaywright.ts | 1 - src/playwright/transformPlaywrightJson.ts | 1 - src/setup-page-script.ts | 2 - src/setup-page.ts | 7 +- src/test-storybook.ts | 26 +-- src/util/getStorybookMain.ts | 2 - src/util/getStorybookMetadata.ts | 2 - src/util/getTestRunnerConfig.ts | 1 - .../__snapshots__/Button.stories.tsx.snap | 2 +- .../__snapshots__/Header.stories.tsx.snap | 2 +- .../pages/__snapshots__/Page.stories.tsx.snap | 2 +- yarn.lock | 169 +++++++++--------- 18 files changed, 115 insertions(+), 128 deletions(-) diff --git a/.babelrc.js b/.babelrc.js index 25da7069..612f2a39 100644 --- a/.babelrc.js +++ b/.babelrc.js @@ -1,4 +1,4 @@ -module.exports = { +export default { presets: [ ['@babel/preset-env', { targets: { node: 'current' } }], '@babel/preset-typescript', diff --git a/package.json b/package.json index adca098f..cd362999 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,6 @@ "name": "@storybook/test-runner", "version": "0.22.1", "description": "Test runner for Storybook stories", - "type": "module", "keywords": [ "storybook-addons", "test", @@ -17,6 +16,7 @@ }, "license": "MIT", "author": "shilman", + "type": "module", "main": "dist/index.js", "module": "dist/index.js", "types": "dist/index.d.ts", @@ -87,7 +87,6 @@ "@types/node": "^24.0.10", "@vitejs/plugin-react": "^4.0.3", "auto": "^11.1.6", - "babel-jest": "^30.0.4", "babel-loader": "^8.1.0", "babel-plugin-istanbul": "^6.1.1", "can-bind-to-host": "^1.1.1", @@ -114,6 +113,7 @@ "peerDependencies": { "storybook": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0" }, + "packageManager": "yarn@4.5.1", "engines": { "node": ">=20.0.0" }, @@ -137,6 +137,5 @@ "react-native" ], "icon": "https://user-images.githubusercontent.com/321738/63501763-88dbf600-c4cc-11e9-96cd-94adadc2fd72.png" - }, - "packageManager": "yarn@4.5.1" + } } diff --git a/playwright/jest-setup.js b/playwright/jest-setup.js index 083134e3..492767b2 100644 --- a/playwright/jest-setup.js +++ b/playwright/jest-setup.js @@ -1,6 +1,6 @@ import { getTestRunnerConfig, setPreVisit, setPostVisit, setupPage } from '../dist/index.js'; -const testRunnerConfig = getTestRunnerConfig(process.env.STORYBOOK_CONFIG_DIR); +const testRunnerConfig = await getTestRunnerConfig(process.env.STORYBOOK_CONFIG_DIR); if (testRunnerConfig) { // hooks set up if (testRunnerConfig.setup) { diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 1031d184..c26f5f87 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -48,11 +48,11 @@ export const getJestConfig = (): Config.InitialOptions => { const jestSerializerHtmlPath = path.dirname(require.resolve('jest-serializer-html')); - // const swcJestPath = path.dirname( - // require.resolve('@swc/jest', { - // paths: [path.join(import.meta.dirname, '../node_modules')], - // }) - // ); + const swcJestPath = path.dirname( + require.resolve('@swc/jest', { + paths: [path.join(import.meta.dirname, '../node_modules')], + }) + ); const reporters = STORYBOOK_JUNIT ? ['default', jestJunitPath] : ['default']; @@ -68,7 +68,7 @@ export const getJestConfig = (): Config.InitialOptions => { '^.+\\.(story|stories)\\.[jt]sx?$': require.resolve( `${TEST_RUNNER_PATH}/playwright/transform.js` ), - '^.+\\.[jt]sx?$': 'babel-jest', + '^.+\\.[jt]sx?$': '@swc/jest', }, extensionsToTreatAsEsm: ['.jsx', '.ts', '.tsx'], snapshotSerializers: [jestSerializerHtmlPath], diff --git a/src/csf/transformCsf.ts b/src/csf/transformCsf.ts index 7c351175..bb11c7b9 100644 --- a/src/csf/transformCsf.ts +++ b/src/csf/transformCsf.ts @@ -1,7 +1,5 @@ /* eslint-disable no-underscore-dangle */ -// @ts-ignore import { toId, storyNameFromExport, combineTags } from 'storybook/internal/csf'; -// @ts-ignore import { loadCsf } from 'storybook/internal/csf-tools'; import * as t from '@babel/types'; import babelGenerate from '@babel/generator'; diff --git a/src/playwright/hooks.ts b/src/playwright/hooks.ts index 111a58a1..d316b936 100644 --- a/src/playwright/hooks.ts +++ b/src/playwright/hooks.ts @@ -1,5 +1,4 @@ import type { BrowserContext, Page } from 'playwright'; -// @ts-ignore import type { StoryContextForEnhancers } from 'storybook/internal/csf'; export type TestContext = { diff --git a/src/playwright/transformPlaywright.ts b/src/playwright/transformPlaywright.ts index 76929303..c70fc831 100644 --- a/src/playwright/transformPlaywright.ts +++ b/src/playwright/transformPlaywright.ts @@ -3,7 +3,6 @@ import babelTemplate from '@babel/template'; // Handle both ESM and CJS patterns const template = (babelTemplate as any).default ?? babelTemplate; -// @ts-ignore import { userOrAutoTitle } from 'storybook/internal/preview-api'; import dedent from 'ts-dedent'; diff --git a/src/playwright/transformPlaywrightJson.ts b/src/playwright/transformPlaywrightJson.ts index 69fb0356..4c2f4a0a 100644 --- a/src/playwright/transformPlaywrightJson.ts +++ b/src/playwright/transformPlaywrightJson.ts @@ -3,7 +3,6 @@ import babelGenerate from '@babel/generator'; // Handle both ESM and CJS patterns const generate = (babelGenerate as any).default ?? babelGenerate; -// @ts-ignore import { ComponentTitle, StoryId, StoryName, toId } from 'storybook/internal/csf'; import { testPrefixer } from './transformPlaywright'; diff --git a/src/setup-page-script.ts b/src/setup-page-script.ts index 7e30eceb..b81e8563 100644 --- a/src/setup-page-script.ts +++ b/src/setup-page-script.ts @@ -4,9 +4,7 @@ * This file is a template to the content which is injected to the Playwright page via the ./setup-page.ts file. * setup-page.ts will read the contents of this file and replace values that use {{x}} pattern, and they should be put right below: */ -// @ts-ignore import { PreviewWeb } from 'storybook/internal/preview-api'; -// @ts-ignore import { StoryContext } from 'storybook/internal/csf'; type ConsoleMethod = diff --git a/src/setup-page.ts b/src/setup-page.ts index 64912565..296f3316 100644 --- a/src/setup-page.ts +++ b/src/setup-page.ts @@ -4,7 +4,8 @@ import { pkgUp } from 'pkg-up'; import { PrepareContext } from './playwright/hooks'; import { getTestRunnerConfig } from './util/getTestRunnerConfig'; import { readFile } from 'node:fs/promises'; -import path from 'node:path'; +import path, { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; /** * This is a default prepare function which can be overridden by the user. @@ -72,8 +73,10 @@ export const setupPage = async (page: Page, browserContext: BrowserContext) => { return message; }); + const cwd = typeof __dirname === 'string' ? __dirname : dirname(fileURLToPath(import.meta.url)); + const finalStorybookUrl = referenceURL ?? targetURL ?? ''; - const testRunnerPackageLocation = await pkgUp({ cwd: import.meta.dirname }); + const testRunnerPackageLocation = await pkgUp({ cwd }); if (!testRunnerPackageLocation) throw new Error('Could not find test-runner package location'); const scriptLocation = path.join( path.dirname(testRunnerPackageLocation), diff --git a/src/test-storybook.ts b/src/test-storybook.ts index 2a590950..b763c28d 100644 --- a/src/test-storybook.ts +++ b/src/test-storybook.ts @@ -10,11 +10,8 @@ import { join, resolve } from 'path'; import tempy from 'tempy'; import { fileURLToPath } from 'url'; import { createRequire } from 'module'; -// @ts-ignore import { getInterpretedFile } from 'storybook/internal/common'; -// @ts-ignore import { readConfig } from 'storybook/internal/csf-tools'; -// @ts-ignore import { telemetry } from 'storybook/internal/telemetry'; import { glob } from 'glob'; @@ -136,12 +133,14 @@ function sanitizeURL(url: string) { async function executeJestPlaywright(args: JestOptions) { // Always prefer jest installed via the test runner. If it's hoisted, it will get it from root node_modules - const jestPath = path.dirname( - require.resolve('jest', { - paths: [path.join(__dirname, '../@storybook/test-runner/node_modules')], - }) + const jestPath = path.join( + path.dirname( + require.resolve('jest/package.json', { + paths: [path.join(__dirname, '../@storybook/test-runner/node_modules')], + }) + ), + 'bin/jest.js' ); - const { default: jest } = await import(path.join(jestPath, 'index.js')); const argv = args.slice(2); // jest configs could either come in the root dir, or inside of the Storybook config dir @@ -157,16 +156,21 @@ async function executeJestPlaywright(args: JestOptions) { userDefinedJestConfig || path.resolve(__dirname, path.join('..', 'playwright', 'test-runner-jest.config.js')); - argv.push('--config', jestConfigPath); + const command = `node --experimental-vm-modules ${jestPath} ${argv.join( + ' ' + )} --config ${jestConfigPath}`; - await jest.run(argv); + execSync(command, { + stdio: 'inherit', + cwd: process.cwd(), + }); } async function checkStorybook(url: string) { try { const headers = await getHttpHeaders(url); const res = await fetch(url, { method: 'GET', headers }); - if (res.status !== 200) throw new Error(`Unxpected status: ${res.status}`); + if (res.status !== 200) throw new Error(`Unexpected status: ${res.status}`); } catch (e) { console.error( dedent`\x1b[31m[test-storybook]\x1b[0m It seems that your Storybook instance is not running at: ${url}. Are you sure it's running? diff --git a/src/util/getStorybookMain.ts b/src/util/getStorybookMain.ts index cb571983..347a5c0f 100644 --- a/src/util/getStorybookMain.ts +++ b/src/util/getStorybookMain.ts @@ -1,7 +1,5 @@ import { join, resolve } from 'path'; -// @ts-ignore import { serverRequire } from 'storybook/internal/common'; -// @ts-ignore import type { StorybookConfig } from 'storybook/internal/types'; import dedent from 'ts-dedent'; diff --git a/src/util/getStorybookMetadata.ts b/src/util/getStorybookMetadata.ts index d019585d..b1fe0a85 100644 --- a/src/util/getStorybookMetadata.ts +++ b/src/util/getStorybookMetadata.ts @@ -1,7 +1,5 @@ import { join } from 'path'; -// @ts-ignore import { normalizeStories, getProjectRoot } from 'storybook/internal/common'; -// @ts-ignore import { StoriesEntry } from 'storybook/internal/types'; import { getStorybookMain } from './getStorybookMain'; diff --git a/src/util/getTestRunnerConfig.ts b/src/util/getTestRunnerConfig.ts index 001910b4..43f0eb1c 100644 --- a/src/util/getTestRunnerConfig.ts +++ b/src/util/getTestRunnerConfig.ts @@ -1,5 +1,4 @@ import { join, resolve } from 'path'; -// @ts-ignore import { serverRequire } from 'storybook/internal/common'; import { TestRunnerConfig } from '../playwright/hooks'; diff --git a/stories/atoms/__snapshots__/Button.stories.tsx.snap b/stories/atoms/__snapshots__/Button.stories.tsx.snap index dab58ccb..0fd0fab4 100644 --- a/stories/atoms/__snapshots__/Button.stories.tsx.snap +++ b/stories/atoms/__snapshots__/Button.stories.tsx.snap @@ -1,4 +1,4 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing exports[`Atoms/Button Demo play-test 2`] = ` '; -if (!require.main) { - describe("Button", () => { - describe("Primary", () => { - it("smoke-test", async () => { - const testFn = async () => { - const context = { - id: "button--primary", - title: "Button", - name: "Primary" - }; - if (globalThis.__sbPreVisit) { - await globalThis.__sbPreVisit(page, context); - } - let result; - try { - result = await page.evaluate(({ - id, - hasPlayFn - }) => __test(id, hasPlayFn), { - id: "button--primary" - }); - } catch (err) { - if (err.toString().includes('Execution context was destroyed')) { - throw err; - } else { - if (globalThis.__sbPostVisit) { - await globalThis.__sbPostVisit(page, { - ...context, - hasFailure: true - }); - } - throw err; - } - } - if (globalThis.__sbPostVisit) { - await globalThis.__sbPostVisit(page, context); - } - if (globalThis.__sbCollectCoverage) { - const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); - if (!isCoverageSetupCorrectly) { - throw new Error(\`[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. - More info: https://github.com/storybookjs/test-runner#setting-up-code-coverage\`); - } - await jestPlaywright.saveCoverage(page); - } - return result; +describe("Button", () => { + describe("Primary", () => { + it("smoke-test", async () => { + const testFn = async () => { + const context = { + id: "button--primary", + title: "Button", + name: "Primary" }; + if (globalThis.__sbPreVisit) { + await globalThis.__sbPreVisit(page, context); + } + let result; try { - await testFn(); + result = await page.evaluate(({ + id, + hasPlayFn + }) => __test(id, hasPlayFn), { + id: "button--primary" + }); } 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: "\${"Button"}/\${"Primary"}". Retrying...\`); - await jestPlaywright.resetPage(); - await globalThis.__sbSetupPage(globalThis.page, globalThis.context); - await testFn(); + throw err; } else { + if (globalThis.__sbPostVisit) { + await globalThis.__sbPostVisit(page, { + ...context, + hasFailure: true + }); + } throw err; } } - }); + if (globalThis.__sbPostVisit) { + await globalThis.__sbPostVisit(page, context); + } + if (globalThis.__sbCollectCoverage) { + const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); + if (!isCoverageSetupCorrectly) { + throw new Error(\`[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. +More info: https://github.com/storybookjs/test-runner#setting-up-code-coverage\`); + } + await jestPlaywright.saveCoverage(page); + } + return result; + }; + try { + 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: "\${"Button"}/\${"Primary"}". Retrying...\`); + await jestPlaywright.resetPage(); + await globalThis.__sbSetupPage(globalThis.page, globalThis.context); + await testFn(); + } else { + throw err; + } + } }); }); -}" +});" `; -exports[`transformCsf calls the testPrefixer function for each test 1`] = ` +exports[`transformCsf > calls the testPrefixer function for each test 1`] = ` " export default { title: 'Button', @@ -98,141 +96,137 @@ exports[`transformCsf calls the testPrefixer function for each test 1`] = ` export const Primary = () => ''; -if (!require.main) { - describe("Button", () => { - describe("Primary", () => { - it("smoke-test", async () => { - const testFn = async () => { - const context = { - id: "button--primary", - title: "Button", - name: "Primary" - }; - if (globalThis.__sbPreVisit) { - await globalThis.__sbPreVisit(page, context); - } - let result; - try { - result = await page.evaluate(({ - id, - hasPlayFn - }) => __test(id, hasPlayFn), { - id: "button--primary" - }); - } catch (err) { - if (err.toString().includes('Execution context was destroyed')) { - throw err; - } else { - if (globalThis.__sbPostVisit) { - await globalThis.__sbPostVisit(page, { - ...context, - hasFailure: true - }); - } - throw err; - } - } - if (globalThis.__sbPostVisit) { - await globalThis.__sbPostVisit(page, context); - } - if (globalThis.__sbCollectCoverage) { - const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); - if (!isCoverageSetupCorrectly) { - throw new Error(\`[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. - More info: https://github.com/storybookjs/test-runner#setting-up-code-coverage\`); - } - await jestPlaywright.saveCoverage(page); - } - return result; +describe("Button", () => { + describe("Primary", () => { + it("smoke-test", async () => { + const testFn = async () => { + const context = { + id: "button--primary", + title: "Button", + name: "Primary" }; + if (globalThis.__sbPreVisit) { + await globalThis.__sbPreVisit(page, context); + } + let result; try { - await testFn(); + result = await page.evaluate(({ + id, + hasPlayFn + }) => __test(id, hasPlayFn), { + id: "button--primary" + }); } 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: "\${"Button"}/\${"Primary"}". Retrying...\`); - await jestPlaywright.resetPage(); - await globalThis.__sbSetupPage(globalThis.page, globalThis.context); - await testFn(); + throw err; } else { + if (globalThis.__sbPostVisit) { + await globalThis.__sbPostVisit(page, { + ...context, + hasFailure: true + }); + } throw err; } } - }); + if (globalThis.__sbPostVisit) { + await globalThis.__sbPostVisit(page, context); + } + if (globalThis.__sbCollectCoverage) { + const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); + if (!isCoverageSetupCorrectly) { + throw new Error(\`[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. +More info: https://github.com/storybookjs/test-runner#setting-up-code-coverage\`); + } + await jestPlaywright.saveCoverage(page); + } + return result; + }; + try { + 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: "\${"Button"}/\${"Primary"}". Retrying...\`); + await jestPlaywright.resetPage(); + await globalThis.__sbSetupPage(globalThis.page, globalThis.context); + await testFn(); + } else { + throw err; + } + } }); }); -}" +});" `; -exports[`transformCsf clears the body if clearBody option is true 1`] = ` +exports[`transformCsf > clears the body if clearBody option is true 1`] = ` " -if (!require.main) { - describe("Button", () => { - describe("Primary", () => { - it("smoke-test", async () => { - const testFn = async () => { - const context = { - id: "button--primary", - title: "Button", - name: "Primary" - }; - if (globalThis.__sbPreVisit) { - await globalThis.__sbPreVisit(page, context); - } - let result; - try { - result = await page.evaluate(({ - id, - hasPlayFn - }) => __test(id, hasPlayFn), { - id: "button--primary" - }); - } catch (err) { - if (err.toString().includes('Execution context was destroyed')) { - throw err; - } else { - if (globalThis.__sbPostVisit) { - await globalThis.__sbPostVisit(page, { - ...context, - hasFailure: true - }); - } - throw err; - } - } - if (globalThis.__sbPostVisit) { - await globalThis.__sbPostVisit(page, context); - } - if (globalThis.__sbCollectCoverage) { - const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); - if (!isCoverageSetupCorrectly) { - throw new Error(\`[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. - More info: https://github.com/storybookjs/test-runner#setting-up-code-coverage\`); - } - await jestPlaywright.saveCoverage(page); - } - return result; +describe("Button", () => { + describe("Primary", () => { + it("smoke-test", async () => { + const testFn = async () => { + const context = { + id: "button--primary", + title: "Button", + name: "Primary" }; + if (globalThis.__sbPreVisit) { + await globalThis.__sbPreVisit(page, context); + } + let result; try { - await testFn(); + result = await page.evaluate(({ + id, + hasPlayFn + }) => __test(id, hasPlayFn), { + id: "button--primary" + }); } 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: "\${"Button"}/\${"Primary"}". Retrying...\`); - await jestPlaywright.resetPage(); - await globalThis.__sbSetupPage(globalThis.page, globalThis.context); - await testFn(); + throw err; } else { + if (globalThis.__sbPostVisit) { + await globalThis.__sbPostVisit(page, { + ...context, + hasFailure: true + }); + } throw err; } } - }); + if (globalThis.__sbPostVisit) { + await globalThis.__sbPostVisit(page, context); + } + if (globalThis.__sbCollectCoverage) { + const isCoverageSetupCorrectly = await page.evaluate(() => '__coverage__' in window); + if (!isCoverageSetupCorrectly) { + throw new Error(\`[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. +More info: https://github.com/storybookjs/test-runner#setting-up-code-coverage\`); + } + await jestPlaywright.saveCoverage(page); + } + return result; + }; + try { + 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: "\${"Button"}/\${"Primary"}". Retrying...\`); + await jestPlaywright.resetPage(); + await globalThis.__sbSetupPage(globalThis.page, globalThis.context); + await testFn(); + } else { + throw err; + } + } }); }); -}" +});" `; -exports[`transformCsf executes beforeEach code before each test 1`] = ` +exports[`transformCsf > executes beforeEach code before each test 1`] = ` " export default { title: 'Button', @@ -248,19 +242,17 @@ exports[`transformCsf executes beforeEach code before each test 1`] = ` export const Primary = () => ''; -if (!require.main) { - describe("Button", () => { - beforeEach(beforeEach(() => { - console.log("beforeEach called"); - })); - describe("Primary", () => { - it("smoke-test", async () => {}); - }); +describe("Button", () => { + beforeEach(beforeEach(() => { + console.log("beforeEach called"); + })); + describe("Primary", () => { + it("smoke-test", async () => {}); }); -}" +});" `; -exports[`transformCsf returns empty result if there are no stories 1`] = ` +exports[`transformCsf > returns empty result if there are no stories 1`] = ` " export default { title: 'Button', diff --git a/src/csf/transformCsf.test.ts b/src/csf/transformCsf.test.ts index f48379d3..8c3b3fe4 100644 --- a/src/csf/transformCsf.test.ts +++ b/src/csf/transformCsf.test.ts @@ -1,9 +1,10 @@ import { TestPrefixer, TransformOptions, transformCsf } from './transformCsf'; import { testPrefixer } from '../playwright/transformPlaywright'; import template from '@babel/template'; +import { describe, it, expect } from 'vitest'; -describe('transformCsf', () => { - it('inserts a no-op test if there are no stories', () => { +describe('transformCsf', async () => { + it('inserts a no-op test if there are no stories', async () => { const csfCode = ` export default { title: 'Button', @@ -11,24 +12,24 @@ describe('transformCsf', () => { `; const expectedCode = `describe.skip('Button', () => { it('no-op', () => {}) });`; - const result = transformCsf(csfCode, { insertTestIfEmpty: true } as TransformOptions); + const result = await transformCsf(csfCode, { insertTestIfEmpty: true } as TransformOptions); expect(result).toEqual(expectedCode); }); - it('returns empty result if there are no stories', () => { + it('returns empty result if there are no stories', async () => { const csfCode = ` export default { title: 'Button', }; `; - const result = transformCsf(csfCode, { testPrefixer }); + const result = await transformCsf(csfCode, { testPrefixer }); expect(result).toMatchSnapshot(); }); - it('calls the testPrefixer function for each test', () => { + it('calls the testPrefixer function for each test', async () => { const csfCode = ` export default { title: 'Button', @@ -44,12 +45,12 @@ describe('transformCsf', () => { export const Primary = () => ''; `; - const result = transformCsf(csfCode, { testPrefixer }); + const result = await transformCsf(csfCode, { testPrefixer }); expect(result).toMatchSnapshot(); }); - it('calls the beforeEachPrefixer function once', () => { + it('calls the beforeEachPrefixer function once', async () => { const csfCode = ` export default { title: 'Button', @@ -64,12 +65,12 @@ describe('transformCsf', () => { }; export const Primary = () => ''; `; - const result = transformCsf(csfCode, { testPrefixer, beforeEachPrefixer: undefined }); + const result = await transformCsf(csfCode, { testPrefixer, beforeEachPrefixer: undefined }); expect(result).toMatchSnapshot(); }); - it('clears the body if clearBody option is true', () => { + it('clears the body if clearBody option is true', async () => { const csfCode = ` export default { title: 'Button', @@ -85,12 +86,12 @@ describe('transformCsf', () => { export const Primary = () => ''; `; - const result = transformCsf(csfCode, { testPrefixer, clearBody: true }); + const result = await transformCsf(csfCode, { testPrefixer, clearBody: true }); expect(result).toMatchSnapshot(); }); - it('executes beforeEach code before each test', () => { + it('executes beforeEach code before each test', async () => { const code = ` export default { title: 'Button', @@ -114,7 +115,10 @@ describe('transformCsf', () => { console.log({ id: %%id%%, title: %%title%%, name: %%name%%, storyExport: %%storyExport%% }); async () => {}`) as unknown as TestPrefixer; - const result = transformCsf(code, { beforeEachPrefixer, testPrefixer } as TransformOptions); + const result = await transformCsf(code, { + beforeEachPrefixer, + testPrefixer, + } as TransformOptions); expect(result).toMatchSnapshot(); }); diff --git a/src/playwright/hooks.test.ts b/src/playwright/hooks.test.ts index 673f445e..65923056 100644 --- a/src/playwright/hooks.test.ts +++ b/src/playwright/hooks.test.ts @@ -6,13 +6,14 @@ import { TestRunnerConfig, waitForPageReady, } from './hooks'; +import { describe, it, expect, beforeEach, Mock, vi } from 'vitest'; -type MockPage = Page & { evaluate: jest.Mock }; +type MockPage = Page & { evaluate: Mock }; describe('test-runner', () => { describe('setPreVisit', () => { it('sets the preVisit function', () => { - const preVisit = jest.fn(); + const preVisit = vi.fn(); setPreVisit(preVisit); expect(globalThis.__sbPreVisit).toBe(preVisit); }); @@ -20,7 +21,7 @@ describe('test-runner', () => { describe('setPostVisit', () => { it('sets the postVisit function', () => { - const postVisit = jest.fn(); + const postVisit = vi.fn(); setPostVisit(postVisit); expect(globalThis.__sbPostVisit).toBe(postVisit); }); @@ -28,11 +29,11 @@ describe('test-runner', () => { describe('getStoryContext', () => { const page = { - evaluate: jest.fn(), + evaluate: vi.fn(), } as MockPage; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('calls page.evaluate with the correct arguments', async () => { @@ -54,7 +55,7 @@ describe('test-runner', () => { const storyContext = { kind: 'kind', name: 'name' }; // Mock globalThis.__getContext - globalThis.__getContext = jest.fn(); + globalThis.__getContext = vi.fn(); page.evaluate.mockImplementation(async (func) => { // Call the function passed to page.evaluate @@ -81,8 +82,8 @@ describe('test-runner', () => { beforeEach(() => { page = { - waitForLoadState: jest.fn(), - evaluate: jest.fn(), + waitForLoadState: vi.fn(), + evaluate: vi.fn(), } as unknown as Page; }); @@ -96,8 +97,8 @@ describe('test-runner', () => { it('calls page.evaluate with () => document.fonts.ready', async () => { const page = { - waitForLoadState: jest.fn(), - evaluate: jest.fn(), + waitForLoadState: vi.fn(), + evaluate: vi.fn(), } as unknown as MockPage; // Mock document.fonts.ready diff --git a/src/playwright/index.ts b/src/playwright/index.ts index 68bba598..53a364ee 100644 --- a/src/playwright/index.ts +++ b/src/playwright/index.ts @@ -1,8 +1,6 @@ import { transform as swcTransform } from '@swc/core'; import { transformPlaywright } from './transformPlaywright'; -console.log('FUI CHAMADO'); -throw new Error('teste'); export const processAsync = async (src: string, filename: string) => { const csfTest = await transformPlaywright(src, filename); diff --git a/src/playwright/transformPlaywright.test.ts b/src/playwright/transformPlaywright.test.ts index c11bfc68..feaf007e 100644 --- a/src/playwright/transformPlaywright.test.ts +++ b/src/playwright/transformPlaywright.test.ts @@ -7,12 +7,12 @@ import { transformPlaywright } from './transformPlaywright'; vi.mock('storybook/internal/preview-api', async (importOriginal) => ({ ...(await importOriginal()), - userOrAutoTitle: vi.fn(() => 'foo/bar'), + userOrAutoTitle: vi.fn(() => 'Example/Header'), })); vi.mock('storybook/internal/common', async (importOriginal) => ({ ...(await importOriginal()), - getProjectRoot: vi.fn(() => '/foo/bar'), + getProjectRoot: vi.fn(() => '/stories/basic'), normalizeStories: vi.fn(() => [ { titlePrefix: 'Example', @@ -54,8 +54,8 @@ describe('Playwright', () => { }); describe('tag filtering mechanism', () => { - it('should include all stories when there is no tag filtering', () => { - expect( + it('should include all stories when there is no tag filtering', async () => { + await expect( transformPlaywright( dedent` export default { title: 'foo/bar', component: Button }; @@ -65,13 +65,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("foo/bar", () => { + describe("Example/Header", () => { describe("A", () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--a", - title: "foo/bar", + id: "example-header--a", + title: "Example/Header", name: "A" }; if (globalThis.__sbPreVisit) { @@ -83,7 +83,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--a" + id: "example-header--a" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -116,7 +116,7 @@ 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: "\${"foo/bar"}/\${"A"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -130,8 +130,8 @@ describe('Playwright', () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--b", - title: "foo/bar", + id: "example-header--b", + title: "Example/Header", name: "B" }; if (globalThis.__sbPreVisit) { @@ -143,7 +143,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--b" + id: "example-header--b" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -176,7 +176,7 @@ 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: "\${"foo/bar"}/\${"B"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"B"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -189,9 +189,9 @@ describe('Playwright', () => { }); `); }); - it('should exclude stories when excludeTags matches', () => { + it('should exclude stories when excludeTags matches', async () => { process.env.STORYBOOK_EXCLUDE_TAGS = 'exclude-test'; - expect( + await expect( transformPlaywright( dedent` export default { title: 'foo/bar', component: Button }; @@ -201,13 +201,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("foo/bar", () => { + describe("Example/Header", () => { describe("B", () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--b", - title: "foo/bar", + id: "example-header--b", + title: "Example/Header", name: "B" }; if (globalThis.__sbPreVisit) { @@ -219,7 +219,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--b" + id: "example-header--b" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -252,7 +252,7 @@ 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: "\${"foo/bar"}/\${"B"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"B"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -265,9 +265,9 @@ describe('Playwright', () => { }); `); }); - it('should skip stories when skipTags matches', () => { + it('should skip stories when skipTags matches', async () => { process.env.STORYBOOK_SKIP_TAGS = 'skip-test'; - expect( + await expect( transformPlaywright( dedent` export default { title: 'foo/bar', component: Button }; @@ -277,13 +277,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("foo/bar", () => { + describe("Example/Header", () => { describe("A", () => { it.skip("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--a", - title: "foo/bar", + id: "example-header--a", + title: "Example/Header", name: "A" }; if (globalThis.__sbPreVisit) { @@ -295,7 +295,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--a" + id: "example-header--a" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -328,7 +328,7 @@ 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: "\${"foo/bar"}/\${"A"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -342,8 +342,8 @@ describe('Playwright', () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--b", - title: "foo/bar", + id: "example-header--b", + title: "Example/Header", name: "B" }; if (globalThis.__sbPreVisit) { @@ -355,7 +355,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--b" + id: "example-header--b" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -388,7 +388,7 @@ 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: "\${"foo/bar"}/\${"B"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"B"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -401,7 +401,7 @@ describe('Playwright', () => { }); `); }); - it('should work in conjunction with includeTags, excludeTags and skipTags', () => { + it('should work in conjunction with includeTags, excludeTags and skipTags', async () => { process.env.STORYBOOK_INCLUDE_TAGS = 'play,design,global-tag'; process.env.STORYBOOK_SKIP_TAGS = 'skip'; process.env.STORYBOOK_EXCLUDE_TAGS = 'exclude'; @@ -413,7 +413,7 @@ describe('Playwright', () => { // - C being included // - D being included // - E being excluded - expect( + await expect( transformPlaywright( dedent` export default { title: 'foo/bar', component: Button }; @@ -426,13 +426,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("foo/bar", () => { + describe("Example/Header", () => { describe("B", () => { it.skip("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--b", - title: "foo/bar", + id: "example-header--b", + title: "Example/Header", name: "B" }; if (globalThis.__sbPreVisit) { @@ -444,7 +444,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--b" + id: "example-header--b" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -477,7 +477,7 @@ 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: "\${"foo/bar"}/\${"B"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"B"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -491,8 +491,8 @@ describe('Playwright', () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--c", - title: "foo/bar", + id: "example-header--c", + title: "Example/Header", name: "C" }; if (globalThis.__sbPreVisit) { @@ -504,7 +504,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--c" + id: "example-header--c" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -537,7 +537,7 @@ 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: "\${"foo/bar"}/\${"C"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"C"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -551,8 +551,8 @@ describe('Playwright', () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--d", - title: "foo/bar", + id: "example-header--d", + title: "Example/Header", name: "D" }; if (globalThis.__sbPreVisit) { @@ -564,7 +564,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--d" + id: "example-header--d" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -597,7 +597,7 @@ 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: "\${"foo/bar"}/\${"D"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"D"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -611,8 +611,8 @@ describe('Playwright', () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--e", - title: "foo/bar", + id: "example-header--e", + title: "Example/Header", name: "E" }; if (globalThis.__sbPreVisit) { @@ -624,7 +624,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--e" + id: "example-header--e" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -657,7 +657,7 @@ 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: "\${"foo/bar"}/\${"E"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"E"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -670,14 +670,14 @@ describe('Playwright', () => { }); `); }); - it('should work with tag negation', () => { + it('should work with tag negation', async () => { process.env.STORYBOOK_INCLUDE_TAGS = 'play,test'; process.env.STORYBOOK_PREVIEW_TAGS = '!test'; // Should result in: // - A being included // - B being excluded because it has no play nor test tag (removed by negation in preview tags) // - C being included because it has test tag (overwritten via story tags) - expect( + await expect( transformPlaywright( dedent` export default { title: 'foo/bar', component: Button, tags: ['play'] }; @@ -688,13 +688,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("foo/bar", () => { + describe("Example/Header", () => { describe("A", () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--a", - title: "foo/bar", + id: "example-header--a", + title: "Example/Header", name: "A" }; if (globalThis.__sbPreVisit) { @@ -706,7 +706,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--a" + id: "example-header--a" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -739,7 +739,7 @@ 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: "\${"foo/bar"}/\${"A"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -753,8 +753,8 @@ describe('Playwright', () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--c", - title: "foo/bar", + id: "example-header--c", + title: "Example/Header", name: "C" }; if (globalThis.__sbPreVisit) { @@ -766,7 +766,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--c" + id: "example-header--c" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -799,7 +799,7 @@ 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: "\${"foo/bar"}/\${"C"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"C"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -812,11 +812,11 @@ describe('Playwright', () => { }); `); }); - it('should include "test" tag by default', () => { + it('should include "test" tag by default', async () => { // Should result in: // - A being included // - B being excluded - expect( + await expect( transformPlaywright( dedent` export default { title: 'foo/bar', component: Button }; @@ -826,13 +826,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("foo/bar", () => { + describe("Example/Header", () => { describe("A", () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--a", - title: "foo/bar", + id: "example-header--a", + title: "Example/Header", name: "A" }; if (globalThis.__sbPreVisit) { @@ -844,7 +844,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--a" + id: "example-header--a" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -877,7 +877,7 @@ 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: "\${"foo/bar"}/\${"A"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -890,9 +890,9 @@ describe('Playwright', () => { }); `); }); - it('should no op when includeTags is passed but not matched', () => { + it('should no op when includeTags is passed but not matched', async () => { process.env.STORYBOOK_INCLUDE_TAGS = 'play'; - expect( + await expect( transformPlaywright( dedent` export default { title: 'foo/bar', component: Button }; @@ -902,7 +902,7 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot( - `describe.skip('foo/bar', () => { it('no-op', () => {}) });` + `describe.skip('Example/Header', () => { it('no-op', () => {}) });` ); }); }); @@ -918,13 +918,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("foo/bar", () => { + describe("Example/Header", () => { describe("A", () => { it("play-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--a", - title: "foo/bar", + id: "example-header--a", + title: "Example/Header", name: "A" }; if (globalThis.__sbPreVisit) { @@ -936,7 +936,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--a" + id: "example-header--a" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -969,7 +969,7 @@ 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: "\${"foo/bar"}/\${"A"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -992,13 +992,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("foo/bar", () => { + describe("Example/Header", () => { describe("A", () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "foo-bar--a", - title: "foo/bar", + id: "example-header--a", + title: "Example/Header", name: "A" }; if (globalThis.__sbPreVisit) { @@ -1010,7 +1010,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "foo-bar--a" + id: "example-header--a" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -1043,7 +1043,7 @@ 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: "\${"foo/bar"}/\${"A"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); @@ -1066,13 +1066,13 @@ describe('Playwright', () => { filename ) ).resolves.toMatchInlineSnapshot(` - describe("AutoTitle", () => { + describe("Example/Header", () => { describe("A", () => { it("smoke-test", async () => { const testFn = async () => { const context = { - id: "autotitle--a", - title: "AutoTitle", + id: "example-header--a", + title: "Example/Header", name: "A" }; if (globalThis.__sbPreVisit) { @@ -1084,7 +1084,7 @@ describe('Playwright', () => { id, hasPlayFn }) => __test(id, hasPlayFn), { - id: "autotitle--a" + id: "example-header--a" }); } catch (err) { if (err.toString().includes('Execution context was destroyed')) { @@ -1117,7 +1117,7 @@ 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: "\${"AutoTitle"}/\${"A"}". Retrying...\`); + console.log(\`An error occurred in the following story, most likely because of a navigation: "\${"Example/Header"}/\${"A"}". Retrying...\`); await jestPlaywright.resetPage(); await globalThis.__sbSetupPage(globalThis.page, globalThis.context); await testFn(); diff --git a/src/playwright/transformPlaywright.ts b/src/playwright/transformPlaywright.ts index c70fc831..f15a3a76 100644 --- a/src/playwright/transformPlaywright.ts +++ b/src/playwright/transformPlaywright.ts @@ -6,7 +6,7 @@ const template = (babelTemplate as any).default ?? babelTemplate; import { userOrAutoTitle } from 'storybook/internal/preview-api'; import dedent from 'ts-dedent'; -import { getStorybookMetadata } from '../util'; +import { getStorybookMetadata } from '../util/getStorybookMetadata'; import { transformCsf } from '../csf/transformCsf'; import type { TestPrefixer } from '../csf/transformCsf'; diff --git a/src/playwright/transformPlaywrightJson.test.ts b/src/playwright/transformPlaywrightJson.test.ts index 0a1b398d..8a4d47d5 100644 --- a/src/playwright/transformPlaywrightJson.test.ts +++ b/src/playwright/transformPlaywrightJson.test.ts @@ -5,9 +5,10 @@ import { makeDescribe, transformPlaywrightJson, } from './transformPlaywrightJson'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; import * as t from '@babel/types'; -jest.mock('../util/getTestRunnerConfig'); +vi.mock('../util/getTestRunnerConfig'); describe('Playwright Json', () => { describe('v4 indexes', () => { @@ -17,7 +18,7 @@ describe('Playwright Json', () => { delete process.env.STORYBOOK_SKIP_TAGS; }); - it('should generate a test for each story', () => { + it('should generate a test for each story', async () => { const input = { v: 4, entries: { @@ -41,7 +42,7 @@ describe('Playwright Json', () => { }, }, } satisfies V4Index; - expect(transformPlaywrightJson(input)).toMatchInlineSnapshot(` + await expect(transformPlaywrightJson(input)).resolves.toMatchInlineSnapshot(` { "example-header": "describe("Example/Header", () => { describe("Logged In", () => { @@ -231,7 +232,7 @@ describe('Playwright Json', () => { `); }); - it('should respect include, exclude and skip tags', () => { + it('should respect include, exclude and skip tags', async () => { process.env.STORYBOOK_INCLUDE_TAGS = 'play,design'; process.env.STORYBOOK_SKIP_TAGS = 'skip'; process.env.STORYBOOK_EXCLUDE_TAGS = 'exclude'; @@ -272,7 +273,7 @@ describe('Playwright Json', () => { // - B being included, but skipped // - C being included // - D being excluded - expect(transformPlaywrightJson(input)).toMatchInlineSnapshot(` + await expect(transformPlaywrightJson(input)).resolves.toMatchInlineSnapshot(` { "example-header": "describe("Example/Header", () => { describe("Logged Out", () => { @@ -402,7 +403,7 @@ describe('Playwright Json', () => { `); }); - it('should skip docs entries', () => { + it('should skip docs entries', async () => { const input = { v: 4, entries: { @@ -419,7 +420,7 @@ describe('Playwright Json', () => { }, }, } satisfies V4Index; - expect(transformPlaywrightJson(input)).toMatchInlineSnapshot(` + await expect(transformPlaywrightJson(input)).resolves.toMatchInlineSnapshot(` { "example-page": "describe("Example/Page", () => { describe("Logged In", () => { @@ -489,7 +490,7 @@ describe('Playwright Json', () => { }); describe('v3 indexes', () => { - it('should generate a test for each story', () => { + it('should generate a test for each story', async () => { const input = { v: 3, stories: { @@ -525,7 +526,7 @@ describe('Playwright Json', () => { }, }, } satisfies V3StoriesIndex; - expect(transformPlaywrightJson(input)).toMatchInlineSnapshot(` + await expect(transformPlaywrightJson(input)).resolves.toMatchInlineSnapshot(` { "example-header": "describe("Example/Header", () => { describe("Logged In", () => { @@ -715,7 +716,7 @@ describe('Playwright Json', () => { `); }); - it('should skip docs-only stories', () => { + it('should skip docs-only stories', async () => { const input = { v: 3, stories: { @@ -741,7 +742,7 @@ describe('Playwright Json', () => { }, }, } satisfies V3StoriesIndex; - expect(transformPlaywrightJson(input)).toMatchInlineSnapshot(` + await expect(transformPlaywrightJson(input)).resolves.toMatchInlineSnapshot(` { "example-page": "describe("Example/Page", () => { describe("Logged In", () => { @@ -809,7 +810,7 @@ describe('Playwright Json', () => { `); }); - it('should include "test" tag by default', () => { + it('should include "test" tag by default', async () => { process.env.STORYBOOK_INCLUDE_TAGS = 'test'; const input = { v: 3, @@ -826,7 +827,7 @@ describe('Playwright Json', () => { }, }, } satisfies V3StoriesIndex; - expect(transformPlaywrightJson(input)).toMatchInlineSnapshot(` + await expect(transformPlaywrightJson(input)).resolves.toMatchInlineSnapshot(` { "example-page": "describe("Example/Page", () => { describe("Logged In", () => { @@ -897,9 +898,9 @@ describe('Playwright Json', () => { }); describe('unsupported index', () => { - it('throws an error for unsupported versions', () => { + it('throws an error for unsupported versions', async () => { const unsupportedVersion = { v: 1 } satisfies UnsupportedVersion; - expect(() => transformPlaywrightJson(unsupportedVersion)).toThrowError( + await expect(transformPlaywrightJson(unsupportedVersion)).rejects.toThrowError( `Unsupported version ${unsupportedVersion.v}` ); }); diff --git a/src/util/__snapshots__/getStorybookMain.test.ts.snap b/src/util/__snapshots__/getStorybookMain.test.ts.snap index ac705c7b..480469f0 100644 --- a/src/util/__snapshots__/getStorybookMain.test.ts.snap +++ b/src/util/__snapshots__/getStorybookMain.test.ts.snap @@ -1,15 +1,15 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`getStorybookMain no stories should throw an error if no stories are defined 1`] = ` -"Could not find stories in main.js in ".storybook". +exports[`getStorybookMain > no stories > should throw an error if no stories are defined 1`] = ` +[Error: Could not find stories in main.js in ".storybook". If you are using a mono-repository, please run the test-runner only against your sub-package, which contains a .storybook folder with "stories" defined in main.js. -You can change the config directory by using --config-dir " +You can change the config directory by using --config-dir ] `; -exports[`getStorybookMain no stories should throw an error if stories list is empty 1`] = ` -"Could not find stories in main.js in ".storybook". +exports[`getStorybookMain > no stories > should throw an error if stories list is empty 1`] = ` +[Error: Could not find stories in main.js in ".storybook". If you are using a mono-repository, please run the test-runner only against your sub-package, which contains a .storybook folder with "stories" defined in main.js. -You can change the config directory by using --config-dir " +You can change the config directory by using --config-dir ] `; -exports[`getStorybookMain should throw an error if no configuration is found 1`] = `"Module not found"`; +exports[`getStorybookMain > should throw an error if no configuration is found 1`] = `[Error: Module not found]`; diff --git a/src/util/getCliOptions.test.ts b/src/util/getCliOptions.test.ts index 47e6eddf..b5f2a44a 100644 --- a/src/util/getCliOptions.test.ts +++ b/src/util/getCliOptions.test.ts @@ -1,5 +1,6 @@ import { getCliOptions } from './getCliOptions'; import * as cliHelper from './getParsedCliOptions'; +import { describe, it, expect, afterEach, vi } from 'vitest'; describe('getCliOptions', () => { const originalArgv: string[] = process.argv; @@ -10,15 +11,16 @@ describe('getCliOptions', () => { it('returns custom options if passed', () => { const customConfig = { configDir: 'custom', indexJson: true }; - jest - .spyOn(cliHelper, 'getParsedCliOptions') - .mockReturnValueOnce({ options: customConfig, extraArgs: [] }); + vi.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValueOnce({ + options: customConfig, + extraArgs: [], + }); const opts = getCliOptions(); expect(opts.runnerOptions).toMatchObject(customConfig); }); it('returns default options if no options are passed', () => { - jest.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValue({ options: {}, extraArgs: [] }); + vi.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValue({ options: {}, extraArgs: [] }); const opts = getCliOptions(); const jestOptions = opts.jestOptions.length > 0 ? ['--coverage'] : []; expect(opts).toEqual({ @@ -29,33 +31,36 @@ describe('getCliOptions', () => { it('returns failOnConsole option if passed', () => { const customConfig = { failOnConsole: true }; - jest - .spyOn(cliHelper, 'getParsedCliOptions') - .mockReturnValue({ options: customConfig, extraArgs: [] }); + vi.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValue({ + options: customConfig, + extraArgs: [], + }); const opts = getCliOptions(); expect(opts.runnerOptions).toMatchObject(customConfig); }); it('handles boolean options correctly', () => { const customConfig = { coverage: true, junit: false }; - jest - .spyOn(cliHelper, 'getParsedCliOptions') - .mockReturnValue({ options: customConfig, extraArgs: [] }); + vi.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValue({ + options: customConfig, + extraArgs: [], + }); const opts = getCliOptions(); expect(opts).toEqual({ jestOptions: [], runnerOptions: { coverage: true, junit: false } }); }); it('handles string options correctly', () => { const customConfig = { url: 'http://localhost:3000' }; - jest - .spyOn(cliHelper, 'getParsedCliOptions') - .mockReturnValue({ options: customConfig, extraArgs: [] }); + vi.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValue({ + options: customConfig, + extraArgs: [], + }); const opts = getCliOptions(); expect(opts).toEqual({ jestOptions: [], runnerOptions: { url: 'http://localhost:3000' } }); }); it('handles extra arguments correctly', () => { - jest.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValue({ + vi.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValue({ options: { version: true, cache: false, env: 'node' } as any, extraArgs: ['--watch', '--coverage'], }); @@ -75,7 +80,7 @@ describe('getCliOptions', () => { // mock argv to avoid side effect from running tests e.g. jest --coverage, // which would end up caught by getCliOptions process.argv = []; - jest.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValueOnce({ options: {}, extraArgs }); + vi.spyOn(cliHelper, 'getParsedCliOptions').mockReturnValueOnce({ options: {}, extraArgs }); const opts = getCliOptions(); expect(opts.jestOptions).toEqual(extraArgs); }); diff --git a/src/util/getParsedCliOptions.test.ts b/src/util/getParsedCliOptions.test.ts index 6f34bd6a..7a9183e5 100644 --- a/src/util/getParsedCliOptions.test.ts +++ b/src/util/getParsedCliOptions.test.ts @@ -1,9 +1,10 @@ import { program } from 'commander'; import { getParsedCliOptions } from './getParsedCliOptions'; +import { describe, it, expect, afterEach, vi } from 'vitest'; describe('getParsedCliOptions', () => { afterEach(() => { - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); it('should return the parsed CLI options', () => { @@ -41,10 +42,10 @@ describe('getParsedCliOptions', () => { it('should handle unknown options', () => { const originalWarn = console.warn; - console.warn = jest.fn(); + console.warn = vi.fn(); const originalExit = process.exit; - process.exit = jest.fn() as unknown as typeof process.exit; + process.exit = vi.fn() as unknown as typeof process.exit; const argv = process.argv.slice(); process.argv.push('--unknown-option'); @@ -62,7 +63,7 @@ describe('getParsedCliOptions', () => { }); it('handles unknown options correctly', () => { - jest.spyOn(program, 'parse').mockImplementation(() => { + vi.spyOn(program, 'parse').mockImplementation(() => { throw new Error('Unknown error'); }); diff --git a/src/util/getStorybookMain.test.ts b/src/util/getStorybookMain.test.ts index ec0e3c94..b4e02566 100644 --- a/src/util/getStorybookMain.test.ts +++ b/src/util/getStorybookMain.test.ts @@ -1,31 +1,31 @@ import { getStorybookMain, resetStorybookMainCache, storybookMainConfig } from './getStorybookMain'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { serverRequire } from 'storybook/internal/common'; -jest.mock('storybook/internal/common', () => ({ - serverRequire: jest.fn(), +vi.mock('storybook/internal/common', () => ({ + serverRequire: vi.fn(), })); describe('getStorybookMain', () => { beforeEach(() => { resetStorybookMainCache(); - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should throw an error if no configuration is found', async () => { - (require('storybook/internal/common').serverRequire as jest.Mock).mockRejectedValueOnce( - new Error('Module not found') - ); + vi.mocked(serverRequire).mockRejectedValueOnce(new Error('Module not found')); await expect(getStorybookMain('.storybook')).rejects.toThrowErrorMatchingSnapshot(); }); describe('no stories', () => { it('should throw an error if no stories are defined', async () => { - (require('storybook/internal/common').serverRequire as jest.Mock).mockResolvedValueOnce({}); + vi.mocked(serverRequire).mockResolvedValueOnce({}); await expect(getStorybookMain('.storybook')).rejects.toThrowErrorMatchingSnapshot(); }); it('should throw an error if stories list is empty', async () => { - (require('storybook/internal/common').serverRequire as jest.Mock).mockResolvedValueOnce({ + vi.mocked(serverRequire).mockResolvedValueOnce({ stories: [], }); @@ -43,9 +43,7 @@ describe('getStorybookMain', () => { ], }; - (require('storybook/internal/common').serverRequire as jest.Mock).mockResolvedValueOnce( - mockedMain - ); + vi.mocked(serverRequire).mockResolvedValueOnce(mockedMain); const res = await getStorybookMain('.storybook'); expect(res).toMatchObject(mockedMain); @@ -60,7 +58,7 @@ describe('getStorybookMain', () => { }, ], }; - storybookMainConfig.set('configDir', mockedMain); + storybookMainConfig.set('.storybook', mockedMain); const res = await getStorybookMain('.storybook'); expect(res).toMatchObject(mockedMain); diff --git a/src/util/getStorybookMain.ts b/src/util/getStorybookMain.ts index 347a5c0f..5db693a6 100644 --- a/src/util/getStorybookMain.ts +++ b/src/util/getStorybookMain.ts @@ -12,7 +12,6 @@ export const getStorybookMain = async (configDir = '.storybook') => { try { const mainConfig = await serverRequire(join(resolve(configDir), 'main')); - if (!mainConfig) { throw new Error( `Could not load main.js in ${configDir}. Is the "${configDir}" config directory correct? You can change it by using --config-dir ` diff --git a/src/util/getStorybookMetadata.test.ts b/src/util/getStorybookMetadata.test.ts index 0b3096f1..3f13d6f0 100644 --- a/src/util/getStorybookMetadata.test.ts +++ b/src/util/getStorybookMetadata.test.ts @@ -2,10 +2,11 @@ import { StorybookConfig } from 'storybook/internal/types'; import * as storybookMain from './getStorybookMain'; import { getStorybookMetadata } from './getStorybookMetadata'; +import { describe, it, expect, afterAll, vi } from 'vitest'; -jest.mock('storybook/internal/common', () => ({ - getProjectRoot: jest.fn(() => '/foo/bar'), - normalizeStories: jest.fn(() => [ +vi.mock('storybook/internal/common', () => ({ + getProjectRoot: vi.fn(() => '/foo/bar'), + normalizeStories: vi.fn(() => [ { titlePrefix: 'Example', files: '**/*.stories.@(mdx|tsx|ts|jsx|js)', @@ -26,7 +27,7 @@ describe('getStorybookMetadata', () => { stories: [], }; - jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); + vi.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; const { configDir } = await getStorybookMetadata(); expect(configDir).toEqual(process.env.STORYBOOK_CONFIG_DIR); @@ -42,7 +43,7 @@ describe('getStorybookMetadata', () => { ], }; - jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); + vi.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; const { storiesPaths } = await getStorybookMetadata(); expect(storiesPaths).toMatchInlineSnapshot( @@ -55,7 +56,7 @@ describe('getStorybookMetadata', () => { stories: ['../**/stories/*.stories.@(js|ts)'], }; - jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); + vi.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; const { storiesPaths } = await getStorybookMetadata(); expect(storiesPaths).toMatchInlineSnapshot( @@ -74,7 +75,7 @@ describe('getStorybookMetadata', () => { ], }; - jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); + vi.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; const { storiesPaths } = await getStorybookMetadata(); expect(storiesPaths).toMatchInlineSnapshot( @@ -85,7 +86,7 @@ describe('getStorybookMetadata', () => { it('should return lazyCompilation=false when unset', async () => { const mockedMain: Pick = { stories: [] }; - jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); + vi.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; expect((await getStorybookMetadata()).lazyCompilation).toBe(false); }); @@ -95,7 +96,7 @@ describe('getStorybookMetadata', () => { core: { builder: { name: 'webpack5', options: { lazyCompilation: true } } }, }; - jest.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); + vi.spyOn(storybookMain, 'getStorybookMain').mockResolvedValueOnce(mockedMain); process.env.STORYBOOK_CONFIG_DIR = '.storybook'; expect((await getStorybookMetadata()).lazyCompilation).toBe(true); }); diff --git a/src/util/getTestRunnerConfig.test.ts b/src/util/getTestRunnerConfig.test.ts index 0361d5eb..88dd0ef4 100644 --- a/src/util/getTestRunnerConfig.test.ts +++ b/src/util/getTestRunnerConfig.test.ts @@ -1,6 +1,8 @@ import { TestRunnerConfig } from '../playwright/hooks'; import { getTestRunnerConfig } from './getTestRunnerConfig'; import { join, resolve } from 'path'; +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { serverRequire } from 'storybook/internal/common'; const testRunnerConfig: TestRunnerConfig = { setup: () => { @@ -26,45 +28,41 @@ const testRunnerConfig: TestRunnerConfig = { }, }; -jest.mock('storybook/internal/common', () => ({ - serverRequire: jest.fn(), +vi.mock('storybook/internal/common', () => ({ + serverRequire: vi.fn(), })); -describe('getTestRunnerConfig', () => { +describe.only('getTestRunnerConfig', () => { beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); - it('should load the test runner config', () => { + it('should load the test runner config', async () => { const configDir = '.storybook'; - (require('storybook/internal/common').serverRequire as jest.Mock).mockReturnValueOnce( - testRunnerConfig - ); + vi.mocked(serverRequire).mockResolvedValueOnce(testRunnerConfig); - const result = getTestRunnerConfig(configDir); + const result = await getTestRunnerConfig(configDir); expect(result).toEqual(testRunnerConfig); - expect(require('storybook/internal/common').serverRequire).toHaveBeenCalledWith( + expect(vi.mocked(serverRequire)).toHaveBeenCalledWith( join(resolve('.storybook', 'test-runner')) ); }); - it('should cache the test runner config', () => { + it('should cache the test runner config', async () => { const configDir = '.storybook'; - (require('storybook/internal/common').serverRequire as jest.Mock).mockReturnValueOnce( - testRunnerConfig - ); + vi.mocked(serverRequire).mockResolvedValueOnce(testRunnerConfig); - const result1 = getTestRunnerConfig(configDir); - const result2 = getTestRunnerConfig(configDir); + const result1 = await getTestRunnerConfig(configDir); + const result2 = await getTestRunnerConfig(configDir); expect(result1).toEqual(testRunnerConfig); expect(result2).toEqual(testRunnerConfig); }); - it('should load the test runner config with default configDir', () => { + it('should load the test runner config with default configDir', async () => { process.env.STORYBOOK_CONFIG_DIR = '.storybook'; - const result = getTestRunnerConfig(); + const result = await getTestRunnerConfig(); expect(result).toEqual(testRunnerConfig); }); diff --git a/vite.config.ts b/vite.config.ts index a37df419..627a3196 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,4 +1,3 @@ -/// import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..9f58b946 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + alias: { + '@storybook/test-runner/playwright/global-setup': '/playwright/global-setup.js', + '@storybook/test-runner/playwright/global-teardown': '/playwright/global-teardown.js', + '@storybook/test-runner/playwright/custom-environment': '/playwright/custom-environment.js', + '@storybook/test-runner/playwright/jest-setup': '/playwright/jest-setup.js', + '@storybook/test-runner/playwright/transform': '/playwright/transform.js', + }, + }, +}); From d326828e38911020081cc0422a5be7de2fdee4cd Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Wed, 23 Jul 2025 15:53:12 +0200 Subject: [PATCH 19/29] fix lockfile --- yarn.lock | 67 +++++-------------------------------------------------- 1 file changed, 6 insertions(+), 61 deletions(-) diff --git a/yarn.lock b/yarn.lock index 88eae9df..043d740c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2933,7 +2933,7 @@ __metadata: ts-jest: "npm:^29.4.0" tsup: "npm:^8.5.0" typescript: "npm:^5.8.3" - vite: "npm:^6.3.2" + vite: "npm:^7.0.5" vitest: "npm:^3.2.4" wait-on: "npm:^7.2.0" peerDependencies: @@ -5408,7 +5408,7 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.3, fdir@npm:^6.4.4, fdir@npm:^6.4.6": +"fdir@npm:^6.4.4, fdir@npm:^6.4.6": version: 6.4.6 resolution: "fdir@npm:6.4.6" peerDependencies: @@ -8337,7 +8337,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.5.3, postcss@npm:^8.5.6": +"postcss@npm:^8.5.6": version: 8.5.6 resolution: "postcss@npm:8.5.6" dependencies: @@ -8861,7 +8861,7 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.34.8, rollup@npm:^4.34.9, rollup@npm:^4.40.0": +"rollup@npm:^4.34.8, rollup@npm:^4.40.0": version: 4.45.1 resolution: "rollup@npm:4.45.1" dependencies: @@ -9676,7 +9676,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14": +"tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.14": version: 0.2.14 resolution: "tinyglobby@npm:0.2.14" dependencies: @@ -10308,7 +10308,7 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0": +"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^7.0.5": version: 7.0.5 resolution: "vite@npm:7.0.5" dependencies: @@ -10363,61 +10363,6 @@ __metadata: languageName: node linkType: hard -"vite@npm:^6.3.2": - version: 6.3.2 - resolution: "vite@npm:6.3.2" - dependencies: - esbuild: "npm:^0.25.0" - fdir: "npm:^6.4.3" - fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.2" - postcss: "npm:^8.5.3" - rollup: "npm:^4.34.9" - tinyglobby: "npm:^0.2.12" - peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: ">=1.21.0" - less: "*" - lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10/05ea5e03d86d950e53af6b11e444b31846bccdc44e45b8d693d06eba7d3a4fe2e8003a6948cdbcf7e54779f7ca851f29e96be6369e9c9413d34de7539ad6af8c - languageName: node - linkType: hard - "vitest@npm:^3.2.4": version: 3.2.4 resolution: "vitest@npm:3.2.4" From 71f31ea8dc0b73fff3c33c42f9cd5f0f2591b7cb Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Wed, 23 Jul 2025 16:17:43 +0200 Subject: [PATCH 20/29] add vitest coverage --- package.json | 1 + yarn.lock | 112 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 106 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 148fd20d..a36cedf2 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "@types/jest": "^30.0.0", "@types/node": "^24.0.10", "@vitejs/plugin-react": "^4.0.3", + "@vitest/coverage-v8": "^3.2.4", "auto": "^11.1.6", "babel-loader": "^8.1.0", "babel-plugin-istanbul": "^6.1.1", diff --git a/yarn.lock b/yarn.lock index 043d740c..a1ba66c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,6 +22,16 @@ __metadata: languageName: node linkType: hard +"@ampproject/remapping@npm:^2.3.0": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/f3451525379c68a73eb0a1e65247fbf28c0cccd126d93af21c75fceff77773d43c0d4a2d51978fb131aff25b5f2cb41a9fe48cc296e61ae65e679c4f6918b0ab + languageName: node + linkType: hard + "@auto-it/bot-list@npm:11.3.0": version: 11.3.0 resolution: "@auto-it/bot-list@npm:11.3.0" @@ -477,7 +487,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0": version: 7.28.0 resolution: "@babel/parser@npm:7.28.0" dependencies: @@ -1610,6 +1620,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.25.4": + version: 7.28.1 + resolution: "@babel/types@npm:7.28.1" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + checksum: 10/b35b0c030326e45efd4ebd87f30a7e5463f0c78617661ff12e8deb3fe983c53c48696374434ffd3664681cbc5b1495ebc69043753b232193e8dc02d1ae7d0ff5 + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -1617,6 +1637,13 @@ __metadata: languageName: node linkType: hard +"@bcoe/v8-coverage@npm:^1.0.2": + version: 1.0.2 + resolution: "@bcoe/v8-coverage@npm:1.0.2" + checksum: 10/46600b2dde460269b07a8e4f12b72e418eae1337b85c979f43af3336c9a1c65b04e42508ab6b245f1e0e3c64328e1c38d8cd733e4a7cebc4fbf9cf65c6e59937 + languageName: node + linkType: hard + "@cspotcode/source-map-support@npm:^0.8.0": version: 0.8.1 resolution: "@cspotcode/source-map-support@npm:0.8.1" @@ -2209,7 +2236,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2": +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.12 resolution: "@jridgewell/gen-mapping@npm:0.3.12" dependencies: @@ -2900,6 +2927,7 @@ __metadata: "@types/node": "npm:^24.0.10" "@types/node-fetch": "npm:^2.6.12" "@vitejs/plugin-react": "npm:^4.0.3" + "@vitest/coverage-v8": "npm:^3.2.4" auto: "npm:^11.1.6" babel-loader: "npm:^8.1.0" babel-plugin-istanbul: "npm:^6.1.1" @@ -3512,6 +3540,33 @@ __metadata: languageName: node linkType: hard +"@vitest/coverage-v8@npm:^3.2.4": + version: 3.2.4 + resolution: "@vitest/coverage-v8@npm:3.2.4" + dependencies: + "@ampproject/remapping": "npm:^2.3.0" + "@bcoe/v8-coverage": "npm:^1.0.2" + ast-v8-to-istanbul: "npm:^0.3.3" + debug: "npm:^4.4.1" + istanbul-lib-coverage: "npm:^3.2.2" + istanbul-lib-report: "npm:^3.0.1" + istanbul-lib-source-maps: "npm:^5.0.6" + istanbul-reports: "npm:^3.1.7" + magic-string: "npm:^0.30.17" + magicast: "npm:^0.3.5" + std-env: "npm:^3.9.0" + test-exclude: "npm:^7.0.1" + tinyrainbow: "npm:^2.0.0" + peerDependencies: + "@vitest/browser": 3.2.4 + vitest: 3.2.4 + peerDependenciesMeta: + "@vitest/browser": + optional: true + checksum: 10/5a5940c78eabbb36efafb9ecc50408785614768b3f74f5f88e6dd32db59a21d39e15e7cf52fae961cc2cd75e0390c8568cdb9aef35aa8593ccd057edce539ee4 + languageName: node + linkType: hard + "@vitest/expect@npm:3.2.4": version: 3.2.4 resolution: "@vitest/expect@npm:3.2.4" @@ -3867,6 +3922,17 @@ __metadata: languageName: node linkType: hard +"ast-v8-to-istanbul@npm:^0.3.3": + version: 0.3.3 + resolution: "ast-v8-to-istanbul@npm:0.3.3" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.25" + estree-walker: "npm:^3.0.3" + js-tokens: "npm:^9.0.1" + checksum: 10/edcb926214833227e1eee0b7324c6160536879f922e055461d76a364c72d0199895c1b985f72d73359cef00586b6d800b81174a6b5efa7e571c6a82c2fe6f572 + languageName: node + linkType: hard + "async@npm:^3.2.3": version: 3.2.6 resolution: "async@npm:3.2.6" @@ -5772,7 +5838,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.0.0, glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.0.0, glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -6291,7 +6357,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": +"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0, istanbul-lib-coverage@npm:^3.2.2": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" checksum: 10/40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 @@ -6359,7 +6425,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0": +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": version: 3.0.1 resolution: "istanbul-lib-report@npm:3.0.1" dependencies: @@ -6381,7 +6447,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-source-maps@npm:^5.0.0": +"istanbul-lib-source-maps@npm:^5.0.0, istanbul-lib-source-maps@npm:^5.0.6": version: 5.0.6 resolution: "istanbul-lib-source-maps@npm:5.0.6" dependencies: @@ -6402,6 +6468,16 @@ __metadata: languageName: node linkType: hard +"istanbul-reports@npm:^3.1.7": + version: 3.1.7 + resolution: "istanbul-reports@npm:3.1.7" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 10/f1faaa4684efaf57d64087776018d7426312a59aa6eeb4e0e3a777347d23cd286ad18f427e98f0e3dee666103d7404c9d7abc5f240406a912fa16bd6695437fa + languageName: node + linkType: hard + "jackspeak@npm:^3.1.2": version: 3.4.3 resolution: "jackspeak@npm:3.4.3" @@ -7316,6 +7392,17 @@ __metadata: languageName: node linkType: hard +"magicast@npm:^0.3.5": + version: 0.3.5 + resolution: "magicast@npm:0.3.5" + dependencies: + "@babel/parser": "npm:^7.25.4" + "@babel/types": "npm:^7.25.4" + source-map-js: "npm:^1.2.0" + checksum: 10/3a2dba6b0bdde957797361d09c7931ebdc1b30231705360eeb40ed458d28e1c3112841c3ed4e1b87ceb28f741e333c7673cd961193aa9fdb4f4946b202e6205a + languageName: node + linkType: hard + "make-dir@npm:^2.1.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -9158,7 +9245,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.2.1": +"source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 @@ -9630,6 +9717,17 @@ __metadata: languageName: node linkType: hard +"test-exclude@npm:^7.0.1": + version: 7.0.1 + resolution: "test-exclude@npm:7.0.1" + dependencies: + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^10.4.1" + minimatch: "npm:^9.0.4" + checksum: 10/e6f6f4e1df2e7810e082e8d7dfc53be51a931e6e87925f5e1c2ef92cc1165246ba3bf2dae6b5d86251c16925683dba906bd41e40169ebc77120a2d1b5a0dbbe0 + languageName: node + linkType: hard + "thenify-all@npm:^1.0.0": version: 1.6.0 resolution: "thenify-all@npm:1.6.0" From 1ec7c6dc4f0c605950aa1b21438063af826b9471 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Wed, 23 Jul 2025 17:00:19 +0200 Subject: [PATCH 21/29] fix --- src/util/getTestRunnerConfig.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/getTestRunnerConfig.test.ts b/src/util/getTestRunnerConfig.test.ts index 88dd0ef4..28bbf740 100644 --- a/src/util/getTestRunnerConfig.test.ts +++ b/src/util/getTestRunnerConfig.test.ts @@ -32,7 +32,7 @@ vi.mock('storybook/internal/common', () => ({ serverRequire: vi.fn(), })); -describe.only('getTestRunnerConfig', () => { +describe('getTestRunnerConfig', () => { beforeEach(() => { vi.clearAllMocks(); }); From fe87de1e00d591192369849fb774da49e7c364e9 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Thu, 24 Jul 2025 11:32:50 +0200 Subject: [PATCH 22/29] fix --- src/config/jest-playwright.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index a2976f90..c5ef38b0 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -48,6 +48,8 @@ export const getJestConfig = (): Config.InitialOptions => { const jestSerializerHtmlPath = path.dirname(require.resolve('jest-serializer-html')); + const swcJestPath = path.dirname(require.resolve('@swc/jest')); + const reporters = STORYBOOK_JUNIT ? ['default', jestJunitPath] : ['default']; const testMatch = STORYBOOK_STORIES_PATTERN?.split(';') ?? []; @@ -62,7 +64,7 @@ export const getJestConfig = (): Config.InitialOptions => { '^.+\\.(story|stories)\\.[jt]sx?$': require.resolve( `${TEST_RUNNER_PATH}/playwright/transform.js` ), - '^.+\\.[jt]sx?$': '@swc/jest', + '^.+\\.[jt]sx?$': swcJestPath, }, extensionsToTreatAsEsm: ['.jsx', '.ts', '.tsx'], snapshotSerializers: [jestSerializerHtmlPath], From 501055a64e8f850ac6e42552e13956d402724b5e Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Fri, 25 Jul 2025 12:21:50 +0200 Subject: [PATCH 23/29] bundle jest-playwright-preset in --- jest-preset.json | 10 + package.json | 20 +- playwright/custom-environment.js | 5 +- playwright/global-setup.js | 6 - playwright/global-teardown.js | 7 - src/config/jest-playwright.ts | 25 +- src/jest-playwright-entries/extends.ts | 117 +++ src/jest-playwright-entries/runner.ts | 3 + src/jest-playwright-entries/setup.ts | 3 + src/jest-playwright-entries/teardown.ts | 3 + .../test-environment.ts | 3 + .../PlaywrightEnvironment.ts | 356 +++++++ .../PlaywrightRunner.ts | 203 ++++ src/jest-playwright-preset/constants.ts | 29 + src/jest-playwright-preset/coverage.ts | 55 + src/jest-playwright-preset/global.ts | 59 ++ src/jest-playwright-preset/types.ts | 236 +++++ src/jest-playwright-preset/utils.test.ts | 465 +++++++++ src/jest-playwright-preset/utils.ts | 209 ++++ src/test-storybook.ts | 72 +- src/util/getCliOptions.ts | 2 +- test-runner-jest.config.js | 4 +- tsup.config.ts | 10 +- yarn.lock | 961 ++++++++++++------ 24 files changed, 2476 insertions(+), 387 deletions(-) create mode 100644 jest-preset.json delete mode 100644 playwright/global-setup.js delete mode 100644 playwright/global-teardown.js create mode 100644 src/jest-playwright-entries/extends.ts create mode 100644 src/jest-playwright-entries/runner.ts create mode 100644 src/jest-playwright-entries/setup.ts create mode 100644 src/jest-playwright-entries/teardown.ts create mode 100644 src/jest-playwright-entries/test-environment.ts create mode 100644 src/jest-playwright-preset/PlaywrightEnvironment.ts create mode 100644 src/jest-playwright-preset/PlaywrightRunner.ts create mode 100644 src/jest-playwright-preset/constants.ts create mode 100644 src/jest-playwright-preset/coverage.ts create mode 100644 src/jest-playwright-preset/global.ts create mode 100644 src/jest-playwright-preset/types.ts create mode 100644 src/jest-playwright-preset/utils.test.ts create mode 100644 src/jest-playwright-preset/utils.ts diff --git a/jest-preset.json b/jest-preset.json new file mode 100644 index 00000000..e691c540 --- /dev/null +++ b/jest-preset.json @@ -0,0 +1,10 @@ +{ + "globalSetup": "@storybook/test-runner/dist/jest-playwright-entries/setup.js", + "globalTeardown": "@storybook/test-runner/dist/jest-playwright-entries/teardown.js", + "testEnvironment": "@storybook/test-runner/dist/jest-playwright-entries", + "runner": "@storybook/test-runner/dist/jest-playwright-entries/runner.js", + "setupFilesAfterEnv": [ + "expect-playwright", + "@storybook/test-runner/dist/jest-playwright-entries/lib/extends.js" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index a36cedf2..e82ac8ac 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "dist", "README.md", "playwright", + "jest-preset.json", "*.d.ts" ], "scripts": { @@ -59,19 +60,20 @@ "@jest/types": "^30.0.1", "@swc/core": "^1.5.22", "@swc/jest": "^0.2.38", - "@types/node-fetch": "^2.6.12", "expect-playwright": "^0.8.0", "jest": "^30.0.4", "jest-circus": "^30.0.4", "jest-environment-node": "^30.0.4", "jest-junit": "^16.0.0", - "jest-playwright-preset": "^4.0.0", + "jest-process-manager": "^0.4.0", "jest-runner": "^30.0.4", "jest-serializer-html": "^7.1.0", "jest-watch-typeahead": "^3.0.1", - "node-fetch": "^3.3.2", "nyc": "^15.1.0", - "playwright": "^1.14.0" + "playwright": "^1.14.0", + "playwright-core": ">=1.2.0", + "rimraf": "^3.0.2", + "uuid": "^8.3.2" }, "devDependencies": { "@auto-it/released": "^11.1.6", @@ -85,6 +87,9 @@ "@storybook/react-vite": "0.0.0-pr-31819-sha-7e336af7", "@types/jest": "^30.0.0", "@types/node": "^24.0.10", + "@types/uuid": "^8.3.4", + "@typescript-eslint/eslint-plugin": "5.30.7", + "@typescript-eslint/parser": "5.30.7", "@vitejs/plugin-react": "^4.0.3", "@vitest/coverage-v8": "^3.2.4", "auto": "^11.1.6", @@ -95,9 +100,16 @@ "concurrently": "^7.0.0", "glob": "^10.2.2", "husky": "^8.0.0", + "jest": "^30.0.0", + "jest-circus": "^30.0.0", + "jest-environment-node": "^30.0.0", "jest-image-snapshot": "^6.2.0", + "jest-runner": "^30.0.0", "lint-staged": "^13.0.3", + "pathe": "^2.0.3", "pkg-up": "^5.0.0", + "playwright": ">=1.24.0", + "playwright-chromium": ">=1.24.0", "prettier": "^2.8.1", "react": "^17.0.1", "react-dom": "^17.0.1", diff --git a/playwright/custom-environment.js b/playwright/custom-environment.js index c1ba73e9..993e8757 100644 --- a/playwright/custom-environment.js +++ b/playwright/custom-environment.js @@ -1,8 +1,5 @@ import { setupPage } from '../dist/index.js'; -import _PlaywrightEnvironment from 'jest-playwright-preset/lib/PlaywrightEnvironment.js'; - -// @ts-expect-error check later -const PlaywrightEnvironment = _PlaywrightEnvironment.default ?? _PlaywrightEnvironment; +import PlaywrightEnvironment from '../dist/jest-playwright-entries/test-environment.js'; class CustomEnvironment extends PlaywrightEnvironment { async setup() { diff --git a/playwright/global-setup.js b/playwright/global-setup.js deleted file mode 100644 index b87251ef..00000000 --- a/playwright/global-setup.js +++ /dev/null @@ -1,6 +0,0 @@ -// global-setup.mjs -import { globalSetup as playwrightGlobalSetup } from 'jest-playwright-preset'; - -export default async function globalSetup(globalConfig) { - return playwrightGlobalSetup(globalConfig); -} diff --git a/playwright/global-teardown.js b/playwright/global-teardown.js deleted file mode 100644 index 7c1feecc..00000000 --- a/playwright/global-teardown.js +++ /dev/null @@ -1,7 +0,0 @@ -// global-teardown.mjs -import { globalTeardown as playwrightGlobalTeardown } from 'jest-playwright-preset'; - -export default async function globalTeardown(globalConfig) { - // Your global teardown - await playwrightGlobalTeardown(globalConfig); -} diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index c5ef38b0..229e5630 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -1,9 +1,13 @@ -import path from 'path'; -// @ts-ignore +import path from 'pathe'; import { getProjectRoot } from 'storybook/internal/common'; import type { Config } from '@jest/types'; -const getTestRunnerPath = () => process.env.STORYBOOK_TEST_RUNNER_PATH ?? '@storybook/test-runner'; +const getTestRunnerPath = () => { + return ( + process.env.STORYBOOK_TEST_RUNNER_PATH ?? + path.dirname(require.resolve('@storybook/test-runner')) + ); +}; /** * IMPORTANT NOTE: @@ -18,18 +22,17 @@ const getTestRunnerPath = () => process.env.STORYBOOK_TEST_RUNNER_PATH ?? '@stor * necessary moving parts are all required within the correct path. * */ const getJestPlaywrightConfig = (): Config.InitialOptions => { - const TEST_RUNNER_PATH = getTestRunnerPath(); - const presetBasePath = path.dirname(require.resolve('jest-playwright-preset')); + const resolvedRunnerPath = getTestRunnerPath(); const expectPlaywrightPath = path.dirname(require.resolve('expect-playwright')); return { - runner: path.join(presetBasePath, 'runner.js'), - globalSetup: require.resolve(`${TEST_RUNNER_PATH}/playwright/global-setup.js`), - globalTeardown: require.resolve(`${TEST_RUNNER_PATH}/playwright/global-teardown.js`), - testEnvironment: require.resolve(`${TEST_RUNNER_PATH}/playwright/custom-environment.js`), + runner: path.join(resolvedRunnerPath, 'dist/jest-playwright-entries/runner.js'), + globalSetup: path.join(resolvedRunnerPath, 'playwright/global-setup.js'), + globalTeardown: path.join(resolvedRunnerPath, 'playwright/global-teardown.js'), + testEnvironment: path.join(resolvedRunnerPath, 'playwright/custom-environment.js'), setupFilesAfterEnv: [ - require.resolve(`${TEST_RUNNER_PATH}/playwright/jest-setup.js`), + path.join(resolvedRunnerPath, 'playwright/jest-setup.js'), expectPlaywrightPath, - path.join(presetBasePath, 'lib', 'extends.js'), + path.join(resolvedRunnerPath, 'dist/jest-playwright-entries/extends.js'), ], }; }; diff --git a/src/jest-playwright-entries/extends.ts b/src/jest-playwright-entries/extends.ts new file mode 100644 index 00000000..4784529b --- /dev/null +++ b/src/jest-playwright-entries/extends.ts @@ -0,0 +1,117 @@ +/* global jestPlaywright, browserName, deviceName */ +/* eslint-disable @typescript-eslint/no-explicit-any*/ +import { getSkipFlag, deepMerge } from '../jest-playwright-preset/utils'; +import { + JestPlaywrightGlobal, + SkipOption, + TestPlaywrightConfigOptions, +} from '../jest-playwright-preset/types'; +import { CONFIG_ENVIRONMENT_NAME, DEBUG_TIMEOUT } from '../jest-playwright-preset/constants'; + +declare const global: JestPlaywrightGlobal; + +type TestType = 'it' | 'describe'; + +const DEBUG_OPTIONS = { + launchOptions: { + headless: false, + devtools: true, + }, +}; + +const runDebugTest = (jestTestType: jest.It, ...args: any[]) => { + const isConfigProvided = typeof args[0] === 'object'; + const lastArg = args[args.length - 1]; + const timer = typeof lastArg === 'number' ? lastArg : DEBUG_TIMEOUT; + // TODO Looks weird - need to be rewritten + let options = DEBUG_OPTIONS as TestPlaywrightConfigOptions; + if (isConfigProvided) { + options = deepMerge(DEBUG_OPTIONS, args[0]); + } + + jestTestType( + args[isConfigProvided ? 1 : 0], + async () => { + const envArgs = await jestPlaywright.configSeparateEnv(options, true); + try { + await args[isConfigProvided ? 2 : 1](envArgs); + } finally { + await envArgs.browser!.close(); + } + }, + timer + ); +}; + +// @ts-ignore +it.jestPlaywrightDebug = (...args) => { + runDebugTest(it, ...args); +}; + +it.jestPlaywrightDebug.only = (...args: any[]) => { + runDebugTest(it.only, ...args); +}; + +it.jestPlaywrightDebug.skip = (...args: any[]) => { + runDebugTest(it.skip, ...args); +}; + +const runConfigTest = ( + jestTypeTest: jest.It, + playwrightOptions: Partial, + ...args: any[] +) => { + const lastArg = args[args.length - 1]; + const timer = typeof lastArg === 'number' ? lastArg : global[CONFIG_ENVIRONMENT_NAME].testTimeout; + jestTypeTest( + args[0], + async () => { + const envArgs = await jestPlaywright.configSeparateEnv(playwrightOptions); + try { + await args[1](envArgs); + } finally { + await envArgs.browser!.close(); + } + }, + timer + ); +}; + +//@ts-ignore +it.jestPlaywrightConfig = (playwrightOptions, ...args) => { + runConfigTest(it, playwrightOptions, ...args); +}; + +it.jestPlaywrightConfig.only = (...args) => { + runConfigTest(it.only, ...args); +}; + +it.jestPlaywrightConfig.skip = (...args) => { + runConfigTest(it.skip, ...args); +}; + +const customSkip = (skipOption: SkipOption, type: TestType, ...args: any[]) => { + const skipFlag = getSkipFlag(skipOption, browserName, deviceName); + if (skipFlag) { + // @ts-ignore + global[type].skip(...args); + } else { + // @ts-ignore + global[type](...args); + } +}; + +it.jestPlaywrightSkip = (skipOption, ...args) => { + customSkip(skipOption, 'it', ...args); +}; + +//@ts-ignore +describe.jestPlaywrightSkip = (skipOption: SkipOption, ...args) => { + customSkip(skipOption, 'describe', ...args); +}; + +beforeEach(async () => { + if (global[CONFIG_ENVIRONMENT_NAME].resetContextPerTest) { + await jestPlaywright.resetContext(); + } +}); diff --git a/src/jest-playwright-entries/runner.ts b/src/jest-playwright-entries/runner.ts new file mode 100644 index 00000000..755ab00d --- /dev/null +++ b/src/jest-playwright-entries/runner.ts @@ -0,0 +1,3 @@ +import PlaywrightRunner from '../jest-playwright-preset/PlaywrightRunner'; + +export default PlaywrightRunner; diff --git a/src/jest-playwright-entries/setup.ts b/src/jest-playwright-entries/setup.ts new file mode 100644 index 00000000..57dfb02f --- /dev/null +++ b/src/jest-playwright-entries/setup.ts @@ -0,0 +1,3 @@ +import { setup } from '../jest-playwright-preset/global'; + +export default setup; diff --git a/src/jest-playwright-entries/teardown.ts b/src/jest-playwright-entries/teardown.ts new file mode 100644 index 00000000..f9b03eb0 --- /dev/null +++ b/src/jest-playwright-entries/teardown.ts @@ -0,0 +1,3 @@ +import { teardown } from '../jest-playwright-preset/global'; + +export default teardown; diff --git a/src/jest-playwright-entries/test-environment.ts b/src/jest-playwright-entries/test-environment.ts new file mode 100644 index 00000000..9662a012 --- /dev/null +++ b/src/jest-playwright-entries/test-environment.ts @@ -0,0 +1,3 @@ +import PlaywrightEnvironment from '../jest-playwright-preset/PlaywrightEnvironment'; + +export default PlaywrightEnvironment; diff --git a/src/jest-playwright-preset/PlaywrightEnvironment.ts b/src/jest-playwright-preset/PlaywrightEnvironment.ts new file mode 100644 index 00000000..fefe5627 --- /dev/null +++ b/src/jest-playwright-preset/PlaywrightEnvironment.ts @@ -0,0 +1,356 @@ +/* eslint-disable no-console, @typescript-eslint/no-unused-vars */ +import type { Browser, BrowserContext, BrowserContextOptions, Page } from 'playwright-core'; +import { Event } from 'jest-circus'; +import type { JestEnvironmentConfig } from '@jest/environment'; +import type { + BrowserType, + ConfigDeviceType, + ConfigParams, + GenericBrowser, + JestPlaywrightConfig, + JestPlaywrightProjectConfig, + Nullable, + Playwright, + TestPlaywrightConfigOptions, +} from './types'; +import { + CHROMIUM, + CONFIG_ENVIRONMENT_NAME, + DEFAULT_CONFIG, + FIREFOX, + IMPORT_KIND_PLAYWRIGHT, + PERSISTENT, + LAUNCH, +} from './constants'; +import { + checkDevice, + deepMerge, + formatError, + getBrowserOptions, + getBrowserType, + getDeviceBrowserType, + getPlaywrightInstance, +} from './utils'; +import { saveCoverageOnPage, saveCoverageToFile } from './coverage'; + +const handleError = (error: Error): void => { + process.emit('uncaughtException', error); +}; + +const getBrowserPerProcess = async ( + playwrightInstance: GenericBrowser, + browserType: BrowserType, + config: JestPlaywrightConfig +): Promise => { + const { launchType, userDataDir, launchOptions, connectOptions } = config; + + if (launchType === LAUNCH || launchType === PERSISTENT) { + // https://github.com/playwright-community/jest-playwright/issues/42#issuecomment-589170220 + if (browserType !== CHROMIUM && launchOptions?.args) { + launchOptions.args = launchOptions.args.filter((item: string) => item !== '--no-sandbox'); + } + + const options = getBrowserOptions(browserType, launchOptions); + + if (launchType === LAUNCH) { + return playwrightInstance.launch(options); + } + + if (launchType === PERSISTENT) { + return playwrightInstance.launchPersistentContext(userDataDir!, options); + } + } + + const options = getBrowserOptions(browserType, connectOptions); + return options && 'endpointURL' in options + ? playwrightInstance.connectOverCDP(options) + : playwrightInstance.connect(options); +}; + +const getDeviceConfig = ( + device: Nullable | undefined, + availableDevices: Playwright['devices'] +): BrowserContextOptions => { + if (device) { + if (typeof device === 'string') { + const { defaultBrowserType, ...deviceProps } = availableDevices[device]; + return deviceProps; + } else { + const { name, defaultBrowserType, ...deviceProps } = device; + return deviceProps; + } + } + return {}; +}; + +const getDeviceName = (device: Nullable): Nullable => { + let deviceName: Nullable = null; + if (device != null) { + if (typeof device === 'string') { + deviceName = device; + } else { + deviceName = device.name; + } + } + return deviceName; +}; + +export const getPlaywrightEnv = (): unknown => { + const RootEnv = require('jest-environment-node').default; + + return class PlaywrightEnvironment extends RootEnv { + readonly _config: JestPlaywrightProjectConfig; + _jestPlaywrightConfig!: JestPlaywrightConfig; + + constructor(config: JestEnvironmentConfig) { + super(config); + this._config = config.projectConfig as JestPlaywrightProjectConfig; + } + + _getContextOptions(devices: Playwright['devices']): BrowserContextOptions { + const { browserName, device } = this._config; + const browserType = getBrowserType(browserName); + const { contextOptions } = this._jestPlaywrightConfig; + const deviceBrowserContextOptions = getDeviceConfig(device, devices); + const resultContextOptions = deepMerge( + deviceBrowserContextOptions, + getBrowserOptions(browserName, contextOptions) + ); + if (browserType === FIREFOX && resultContextOptions.isMobile) { + console.warn(formatError(`isMobile is not supported in ${FIREFOX}.`)); + delete resultContextOptions.isMobile; + } + return resultContextOptions; + } + + _getSeparateEnvBrowserConfig( + isDebug: boolean, + config: TestPlaywrightConfigOptions + ): JestPlaywrightConfig { + const { debugOptions } = this._jestPlaywrightConfig; + const defaultBrowserConfig: JestPlaywrightConfig = { + ...DEFAULT_CONFIG, + launchType: LAUNCH, + }; + let resultBrowserConfig: JestPlaywrightConfig = { + ...defaultBrowserConfig, + ...config, + }; + if (isDebug) { + if (debugOptions) { + resultBrowserConfig = deepMerge(resultBrowserConfig, debugOptions); + } + } else { + resultBrowserConfig = deepMerge(this._jestPlaywrightConfig, resultBrowserConfig); + } + return resultBrowserConfig; + } + + _getSeparateEnvContextConfig( + isDebug: boolean, + config: TestPlaywrightConfigOptions, + browserName: BrowserType, + devices: Playwright['devices'] + ): BrowserContextOptions { + const { device, contextOptions } = config; + const { debugOptions } = this._jestPlaywrightConfig; + const deviceContextOptions: BrowserContextOptions = getDeviceConfig(device, devices); + let resultContextOptions: BrowserContextOptions = contextOptions || {}; + if (isDebug) { + if (debugOptions?.contextOptions) { + resultContextOptions = deepMerge(resultContextOptions, debugOptions.contextOptions!); + } + } else { + resultContextOptions = deepMerge( + this._jestPlaywrightConfig.contextOptions!, + resultContextOptions + ); + } + resultContextOptions = deepMerge(deviceContextOptions, resultContextOptions); + return getBrowserOptions(browserName, resultContextOptions); + } + + async _setNewPageInstance(context = this.global.context) { + const { exitOnPageError } = this._jestPlaywrightConfig; + const page = await context.newPage(); + if (exitOnPageError) { + page.on('pageerror', handleError); + } + return page; + } + + async _setCollectCoverage(context: BrowserContext) { + await context.exposeFunction('reportCodeCoverage', (coverage: unknown) => { + if (coverage) saveCoverageToFile(coverage); + }); + await context.addInitScript(() => + window.addEventListener('beforeunload', () => { + // @ts-ignore + reportCodeCoverage(window.__coverage__); + }) + ); + } + + async setup(): Promise { + const { wsEndpoint, browserName, testEnvironmentOptions } = this._config; + this._jestPlaywrightConfig = testEnvironmentOptions[ + CONFIG_ENVIRONMENT_NAME + ] as JestPlaywrightConfig; + const { connectOptions, collectCoverage, selectors, launchType, skipInitialization } = + this._jestPlaywrightConfig; + if (wsEndpoint) { + this._jestPlaywrightConfig.connectOptions = { + ...connectOptions, + wsEndpoint, + }; + } + const browserType = getBrowserType(browserName); + const device = this._config.device; + const deviceName: Nullable = getDeviceName(device); + const { name, instance: playwrightInstance, devices } = getPlaywrightInstance(browserType); + const contextOptions = this._getContextOptions(devices); + + if (name === IMPORT_KIND_PLAYWRIGHT && selectors) { + const playwright = require('playwright'); + await Promise.all( + selectors.map(({ name, script }) => + playwright.selectors.register(name, script).catch((e: Error): void => { + if (!e.toString().includes('has been already')) { + throw e; + } + }) + ) + ); + } + + this.global.browserName = browserType; + this.global.deviceName = deviceName; + if (!skipInitialization) { + const browserOrContext = await getBrowserPerProcess( + playwrightInstance as GenericBrowser, + browserType, + this._jestPlaywrightConfig + ); + this.global.browser = launchType === PERSISTENT ? null : browserOrContext; + this.global.context = + launchType === PERSISTENT + ? browserOrContext + : await this.global.browser.newContext(contextOptions); + if (collectCoverage) { + await this._setCollectCoverage(this.global.context as BrowserContext); + } + this.global.page = await this._setNewPageInstance(); + } + this.global.jestPlaywright = { + configSeparateEnv: async ( + config: TestPlaywrightConfigOptions, + isDebug = false + ): Promise => { + const { device } = config; + const browserName = + config.useDefaultBrowserType && device + ? getDeviceBrowserType(device, devices) || CHROMIUM + : config.browser || browserType; + const deviceName = device ? getDeviceName(device) : null; + checkDevice(deviceName, devices); + const resultBrowserConfig: JestPlaywrightConfig = this._getSeparateEnvBrowserConfig( + isDebug, + config + ); + const resultContextOptions: BrowserContextOptions = this._getSeparateEnvContextConfig( + isDebug, + config, + browserName, + devices + ); + const { instance } = getPlaywrightInstance(browserName); + const browser = await getBrowserPerProcess( + instance as GenericBrowser, + browserName, + resultBrowserConfig + ); + const context = await (browser as Browser)!.newContext(resultContextOptions); + const page = await context!.newPage(); + return { browserName, deviceName, browser, context, page }; + }, + resetPage: async (): Promise => { + await this.global.page?.close(); + this.global.page = await this._setNewPageInstance(); + }, + resetContext: async (newOptions?: BrowserContextOptions): Promise => { + const { browser, context } = this.global; + await context?.close(); + + const newContextOptions = newOptions + ? deepMerge(contextOptions, newOptions) + : contextOptions; + + this.global.context = await browser.newContext(newContextOptions); + this.global.page = await this._setNewPageInstance(); + }, + resetBrowser: async (newOptions?: BrowserContextOptions): Promise => { + const { browser } = this.global; + await browser?.close(); + + this.global.browser = await getBrowserPerProcess( + playwrightInstance as GenericBrowser, + browserType, + this._jestPlaywrightConfig + ); + + const newContextOptions = newOptions + ? deepMerge(contextOptions, newOptions) + : contextOptions; + + this.global.context = await this.global.browser.newContext(newContextOptions); + this.global.page = await this._setNewPageInstance(); + }, + saveCoverage: async (page: Page): Promise => + saveCoverageOnPage(page, collectCoverage), + }; + } + + async handleTestEvent(event: Event) { + const { browserName } = this._config; + const { collectCoverage, haveSkippedTests } = this._jestPlaywrightConfig; + const browserType = getBrowserType(browserName); + const { instance, devices } = getPlaywrightInstance(browserType); + const contextOptions = this._getContextOptions(devices); + if (haveSkippedTests && event.name === 'run_start') { + this.global.browser = await getBrowserPerProcess( + instance as GenericBrowser, + browserType, + this._jestPlaywrightConfig + ); + this.global.context = await this.global.browser.newContext(contextOptions); + if (collectCoverage) { + await this._setCollectCoverage(this.global.context); + } + this.global.page = await this._setNewPageInstance(); + } + } + + async teardown(): Promise { + const { browser, context, page } = this.global; + const { collectCoverage } = this._jestPlaywrightConfig; + page?.removeListener('pageerror', handleError); + if (collectCoverage) { + await Promise.all( + (context as BrowserContext).pages().map((p) => + p.close({ + runBeforeUnload: true, + }) + ) + ); + // wait until coverage data was sent successfully to the exposed function + await new Promise((resolve) => setTimeout(resolve, 10)); + } + + await browser?.close(); + + await super.teardown(); + } + }; +}; + +export default getPlaywrightEnv(); diff --git a/src/jest-playwright-preset/PlaywrightRunner.ts b/src/jest-playwright-preset/PlaywrightRunner.ts new file mode 100644 index 00000000..9637b76b --- /dev/null +++ b/src/jest-playwright-preset/PlaywrightRunner.ts @@ -0,0 +1,203 @@ +import JestRunner from 'jest-runner'; +import type { BrowserServer } from 'playwright-core'; +import type { Test, TestRunnerContext, TestWatcher, TestRunnerOptions } from 'jest-runner'; +import type { Config as JestConfig } from '@jest/types'; +import type { + BrowserType, + BrowserTest, + DeviceType, + WsEndpointType, + JestPlaywrightTest, + JestPlaywrightConfig, + ConfigDeviceType, + Playwright, +} from './types'; +import { + checkBrowserEnv, + checkDevice, + getDisplayName, + readConfig, + getPlaywrightInstance, + getBrowserOptions, + getBrowserType, + getDeviceBrowserType, + deepMerge, + generateKey, +} from './utils'; +import { + DEBUG_TIMEOUT, + DEFAULT_TEST_PLAYWRIGHT_TIMEOUT, + CONFIG_ENVIRONMENT_NAME, + SERVER, + LAUNCH, +} from './constants'; +import { setupCoverage, mergeCoverage } from './coverage'; +import { GenericBrowser } from './types'; + +const getBrowserTest = ({ + test, + config, + browser, + wsEndpoint, + device, + testTimeout, +}: BrowserTest): JestPlaywrightTest => { + const { displayName, testEnvironmentOptions } = test.context.config; + const playwrightDisplayName = getDisplayName(config.displayName || browser, device); + return { + ...test, + context: { + ...test.context, + config: { + ...test.context.config, + testEnvironmentOptions: { + ...testEnvironmentOptions, + [CONFIG_ENVIRONMENT_NAME]: { ...config, testTimeout }, + }, + browserName: browser, + wsEndpoint, + device, + displayName: { + name: displayName + ? `${playwrightDisplayName} ${displayName.name || displayName}` + : playwrightDisplayName, + color: displayName?.color || 'yellow', + }, + }, + }, + }; +}; + +const getDevices = ( + devices: JestPlaywrightConfig['devices'], + availableDevices: Playwright['devices'] +) => { + let resultDevices: ConfigDeviceType[] = []; + + if (devices) { + if (devices instanceof RegExp) { + resultDevices = Object.keys(availableDevices).filter((item) => item.match(devices)); + } else { + resultDevices = devices; + } + } + + return resultDevices; +}; + +const getJestTimeout = (configTimeout?: number) => { + if (configTimeout) { + return configTimeout; + } + return process.env.PWDEBUG ? DEBUG_TIMEOUT : DEFAULT_TEST_PLAYWRIGHT_TIMEOUT; +}; + +class PlaywrightRunner extends JestRunner { + browser2Server: Partial>; + config: JestConfig.GlobalConfig; + constructor(globalConfig: JestConfig.GlobalConfig, context: TestRunnerContext) { + const config = { ...globalConfig }; + // Set testTimeout + config.testTimeout = getJestTimeout(config.testTimeout); + super(config, context); + this.browser2Server = {}; + this.config = config; + } + + async launchServer( + config: JestPlaywrightConfig, + wsEndpoint: WsEndpointType, + browser: BrowserType, + key: string, + instance: GenericBrowser + ): Promise { + const { launchType, launchOptions, skipInitialization } = config; + if (!skipInitialization && launchType === SERVER && wsEndpoint === null) { + if (!this.browser2Server[key]) { + const options = getBrowserOptions(browser, launchOptions); + this.browser2Server[key] = await instance.launchServer(options); + } + } + return wsEndpoint || this.browser2Server[key]?.wsEndpoint() || null; + } + + async getTests(tests: Test[], config: JestPlaywrightConfig): Promise { + const { browsers, devices, connectOptions, useDefaultBrowserType } = config; + const pwTests: Test[] = []; + for (const test of tests) { + for (const browser of browsers) { + const browserType = getBrowserType(typeof browser === 'string' ? browser : browser.name); + const browserConfig = + typeof browser === 'string' ? config : deepMerge(config, browser || {}); + checkBrowserEnv(browserType); + const { devices: availableDevices, instance } = getPlaywrightInstance(browserType); + const resultDevices = getDevices(devices, availableDevices); + const key = + typeof browser === 'string' ? browser : generateKey(browser.name, browserConfig); + const browserOptions = getBrowserOptions(browserType, connectOptions); + const wsEndpoint: WsEndpointType = await this.launchServer( + browserConfig, + 'wsEndpoint' in browserOptions ? browserOptions.wsEndpoint : null, + browserType, + key, + instance as GenericBrowser + ); + + const browserTest = { + test: test as JestPlaywrightTest, + config: browserConfig, + wsEndpoint, + browser: browserType, + testTimeout: this.config.testTimeout, + }; + + if (resultDevices.length) { + resultDevices.forEach((device: DeviceType) => { + checkDevice(device, availableDevices); + if (useDefaultBrowserType) { + const deviceBrowser = getDeviceBrowserType(device!, availableDevices); + if (deviceBrowser !== null && deviceBrowser !== browser) return; + } + pwTests.push(getBrowserTest({ ...browserTest, device })); + }); + } else { + pwTests.push(getBrowserTest({ ...browserTest, device: null })); + } + } + } + + return pwTests; + } + + async runTests( + tests: Array, + watcher: TestWatcher, + options: TestRunnerOptions + ): Promise { + const { rootDir, testEnvironmentOptions } = tests[0].context.config; + const config = await readConfig( + rootDir, + testEnvironmentOptions[CONFIG_ENVIRONMENT_NAME] as JestPlaywrightConfig + ); + if (this.config.testNamePattern) { + config.launchType = LAUNCH; + config.skipInitialization = true; + config.haveSkippedTests = true; + } + const browserTests = await this.getTests(tests, config); + if (config.collectCoverage) { + await setupCoverage(); + } + + await super.runTests(browserTests, watcher, options); + + for (const key in this.browser2Server) { + await this.browser2Server[key]!.close(); + } + if (config.collectCoverage) { + await mergeCoverage(); + } + } +} + +export default PlaywrightRunner; diff --git a/src/jest-playwright-preset/constants.ts b/src/jest-playwright-preset/constants.ts new file mode 100644 index 00000000..18900dbd --- /dev/null +++ b/src/jest-playwright-preset/constants.ts @@ -0,0 +1,29 @@ +import type { JestPlaywrightConfig } from './types'; + +export const IMPORT_KIND_PLAYWRIGHT = 'playwright'; + +export const CONFIG_ENVIRONMENT_NAME = 'jest-playwright'; + +export const CHROMIUM = 'chromium'; +export const FIREFOX = 'firefox'; +export const WEBKIT = 'webkit'; + +export const LAUNCH = 'LAUNCH'; +export const PERSISTENT = 'PERSISTENT'; +export const SERVER = 'SERVER'; + +export const DEFAULT_CONFIG: JestPlaywrightConfig = { + launchType: SERVER, + launchOptions: {}, + connectOptions: {} as JestPlaywrightConfig['connectOptions'], + contextOptions: {}, + browsers: [CHROMIUM], + exitOnPageError: true, + collectCoverage: false, +}; + +export const DEFAULT_TEST_PLAYWRIGHT_TIMEOUT = 15000; +// Set timeout to 4 days +export const DEBUG_TIMEOUT = 4 * 24 * 60 * 60 * 1000; + +export const PACKAGE_NAME = '@storybook/test-runner'; diff --git a/src/jest-playwright-preset/coverage.ts b/src/jest-playwright-preset/coverage.ts new file mode 100644 index 00000000..6e180111 --- /dev/null +++ b/src/jest-playwright-preset/coverage.ts @@ -0,0 +1,55 @@ +import * as uuid from 'uuid'; +import path from 'path'; +import fs from 'fs'; +import type { Page } from 'playwright-core'; +import { promisify } from 'util'; +import rimraf from 'rimraf'; +const fsAsync = fs.promises; + +// @ts-ignore +import NYC from 'nyc'; +import { PACKAGE_NAME } from './constants'; + +const NYC_DIR = '.nyc_output'; +const COV_MERGE_DIR = path.join(NYC_DIR, 'merge'); + +const cleanMergeFiles = async (): Promise => { + await promisify(rimraf)(COV_MERGE_DIR); +}; + +export const setupCoverage = async (): Promise => { + if (!fs.existsSync(NYC_DIR)) { + await fsAsync.mkdir(NYC_DIR); + } + await cleanMergeFiles(); + await fsAsync.mkdir(COV_MERGE_DIR); +}; + +export const saveCoverageToFile = async (coverage: unknown): Promise => { + await fsAsync.writeFile(path.join(COV_MERGE_DIR, `${uuid.v4()}.json`), JSON.stringify(coverage)); +}; + +export const saveCoverageOnPage = async (page: Page, collectCoverage = false): Promise => { + if (!collectCoverage) { + console.warn( + `${PACKAGE_NAME}: saveCoverage was called but collectCoverage is not true in config file` + ); + return; + } + const coverage = await page.evaluate(`window.__coverage__`); + if (coverage) { + await saveCoverageToFile(coverage); + } +}; + +export const mergeCoverage = async (): Promise => { + const nyc = new NYC({ + _: ['merge'], + }); + const map = await nyc.getCoverageMapFromAllCoverageFiles(COV_MERGE_DIR); + const outputFile = path.join(NYC_DIR, 'coverage.json'); + const content = JSON.stringify(map, null, 2); + await fsAsync.writeFile(outputFile, content); + console.info(`Coverage file (${content.length} bytes) written to ${outputFile}`); + await cleanMergeFiles(); +}; diff --git a/src/jest-playwright-preset/global.ts b/src/jest-playwright-preset/global.ts new file mode 100644 index 00000000..691b6432 --- /dev/null +++ b/src/jest-playwright-preset/global.ts @@ -0,0 +1,59 @@ +/* eslint-disable no-console */ +import { + setup as setupServer, + teardown as teardownServer, + ERROR_TIMEOUT, + ERROR_NO_COMMAND, +} from 'jest-process-manager'; +import { readConfig } from './utils'; +import type { Config as JestConfig } from '@jest/types'; +import { ServerOptions } from './types'; + +let didAlreadyRunInWatchMode = false; + +const logMessage = ({ message, action }: { message: string; action: string }): void => { + console.log(''); + console.error(message); + console.error(`\n☝️ You ${action} in jest-playwright.config.js`); + process.exit(1); +}; + +export async function setup(jestConfig: JestConfig.GlobalConfig): Promise { + // TODO It won't work if config doesn't exist in root directory or in jest.config.js file + const config = await readConfig(jestConfig.rootDir); + + // If we are in watch mode - only setupServer() once. + if (jestConfig.watch || jestConfig.watchAll) { + if (didAlreadyRunInWatchMode) return; + didAlreadyRunInWatchMode = true; + } + + if (config.serverOptions) { + try { + await setupServer(config.serverOptions); + } catch (error) { + if (!(error instanceof Error)) throw error; + if ((error as NodeJS.ErrnoException).code === ERROR_TIMEOUT) { + logMessage({ + message: error.message, + action: 'can set "serverOptions.launchTimeout"', + }); + } + if ((error as NodeJS.ErrnoException).code === ERROR_NO_COMMAND) { + logMessage({ + message: error.message, + action: 'must set "serverOptions.command"', + }); + } + throw error; + } + } +} + +export async function teardown(jestConfig: JestConfig.GlobalConfig): Promise { + const { serverOptions } = await readConfig(jestConfig.rootDir); + + if (!jestConfig.watch && !jestConfig.watchAll) { + await teardownServer((serverOptions as ServerOptions)?.teardown); + } +} diff --git a/src/jest-playwright-preset/types.ts b/src/jest-playwright-preset/types.ts new file mode 100644 index 00000000..30166f11 --- /dev/null +++ b/src/jest-playwright-preset/types.ts @@ -0,0 +1,236 @@ +import { + Browser, + BrowserContext, + Page, + BrowserContextOptions, + LaunchOptions, + ConnectOptions, + ConnectOverCDPOptions, + BrowserType as PlaywrightBrowserType, + ViewportSize, + ChromiumBrowser, + FirefoxBrowser, + WebKitBrowser, + devices, +} from 'playwright-core'; +import { Test } from 'jest-runner'; +import { JestProcessManagerOptions } from 'jest-process-manager'; + +// TODO Find out flex ways to reuse constants +declare const IMPORT_KIND_PLAYWRIGHT = 'playwright'; + +declare const CONFIG_ENVIRONMENT_NAME = 'jest-playwright'; + +declare const CHROMIUM = 'chromium'; +declare const FIREFOX = 'firefox'; +declare const WEBKIT = 'webkit'; + +declare const LAUNCH = 'LAUNCH'; +declare const PERSISTENT = 'PERSISTENT'; +declare const SERVER = 'SERVER'; + +export type BrowserType = typeof CHROMIUM | typeof FIREFOX | typeof WEBKIT; + +export type SkipOption = { + browsers: BrowserType[]; + devices?: string[] | RegExp; +}; + +type Global = typeof globalThis; + +export interface JestPlaywrightGlobal extends Global { + [CONFIG_ENVIRONMENT_NAME]: JestPlaywrightConfig; +} + +export interface TestPlaywrightConfigOptions extends JestPlaywrightConfig { + browser?: BrowserType; + device?: ConfigDeviceType; +} + +export type GenericBrowser = PlaywrightBrowserType< + WebKitBrowser | ChromiumBrowser | FirefoxBrowser +>; + +export type Nullable = T | null; + +interface JestPlaywright { + /** + * Reset global.page + * + * ```ts + * it('should reset page', async () => { + * await jestPlaywright.resetPage() + * }) + * ``` + */ + resetPage: () => Promise; + /** + * Reset global.context + * + * ```ts + * it('should reset context', async () => { + * await jestPlaywright.resetContext() + * }) + * ``` + */ + resetContext: (newOptions?: BrowserContextOptions) => Promise; + /** + * Reset global.browser, global.context, and global.page + * + * ```ts + * it('should reset page', async () => { + * await jestPlaywright.resetBrowser() + * }) + * ``` + */ + resetBrowser: (newOptions?: BrowserContextOptions) => Promise; + /** + * Saves the coverage to the disk which will only work if `collectCoverage` + * in `jest-playwright.config.js` file is set to true. The merged coverage file + * is then available in `.nyc_output/coverage.json`. Mostly its needed in the + * `afterEach` handler like that: + * + * ```ts + * afterEach(async () => { + * await jestPlaywright.saveCoverage(page) + * }) + * ``` + */ + saveCoverage: (page: Page) => Promise; + configSeparateEnv: ( + config: Partial, + isDebug?: boolean + ) => Promise; +} + +interface JestParams { + (options: T, name: string, fn?: jest.ProvidesCallback, timeout?: number): void; +} + +type ProvidesCallback = (cb: ConfigParams) => void; + +interface JestParamsWithConfigParams { + (options: Partial, name: string, fn?: ProvidesCallback, timeout?: number): void; +} + +interface JestPlaywrightTestDebug extends JestParamsWithConfigParams { + (name: string, fn?: ProvidesCallback, timeout?: number): void; + skip: JestParamsWithConfigParams | JestPlaywrightTestDebug; + only: JestParamsWithConfigParams | JestPlaywrightTestDebug; +} + +interface JestPlaywrightTestConfig extends JestParamsWithConfigParams { + skip: JestParamsWithConfigParams | JestPlaywrightTestConfig; + only: JestParamsWithConfigParams | JestPlaywrightTestConfig; +} + +declare global { + const browserName: BrowserType; + const deviceName: Nullable; + const page: Page; + const browser: Browser; + const context: BrowserContext; + const jestPlaywright: JestPlaywright; + namespace jest { + interface It { + jestPlaywrightSkip: JestParams; + jestPlaywrightDebug: JestPlaywrightTestDebug; + jestPlaywrightConfig: JestPlaywrightTestConfig; + } + interface Describe { + jestPlaywrightSkip: JestParams; + } + } +} + +type DeviceDescriptor = { + viewport: Nullable; + userAgent: string; + deviceScaleFactor: number; + isMobile: boolean; + hasTouch: boolean; + defaultBrowserType: BrowserType; +}; + +export type CustomDeviceType = Partial & { + name: string; +}; + +export type ConfigDeviceType = CustomDeviceType | string; + +export type DeviceType = Nullable; + +export type WsEndpointType = Nullable; + +export type SelectorType = { + script: string | Function | { path?: string; content?: string }; + name: string; +}; + +export type PlaywrightRequireType = BrowserType | typeof IMPORT_KIND_PLAYWRIGHT; + +export interface Playwright { + name: PlaywrightRequireType; + instance: GenericBrowser | Record; + devices: typeof devices; +} + +type LaunchType = typeof LAUNCH | typeof SERVER | typeof PERSISTENT; + +export type Options = T & Partial>; + +export type ServerOptions = JestProcessManagerOptions & { + teardown?: string; +}; + +export interface JestPlaywrightConfig { + haveSkippedTests?: boolean; + skipInitialization?: boolean; + resetContextPerTest?: boolean; + testTimeout?: number; + debugOptions?: JestPlaywrightConfig; + launchType?: LaunchType; + launchOptions?: Options; + connectOptions?: Options<(ConnectOptions & { wsEndpoint: string }) | ConnectOverCDPOptions>; + contextOptions?: Options; + userDataDir?: string; + exitOnPageError?: boolean; + displayName?: string; + browsers: (BrowserType | (JestPlaywrightConfig & { name: BrowserType }))[]; + devices?: ConfigDeviceType[] | RegExp; + useDefaultBrowserType?: boolean; + serverOptions?: ServerOptions | ServerOptions[]; + selectors?: SelectorType[]; + collectCoverage?: boolean; +} + +export type JestPlaywrightProjectConfig = Test['context']['config'] & { + browserName: BrowserType; + wsEndpoint: WsEndpointType; + device: DeviceType; +}; + +export type JestPlaywrightContext = Omit & { + config: JestPlaywrightProjectConfig; +}; + +export type JestPlaywrightTest = Omit & { + context: JestPlaywrightContext; +}; + +export interface BrowserTest { + test: JestPlaywrightTest; + config: JestPlaywrightConfig; + browser: BrowserType; + wsEndpoint: WsEndpointType; + device: DeviceType; + testTimeout?: number; +} + +export type ConfigParams = { + browserName: BrowserType; + deviceName: Nullable; + browser: Nullable; + context: BrowserContext; + page: Page; +}; diff --git a/src/jest-playwright-preset/utils.test.ts b/src/jest-playwright-preset/utils.test.ts new file mode 100644 index 00000000..1e5edd2e --- /dev/null +++ b/src/jest-playwright-preset/utils.test.ts @@ -0,0 +1,465 @@ +import fs from 'fs'; +import path from 'path'; +import * as Utils from './utils'; +import { DEFAULT_CONFIG, CHROMIUM, FIREFOX } from './constants'; +import type { BrowserType, JestPlaywrightConfig } from '../types/global'; +import { Playwright } from '../types/global'; + +const { + readConfig, + getBrowserType, + checkBrowserEnv, + checkDeviceEnv, + checkDevice, + getPlaywrightInstance, + getDisplayName, + getSkipFlag, + getBrowserOptions, + getDeviceBrowserType, + generateKey, + deepMerge, +} = Utils; + +beforeEach(() => { + jest.resetModules(); +}); + +describe('readConfig', () => { + it('should return the default configuration if there was no separate configuration specified', async () => { + jest.mock(path.join(__dirname, '..', 'jest-playwright.config.js'), () => ({}), { + virtual: true, + }); + const config = await readConfig(); + expect(config).toMatchObject(DEFAULT_CONFIG); + }); + it('should execute function if it was specified in configuration', async () => { + jest.mock( + path.join(__dirname, '..', 'jest-playwright.config.js'), + () => () => ({ + browsers: ['webkit'], + }), + { virtual: true } + ); + const config = await readConfig(); + expect(config.browsers).toEqual(['webkit']); + }); + it('should overwrite with a custom configuration', async () => { + const configObject = { + launchOptions: { + headless: true, + }, + browsers: ['chromium'], + contextOptions: { + viewport: { + width: 800, + height: 640, + }, + ignoreHTTPSErrors: true, + }, + }; + jest.mock(path.join(__dirname, '..', 'jest-playwright.config.js'), () => configObject, { + virtual: true, + }); + const config = await readConfig(); + expect(config).toMatchObject(configObject); + }); + it('should overwrite config if the second param is passed', async () => { + const configObject = { + launchOptions: { + headless: true, + }, + browsers: ['chromium'], + }; + jest.mock( + path.join(__dirname, '..', 'jest-playwright.config.js'), + () => ({ + ...configObject, + browsers: ['webkit'], + }), + { virtual: true } + ); + const config = await readConfig(process.cwd(), configObject as JestPlaywrightConfig); + expect(config).toMatchObject(configObject); + }); + it('should overwrite with a custom configuration and spread the "launchOptions" and "contextOptions" setting', async () => { + const configObject = { + launchOptions: { + headless: true, + }, + contextOptions: { + foo: true, + }, + }; + jest.mock(path.join(__dirname, '..', 'jest-playwright.config.js'), () => configObject, { + virtual: true, + }); + const config = await readConfig(); + const expectedConfig = { + ...configObject, + browsers: ['chromium'], + exitOnPageError: true, + }; + expect(config).toMatchObject(expectedConfig); + }); + it('should throw error if JEST_PLAYWRIGHT_CONFIG is defined but does not exist', async () => { + process.env.JEST_PLAYWRIGHT_CONFIG = 'unreached.js'; + let error; + try { + await readConfig(); + } catch (e) { + error = e; + } + expect(error).toBeTruthy(); + delete process.env.JEST_PLAYWRIGHT_CONFIG; + }); + it('should check cjs config if npm_package_type is module', async () => { + process.env.npm_package_type = 'module'; + const configPath = path.join(__dirname, '..', 'jest-playwright.config.cjs'); + const configObject = { + browsers: ['webkit'], + launchOptions: { + headless: true, + }, + contextOptions: { + foo: true, + }, + }; + fs.writeFileSync(configPath, ''); + jest.mock(path.join(__dirname, '..', 'jest-playwright.config.cjs'), () => configObject, { + virtual: true, + }); + const expectedConfig = { + ...configObject, + exitOnPageError: true, + }; + const config = await readConfig(); + expect(config).toMatchObject(expectedConfig); + delete process.env.npm_package_type; + fs.unlinkSync(configPath); + }); +}); + +describe('generateKey', () => { + const config = { + launchOptions: { + headless: false, + executablePath: '/usr/bin/microsoft-edge', + }, + } as JestPlaywrightConfig; + it('should generate same key for same objects', () => { + const key1 = generateKey('chromium', config); + const key2 = generateKey('chromium', config); + expect(key1).toBe(key2); + }); + + it('should generate different key for different objects', () => { + const chromiumConfig = { + launchOptions: { + headless: false, + executablePath: '/usr/bin/google-chrome-stable', + }, + } as JestPlaywrightConfig; + const key1 = generateKey('chromium', config); + const key2 = generateKey('chromium', chromiumConfig); + expect(key1).not.toBe(key2); + }); +}); + +describe('getDisplayName', () => { + it('should return right display name for passed browser', () => { + expect(getDisplayName('chromium', null)).toBe('browser: chromium'); + }); + + it('should return right display name for passed browser and device', () => { + expect(getDisplayName('chromium', 'iPhone 6')).toBe('browser: chromium device: iPhone 6'); + }); + + it('should return right display name for passed browser and custom device', () => { + const customDevice = { + name: 'Custom device', + viewport: { width: 1920, height: 1080 }, + deviceScaleFactor: 1, + isMobile: false, + hasTouch: false, + }; + expect(getDisplayName('chromium', customDevice)).toBe( + 'browser: chromium device: Custom device' + ); + }); +}); + +describe('getBrowserType', () => { + it('should return "chromium" as default', async () => { + const browserType = getBrowserType(); + expect(browserType).toBe(CHROMIUM); + }); + it('should return passed browser if it is passed', async () => { + const browserType = getBrowserType('firefox'); + expect(browserType).toBe('firefox'); + }); +}); + +describe('getBrowserOptions', () => { + it('should return empty object for empty options', () => { + const options = getBrowserOptions(CHROMIUM); + expect(options).toStrictEqual({}); + }); + + it('should return root options', () => { + const launchOptions = { headless: false }; + const options = getBrowserOptions(CHROMIUM, launchOptions); + expect(options).toStrictEqual(launchOptions); + }); + + it('should return options for defined browser', () => { + const launchOptions = { headless: false, chromium: { headless: true } }; + const options = getBrowserOptions(CHROMIUM, launchOptions); + expect(options).toStrictEqual({ headless: true }); + }); + + it('should return root options for other browser', () => { + const launchOptions = { headless: false, chromium: { headless: true } }; + const options = getBrowserOptions(FIREFOX, launchOptions); + expect(options).toStrictEqual({ headless: false }); + }); + + it('should not mutate original options', () => { + const launchOptions = { headless: false, chromium: { headless: true } }; + const options = getBrowserOptions(FIREFOX, launchOptions); + expect(options).toStrictEqual({ headless: false }); + expect(launchOptions).toStrictEqual({ + headless: false, + chromium: { headless: true }, + }); + }); +}); + +describe('checkBrowserEnv', () => { + it('should throw Error with unknown type', async () => { + const browserType = getBrowserType('unknown' as BrowserType); + expect(() => checkBrowserEnv(browserType)).toThrow(); + }); +}); + +describe('checkDeviceEnv', () => { + it('should throw Error with unknown type', async () => { + const device = 'unknown'; + const devices = ['iPhone 11', 'Pixel 2', 'Nexus 4']; + expect(() => checkDeviceEnv(device, devices)).toThrow(); + }); +}); + +describe('checkDevice', () => { + const devices = { + 'iPhone 11': {}, + 'Pixel 2': {}, + 'Nexus 4': {}, + } as Playwright['devices']; + + it('should not throw Error if device is exist', async () => { + const device = 'Nexus 4'; + expect(() => checkDevice(device, devices)).not.toThrow(); + }); + + it('should not throw Error if device is not string', async () => { + const device = null; + expect(() => checkDevice(device, devices)).not.toThrow(); + }); + + it('should throw Error with unknown type', async () => { + const device = 'unknown'; + expect(() => checkDevice(device, devices)).toThrow(); + }); +}); + +describe('getDeviceBrowserType', () => { + const devices = { + 'iPhone 11': { + defaultBrowserType: 'webkit', + }, + } as Playwright['devices']; + + it('should return "null" as default', async () => { + const device = { + name: 'Custom', + }; + expect(getDeviceBrowserType(device, devices)).toBe(null); + }); + + it('should return default browser if it is defined', async () => { + const device = { + name: 'Custom', + defaultBrowserType: FIREFOX as BrowserType, + }; + expect(getDeviceBrowserType(device, devices)).toBe(FIREFOX); + }); + + it('should return default browser for string device', async () => { + expect(getDeviceBrowserType('iPhone 11', devices)).toBe('webkit'); + }); +}); + +describe('getSkipFlag', () => { + it('should return true if skipOption.browsers includes browserName', async () => { + const skipOptions = { browsers: [CHROMIUM as BrowserType] }; + const skipFlag = getSkipFlag(skipOptions, CHROMIUM, null); + expect(skipFlag).toBe(true); + }); + + it('should return false if skipOption.browsers does not include browserName', async () => { + const skipOptions = { browsers: [CHROMIUM as BrowserType] }; + const skipFlag = getSkipFlag(skipOptions, FIREFOX, null); + expect(skipFlag).toBe(false); + }); + + it('should return true if skipOption.browser includes browserName & skipOption.devices includes deviceName', async () => { + const skipOptions = { + browsers: [CHROMIUM as BrowserType], + devices: /Pixel/, + }; + const skipFlag = getSkipFlag(skipOptions, CHROMIUM, 'Pixel 2'); + expect(skipFlag).toBe(true); + }); + + it('should return true if skipOption.devices is RegExp and match to deviceName', async () => { + const skipOptions = { + browsers: [CHROMIUM as BrowserType], + devices: ['Pixel 2'], + }; + const skipFlag = getSkipFlag(skipOptions, CHROMIUM, 'Pixel 2'); + expect(skipFlag).toBe(true); + }); + + it('should return false if skipOption.browser does not include browserName & skipOption.devices includes deviceName', async () => { + const skipOptions = { + browsers: [CHROMIUM as BrowserType], + devices: ['Pixel 2'], + }; + const skipFlag = getSkipFlag(skipOptions, FIREFOX, 'Pixel 2'); + expect(skipFlag).toBe(false); + }); + + it('should return false if skipOption.browser does not includes browserName & skipOption.devices does not include deviceName', async () => { + const skipOptions = { + browsers: [CHROMIUM as BrowserType], + devices: ['Pixel 2'], + }; + const skipFlag = getSkipFlag(skipOptions, FIREFOX, null); + expect(skipFlag).toBe(false); + }); +}); + +describe('getPlaywrightInstance', () => { + it('should return all instances from playwright package', async () => { + jest.doMock('playwright', () => ({ + firefox: 'firefox', + chromium: 'chromium', + })); + + const { instance } = getPlaywrightInstance(); + expect(instance).toEqual({ + firefox: 'firefox', + chromium: 'chromium', + }); + }); + + it('should return specified instance from playwright package', async () => { + jest.doMock('playwright', () => ({ + firefox: 'firefox', + chromium: 'chromium', + })); + + const { instance } = getPlaywrightInstance('firefox'); + expect(instance).toEqual('firefox'); + }); + + it('should return specified instance from specified playwright package', () => { + jest.doMock('playwright-chromium', () => ({ + chromium: 'chromium', + })); + + const { instance } = getPlaywrightInstance('chromium'); + expect(instance).toEqual('chromium'); + }); + + it('should throw error when playwright package is not provided', () => { + jest.doMock('playwright', () => ({ + chromium: 'chromium', + })); + + const getMissedPlaywrightInstance = () => getPlaywrightInstance('firefox'); + + expect(getMissedPlaywrightInstance).toThrow( + 'jest-playwright-preset: Cannot find playwright package to use firefox' + ); + }); +}); + +describe('deepMerge', () => { + it('should return deeply merged object', () => { + const source = { + viewport: { width: 1440, height: 900 }, + isMobile: false, + storageState: { + origins: [ + { + origin: 'https://google.com', + localStorage: [ + { + name: 'name', + value: 'google', + }, + ], + }, + ], + }, + }; + + const target = { + viewport: { width: 1920, height: 900 }, + isMobile: false, + hasTouch: true, + storageState: { + origins: [ + { + origin: 'https://bing.com', + localStorage: [ + { + name: 'name', + value: 'bing', + }, + ], + }, + ], + }, + }; + + expect(deepMerge(source, target)).toEqual({ + viewport: { width: 1920, height: 900 }, + isMobile: false, + hasTouch: true, + storageState: { + origins: [ + { + origin: 'https://bing.com', + localStorage: [ + { + name: 'name', + value: 'bing', + }, + ], + }, + { + origin: 'https://google.com', + localStorage: [ + { + name: 'name', + value: 'google', + }, + ], + }, + ], + }, + }); + }); +}); diff --git a/src/jest-playwright-preset/utils.ts b/src/jest-playwright-preset/utils.ts new file mode 100644 index 00000000..8abab53f --- /dev/null +++ b/src/jest-playwright-preset/utils.ts @@ -0,0 +1,209 @@ +import fs from 'fs'; +import path from 'path'; +import type { + BrowserType, + ConfigDeviceType, + DeviceType, + JestPlaywrightConfig, + Playwright, + PlaywrightRequireType, + SkipOption, + Options, + Nullable, +} from './types'; +import { + CHROMIUM, + DEFAULT_CONFIG, + FIREFOX, + IMPORT_KIND_PLAYWRIGHT, + WEBKIT, + PACKAGE_NAME, + CONFIG_ENVIRONMENT_NAME, +} from './constants'; + +const fsPromises = fs.promises; +const BROWSERS = [CHROMIUM, FIREFOX, WEBKIT]; + +class PlaywrightError extends Error { + constructor(message: string) { + super(formatError(message)); + this.name = 'PlaywrightError'; + } +} + +export const checkBrowserEnv = (param: BrowserType): void => { + if (!BROWSERS.includes(param)) { + throw new PlaywrightError( + `Wrong browser type. Should be one of [${BROWSERS.join(', ')}], but got ${param}` + ); + } +}; + +/* eslint-disable @typescript-eslint/no-explicit-any*/ +const isObject = (item: any) => { + return item && typeof item === 'object' && !Array.isArray(item); +}; + +export const deepMerge = >(target: T, source: T): T => { + let output = { ...target }; + const keys: (keyof T)[] = Object.keys(source); + if (isObject(target) && isObject(source)) { + keys.forEach((key) => { + if (Array.isArray(source[key]) && Array.isArray(target[key])) { + output = { ...output, [key]: [...source[key], ...target[key]] }; + } else if (isObject(source[key])) { + if (!(key in target)) { + output = { ...output, [key]: source[key] }; + } else { + output[key] = deepMerge(target[key], source[key]); + } + } else { + output = { ...output, [key]: source[key] }; + } + }); + } + return output; +}; + +export const checkDeviceEnv = (device: string, availableDevices: string[]): void => { + if (!availableDevices.includes(device)) { + throw new PlaywrightError( + `Wrong device. Should be one of [${availableDevices}], but got ${device}` + ); + } +}; + +export const checkDevice = (device: DeviceType, availableDevices: Playwright['devices']): void => { + if (typeof device === 'string') { + const availableDeviceNames = Object.keys(availableDevices); + checkDeviceEnv(device, availableDeviceNames); + } +}; + +export const getDisplayName = (browser: string, device: DeviceType): string => { + const result = `browser: ${browser}`; + if (device !== null) { + if (typeof device === 'string') { + return `${result} device: ${device}`; + } + if (device.name) { + return `${result} device: ${device.name}`; + } + } + return result; +}; + +export const getBrowserType = (browser?: BrowserType): BrowserType => { + return browser || CHROMIUM; +}; + +export const generateKey = (browser: BrowserType, config: JestPlaywrightConfig): string => + `${browser}${JSON.stringify(config)}`; + +export const getDeviceBrowserType = ( + device: ConfigDeviceType, + availableDevices: Playwright['devices'] +): Nullable => { + if (typeof device === 'string') { + return availableDevices[device].defaultBrowserType as BrowserType; + } + + return device?.defaultBrowserType || null; +}; + +export const getPlaywrightInstance = (browserName?: BrowserType): Playwright => { + let pw; + let name: PlaywrightRequireType; + if (!browserName) { + pw = require(IMPORT_KIND_PLAYWRIGHT); + name = IMPORT_KIND_PLAYWRIGHT; + return { + name, + instance: pw, + devices: pw['devices'], + }; + } + try { + pw = require(`${IMPORT_KIND_PLAYWRIGHT}-${browserName}`); + name = browserName; + } catch (e) { + try { + pw = require(IMPORT_KIND_PLAYWRIGHT); + name = IMPORT_KIND_PLAYWRIGHT; + } catch (e) { + throw new PlaywrightError(`Cannot find playwright package to use ${browserName}`); + } + } + if (!pw[browserName]) { + throw new PlaywrightError(`Cannot find playwright package to use ${browserName}`); + } + return { + name, + instance: pw[browserName], + devices: pw['devices'], + }; +}; + +export function getBrowserOptions>( + browserName: BrowserType, + options?: Options +): T { + let result: Options = options ? { ...options } : ({} as Options); + if (result[browserName]) { + result = deepMerge(result, result[browserName]!); + } + BROWSERS.forEach((browser) => { + delete result![browser as BrowserType]; + }); + return result as T; +} + +export const getSkipFlag = ( + skipOptions: SkipOption, + browserName: BrowserType, + deviceName: Nullable +): boolean => { + const { browsers, devices } = skipOptions; + const isBrowserIncluded = browsers.includes(browserName); + if (!devices) { + return isBrowserIncluded; + } else { + if (devices instanceof RegExp) { + return isBrowserIncluded && devices.test(deviceName!); + } + return isBrowserIncluded && devices.includes(deviceName!); + } +}; + +export const readConfig = async ( + rootDir = process.cwd(), + jestEnvConfig?: JestPlaywrightConfig +): Promise => { + if (jestEnvConfig) { + return { ...DEFAULT_CONFIG, ...jestEnvConfig }; + } + const { JEST_PLAYWRIGHT_CONFIG, npm_package_type } = process.env; + const fileExtension = npm_package_type === 'module' ? 'cjs' : 'js'; + const configPath = JEST_PLAYWRIGHT_CONFIG || `${CONFIG_ENVIRONMENT_NAME}.config.${fileExtension}`; + const absConfigPath = path.resolve(rootDir, configPath); + try { + await fsPromises.access(absConfigPath); + } catch (e) { + if (JEST_PLAYWRIGHT_CONFIG) { + throw new PlaywrightError( + `Can't find a root directory while resolving a config file path.\nProvided path to resolve: ${configPath}` + ); + } else { + return DEFAULT_CONFIG; + } + } + + const localConfig = await require(absConfigPath); + if (typeof localConfig === 'function') { + const config = await localConfig(); + return { ...DEFAULT_CONFIG, ...config }; + } + return { ...DEFAULT_CONFIG, ...localConfig }; +}; + +export const formatError = (error: string): string => `${PACKAGE_NAME}: ${error}`; diff --git a/src/test-storybook.ts b/src/test-storybook.ts index b763c28d..6dfd74c2 100644 --- a/src/test-storybook.ts +++ b/src/test-storybook.ts @@ -1,25 +1,23 @@ #!/usr/bin/env node -import fs from 'fs'; -import { execSync } from 'child_process'; -import fetch from 'node-fetch'; import { canBindToHost } from 'can-bind-to-host'; -import dedent from 'ts-dedent'; -import path from 'path'; -import { join, resolve } from 'path'; -import tempy from 'tempy'; -import { fileURLToPath } from 'url'; -import { createRequire } from 'module'; +import { glob } from 'glob'; +import { execSync, spawn } from 'node:child_process'; +import fs from 'node:fs'; +import { createRequire } from 'node:module'; +import { fileURLToPath } from 'node:url'; +import path, { join, resolve } from 'pathe'; import { getInterpretedFile } from 'storybook/internal/common'; import { readConfig } from 'storybook/internal/csf-tools'; import { telemetry } from 'storybook/internal/telemetry'; -import { glob } from 'glob'; +import tempy from 'tempy'; +import dedent from 'ts-dedent'; +import { TestRunnerConfig } from './playwright/hooks.js'; +import { transformPlaywrightJson } from './playwright/transformPlaywrightJson.js'; import { JestOptions, getCliOptions } from './util/getCliOptions.js'; import { getStorybookMetadata } from './util/getStorybookMetadata.js'; import { getTestRunnerConfig } from './util/getTestRunnerConfig.js'; -import { transformPlaywrightJson } from './playwright/transformPlaywrightJson.js'; -import { TestRunnerConfig } from './playwright/hooks.js'; // Get the current file's directory in ESM const __filename2 = fileURLToPath(import.meta.url); @@ -156,14 +154,52 @@ async function executeJestPlaywright(args: JestOptions) { userDefinedJestConfig || path.resolve(__dirname, path.join('..', 'playwright', 'test-runner-jest.config.js')); - const command = `node --experimental-vm-modules ${jestPath} ${argv.join( + const command = `node --experimental-vm-modules "${jestPath}" ${argv.join( ' ' - )} --config ${jestConfigPath}`; + )} --config "${jestConfigPath}" --color`; + + const runThing = async (type: 'previous' | 'current') => { + if (type === 'previous') { + execSync(command, { + stdio: 'inherit', + cwd: process.cwd(), + }); + } else { + const child = spawn(command, { + shell: true, + cwd: process.cwd(), + stdio: ['inherit', 'pipe'], + }); + const shouldLog = (str: string) => { + return ( + !str.includes('watchman') && + !str.includes('DeprecationWarning') && + !str.includes('ExperimentalWarning') + ); + }; + const exitCode = await new Promise((resolve) => { + // filter out messages like DeprecationWarning and ExperimentalWarning + child.stdout?.on('data', (data) => { + const str = data.toString(); + if (shouldLog(str)) { + process.stdout.write(data); + } + }); + child.stderr?.on('data', (data) => { + const str = data.toString(); + if (shouldLog(str)) { + process.stderr.write(data); + } + }); + + child.on('exit', (exitCode) => resolve(exitCode || 0)); + }); + + process.exit(exitCode); + } + }; - execSync(command, { - stdio: 'inherit', - cwd: process.cwd(), - }); + await runThing('previous'); } async function checkStorybook(url: string) { diff --git a/src/util/getCliOptions.ts b/src/util/getCliOptions.ts index af4e4a12..13fa5b0e 100644 --- a/src/util/getCliOptions.ts +++ b/src/util/getCliOptions.ts @@ -1,5 +1,5 @@ import { getParsedCliOptions } from './getParsedCliOptions'; -import type { BrowserType } from 'jest-playwright-preset'; +import type { BrowserType } from '../jest-playwright-preset/types'; export type JestOptions = string[]; diff --git a/test-runner-jest.config.js b/test-runner-jest.config.js index aee3212d..34f75596 100644 --- a/test-runner-jest.config.js +++ b/test-runner-jest.config.js @@ -21,8 +21,8 @@ export default { '^.+\\.(story|stories)\\.[jt]sx?$': './playwright/transform.js', '^.+\\.[jt]sx?$': '@swc/jest', }, - globalSetup: './playwright/global-setup.js', - globalTeardown: './playwright/global-teardown.js', + globalSetup: './dist/jest-playwright-entries/setup.js', + globalTeardown: './dist/jest-playwright-entries/teardown.js', testEnvironment: './playwright/custom-environment.js', setupFilesAfterEnv: ['./playwright/jest-setup.js'], // transformIgnorePatterns for the storybook package and make sure swc jest ignores it too diff --git a/tsup.config.ts b/tsup.config.ts index ebede2b9..0e99cf0a 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -5,7 +5,15 @@ import { builtinModules } from 'node:module'; export default defineConfig([ { clean: true, - entry: ['./src/index.ts', './src/test-storybook.ts'], + entry: [ + './src/index.ts', + './src/test-storybook.ts', + './src/jest-playwright-entries/extends.ts', + './src/jest-playwright-entries/setup.ts', + './src/jest-playwright-entries/teardown.ts', + './src/jest-playwright-entries/test-environment.ts', + './src/jest-playwright-entries/runner.ts', + ], format: ['esm'], splitting: false, dts: true, diff --git a/yarn.lock b/yarn.lock index a1ba66c8..9eaad4a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1934,44 +1934,58 @@ __metadata: languageName: node linkType: hard -"@jest/core@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/core@npm:30.0.4" +"@jest/console@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/console@npm:30.0.5" dependencies: - "@jest/console": "npm:30.0.4" + "@jest/types": "npm:30.0.5" + "@types/node": "npm:*" + chalk: "npm:^4.1.2" + jest-message-util: "npm:30.0.5" + jest-util: "npm:30.0.5" + slash: "npm:^3.0.0" + checksum: 10/df991610228b3544c5d93282d144f211960c526f2699a9f25bf6e9f76fbc1e7fbcdf7df994da6b55f44f5459aafee3e78a4d323d59f6ac3ca614ccd07841060f + languageName: node + linkType: hard + +"@jest/core@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/core@npm:30.0.5" + dependencies: + "@jest/console": "npm:30.0.5" "@jest/pattern": "npm:30.0.1" - "@jest/reporters": "npm:30.0.4" - "@jest/test-result": "npm:30.0.4" - "@jest/transform": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/reporters": "npm:30.0.5" + "@jest/test-result": "npm:30.0.5" + "@jest/transform": "npm:30.0.5" + "@jest/types": "npm:30.0.5" "@types/node": "npm:*" ansi-escapes: "npm:^4.3.2" chalk: "npm:^4.1.2" ci-info: "npm:^4.2.0" exit-x: "npm:^0.2.2" graceful-fs: "npm:^4.2.11" - jest-changed-files: "npm:30.0.2" - jest-config: "npm:30.0.4" - jest-haste-map: "npm:30.0.2" - jest-message-util: "npm:30.0.2" + jest-changed-files: "npm:30.0.5" + jest-config: "npm:30.0.5" + jest-haste-map: "npm:30.0.5" + jest-message-util: "npm:30.0.5" jest-regex-util: "npm:30.0.1" - jest-resolve: "npm:30.0.2" - jest-resolve-dependencies: "npm:30.0.4" - jest-runner: "npm:30.0.4" - jest-runtime: "npm:30.0.4" - jest-snapshot: "npm:30.0.4" - jest-util: "npm:30.0.2" - jest-validate: "npm:30.0.2" - jest-watcher: "npm:30.0.4" + jest-resolve: "npm:30.0.5" + jest-resolve-dependencies: "npm:30.0.5" + jest-runner: "npm:30.0.5" + jest-runtime: "npm:30.0.5" + jest-snapshot: "npm:30.0.5" + jest-util: "npm:30.0.5" + jest-validate: "npm:30.0.5" + jest-watcher: "npm:30.0.5" micromatch: "npm:^4.0.8" - pretty-format: "npm:30.0.2" + pretty-format: "npm:30.0.5" slash: "npm:^3.0.0" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - checksum: 10/6e880306a01ec3c9697b95a29b45f088d731640fd022c67d5d4da29b1f3f27f29e89aefa6b940a04cd7e534aac91dac6d20b09469feae8ed946f1e82fb609b4a + checksum: 10/8299628ce0e2552361a5ddd5b4df3f0999c5f6eda00e16ae8e80f9640127776ea38eaa2893821606ccb8e6dc16855f18212cbc98213bd908625002824febc2bc languageName: node linkType: hard @@ -1991,15 +2005,15 @@ __metadata: languageName: node linkType: hard -"@jest/environment@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/environment@npm:30.0.4" +"@jest/environment@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/environment@npm:30.0.5" dependencies: - "@jest/fake-timers": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/fake-timers": "npm:30.0.5" + "@jest/types": "npm:30.0.5" "@types/node": "npm:*" - jest-mock: "npm:30.0.2" - checksum: 10/d3fbb1f8263928d110a87ac6ab5a33221a54609fd56b2ce60bffadf7ea9cf2f4e3ae7929c5072d25b55fd4bf672dc785339443963860cc0ceeb269e74e8bd4c4 + jest-mock: "npm:30.0.5" + checksum: 10/b7104cd1dbb5d7e0ed250df959fd98cdc6cbc05d2f0b8a4bf0d8d24121d74e263b94df3fb0d967a382e2ac0003adcbd44a121fbffb2e03f30a26aa7117c52c76 languageName: node linkType: hard @@ -2012,27 +2026,36 @@ __metadata: languageName: node linkType: hard -"@jest/expect@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/expect@npm:30.0.4" +"@jest/expect-utils@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/expect-utils@npm:30.0.5" dependencies: - expect: "npm:30.0.4" - jest-snapshot: "npm:30.0.4" - checksum: 10/9dbf6085a2502783a5993c194c86973a973837b4481c91de30d6db6264ad2091f015bb1fb01e60017ee82f96314aca41f833d077a50ead477510be39f076fa84 + "@jest/get-type": "npm:30.0.1" + checksum: 10/0d0a4b16bf593a6b1eca0a286e99a3b0d4b27d9c1e15819aa5b8fabb113ef2eda450a04deb35de08381dbae90ae8e14532b7f63ab600187cdf9180d0e4969ed5 languageName: node linkType: hard -"@jest/fake-timers@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/fake-timers@npm:30.0.4" +"@jest/expect@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/expect@npm:30.0.5" dependencies: - "@jest/types": "npm:30.0.1" + expect: "npm:30.0.5" + jest-snapshot: "npm:30.0.5" + checksum: 10/e51954d86941b05641f1a0aa0fb9ec10ea82008feabdd085c7b05a97d3a84cc5f9fc5cd7f15822bcde0648f233717911d2f2891b3870ac3caf95d10d42b00da8 + languageName: node + linkType: hard + +"@jest/fake-timers@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/fake-timers@npm:30.0.5" + dependencies: + "@jest/types": "npm:30.0.5" "@sinonjs/fake-timers": "npm:^13.0.0" "@types/node": "npm:*" - jest-message-util: "npm:30.0.2" - jest-mock: "npm:30.0.2" - jest-util: "npm:30.0.2" - checksum: 10/42b1e05c1e06a16e3964643f22cfa06a34fef282f3cb43f18b66caf6b1fa04a8a2ce79bb047f81b51007dc48efabd8200c0805bc394ca4fcbbe55f069419775b + jest-message-util: "npm:30.0.5" + jest-mock: "npm:30.0.5" + jest-util: "npm:30.0.5" + checksum: 10/5c3b3ad1c940c24b64f77b9ba953b627a8f648bc4dbdba03f497cc9257dc220fd7efedd2f855d9e49c84079e1ff2cbb0e1d1a9e8beb460a0ce7c07ff0ac348fc languageName: node linkType: hard @@ -2043,15 +2066,15 @@ __metadata: languageName: node linkType: hard -"@jest/globals@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/globals@npm:30.0.4" +"@jest/globals@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/globals@npm:30.0.5" dependencies: - "@jest/environment": "npm:30.0.4" - "@jest/expect": "npm:30.0.4" - "@jest/types": "npm:30.0.1" - jest-mock: "npm:30.0.2" - checksum: 10/5dda77a36d768c57389603e1d22d05ac24c916f2e82f3766f57398ae8a835cfb69746c75b76906abdbc1e39da0c1863f68a93167c20317f38bade7500c861b71 + "@jest/environment": "npm:30.0.5" + "@jest/expect": "npm:30.0.5" + "@jest/types": "npm:30.0.5" + jest-mock: "npm:30.0.5" + checksum: 10/44091f5d8386bf5cadd7d36e2fb36b0794b2dd1e0c866d4cecceaf12f9304bb139544a597b1d1edf4c8158baa5684042bcfda4bc9a5603bd2c41c17509c4151b languageName: node linkType: hard @@ -2065,15 +2088,15 @@ __metadata: languageName: node linkType: hard -"@jest/reporters@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/reporters@npm:30.0.4" +"@jest/reporters@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/reporters@npm:30.0.5" dependencies: "@bcoe/v8-coverage": "npm:^0.2.3" - "@jest/console": "npm:30.0.4" - "@jest/test-result": "npm:30.0.4" - "@jest/transform": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/console": "npm:30.0.5" + "@jest/test-result": "npm:30.0.5" + "@jest/transform": "npm:30.0.5" + "@jest/types": "npm:30.0.5" "@jridgewell/trace-mapping": "npm:^0.3.25" "@types/node": "npm:*" chalk: "npm:^4.1.2" @@ -2086,9 +2109,9 @@ __metadata: istanbul-lib-report: "npm:^3.0.0" istanbul-lib-source-maps: "npm:^5.0.0" istanbul-reports: "npm:^3.1.3" - jest-message-util: "npm:30.0.2" - jest-util: "npm:30.0.2" - jest-worker: "npm:30.0.2" + jest-message-util: "npm:30.0.5" + jest-util: "npm:30.0.5" + jest-worker: "npm:30.0.5" slash: "npm:^3.0.0" string-length: "npm:^4.0.2" v8-to-istanbul: "npm:^9.0.1" @@ -2097,7 +2120,7 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 10/2005270e2f778741ae1117d181d2fd4ffa3bdd6fa69764a14e70978c90d4601b1538df83d0f4990e87d0452460407736869dd586a5c519b50607660c588f0a8a + checksum: 10/8272e6dbe26fc1252fc54fe147be188a13ff577a96f523964b16b3fede87a6f648949256423537720a2ac179f9e5050c349afb995922a9874f4cf4480d15021e languageName: node linkType: hard @@ -2119,15 +2142,15 @@ __metadata: languageName: node linkType: hard -"@jest/snapshot-utils@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/snapshot-utils@npm:30.0.4" +"@jest/snapshot-utils@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/snapshot-utils@npm:30.0.5" dependencies: - "@jest/types": "npm:30.0.1" + "@jest/types": "npm:30.0.5" chalk: "npm:^4.1.2" graceful-fs: "npm:^4.2.11" natural-compare: "npm:^1.4.0" - checksum: 10/baf70f72c20968f69e5df9704afa94ad1533703b9ce01257091317e7c33529fc02fc16d178cf184c00c5b99235c8eab0a0ea562b48eea5218f1ae7c3d6d79295 + checksum: 10/f132296d8851c562f6c44d78ea29c7c216d0498e24f45b5f6c1113a2f1c5de61841e398cb90cfaf36dc9370a95d4e9c7ccbc0f88e348aa835d81f3523da7f002 languageName: node linkType: hard @@ -2154,38 +2177,50 @@ __metadata: languageName: node linkType: hard -"@jest/test-sequencer@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/test-sequencer@npm:30.0.4" +"@jest/test-result@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/test-result@npm:30.0.5" dependencies: - "@jest/test-result": "npm:30.0.4" + "@jest/console": "npm:30.0.5" + "@jest/types": "npm:30.0.5" + "@types/istanbul-lib-coverage": "npm:^2.0.6" + collect-v8-coverage: "npm:^1.0.2" + checksum: 10/41682497c98f5b8b2b9e81e3ce3a540418bdca7bce358b4dddf3c63abdb90d57476d89042ebc98e0acd5ea870ace17e1ed3b4b45df05e32cdaa970c1e4aca0d9 + languageName: node + linkType: hard + +"@jest/test-sequencer@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/test-sequencer@npm:30.0.5" + dependencies: + "@jest/test-result": "npm:30.0.5" graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.0.2" + jest-haste-map: "npm:30.0.5" slash: "npm:^3.0.0" - checksum: 10/390bd726e50538d88eacfd6615bc1b4fb6f4ab7b034c0eef5b1ca2860474d126f60aa9615e8143defcbc2fb3d192f7557f0ed47f24d9fee2567fb1432a017a15 + checksum: 10/f73ce9513d858861602c74f5e04124f2b9e3718faed9efaa1b7de1ffbab1d388e9698e3e10b80f0d8f4cf87d3fd3e67f2b39ab9e6f1429d3779f7bad8fac98de languageName: node linkType: hard -"@jest/transform@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/transform@npm:30.0.4" +"@jest/transform@npm:30.0.5": + version: 30.0.5 + resolution: "@jest/transform@npm:30.0.5" dependencies: "@babel/core": "npm:^7.27.4" - "@jest/types": "npm:30.0.1" + "@jest/types": "npm:30.0.5" "@jridgewell/trace-mapping": "npm:^0.3.25" babel-plugin-istanbul: "npm:^7.0.0" chalk: "npm:^4.1.2" convert-source-map: "npm:^2.0.0" fast-json-stable-stringify: "npm:^2.1.0" graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.0.2" + jest-haste-map: "npm:30.0.5" jest-regex-util: "npm:30.0.1" - jest-util: "npm:30.0.2" + jest-util: "npm:30.0.5" micromatch: "npm:^4.0.8" pirates: "npm:^4.0.7" slash: "npm:^3.0.0" write-file-atomic: "npm:^5.0.1" - checksum: 10/aa66bf05a64cbf7cf765cef8053fc703fedef1c15ae4110d114cb08b9ceddb2db0403b4a009f2696d0794aed4d3463341b3e3591a16fc6284548ce7b8b24d74b + checksum: 10/2b3e0bc39aa6ff0c521f9fff4724e3ca1d720cd51f6fd3a97a18d832f66b3f7d021f38fb2d26053461a32577ef187fe5e2d636050be419aefd0d06d23ea1d35a languageName: node linkType: hard @@ -2925,7 +2960,9 @@ __metadata: "@swc/jest": "npm:^0.2.38" "@types/jest": "npm:^30.0.0" "@types/node": "npm:^24.0.10" - "@types/node-fetch": "npm:^2.6.12" + "@types/uuid": "npm:^8.3.4" + "@typescript-eslint/eslint-plugin": "npm:5.30.7" + "@typescript-eslint/parser": "npm:5.30.7" "@vitejs/plugin-react": "npm:^4.0.3" "@vitest/coverage-v8": "npm:^3.2.4" auto: "npm:^11.1.6" @@ -2937,30 +2974,34 @@ __metadata: expect-playwright: "npm:^0.8.0" glob: "npm:^10.2.2" husky: "npm:^8.0.0" - jest: "npm:^30.0.4" - jest-circus: "npm:^30.0.4" - jest-environment-node: "npm:^30.0.4" + jest: "npm:^30.0.0" + jest-circus: "npm:^30.0.0" + jest-environment-node: "npm:^30.0.0" jest-image-snapshot: "npm:^6.2.0" jest-junit: "npm:^16.0.0" - jest-playwright-preset: "npm:^4.0.0" - jest-runner: "npm:^30.0.4" + jest-process-manager: "npm:^0.4.0" + jest-runner: "npm:^30.0.0" jest-serializer-html: "npm:^7.1.0" jest-watch-typeahead: "npm:^3.0.1" lint-staged: "npm:^13.0.3" - node-fetch: "npm:^3.3.2" nyc: "npm:^15.1.0" + pathe: "npm:^2.0.3" pkg-up: "npm:^5.0.0" - playwright: "npm:^1.14.0" + playwright: "npm:>=1.24.0" + playwright-chromium: "npm:>=1.24.0" + playwright-core: "npm:>=1.2.0" prettier: "npm:^2.8.1" react: "npm:^17.0.1" react-dom: "npm:^17.0.1" read-pkg-up: "npm:^7.0.1" + rimraf: "npm:^3.0.2" storybook: "npm:0.0.0-pr-31819-sha-7e336af7" tempy: "npm:^1.0.1" ts-dedent: "npm:^2.0.0" ts-jest: "npm:^29.4.0" tsup: "npm:^8.5.0" typescript: "npm:^5.8.3" + uuid: "npm:^8.3.2" vite: "npm:^7.0.5" vitest: "npm:^3.2.4" wait-on: "npm:^7.2.0" @@ -3297,7 +3338,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.5": +"@types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -3311,16 +3352,6 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.6.12": - version: 2.6.12 - resolution: "@types/node-fetch@npm:2.6.12" - dependencies: - "@types/node": "npm:*" - form-data: "npm:^4.0.0" - checksum: 10/8107c479da83a3114fcbfa882eba95ee5175cccb5e4dd53f737a96f2559ae6262f662176b8457c1656de09ec393cc7b20a266c077e4bfb21e929976e1cf4d0f9 - languageName: node - linkType: hard - "@types/node@npm:*, @types/node@npm:^24.0.10": version: 24.0.10 resolution: "@types/node@npm:24.0.10" @@ -3358,6 +3389,13 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:^8.3.4": + version: 8.3.4 + resolution: "@types/uuid@npm:8.3.4" + checksum: 10/6f11f3ff70f30210edaa8071422d405e9c1d4e53abbe50fdce365150d3c698fe7bbff65c1e71ae080cbfb8fded860dbb5e174da96fdbbdfcaa3fb3daa474d20f + languageName: node + linkType: hard + "@types/wait-on@npm:^5.2.0": version: 5.3.4 resolution: "@types/wait-on@npm:5.3.4" @@ -3383,6 +3421,123 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:5.30.7": + version: 5.30.7 + resolution: "@typescript-eslint/eslint-plugin@npm:5.30.7" + dependencies: + "@typescript-eslint/scope-manager": "npm:5.30.7" + "@typescript-eslint/type-utils": "npm:5.30.7" + "@typescript-eslint/utils": "npm:5.30.7" + debug: "npm:^4.3.4" + functional-red-black-tree: "npm:^1.0.1" + ignore: "npm:^5.2.0" + regexpp: "npm:^3.2.0" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependencies: + "@typescript-eslint/parser": ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/d5c20c33a0232650bad3bc086f44823253dcaa27e9f105d90aebe86dba2c21ee4b055eb617719ad69539127a0a73372f6dcdd40536e5b320c6f6501ffda8ea29 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:5.30.7": + version: 5.30.7 + resolution: "@typescript-eslint/parser@npm:5.30.7" + dependencies: + "@typescript-eslint/scope-manager": "npm:5.30.7" + "@typescript-eslint/types": "npm:5.30.7" + "@typescript-eslint/typescript-estree": "npm:5.30.7" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/a6a581f4781109c833aacd42ba8fffb00f54b75af86a8b5150f89005ae73d15df36e857adb8a03b65c55ce1df08b658ae9530ac39dfc4c990790dba277b936de + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:5.30.7": + version: 5.30.7 + resolution: "@typescript-eslint/scope-manager@npm:5.30.7" + dependencies: + "@typescript-eslint/types": "npm:5.30.7" + "@typescript-eslint/visitor-keys": "npm:5.30.7" + checksum: 10/313d55509a3948a8d2cf6835dfd76c46ebc45d46cdb8fa2044ce962cf305867cd50f81ab5f5505ce0c0c90e266f50a38c99bf5c50e0e02ed9e47ae9f6b0e422d + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:5.30.7": + version: 5.30.7 + resolution: "@typescript-eslint/type-utils@npm:5.30.7" + dependencies: + "@typescript-eslint/utils": "npm:5.30.7" + debug: "npm:^4.3.4" + tsutils: "npm:^3.21.0" + peerDependencies: + eslint: "*" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/d81aef27ec5a24187462e2739daabffc72a3324436b58832f718fc5c173eb903918760247d5e12ee027bbeb463f96bfd9bd0cfbf245fb09659033a462d164214 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:5.30.7": + version: 5.30.7 + resolution: "@typescript-eslint/types@npm:5.30.7" + checksum: 10/425f8f12d451d0ec5a2d2789d5a4aef9b4e2ed2100069120b031abd251f9ad9bceee63a172f69e0c8f5d77cad1797f2834af6e29b07eed2278b3f0547c884ffa + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:5.30.7": + version: 5.30.7 + resolution: "@typescript-eslint/typescript-estree@npm:5.30.7" + dependencies: + "@typescript-eslint/types": "npm:5.30.7" + "@typescript-eslint/visitor-keys": "npm:5.30.7" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/126c3c37ef585116de14e4c6ba4aeeb80d48a8ec805bc2751463fd3b8343cfb5eddf41d6867f1b4e2c3dee00d6d55d87dcd503fe86f49b027053af505595cc85 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:5.30.7": + version: 5.30.7 + resolution: "@typescript-eslint/utils@npm:5.30.7" + dependencies: + "@types/json-schema": "npm:^7.0.9" + "@typescript-eslint/scope-manager": "npm:5.30.7" + "@typescript-eslint/types": "npm:5.30.7" + "@typescript-eslint/typescript-estree": "npm:5.30.7" + eslint-scope: "npm:^5.1.1" + eslint-utils: "npm:^3.0.0" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10/0147596a9451bcae15722aca11ac0dea80937ae813bfdb597810f99ec9d1a541bf46c09665b0a9a57ca4f1310db3b44752e29c055d0757170657dabbe82dd758 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.30.7": + version: 5.30.7 + resolution: "@typescript-eslint/visitor-keys@npm:5.30.7" + dependencies: + "@typescript-eslint/types": "npm:5.30.7" + eslint-visitor-keys: "npm:^3.3.0" + checksum: 10/c91992ca597e974d0bca641258d3c951afd677a27c78c6c4468f685e9b87c7847164a25224752f8120f88b23a16530ddbfa408a9e118d32e67a3cf97a0fe95b1 + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.3.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" @@ -4001,11 +4156,11 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:30.0.4": - version: 30.0.4 - resolution: "babel-jest@npm:30.0.4" +"babel-jest@npm:30.0.5": + version: 30.0.5 + resolution: "babel-jest@npm:30.0.5" dependencies: - "@jest/transform": "npm:30.0.4" + "@jest/transform": "npm:30.0.5" "@types/babel__core": "npm:^7.20.5" babel-plugin-istanbul: "npm:^7.0.0" babel-preset-jest: "npm:30.0.1" @@ -4014,7 +4169,7 @@ __metadata: slash: "npm:^3.0.0" peerDependencies: "@babel/core": ^7.11.0 - checksum: 10/d037075c343dfdf77fc3a22c3cafb9cd1966f002426439a7c66d12af37e74bbb7040b867bf7691004f4802134bac32fa040a473db86163afae4847ef33c9bf0a + checksum: 10/39a36b86484e8d545ff0f83c81fccd4952e6fc68b98015fd72a03ba2a5650edde20412fdf92328200a5cbdd0aed6f1c2982269f590fb0e5f131e0a2533436c81 languageName: node linkType: hard @@ -4766,13 +4921,6 @@ __metadata: languageName: node linkType: hard -"data-uri-to-buffer@npm:^4.0.0": - version: 4.0.1 - resolution: "data-uri-to-buffer@npm:4.0.1" - checksum: 10/0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c - languageName: node - linkType: hard - "date-fns@npm:^2.29.1": version: 2.30.0 resolution: "date-fns@npm:2.30.0" @@ -5272,7 +5420,35 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.4.1": +"eslint-scope@npm:^5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^4.1.1" + checksum: 10/c541ef384c92eb5c999b7d3443d80195fcafb3da335500946f6db76539b87d5826c8f2e1d23bf6afc3154ba8cd7c8e566f8dc00f1eea25fdf3afc8fb9c87b238 + languageName: node + linkType: hard + +"eslint-utils@npm:^3.0.0": + version: 3.0.0 + resolution: "eslint-utils@npm:3.0.0" + dependencies: + eslint-visitor-keys: "npm:^2.0.0" + peerDependencies: + eslint: ">=5" + checksum: 10/7675260a6b220c70f13e4cdbf077e93cad0dfb388429a27d6c0b584b2b20dca24594508e8bdb00a460a5764bd364a5018e20c2b8b1d70f82bcc3fdc30692a4d2 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^2.0.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: 10/db4547eef5039122d518fa307e938ceb8589da5f6e8f5222efaf14dd62f748ce82e2d2becd3ff9412a50350b726bda95dbea8515a471074547daefa58aee8735 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b @@ -5300,6 +5476,29 @@ __metadata: languageName: node linkType: hard +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10/44ffcd89e714ea6b30143e7f119b104fc4d75e77ee913f34d59076b40ef2d21967f84e019f84e1fd0465b42cdbf725db449f232b5e47f29df29ed76194db8e16 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: 10/3f67ad02b6dbfaddd9ea459cf2b6ef4ecff9a6082a7af9d22e445b9abc082ad9ca47e1825557b293fcdae477f4714e561123e30bb6a5b2f184fb2bad4a9497eb + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10/37cbe6e9a68014d34dbdc039f90d0baf72436809d02edffcc06ba3c2a12eb298048f877511353b130153e532aac8d68ba78430c0dd2f44806ebc7c014b01585e + languageName: node + linkType: hard + "estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" @@ -5401,7 +5600,21 @@ __metadata: languageName: node linkType: hard -"expect@npm:30.0.4, expect@npm:^30.0.0": +"expect@npm:30.0.5": + version: 30.0.5 + resolution: "expect@npm:30.0.5" + dependencies: + "@jest/expect-utils": "npm:30.0.5" + "@jest/get-type": "npm:30.0.1" + jest-matcher-utils: "npm:30.0.5" + jest-message-util: "npm:30.0.5" + jest-mock: "npm:30.0.5" + jest-util: "npm:30.0.5" + checksum: 10/48ee8a444bfb7c6b23ca9b416a43f6c418ab698b1c3f59848d711d13b362a393dcc7d30b97ce73e0a15959a98644f51a600e6d76e20091aa7016441899b1e9c4 + languageName: node + linkType: hard + +"expect@npm:^30.0.0": version: 30.0.4 resolution: "expect@npm:30.0.4" dependencies: @@ -5486,16 +5699,6 @@ __metadata: languageName: node linkType: hard -"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": - version: 3.2.0 - resolution: "fetch-blob@npm:3.2.0" - dependencies: - node-domexception: "npm:^1.0.0" - web-streams-polyfill: "npm:^3.0.3" - checksum: 10/5264ecceb5fdc19eb51d1d0359921f12730941e333019e673e71eb73921146dceabcb0b8f534582be4497312d656508a439ad0f5edeec2b29ab2e10c72a1f86b - languageName: node - linkType: hard - "figures@npm:^2.0.0": version: 2.0.0 resolution: "figures@npm:2.0.0" @@ -5667,15 +5870,6 @@ __metadata: languageName: node linkType: hard -"formdata-polyfill@npm:^4.0.10": - version: 4.0.10 - resolution: "formdata-polyfill@npm:4.0.10" - dependencies: - fetch-blob: "npm:^3.1.2" - checksum: 10/9b5001d2edef3c9449ac3f48bd4f8cc92e7d0f2e7c1a5c8ba555ad4e77535cc5cf621fabe49e97f304067037282dd9093b9160a3cb533e46420b446c4e6bc06f - languageName: node - linkType: hard - "fp-ts@npm:^2.5.3": version: 2.16.1 resolution: "fp-ts@npm:2.16.1" @@ -5774,6 +5968,13 @@ __metadata: languageName: node linkType: hard +"functional-red-black-tree@npm:^1.0.1": + version: 1.0.1 + resolution: "functional-red-black-tree@npm:1.0.1" + checksum: 10/debe73e92204341d1fa5f89614e44284d3add26dee660722978d8c50829170f87d1c74768f68c251d215ae461c11db7bac13101c77f4146ff051da75466f7a12 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -5897,7 +6098,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.0.1": +"globby@npm:^11.0.1, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -6248,7 +6449,7 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -6512,58 +6713,58 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:30.0.2": - version: 30.0.2 - resolution: "jest-changed-files@npm:30.0.2" +"jest-changed-files@npm:30.0.5": + version: 30.0.5 + resolution: "jest-changed-files@npm:30.0.5" dependencies: execa: "npm:^5.1.1" - jest-util: "npm:30.0.2" + jest-util: "npm:30.0.5" p-limit: "npm:^3.1.0" - checksum: 10/34899f908f4ed5c95e9993ca31a49faaa1b641d557277238388348f875a3cb04f358ed411de6e496e353cb68c85a53819a53b6e5cfffe20b13c303d601c78ac7 + checksum: 10/cc2df02d1c05465da4ba05dc6d0868fee69a7389ffa784f5ee2680a915886359d618b291105d46b061e74225d7d999c03701dda56e9f8df04ef815e05bff621b languageName: node linkType: hard -"jest-circus@npm:30.0.4, jest-circus@npm:^30.0.4": - version: 30.0.4 - resolution: "jest-circus@npm:30.0.4" +"jest-circus@npm:30.0.5, jest-circus@npm:^30.0.0": + version: 30.0.5 + resolution: "jest-circus@npm:30.0.5" dependencies: - "@jest/environment": "npm:30.0.4" - "@jest/expect": "npm:30.0.4" - "@jest/test-result": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/environment": "npm:30.0.5" + "@jest/expect": "npm:30.0.5" + "@jest/test-result": "npm:30.0.5" + "@jest/types": "npm:30.0.5" "@types/node": "npm:*" chalk: "npm:^4.1.2" co: "npm:^4.6.0" dedent: "npm:^1.6.0" is-generator-fn: "npm:^2.1.0" - jest-each: "npm:30.0.2" - jest-matcher-utils: "npm:30.0.4" - jest-message-util: "npm:30.0.2" - jest-runtime: "npm:30.0.4" - jest-snapshot: "npm:30.0.4" - jest-util: "npm:30.0.2" + jest-each: "npm:30.0.5" + jest-matcher-utils: "npm:30.0.5" + jest-message-util: "npm:30.0.5" + jest-runtime: "npm:30.0.5" + jest-snapshot: "npm:30.0.5" + jest-util: "npm:30.0.5" p-limit: "npm:^3.1.0" - pretty-format: "npm:30.0.2" + pretty-format: "npm:30.0.5" pure-rand: "npm:^7.0.0" slash: "npm:^3.0.0" stack-utils: "npm:^2.0.6" - checksum: 10/bbd713a4936919f9b0851993aea707466049358414abfefd0d1805bbab9e7702d3138ac876c2341ca4372bf05059d501e3bf0f9e37bff7c714e860b96fde9376 + checksum: 10/ccbfa6a95cbc3dee0f82650c9c6c483c53aac6892d0e167536f1791806b4834e79081f25b7048a5ac890c64df8d9863fca914c259835de4556de5572ed4e95c7 languageName: node linkType: hard -"jest-cli@npm:30.0.4": - version: 30.0.4 - resolution: "jest-cli@npm:30.0.4" +"jest-cli@npm:30.0.5": + version: 30.0.5 + resolution: "jest-cli@npm:30.0.5" dependencies: - "@jest/core": "npm:30.0.4" - "@jest/test-result": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/core": "npm:30.0.5" + "@jest/test-result": "npm:30.0.5" + "@jest/types": "npm:30.0.5" chalk: "npm:^4.1.2" exit-x: "npm:^0.2.2" import-local: "npm:^3.2.0" - jest-config: "npm:30.0.4" - jest-util: "npm:30.0.2" - jest-validate: "npm:30.0.2" + jest-config: "npm:30.0.5" + jest-util: "npm:30.0.5" + jest-validate: "npm:30.0.5" yargs: "npm:^17.7.2" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -6572,36 +6773,36 @@ __metadata: optional: true bin: jest: ./bin/jest.js - checksum: 10/dd15284405bdf62ba76f316270ddaaa76517b5ea75003bfefc6d652a6a5c0e9a9ba38a1daf13c17acfd0d8d4f7ffb332e89256429ed264ef5a5effa3bf412c5c + checksum: 10/228c3b525b2b64513e41cf3afb7cee7195c4574a10d9c05af13ad33e3a56661cf670d2fedc60954e6c3fab6f73a8cf775e47ef1471d06273eedd42c5c6adeeee languageName: node linkType: hard -"jest-config@npm:30.0.4": - version: 30.0.4 - resolution: "jest-config@npm:30.0.4" +"jest-config@npm:30.0.5": + version: 30.0.5 + resolution: "jest-config@npm:30.0.5" dependencies: "@babel/core": "npm:^7.27.4" "@jest/get-type": "npm:30.0.1" "@jest/pattern": "npm:30.0.1" - "@jest/test-sequencer": "npm:30.0.4" - "@jest/types": "npm:30.0.1" - babel-jest: "npm:30.0.4" + "@jest/test-sequencer": "npm:30.0.5" + "@jest/types": "npm:30.0.5" + babel-jest: "npm:30.0.5" chalk: "npm:^4.1.2" ci-info: "npm:^4.2.0" deepmerge: "npm:^4.3.1" glob: "npm:^10.3.10" graceful-fs: "npm:^4.2.11" - jest-circus: "npm:30.0.4" + jest-circus: "npm:30.0.5" jest-docblock: "npm:30.0.1" - jest-environment-node: "npm:30.0.4" + jest-environment-node: "npm:30.0.5" jest-regex-util: "npm:30.0.1" - jest-resolve: "npm:30.0.2" - jest-runner: "npm:30.0.4" - jest-util: "npm:30.0.2" - jest-validate: "npm:30.0.2" + jest-resolve: "npm:30.0.5" + jest-runner: "npm:30.0.5" + jest-util: "npm:30.0.5" + jest-validate: "npm:30.0.5" micromatch: "npm:^4.0.8" parse-json: "npm:^5.2.0" - pretty-format: "npm:30.0.2" + pretty-format: "npm:30.0.5" slash: "npm:^3.0.0" strip-json-comments: "npm:^3.1.1" peerDependencies: @@ -6615,7 +6816,7 @@ __metadata: optional: true ts-node: optional: true - checksum: 10/0bd9a8300b36c05accc4120429c7c100d4a73652b13c669756c8f4beaa2fc5e1e8936b7486209d8938a33e127254e594cb7a29c950bbe72d92b4ec906815a208 + checksum: 10/3cb313650adfa34d9a383883b7e8eba89df907f38bbdf321db6d151af099479371a8f33143d09e83faf0cea843d37ca9c45edc92e7e15dae8fd72b57c96a1dc6 languageName: node linkType: hard @@ -6631,6 +6832,18 @@ __metadata: languageName: node linkType: hard +"jest-diff@npm:30.0.5": + version: 30.0.5 + resolution: "jest-diff@npm:30.0.5" + dependencies: + "@jest/diff-sequences": "npm:30.0.1" + "@jest/get-type": "npm:30.0.1" + chalk: "npm:^4.1.2" + pretty-format: "npm:30.0.5" + checksum: 10/4cd3120640588a7bcc2ff3ff23c5b12939d0155f25098f7ed63e7801a9553fdcd0590a9fdd8b085646b0f1132e6da1228805fa9d2a83dd3686e146d804edb1ca + languageName: node + linkType: hard + "jest-docblock@npm:30.0.1": version: 30.0.1 resolution: "jest-docblock@npm:30.0.1" @@ -6640,53 +6853,53 @@ __metadata: languageName: node linkType: hard -"jest-each@npm:30.0.2": - version: 30.0.2 - resolution: "jest-each@npm:30.0.2" +"jest-each@npm:30.0.5": + version: 30.0.5 + resolution: "jest-each@npm:30.0.5" dependencies: "@jest/get-type": "npm:30.0.1" - "@jest/types": "npm:30.0.1" + "@jest/types": "npm:30.0.5" chalk: "npm:^4.1.2" - jest-util: "npm:30.0.2" - pretty-format: "npm:30.0.2" - checksum: 10/5dd3e43d657a6c779c3db665a67a2888e80c27a4d38a63763328c3b56d602f7e4414a278b536107eb0581c54fd890f14a1231946796846023640bc62947cecb2 + jest-util: "npm:30.0.5" + pretty-format: "npm:30.0.5" + checksum: 10/457512eda80141f99b6c6d350261eb440d545e4a5c357687bc1fdf1719c2d1f41829c8b8f5d1710be02f5e555572d2bad9526e5acb85f901b1066d2ca3dcd2ba languageName: node linkType: hard -"jest-environment-node@npm:30.0.4, jest-environment-node@npm:^30.0.4": - version: 30.0.4 - resolution: "jest-environment-node@npm:30.0.4" +"jest-environment-node@npm:30.0.5, jest-environment-node@npm:^30.0.0": + version: 30.0.5 + resolution: "jest-environment-node@npm:30.0.5" dependencies: - "@jest/environment": "npm:30.0.4" - "@jest/fake-timers": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/environment": "npm:30.0.5" + "@jest/fake-timers": "npm:30.0.5" + "@jest/types": "npm:30.0.5" "@types/node": "npm:*" - jest-mock: "npm:30.0.2" - jest-util: "npm:30.0.2" - jest-validate: "npm:30.0.2" - checksum: 10/37f4f5aa622d04f3541bafa21e44f6bdde6b4b5b98dcb3c752bec6f50f3f4a4a85311b1a0c559102a048247c9cc0db872c822b7d2191fb806f4087d0c269ac39 + jest-mock: "npm:30.0.5" + jest-util: "npm:30.0.5" + jest-validate: "npm:30.0.5" + checksum: 10/2f0a59370660753ae3e4852a7c905fefab00c4b758e1d19c85b1affe715d40e9563bfa1cccef06a116f610c93fcce2b1a94f4ced99fefea060606a2c10964921 languageName: node linkType: hard -"jest-haste-map@npm:30.0.2": - version: 30.0.2 - resolution: "jest-haste-map@npm:30.0.2" +"jest-haste-map@npm:30.0.5": + version: 30.0.5 + resolution: "jest-haste-map@npm:30.0.5" dependencies: - "@jest/types": "npm:30.0.1" + "@jest/types": "npm:30.0.5" "@types/node": "npm:*" anymatch: "npm:^3.1.3" fb-watchman: "npm:^2.0.2" fsevents: "npm:^2.3.3" graceful-fs: "npm:^4.2.11" jest-regex-util: "npm:30.0.1" - jest-util: "npm:30.0.2" - jest-worker: "npm:30.0.2" + jest-util: "npm:30.0.5" + jest-worker: "npm:30.0.5" micromatch: "npm:^4.0.8" walker: "npm:^1.0.8" dependenciesMeta: fsevents: optional: true - checksum: 10/7b62fff11833d7668ccb03bee6ce3fed026accb34b24cb723bbb3ebbec665509f968f2c042ab8e6402313d8d9ff02f26827d8cd1f98665f5e22765e32508d8af + checksum: 10/3539359589c94a6300c0696fbcfc3df4aad6ee0580cb7873c97a2ae2a009a40e49174b1f25c864302203407e0876e6287fca44b3bbbf7e2c29675436935a347c languageName: node linkType: hard @@ -6723,13 +6936,13 @@ __metadata: languageName: node linkType: hard -"jest-leak-detector@npm:30.0.2": - version: 30.0.2 - resolution: "jest-leak-detector@npm:30.0.2" +"jest-leak-detector@npm:30.0.5": + version: 30.0.5 + resolution: "jest-leak-detector@npm:30.0.5" dependencies: "@jest/get-type": "npm:30.0.1" - pretty-format: "npm:30.0.2" - checksum: 10/bb570d6aeb5187efa0a929d58104819e725ac7dbe4b57d0b9aa8a4ed456c75be64cf13ab28ced59f13a383a24ac87dcfa2867b4fcb2648f784bd2138e5756511 + pretty-format: "npm:30.0.5" + checksum: 10/60ba8c0afb0a20c0cdd8665469aba7f6663d2e94b01db18174db4986b1f50c0f74e979fa1e70ab78c9215ec8e48e6f43de6b0cdd3b3546c53f47b5ea92e343f0 languageName: node linkType: hard @@ -6745,6 +6958,18 @@ __metadata: languageName: node linkType: hard +"jest-matcher-utils@npm:30.0.5": + version: 30.0.5 + resolution: "jest-matcher-utils@npm:30.0.5" + dependencies: + "@jest/get-type": "npm:30.0.1" + chalk: "npm:^4.1.2" + jest-diff: "npm:30.0.5" + pretty-format: "npm:30.0.5" + checksum: 10/6017606746da03dd7fe2a846bdac5335b91ca0d3c91a75777cddaf882cf8f17d380e0e117c7e2476ccc9ec195e42ea6922ceb7e04a5e59ca7212028f3e053d9a + languageName: node + linkType: hard + "jest-message-util@npm:30.0.2": version: 30.0.2 resolution: "jest-message-util@npm:30.0.2" @@ -6762,6 +6987,23 @@ __metadata: languageName: node linkType: hard +"jest-message-util@npm:30.0.5": + version: 30.0.5 + resolution: "jest-message-util@npm:30.0.5" + dependencies: + "@babel/code-frame": "npm:^7.27.1" + "@jest/types": "npm:30.0.5" + "@types/stack-utils": "npm:^2.0.3" + chalk: "npm:^4.1.2" + graceful-fs: "npm:^4.2.11" + micromatch: "npm:^4.0.8" + pretty-format: "npm:30.0.5" + slash: "npm:^3.0.0" + stack-utils: "npm:^2.0.6" + checksum: 10/537c9c8fabded26a8de6bf6cd991f3c0743798bea3d0b2d26717a18202d8c7b3bd6935fd643f96f1b805f908c72d0cd19fe67270aca4e47582bad408a2081567 + languageName: node + linkType: hard + "jest-mock@npm:30.0.2": version: 30.0.2 resolution: "jest-mock@npm:30.0.2" @@ -6773,22 +7015,14 @@ __metadata: languageName: node linkType: hard -"jest-playwright-preset@npm:^4.0.0": - version: 4.0.0 - resolution: "jest-playwright-preset@npm:4.0.0" +"jest-mock@npm:30.0.5": + version: 30.0.5 + resolution: "jest-mock@npm:30.0.5" dependencies: - expect-playwright: "npm:^0.8.0" - jest-process-manager: "npm:^0.4.0" - nyc: "npm:^15.1.0" - playwright-core: "npm:>=1.2.0" - rimraf: "npm:^3.0.2" - uuid: "npm:^8.3.2" - peerDependencies: - jest: ^29.3.1 - jest-circus: ^29.3.1 - jest-environment-node: ^29.3.1 - jest-runner: ^29.3.1 - checksum: 10/ad8b92b4eac452042d71666f6fa7ce56abd590ec12732ec7c08926ff48351f72ea07a3babb4843db9e2e5e0c3a01f0d22da6acb1eaadf9a43c84c368ba188127 + "@jest/types": "npm:30.0.5" + "@types/node": "npm:*" + jest-util: "npm:30.0.5" + checksum: 10/a20386a9e4019c8e2957b95232a85dda6b705d810c2f9267278b40369db247bc311f84eeed72e13b227e15f40d554bd9fd66fafb4adb629dd37c9c14087a4106 languageName: node linkType: hard @@ -6829,89 +7063,89 @@ __metadata: languageName: node linkType: hard -"jest-resolve-dependencies@npm:30.0.4": - version: 30.0.4 - resolution: "jest-resolve-dependencies@npm:30.0.4" +"jest-resolve-dependencies@npm:30.0.5": + version: 30.0.5 + resolution: "jest-resolve-dependencies@npm:30.0.5" dependencies: jest-regex-util: "npm:30.0.1" - jest-snapshot: "npm:30.0.4" - checksum: 10/459d22c14bcd6c14412e2773e6c375de52243f2a0fb3b89d4f5d43cbe252de8d925cd9177592f679cb694394d94f3e7b94cbb88465df601da76201148e01d735 + jest-snapshot: "npm:30.0.5" + checksum: 10/8d7d94d96424a8d12e12245a0ed1242262e47587c06fed93aa4c876d549cdd26709dd583775f20b42bbf64e7ab63ba004d560df74989efd8b4cd2e6fbde6acbf languageName: node linkType: hard -"jest-resolve@npm:30.0.2": - version: 30.0.2 - resolution: "jest-resolve@npm:30.0.2" +"jest-resolve@npm:30.0.5": + version: 30.0.5 + resolution: "jest-resolve@npm:30.0.5" dependencies: chalk: "npm:^4.1.2" graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.0.2" + jest-haste-map: "npm:30.0.5" jest-pnp-resolver: "npm:^1.2.3" - jest-util: "npm:30.0.2" - jest-validate: "npm:30.0.2" + jest-util: "npm:30.0.5" + jest-validate: "npm:30.0.5" slash: "npm:^3.0.0" unrs-resolver: "npm:^1.7.11" - checksum: 10/364324b396f30e122f848264b3a4b23c8689673566b98cb3cfadb8ad2cf61406fefb221e6cda2842d52865b2cd6ab612fa55a3f31a15ae0efbfc1c2cbb55d681 + checksum: 10/714c5d93a8ea9f2304ecb97fd3dee8634851836606784d0e02ae033da5abc8af7436d495248f2abcb6bab315952881447740cc272c53da128df573676247db01 languageName: node linkType: hard -"jest-runner@npm:30.0.4, jest-runner@npm:^30.0.4": - version: 30.0.4 - resolution: "jest-runner@npm:30.0.4" +"jest-runner@npm:30.0.5, jest-runner@npm:^30.0.0": + version: 30.0.5 + resolution: "jest-runner@npm:30.0.5" dependencies: - "@jest/console": "npm:30.0.4" - "@jest/environment": "npm:30.0.4" - "@jest/test-result": "npm:30.0.4" - "@jest/transform": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/console": "npm:30.0.5" + "@jest/environment": "npm:30.0.5" + "@jest/test-result": "npm:30.0.5" + "@jest/transform": "npm:30.0.5" + "@jest/types": "npm:30.0.5" "@types/node": "npm:*" chalk: "npm:^4.1.2" emittery: "npm:^0.13.1" exit-x: "npm:^0.2.2" graceful-fs: "npm:^4.2.11" jest-docblock: "npm:30.0.1" - jest-environment-node: "npm:30.0.4" - jest-haste-map: "npm:30.0.2" - jest-leak-detector: "npm:30.0.2" - jest-message-util: "npm:30.0.2" - jest-resolve: "npm:30.0.2" - jest-runtime: "npm:30.0.4" - jest-util: "npm:30.0.2" - jest-watcher: "npm:30.0.4" - jest-worker: "npm:30.0.2" + jest-environment-node: "npm:30.0.5" + jest-haste-map: "npm:30.0.5" + jest-leak-detector: "npm:30.0.5" + jest-message-util: "npm:30.0.5" + jest-resolve: "npm:30.0.5" + jest-runtime: "npm:30.0.5" + jest-util: "npm:30.0.5" + jest-watcher: "npm:30.0.5" + jest-worker: "npm:30.0.5" p-limit: "npm:^3.1.0" source-map-support: "npm:0.5.13" - checksum: 10/b6e03e3407e1f1ec21e662e5c7399d7bb20072d9bf94eb07ab5890a2ddb05fb270bd7c12d0a63f9a3cc3f4fa9d33e2f2d1c891dbeb3e0e60188930a46a5ecdf1 + checksum: 10/fd6cf9eff7c4ba256fe7cef4348543ff2baea1ca7784ea21fd5f1f060d2ba7125bc70b17d6b1ac0bad450e88e375a344c6e620e28b9222ec3e12f57d3d9a9d5e languageName: node linkType: hard -"jest-runtime@npm:30.0.4": - version: 30.0.4 - resolution: "jest-runtime@npm:30.0.4" +"jest-runtime@npm:30.0.5": + version: 30.0.5 + resolution: "jest-runtime@npm:30.0.5" dependencies: - "@jest/environment": "npm:30.0.4" - "@jest/fake-timers": "npm:30.0.4" - "@jest/globals": "npm:30.0.4" + "@jest/environment": "npm:30.0.5" + "@jest/fake-timers": "npm:30.0.5" + "@jest/globals": "npm:30.0.5" "@jest/source-map": "npm:30.0.1" - "@jest/test-result": "npm:30.0.4" - "@jest/transform": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/test-result": "npm:30.0.5" + "@jest/transform": "npm:30.0.5" + "@jest/types": "npm:30.0.5" "@types/node": "npm:*" chalk: "npm:^4.1.2" cjs-module-lexer: "npm:^2.1.0" collect-v8-coverage: "npm:^1.0.2" glob: "npm:^10.3.10" graceful-fs: "npm:^4.2.11" - jest-haste-map: "npm:30.0.2" - jest-message-util: "npm:30.0.2" - jest-mock: "npm:30.0.2" + jest-haste-map: "npm:30.0.5" + jest-message-util: "npm:30.0.5" + jest-mock: "npm:30.0.5" jest-regex-util: "npm:30.0.1" - jest-resolve: "npm:30.0.2" - jest-snapshot: "npm:30.0.4" - jest-util: "npm:30.0.2" + jest-resolve: "npm:30.0.5" + jest-snapshot: "npm:30.0.5" + jest-util: "npm:30.0.5" slash: "npm:^3.0.0" strip-bom: "npm:^4.0.0" - checksum: 10/532db3c65087ddebf24737d805f2682e8fa335c86d6543062abedcf471303407bfc15d23f0c79dd96e6b381e97b607ec06f1042f120da271d6b48c5b8c33851d + checksum: 10/e62825f5b73e6df259c097a8f46ca032fcfba74f7783e12eeaadae3a9a70b8d15b6718c267ed54fca1267916396d986f295dfdb95bbdfadea486b8998f01476e languageName: node linkType: hard @@ -6924,32 +7158,32 @@ __metadata: languageName: node linkType: hard -"jest-snapshot@npm:30.0.4": - version: 30.0.4 - resolution: "jest-snapshot@npm:30.0.4" +"jest-snapshot@npm:30.0.5": + version: 30.0.5 + resolution: "jest-snapshot@npm:30.0.5" dependencies: "@babel/core": "npm:^7.27.4" "@babel/generator": "npm:^7.27.5" "@babel/plugin-syntax-jsx": "npm:^7.27.1" "@babel/plugin-syntax-typescript": "npm:^7.27.1" "@babel/types": "npm:^7.27.3" - "@jest/expect-utils": "npm:30.0.4" + "@jest/expect-utils": "npm:30.0.5" "@jest/get-type": "npm:30.0.1" - "@jest/snapshot-utils": "npm:30.0.4" - "@jest/transform": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/snapshot-utils": "npm:30.0.5" + "@jest/transform": "npm:30.0.5" + "@jest/types": "npm:30.0.5" babel-preset-current-node-syntax: "npm:^1.1.0" chalk: "npm:^4.1.2" - expect: "npm:30.0.4" + expect: "npm:30.0.5" graceful-fs: "npm:^4.2.11" - jest-diff: "npm:30.0.4" - jest-matcher-utils: "npm:30.0.4" - jest-message-util: "npm:30.0.2" - jest-util: "npm:30.0.2" - pretty-format: "npm:30.0.2" + jest-diff: "npm:30.0.5" + jest-matcher-utils: "npm:30.0.5" + jest-message-util: "npm:30.0.5" + jest-util: "npm:30.0.5" + pretty-format: "npm:30.0.5" semver: "npm:^7.7.2" synckit: "npm:^0.11.8" - checksum: 10/2ecffd4cd476c5fc496bfb23c52367bfda3b3d084c0297ffa86a4199fab3407e4dd133ab0df284aa69bc9d8339cdd5e3d87b93191f8fd77e78f4e4411fc73d36 + checksum: 10/954d42b201b76bf08f42dc942426176b2d1223aa44fb01260c90d43545bd9bf90ae4f195800d5e83c0b0ad980633a67a60898f190b26ec48c0deb1d63693eeb0 languageName: node linkType: hard @@ -6967,17 +7201,31 @@ __metadata: languageName: node linkType: hard -"jest-validate@npm:30.0.2": - version: 30.0.2 - resolution: "jest-validate@npm:30.0.2" +"jest-util@npm:30.0.5": + version: 30.0.5 + resolution: "jest-util@npm:30.0.5" + dependencies: + "@jest/types": "npm:30.0.5" + "@types/node": "npm:*" + chalk: "npm:^4.1.2" + ci-info: "npm:^4.2.0" + graceful-fs: "npm:^4.2.11" + picomatch: "npm:^4.0.2" + checksum: 10/44207c4b8c27b0cce809c76280c8a949514badef6af875edafd153f1df638727235b472f8790953045214ce3f17ad77a9dfd5c1826444c0431fe64bd580ba2d6 + languageName: node + linkType: hard + +"jest-validate@npm:30.0.5": + version: 30.0.5 + resolution: "jest-validate@npm:30.0.5" dependencies: "@jest/get-type": "npm:30.0.1" - "@jest/types": "npm:30.0.1" + "@jest/types": "npm:30.0.5" camelcase: "npm:^6.3.0" chalk: "npm:^4.1.2" leven: "npm:^3.1.0" - pretty-format: "npm:30.0.2" - checksum: 10/9bc273b9785f955fb926a69a6316b9feb6d5fc4960683060925f21a6869194ac7156445aab92031e320880c230da2d406720cb97ea5e250a04fe88a5a401c6e8 + pretty-format: "npm:30.0.5" + checksum: 10/5f595dae0edb3f8161343e4d07d6f15030a816fcc51aacfea7fb476b78a94d4daf9a06bc416b7458920a4e39266e24ee2cd8565e8465e487cf0e3cb388092fc1 languageName: node linkType: hard @@ -6998,7 +7246,23 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:30.0.4, jest-watcher@npm:^30.0.0": +"jest-watcher@npm:30.0.5": + version: 30.0.5 + resolution: "jest-watcher@npm:30.0.5" + dependencies: + "@jest/test-result": "npm:30.0.5" + "@jest/types": "npm:30.0.5" + "@types/node": "npm:*" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + emittery: "npm:^0.13.1" + jest-util: "npm:30.0.5" + string-length: "npm:^4.0.2" + checksum: 10/e61caeca70ab6fc5608ccf0f4e72add9d56f0bdb0f2a65ee1c9e9c5bbc1b2ffd23e168c505f880d97efb284b8893a51e165c9edd75e30504fee3aa563fc8d4b6 + languageName: node + linkType: hard + +"jest-watcher@npm:^30.0.0": version: 30.0.4 resolution: "jest-watcher@npm:30.0.4" dependencies: @@ -7014,27 +7278,27 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:30.0.2": - version: 30.0.2 - resolution: "jest-worker@npm:30.0.2" +"jest-worker@npm:30.0.5": + version: 30.0.5 + resolution: "jest-worker@npm:30.0.5" dependencies: "@types/node": "npm:*" "@ungap/structured-clone": "npm:^1.3.0" - jest-util: "npm:30.0.2" + jest-util: "npm:30.0.5" merge-stream: "npm:^2.0.0" supports-color: "npm:^8.1.1" - checksum: 10/d1e3dad5737de4dbe0622ab2d557ee544ab9667ae36e0ed9f459f9a56e0bd1dbdbe5184ff18f85e2ee51a468370a08ed7cc85a8a3bb41c41b43ce96c2dcf7f2c + checksum: 10/04d9a58ddb210a2efe8ad3f46cf54190a5e29edfe4f11847a51fb753be1b4cda7db52b5a786fae833774506b3b75bee9ad7ef26bef81d85914fbcd63555a1c1a languageName: node linkType: hard -"jest@npm:^30.0.4": - version: 30.0.4 - resolution: "jest@npm:30.0.4" +"jest@npm:^30.0.0": + version: 30.0.5 + resolution: "jest@npm:30.0.5" dependencies: - "@jest/core": "npm:30.0.4" - "@jest/types": "npm:30.0.1" + "@jest/core": "npm:30.0.5" + "@jest/types": "npm:30.0.5" import-local: "npm:^3.2.0" - jest-cli: "npm:30.0.4" + jest-cli: "npm:30.0.5" peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -7042,7 +7306,7 @@ __metadata: optional: true bin: jest: ./bin/jest.js - checksum: 10/58e27fc167670808ad4e07eb659e1a75472d1f98bd8faef1ebf9b936e4bc11ee69560c15f91fcb5bf17cff48e0d144060dac072eac08adaf3ecf94cc7e6ed5ac + checksum: 10/76f0c7f5d43d42a1bc515f683ba4b8978940e5fb0663af8dd0506fc7da6be4d4847f2e1cb8a846632cd62099949c63be69f2f810350a973b029af2d7155ae03a languageName: node linkType: hard @@ -7763,13 +8027,6 @@ __metadata: languageName: node linkType: hard -"node-domexception@npm:^1.0.0": - version: 1.0.0 - resolution: "node-domexception@npm:1.0.0" - checksum: 10/e332522f242348c511640c25a6fc7da4f30e09e580c70c6b13cb0be83c78c3e71c8d4665af2527e869fc96848924a4316ae7ec9014c091e2156f41739d4fa233 - languageName: node - linkType: hard - "node-fetch@npm:2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -7798,17 +8055,6 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^3.3.2": - version: 3.3.2 - resolution: "node-fetch@npm:3.3.2" - dependencies: - data-uri-to-buffer: "npm:^4.0.0" - fetch-blob: "npm:^3.1.4" - formdata-polyfill: "npm:^4.0.10" - checksum: 10/24207ca8c81231c7c59151840e3fded461d67a31cf3e3b3968e12201a42f89ce4a0b5fb7079b1fa0a4655957b1ca9257553200f03a9f668b45ebad265ca5593d - languageName: node - linkType: hard - "node-gyp@npm:latest": version: 10.0.1 resolution: "node-gyp@npm:10.0.1" @@ -8363,7 +8609,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.50.1, playwright-core@npm:>=1.2.0": +"playwright-chromium@npm:>=1.24.0": + version: 1.54.1 + resolution: "playwright-chromium@npm:1.54.1" + dependencies: + playwright-core: "npm:1.54.1" + bin: + playwright: cli.js + checksum: 10/2d7f734de23b3936bdb6d5d871cd9940c28982c749b67942af2b8aa31c0f6868262d198efb3f3f12bfb07a09b6c1fc3086a26dc3c4938ff6c4f15f7d4f779c89 + languageName: node + linkType: hard + +"playwright-core@npm:1.54.1": + version: 1.54.1 + resolution: "playwright-core@npm:1.54.1" + bin: + playwright-core: cli.js + checksum: 10/c0acfb7ecb48e9fb6c22f71298b966244bd4f8659093a798cc7f9a509deee22109560e44f2d507124e7718779640e0b4cb05a05c068b034405418d8740ec31ff + languageName: node + linkType: hard + +"playwright-core@npm:>=1.2.0": version: 1.50.1 resolution: "playwright-core@npm:1.50.1" bin: @@ -8372,18 +8638,18 @@ __metadata: languageName: node linkType: hard -"playwright@npm:^1.14.0": - version: 1.50.1 - resolution: "playwright@npm:1.50.1" +"playwright@npm:>=1.24.0": + version: 1.54.1 + resolution: "playwright@npm:1.54.1" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.50.1" + playwright-core: "npm:1.54.1" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10/a3687614ac3238a81cbe3018e4f4a2ae92c71f3f65110cc6087068c020f6134f0628308da33177b9b08102644706e835d4053f6890beeb4a935f433bc4ac107a + checksum: 10/ebad2924b589a4cfedf48288e67b4afc81047222e607321c9452a37610025e6e249bdfeff010c1c70cf9a9d35c0b9e5cb7934a58986f67928dd469d9fde1a035 languageName: node linkType: hard @@ -8455,6 +8721,17 @@ __metadata: languageName: node linkType: hard +"pretty-format@npm:30.0.5": + version: 30.0.5 + resolution: "pretty-format@npm:30.0.5" + dependencies: + "@jest/schemas": "npm:30.0.5" + ansi-styles: "npm:^5.2.0" + react-is: "npm:^18.3.1" + checksum: 10/bb65e53092f321257d80cd2c0165e65123805c9d4c4ada1ddac15b08c8879d6d031e6f01ac80e2685ef95ac35d302065196a036c63cd8729747f6e0fa21a55bf + languageName: node + linkType: hard + "pretty-ms@npm:^7.0.0": version: 7.0.1 resolution: "pretty-ms@npm:7.0.1" @@ -8736,6 +9013,13 @@ __metadata: languageName: node linkType: hard +"regexpp@npm:^3.2.0": + version: 3.2.0 + resolution: "regexpp@npm:3.2.0" + checksum: 10/3310010895a906873262f4b494fc99bcef1e71ef6720a0532c5999ca586498cbd4a284c8e3c2423f9d1d37512fd08d6064b7564e0e59508cf938f76dd15ace84 + languageName: node + linkType: hard + "regexpu-core@npm:^6.1.1": version: 6.1.1 resolution: "regexpu-core@npm:6.1.1" @@ -9101,7 +9385,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.2, semver@npm:^7.7.2": +"semver@npm:^7.0.0, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.2, semver@npm:^7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" bin: @@ -9984,6 +10268,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^1.8.1": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb + languageName: node + linkType: hard + "tslib@npm:^2, tslib@npm:^2.0.1, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" @@ -10033,6 +10324,17 @@ __metadata: languageName: node linkType: hard +"tsutils@npm:^3.21.0": + version: 3.21.0 + resolution: "tsutils@npm:3.21.0" + dependencies: + tslib: "npm:^1.8.1" + peerDependencies: + typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + checksum: 10/ea036bec1dd024e309939ffd49fda7a351c0e87a1b8eb049570dd119d447250e2c56e0e6c00554e8205760e7417793fdebff752a46e573fbe07d4f375502a5b2 + languageName: node + linkType: hard + "type-detect@npm:4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -10554,13 +10856,6 @@ __metadata: languageName: node linkType: hard -"web-streams-polyfill@npm:^3.0.3": - version: 3.3.3 - resolution: "web-streams-polyfill@npm:3.3.3" - checksum: 10/8e7e13501b3834094a50abe7c0b6456155a55d7571312b89570012ef47ec2a46d766934768c50aabad10a9c30dd764a407623e8bfcc74fcb58495c29130edea9 - languageName: node - linkType: hard - "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" From 8803e9c8796838f3c876de10fa06117566d93aa1 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Fri, 25 Jul 2025 12:30:18 +0200 Subject: [PATCH 24/29] fix tests --- package.json | 2 +- src/jest-playwright-preset/coverage.ts | 9 +- src/jest-playwright-preset/utils.test.ts | 465 ----------------------- yarn.lock | 322 +++++----------- 4 files changed, 103 insertions(+), 695 deletions(-) delete mode 100644 src/jest-playwright-preset/utils.test.ts diff --git a/package.json b/package.json index e82ac8ac..bed04837 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "nyc": "^15.1.0", "playwright": "^1.14.0", "playwright-core": ">=1.2.0", - "rimraf": "^3.0.2", + "rimraf": "^6.0.1", "uuid": "^8.3.2" }, "devDependencies": { diff --git a/src/jest-playwright-preset/coverage.ts b/src/jest-playwright-preset/coverage.ts index 6e180111..26a2bfe2 100644 --- a/src/jest-playwright-preset/coverage.ts +++ b/src/jest-playwright-preset/coverage.ts @@ -1,9 +1,8 @@ import * as uuid from 'uuid'; -import path from 'path'; -import fs from 'fs'; +import path from 'node:path'; +import fs from 'node:fs'; import type { Page } from 'playwright-core'; -import { promisify } from 'util'; -import rimraf from 'rimraf'; +import { rimraf } from 'rimraf'; const fsAsync = fs.promises; // @ts-ignore @@ -14,7 +13,7 @@ const NYC_DIR = '.nyc_output'; const COV_MERGE_DIR = path.join(NYC_DIR, 'merge'); const cleanMergeFiles = async (): Promise => { - await promisify(rimraf)(COV_MERGE_DIR); + await rimraf(COV_MERGE_DIR); }; export const setupCoverage = async (): Promise => { diff --git a/src/jest-playwright-preset/utils.test.ts b/src/jest-playwright-preset/utils.test.ts deleted file mode 100644 index 1e5edd2e..00000000 --- a/src/jest-playwright-preset/utils.test.ts +++ /dev/null @@ -1,465 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import * as Utils from './utils'; -import { DEFAULT_CONFIG, CHROMIUM, FIREFOX } from './constants'; -import type { BrowserType, JestPlaywrightConfig } from '../types/global'; -import { Playwright } from '../types/global'; - -const { - readConfig, - getBrowserType, - checkBrowserEnv, - checkDeviceEnv, - checkDevice, - getPlaywrightInstance, - getDisplayName, - getSkipFlag, - getBrowserOptions, - getDeviceBrowserType, - generateKey, - deepMerge, -} = Utils; - -beforeEach(() => { - jest.resetModules(); -}); - -describe('readConfig', () => { - it('should return the default configuration if there was no separate configuration specified', async () => { - jest.mock(path.join(__dirname, '..', 'jest-playwright.config.js'), () => ({}), { - virtual: true, - }); - const config = await readConfig(); - expect(config).toMatchObject(DEFAULT_CONFIG); - }); - it('should execute function if it was specified in configuration', async () => { - jest.mock( - path.join(__dirname, '..', 'jest-playwright.config.js'), - () => () => ({ - browsers: ['webkit'], - }), - { virtual: true } - ); - const config = await readConfig(); - expect(config.browsers).toEqual(['webkit']); - }); - it('should overwrite with a custom configuration', async () => { - const configObject = { - launchOptions: { - headless: true, - }, - browsers: ['chromium'], - contextOptions: { - viewport: { - width: 800, - height: 640, - }, - ignoreHTTPSErrors: true, - }, - }; - jest.mock(path.join(__dirname, '..', 'jest-playwright.config.js'), () => configObject, { - virtual: true, - }); - const config = await readConfig(); - expect(config).toMatchObject(configObject); - }); - it('should overwrite config if the second param is passed', async () => { - const configObject = { - launchOptions: { - headless: true, - }, - browsers: ['chromium'], - }; - jest.mock( - path.join(__dirname, '..', 'jest-playwright.config.js'), - () => ({ - ...configObject, - browsers: ['webkit'], - }), - { virtual: true } - ); - const config = await readConfig(process.cwd(), configObject as JestPlaywrightConfig); - expect(config).toMatchObject(configObject); - }); - it('should overwrite with a custom configuration and spread the "launchOptions" and "contextOptions" setting', async () => { - const configObject = { - launchOptions: { - headless: true, - }, - contextOptions: { - foo: true, - }, - }; - jest.mock(path.join(__dirname, '..', 'jest-playwright.config.js'), () => configObject, { - virtual: true, - }); - const config = await readConfig(); - const expectedConfig = { - ...configObject, - browsers: ['chromium'], - exitOnPageError: true, - }; - expect(config).toMatchObject(expectedConfig); - }); - it('should throw error if JEST_PLAYWRIGHT_CONFIG is defined but does not exist', async () => { - process.env.JEST_PLAYWRIGHT_CONFIG = 'unreached.js'; - let error; - try { - await readConfig(); - } catch (e) { - error = e; - } - expect(error).toBeTruthy(); - delete process.env.JEST_PLAYWRIGHT_CONFIG; - }); - it('should check cjs config if npm_package_type is module', async () => { - process.env.npm_package_type = 'module'; - const configPath = path.join(__dirname, '..', 'jest-playwright.config.cjs'); - const configObject = { - browsers: ['webkit'], - launchOptions: { - headless: true, - }, - contextOptions: { - foo: true, - }, - }; - fs.writeFileSync(configPath, ''); - jest.mock(path.join(__dirname, '..', 'jest-playwright.config.cjs'), () => configObject, { - virtual: true, - }); - const expectedConfig = { - ...configObject, - exitOnPageError: true, - }; - const config = await readConfig(); - expect(config).toMatchObject(expectedConfig); - delete process.env.npm_package_type; - fs.unlinkSync(configPath); - }); -}); - -describe('generateKey', () => { - const config = { - launchOptions: { - headless: false, - executablePath: '/usr/bin/microsoft-edge', - }, - } as JestPlaywrightConfig; - it('should generate same key for same objects', () => { - const key1 = generateKey('chromium', config); - const key2 = generateKey('chromium', config); - expect(key1).toBe(key2); - }); - - it('should generate different key for different objects', () => { - const chromiumConfig = { - launchOptions: { - headless: false, - executablePath: '/usr/bin/google-chrome-stable', - }, - } as JestPlaywrightConfig; - const key1 = generateKey('chromium', config); - const key2 = generateKey('chromium', chromiumConfig); - expect(key1).not.toBe(key2); - }); -}); - -describe('getDisplayName', () => { - it('should return right display name for passed browser', () => { - expect(getDisplayName('chromium', null)).toBe('browser: chromium'); - }); - - it('should return right display name for passed browser and device', () => { - expect(getDisplayName('chromium', 'iPhone 6')).toBe('browser: chromium device: iPhone 6'); - }); - - it('should return right display name for passed browser and custom device', () => { - const customDevice = { - name: 'Custom device', - viewport: { width: 1920, height: 1080 }, - deviceScaleFactor: 1, - isMobile: false, - hasTouch: false, - }; - expect(getDisplayName('chromium', customDevice)).toBe( - 'browser: chromium device: Custom device' - ); - }); -}); - -describe('getBrowserType', () => { - it('should return "chromium" as default', async () => { - const browserType = getBrowserType(); - expect(browserType).toBe(CHROMIUM); - }); - it('should return passed browser if it is passed', async () => { - const browserType = getBrowserType('firefox'); - expect(browserType).toBe('firefox'); - }); -}); - -describe('getBrowserOptions', () => { - it('should return empty object for empty options', () => { - const options = getBrowserOptions(CHROMIUM); - expect(options).toStrictEqual({}); - }); - - it('should return root options', () => { - const launchOptions = { headless: false }; - const options = getBrowserOptions(CHROMIUM, launchOptions); - expect(options).toStrictEqual(launchOptions); - }); - - it('should return options for defined browser', () => { - const launchOptions = { headless: false, chromium: { headless: true } }; - const options = getBrowserOptions(CHROMIUM, launchOptions); - expect(options).toStrictEqual({ headless: true }); - }); - - it('should return root options for other browser', () => { - const launchOptions = { headless: false, chromium: { headless: true } }; - const options = getBrowserOptions(FIREFOX, launchOptions); - expect(options).toStrictEqual({ headless: false }); - }); - - it('should not mutate original options', () => { - const launchOptions = { headless: false, chromium: { headless: true } }; - const options = getBrowserOptions(FIREFOX, launchOptions); - expect(options).toStrictEqual({ headless: false }); - expect(launchOptions).toStrictEqual({ - headless: false, - chromium: { headless: true }, - }); - }); -}); - -describe('checkBrowserEnv', () => { - it('should throw Error with unknown type', async () => { - const browserType = getBrowserType('unknown' as BrowserType); - expect(() => checkBrowserEnv(browserType)).toThrow(); - }); -}); - -describe('checkDeviceEnv', () => { - it('should throw Error with unknown type', async () => { - const device = 'unknown'; - const devices = ['iPhone 11', 'Pixel 2', 'Nexus 4']; - expect(() => checkDeviceEnv(device, devices)).toThrow(); - }); -}); - -describe('checkDevice', () => { - const devices = { - 'iPhone 11': {}, - 'Pixel 2': {}, - 'Nexus 4': {}, - } as Playwright['devices']; - - it('should not throw Error if device is exist', async () => { - const device = 'Nexus 4'; - expect(() => checkDevice(device, devices)).not.toThrow(); - }); - - it('should not throw Error if device is not string', async () => { - const device = null; - expect(() => checkDevice(device, devices)).not.toThrow(); - }); - - it('should throw Error with unknown type', async () => { - const device = 'unknown'; - expect(() => checkDevice(device, devices)).toThrow(); - }); -}); - -describe('getDeviceBrowserType', () => { - const devices = { - 'iPhone 11': { - defaultBrowserType: 'webkit', - }, - } as Playwright['devices']; - - it('should return "null" as default', async () => { - const device = { - name: 'Custom', - }; - expect(getDeviceBrowserType(device, devices)).toBe(null); - }); - - it('should return default browser if it is defined', async () => { - const device = { - name: 'Custom', - defaultBrowserType: FIREFOX as BrowserType, - }; - expect(getDeviceBrowserType(device, devices)).toBe(FIREFOX); - }); - - it('should return default browser for string device', async () => { - expect(getDeviceBrowserType('iPhone 11', devices)).toBe('webkit'); - }); -}); - -describe('getSkipFlag', () => { - it('should return true if skipOption.browsers includes browserName', async () => { - const skipOptions = { browsers: [CHROMIUM as BrowserType] }; - const skipFlag = getSkipFlag(skipOptions, CHROMIUM, null); - expect(skipFlag).toBe(true); - }); - - it('should return false if skipOption.browsers does not include browserName', async () => { - const skipOptions = { browsers: [CHROMIUM as BrowserType] }; - const skipFlag = getSkipFlag(skipOptions, FIREFOX, null); - expect(skipFlag).toBe(false); - }); - - it('should return true if skipOption.browser includes browserName & skipOption.devices includes deviceName', async () => { - const skipOptions = { - browsers: [CHROMIUM as BrowserType], - devices: /Pixel/, - }; - const skipFlag = getSkipFlag(skipOptions, CHROMIUM, 'Pixel 2'); - expect(skipFlag).toBe(true); - }); - - it('should return true if skipOption.devices is RegExp and match to deviceName', async () => { - const skipOptions = { - browsers: [CHROMIUM as BrowserType], - devices: ['Pixel 2'], - }; - const skipFlag = getSkipFlag(skipOptions, CHROMIUM, 'Pixel 2'); - expect(skipFlag).toBe(true); - }); - - it('should return false if skipOption.browser does not include browserName & skipOption.devices includes deviceName', async () => { - const skipOptions = { - browsers: [CHROMIUM as BrowserType], - devices: ['Pixel 2'], - }; - const skipFlag = getSkipFlag(skipOptions, FIREFOX, 'Pixel 2'); - expect(skipFlag).toBe(false); - }); - - it('should return false if skipOption.browser does not includes browserName & skipOption.devices does not include deviceName', async () => { - const skipOptions = { - browsers: [CHROMIUM as BrowserType], - devices: ['Pixel 2'], - }; - const skipFlag = getSkipFlag(skipOptions, FIREFOX, null); - expect(skipFlag).toBe(false); - }); -}); - -describe('getPlaywrightInstance', () => { - it('should return all instances from playwright package', async () => { - jest.doMock('playwright', () => ({ - firefox: 'firefox', - chromium: 'chromium', - })); - - const { instance } = getPlaywrightInstance(); - expect(instance).toEqual({ - firefox: 'firefox', - chromium: 'chromium', - }); - }); - - it('should return specified instance from playwright package', async () => { - jest.doMock('playwright', () => ({ - firefox: 'firefox', - chromium: 'chromium', - })); - - const { instance } = getPlaywrightInstance('firefox'); - expect(instance).toEqual('firefox'); - }); - - it('should return specified instance from specified playwright package', () => { - jest.doMock('playwright-chromium', () => ({ - chromium: 'chromium', - })); - - const { instance } = getPlaywrightInstance('chromium'); - expect(instance).toEqual('chromium'); - }); - - it('should throw error when playwright package is not provided', () => { - jest.doMock('playwright', () => ({ - chromium: 'chromium', - })); - - const getMissedPlaywrightInstance = () => getPlaywrightInstance('firefox'); - - expect(getMissedPlaywrightInstance).toThrow( - 'jest-playwright-preset: Cannot find playwright package to use firefox' - ); - }); -}); - -describe('deepMerge', () => { - it('should return deeply merged object', () => { - const source = { - viewport: { width: 1440, height: 900 }, - isMobile: false, - storageState: { - origins: [ - { - origin: 'https://google.com', - localStorage: [ - { - name: 'name', - value: 'google', - }, - ], - }, - ], - }, - }; - - const target = { - viewport: { width: 1920, height: 900 }, - isMobile: false, - hasTouch: true, - storageState: { - origins: [ - { - origin: 'https://bing.com', - localStorage: [ - { - name: 'name', - value: 'bing', - }, - ], - }, - ], - }, - }; - - expect(deepMerge(source, target)).toEqual({ - viewport: { width: 1920, height: 900 }, - isMobile: false, - hasTouch: true, - storageState: { - origins: [ - { - origin: 'https://bing.com', - localStorage: [ - { - name: 'name', - value: 'bing', - }, - ], - }, - { - origin: 'https://google.com', - localStorage: [ - { - name: 'name', - value: 'google', - }, - ], - }, - ], - }, - }); - }); -}); diff --git a/yarn.lock b/yarn.lock index 9eaad4a1..5c2e536d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,17 +12,7 @@ __metadata: languageName: node linkType: hard -"@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.0" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 10/e15fecbf3b54c988c8b4fdea8ef514ab482537e8a080b2978cc4b47ccca7140577ca7b65ad3322dcce65bc73ee6e5b90cbfe0bbd8c766dad04d5c62ec9634c42 - languageName: node - linkType: hard - -"@ampproject/remapping@npm:^2.3.0": +"@ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.3.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" dependencies: @@ -1610,17 +1600,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4": - version: 7.28.0 - resolution: "@babel/types@npm:7.28.0" - dependencies: - "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10/2f28b84efb5005d1e85fc3944219c284400c42aeefc1f6e10500a74fed43b3dfb4f9e349a5d6e0e3fc24f5d241c513b30ef00ede2885535ce7a0a4e111c2098e - languageName: node - linkType: hard - -"@babel/types@npm:^7.25.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4": version: 7.28.1 resolution: "@babel/types@npm:7.28.1" dependencies: @@ -1886,6 +1866,22 @@ __metadata: languageName: node linkType: hard +"@isaacs/balanced-match@npm:^4.0.1": + version: 4.0.1 + resolution: "@isaacs/balanced-match@npm:4.0.1" + checksum: 10/102fbc6d2c0d5edf8f6dbf2b3feb21695a21bc850f11bc47c4f06aa83bd8884fde3fe9d6d797d619901d96865fdcb4569ac2a54c937992c48885c5e3d9967fe8 + languageName: node + linkType: hard + +"@isaacs/brace-expansion@npm:^5.0.0": + version: 5.0.0 + resolution: "@isaacs/brace-expansion@npm:5.0.0" + dependencies: + "@isaacs/balanced-match": "npm:^4.0.1" + checksum: 10/cf3b7f206aff12128214a1df764ac8cdbc517c110db85249b945282407e3dfc5c6e66286383a7c9391a059fc8e6e6a8ca82262fc9d2590bd615376141fbebd2d + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -1920,20 +1916,6 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/console@npm:30.0.4" - dependencies: - "@jest/types": "npm:30.0.1" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - jest-message-util: "npm:30.0.2" - jest-util: "npm:30.0.2" - slash: "npm:^3.0.0" - checksum: 10/75d1066a8cab4b5e880e1f25e70f290f6b2ffac94e4825f4e6649c63569ed29051a6642e9d2dad14f18d46f14eb3b6d2caa41160a0da02257eaf633cb9901737 - languageName: node - linkType: hard - "@jest/console@npm:30.0.5": version: 30.0.5 resolution: "@jest/console@npm:30.0.5" @@ -2017,15 +1999,6 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/expect-utils@npm:30.0.4" - dependencies: - "@jest/get-type": "npm:30.0.1" - checksum: 10/6ddee414ba9c179b7a57c88bd402da1e009551471f3d7fdd9bcb6dce99e3e8e2ce453693b893c025e829883f994650e76266188273c1f60395eec84b06311b77 - languageName: node - linkType: hard - "@jest/expect-utils@npm:30.0.5": version: 30.0.5 resolution: "@jest/expect-utils@npm:30.0.5" @@ -2124,15 +2097,6 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:30.0.1": - version: 30.0.1 - resolution: "@jest/schemas@npm:30.0.1" - dependencies: - "@sinclair/typebox": "npm:^0.34.0" - checksum: 10/067d4c3f38f2d8267d3ed6cc813252c3be580035fe7e2c0fa187323ef4978233ebadb1477808aec048440a8d0f480f71f92c5f02f98bf66c59bf802da1a0b254 - languageName: node - linkType: hard - "@jest/schemas@npm:30.0.5": version: 30.0.5 resolution: "@jest/schemas@npm:30.0.5" @@ -2165,18 +2129,6 @@ __metadata: languageName: node linkType: hard -"@jest/test-result@npm:30.0.4": - version: 30.0.4 - resolution: "@jest/test-result@npm:30.0.4" - dependencies: - "@jest/console": "npm:30.0.4" - "@jest/types": "npm:30.0.1" - "@types/istanbul-lib-coverage": "npm:^2.0.6" - collect-v8-coverage: "npm:^1.0.2" - checksum: 10/8b4183fbb8722a5d141abf079e177e83afe16d7c58889544a953a598e78077e0186e3b13d9b1343f01ded4791f1b840e49030bc27305f3109fcefd4afbbf6454 - languageName: node - linkType: hard - "@jest/test-result@npm:30.0.5": version: 30.0.5 resolution: "@jest/test-result@npm:30.0.5" @@ -2224,21 +2176,6 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:30.0.1": - version: 30.0.1 - resolution: "@jest/types@npm:30.0.1" - dependencies: - "@jest/pattern": "npm:30.0.1" - "@jest/schemas": "npm:30.0.1" - "@types/istanbul-lib-coverage": "npm:^2.0.6" - "@types/istanbul-reports": "npm:^3.0.4" - "@types/node": "npm:*" - "@types/yargs": "npm:^17.0.33" - chalk: "npm:^4.1.2" - checksum: 10/43f4ffedfec4d88869d74c259a027e45798444c09e4c52f59a1e7124c43d54e908d7b93d81da5260075d421d6f42087b12cb6c83da580b088c987f9d18b5d879 - languageName: node - linkType: hard - "@jest/types@npm:30.0.5, @jest/types@npm:^30.0.1": version: 30.0.5 resolution: "@jest/types@npm:30.0.5" @@ -2271,7 +2208,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.12 resolution: "@jridgewell/gen-mapping@npm:0.3.12" dependencies: @@ -2305,7 +2242,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.23, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": version: 0.3.29 resolution: "@jridgewell/trace-mapping@npm:0.3.29" dependencies: @@ -2994,7 +2931,7 @@ __metadata: react: "npm:^17.0.1" react-dom: "npm:^17.0.1" read-pkg-up: "npm:^7.0.1" - rimraf: "npm:^3.0.2" + rimraf: "npm:^6.0.1" storybook: "npm:0.0.0-pr-31819-sha-7e336af7" tempy: "npm:^1.0.1" ts-dedent: "npm:^2.0.0" @@ -4886,14 +4823,14 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10/e1a13869d2f57d974de0d9ef7acbf69dc6937db20b918525a01dacb5032129bd552d290d886d981e99f1b624cb03657084cc87bd40f115c07ecf376821c729ce + checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 languageName: node linkType: hard @@ -5600,7 +5537,7 @@ __metadata: languageName: node linkType: hard -"expect@npm:30.0.5": +"expect@npm:30.0.5, expect@npm:^30.0.0": version: 30.0.5 resolution: "expect@npm:30.0.5" dependencies: @@ -5614,20 +5551,6 @@ __metadata: languageName: node linkType: hard -"expect@npm:^30.0.0": - version: 30.0.4 - resolution: "expect@npm:30.0.4" - dependencies: - "@jest/expect-utils": "npm:30.0.4" - "@jest/get-type": "npm:30.0.1" - jest-matcher-utils: "npm:30.0.4" - jest-message-util: "npm:30.0.2" - jest-mock: "npm:30.0.2" - jest-util: "npm:30.0.2" - checksum: 10/ae2f50eba05614060dbf0340dde110df4d659a10075d9d3a550bc6501ed24c00b379021fc56786a64259a39a30737ef73c51e9711e1cd2ff13f81606c059bd18 - languageName: node - linkType: hard - "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -5849,13 +5772,13 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" +"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.1": + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" dependencies: - cross-spawn: "npm:^7.0.0" + cross-spawn: "npm:^7.0.6" signal-exit: "npm:^4.0.1" - checksum: 10/087edd44857d258c4f73ad84cb8df980826569656f2550c341b27adf5335354393eec24ea2fabd43a253233fb27cee177ebe46bd0b7ea129c77e87cb1e9936fb + checksum: 10/427b33f997a98073c0424e5c07169264a62cda806d8d2ded159b5b903fdfc8f0a1457e06b5fc35506497acb3f1e353f025edee796300209ac6231e80edece835 languageName: node linkType: hard @@ -6055,6 +5978,22 @@ __metadata: languageName: node linkType: hard +"glob@npm:^11.0.0": + version: 11.0.3 + resolution: "glob@npm:11.0.3" + dependencies: + foreground-child: "npm:^3.3.1" + jackspeak: "npm:^4.1.1" + minimatch: "npm:^10.0.3" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^2.0.0" + bin: + glob: dist/esm/bin.mjs + checksum: 10/2ae536c1360c0266b523b2bfa6aadc10144a8b7e08869b088e37ac3c27cd30774f82e4bfb291cde796776e878f9e13200c7ff44010eb7054e00f46f649397893 + languageName: node + linkType: hard + "glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -6659,17 +6598,7 @@ __metadata: languageName: node linkType: hard -"istanbul-reports@npm:^3.0.2, istanbul-reports@npm:^3.1.3": - version: 3.1.5 - resolution: "istanbul-reports@npm:3.1.5" - dependencies: - html-escaper: "npm:^2.0.0" - istanbul-lib-report: "npm:^3.0.0" - checksum: 10/1fc20a133f6dbd846e7bf3dc6d85edf2b3c047c47142cd796c38717aef976195d2c0fb0399dd609c3ffac2ca43244dc15ce4ac34064d21e2d34d387df747dafb - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.1.7": +"istanbul-reports@npm:^3.0.2, istanbul-reports@npm:^3.1.3, istanbul-reports@npm:^3.1.7": version: 3.1.7 resolution: "istanbul-reports@npm:3.1.7" dependencies: @@ -6692,6 +6621,15 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^4.1.1": + version: 4.1.1 + resolution: "jackspeak@npm:4.1.1" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + checksum: 10/ffceb270ec286841f48413bfb4a50b188662dfd599378ce142b6540f3f0a66821dc9dcb1e9ebc55c6c3b24dc2226c96e5819ba9bd7a241bd29031b61911718c7 + languageName: node + linkType: hard + "jake@npm:^10.8.5": version: 10.9.2 resolution: "jake@npm:10.9.2" @@ -6820,18 +6758,6 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:30.0.4": - version: 30.0.4 - resolution: "jest-diff@npm:30.0.4" - dependencies: - "@jest/diff-sequences": "npm:30.0.1" - "@jest/get-type": "npm:30.0.1" - chalk: "npm:^4.1.2" - pretty-format: "npm:30.0.2" - checksum: 10/4501182ea681741e18f594589ae9baa0d889a92b48d477344ab8f1ce943c5988b9361c50a51670afc72a64bf4698622045806d24c3074906bc12760729377186 - languageName: node - linkType: hard - "jest-diff@npm:30.0.5": version: 30.0.5 resolution: "jest-diff@npm:30.0.5" @@ -6946,18 +6872,6 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:30.0.4": - version: 30.0.4 - resolution: "jest-matcher-utils@npm:30.0.4" - dependencies: - "@jest/get-type": "npm:30.0.1" - chalk: "npm:^4.1.2" - jest-diff: "npm:30.0.4" - pretty-format: "npm:30.0.2" - checksum: 10/9b0911e7be555c66bdccb231bde749ea16e02acd290f9ae01006862142e59a206330872e813bc146d1feab62d0245ababc19f4a97ecef7964f364f78717a737c - languageName: node - linkType: hard - "jest-matcher-utils@npm:30.0.5": version: 30.0.5 resolution: "jest-matcher-utils@npm:30.0.5" @@ -6970,23 +6884,6 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:30.0.2": - version: 30.0.2 - resolution: "jest-message-util@npm:30.0.2" - dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@jest/types": "npm:30.0.1" - "@types/stack-utils": "npm:^2.0.3" - chalk: "npm:^4.1.2" - graceful-fs: "npm:^4.2.11" - micromatch: "npm:^4.0.8" - pretty-format: "npm:30.0.2" - slash: "npm:^3.0.0" - stack-utils: "npm:^2.0.6" - checksum: 10/61b67d807d18eeea114088e33e29a88e59293fd96adee52e64fddbf9523409bc5e4cf71a8c623150a4b4870337430a4b38f19622119f4dc7d06081230dd63e01 - languageName: node - linkType: hard - "jest-message-util@npm:30.0.5": version: 30.0.5 resolution: "jest-message-util@npm:30.0.5" @@ -7004,17 +6901,6 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:30.0.2": - version: 30.0.2 - resolution: "jest-mock@npm:30.0.2" - dependencies: - "@jest/types": "npm:30.0.1" - "@types/node": "npm:*" - jest-util: "npm:30.0.2" - checksum: 10/79d13e7374f736919d9ad82858ba59771b7452b0c40fe5452aa3f5f07b2563f9d597e007f7c0ff8ed8fa9cdf12abe049868a6dd7b76d23995532039e894184f6 - languageName: node - linkType: hard - "jest-mock@npm:30.0.5": version: 30.0.5 resolution: "jest-mock@npm:30.0.5" @@ -7187,20 +7073,6 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:30.0.2": - version: 30.0.2 - resolution: "jest-util@npm:30.0.2" - dependencies: - "@jest/types": "npm:30.0.1" - "@types/node": "npm:*" - chalk: "npm:^4.1.2" - ci-info: "npm:^4.2.0" - graceful-fs: "npm:^4.2.11" - picomatch: "npm:^4.0.2" - checksum: 10/7fe3a9062ceac438e691037b0a246cee89b5f0f17e59d7226d00a6d2676c8a5cec4182e242722c2ea86863c46f2f23361e477d6039e0472ac0ec4bb6acef8551 - languageName: node - linkType: hard - "jest-util@npm:30.0.5": version: 30.0.5 resolution: "jest-util@npm:30.0.5" @@ -7246,7 +7118,7 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:30.0.5": +"jest-watcher@npm:30.0.5, jest-watcher@npm:^30.0.0": version: 30.0.5 resolution: "jest-watcher@npm:30.0.5" dependencies: @@ -7262,22 +7134,6 @@ __metadata: languageName: node linkType: hard -"jest-watcher@npm:^30.0.0": - version: 30.0.4 - resolution: "jest-watcher@npm:30.0.4" - dependencies: - "@jest/test-result": "npm:30.0.4" - "@jest/types": "npm:30.0.1" - "@types/node": "npm:*" - ansi-escapes: "npm:^4.3.2" - chalk: "npm:^4.1.2" - emittery: "npm:^0.13.1" - jest-util: "npm:30.0.2" - string-length: "npm:^4.0.2" - checksum: 10/78117aa1064e34edd02bfb94bbc4fd124a24bf29a06f65f838124bf017ae0b1aee4b9f7285d0e8f79b3e3c16ac5715eb9ac2d2cd6109360b74cc8187947324db - languageName: node - linkType: hard - "jest-worker@npm:30.0.5": version: 30.0.5 resolution: "jest-worker@npm:30.0.5" @@ -7638,6 +7494,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.0.0": + version: 11.1.0 + resolution: "lru-cache@npm:11.1.0" + checksum: 10/5011011675ca98428902de774d0963b68c3a193cd959347cb63b781dad4228924124afab82159fd7b8b4db18285d9aff462b877b8f6efd2b41604f806c1d9db4 + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -7817,6 +7680,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.0.3": + version: 10.0.3 + resolution: "minimatch@npm:10.0.3" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.0" + checksum: 10/d5b8b2538b367f2cfd4aeef27539fddeee58d1efb692102b848e4a968a09780a302c530eb5aacfa8c57f7299155fb4b4e85219ad82664dcef5c66f657111d9b8 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -8478,6 +8350,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10/285ae0c2d6c34ae91dc1d5378ede21981c9a2f6de1ea9ca5a88b5a270ce9763b83dbadc7a324d512211d8d36b0c540427d3d0817030849d97a60fa840a2c59ec + languageName: node + linkType: hard + "path-type@npm:^3.0.0": version: 3.0.0 resolution: "path-type@npm:3.0.0" @@ -8620,7 +8502,7 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.54.1": +"playwright-core@npm:1.54.1, playwright-core@npm:>=1.2.0": version: 1.54.1 resolution: "playwright-core@npm:1.54.1" bin: @@ -8629,15 +8511,6 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:>=1.2.0": - version: 1.50.1 - resolution: "playwright-core@npm:1.50.1" - bin: - playwright-core: cli.js - checksum: 10/9a310b8a66bf7fd926e620c1c8e27be29bdbdce91640e5f975b2fd4dc706d0307faec2bb0456cc8e7dedb1e71c0b5eb35c6a58acd5cedc7d8fd849a9067e637b - languageName: node - linkType: hard - "playwright@npm:>=1.24.0": version: 1.54.1 resolution: "playwright@npm:1.54.1" @@ -8710,18 +8583,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:30.0.2, pretty-format@npm:^30.0.0": - version: 30.0.2 - resolution: "pretty-format@npm:30.0.2" - dependencies: - "@jest/schemas": "npm:30.0.1" - ansi-styles: "npm:^5.2.0" - react-is: "npm:^18.3.1" - checksum: 10/82b2f0c8771fcf072b33ca6a748b95beac589db4f98deafda1a29579ce47adf322909ea2fff9d46672ac075dda1aba2bde7f955609bfdf76f867e0ff77b5c19d - languageName: node - linkType: hard - -"pretty-format@npm:30.0.5": +"pretty-format@npm:30.0.5, pretty-format@npm:^30.0.0": version: 30.0.5 resolution: "pretty-format@npm:30.0.5" dependencies: @@ -9232,6 +9094,18 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^6.0.1": + version: 6.0.1 + resolution: "rimraf@npm:6.0.1" + dependencies: + glob: "npm:^11.0.0" + package-json-from-dist: "npm:^1.0.0" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10/0eb7edf08aa39017496c99ba675552dda11a20811ba78f8232da2ba945308c91e9cd673f95998b1a8202bc7436d33390831d23ea38ae52751038d56373ad99e2 + languageName: node + linkType: hard + "rollup@npm:^4.34.8, rollup@npm:^4.40.0": version: 4.45.1 resolution: "rollup@npm:4.45.1" From 52b7622a94d768cdad4b8d2197680943a117e183 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Fri, 25 Jul 2025 14:38:13 +0200 Subject: [PATCH 25/29] fix --- package.json | 3 +- src/jest-playwright-preset/coverage.ts | 9 +- yarn.lock | 111 +++++++------------------ 3 files changed, 37 insertions(+), 86 deletions(-) diff --git a/package.json b/package.json index bed04837..67893b28 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "nyc": "^15.1.0", "playwright": "^1.14.0", "playwright-core": ">=1.2.0", - "rimraf": "^6.0.1", + "rimraf": "^3.0.2", "uuid": "^8.3.2" }, "devDependencies": { @@ -87,6 +87,7 @@ "@storybook/react-vite": "0.0.0-pr-31819-sha-7e336af7", "@types/jest": "^30.0.0", "@types/node": "^24.0.10", + "@types/rimraf": "^3.0.2", "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "5.30.7", "@typescript-eslint/parser": "5.30.7", diff --git a/src/jest-playwright-preset/coverage.ts b/src/jest-playwright-preset/coverage.ts index 26a2bfe2..6e180111 100644 --- a/src/jest-playwright-preset/coverage.ts +++ b/src/jest-playwright-preset/coverage.ts @@ -1,8 +1,9 @@ import * as uuid from 'uuid'; -import path from 'node:path'; -import fs from 'node:fs'; +import path from 'path'; +import fs from 'fs'; import type { Page } from 'playwright-core'; -import { rimraf } from 'rimraf'; +import { promisify } from 'util'; +import rimraf from 'rimraf'; const fsAsync = fs.promises; // @ts-ignore @@ -13,7 +14,7 @@ const NYC_DIR = '.nyc_output'; const COV_MERGE_DIR = path.join(NYC_DIR, 'merge'); const cleanMergeFiles = async (): Promise => { - await rimraf(COV_MERGE_DIR); + await promisify(rimraf)(COV_MERGE_DIR); }; export const setupCoverage = async (): Promise => { diff --git a/yarn.lock b/yarn.lock index 5c2e536d..9027795d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1866,22 +1866,6 @@ __metadata: languageName: node linkType: hard -"@isaacs/balanced-match@npm:^4.0.1": - version: 4.0.1 - resolution: "@isaacs/balanced-match@npm:4.0.1" - checksum: 10/102fbc6d2c0d5edf8f6dbf2b3feb21695a21bc850f11bc47c4f06aa83bd8884fde3fe9d6d797d619901d96865fdcb4569ac2a54c937992c48885c5e3d9967fe8 - languageName: node - linkType: hard - -"@isaacs/brace-expansion@npm:^5.0.0": - version: 5.0.0 - resolution: "@isaacs/brace-expansion@npm:5.0.0" - dependencies: - "@isaacs/balanced-match": "npm:^4.0.1" - checksum: 10/cf3b7f206aff12128214a1df764ac8cdbc517c110db85249b945282407e3dfc5c6e66286383a7c9391a059fc8e6e6a8ca82262fc9d2590bd615376141fbebd2d - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2897,6 +2881,7 @@ __metadata: "@swc/jest": "npm:^0.2.38" "@types/jest": "npm:^30.0.0" "@types/node": "npm:^24.0.10" + "@types/rimraf": "npm:^3.0.2" "@types/uuid": "npm:^8.3.4" "@typescript-eslint/eslint-plugin": "npm:5.30.7" "@typescript-eslint/parser": "npm:5.30.7" @@ -2931,7 +2916,7 @@ __metadata: react: "npm:^17.0.1" react-dom: "npm:^17.0.1" read-pkg-up: "npm:^7.0.1" - rimraf: "npm:^6.0.1" + rimraf: "npm:^3.0.2" storybook: "npm:0.0.0-pr-31819-sha-7e336af7" tempy: "npm:^1.0.1" ts-dedent: "npm:^2.0.0" @@ -3240,6 +3225,16 @@ __metadata: languageName: node linkType: hard +"@types/glob@npm:*": + version: 8.1.0 + resolution: "@types/glob@npm:8.1.0" + dependencies: + "@types/minimatch": "npm:^5.1.2" + "@types/node": "npm:*" + checksum: 10/9101f3a9061e40137190f70626aa0e202369b5ec4012c3fabe6f5d229cce04772db9a94fa5a0eb39655e2e4ad105c38afbb4af56a56c0996a8c7d4fc72350e3d + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.1, @types/istanbul-lib-coverage@npm:^2.0.4, @types/istanbul-lib-coverage@npm:^2.0.6": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" @@ -3289,6 +3284,13 @@ __metadata: languageName: node linkType: hard +"@types/minimatch@npm:^5.1.2": + version: 5.1.2 + resolution: "@types/minimatch@npm:5.1.2" + checksum: 10/94db5060d20df2b80d77b74dd384df3115f01889b5b6c40fa2dfa27cfc03a68fb0ff7c1f2a0366070263eb2e9d6bfd8c87111d4bc3ae93c3f291297c1bf56c85 + languageName: node + linkType: hard + "@types/node@npm:*, @types/node@npm:^24.0.10": version: 24.0.10 resolution: "@types/node@npm:24.0.10" @@ -3319,6 +3321,16 @@ __metadata: languageName: node linkType: hard +"@types/rimraf@npm:^3.0.2": + version: 3.0.2 + resolution: "@types/rimraf@npm:3.0.2" + dependencies: + "@types/glob": "npm:*" + "@types/node": "npm:*" + checksum: 10/b47fa302f46434cba704d20465861ad250df79467d3d289f9d6490d3aeeb41e8cb32dd80bd1a8fd833d1e185ac719fbf9be12e05ad9ce9be094d8ee8f1405347 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.3": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -5772,7 +5784,7 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.1": +"foreground-child@npm:^3.1.0": version: 3.3.1 resolution: "foreground-child@npm:3.3.1" dependencies: @@ -5978,22 +5990,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^11.0.0": - version: 11.0.3 - resolution: "glob@npm:11.0.3" - dependencies: - foreground-child: "npm:^3.3.1" - jackspeak: "npm:^4.1.1" - minimatch: "npm:^10.0.3" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^2.0.0" - bin: - glob: dist/esm/bin.mjs - checksum: 10/2ae536c1360c0266b523b2bfa6aadc10144a8b7e08869b088e37ac3c27cd30774f82e4bfb291cde796776e878f9e13200c7ff44010eb7054e00f46f649397893 - languageName: node - linkType: hard - "glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -6621,15 +6617,6 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^4.1.1": - version: 4.1.1 - resolution: "jackspeak@npm:4.1.1" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - checksum: 10/ffceb270ec286841f48413bfb4a50b188662dfd599378ce142b6540f3f0a66821dc9dcb1e9ebc55c6c3b24dc2226c96e5819ba9bd7a241bd29031b61911718c7 - languageName: node - linkType: hard - "jake@npm:^10.8.5": version: 10.9.2 resolution: "jake@npm:10.9.2" @@ -7494,13 +7481,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^11.0.0": - version: 11.1.0 - resolution: "lru-cache@npm:11.1.0" - checksum: 10/5011011675ca98428902de774d0963b68c3a193cd959347cb63b781dad4228924124afab82159fd7b8b4db18285d9aff462b877b8f6efd2b41604f806c1d9db4 - languageName: node - linkType: hard - "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -7680,15 +7660,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.0.3": - version: 10.0.3 - resolution: "minimatch@npm:10.0.3" - dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10/d5b8b2538b367f2cfd4aeef27539fddeee58d1efb692102b848e4a968a09780a302c530eb5aacfa8c57f7299155fb4b4e85219ad82664dcef5c66f657111d9b8 - languageName: node - linkType: hard - "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -8350,16 +8321,6 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^2.0.0": - version: 2.0.0 - resolution: "path-scurry@npm:2.0.0" - dependencies: - lru-cache: "npm:^11.0.0" - minipass: "npm:^7.1.2" - checksum: 10/285ae0c2d6c34ae91dc1d5378ede21981c9a2f6de1ea9ca5a88b5a270ce9763b83dbadc7a324d512211d8d36b0c540427d3d0817030849d97a60fa840a2c59ec - languageName: node - linkType: hard - "path-type@npm:^3.0.0": version: 3.0.0 resolution: "path-type@npm:3.0.0" @@ -9094,18 +9055,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^6.0.1": - version: 6.0.1 - resolution: "rimraf@npm:6.0.1" - dependencies: - glob: "npm:^11.0.0" - package-json-from-dist: "npm:^1.0.0" - bin: - rimraf: dist/esm/bin.mjs - checksum: 10/0eb7edf08aa39017496c99ba675552dda11a20811ba78f8232da2ba945308c91e9cd673f95998b1a8202bc7436d33390831d23ea38ae52751038d56373ad99e2 - languageName: node - linkType: hard - "rollup@npm:^4.34.8, rollup@npm:^4.40.0": version: 4.45.1 resolution: "rollup@npm:4.45.1" From cefc1d206417adb757099820322d2985464cea26 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Tue, 14 Oct 2025 15:59:41 +0200 Subject: [PATCH 26/29] upgrade to Storybook 10 beta --- package.json | 10 +- yarn.lock | 281 ++++++++++++++++++++++++++++----------------------- 2 files changed, 157 insertions(+), 134 deletions(-) diff --git a/package.json b/package.json index 67893b28..b9743b46 100644 --- a/package.json +++ b/package.json @@ -81,10 +81,10 @@ "@babel/preset-env": "^7.19.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", - "@storybook/addon-a11y": "0.0.0-pr-31819-sha-7e336af7", + "@storybook/addon-a11y": "^10.0.0-beta.10", "@storybook/addon-coverage": "^1.0.0", - "@storybook/addon-docs": "0.0.0-pr-31819-sha-7e336af7", - "@storybook/react-vite": "0.0.0-pr-31819-sha-7e336af7", + "@storybook/addon-docs": "^10.0.0-beta.10", + "@storybook/react-vite": "^10.0.0-beta.10", "@types/jest": "^30.0.0", "@types/node": "^24.0.10", "@types/rimraf": "^3.0.2", @@ -115,7 +115,7 @@ "react": "^17.0.1", "react-dom": "^17.0.1", "read-pkg-up": "^7.0.1", - "storybook": "0.0.0-pr-31819-sha-7e336af7", + "storybook": "^10.0.0-beta.10", "tempy": "^1.0.1", "ts-dedent": "^2.0.0", "ts-jest": "^29.4.0", @@ -126,7 +126,7 @@ "wait-on": "^7.2.0" }, "peerDependencies": { - "storybook": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0" + "storybook": "^10.0.0 || ^10.0.0-0" }, "packageManager": "yarn@4.5.1", "engines": { diff --git a/yarn.lock b/yarn.lock index 9027795d..99b66ddf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -373,7 +373,14 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 10/e347d87728b1ab10b6976d46403941c8f9008c045ea6d99997a7ffca7b852dc34b6171380f7b17edf94410e0857ff26f3a53d8618f11d73744db86e8ca9b8c64 + languageName: node + linkType: hard + +"@babel/helper-plugin-utils@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-plugin-utils@npm:7.27.1" checksum: 10/96136c2428888e620e2ec493c25888f9ceb4a21099dcf3dd4508ea64b58cdedbd5a9fb6c7b352546de84d6c24edafe482318646932a22c449ebd16d16c22d864 @@ -435,6 +442,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-string-parser@npm:7.27.1" @@ -449,6 +463,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.25.9, @babel/helper-validator-option@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-option@npm:7.27.1" @@ -477,7 +498,18 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" + dependencies: + "@babel/types": "npm:^7.26.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/8baee43752a3678ad9f9e360ec845065eeee806f1fdc8e0f348a8a0e13eef0959dabed4a197c978896c493ea205c804d0a1187cc52e4a1ba017c7935bab4983d + languageName: node + linkType: hard + +"@babel/parser@npm:^7.25.4, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0": version: 7.28.0 resolution: "@babel/parser@npm:7.28.0" dependencies: @@ -643,7 +675,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.22.5, @babel/plugin-syntax-jsx@npm:^7.25.9, @babel/plugin-syntax-jsx@npm:^7.27.1": +"@babel/plugin-syntax-jsx@npm:^7.22.5, @babel/plugin-syntax-jsx@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563 + languageName: node + linkType: hard + +"@babel/plugin-syntax-jsx@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-syntax-jsx@npm:7.27.1" dependencies: @@ -742,7 +785,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.25.9, @babel/plugin-syntax-typescript@npm:^7.27.1": +"@babel/plugin-syntax-typescript@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.25.9" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/0e9821e8ba7d660c36c919654e4144a70546942ae184e85b8102f2322451eae102cbfadbcadd52ce077a2b44b400ee52394c616feab7b5b9f791b910e933fd33 + languageName: node + linkType: hard + +"@babel/plugin-syntax-typescript@npm:^7.27.1": version: 7.27.1 resolution: "@babel/plugin-syntax-typescript@npm:7.27.1" dependencies: @@ -1600,7 +1654,17 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.4.4": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/40780741ecec886ed9edae234b5eb4976968cc70d72b4e5a40d55f83ff2cc457de20f9b0f4fe9d858350e43dab0ea496e7ef62e2b2f08df699481a76df02cd6e + languageName: node + linkType: hard + +"@babel/types@npm:^7.25.4, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0": version: 7.28.1 resolution: "@babel/types@npm:7.28.1" dependencies: @@ -2709,15 +2773,15 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-a11y@npm:0.0.0-pr-31819-sha-7e336af7": - version: 0.0.0-pr-31819-sha-7e336af7 - resolution: "@storybook/addon-a11y@npm:0.0.0-pr-31819-sha-7e336af7" +"@storybook/addon-a11y@npm:^10.0.0-beta.10": + version: 10.0.0-beta.10 + resolution: "@storybook/addon-a11y@npm:10.0.0-beta.10" dependencies: "@storybook/global": "npm:^5.0.0" axe-core: "npm:^4.2.0" peerDependencies: - storybook: ^0.0.0-pr-31819-sha-7e336af7 - checksum: 10/f7314295d597b9e530436451f9881553a44196e4b894a36877ff4f01d5678f89702b257f641b78e52efb20d1957a47f5e6a403d26b4e30bcf264b599527765a0 + storybook: ^10.0.0-beta.10 + checksum: 10/05d05b9030669f192717e5b9249db95e0d1526f6a6cec154e56852cad85ed15dabf199d0d2f0183489eb921b1c3b21782b1734fe3de682030fb6b2a440400c75 languageName: node linkType: hard @@ -2737,45 +2801,45 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-docs@npm:0.0.0-pr-31819-sha-7e336af7": - version: 0.0.0-pr-31819-sha-7e336af7 - resolution: "@storybook/addon-docs@npm:0.0.0-pr-31819-sha-7e336af7" +"@storybook/addon-docs@npm:^10.0.0-beta.10": + version: 10.0.0-beta.10 + resolution: "@storybook/addon-docs@npm:10.0.0-beta.10" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:0.0.0-pr-31819-sha-7e336af7" - "@storybook/icons": "npm:^1.2.12" - "@storybook/react-dom-shim": "npm:0.0.0-pr-31819-sha-7e336af7" + "@storybook/csf-plugin": "npm:10.0.0-beta.10" + "@storybook/icons": "npm:^1.6.0" + "@storybook/react-dom-shim": "npm:10.0.0-beta.10" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^0.0.0-pr-31819-sha-7e336af7 - checksum: 10/b6a97b8d2f05635b72f566d904133c8a52b1b2e60104dae42980c62400d099c8a6635a1a331d8214ad8b8ccd7a6f0aae749ec697bf4b5b842f61234c163bb74b + storybook: ^10.0.0-beta.10 + checksum: 10/ed59e6167cf70b3f2e7c425b48cdf4882573743e2a62206f34aaa417518eb7f7903b330488a938c37340ce833e80ffa45de61fba5ae0efb865fb2ebcbc395e88 languageName: node linkType: hard -"@storybook/builder-vite@npm:0.0.0-pr-31819-sha-7e336af7": - version: 0.0.0-pr-31819-sha-7e336af7 - resolution: "@storybook/builder-vite@npm:0.0.0-pr-31819-sha-7e336af7" +"@storybook/builder-vite@npm:10.0.0-beta.10": + version: 10.0.0-beta.10 + resolution: "@storybook/builder-vite@npm:10.0.0-beta.10" dependencies: - "@storybook/csf-plugin": "npm:0.0.0-pr-31819-sha-7e336af7" + "@storybook/csf-plugin": "npm:10.0.0-beta.10" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^0.0.0-pr-31819-sha-7e336af7 + storybook: ^10.0.0-beta.10 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10/8f614a114f6719d25eeb9eede04488a952818b55c7451a7a35a767fe4f0e7c65a3871c73488d4d0784d6caade3bca4e2e8e57d7cbe60369f9bf2e3f7f8c27d4f + checksum: 10/c2995531765a0bb30088df024905eb008f1d61ac5c0a767993dc48a940a6f2da8782eef1a8071ae0f23678652e2b5a9470a97964ae27a364bff58ba6f8fb2df8 languageName: node linkType: hard -"@storybook/csf-plugin@npm:0.0.0-pr-31819-sha-7e336af7": - version: 0.0.0-pr-31819-sha-7e336af7 - resolution: "@storybook/csf-plugin@npm:0.0.0-pr-31819-sha-7e336af7" +"@storybook/csf-plugin@npm:10.0.0-beta.10": + version: 10.0.0-beta.10 + resolution: "@storybook/csf-plugin@npm:10.0.0-beta.10" dependencies: unplugin: "npm:^2.3.5" peerDependencies: esbuild: "*" rollup: "*" - storybook: ^0.0.0-pr-31819-sha-7e336af7 + storybook: ^10.0.0-beta.10 vite: "*" webpack: "*" peerDependenciesMeta: @@ -2787,7 +2851,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10/e3a5861fcd57e6305cdf40a629f199b40de4cd64d352645d6b3e83c69d9c797911fd8b82fd46663b8ce90e770daec93638b3ff9cacb04cda222559fb3602e113 + checksum: 10/31a1202a51d7e8e1769114ec21a8d82f085221a05c706a178d0fbbc40cbc8b91a26d68f5034802ff20edcdd8a1a1142cdf749a2424b88d0efbfa6c409f47ab74 languageName: node linkType: hard @@ -2798,36 +2862,36 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^1.2.12, @storybook/icons@npm:^1.4.0": - version: 1.4.0 - resolution: "@storybook/icons@npm:1.4.0" +"@storybook/icons@npm:^1.6.0": + version: 1.6.0 + resolution: "@storybook/icons@npm:1.6.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - checksum: 10/513d36188bb84f1f64dd982b6bd577de4c3d7bc2aa9d318a2acf8c654d16994bac0b669787a4ced6720e471251bcb0ec68b8d8dc2cc7245d11102bd617243700 + checksum: 10/f9036ca3b0d2904778eb4e202305f2780b549434380f9760f0bc704fe3ee19d7332f9560a66435ebb2156346cee9a863e40fa5e4b27790bf993b0c1180a3146d languageName: node linkType: hard -"@storybook/react-dom-shim@npm:0.0.0-pr-31819-sha-7e336af7": - version: 0.0.0-pr-31819-sha-7e336af7 - resolution: "@storybook/react-dom-shim@npm:0.0.0-pr-31819-sha-7e336af7" +"@storybook/react-dom-shim@npm:10.0.0-beta.10": + version: 10.0.0-beta.10 + resolution: "@storybook/react-dom-shim@npm:10.0.0-beta.10" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^0.0.0-pr-31819-sha-7e336af7 - checksum: 10/2a9317c180473d8ae0aa7de66856193e3b41f8dd3f031e4c367bbd80ed155217d4e428c240891d66e8458025ee1ba6f6b8564423bfb98b1ac2c4ae77ede8212e + storybook: ^10.0.0-beta.10 + checksum: 10/5198c92fdaebfc5fe8f659b1a247fc7ed2b3f96ad0b745dcbe351717acd27ee6879587a24a0b0bc0ebff610307e72a9d4ad4da358d3075b57ec436215dda7c96 languageName: node linkType: hard -"@storybook/react-vite@npm:0.0.0-pr-31819-sha-7e336af7": - version: 0.0.0-pr-31819-sha-7e336af7 - resolution: "@storybook/react-vite@npm:0.0.0-pr-31819-sha-7e336af7" +"@storybook/react-vite@npm:^10.0.0-beta.10": + version: 10.0.0-beta.10 + resolution: "@storybook/react-vite@npm:10.0.0-beta.10" dependencies: "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.1" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:0.0.0-pr-31819-sha-7e336af7" - "@storybook/react": "npm:0.0.0-pr-31819-sha-7e336af7" - find-up: "npm:^7.0.0" + "@storybook/builder-vite": "npm:10.0.0-beta.10" + "@storybook/react": "npm:10.0.0-beta.10" + empathic: "npm:^2.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" resolve: "npm:^1.22.8" @@ -2835,27 +2899,27 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^0.0.0-pr-31819-sha-7e336af7 + storybook: ^10.0.0-beta.10 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10/a65ecfc2e38743c49e4e439464d47dbad44f4284b0201f696351757835ecf898457a3753967a5854b086bd4a79ac08dc33be35aafbc063fad18f86c5ee2b9b4a + checksum: 10/767cc72b913a4533b70dbd34129224fb880f7c812afab3b985e4732789ee90f8897224f51586121ecd56733b0508a297f6dffdba468e73ef87945605b3cbf521 languageName: node linkType: hard -"@storybook/react@npm:0.0.0-pr-31819-sha-7e336af7": - version: 0.0.0-pr-31819-sha-7e336af7 - resolution: "@storybook/react@npm:0.0.0-pr-31819-sha-7e336af7" +"@storybook/react@npm:10.0.0-beta.10": + version: 10.0.0-beta.10 + resolution: "@storybook/react@npm:10.0.0-beta.10" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:0.0.0-pr-31819-sha-7e336af7" + "@storybook/react-dom-shim": "npm:10.0.0-beta.10" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - storybook: ^0.0.0-pr-31819-sha-7e336af7 + storybook: ^10.0.0-beta.10 typescript: ">= 4.9.x" peerDependenciesMeta: typescript: optional: true - checksum: 10/bb02c088d5492c3587dd8aaf687b826f4ac3a4135a10437ee9d623934412d03e7d818bc983f3fc6224051e3fc1d0fbd90c7310117618ca7da2f45dab5c9a8803 + checksum: 10/ac43ef1b71a9f36256f4a32af311075c5f53c19b77eb3e16a45bbf1a05719ee8ebbe8833fd60f36675555474569acd78ff8ddea4eac83477e5e15c9e3de71311 languageName: node linkType: hard @@ -2873,10 +2937,10 @@ __metadata: "@babel/template": "npm:^7.22.5" "@babel/types": "npm:^7.22.5" "@jest/types": "npm:^30.0.1" - "@storybook/addon-a11y": "npm:0.0.0-pr-31819-sha-7e336af7" + "@storybook/addon-a11y": "npm:^10.0.0-beta.10" "@storybook/addon-coverage": "npm:^1.0.0" - "@storybook/addon-docs": "npm:0.0.0-pr-31819-sha-7e336af7" - "@storybook/react-vite": "npm:0.0.0-pr-31819-sha-7e336af7" + "@storybook/addon-docs": "npm:^10.0.0-beta.10" + "@storybook/react-vite": "npm:^10.0.0-beta.10" "@swc/core": "npm:^1.5.22" "@swc/jest": "npm:^0.2.38" "@types/jest": "npm:^30.0.0" @@ -2917,7 +2981,7 @@ __metadata: react-dom: "npm:^17.0.1" read-pkg-up: "npm:^7.0.1" rimraf: "npm:^3.0.2" - storybook: "npm:0.0.0-pr-31819-sha-7e336af7" + storybook: "npm:^10.0.0-beta.10" tempy: "npm:^1.0.1" ts-dedent: "npm:^2.0.0" ts-jest: "npm:^29.4.0" @@ -2928,7 +2992,7 @@ __metadata: vitest: "npm:^3.2.4" wait-on: "npm:^7.2.0" peerDependencies: - storybook: ^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0 + storybook: ^10.0.0 || ^10.0.0-0 bin: test-storybook: ./dist/test-storybook.js languageName: unknown @@ -3218,13 +3282,20 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.8, @types/estree@npm:^1.0.0": +"@types/estree@npm:1.0.8": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10/25a4c16a6752538ffde2826c2cc0c6491d90e69cd6187bef4a006dd2c3c45469f049e643d7e516c515f21484dc3d48fd5c870be158a5beb72f5baf3dc43e4099 languageName: node linkType: hard +"@types/estree@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 + languageName: node + linkType: hard + "@types/glob@npm:*": version: 8.1.0 resolution: "@types/glob@npm:8.1.0" @@ -4261,15 +4332,6 @@ __metadata: languageName: node linkType: hard -"better-opn@npm:^3.0.2": - version: 3.0.2 - resolution: "better-opn@npm:3.0.2" - dependencies: - open: "npm:^8.0.4" - checksum: 10/24668e5a837d0d2c0edf17ad5ebcfeb00a8a5578a5eb09f7a409e1a60617cdfea40b8ebfc95e5f12d9568157930d033e6805788fcf0780413ac982c95d3745d1 - languageName: node - linkType: hard - "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" @@ -4959,13 +5021,6 @@ __metadata: languageName: node linkType: hard -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 10/0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 - languageName: node - linkType: hard - "del@npm:^6.0.0": version: 6.1.1 resolution: "del@npm:6.1.1" @@ -5163,6 +5218,13 @@ __metadata: languageName: node linkType: hard +"empathic@npm:^2.0.0": + version: 2.0.0 + resolution: "empathic@npm:2.0.0" + checksum: 10/90f47d93f8d1db3aa00ce1bfae2940bf76379dbb34bd562edbd92c3564a173cb1d6bd3cadb645fad0224839c25886abde801155d9b972dda6add7a5cc8b35d48 + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -5742,17 +5804,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^7.0.0": - version: 7.0.0 - resolution: "find-up@npm:7.0.0" - dependencies: - locate-path: "npm:^7.2.0" - path-exists: "npm:^5.0.0" - unicorn-magic: "npm:^0.1.0" - checksum: 10/7e6b08fbc05a10677e25e74bb0a020054a86b31d1806c5e6a9e32e75472bbf177210bc16e5f97453be8bda7ae2e3d97669dbb2901f8c30b39ce53929cbea6746 - languageName: node - linkType: hard - "fix-dts-default-cjs-exports@npm:^1.0.0": version: 1.0.1 resolution: "fix-dts-default-cjs-exports@npm:1.0.1" @@ -6347,15 +6398,6 @@ __metadata: languageName: node linkType: hard -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 10/3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -6470,15 +6512,6 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: "npm:^2.0.0" - checksum: 10/20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 - languageName: node - linkType: hard - "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -7368,7 +7401,7 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^7.1.0, locate-path@npm:^7.2.0": +"locate-path@npm:^7.1.0": version: 7.2.0 resolution: "locate-path@npm:7.2.0" dependencies: @@ -8067,17 +8100,6 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.0.4": - version: 8.4.2 - resolution: "open@npm:8.4.2" - dependencies: - define-lazy-prop: "npm:^2.0.0" - is-docker: "npm:^2.1.1" - is-wsl: "npm:^2.2.0" - checksum: 10/acd81a1d19879c818acb3af2d2e8e9d81d17b5367561e623248133deb7dd3aefaed527531df2677d3e6aaf0199f84df57b6b2262babff8bf46ea0029aac536c9 - languageName: node - linkType: hard - "os-homedir@npm:^1.0.0, os-homedir@npm:^1.0.1": version: 1.0.2 resolution: "os-homedir@npm:1.0.2" @@ -9208,7 +9230,16 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.2, semver@npm:^7.7.2": +"semver@npm:^7.0.0, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.2": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + languageName: node + linkType: hard + +"semver@npm:^7.3.7, semver@npm:^7.7.2": version: 7.7.2 resolution: "semver@npm:7.7.2" bin: @@ -9508,18 +9539,17 @@ __metadata: languageName: node linkType: hard -"storybook@npm:0.0.0-pr-31819-sha-7e336af7": - version: 0.0.0-pr-31819-sha-7e336af7 - resolution: "storybook@npm:0.0.0-pr-31819-sha-7e336af7" +"storybook@npm:^10.0.0-beta.10": + version: 10.0.0-beta.10 + resolution: "storybook@npm:10.0.0-beta.10" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/icons": "npm:^1.4.0" + "@storybook/icons": "npm:^1.6.0" "@testing-library/jest-dom": "npm:^6.6.3" "@testing-library/user-event": "npm:^14.6.1" "@vitest/expect": "npm:3.2.4" "@vitest/mocker": "npm:3.2.4" "@vitest/spy": "npm:3.2.4" - better-opn: "npm:^3.0.2" esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" recast: "npm:^0.23.5" semver: "npm:^7.6.2" @@ -9531,7 +9561,7 @@ __metadata: optional: true bin: storybook: ./dist/bin/dispatcher.js - checksum: 10/8f57c79dde18b14d03a276170a6ae65c58f1f0bada2f17839f84d0acde88b2f57dc6845889c585df814a1c236f0986e718be3d9b526bf5ddbc2522c033d112c5 + checksum: 10/ae4a173f21aab64d2144da9b4ef963f43c6cd84d459e587654c4cb74d0738cf782b441becebd2dd021f42f08b2f4300ca61fe863c922036ba13f0e96f7545158 languageName: node linkType: hard @@ -10302,13 +10332,6 @@ __metadata: languageName: node linkType: hard -"unicorn-magic@npm:^0.1.0": - version: 0.1.0 - resolution: "unicorn-magic@npm:0.1.0" - checksum: 10/9b4d0e9809807823dc91d0920a4a4c0cff2de3ebc54ee87ac1ee9bc75eafd609b09d1f14495e0173aef26e01118706196b6ab06a75fe0841028b3983a8af313f - languageName: node - linkType: hard - "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" From 8ec6db18e3ce2ff32dd04cae8d3c8be25d54c469 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Fri, 17 Oct 2025 11:06:40 +0200 Subject: [PATCH 27/29] fix path --- src/config/jest-playwright.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 229e5630..1f5f094b 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -5,7 +5,7 @@ import type { Config } from '@jest/types'; const getTestRunnerPath = () => { return ( process.env.STORYBOOK_TEST_RUNNER_PATH ?? - path.dirname(require.resolve('@storybook/test-runner')) + path.dirname(require.resolve('@storybook/test-runner/package.json')) ); }; From fe81472344dea8133c0a7c60ad110e8fa6a8ebe5 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Fri, 17 Oct 2025 17:51:08 +0200 Subject: [PATCH 28/29] fixes --- src/config/jest-playwright.ts | 2 - src/test-storybook.ts | 75 +++++++++++++++-------------------- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/src/config/jest-playwright.ts b/src/config/jest-playwright.ts index 1f5f094b..d07215bb 100644 --- a/src/config/jest-playwright.ts +++ b/src/config/jest-playwright.ts @@ -26,8 +26,6 @@ const getJestPlaywrightConfig = (): Config.InitialOptions => { const expectPlaywrightPath = path.dirname(require.resolve('expect-playwright')); return { runner: path.join(resolvedRunnerPath, 'dist/jest-playwright-entries/runner.js'), - globalSetup: path.join(resolvedRunnerPath, 'playwright/global-setup.js'), - globalTeardown: path.join(resolvedRunnerPath, 'playwright/global-teardown.js'), testEnvironment: path.join(resolvedRunnerPath, 'playwright/custom-environment.js'), setupFilesAfterEnv: [ path.join(resolvedRunnerPath, 'playwright/jest-setup.js'), diff --git a/src/test-storybook.ts b/src/test-storybook.ts index 6dfd74c2..bc215630 100644 --- a/src/test-storybook.ts +++ b/src/test-storybook.ts @@ -91,7 +91,7 @@ async function reportCoverage() { execSync( `node ${nycBinFullPath} report --reporter=text --reporter=lcov -t ${coverageFolder} --report-dir ${coverageFolder}`, { - stdio: 'inherit', + stdio: 'pipe', cwd: process.cwd(), } ); @@ -158,48 +158,37 @@ async function executeJestPlaywright(args: JestOptions) { ' ' )} --config "${jestConfigPath}" --color`; - const runThing = async (type: 'previous' | 'current') => { - if (type === 'previous') { - execSync(command, { - stdio: 'inherit', - cwd: process.cwd(), - }); - } else { - const child = spawn(command, { - shell: true, - cwd: process.cwd(), - stdio: ['inherit', 'pipe'], - }); - const shouldLog = (str: string) => { - return ( - !str.includes('watchman') && - !str.includes('DeprecationWarning') && - !str.includes('ExperimentalWarning') - ); - }; - const exitCode = await new Promise((resolve) => { - // filter out messages like DeprecationWarning and ExperimentalWarning - child.stdout?.on('data', (data) => { - const str = data.toString(); - if (shouldLog(str)) { - process.stdout.write(data); - } - }); - child.stderr?.on('data', (data) => { - const str = data.toString(); - if (shouldLog(str)) { - process.stderr.write(data); - } - }); - - child.on('exit', (exitCode) => resolve(exitCode || 0)); - }); - - process.exit(exitCode); - } + const child = spawn(command, { + shell: true, + cwd: process.cwd(), + stdio: ['inherit', 'pipe'], + }); + const shouldLog = (str: string) => { + return ( + !str.includes('watchman') && + !str.includes('DeprecationWarning') && + !str.includes('ExperimentalWarning') + ); }; + const exitCode = await new Promise((resolve) => { + // filter out messages like DeprecationWarning and ExperimentalWarning + child.stdout?.on('data', (data) => { + const str = data.toString(); + if (shouldLog(str)) { + process.stdout.write(data); + } + }); + child.stderr?.on('data', (data) => { + const str = data.toString(); + if (shouldLog(str)) { + process.stderr.write(data); + } + }); + + child.on('exit', (exitCode) => resolve(exitCode || 0)); + }); - await runThing('previous'); + process.exit(exitCode); } async function checkStorybook(url: string) { @@ -298,7 +287,9 @@ function ejectConfiguration() { } // copy contents of origin and replace ../dist with @storybook/test-runner - const content = fs.readFileSync(origin, 'utf-8').replace(/..\/dist/g, '@storybook/test-runner'); + const content = fs + .readFileSync(origin, 'utf-8') + .replace('../dist/index.js', '@storybook/test-runner'); fs.writeFileSync(destination, content); log(`Configuration file successfully generated at ${destination}`); } From e482a2ff2c3fd83691d31d29ef1beb27505b21a1 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Mon, 20 Oct 2025 12:46:18 +0200 Subject: [PATCH 29/29] fix constants --- src/jest-playwright-preset/global.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/jest-playwright-preset/global.ts b/src/jest-playwright-preset/global.ts index 691b6432..26cde75b 100644 --- a/src/jest-playwright-preset/global.ts +++ b/src/jest-playwright-preset/global.ts @@ -1,16 +1,14 @@ /* eslint-disable no-console */ -import { - setup as setupServer, - teardown as teardownServer, - ERROR_TIMEOUT, - ERROR_NO_COMMAND, -} from 'jest-process-manager'; +import { setup as setupServer, teardown as teardownServer } from 'jest-process-manager'; import { readConfig } from './utils'; import type { Config as JestConfig } from '@jest/types'; import { ServerOptions } from './types'; let didAlreadyRunInWatchMode = false; +const ERROR_TIMEOUT = 'ERROR_TIMEOUT'; +const ERROR_NO_COMMAND = 'ERROR_NO_COMMAND'; + const logMessage = ({ message, action }: { message: string; action: string }): void => { console.log(''); console.error(message);