diff --git a/.circleci/README.md b/.circleci/README.md index d08ff6840245..20c66ce653fe 100644 --- a/.circleci/README.md +++ b/.circleci/README.md @@ -53,6 +53,7 @@ The configuration accepts several pipeline parameters: - **`check`**: Type checking and validation - **`unit-tests`**: Vitest-based unit tests - **`e2e-ui`**: End-to-end tests for Storybook's manager UI +- **`e2e-ui-vitest-3`**: End-to-end tests for Storybook's manager UI using Vitest 3 - **`test-init-empty`**: Tests Storybook init from empty directories - **`test-init-features`**: Tests Storybook initialization with features - **`test-portable-stories`**: Tests portable stories across frameworks diff --git a/.circleci/config.yml b/.circleci/config.yml index b4b20dc60deb..d15d373abe98 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -443,6 +443,31 @@ jobs: destination: playwright path: test-storybooks/portable-stories-kitchen-sink/react/test-results/ - report-workflow-on-failure + e2e-ui-vitest-3: + executor: + class: medium + name: sb_playwright + steps: + - git-shallow-clone/checkout_advanced: + clone_options: --depth 1 --verbose + - attach_workspace: + at: . + - run: + command: yarn install --no-immutable + environment: + YARN_ENABLE_IMMUTABLE_INSTALLS: false + name: Install dependencies + working_directory: test-storybooks/portable-stories-kitchen-sink/react-vitest-3 + - run: + command: yarn playwright-e2e + name: Run E2E tests + working_directory: test-storybooks/portable-stories-kitchen-sink/react-vitest-3 + - store_test_results: + path: test-results + - store_artifacts: + destination: playwright + path: test-storybooks/portable-stories-kitchen-sink/react-vitest-3/test-results/ + - report-workflow-on-failure knip: executor: class: large @@ -979,6 +1004,9 @@ workflows: - e2e-ui: requires: - build + - e2e-ui-vitest-3: + requires: + - build - test-init-features: requires: - build @@ -1068,6 +1096,9 @@ workflows: - e2e-ui: requires: - build + - e2e-ui-vitest-3: + requires: + - build - test-init-features: requires: - build @@ -1128,6 +1159,9 @@ workflows: - e2e-ui: requires: - build + - e2e-ui-vitest-3: + requires: + - build - test-init-features: requires: - build diff --git a/.circleci/src/jobs/e2e-ui-vitest-3.yml b/.circleci/src/jobs/e2e-ui-vitest-3.yml new file mode 100644 index 000000000000..79aded7faf0f --- /dev/null +++ b/.circleci/src/jobs/e2e-ui-vitest-3.yml @@ -0,0 +1,25 @@ +executor: + name: sb_playwright + class: medium + +steps: + - git-shallow-clone/checkout_advanced: + clone_options: '--depth 1 --verbose' + - attach_workspace: + at: . + - run: + name: Install dependencies + command: yarn install --no-immutable + working_directory: test-storybooks/portable-stories-kitchen-sink/react-vitest-3 + environment: + YARN_ENABLE_IMMUTABLE_INSTALLS: false + - run: + name: Run E2E tests + command: yarn playwright-e2e + working_directory: test-storybooks/portable-stories-kitchen-sink/react-vitest-3 + - store_test_results: + path: test-results + - store_artifacts: + path: test-storybooks/portable-stories-kitchen-sink/react-vitest-3/test-results/ + destination: playwright + - report-workflow-on-failure diff --git a/.circleci/src/workflows/daily.yml b/.circleci/src/workflows/daily.yml index a4048ab24a50..0606110c704b 100644 --- a/.circleci/src/workflows/daily.yml +++ b/.circleci/src/workflows/daily.yml @@ -39,11 +39,11 @@ jobs: requires: - create-sandboxes - e2e-production: - parallelism: 25 + parallelism: 7 requires: - create-sandboxes - e2e-dev: - parallelism: 1 + parallelism: 25 requires: - create-sandboxes - test-runner-production: @@ -63,6 +63,9 @@ jobs: - e2e-ui: requires: - build + - e2e-ui-vitest-3: + requires: + - build - test-init-features: requires: - build diff --git a/.circleci/src/workflows/merged.yml b/.circleci/src/workflows/merged.yml index 587cb6414117..fae1b0a112e7 100644 --- a/.circleci/src/workflows/merged.yml +++ b/.circleci/src/workflows/merged.yml @@ -39,11 +39,11 @@ jobs: requires: - create-sandboxes - e2e-production: - parallelism: 12 + parallelism: 6 requires: - create-sandboxes - e2e-dev: - parallelism: 1 + parallelism: 12 requires: - create-sandboxes - test-runner-production: @@ -63,6 +63,9 @@ jobs: - e2e-ui: requires: - build + - e2e-ui-vitest-3: + requires: + - build - test-init-features: requires: - build diff --git a/.circleci/src/workflows/normal.yml b/.circleci/src/workflows/normal.yml index b6e566bc67ff..1bf662049939 100644 --- a/.circleci/src/workflows/normal.yml +++ b/.circleci/src/workflows/normal.yml @@ -39,11 +39,11 @@ jobs: requires: - create-sandboxes - e2e-production: - parallelism: 8 + parallelism: 6 requires: - create-sandboxes - e2e-dev: - parallelism: 1 + parallelism: 8 requires: - create-sandboxes - test-runner-production: @@ -62,6 +62,9 @@ jobs: - e2e-ui: requires: - build + - e2e-ui-vitest-3: + requires: + - build - test-init-features: requires: - build diff --git a/.gitignore b/.gitignore index 9bf3c7eb5332..19177a9e9365 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,6 @@ tsconfig.vitest-temp.json # test-storybooks test-storybooks/ember-cli/ember-output -test-storybooks/angular-cli/addon-jest.testresults.json npm-shrinkwrap.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 33f2764a37f0..67dd4be250e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 9.1.14 + +- NextJS: Add NextJS 16 support - [#32791](https://github.com/storybookjs/storybook/pull/32791), thanks @yannbf and @ndelangen! +- Addon-Vitest: Support Vitest 4 - [#32819](https://github.com/storybookjs/storybook/pull/32819), thanks @yannbf and @ndelangen! +- CSF: Fix `play-fn` tag for methods - [#32695](https://github.com/storybookjs/storybook/pull/32695), thanks @shilman! + ## 9.1.13 - Nextjs: Fix config access for Vite - [#32759](https://github.com/storybookjs/storybook/pull/32759), thanks @valentinpalkovic! diff --git a/README.md b/README.md index 1bf638d98ba1..9eebc6f6b6f0 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ For additional help, share your issue in [the repo's GitHub Discussions](https:/ | [events](https://github.com/storybookjs/addon-events) | Interactively fire events to components that respond to EventEmitter | | [google-analytics](https://github.com/storybookjs/addon-google-analytics) | Reports google analytics on stories | | [graphql](https://github.com/storybookjs/addon-graphql) | Query a GraphQL server within Storybook stories | -| [jest](code/addons/jest/) | View the results of components' unit tests in Storybook | +| [jest](https://github.com/storybookjs/addon-jest) | View the results of components' unit tests in Storybook | | [links](code/addons/links/) | Create links between stories | | [measure](code/core/src/measure/) | Visually inspect the layout and box model within the Storybook UI | | [outline](code/core/src/outline/) | Visually debug the CSS layout and alignment within the Storybook UI | diff --git a/code/addons/jest/README.md b/code/addons/jest/README.md deleted file mode 100644 index cb0d42202525..000000000000 --- a/code/addons/jest/README.md +++ /dev/null @@ -1,261 +0,0 @@ -# Storybook addon Jest - -Storybook addon for inspecting Jest unit test results. - -[Framework Support](https://storybook.js.org/docs/configure/integration/frameworks-feature-support?ref=readme) - -[![Storybook Jest Addon Demo](https://raw.githubusercontent.com/storybookjs/storybook/next/code/addons/jest/docs/storybook-addon-jest.gif)](http://storybooks-official.netlify.com/?selectedKind=Addons%7Cjest&selectedStory=withTests&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Ftests%2Fpanel) - -> Check out the above [Live Storybook](http://storybooks-official.netlify.com/?selectedKind=Addons%7Cjest&selectedStory=withTests&full=0&addons=1&stories=1&panelRight=0&addonPanel=storybook%2Ftests%2Fpanel). - -## Installation - -Install this addon by adding the `@storybook/addon-jest` as a development dependency with: - -`npm install --save-dev @storybook/addon-jest` - -Or if you're using yarn as a package manager: - -`yarn add --dev @storybook/addon-jest` - -## Configuration - -Register the addon in your [`.storybook/main.js`](https://storybook.js.org/docs/configure#configure-your-storybook-project?ref=readme): - -```js -export default { - addons: ['@storybook/addon-jest'], -}; -``` - -## Jest Configuration - -When running **Jest**, be sure to save the results in a JSON file: - -```js -"scripts": { - "test:generate-output": "jest --json --outputFile=.jest-test-results.json" -} -``` - -You may want to add the result file to `.gitignore`, since it's a generated file: - -``` -.jest-test-results.json -``` - -But much like lockfiles and snapshots, checking-in generated files can have certain advantages as well. It's up to you. -We recommend to **do** check in the test results file so starting Storybook from a clean git clone doesn't require running all tests first, -but this can mean you'll encounter merge conflicts on this file in the future (_re-generating this file is very similar to re-generating lockfiles and snapshots_). - -### Generating the test results - -Ensure the generated test-results file exists before you start Storybook. During development, you will likely start Jest in watch-mode and so the JSON file will be re-generated every time code or tests change. - -```sh -npm run test:generate-output -- --watch -``` - -And in the jest config, add `jest-test-results.json` to `modulePathIgnorePatterns` to avoid an infinite loop. - -```js -modulePathIgnorePatterns: ['node_modules', 'jest-test-results.json'], -``` - -This change will then be HMR (hot module reloaded) using webpack and displayed by this addon. - -If you want to pre-run Jest automatically during development or a static build, you may need to consider that if your tests fail, the script receives a non-0 exit code and will exit. -You could create a `prebuild:storybook` npm script, which will never fail by appending `|| true`: - -```json -"scripts": { - "test:generate-output": "jest --json --outputFile=.jest-test-results.json || true", - "test": "jest", - "prebuild:storybook": "npm run test:generate-output", - "build:storybook": "build-storybook -c .storybook -o build/", - "predeploy": "npm run build:storybook", - "deploy": "gh-pages -d build/", -} -``` - -## Usage - -Assuming that you have already created a test file for your component (e.g., `MyComponent.test.js`). - -### Story-level - -In your story file, add a [decorator](https://storybook.js.org/docs/writing-stories/decorators?ref=readme) to your story's default export to display the results: - -```js -// MyComponent.stories.js|jsx -import { withTests } from '@storybook/addon-jest'; -import results from '../.jest-test-results.json'; -import MyComponent from './MyComponent'; - -export default { - component: MyComponent, - title: 'MyComponent', - decorators: [withTests({ results })], -}; -``` - -You can also add multiple tests results within your story by including the `jest` [parameter](https://storybook.js.org/docs/writing-stories/parameters?ref=readme), for example: - -```js -// MyComponent.stories.js|jsx - -import MyComponent from './MyComponent'; - -import results from '../.jest-test-results.json'; - -import { withTests } from '@storybook/addon-jest'; - -export default { - component: MyComponent, - title: 'MyComponent', - decorators: [withTests({ results })], -}; - -const Template = (args) => ; - -export const Default = Template.bind({}); -Default.args = { - text: 'Jest results in Storybook', -}; -Default.parameters = { - jest: ['MyComponent.test.js', 'MyOtherComponent.test.js'] -}; -``` - -### Global level - -To avoid importing the results of the tests in each story, you can update -your [`.storybook/preview.js`](https://storybook.js.org/docs/configure#configure-story-rendering?ref=readme) and include a decorator allowing you to display the results only for the stories that have the `jest` parameter defined: - -```js -// .storybook/preview.js -import { withTests } from '@storybook/addon-jest'; -import results from '../.jest-test-results.json'; - -export const decorators = [ - withTests({ - results, - }), -]; -``` - -Then in your story file: - -```js -// MyComponent.stories.js|jsx - -import MyComponent from './MyComponent'; - -export default { - component: MyComponent, - title: 'MyComponent', -}; - -const Template = (args) => ; - -export const Default = Template.bind({}); -Default.args={ - text: 'Jest results in Storybook', -}; -Default.parameters = { - jest: 'MyComponent.test.js', -}; -``` - -The `jest` parameter will default to inferring from your story file name if not provided. For example, if your story file is `MyComponent.stories.js`, -then "MyComponent" will be used to find your test file results. It currently doesn't work in production environments. - -### Disabling - -You can disable the addon for a single story by setting the `jest` parameter to `{disable: true}`: - -```js -// MyComponent.stories.js|jsx -import MyComponent from './MyComponent'; - -export default { - component: MyComponent, - title: 'MyComponent', -}; - -const Template = (args) => ; - -export const Default = Template.bind({}); - -Default.args = { - text: 'Jest results in Storybook', -}; -Default.parameters = { - jest: { disable: true }, -}; -``` - -## Usage with Angular - -Using this addon with Angular will require some additional configuration. You'll need to install and configure Jest with [jest-preset-angular](https://www.npmjs.com/package/jest-preset-angular). - -Then, in your `.storybook/preview.js`, you'll need to add a decorator with the following: - -```js -// .storybook/preview.js -import { withTests } from '@storybook/addon-jest'; -import results from '../.jest-test-results.json'; - -export const decorators = [ - withTests({ - results, - filesExt: '((\\.specs?)|(\\.tests?))?(\\.ts)?$', - }), -]; -``` - -Finally, in your story, you'll need to include the following: - -```ts -// MyComponent.stories.ts -import type { Meta, StoryFn } from '@storybook/angular'; -import MyComponent from './MyComponent.component'; - -export default { - component: MyComponent, - title: 'MyComponent', -} as Meta; - -const Template: StoryFn = (args: MyComponent) => ({ - props: args, -}); - -export const Default = Template.bind({}); -Default.parameters = { - jest: 'MyComponent.component', -}; -``` - -## Available options - -- **options.results**: OBJECT jest output results. _mandatory_ -- **filesExt**: STRING test file extension. _optional_. This allows you to write "MyComponent" and not "MyComponent.test.js". It will be used as regex to find your file results. Default value is `((\\.specs?)|(\\.tests?))?(\\.js)?$`. That means it will match: MyComponent.js, MyComponent.test.js, MyComponent.tests.js, MyComponent.spec.js, MyComponent.specs.js... - -## TODO - -- Add coverage -- Display nested test better (describe) -- Display the date of the test -- Add unit tests -- Add linting -- Split - -## Contributing - -All ideas and contributions are welcome. - -## Licence - -MIT ยฉ 2017-present Renaud Tertrais - -Learn more about Storybook at [storybook.js.org](https://storybook.js.org/?ref=readme). diff --git a/code/addons/jest/docs/storybook-addon-jest.gif b/code/addons/jest/docs/storybook-addon-jest.gif deleted file mode 100644 index e5ad98b44599..000000000000 Binary files a/code/addons/jest/docs/storybook-addon-jest.gif and /dev/null differ diff --git a/code/addons/jest/manager.js b/code/addons/jest/manager.js deleted file mode 100644 index 8a2eae4ffce1..000000000000 --- a/code/addons/jest/manager.js +++ /dev/null @@ -1 +0,0 @@ -import './dist/manager'; diff --git a/code/addons/jest/package.json b/code/addons/jest/package.json deleted file mode 100644 index da174f401885..000000000000 --- a/code/addons/jest/package.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "@storybook/addon-jest", - "version": "9.1.13", - "description": "Storybook Jest addon: Show Jest report in Storybook's addon panel", - "keywords": [ - "jest", - "react", - "report", - "results", - "storybook", - "storybook-addon", - "unit-testing", - "test", - "component", - "components" - ], - "homepage": "https://github.com/storybookjs/storybook/tree/next/code/addons/jest", - "bugs": { - "url": "https://github.com/storybookjs/storybook/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/storybookjs/storybook.git", - "directory": "code/addons/jest" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "license": "MIT", - "author": "Renaud Tertrais (https://github.com/renaudtertrais)", - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.js" - }, - "./manager": "./dist/manager.js", - "./register": "./dist/manager.js", - "./package.json": "./package.json" - }, - "main": "dist/index.js", - "module": "dist/index.mjs", - "types": "dist/index.d.ts", - "files": [ - "dist/**/*", - "README.md", - "*.js", - "*.d.ts", - "!src/**/*" - ], - "scripts": { - "check": "jiti ../../../scripts/prepare/check.ts", - "prep": "jiti ../../../scripts/prepare/addon-bundle.ts" - }, - "dependencies": { - "tiny-invariant": "^1.3.1", - "upath": "^2.0.1" - }, - "devDependencies": { - "@storybook/icons": "^1.4.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-resize-detector": "^7.1.2", - "typescript": "^5.8.3" - }, - "peerDependencies": { - "storybook": "workspace:^" - }, - "publishConfig": { - "access": "public" - }, - "bundler": { - "exportEntries": [ - "./src/index.ts" - ], - "managerEntries": [ - "./src/manager.tsx" - ] - }, - "gitHead": "ce6a1e4a8d5ad69c699021a0b183df89cfc7b684", - "storybook": { - "displayName": "Jest", - "icon": "https://pbs.twimg.com/profile_images/821713465245102080/mMtKIMax_400x400.jpg", - "unsupportedFrameworks": [ - "react-native" - ] - } -} diff --git a/code/addons/jest/project.json b/code/addons/jest/project.json deleted file mode 100644 index 226ea5597330..000000000000 --- a/code/addons/jest/project.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "addon-jest", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "projectType": "library", - "targets": { - "build": {} - } -} diff --git a/code/addons/jest/src/components/Message.tsx b/code/addons/jest/src/components/Message.tsx deleted file mode 100644 index 5937fcbc83ff..000000000000 --- a/code/addons/jest/src/components/Message.tsx +++ /dev/null @@ -1,156 +0,0 @@ -import type { FC, ReactElement } from 'react'; -import React, { Fragment } from 'react'; - -import { styled } from 'storybook/theming'; - -const positiveConsoleRegex = /\[32m(.*?)\[39m/; -const negativeConsoleRegex = /\[31m(.*?)\[39m/; -const positiveType = 'positive'; -const negativeType = 'negative'; -const endToken = '[39m'; -const failStartToken = '[31m'; -const passStartToken = '[32m'; -const stackTraceStartToken = 'at'; -const titleEndToken = ':'; - -type MsgElement = string | ReactElement; - -class TestDetail { - description!: MsgElement[]; - - result!: MsgElement[]; - - stackTrace!: string; -} -const StackTrace = styled.pre(({ theme }) => ({ - background: theme.color.lighter, - paddingTop: 4, - paddingBottom: 4, - paddingLeft: 6, - borderRadius: 2, - overflow: 'auto', - margin: '10px 30px 10px 30px', - whiteSpace: 'pre', -})); - -const Results = styled.div({ - paddingTop: 10, - marginLeft: 31, - marginRight: 30, -}); - -const Description = styled.div(({ theme }) => ({ - paddingBottom: 10, - paddingTop: 10, - borderBottom: theme.appBorderColor, - marginLeft: 31, - marginRight: 30, - overflowWrap: 'break-word', -})); - -const StatusColor = styled.strong<{ status: string }>(({ status, theme }) => ({ - color: status === positiveType ? theme.color.positive : theme.color.negative, - fontWeight: 500, -})); - -const colorizeText: (msg: string, type: string) => MsgElement[] = (msg: string, type: string) => { - if (type) { - return msg - .split(type === positiveType ? positiveConsoleRegex : negativeConsoleRegex) - .map((i, index) => - index % 2 ? ( - - {i} - - ) : ( - i - ) - ); - } - return [msg]; -}; - -const getConvertedText: (msg: string) => MsgElement[] = (msg: string) => { - let elementArray: MsgElement[] = []; - - if (!msg) { - return elementArray; - } - - const splitText = msg.split(/\[2m/).join('').split(/\[22m/); - - splitText.forEach((element) => { - if (element && element.trim()) { - if ( - element.indexOf(failStartToken) > -1 && - element.indexOf(failStartToken) < element.indexOf(endToken) - ) { - elementArray = elementArray.concat(colorizeText(element, negativeType)); - } else if ( - element.indexOf(passStartToken) > -1 && - element.indexOf(passStartToken) < element.indexOf(endToken) - ) { - elementArray = elementArray.concat(colorizeText(element, positiveType)); - } else { - elementArray = elementArray.concat(element); - } - } - }); - return elementArray; -}; - -const getTestDetail: (msg: string) => TestDetail = (msg: string) => { - const lines = msg.split('\n').filter(Boolean); - - const testDetail: TestDetail = new TestDetail(); - testDetail.description = getConvertedText(lines[0]); - testDetail.stackTrace = ''; - testDetail.result = []; - - for (let index = 1; index < lines.length; index += 1) { - const current = lines[index]; - const next = lines[index + 1]; - - if (current.trim().toLowerCase().indexOf(stackTraceStartToken) === 0) { - testDetail.stackTrace += `${current.trim()}\n`; - } else if (current.trim().indexOf(titleEndToken) > -1) { - let title; - let value = null; - if (current.trim().indexOf(titleEndToken) === current.length - 1) { - // there are breaks in the middle of result - title = current.trim(); - value = getConvertedText(next); - index += 1; - } else { - // results come in a single line - title = current.substring(0, current.indexOf(titleEndToken)).trim(); - value = getConvertedText(current.substring(current.indexOf(titleEndToken), current.length)); - } - testDetail.result = [...testDetail.result, title, ' ', ...value,
]; - } else { - // results come in an unexpected format - testDetail.result = [...testDetail.result, ' ', ...getConvertedText(current)]; - } - } - - return testDetail; -}; - -interface MessageProps { - msg: string; -} - -export const Message: FC = (props) => { - const { msg } = props; - - const detail: TestDetail = getTestDetail(msg); - return ( - - {detail.description ? {detail.description} : null} - {detail.result ? {detail.result} : null} - {detail.stackTrace ? {detail.stackTrace} : null} - - ); -}; - -export default Message; diff --git a/code/addons/jest/src/components/Panel.tsx b/code/addons/jest/src/components/Panel.tsx deleted file mode 100644 index b6b053cda1f0..000000000000 --- a/code/addons/jest/src/components/Panel.tsx +++ /dev/null @@ -1,296 +0,0 @@ -import type { FC } from 'react'; -import React, { Fragment } from 'react'; - -import { Link, Placeholder, ScrollArea, TabsState } from 'storybook/internal/components'; - -import { useResizeDetector } from 'react-resize-detector'; -import { convert, styled, themes } from 'storybook/theming'; - -import type { Test } from '../hoc/provideJestResult'; -import { provideTests as provideJestResult } from '../hoc/provideJestResult'; -import { Result } from './Result'; - -const StatusTypes = { - PASSED_TYPE: 'passed', - FAILED_TYPE: 'failed', - PENDING_TYPE: 'pending', - TODO_TYPE: 'todo', -}; - -const List = styled.ul({ - listStyle: 'none', - fontSize: 14, - padding: 0, - margin: 0, -}); - -const Item = styled.li({ - display: 'block', - padding: 0, -}); - -const ProgressWrapper = styled.div({ - position: 'relative', - height: 10, - width: 30, - display: 'flex', - top: -2, -}); - -const SuiteHead = styled.div({ - display: 'flex', - alignItems: 'baseline', - position: 'absolute', - zIndex: 2, - right: 20, - marginTop: 15, -}); - -const UnstyledSuiteTotals: FC<{ - result: Test['result']; - className?: string; - width: number; -}> = ({ result, className, width }) => ( -
- - {width > 325 && result.assertionResults ? ( -
- {result.assertionResults.length} {result.assertionResults.length > 1 ? `tests` : `test`} -
- ) : null} - {width > 280 && result.endTime && result.startTime ? ( -
- {result.endTime - result.startTime} - ms -
- ) : null} -
-
-); -const SuiteTotals = styled(UnstyledSuiteTotals)(({ theme }) => ({ - display: 'flex', - alignItems: 'center', - color: theme.color.dark, - fontSize: '14px', - marginTop: -5, - '& > *': { - marginRight: 10, - }, -})); - -const SuiteProgressPortion = styled.div<{ color?: string; progressPercent: number }>( - ({ color, progressPercent }) => ({ - height: 6, - top: 3, - width: `${progressPercent}%`, - backgroundColor: color, - }) -); - -interface ContentProps { - tests: Test[]; - className?: string; -} - -const getTestsByTypeMap = (result: any) => { - const testsByType: Map = new Map(); - result.assertionResults.forEach((assertion: any) => { - testsByType.set( - assertion.status, - testsByType.get(assertion.status) - ? testsByType.get(assertion.status).concat(assertion) - : [assertion] - ); - }); - return testsByType; -}; - -const getColorByType = (type: string) => { - // using switch to allow for new types to be added - switch (type) { - case StatusTypes.PASSED_TYPE: - return convert(themes.light).color.positive; - case StatusTypes.FAILED_TYPE: - return convert(themes.light).color.negative; - case StatusTypes.PENDING_TYPE: - return convert(themes.light).color.warning; - case StatusTypes.TODO_TYPE: - return convert(themes.light).color.purple; - default: - return undefined; - } -}; - -const TestPanel: FC<{ test: Test }> = ({ test }) => { - const { ref, width } = useResizeDetector(); - const { result } = test; - if (!result || !result.assertionResults) { - return This story has tests configured, but no file was found; - } - - const testsByType: Map = getTestsByTypeMap(result); - const entries: any = testsByType.entries(); - const sortedTestsByCount = [...entries].sort((a, b) => a[1].length - b[1].length); - - return ( -
- - - {width != null && width > 240 ? ( - - {sortedTestsByCount.map((entry: any) => { - return ( - - ); - })} - - ) : null} - - -
- - {testsByType.get(StatusTypes.FAILED_TYPE) ? ( - testsByType.get(StatusTypes.FAILED_TYPE).map((res: any) => ( - - - - )) - ) : ( - - This story has no failing tests. - - )} - -
-
- - {testsByType.get(StatusTypes.PASSED_TYPE) ? ( - testsByType.get(StatusTypes.PASSED_TYPE).map((res: any) => ( - - - - )) - ) : ( - - This story has no passing tests. - - )} - -
-
- - {testsByType.get(StatusTypes.PENDING_TYPE) ? ( - testsByType.get(StatusTypes.PENDING_TYPE).map((res: any) => ( - - - - )) - ) : ( - - This story has no pending tests. - - )} - -
-
- - {testsByType.get(StatusTypes.TODO_TYPE) ? ( - testsByType.get(StatusTypes.TODO_TYPE).map((res: any) => ( - - - - )) - ) : ( - - This story has no tests todo. - - )} - -
-
-
- ); -}; - -const Content = styled(({ tests, className }: ContentProps) => ( -
- {tests.map((test) => ( - - ))} -
-))({ - flex: '1 1 0%', -}); - -interface PanelProps { - tests?: Test[]; -} - -const Panel = ({ tests }: PanelProps) => ( - - {tests ? ( - - ) : ( - - No tests found - - Learn how to  - - add Jest test results to your story - - - - )} - -); - -Panel.defaultProps = { - tests: undefined, -}; - -export default provideJestResult(Panel); diff --git a/code/addons/jest/src/components/Result.tsx b/code/addons/jest/src/components/Result.tsx deleted file mode 100644 index 25b9281dd717..000000000000 --- a/code/addons/jest/src/components/Result.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import React, { Fragment, useState } from 'react'; - -import { ChevronSmallDownIcon } from '@storybook/icons'; - -import { convert, styled, themes } from 'storybook/theming'; - -import Message from './Message'; - -const Wrapper = styled.div<{ status: string }>(({ theme, status }) => ({ - display: 'flex', - width: '100%', - borderTop: `1px solid ${theme.appBorderColor}`, - '&:hover': { - background: status === `failed` ? theme.background.hoverable : undefined, - }, -})); - -const HeaderBar = styled.div<{ status: string }>(({ theme, status }) => ({ - padding: theme.layoutMargin, - paddingLeft: theme.layoutMargin - 3, - background: 'none', - color: 'inherit', - textAlign: 'left', - cursor: status === `failed` ? 'pointer' : undefined, - borderLeft: '3px solid transparent', - width: '100%', - display: 'flex', - - '&:focus': { - outline: '0 none', - borderLeft: `3px solid ${theme.color.secondary}`, - }, -})); - -const Icon = styled(ChevronSmallDownIcon)(({ theme }) => ({ - color: theme.textMutedColor, - marginRight: 10, - transition: 'transform 0.1s ease-in-out', - alignSelf: 'center', - display: 'inline-flex', -})); - -const capitalizeFirstLetter = (text: string) => { - return text.charAt(0).toUpperCase().concat(text.slice(1)); -}; - -interface ResultProps { - fullName?: string; - title?: string; - failureMessages: any; - status: string; -} - -export function Result(props: ResultProps) { - const [isOpen, setIsOpen] = useState(false); - - const onToggle = () => { - setIsOpen(!isOpen); - }; - - const { fullName, title, failureMessages, status } = props; - return ( - - - - {status === `failed` ? ( - - ) : null} -
{capitalizeFirstLetter(fullName ?? '') || capitalizeFirstLetter(title ?? '')}
-
-
- {isOpen ? ( - - {failureMessages.map((msg: string, i: number) => ( - - ))} - - ) : null} -
- ); -} diff --git a/code/addons/jest/src/hoc/provideJestResult.tsx b/code/addons/jest/src/hoc/provideJestResult.tsx deleted file mode 100644 index 1e2b61bb7c65..000000000000 --- a/code/addons/jest/src/hoc/provideJestResult.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import type { ComponentType } from 'react'; -import React, { Component as ReactComponent } from 'react'; - -import { STORY_CHANGED } from 'storybook/internal/core-events'; - -import type { API } from 'storybook/manager-api'; - -import { ADD_TESTS } from '../shared'; - -// TODO: import type from @types/jest -interface AssertionResult { - status: string; - fullName: string; - title: string; - failureMessages: string[]; -} - -export interface Test { - name: string; - result: { - status: string; - startTime?: number; - endTime?: number; - assertionResults: AssertionResult[]; - }; -} - -interface InjectedProps { - tests?: Test[]; -} - -export interface HocProps { - api: API; - active?: boolean; -} - -export interface HocState { - kind?: string; - storyName?: string; - tests?: Test[]; -} - -export const provideTests = (Component: ComponentType) => - class TestProvider extends ReactComponent { - state: HocState = {}; - - static defaultProps = { - active: false, - }; - - componentDidMount() { - this.mounted = true; - const { api } = this.props; - - this.stopListeningOnStory = api.on(STORY_CHANGED, () => { - const { kind, storyName, tests } = this.state; - if (this.mounted && (kind || storyName || tests)) { - this.onAddTests({}); - } - }); - - api.on(ADD_TESTS, this.onAddTests); - } - - componentWillUnmount() { - this.mounted = false; - const { api } = this.props; - - this.stopListeningOnStory(); - api.off(ADD_TESTS, this.onAddTests); - } - - onAddTests = ({ kind, storyName, tests }: HocState) => { - this.setState({ kind, storyName, tests }); - }; - - mounted!: boolean; - - stopListeningOnStory!: () => void; - - render() { - const { active } = this.props; - const { tests } = this.state; - - return active ? : null; - } - }; diff --git a/code/addons/jest/src/index.ts b/code/addons/jest/src/index.ts deleted file mode 100644 index a812f8daf551..000000000000 --- a/code/addons/jest/src/index.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { addons } from 'storybook/preview-api'; -import { normalize, sep } from 'upath'; - -import { ADD_TESTS, defineJestParameter } from './shared'; - -const findTestResults = ( - testFiles: string[], - jestTestResults: { testResults: { name: string }[] }, - jestTestFilesExt: string -) => - Object.values(testFiles).map((name) => { - const fileName = `${sep}${name}${jestTestFilesExt}`; - - if (jestTestResults && jestTestResults.testResults) { - const fileNamePattern = new RegExp(fileName); - - return { - fileName, - name, - result: jestTestResults.testResults.find((test) => - Boolean(normalize(test.name).match(fileNamePattern)) - ), - }; - } - - return { fileName, name }; - }); - -interface EmitAddTestsArg { - kind: string; - story: () => void; - testFiles: string[]; - options: { - results: { testResults: { name: string }[] }; - filesExt: string; - }; -} - -const emitAddTests = ({ kind, story, testFiles, options }: EmitAddTestsArg) => { - addons.getChannel().emit(ADD_TESTS, { - kind, - storyName: story, - tests: findTestResults(testFiles, options.results, options.filesExt), - }); -}; - -export const withTests = (userOptions: { results: any; filesExt?: string }) => { - const defaultOptions = { - filesExt: '((\\.specs?)|(\\.tests?))?(\\.[jt]sx?)?$', - }; - const options = { ...defaultOptions, ...userOptions }; - - return (...args: any[]) => { - const [storyFn, { kind, parameters = {} }] = args; - const testFiles = defineJestParameter(parameters); - - if (testFiles !== null) { - emitAddTests({ kind, story: storyFn, testFiles, options }); - } - - return storyFn(); - }; -}; diff --git a/code/addons/jest/src/manager.tsx b/code/addons/jest/src/manager.tsx deleted file mode 100644 index 06dc73dd0d5a..000000000000 --- a/code/addons/jest/src/manager.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import * as React from 'react'; - -import { addons, types } from 'storybook/manager-api'; - -import Panel from './components/Panel'; -import { ADDON_ID, PANEL_ID, PARAM_KEY } from './shared'; - -addons.register(ADDON_ID, (api) => { - addons.add(PANEL_ID, { - title: 'Tests', - type: types.PANEL, - render: ({ active }) => , - paramKey: PARAM_KEY, - }); -}); diff --git a/code/addons/jest/src/shared.test.ts b/code/addons/jest/src/shared.test.ts deleted file mode 100644 index 6ef232fe5a32..000000000000 --- a/code/addons/jest/src/shared.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { describe, expect, it } from 'vitest'; - -import { defineJestParameter } from './shared'; - -describe('defineJestParameter', () => { - it('infers from story file name if jest parameter is not provided', () => { - expect(defineJestParameter({ fileName: './stories/addon-jest.stories.js' })).toEqual([ - 'addon-jest', - ]); - }); - - it('wraps string jest parameter with an array', () => { - expect(defineJestParameter({ jest: 'addon-jest' })).toEqual(['addon-jest']); - }); - - it('returns as is if jest parameter is an array', () => { - expect(defineJestParameter({ jest: ['addon-jest', 'something-else'] })).toEqual([ - 'addon-jest', - 'something-else', - ]); - }); - - it('returns null if disabled option is passed to jest parameter', () => { - expect(defineJestParameter({ jest: { disabled: true } })).toBeNull(); - }); - - it('returns null if no filename to infer from', () => { - expect(defineJestParameter({})).toBeNull(); - }); - - it('returns null if filename is a module ID that cannot be inferred from', () => { - // @ts-expect-error Storybook's fileName type is string, but according to this test it could be number in case it is a module id. - expect(defineJestParameter({ fileName: 1234 })).toBeNull(); - }); -}); diff --git a/code/addons/jest/src/shared.ts b/code/addons/jest/src/shared.ts deleted file mode 100644 index 24a705e39724..000000000000 --- a/code/addons/jest/src/shared.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { StorybookInternalParameters } from 'storybook/internal/types'; - -import invariant from 'tiny-invariant'; - -import type { JestParameters } from './types'; - -// addons, panels and events get unique names using a prefix -export const PARAM_KEY = 'test'; -export const ADDON_ID = 'storybookjs/test'; -export const PANEL_ID = `${ADDON_ID}/panel`; - -export const ADD_TESTS = `${ADDON_ID}/add_tests`; - -export function defineJestParameter( - parameters: JestParameters & StorybookInternalParameters -): string[] | null { - const { jest, fileName: filePath } = parameters; - - if (typeof jest === 'string') { - return [jest]; - } - - if (jest && Array.isArray(jest)) { - return jest; - } - - if (jest === undefined && typeof filePath === 'string') { - const lastPath = filePath.split('/').pop(); - invariant(lastPath != null, 'split should always return at least one value'); - const fileName = lastPath.split('.')[0]; - return [fileName]; - } - - return null; -} diff --git a/code/addons/jest/src/types.ts b/code/addons/jest/src/types.ts deleted file mode 100644 index 998c0254d83f..000000000000 --- a/code/addons/jest/src/types.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface JestParameters { - /** - * Jest configuration - * - * @see https://github.com/storybookjs/storybook/blob/next/code/addons/jest/README.md#usage - */ - jest?: string | string[] | { disabled: true }; -} diff --git a/code/addons/jest/tsconfig.json b/code/addons/jest/tsconfig.json deleted file mode 100644 index 73a65ef2ef6e..000000000000 --- a/code/addons/jest/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": {}, - "include": ["src/**/*"] -} diff --git a/code/addons/jest/vitest.config.ts b/code/addons/jest/vitest.config.ts deleted file mode 100644 index 7420176b2e46..000000000000 --- a/code/addons/jest/vitest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig, mergeConfig } from 'vitest/config'; - -import { vitestCommonConfig } from '../../vitest.workspace'; - -export default mergeConfig( - vitestCommonConfig, - defineConfig({ - // Add custom config here - }) -); diff --git a/code/addons/vitest/package.json b/code/addons/vitest/package.json index cac619150653..70c0da4721c5 100644 --- a/code/addons/vitest/package.json +++ b/code/addons/vitest/package.json @@ -107,8 +107,8 @@ "@types/micromatch": "^4.0.0", "@types/node": "^22.0.0", "@types/semver": "^7", - "@vitest/browser": "^3.2.4", - "@vitest/runner": "^3.2.4", + "@vitest/browser-playwright": "^4.0.1", + "@vitest/runner": "^4.0.1", "boxen": "^8.0.1", "es-toolkit": "^1.36.0", "execa": "^8.0.1", @@ -126,18 +126,22 @@ "tree-kill": "^1.2.2", "ts-dedent": "^2.2.0", "typescript": "^5.8.3", - "vitest": "^3.2.4" + "vitest": "^4.0.1" }, "peerDependencies": { - "@vitest/browser": "^3.0.0", - "@vitest/runner": "^3.0.0", + "@vitest/browser": "^3.0.0 || ^4.0.0", + "@vitest/browser-playwright": "^4.0.0", + "@vitest/runner": "^3.0.0 || ^4.0.0", "storybook": "workspace:^", - "vitest": "^3.0.0" + "vitest": "^3.0.0 || ^4.0.0" }, "peerDependenciesMeta": { "@vitest/browser": { "optional": true }, + "@vitest/browser-playwright": { + "optional": true + }, "@vitest/runner": { "optional": true }, diff --git a/code/addons/vitest/src/node/reporter.ts b/code/addons/vitest/src/node/reporter.ts index 42290e4e2172..d8246fcc119f 100644 --- a/code/addons/vitest/src/node/reporter.ts +++ b/code/addons/vitest/src/node/reporter.ts @@ -60,6 +60,8 @@ export class StorybookReporter implements Reporter { this.ctx.state.pathsSet.clear(); this.ctx.state.idMap.clear(); this.ctx.state.errorsSet.clear(); - this.ctx.state.processTimeoutCauses.clear(); + // TODO: Remove this once we don't support Vitest < 4 + // @ts-expect-error processTimeoutCauses does not exist in Vitest 4 + this.ctx.state.processTimeoutCauses?.clear(); } } diff --git a/code/addons/vitest/src/node/vitest-manager.ts b/code/addons/vitest/src/node/vitest-manager.ts index b2d1d9493436..fc1ff2efcfd6 100644 --- a/code/addons/vitest/src/node/vitest-manager.ts +++ b/code/addons/vitest/src/node/vitest-manager.ts @@ -6,7 +6,6 @@ import type { TestProject, TestSpecification, Vitest, - WorkspaceProject, } from 'vitest/node'; import { getProjectRoot, resolvePathInStorybookCache } from 'storybook/internal/common'; @@ -156,11 +155,15 @@ export class VitestManager { } private updateLastChanged(filepath: string) { - const projects = this.vitest!.getModuleProjects(filepath); - projects.forEach(({ server, browser }) => { + // @ts-expect-error `server` only exists in Vitest 3 + this.vitest!.projects.forEach(({ browser, vite, server }) => { if (server) { const serverMods = server.moduleGraph.getModulesByFile(filepath); - serverMods?.forEach((mod) => server.moduleGraph.invalidateModule(mod)); + serverMods?.forEach((mod: any) => server.moduleGraph.invalidateModule(mod)); + } + if (vite) { + const serverMods = vite.moduleGraph.getModulesByFile(filepath); + serverMods?.forEach((mod) => vite.moduleGraph.invalidateModule(mod)); } if (browser) { const browserMods = browser.vite.moduleGraph.getModulesByFile(filepath); @@ -466,7 +469,7 @@ export class VitestManager { this.registerVitestConfigListener(); } - isStorybookProject(project: TestProject | WorkspaceProject) { + isStorybookProject(project: TestProject) { return !!project.config.env?.__STORYBOOK_URL__; } } diff --git a/code/addons/vitest/src/postinstall.ts b/code/addons/vitest/src/postinstall.ts index 38c22b3a422a..6c31b31609cc 100644 --- a/code/addons/vitest/src/postinstall.ts +++ b/code/addons/vitest/src/postinstall.ts @@ -65,16 +65,26 @@ export default async function postInstall(options: PostinstallOptions) { force: options.packageManager, }); - const info = await getStorybookInfo(options); - const allDeps = packageManager.getAllDependencies(); - // only install these dependencies if they are not already installed - const dependencies = ['vitest', '@vitest/browser', 'playwright'].filter((p) => !allDeps[p]); const vitestVersionSpecifier = await packageManager.getInstalledVersion('vitest'); const coercedVitestVersion = vitestVersionSpecifier ? coerce(vitestVersionSpecifier) : null; - const isVitest3_2OrNewer = vitestVersionSpecifier - ? satisfies(vitestVersionSpecifier, '>=3.2.0') + const isVitest3_2To4 = vitestVersionSpecifier + ? satisfies(vitestVersionSpecifier, '>=3.2.0 <4.0.0') + : false; + const isVitest4OrNewer = vitestVersionSpecifier + ? satisfies(vitestVersionSpecifier, '>=4.0.0') : true; + const info = await getStorybookInfo(options); + const allDeps = packageManager.getAllDependencies(); + // only install these dependencies if they are not already installed + const dependencies = [ + 'vitest', + 'playwright', + isVitest4OrNewer ? '@vitest/browser-playwright' : '@vitest/browser', + ]; + + const uniqueDependencies = dependencies.filter((p) => !allDeps[p]); + const mainJsPath = serverResolve(resolve(options.configDir, 'main')) as string; const config = await readConfig(mainJsPath); @@ -243,7 +253,7 @@ export default async function postInstall(options: PostinstallOptions) { ); try { const storybookVersion = await packageManager.getInstalledVersion('storybook'); - dependencies.push(`@storybook/nextjs-vite@^${storybookVersion}`); + uniqueDependencies.push(`@storybook/nextjs-vite@^${storybookVersion}`); } catch (e) { console.error('Failed to install @storybook/nextjs-vite. Please install it manually'); } @@ -261,10 +271,10 @@ export default async function postInstall(options: PostinstallOptions) { Read more about Vitest coverage providers at https://vitest.dev/guide/coverage.html#coverage-providers ` ); - dependencies.push(`@vitest/coverage-v8`); // Version specifier is added below + uniqueDependencies.push(`@vitest/coverage-v8`); // Version specifier is added below } - const versionedDependencies = dependencies.map((p) => { + const versionedDependencies = uniqueDependencies.map((p) => { if (p.includes('vitest')) { return vitestVersionSpecifier ? `${p}@${vitestVersionSpecifier}` : p; } @@ -357,20 +367,24 @@ export default async function postInstall(options: PostinstallOptions) { const vitestShimFile = await findFile('vitest.shims.d'); const rootConfig = vitestConfigFile || viteConfigFile; - const browserConfig = `{ - enabled: true, - headless: true, - provider: 'playwright', - instances: [{ browser: 'chromium' }] - }`; - if (fileExtension === 'ts' && !vitestShimFile) { await writeFile( 'vitest.shims.d.ts', - '/// ' + isVitest4OrNewer + ? '/// ' + : '/// ' ); } + const getTemplateName = () => { + if (isVitest4OrNewer) { + return 'vitest.config.4.template.ts'; + } else if (isVitest3_2To4) { + return 'vitest.config.3.2.template.ts'; + } + return 'vitest.config.template.ts'; + }; + // If there's an existing workspace file, we update that file to include the Storybook Addon Vitest plugin. // We assume the existing workspaces include the Vite(st) config, so we won't add it. if (vitestWorkspaceFile) { @@ -379,7 +393,6 @@ export default async function postInstall(options: PostinstallOptions) { ? relative(dirname(vitestWorkspaceFile), viteConfigFile) : '', CONFIG_DIR: options.configDir, - BROWSER_CONFIG: browserConfig, SETUP_FILE: relative(dirname(vitestWorkspaceFile), vitestSetupFile), }).then((t) => t.replace(`\n 'ROOT_CONFIG',`, '').replace(/\s+extends: '',/, '')); const workspaceFile = await fs.readFile(vitestWorkspaceFile, 'utf8'); @@ -416,20 +429,15 @@ export default async function postInstall(options: PostinstallOptions) { else if (rootConfig) { let target, updated; const configFile = await fs.readFile(rootConfig, 'utf8'); - const hasProjectsConfig = configFile.includes('projects:'); const configFileHasTypeReference = configFile.match( /\/\/\/\s*/ ); - const templateName = - hasProjectsConfig || isVitest3_2OrNewer - ? 'vitest.config.3.2.template.ts' - : 'vitest.config.template.ts'; + const templateName = getTemplateName(); if (templateName) { const configTemplate = await loadTemplate(templateName, { CONFIG_DIR: options.configDir, - BROWSER_CONFIG: browserConfig, SETUP_FILE: relative(dirname(rootConfig), vitestSetupFile), }); @@ -465,14 +473,11 @@ export default async function postInstall(options: PostinstallOptions) { // If there's no existing Vitest/Vite config, we create a new Vitest config file. else { const newConfigFile = resolve(`vitest.config.${fileExtension}`); - const configTemplate = await loadTemplate( - isVitest3_2OrNewer ? 'vitest.config.3.2.template.ts' : 'vitest.config.template.ts', - { - CONFIG_DIR: options.configDir, - BROWSER_CONFIG: browserConfig, - SETUP_FILE: relative(dirname(newConfigFile), vitestSetupFile), - } - ); + + const configTemplate = await loadTemplate(getTemplateName(), { + CONFIG_DIR: options.configDir, + SETUP_FILE: relative(dirname(newConfigFile), vitestSetupFile), + }); logger.line(1); logger.plain(`${step} Creating a Vitest config file:`); @@ -487,26 +492,24 @@ export default async function postInstall(options: PostinstallOptions) { if (a11yAddon) { try { logger.plain(`${step} Setting up ${addonA11yName} for @storybook/addon-vitest:`); - const command = ['automigrate', 'addon-a11y-addon-test']; - - command.push('--loglevel', 'silent'); - command.push('--yes', '--skip-doctor'); - - if (options.packageManager) { - command.push('--package-manager', options.packageManager); - } - if (options.skipInstall) { - command.push('--skip-install'); - } - - if (options.configDir !== '.storybook') { - command.push('--config-dir', options.configDir); - } - - await execa('storybook', command, { - stdio: 'inherit', - }); + await execa( + 'storybook', + [ + 'automigrate', + 'addon-a11y-addon-test', + '--loglevel', + 'silent', + '--yes', + '--skip-doctor', + ...(options.packageManager ? ['--package-manager', options.packageManager] : []), + ...(options.skipInstall ? ['--skip-install'] : []), + ...(options.configDir !== '.storybook' ? ['--config-dir', `"${options.configDir}"`] : []), + ], + { + stdio: 'inherit', + } + ); } catch (e: unknown) { logErrors( '๐Ÿšจ Oh no!', diff --git a/code/addons/vitest/src/updateVitestFile.test.ts b/code/addons/vitest/src/updateVitestFile.test.ts index 27188a8e8ef4..45819a53b52f 100644 --- a/code/addons/vitest/src/updateVitestFile.test.ts +++ b/code/addons/vitest/src/updateVitestFile.test.ts @@ -1,9 +1,18 @@ -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import * as babel from 'storybook/internal/babel'; +import { getDiff } from '../../../core/src/core-server/utils/save-story/getDiff'; import { loadTemplate, updateConfigFile, updateWorkspaceFile } from './updateVitestFile'; +vi.mock('storybook/internal/node-logger', () => ({ + logger: { + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }, +})); + describe('updateConfigFile', () => { it('updates vite config file', async () => { const source = babel.babelParse( @@ -28,44 +37,60 @@ describe('updateConfigFile', () => { }) `); + const before = babel.generate(target).code; const updated = updateConfigFile(source, target); expect(updated).toBe(true); - const { code } = babel.generate(target); - expect(code).toMatchInlineSnapshot(` - "/// - import { defineConfig } from 'vite'; - import react from '@vitejs/plugin-react'; - - // https://vite.dev/config/ - import path from 'node:path'; - import { fileURLToPath } from 'node:url'; - import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - - // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon - export default defineConfig({ - plugins: [react()], - test: { - globals: true, - workspace: ['packages/*', { - extends: true, - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ - configDir: path.join(dirname, '.storybook') - })], - test: { - name: 'storybook', - browser: { - provider: 'playwright' - }, - setupFiles: ['../.storybook/vitest.setup.ts'] - } - }] - } - });" + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + import react from '@vitejs/plugin-react'; + + // https://vite.dev/config/ + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default defineConfig({ + plugins: [react()], + test: { + globals: true, + + - workspace: ['packages/*'] + - + + workspace: ['packages/*', { + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }] + + + } + });" `); }); @@ -91,44 +116,61 @@ describe('updateConfigFile', () => { } `); + const before = babel.generate(target).code; const updated = updateConfigFile(source, target); expect(updated).toBe(true); - const { code } = babel.generate(target); - expect(code).toMatchInlineSnapshot(` - "/// - import react from '@vitejs/plugin-react'; - - // https://vite.dev/config/ - import path from 'node:path'; - import { fileURLToPath } from 'node:url'; - import { defineConfig } from 'vitest/config'; - import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - - // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon - export default { - plugins: [react()], - test: { - globals: true, - workspace: ['packages/*', { - extends: true, - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ - configDir: path.join(dirname, '.storybook') - })], - test: { - name: 'storybook', - browser: { - provider: 'playwright' - }, - setupFiles: ['../.storybook/vitest.setup.ts'] - } - }] - } - };" + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + import react from '@vitejs/plugin-react'; + + // https://vite.dev/config/ + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { defineConfig } from 'vitest/config'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default { + plugins: [react()], + test: { + globals: true, + + - workspace: ['packages/*'] + - + + workspace: ['packages/*', { + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }] + + + } + };" `); }); @@ -154,8 +196,14 @@ describe('updateConfigFile', () => { })) `); + const before = babel.generate(target).code; const updated = updateConfigFile(source, target); expect(updated).toBe(false); + + const after = babel.generate(target).code; + + // check if the code was NOT updated + expect(after).toBe(before); }); it('adds projects property to test config', async () => { @@ -180,44 +228,60 @@ describe('updateConfigFile', () => { }) `); + const before = babel.generate(target).code; const updated = updateConfigFile(source, target); expect(updated).toBe(true); - const { code } = babel.generate(target); - expect(code).toMatchInlineSnapshot(` - "/// - import { defineConfig } from 'vite'; - import react from '@vitejs/plugin-react'; - - // https://vite.dev/config/ - import path from 'node:path'; - import { fileURLToPath } from 'node:url'; - import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - - // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon - export default defineConfig({ - plugins: [react()], - test: { - globals: true, - projects: [{ - extends: true, - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ - configDir: path.join(dirname, '.storybook') - })], - test: { - name: 'storybook', - browser: { - provider: 'playwright' - }, - setupFiles: ['../.storybook/vitest.setup.ts'] - } - }] - } - });" + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + import react from '@vitejs/plugin-react'; + + // https://vite.dev/config/ + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default defineConfig({ + plugins: [react()], + test: { + + - globals: true + - + + globals: true, + + projects: [{ + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }] + + + } + });" `); }); @@ -244,46 +308,60 @@ describe('updateConfigFile', () => { }) `); + const before = babel.generate(target).code; const updated = updateConfigFile(source, target); expect(updated).toBe(true); - const { code } = babel.generate(target); - expect(code).toMatchInlineSnapshot(` - "/// - import { defineConfig } from 'vite'; - import react from '@vitejs/plugin-react'; - - // https://vite.dev/config/ - import path from 'node:path'; - import { fileURLToPath } from 'node:url'; - import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - - // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon - export default defineConfig({ - plugins: [react()], - test: { - globals: true, - projects: ['packages/*', { - some: 'config' - }, { - extends: true, - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ - configDir: path.join(dirname, '.storybook') - })], - test: { - name: 'storybook', - browser: { - provider: 'playwright' - }, - setupFiles: ['../.storybook/vitest.setup.ts'] - } - }] - } - });" + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + import react from '@vitejs/plugin-react'; + + // https://vite.dev/config/ + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default defineConfig({ + plugins: [react()], + test: { + globals: true, + projects: ['packages/*', { + some: 'config' + + + }, { + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + + }] + } + });" `); }); @@ -309,44 +387,60 @@ describe('updateConfigFile', () => { }) `); + const before = babel.generate(target).code; const updated = updateConfigFile(source, target); expect(updated).toBe(true); - const { code } = babel.generate(target); - expect(code).toMatchInlineSnapshot(` - "/// - import { defineConfig } from 'vite'; - import react from '@vitejs/plugin-react'; - - // https://vite.dev/config/ - import path from 'node:path'; - import { fileURLToPath } from 'node:url'; - import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - - // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon - export default defineConfig({ - plugins: [react()], - test: { - globals: true, - workspace: [{ - extends: true, - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ - configDir: path.join(dirname, '.storybook') - })], - test: { - name: 'storybook', - browser: { - provider: 'playwright' - }, - setupFiles: ['../.storybook/vitest.setup.ts'] - } - }] - } - });" + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + import react from '@vitejs/plugin-react'; + + // https://vite.dev/config/ + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default defineConfig({ + plugins: [react()], + test: { + + - globals: true + - + + globals: true, + + workspace: [{ + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }] + + + } + });" `); }); @@ -369,43 +463,306 @@ describe('updateConfigFile', () => { }) `); + const before = babel.generate(target).code; + const updated = updateConfigFile(source, target); + expect(updated).toBe(true); + + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + import react from '@vitejs/plugin-react'; + + // https://vite.dev/config/ + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default defineConfig({ + + - plugins: [react()] + - + + plugins: [react()], + + test: { + + workspace: [{ + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }] + + } + + + });" + `); + }); + + it('supports mergeConfig with multiple defineConfig calls, finding the one with test', async () => { + const source = babel.babelParse( + await loadTemplate('vitest.config.template.ts', { + CONFIG_DIR: '.storybook', + BROWSER_CONFIG: "{ provider: 'playwright' }", + SETUP_FILE: '../.storybook/vitest.setup.ts', + }) + ); + const target = babel.babelParse(` + import { mergeConfig } from 'vite' + import { defineConfig } from 'vitest/config' + import viteConfig from './vite.config' + + export default mergeConfig( + viteConfig, + defineConfig({ + plugins: [react()], + }), + defineConfig({ + test: { + environment: 'jsdom', + } + }) + ) + `); + + const before = babel.generate(target).code; + const updated = updateConfigFile(source, target); + expect(updated).toBe(true); + + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " import { mergeConfig } from 'vite'; + import { defineConfig } from 'vitest/config'; + import viteConfig from './vite.config'; + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default mergeConfig(viteConfig, defineConfig({ + plugins: [react()] + }), defineConfig({ + test: { + + - environment: 'jsdom' + - + + workspace: [{ + + extends: true, + + test: { + + environment: 'jsdom' + + } + + }, { + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }] + + + } + }));" + `); + }); + + it('supports mergeConfig without config containing test property', async () => { + const source = babel.babelParse( + await loadTemplate('vitest.config.template.ts', { + CONFIG_DIR: '.storybook', + BROWSER_CONFIG: "{ provider: 'playwright' }", + SETUP_FILE: '../.storybook/vitest.setup.ts', + }) + ); + const target = babel.babelParse(` + import { mergeConfig } from 'vite' + import { defineConfig } from 'vitest/config' + import viteConfig from './vite.config' + + export default mergeConfig( + viteConfig, + defineConfig({ + plugins: [react()], + }) + ) + `); + + const before = babel.generate(target).code; const updated = updateConfigFile(source, target); expect(updated).toBe(true); - const { code } = babel.generate(target); - expect(code).toMatchInlineSnapshot(` - "/// - import { defineConfig } from 'vite'; - import react from '@vitejs/plugin-react'; + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " import { mergeConfig } from 'vite'; + import { defineConfig } from 'vitest/config'; + import viteConfig from './vite.config'; + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default mergeConfig(viteConfig, defineConfig({ + + - plugins: [react()] + - + + plugins: [react()], + + test: { + + workspace: [{ + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }] + + } + + + }));" + `); + }); + + it('supports mergeConfig with defineConfig pattern using projects (Vitest 3.2+)', async () => { + const source = babel.babelParse( + await loadTemplate('vitest.config.3.2.template.ts', { + CONFIG_DIR: '.storybook', + BROWSER_CONFIG: "{ provider: 'playwright' }", + SETUP_FILE: '../.storybook/vitest.setup.ts', + }) + ); + const target = babel.babelParse(` + /// + import { mergeConfig, defineConfig } from 'vitest/config' + import viteConfig from './vite.config' // https://vite.dev/config/ - import path from 'node:path'; - import { fileURLToPath } from 'node:url'; - import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + export default mergeConfig( + viteConfig, + defineConfig({ + test: { + globals: true, + }, + }) + ) + `); - // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon - export default defineConfig({ - plugins: [react()], - test: { - workspace: [{ - extends: true, - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ - configDir: path.join(dirname, '.storybook') - })], - test: { - name: 'storybook', - browser: { - provider: 'playwright' - }, - setupFiles: ['../.storybook/vitest.setup.ts'] - } - }] - } - });" + const before = babel.generate(target).code; + const updated = updateConfigFile(source, target); + expect(updated).toBe(true); + + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " ... + import viteConfig from './vite.config'; + + // https://vite.dev/config/ + + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + + export default mergeConfig(viteConfig, defineConfig({ + test: { + + - globals: true + - + + projects: [{ + + extends: true, + + test: { + + globals: true + + } + + }, { + + extends: true, + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }] + + + } + }));" `); }); }); @@ -424,34 +781,46 @@ describe('updateWorkspaceFile', () => { export default ['packages/*'] `); + const before = babel.generate(target).code; const updated = updateWorkspaceFile(source, target); expect(updated).toBe(true); - const { code } = babel.generate(target); - expect(code).toMatchInlineSnapshot(` - "import path from 'node:path'; - import { fileURLToPath } from 'node:url'; - import { defineWorkspace } from 'vitest/config'; - import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - - // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon - export default ['packages/*', 'ROOT_CONFIG', { - extends: '', - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ - configDir: path.join(dirname, '.storybook') - })], - test: { - name: 'storybook', - browser: { - provider: 'playwright' - }, - setupFiles: ['../.storybook/vitest.setup.ts'] - } - }];" + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + "- export default ['packages/*']; + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { defineWorkspace } from 'vitest/config'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + export default ['packages/*', 'ROOT_CONFIG', { + + extends: '', + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }];" `); }); @@ -470,34 +839,47 @@ describe('updateWorkspaceFile', () => { export default defineWorkspace(['packages/*']) `); + const before = babel.generate(target).code; const updated = updateWorkspaceFile(source, target); expect(updated).toBe(true); - const { code } = babel.generate(target); - expect(code).toMatchInlineSnapshot(` - "import { defineWorkspace } from 'vitest/config'; - import path from 'node:path'; - import { fileURLToPath } from 'node:url'; - import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; - const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); - - // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon - export default defineWorkspace(['packages/*', 'ROOT_CONFIG', { - extends: '', - plugins: [ - // The plugin will run tests for the stories defined in your Storybook config - // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest - storybookTest({ - configDir: path.join(dirname, '.storybook') - })], - test: { - name: 'storybook', - browser: { - provider: 'playwright' - }, - setupFiles: ['../.storybook/vitest.setup.ts'] - } - }]);" + const after = babel.generate(target).code; + + // check if the code was updated at all + expect(after).not.toBe(before); + + // check if the code was updated correctly + expect(getDiff(before, after)).toMatchInlineSnapshot(` + " import { defineWorkspace } from 'vitest/config'; + + - export default defineWorkspace(['packages/*']); + + import path from 'node:path'; + + import { fileURLToPath } from 'node:url'; + + import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + + const dirname = typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + + + + // More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon + + export default defineWorkspace(['packages/*', 'ROOT_CONFIG', { + + extends: '', + + plugins: [ + + // The plugin will run tests for the stories defined in your Storybook config + + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + + storybookTest({ + + configDir: path.join(dirname, '.storybook') + + })], + + test: { + + name: 'storybook', + + browser: { + + enabled: true, + + headless: true, + + provider: 'playwright', + + instances: [{ + + browser: 'chromium' + + }] + + }, + + setupFiles: ['../.storybook/vitest.setup.ts'] + + } + + }]);" `); }); }); diff --git a/code/addons/vitest/src/updateVitestFile.ts b/code/addons/vitest/src/updateVitestFile.ts index 44c6ff8ee90a..ddee57ae636f 100644 --- a/code/addons/vitest/src/updateVitestFile.ts +++ b/code/addons/vitest/src/updateVitestFile.ts @@ -1,8 +1,7 @@ import * as fs from 'node:fs/promises'; -import type { BabelFile } from 'storybook/internal/babel'; +import type { BabelFile, types as t } from 'storybook/internal/babel'; -import type { ObjectExpression } from '@babel/types'; import { dirname, join } from 'pathe'; export const loadTemplate = async (name: string, replacements: Record) => { @@ -17,8 +16,8 @@ export const loadTemplate = async (name: string, replacements: Record { for (const sourceProp of source) { if (sourceProp.type === 'ObjectProperty') { @@ -77,6 +76,66 @@ const mergeProperties = ( */ export const updateConfigFile = (source: BabelFile['ast'], target: BabelFile['ast']) => { let updated = false; + + // First, check if we can actually modify the configuration + const sourceExportDefault = source.program.body.find( + (n) => n.type === 'ExportDefaultDeclaration' + ); + if (!sourceExportDefault || sourceExportDefault.declaration.type !== 'CallExpression') { + return false; + } + + const targetExportDefault = target.program.body.find( + (n) => n.type === 'ExportDefaultDeclaration' + ); + if (!targetExportDefault) { + return false; + } + + // Check if this is a function notation that we don't support + if ( + targetExportDefault.declaration.type === 'CallExpression' && + targetExportDefault.declaration.callee.type === 'Identifier' && + targetExportDefault.declaration.callee.name === 'defineConfig' && + targetExportDefault.declaration.arguments.length > 0 && + targetExportDefault.declaration.arguments[0].type === 'ArrowFunctionExpression' + ) { + // This is function notation that we don't support + return false; + } + + // Check if we can handle mergeConfig patterns + let canHandleConfig = false; + if (targetExportDefault.declaration.type === 'ObjectExpression') { + canHandleConfig = true; + } else if ( + targetExportDefault.declaration.type === 'CallExpression' && + targetExportDefault.declaration.callee.type === 'Identifier' && + targetExportDefault.declaration.callee.name === 'defineConfig' && + targetExportDefault.declaration.arguments[0]?.type === 'ObjectExpression' + ) { + canHandleConfig = true; + } else if ( + targetExportDefault.declaration.type === 'CallExpression' && + targetExportDefault.declaration.callee.type === 'Identifier' && + targetExportDefault.declaration.callee.name === 'mergeConfig' && + targetExportDefault.declaration.arguments.length >= 2 + ) { + const defineConfigNodes = targetExportDefault.declaration.arguments.filter( + (arg): arg is t.CallExpression => + arg?.type === 'CallExpression' && + arg.callee.type === 'Identifier' && + arg.callee.name === 'defineConfig' && + arg.arguments[0]?.type === 'ObjectExpression' + ); + canHandleConfig = defineConfigNodes.length > 0; + } + + if (!canHandleConfig) { + return false; + } + + // If we get here, we can modify the configuration, so add imports and variables first for (const sourceNode of source.program.body) { if (sourceNode.type === 'ImportDeclaration') { // Insert imports that don't already exist (according to their local specifier name) @@ -127,6 +186,111 @@ export const updateConfigFile = (source: BabelFile['ast'], target: BabelFile['as ) { mergeProperties(properties, exportDefault.declaration.arguments[0].properties); updated = true; + } else if ( + exportDefault.declaration.type === 'CallExpression' && + exportDefault.declaration.callee.type === 'Identifier' && + exportDefault.declaration.callee.name === 'mergeConfig' && + exportDefault.declaration.arguments.length >= 2 + ) { + const defineConfigNodes = exportDefault.declaration.arguments.filter( + (arg): arg is t.CallExpression => + arg?.type === 'CallExpression' && + arg.callee.type === 'Identifier' && + arg.callee.name === 'defineConfig' && + arg.arguments[0]?.type === 'ObjectExpression' + ); + + const defineConfigNodeWithTest = defineConfigNodes.find( + (node) => + node.arguments[0].type === 'ObjectExpression' && + node.arguments[0].properties.some( + (p) => + p.type === 'ObjectProperty' && + p.key.type === 'Identifier' && + p.key.name === 'test' + ) + ); + + // Give precedence for the defineConfig expression which contains a test config property + // As with mergeConfig you never know where the test could be e.g. mergeConfig(viteConfig, defineConfig({}), defineConfig({ test: {...} })) + const defineConfigNode = defineConfigNodeWithTest || defineConfigNodes[0]; + + if (!defineConfigNode) { + return false; + } + + const defineConfigProps = defineConfigNode.arguments[0] as t.ObjectExpression; + + // Check if there's already a test property in the defineConfig + const existingTestProp = defineConfigProps.properties.find( + (p) => + p.type === 'ObjectProperty' && p.key.type === 'Identifier' && p.key.name === 'test' + ) as t.ObjectProperty | undefined; + + if (existingTestProp && existingTestProp.value.type === 'ObjectExpression') { + // Find the test property from the template (either workspace or projects) + const templateTestProp = properties.find( + (p) => + p.type === 'ObjectProperty' && p.key.type === 'Identifier' && p.key.name === 'test' + ) as t.ObjectProperty | undefined; + + if (templateTestProp && templateTestProp.value.type === 'ObjectExpression') { + // Find the workspace/projects array in the template + const workspaceOrProjectsProp = templateTestProp.value.properties.find( + (p) => + p.type === 'ObjectProperty' && + p.key.type === 'Identifier' && + (p.key.name === 'workspace' || p.key.name === 'projects') + ) as t.ObjectProperty | undefined; + + if ( + workspaceOrProjectsProp && + workspaceOrProjectsProp.value.type === 'ArrayExpression' + ) { + // Create the existing test project + const existingTestProject: t.ObjectExpression = { + type: 'ObjectExpression', + properties: [ + { + type: 'ObjectProperty', + key: { type: 'Identifier', name: 'extends' }, + value: { type: 'BooleanLiteral', value: true }, + computed: false, + shorthand: false, + }, + { + type: 'ObjectProperty', + key: { type: 'Identifier', name: 'test' }, + value: existingTestProp.value, + computed: false, + shorthand: false, + }, + ], + }; + + // Add the existing test project to the template's array + workspaceOrProjectsProp.value.elements.unshift(existingTestProject); + + // Remove the existing test property from defineConfig since we're moving it to the array + defineConfigProps.properties = defineConfigProps.properties.filter( + (p) => p !== existingTestProp + ); + + // Merge the template properties (which now include our existing test project in the array) + mergeProperties(properties, defineConfigProps.properties); + } else { + // Fallback to original behavior if template structure is unexpected + mergeProperties(properties, defineConfigProps.properties); + } + } else { + // Fallback to original behavior if template doesn't have expected structure + mergeProperties(properties, defineConfigProps.properties); + } + } else { + // No existing test config, just merge normally + mergeProperties(properties, defineConfigProps.properties); + } + updated = true; } } } diff --git a/code/addons/vitest/src/vitest-plugin/index.ts b/code/addons/vitest/src/vitest-plugin/index.ts index 0e8bbfc949ca..46ba3a565e0f 100644 --- a/code/addons/vitest/src/vitest-plugin/index.ts +++ b/code/addons/vitest/src/vitest-plugin/index.ts @@ -274,6 +274,7 @@ export const storybookTest = async (options?: UserOptions): Promise => ], // if the existing deps.inline is true, we keep it as-is, because it will inline everything + // TODO: Remove the check once we don't support Vitest 3 anymore ...(nonMutableInputConfig.test?.server?.deps?.inline !== true ? { server: { diff --git a/code/addons/vitest/templates/vitest.config.3.2.template.ts b/code/addons/vitest/templates/vitest.config.3.2.template.ts index d261dc2d202a..61cd15cb1811 100644 --- a/code/addons/vitest/templates/vitest.config.3.2.template.ts +++ b/code/addons/vitest/templates/vitest.config.3.2.template.ts @@ -21,7 +21,12 @@ export default defineConfig({ ], test: { name: 'storybook', - browser: BROWSER_CONFIG, + browser: { + enabled: true, + headless: true, + provider: 'playwright', + instances: [{ browser: 'chromium' }], + }, setupFiles: ['SETUP_FILE'], }, }, diff --git a/code/addons/vitest/templates/vitest.config.4.template.ts b/code/addons/vitest/templates/vitest.config.4.template.ts new file mode 100644 index 000000000000..60cb453b8f73 --- /dev/null +++ b/code/addons/vitest/templates/vitest.config.4.template.ts @@ -0,0 +1,37 @@ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { defineConfig } from 'vitest/config'; + +import { storybookTest } from '@storybook/addon-vitest/vitest-plugin'; + +import { playwright } from '@vitest/browser-playwright'; + +const dirname = + typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url)); + +// More info at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon +export default defineConfig({ + test: { + projects: [ + { + extends: true, + plugins: [ + // The plugin will run tests for the stories defined in your Storybook config + // See options at: https://storybook.js.org/docs/next/writing-tests/integrations/vitest-addon#storybooktest + storybookTest({ configDir: path.join(dirname, 'CONFIG_DIR') }), + ], + test: { + name: 'storybook', + browser: { + enabled: true, + headless: true, + provider: playwright({}), + instances: [{ browser: 'chromium' }], + }, + setupFiles: ['SETUP_FILE'], + }, + }, + ], + }, +}); diff --git a/code/addons/vitest/templates/vitest.config.template.ts b/code/addons/vitest/templates/vitest.config.template.ts index 6bfb00930813..70a6f054e675 100644 --- a/code/addons/vitest/templates/vitest.config.template.ts +++ b/code/addons/vitest/templates/vitest.config.template.ts @@ -21,7 +21,12 @@ export default defineConfig({ ], test: { name: 'storybook', - browser: BROWSER_CONFIG, + browser: { + enabled: true, + headless: true, + provider: 'playwright', + instances: [{ browser: 'chromium' }], + }, setupFiles: ['SETUP_FILE'], }, }, diff --git a/code/addons/vitest/templates/vitest.workspace.template.ts b/code/addons/vitest/templates/vitest.workspace.template.ts index b430f9a1b3d7..646ae08554fc 100644 --- a/code/addons/vitest/templates/vitest.workspace.template.ts +++ b/code/addons/vitest/templates/vitest.workspace.template.ts @@ -20,7 +20,12 @@ export default defineWorkspace([ ], test: { name: 'storybook', - browser: BROWSER_CONFIG, + browser: { + enabled: true, + headless: true, + provider: 'playwright', + instances: [{ browser: 'chromium' }], + }, setupFiles: ['SETUP_FILE'], }, }, diff --git a/code/addons/vitest/tsconfig.json b/code/addons/vitest/tsconfig.json index e7f61626a4a3..d2318b7bb29f 100644 --- a/code/addons/vitest/tsconfig.json +++ b/code/addons/vitest/tsconfig.json @@ -5,5 +5,5 @@ "types": ["vitest"], "strict": true }, - "include": ["src/**/*", "./typings.d.ts", "templates/*"] + "include": ["src/**/*", "./typings.d.ts"] } diff --git a/code/core/src/actions/loaders.ts b/code/core/src/actions/loaders.ts index 7af18e99f517..f5f3df5d206a 100644 --- a/code/core/src/actions/loaders.ts +++ b/code/core/src/actions/loaders.ts @@ -17,6 +17,9 @@ const logActionsWhenMockCalled: LoaderFunction = (context) => { onMockCall((mock, args) => { const name = mock.getMockName(); + // Default name provided by vi.fn(), which we don't want to log. + // TODO: Can be removed as soon as we drop Vitest 3 support + // https://main.vitest.dev/guide/migration.html#changes-to-mocking if (name === 'spy') { return; } diff --git a/code/core/src/babel/babelParse.ts b/code/core/src/babel/babelParse.ts index d65aa4db65f3..3cfcd5f810a8 100644 --- a/code/core/src/babel/babelParse.ts +++ b/code/core/src/babel/babelParse.ts @@ -49,6 +49,6 @@ export const babelPrint = (ast: ASTNode): string => { }).code; }; -export const babelParseExpression = (code: string) => { +export const babelParseExpression = (code: string): parser.ParseResult => { return parser.parseExpression(code, parserOptions); }; diff --git a/code/core/src/common/versions.ts b/code/core/src/common/versions.ts index 226c6b33b0f5..500e93dc6e8d 100644 --- a/code/core/src/common/versions.ts +++ b/code/core/src/common/versions.ts @@ -2,7 +2,6 @@ export default { '@storybook/addon-a11y': '9.1.13', '@storybook/addon-docs': '9.1.13', - '@storybook/addon-jest': '9.1.13', '@storybook/addon-links': '9.1.13', '@storybook/addon-onboarding': '9.1.13', 'storybook-addon-pseudo-states': '9.1.13', diff --git a/code/core/src/core-server/__for-testing__/main.ts b/code/core/src/core-server/__for-testing__/main.ts index f736e59cf225..ca0837f2adfe 100644 --- a/code/core/src/core-server/__for-testing__/main.ts +++ b/code/core/src/core-server/__for-testing__/main.ts @@ -18,7 +18,6 @@ const config: StorybookConfig = { }, }, '@storybook/addon-essentials', - '@storybook/addon-jest', '@storybook/addon-a11y', ], core: { diff --git a/code/core/src/csf-tools/CsfFile.test.ts b/code/core/src/csf-tools/CsfFile.test.ts index a3ff6cee8cee..a0238be4da04 100644 --- a/code/core/src/csf-tools/CsfFile.test.ts +++ b/code/core/src/csf-tools/CsfFile.test.ts @@ -1422,6 +1422,40 @@ describe('CsfFile', () => { `); }); + it('Object export with args render method', () => { + expect( + parse( + dedent` + export default { title: 'foo/bar' }; + export const A = { + render(args) {} + } + `, + true + ) + ).toMatchInlineSnapshot(` + meta: + title: foo/bar + stories: + - id: foo-bar--a + name: A + parameters: + __isArgsStory: true + __id: foo-bar--a + __stats: + factory: false + play: false + render: true + loaders: false + beforeEach: false + globals: false + tags: false + storyFn: false + mount: false + moduleMock: false + `); + }); + it('Object export with default render', () => { expect( parse( @@ -1787,6 +1821,67 @@ describe('CsfFile', () => { `); }); + it('play method', () => { + expect( + parse( + dedent` + export default { title: 'foo/bar' }; + export const A = { + play({ context }) {}, + }; + ` + ) + ).toMatchInlineSnapshot(` + meta: + title: foo/bar + stories: + - id: foo-bar--a + name: A + __stats: + factory: false + play: true + render: false + loaders: false + beforeEach: false + globals: false + tags: false + storyFn: false + mount: false + moduleMock: false + tags: + - play-fn + `); + }); + + it('meta play method', () => { + expect( + parse( + dedent` + export default { title: 'foo/bar', play({ context }) {} }; + export const A = {};` + ) + ).toMatchInlineSnapshot(` + meta: + title: foo/bar + tags: + - play-fn + stories: + - id: foo-bar--a + name: A + __stats: + factory: false + play: true + render: false + loaders: false + beforeEach: false + globals: false + tags: false + storyFn: false + mount: false + moduleMock: false + `); + }); + it('mount', () => { expect( parse( @@ -1851,6 +1946,38 @@ describe('CsfFile', () => { `); }); + it('mount in method', () => { + expect( + parse( + dedent` + export default { title: 'foo/bar' }; + export const A = { + play({ mount, context }) {}, + }; + ` + ) + ).toMatchInlineSnapshot(` + meta: + title: foo/bar + stories: + - id: foo-bar--a + name: A + __stats: + factory: false + play: true + render: false + loaders: false + beforeEach: false + globals: false + tags: false + storyFn: false + mount: true + moduleMock: false + tags: + - play-fn + `); + }); + it('mount meta', () => { expect( parse( diff --git a/code/core/src/csf-tools/CsfFile.ts b/code/core/src/csf-tools/CsfFile.ts index ab23eb33045a..16d268d49022 100644 --- a/code/core/src/csf-tools/CsfFile.ts +++ b/code/core/src/csf-tools/CsfFile.ts @@ -147,7 +147,11 @@ const sortExports = (exportByName: Record, order: string[]) => { }; const hasMount = (play: t.Node | undefined) => { - if (t.isArrowFunctionExpression(play) || t.isFunctionDeclaration(play)) { + if ( + t.isArrowFunctionExpression(play) || + t.isFunctionDeclaration(play) || + t.isObjectMethod(play) + ) { const params = play.params; if (params.length >= 1) { const [arg] = params; @@ -309,7 +313,8 @@ export class CsfFile { const meta: StaticMeta = {}; (declaration.properties as t.ObjectProperty[]).forEach((p) => { if (t.isIdentifier(p.key)) { - this._metaAnnotations[p.key.name] = p.value; + const value = t.isObjectMethod(p) ? p : p.value; + this._metaAnnotations[p.key.name] = value; if (p.key.name === 'title') { meta.title = this._parseTitle(p.value); @@ -559,30 +564,35 @@ export class CsfFile { // CSF3 object export (storyNode.properties as t.ObjectProperty[]).forEach((p) => { if (t.isIdentifier(p.key)) { - if (p.key.name === 'render') { - parameters.__isArgsStory = isArgsStory( - p.value as t.Expression, - parent, - self - ); - } else if (p.key.name === 'name' && t.isStringLiteral(p.value)) { - name = p.value.value; - } else if (p.key.name === 'storyName' && t.isStringLiteral(p.value)) { - logger.warn( - `Unexpected usage of "storyName" in "${exportName}". Please use "name" instead.` - ); - } else if (p.key.name === 'parameters' && t.isObjectExpression(p.value)) { - const idProperty = p.value.properties.find( - (property) => - t.isObjectProperty(property) && - t.isIdentifier(property.key) && - property.key.name === '__id' - ) as t.ObjectProperty | undefined; - if (idProperty) { - parameters.__id = (idProperty.value as t.StringLiteral).value; + const key = p.key.name; + if (t.isObjectMethod(p)) { + self._storyAnnotations[exportName][key] = p; + } else { + if (p.key.name === 'render') { + parameters.__isArgsStory = isArgsStory( + p.value as t.Expression, + parent, + self + ); + } else if (p.key.name === 'name' && t.isStringLiteral(p.value)) { + name = p.value.value; + } else if (p.key.name === 'storyName' && t.isStringLiteral(p.value)) { + logger.warn( + `Unexpected usage of "storyName" in "${exportName}". Please use "name" instead.` + ); + } else if (p.key.name === 'parameters' && t.isObjectExpression(p.value)) { + const idProperty = p.value.properties.find( + (property) => + t.isObjectProperty(property) && + t.isIdentifier(property.key) && + property.key.name === '__id' + ) as t.ObjectProperty | undefined; + if (idProperty) { + parameters.__id = (idProperty.value as t.StringLiteral).value; + } } + self._storyAnnotations[exportName][p.key.name] = p.value; } - self._storyAnnotations[exportName][p.key.name] = p.value; } }); } else { diff --git a/code/core/src/test/preview.ts b/code/core/src/test/preview.ts index e2e8cfafd4ac..ae7a578eda32 100644 --- a/code/core/src/test/preview.ts +++ b/code/core/src/test/preview.ts @@ -18,6 +18,9 @@ const resetAllMocksLoader: LoaderFunction = ({ parameters }) => { } else if (parameters?.test?.clearMocks === true) { clearAllMocks(); } else if (parameters?.test?.restoreMocks !== false) { + // Note: restoreAllMocks() now only affects manual spies (vi.spyOn) in Vitest, + // automocks are no longer affected since Vitest 4. This could lead to test pollution if + // automock state persists between stories. restoreAllMocks(); } }; diff --git a/code/frameworks/nextjs-vite/package.json b/code/frameworks/nextjs-vite/package.json index e20a0f1e6450..cc655581ac47 100644 --- a/code/frameworks/nextjs-vite/package.json +++ b/code/frameworks/nextjs-vite/package.json @@ -113,7 +113,7 @@ "@storybook/react": "workspace:*", "@storybook/react-vite": "workspace:*", "styled-jsx": "5.1.6", - "vite-plugin-storybook-nextjs": "^2.0.7" + "vite-plugin-storybook-nextjs": "^3.0.0" }, "devDependencies": { "@types/node": "^22.0.0", @@ -124,7 +124,7 @@ "typescript": "^5.8.3" }, "peerDependencies": { - "next": "^14.1.0 || ^15.0.0", + "next": "^14.1.0 || ^15.0.0 || ^16.0.0", "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": "workspace:^", diff --git a/code/frameworks/nextjs-vite/src/export-mocks/cache/index.ts b/code/frameworks/nextjs-vite/src/export-mocks/cache/index.ts index aba0e4a51e9d..d58f348599e3 100644 --- a/code/frameworks/nextjs-vite/src/export-mocks/cache/index.ts +++ b/code/frameworks/nextjs-vite/src/export-mocks/cache/index.ts @@ -11,12 +11,18 @@ const unstable_cache = fn() .mockImplementation((cb: Callback) => cb); const unstable_noStore = fn().mockName('next/cache::unstable_noStore'); +// Next v16.0.0 +const updateTag = fn().mockName('next/cache::updateTag'); +const refresh = fn().mockName('next/cache::refresh'); + const cacheExports = { unstable_cache, revalidateTag, revalidatePath, unstable_noStore, + updateTag, + refresh, }; export default cacheExports; -export { unstable_cache, revalidateTag, revalidatePath, unstable_noStore }; +export { unstable_cache, revalidateTag, revalidatePath, unstable_noStore, updateTag, refresh }; diff --git a/code/frameworks/nextjs/package.json b/code/frameworks/nextjs/package.json index b8a2252c534d..b65649ef733c 100644 --- a/code/frameworks/nextjs/package.json +++ b/code/frameworks/nextjs/package.json @@ -181,7 +181,7 @@ "webpack": "^5.65.0" }, "peerDependencies": { - "next": "^14.1.0 || ^15.0.0", + "next": "^14.1.0 || ^15.0.0 || ^16.0.0", "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": "workspace:^", diff --git a/code/frameworks/nextjs/src/export-mocks/cache/index.ts b/code/frameworks/nextjs/src/export-mocks/cache/index.ts index 16ecd0b42e4a..7475baea025b 100644 --- a/code/frameworks/nextjs/src/export-mocks/cache/index.ts +++ b/code/frameworks/nextjs/src/export-mocks/cache/index.ts @@ -6,12 +6,18 @@ import { fn } from 'storybook/test'; const revalidatePath = fn().mockName('next/cache::revalidatePath'); const revalidateTag = fn().mockName('next/cache::revalidateTag'); +// Next v16.0.0 +const updateTag = fn().mockName('next/cache::updateTag'); +const refresh = fn().mockName('next/cache::refresh'); + const cacheExports = { unstable_cache, revalidateTag, revalidatePath, unstable_noStore, + updateTag, + refresh, }; export default cacheExports; -export { unstable_cache, revalidateTag, revalidatePath, unstable_noStore }; +export { unstable_cache, revalidateTag, revalidatePath, unstable_noStore, updateTag, refresh }; diff --git a/code/package.json b/code/package.json index 5c6fbde1c963..c7bdf87becc1 100644 --- a/code/package.json +++ b/code/package.json @@ -110,7 +110,6 @@ "@storybook/addon-a11y": "workspace:*", "@storybook/addon-designs": "9.0.0-next.1", "@storybook/addon-docs": "workspace:*", - "@storybook/addon-jest": "workspace:*", "@storybook/addon-links": "workspace:*", "@storybook/addon-onboarding": "workspace:*", "@storybook/addon-themes": "workspace:*", @@ -282,5 +281,6 @@ "Dependency Upgrades" ] ] - } + }, + "deferredNextVersion": "9.1.14" } diff --git a/code/yarn.lock b/code/yarn.lock index 8533a3ddaa2a..15764ca26a0d 100644 --- a/code/yarn.lock +++ b/code/yarn.lock @@ -422,10 +422,10 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.26.8, @babel/compat-data@npm:^7.27.2": - version: 7.28.0 - resolution: "@babel/compat-data@npm:7.28.0" - checksum: 10c0/c4e527302bcd61052423f757355a71c3bc62362bac13f7f130de16e439716f66091ff5bdecda418e8fa0271d4c725f860f0ee23ab7bf6e769f7a8bb16dfcb531 +"@babel/compat-data@npm:^7.26.8, @babel/compat-data@npm:^7.27.2, @babel/compat-data@npm:^7.27.7, @babel/compat-data@npm:^7.28.0": + version: 7.28.4 + resolution: "@babel/compat-data@npm:7.28.4" + checksum: 10c0/9d346471e0a016641df9a325f42ad1e8324bbdc0243ce4af4dd2b10b974128590da9eb179eea2c36647b9bb987343119105e96773c1f6981732cd4f87e5a03b9 languageName: node linkType: hard @@ -476,25 +476,25 @@ __metadata: linkType: hard "@babel/core@npm:^7.12.0, @babel/core@npm:^7.18.9, @babel/core@npm:^7.23.0, @babel/core@npm:^7.23.2, @babel/core@npm:^7.23.9, @babel/core@npm:^7.24.4, @babel/core@npm:^7.26.10, @babel/core@npm:^7.26.9, @babel/core@npm:^7.28.0, @babel/core@npm:^7.3.4, @babel/core@npm:^7.7.5": - version: 7.28.0 - resolution: "@babel/core@npm:7.28.0" + version: 7.28.4 + resolution: "@babel/core@npm:7.28.4" dependencies: - "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.0" + "@babel/generator": "npm:^7.28.3" "@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/helper-module-transforms": "npm:^7.28.3" + "@babel/helpers": "npm:^7.28.4" + "@babel/parser": "npm:^7.28.4" "@babel/template": "npm:^7.27.2" - "@babel/traverse": "npm:^7.28.0" - "@babel/types": "npm:^7.28.0" + "@babel/traverse": "npm:^7.28.4" + "@babel/types": "npm:^7.28.4" + "@jridgewell/remapping": "npm:^2.3.5" 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: 10c0/423302e7c721e73b1c096217880272e02020dfb697a55ccca60ad01bba90037015f84d0c20c6ce297cf33a19bb704bc5c2b3d3095f5284dfa592bd1de0b9e8c3 + checksum: 10c0/ef5a6c3c6bf40d3589b5593f8118cfe2602ce737412629fb6e26d595be2fcbaae0807b43027a5c42ec4fba5b895ff65891f2503b5918c8a3ea3542ab44d4c278 languageName: node linkType: hard @@ -522,20 +522,20 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6, @babel/generator@npm:^7.26.10, @babel/generator@npm:^7.26.9, @babel/generator@npm:^7.28.0": - version: 7.28.0 - resolution: "@babel/generator@npm:7.28.0" +"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.23.0, @babel/generator@npm:^7.23.6, @babel/generator@npm:^7.26.10, @babel/generator@npm:^7.26.9, @babel/generator@npm:^7.28.3, @babel/generator@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/generator@npm:7.28.5" dependencies: - "@babel/parser": "npm:^7.28.0" - "@babel/types": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.5" + "@babel/types": "npm:^7.28.5" "@jridgewell/gen-mapping": "npm:^0.3.12" "@jridgewell/trace-mapping": "npm:^0.3.28" jsesc: "npm:^3.0.2" - checksum: 10c0/1b3d122268ea3df50fde707ad864d9a55c72621357d5cebb972db3dd76859c45810c56e16ad23123f18f80cc2692f5a015d2858361300f0f224a05dc43d36a92 + checksum: 10c0/9f219fe1d5431b6919f1a5c60db8d5d34fe546c0d8f5a8511b32f847569234ffc8032beb9e7404649a143f54e15224ecb53a3d11b6bb85c3203e573d91fca752 languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:7.25.9, @babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.25.9": +"@babel/helper-annotate-as-pure@npm:7.25.9": version: 7.25.9 resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" dependencies: @@ -544,7 +544,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.12.0, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9, @babel/helper-compilation-targets@npm:^7.26.5, @babel/helper-compilation-targets@npm:^7.27.2": +"@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.25.9, @babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" + dependencies: + "@babel/types": "npm:^7.27.3" + checksum: 10c0/94996ce0a05b7229f956033e6dcd69393db2b0886d0db6aff41e704390402b8cdcca11f61449cb4f86cfd9e61b5ad3a73e4fa661eeed7846b125bd1c33dbc633 + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.12.0, @babel/helper-compilation-targets@npm:^7.26.5, @babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.27.2": version: 7.27.2 resolution: "@babel/helper-compilation-targets@npm:7.27.2" dependencies: @@ -557,48 +566,48 @@ __metadata: languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.25.9, @babel/helper-create-class-features-plugin@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/helper-create-class-features-plugin@npm:7.27.0" +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.25.9, @babel/helper-create-class-features-plugin@npm:^7.27.1, @babel/helper-create-class-features-plugin@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.3" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-member-expression-to-functions": "npm:^7.25.9" - "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.27.0" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.3" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/c4945903136d934050e070f69a4d72ec425f1f70634e0ddf14ad36695f935125a6df559f8d5b94cc1ed49abd4ce9c5be8ef3ba033fa8d09c5dd78d1a9b97d8cc + checksum: 10c0/f1ace9476d581929128fd4afc29783bb674663898577b2e48ed139cfd2e92dfc69654cff76cb8fd26fece6286f66a99a993186c1e0a3e17b703b352d0bcd1ca4 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9": - version: 7.27.0 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.0" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" regexpu-core: "npm:^6.2.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/62513522a43521d8a29285a47127694ec28d66d793cd156cf875cdee6a9b3a9a1626c43c1eb75ce18fa2bf5dc3140f0a8081a34feb24272ecf66084f3cc3b00a + checksum: 10c0/591fe8bd3bb39679cc49588889b83bd628d8c4b99c55bafa81e80b1e605a348b64da955e3fd891c4ba3f36fd015367ba2eadea22af6a7de1610fbb5bcc2d3df0 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.4": - version: 0.6.4 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.4" +"@babel/helper-define-polyfill-provider@npm:^0.6.3, @babel/helper-define-polyfill-provider@npm:^0.6.5": + version: 0.6.5 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.5" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" + debug: "npm:^4.4.1" lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" + resolve: "npm:^1.22.10" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b74f2b46e233a178618d19432bdae16e0137d0a603497ee901155e083c4a61f26fe01d79fb95d5f4c22131ade9d958d8f587088d412cca1302633587f070919d + checksum: 10c0/4886a068d9ca1e70af395340656a9dda33c50502c67eed39ff6451785f370bdfc6e57095b90cb92678adcd4a111ca60909af53d3a741120719c5604346ae409e languageName: node linkType: hard @@ -637,13 +646,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" +"@babel/helper-member-expression-to-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-member-expression-to-functions@npm:7.27.1" dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/e08c7616f111e1fb56f398365e78858e26e466d4ac46dff25921adc5ccae9b232f66e952a2f4162bbe336627ba336c7fd9eca4835b6548935973d3380d77eaff + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/5762ad009b6a3d8b0e6e79ff6011b3b8fdda0fefad56cfa8bfbe6aa02d5a8a8a9680a45748fe3ac47e735a03d2d88c0a676e3f9f59f20ae9fadcc8d51ccd5a53 languageName: node linkType: hard @@ -657,68 +666,68 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0, @babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.27.3": - version: 7.27.3 - resolution: "@babel/helper-module-transforms@npm:7.27.3" +"@babel/helper-module-transforms@npm:^7.26.0, @babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/helper-module-transforms@npm:7.28.3" dependencies: "@babel/helper-module-imports": "npm:^7.27.1" "@babel/helper-validator-identifier": "npm:^7.27.1" - "@babel/traverse": "npm:^7.27.3" + "@babel/traverse": "npm:^7.28.3" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/fccb4f512a13b4c069af51e1b56b20f54024bcf1591e31e978a30f3502567f34f90a80da6a19a6148c249216292a8074a0121f9e52602510ef0f32dbce95ca01 + checksum: 10c0/549be62515a6d50cd4cfefcab1b005c47f89bd9135a22d602ee6a5e3a01f27571868ada10b75b033569f24dc4a2bb8d04bfa05ee75c16da7ade2d0db1437fcdb languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" +"@babel/helper-optimise-call-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" dependencies: - "@babel/types": "npm:^7.25.9" - checksum: 10c0/90203e6607edeadd2a154940803fd616c0ed92c1013d6774c4b8eb491f1a5a3448b68faae6268141caa5c456e55e3ee49a4ed2bd7ddaf2365daea321c435914c + "@babel/types": "npm:^7.27.1" + checksum: 10c0/6b861e7fcf6031b9c9fc2de3cd6c005e94a459d6caf3621d93346b52774925800ca29d4f64595a5ceacf4d161eb0d27649ae385110ed69491d9776686fa488e6 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.8.0": version: 7.27.1 resolution: "@babel/helper-plugin-utils@npm:7.27.1" checksum: 10c0/94cf22c81a0c11a09b197b41ab488d416ff62254ce13c57e62912c85700dc2e99e555225787a4099ff6bae7a1812d622c80fbaeda824b79baa10a6c5ac4cf69b languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" +"@babel/helper-remap-async-to-generator@npm:^7.25.9, @babel/helper-remap-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-wrap-function": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-wrap-function": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/6798b562f2788210980f29c5ee96056d90dc73458c88af5bd32f9c82e28e01975588aa2a57bb866c35556bd9b76bac937e824ee63ba472b6430224b91b4879e9 + checksum: 10c0/5ba6258f4bb57c7c9fa76b55f416b2d18c867b48c1af4f9f2f7cd7cc933fe6da7514811d08ceb4972f1493be46f4b69c40282b811d1397403febae13c2ec57b5 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/helper-replace-supers@npm:7.26.5" +"@babel/helper-replace-supers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-replace-supers@npm:7.27.1" dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.25.9" - "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/traverse": "npm:^7.26.5" + "@babel/helper-member-expression-to-functions": "npm:^7.27.1" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/b19b1245caf835207aaaaac3a494f03a16069ae55e76a2e1350b5acd560e6a820026997a8160e8ebab82ae873e8208759aa008eb8422a67a775df41f0a4633d4 + checksum: 10c0/4f2eaaf5fcc196580221a7ccd0f8873447b5d52745ad4096418f6101a1d2e712e9f93722c9a32bc9769a1dc197e001f60d6f5438d4dfde4b9c6a9e4df719354c languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/09ace0c6156961624ac9524329ce7f45350bab94bbe24335cbe0da7dfaa1448e658771831983cb83fe91cf6635b15d0a3cab57c03b92657480bfb49fb56dd184 + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10c0/f625013bcdea422c470223a2614e90d2c1cc9d832e97f32ca1b4f82b34bb4aa67c3904cb4b116375d3b5b753acfb3951ed50835a1e832e7225295c7b0c24dff7 languageName: node linkType: hard @@ -738,10 +747,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-identifier@npm:7.27.1" - checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84 +"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.27.1, @babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10c0/42aaebed91f739a41f3d80b72752d1f95fd7c72394e8e4bd7cdd88817e0774d80a432451bcba17c2c642c257c483bf1d409dd4548883429ea9493a3bc4ab0847 languageName: node linkType: hard @@ -752,94 +761,94 @@ __metadata: languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-wrap-function@npm:7.25.9" +"@babel/helper-wrap-function@npm:^7.27.1": + version: 7.28.3 + resolution: "@babel/helper-wrap-function@npm:7.28.3" dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/b6627d83291e7b80df020f8ee2890c52b8d49272962cac0114ef90f189889c90f1027985873d1b5261a4e986e109b2754292dc112392f0b1fcbfc91cc08bd003 + "@babel/template": "npm:^7.27.2" + "@babel/traverse": "npm:^7.28.3" + "@babel/types": "npm:^7.28.2" + checksum: 10c0/aecb8a457efd893dc3c6378ab9221d06197573fb2fe64afabe7923e7732607d59b07f4c5603909877d69bea3ee87025f4b1d8e4f0403ae0a07b14e9ce0bf355a languageName: node linkType: hard -"@babel/helpers@npm:^7.26.10, @babel/helpers@npm:^7.26.9, @babel/helpers@npm:^7.27.6": - version: 7.27.6 - resolution: "@babel/helpers@npm:7.27.6" +"@babel/helpers@npm:^7.26.10, @babel/helpers@npm:^7.26.9, @babel/helpers@npm:^7.28.4": + version: 7.28.4 + resolution: "@babel/helpers@npm:7.28.4" dependencies: "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.27.6" - checksum: 10c0/448bac96ef8b0f21f2294a826df9de6bf4026fd023f8a6bb6c782fe3e61946801ca24381490b8e58d861fee75cd695a1882921afbf1f53b0275ee68c938bd6d3 + "@babel/types": "npm:^7.28.4" + checksum: 10c0/aaa5fb8098926dfed5f223adf2c5e4c7fbba4b911b73dfec2d7d3083f8ba694d201a206db673da2d9b3ae8c01793e795767654558c450c8c14b4c2175b4fcb44 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0, @babel/parser@npm:^7.4.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": - version: 7.28.0 - resolution: "@babel/parser@npm:7.28.0" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.9, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.3, @babel/parser@npm:^7.28.4, @babel/parser@npm:^7.28.5, @babel/parser@npm:^7.4.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": + version: 7.28.5 + resolution: "@babel/parser@npm:7.28.5" dependencies: - "@babel/types": "npm:^7.28.0" + "@babel/types": "npm:^7.28.5" bin: parser: ./bin/babel-parser.js - checksum: 10c0/c2ef81d598990fa949d1d388429df327420357cb5200271d0d0a2784f1e6d54afc8301eb8bdf96d8f6c77781e402da93c7dc07980fcc136ac5b9d5f1fce701b5 + checksum: 10c0/5bbe48bf2c79594ac02b490a41ffde7ef5aa22a9a88ad6bcc78432a6ba8a9d638d531d868bd1f104633f1f6bba9905746e15185b8276a3756c42b765d131b1ef languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9, @babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/7aab47fcbb8c1ddc195a3cd66609edcad54c5022f018db7de40185f0182950389690e953e952f117a1737b72f665ff02ad30de6c02b49b97f1d8f4ccdffedc34 + checksum: 10c0/7dfffa978ae1cd179641a7c4b4ad688c6828c2c58ec96b118c2fb10bc3715223de6b88bff1ebff67056bb5fccc568ae773e3b83c592a1b843423319f80c99ebd languageName: node linkType: hard -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9, @babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@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 - checksum: 10c0/3a652b3574ca62775c5f101f8457950edc540c3581226579125da535d67765f41ad7f0e6327f8efeb2540a5dad5bb0c60a89fb934af3f67472e73fb63612d004 + checksum: 10c0/2cd7a55a856e5e59bbd9484247c092a41e0d9f966778e7019da324d9e0928892d26afc4fbb2ac3d76a3c5a631cd3cf0d72dd2653b44f634f6c663b9e6f80aacd languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9, @babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@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 - checksum: 10c0/18fc9004104a150f9f5da9f3307f361bc3104d16778bb593b7523d5110f04a8df19a2587e6bdd5e726fb1d397191add45223f4f731bb556c33f14f2779d596e8 + checksum: 10c0/cf29835498c4a25bd470908528919729a0799b2ec94e89004929a5532c94a5e4b1a49bc5d6673a22e5afe05d08465873e14ee3b28c42eb3db489cdf5ca47c680 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9, @babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10c0/3f6c8781a2f7aa1791a31d2242399ca884df2ab944f90c020b6f112fb19f05fa6dad5be143d274dad1377e40415b63d24d5489faf5060b9c4a99e55d8f0c317c + checksum: 10c0/eddcd056f76e198868cbff883eb148acfade8f0890973ab545295df0c08e39573a72e65372bcc0b0bfadba1b043fe1aea6b0907d0b4889453ac154c404194ebc languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9, @babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.3" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.3" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/02b365f0cc4df8b8b811c68697c93476da387841e5f153fe42766f34241b685503ea51110d5ed6df7132759820b93e48d9fa3743cffc091eed97c19f7e5fe272 + checksum: 10c0/3cdc27c4e08a632a58e62c6017369401976edf1cd9ae73fd9f0d6770ddd9accf40b494db15b66bab8db2a8d5dc5bab5ca8c65b19b81fdca955cd8cbbe24daadb languageName: node linkType: hard @@ -947,18 +956,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.24.1, @babel/plugin-syntax-import-assertions@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" +"@babel/plugin-syntax-import-assertions@npm:^7.24.1, @babel/plugin-syntax-import-assertions@npm:^7.26.0, @babel/plugin-syntax-import-assertions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-import-assertions@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: 10c0/525b174e60b210d96c1744c1575fc2ddedcc43a479cba64a5344cf77bd0541754fc58120b5a11ff832ba098437bb05aa80900d1f49bb3d888c5e349a4a3a356e + checksum: 10c0/06a954ee672f7a7c44d52b6e55598da43a7064e80df219765c51c37a0692641277e90411028f7cae4f4d1dedeed084f0c453576fa421c35a81f1603c5e3e0146 languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:7.26.0, @babel/plugin-syntax-import-attributes@npm:^7.26.0": +"@babel/plugin-syntax-import-attributes@npm:7.26.0": version: 7.26.0 resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" dependencies: @@ -969,6 +978,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.26.0, @babel/plugin-syntax-import-attributes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/e66f7a761b8360419bbb93ab67d87c8a97465ef4637a985ff682ce7ba6918b34b29d81190204cf908d0933058ee7b42737423cd8a999546c21b3aabad4affa9a + languageName: node + linkType: hard + "@babel/plugin-syntax-jsx@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" @@ -991,14 +1011,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.25.9, @babel/plugin-syntax-typescript@npm:^7.3.3": - version: 7.25.9 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" +"@babel/plugin-syntax-typescript@npm:^7.27.1, @babel/plugin-syntax-typescript@npm:^7.3.3": + 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: 10c0/5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 + checksum: 10c0/11589b4c89c66ef02d57bf56c6246267851ec0c361f58929327dc3e070b0dab644be625bbe7fb4c4df30c3634bfdfe31244e1f517be397d2def1487dbbe3c37d languageName: node linkType: hard @@ -1014,18 +1034,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" +"@babel/plugin-transform-arrow-functions@npm:^7.25.9, @babel/plugin-transform-arrow-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-arrow-functions@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: 10c0/851fef9f58be60a80f46cc0ce1e46a6f7346a6f9d50fa9e0fa79d46ec205320069d0cc157db213e2bea88ef5b7d9bd7618bb83f0b1996a836e2426c3a3a1f622 + checksum: 10c0/19abd7a7d11eef58c9340408a4c2594503f6c4eaea1baa7b0e5fbdda89df097e50663edb3448ad2300170b39efca98a75e5767af05cad3b0facb4944326896a3 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:7.26.8, @babel/plugin-transform-async-generator-functions@npm:^7.26.8": +"@babel/plugin-transform-async-generator-functions@npm:7.26.8": version: 7.26.8 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.26.8" dependencies: @@ -1038,7 +1058,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:7.25.9, @babel/plugin-transform-async-to-generator@npm:^7.25.9": +"@babel/plugin-transform-async-generator-functions@npm:^7.26.8, @babel/plugin-transform-async-generator-functions@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.0" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.0" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/739d577e649d7d7b9845dc309e132964327ab3eaea43ad04d04a7dcb977c63f9aa9a423d1ca39baf10939128d02f52e6fda39c834fb9f1753785b1497e72c4dc + languageName: node + linkType: hard + +"@babel/plugin-transform-async-to-generator@npm:7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" dependencies: @@ -1051,156 +1084,182 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" +"@babel/plugin-transform-async-to-generator@npm:^7.25.9, @babel/plugin-transform-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/2f3060800ead46b09971dd7bf830d66383b7bc61ced9945633b4ef9bf87787956ea83fcf49b387cecb377812588c6b81681714c760f9cf89ecba45edcbab1192 + checksum: 10c0/e76b1f6f9c3bbf72e17d7639406d47f09481806de4db99a8de375a0bb40957ea309b20aa705f0c25ab1d7c845e3f365af67eafa368034521151a0e352a03ef2f languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.9, @babel/plugin-transform-block-scoping@npm:^7.8.3": - version: 7.27.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.27.0" +"@babel/plugin-transform-block-scoped-functions@npm:^7.26.5, @babel/plugin-transform-block-scoped-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/15a604fac04151a795ff3213c73ece06bda7cd5f7c8cb7a3b29563ab243f0b3f7cba9e6facfc9d70e3e63b21af32f9d26bd10ccc58e1c425c7801186014b5ce4 + checksum: 10c0/3313130ba3bf0699baad0e60da1c8c3c2f0c2c0a7039cd0063e54e72e739c33f1baadfc9d8c73b3fea8c85dd7250c3964fb09c8e1fa62ba0b24a9fefe0a8dbde languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.24.1, @babel/plugin-transform-class-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" +"@babel/plugin-transform-block-scoping@npm:^7.25.9, @babel/plugin-transform-block-scoping@npm:^7.28.0, @babel/plugin-transform-block-scoping@npm:^7.8.3": + version: 7.28.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.4" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f0603b6bd34d8ba62c03fc0572cb8bbc75874d097ac20cc7c5379e001081210a84dba1749e7123fca43b978382f605bb9973c99caf2c5b4c492d5c0a4a441150 + checksum: 10c0/5b9a4e90f957742021fa8bad239cde28ec67b95d36b0e1fcf9f3f9cab6120671ab5e7ee6eacbcd51d0815ddea6978abc9a99a0bd493c43e3e27ec3ae1cb4de23 languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" +"@babel/plugin-transform-class-properties@npm:^7.22.5, @babel/plugin-transform-class-properties@npm:^7.24.1, @babel/plugin-transform-class-properties@npm:^7.25.9, @babel/plugin-transform-class-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-class-properties@npm:7.27.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/cc0662633c0fe6df95819fef223506ddf26c369c8d64ab21a728d9007ec866bf9436a253909819216c24a82186b6ccbc1ec94d7aaf3f82df227c7c02fa6a704b + languageName: node + linkType: hard + +"@babel/plugin-transform-class-static-block@npm:^7.26.0, @babel/plugin-transform-class-static-block@npm:^7.28.3": + version: 7.28.3 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.3" + dependencies: + "@babel/helper-create-class-features-plugin": "npm:^7.28.3" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10c0/cdcf5545ae6514ed75fbd73cccfa209c6a5dfdf0c2bb7bb62c0fb4ec334a32281bcf1bc16ace494d9dbe93feb8bdc0bd3cf9d9ccb6316e634a67056fa13b741b + checksum: 10c0/8c922a64f6f5b359f7515c89ef0037bad583b4484dfebc1f6bc1cf13462547aaceb19788827c57ec9a2d62495f34c4b471ca636bf61af00fdaea5e9642c82b60 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-classes@npm:7.25.9" +"@babel/plugin-transform-classes@npm:^7.25.9, @babel/plugin-transform-classes@npm:^7.28.3": + version: 7.28.4 + resolution: "@babel/plugin-transform-classes@npm:7.28.4" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - globals: "npm:^11.1.0" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/02742ea7cd25be286c982e672619effca528d7a931626a6f3d6cea11852951b7ee973276127eaf6418ac0e18c4d749a16b520709c707e86a67012bd23ff2927d + checksum: 10c0/76687ed37216ff012c599870dc00183fb716f22e1a02fe9481943664c0e4d0d88c3da347dc3fe290d4728f4d47cd594ffa621d23845e2bb8ab446e586308e066 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" +"@babel/plugin-transform-computed-properties@npm:^7.25.9, @babel/plugin-transform-computed-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-computed-properties@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/template": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/template": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/948c0ae3ce0ba2375241d122a9bc7cda4a7ac8110bd8a62cd804bc46a5fdb7a7a42c7799c4cd972e14e0a579d2bd0999b92e53177b73f240bb0d4b09972c758b + checksum: 10c0/e09a12f8c8ae0e6a6144c102956947b4ec05f6c844169121d0ec4529c2d30ad1dc59fee67736193b87a402f44552c888a519a680a31853bdb4d34788c28af3b0 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" +"@babel/plugin-transform-destructuring@npm:^7.25.9, @babel/plugin-transform-destructuring@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7beec5fda665d108f69d5023aa7c298a1e566b973dd41290faa18aeea70f6f571295c1ece0a058f3ceb6c6c96de76de7cd34f5a227fbf09a1b8d8a735d28ca49 + checksum: 10c0/cc7ccafa952b3ff7888544d5688cfafaba78c69ce1e2f04f3233f4f78c9de5e46e9695f5ea42c085b0c0cfa39b10f366d362a2be245b6d35b66d3eb1d427ccb2 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" +"@babel/plugin-transform-dotall-regex@npm:^7.25.9, @babel/plugin-transform-dotall-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/7c3471ae5cf7521fd8da5b03e137e8d3733fc5ee4524ce01fb0c812f0bb77cb2c9657bc8a6253186be3a15bb4caa8974993c7ddc067f554ecc6a026f0a3b5e12 + checksum: 10c0/f9caddfad9a551b4dabe0dcb7c040f458fbaaa7bbb44200c20198b32c8259be8e050e58d2c853fdac901a4cfe490b86aa857036d8d461b192dd010d0e242dedb languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" +"@babel/plugin-transform-duplicate-keys@npm:^7.25.9, @babel/plugin-transform-duplicate-keys@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-keys@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: 10c0/d0c74894b9bf6ff2a04189afffb9cd43d87ebd7b7943e51a827c92d2aaa40fa89ac81565a2fd6fbeabf9e38413a9264c45862eee2b017f1d49046cc3c8ff06b4 + checksum: 10c0/22a822e5342b7066f83eaedc4fd9bb044ac6bc68725484690b33ba04a7104980e43ea3229de439286cb8db8e7db4a865733a3f05123ab58a10f189f03553746f languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9, @babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/a8039a6d2b90e011c7b30975edee47b5b1097cf3c2f95ec1f5ddd029898d783a995f55f7d6eb8d6bb8873c060fb64f9f1ccba938dfe22d118d09cf68e0cd3bf6 + checksum: 10c0/121502a252b3206913e1e990a47fea34397b4cbf7804d4cd872d45961bc45b603423f60ca87f3a3023a62528f5feb475ac1c9ec76096899ec182fcb135eba375 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" +"@babel/plugin-transform-dynamic-import@npm:^7.25.9, @babel/plugin-transform-dynamic-import@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dynamic-import@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: 10c0/5e643a8209072b668350f5788f23c64e9124f81f958b595c80fecca6561086d8ef346c04391b9e5e4cad8b8cbe22c258f0cd5f4ea89b97e74438e7d1abfd98cf + checksum: 10c0/8dcd3087aca134b064fc361d2cc34eec1f900f6be039b6368104afcef10bb75dea726bb18cabd046716b89b0edaa771f50189fa16bc5c5914a38cbcf166350f7 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.26.3": - version: 7.26.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/cac922e851c6a0831fdd2e3663564966916015aeff7f4485825fc33879cbc3a313ceb859814c9200248e2875d65bb13802a723e5d7d7b40a2e90da82a5a1e15c + checksum: 10c0/3baa706af3112adf2ae0c7ec0dc61b63dd02695eb5582f3c3a2b2d05399c6aa7756f55e7bbbd5412e613a6ba1dd6b6736904074b4d7ebd6b45a1e3f9145e4094 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.24.1, @babel/plugin-transform-export-namespace-from@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" +"@babel/plugin-transform-exponentiation-operator@npm:^7.26.3, @babel/plugin-transform-exponentiation-operator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-exponentiation-operator@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: 10c0/953d21e01fed76da8e08fb5094cade7bf8927c1bb79301916bec2db0593b41dbcfbca1024ad5db886b72208a93ada8f57a219525aad048cf15814eeb65cf760d + languageName: node + linkType: hard + +"@babel/plugin-transform-export-namespace-from@npm:^7.24.1, @babel/plugin-transform-export-namespace-from@npm:^7.25.9, @babel/plugin-transform-export-namespace-from@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/f291ea2ec5f36de9028a00cbd5b32f08af281b8183bf047200ff001f4cb260be56f156b2449f42149448a4a033bd6e86a3a7f06d0c2825532eb0ae6b03058dfb + checksum: 10c0/d7165cad11f571a54c8d9263d6c6bf2b817aff4874f747cb51e6e49efb32f2c9b37a6850cdb5e3b81e0b638141bb77dc782a6ec1a94128859fbdf7767581e07c languageName: node linkType: hard @@ -1216,84 +1275,84 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/plugin-transform-for-of@npm:7.26.9" +"@babel/plugin-transform-for-of@npm:^7.26.9, @babel/plugin-transform-for-of@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-for-of@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e28a521521cf9f84ddd69ca8da7c89fb9f7aa38e4dea35742fe973e4e1d7c23f9cee1a4861a2fdd9e9f18ff945886a44d7335cea1c603b96bfcb1c7c8791ef09 + checksum: 10c0/4635763173a23aae24480681f2b0996b4f54a0cb2368880301a1801638242e263132d1e8adbe112ab272913d1d900ee0d6f7dea79443aef9d3325168cd88b3fb languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-function-name@npm:7.25.9" +"@babel/plugin-transform-function-name@npm:^7.25.9, @babel/plugin-transform-function-name@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-function-name@npm:7.27.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8e67fbd1dd367927b8b6afdf0a6e7cb3a3fd70766c52f700ca77428b6d536f6c9d7ec643e7762d64b23093233765c66bffa40e31aabe6492682879bcb45423e1 + checksum: 10c0/5abdc7b5945fbd807269dcc6e76e52b69235056023b0b35d311e8f5dfd6c09d9f225839798998fc3b663f50cf701457ddb76517025a0d7a5474f3fe56e567a4c languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" +"@babel/plugin-transform-json-strings@npm:^7.25.9, @babel/plugin-transform-json-strings@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-json-strings@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: 10c0/00bc2d4751dfc9d44ab725be16ee534de13cfd7e77dfb386e5dac9e48101ce8fcbc5971df919dc25b3f8a0fa85d6dc5f2a0c3cf7ec9d61c163d9823c091844f0 + checksum: 10c0/2379714aca025516452a7c1afa1ca42a22b9b51a5050a653cc6198a51665ab82bdecf36106d32d731512706a1e373c5637f5ff635737319aa42f3827da2326d6 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-literals@npm:7.25.9" +"@babel/plugin-transform-literals@npm:^7.25.9, @babel/plugin-transform-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-literals@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: 10c0/00b14e9c14cf1e871c1f3781bf6334cac339c360404afd6aba63d2f6aca9270854d59a2b40abff1c4c90d4ffdca614440842d3043316c2f0ceb155fdf7726b3b + checksum: 10c0/c40dc3eb2f45a92ee476412314a40e471af51a0f51a24e91b85cef5fc59f4fe06758088f541643f07f949d2c67ee7bdce10e11c5ec56791ae09b15c3b451eeca languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9, @babel/plugin-transform-logical-assignment-operators@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-logical-assignment-operators@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: 10c0/6e2051e10b2d6452980fc4bdef9da17c0d6ca48f81b8529e8804b031950e4fff7c74a7eb3de4a2b6ad22ffb631d0b67005425d232cce6e2b29ce861c78ed04f5 + checksum: 10c0/5b0abc7c0d09d562bf555c646dce63a30288e5db46fd2ce809a61d064415da6efc3b2b3c59b8e4fe98accd072c89a2f7c3765b400e4bf488651735d314d9feeb languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" +"@babel/plugin-transform-member-expression-literals@npm:^7.25.9, @babel/plugin-transform-member-expression-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-member-expression-literals@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: 10c0/91d17b451bcc5ea9f1c6f8264144057ade3338d4b92c0b248366e4db3a7790a28fd59cc56ac433a9627a9087a17a5684e53f4995dd6ae92831cb72f1bd540b54 + checksum: 10c0/0874ccebbd1c6a155e5f6b3b29729fade1221b73152567c1af1e1a7c12848004dffecbd7eded6dc463955120040ae57c17cb586b53fb5a7a27fcd88177034c30 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.13.0, @babel/plugin-transform-modules-amd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" +"@babel/plugin-transform-modules-amd@npm:^7.13.0, @babel/plugin-transform-modules-amd@npm:^7.25.9, @babel/plugin-transform-modules-amd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/849957d9484d0a2d93331226ed6cf840cee7d57454549534c447c93f8b839ef8553eae9877f8f550e3c39f14d60992f91244b2e8e7502a46064b56c5d68ba855 + checksum: 10c0/76e86cd278b6a3c5b8cca8dfb3428e9cd0c81a5df7096e04c783c506696b916a9561386d610a9d846ef64804640e0bd818ea47455fed0ee89b7f66c555b29537 languageName: node linkType: hard @@ -1309,74 +1368,74 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" +"@babel/plugin-transform-modules-systemjs@npm:^7.25.9, @babel/plugin-transform-modules-systemjs@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/8299e3437542129c2684b86f98408c690df27db4122a79edded4782cf04e755d6ecb05b1e812c81a34224a81e664303392d5f3c36f3d2d51fdc99bb91c881e9a + checksum: 10c0/f16fca62d144d9cbf558e7b5f83e13bb6d0f21fdeff3024b0cecd42ffdec0b4151461da42bd0963512783ece31aafa5ffe03446b4869220ddd095b24d414e2b5 languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" +"@babel/plugin-transform-modules-umd@npm:^7.25.9, @babel/plugin-transform-modules-umd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/fa11a621f023e2ac437b71d5582f819e667c94306f022583d77da9a8f772c4128861a32bbb63bef5cba581a70cd7dbe87a37238edaafcfacf889470c395e7076 + checksum: 10c0/e5962a8874889da2ab1aa32eb93ec21d419c7423c766e4befb39b4bb512b9ad44b47837b6cd1c8f1065445cbbcc6dc2be10298ac6e734e5ca1059fc23698daed languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9, @babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/32b14fda5c885d1706863f8af2ee6c703d39264355b57482d3a24fce7f6afbd4c7a0896e501c0806ed2b0759beb621bf7f3f7de1fbbc82026039a98d961e78ef + checksum: 10c0/8eaa8c9aee00a00f3bd8bd8b561d3f569644d98cb2cfe3026d7398aabf9b29afd62f24f142b4112fa1f572d9b0e1928291b099cde59f56d6b59f4d565e58abf2 languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-new-target@npm:7.25.9" +"@babel/plugin-transform-new-target@npm:^7.25.9, @babel/plugin-transform-new-target@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-new-target@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: 10c0/7b5f1b7998f1cf183a7fa646346e2f3742e5805b609f28ad5fee22d666a15010f3e398b7e1ab78cddb7901841a3d3f47135929af23d54e8bf4ce69b72051f71e + checksum: 10c0/9b0581412fcc5ab1b9a2d86a0c5407bd959391f0a1e77a46953fef9f7a57f3f4020d75f71098c5f9e5dcc680a87f9fd99b3205ab12e25ef8c19eed038c1e4b28 languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6": - version: 7.26.6 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6, @babel/plugin-transform-nullish-coalescing-operator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/574d6db7cbc5c092db5d1dece8ce26195e642b9c40dbfeaf3082058a78ad7959c1c333471cdd45f38b784ec488850548075d527b178c5010ee9bff7aa527cc7a + checksum: 10c0/a435fc03aaa65c6ef8e99b2d61af0994eb5cdd4a28562d78c3b0b0228ca7e501aa255e1dff091a6996d7d3ea808eb5a65fd50ecd28dfb10687a8a1095dcadc7a languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.1, @babel/plugin-transform-numeric-separator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" +"@babel/plugin-transform-numeric-separator@npm:^7.24.1, @babel/plugin-transform-numeric-separator@npm:^7.25.9, @babel/plugin-transform-numeric-separator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-numeric-separator@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: 10c0/ad63ad341977844b6f9535fcca15ca0d6d6ad112ed9cc509d4f6b75e9bf4b1b1a96a0bcb1986421a601505d34025373608b5f76d420d924b4e21f86b1a1f2749 + checksum: 10c0/b72cbebbfe46fcf319504edc1cf59f3f41c992dd6840db766367f6a1d232cd2c52143c5eaf57e0316710bee251cae94be97c6d646b5022fcd9274ccb131b470c languageName: node linkType: hard @@ -1391,98 +1450,100 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.1, @babel/plugin-transform-object-rest-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" +"@babel/plugin-transform-object-rest-spread@npm:^7.24.1, @babel/plugin-transform-object-rest-spread@npm:^7.25.9, @babel/plugin-transform-object-rest-spread@npm:^7.28.0": + version: 7.28.4 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.4" dependencies: - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-transform-parameters": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" + "@babel/plugin-transform-parameters": "npm:^7.27.7" + "@babel/traverse": "npm:^7.28.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/02077d8abd83bf6a48ff0b59e98d7561407cf75b591cffd3fdc5dc5e9a13dec1c847a7a690983762a3afecddb244831e897e0515c293e7c653b262c30cd614af + checksum: 10c0/81725c8d6349957899975f3f789b1d4fb050ee8b04468ebfaccd5b59e0bda15cbfdef09aee8b4359f322b6715149d680361f11c1a420c4bdbac095537ecf7a90 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-super@npm:7.25.9" +"@babel/plugin-transform-object-super@npm:^7.25.9, @babel/plugin-transform-object-super@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-object-super@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/0348d00e76f1f15ada44481a76e8c923d24cba91f6e49ee9b30d6861eb75344e7f84d62a18df8a6f9e9a7eacf992f388174b7f9cc4ce48287bcefca268c07600 + checksum: 10c0/efa2d092ef55105deb06d30aff4e460c57779b94861188128489b72378bf1f0ab0f06a4a4d68b9ae2a59a79719fbb2d148b9a3dca19ceff9c73b1f1a95e0527c languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" +"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9, @babel/plugin-transform-optional-catch-binding@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-optional-catch-binding@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: 10c0/722fd5ee12ab905309d4e84421584fce4b6d9e6b639b06afb20b23fa809e6ab251e908a8d5e8b14d066a28186b8ef8f58d69fd6eca9ce1b9ef7af08333378f6c + checksum: 10c0/807a4330f1fac08e2682d57bc82e714868fc651c8876f9a8b3a3fd8f53c129e87371f8243e712ac7dae11e090b737a2219a02fe1b6459a29e664fa073c3277bb languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" +"@babel/plugin-transform-optional-chaining@npm:^7.23.0, @babel/plugin-transform-optional-chaining@npm:^7.25.9, @babel/plugin-transform-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/041ad2beae5affb8e68a0bcb6882a2dadb758db3c629a0e012f57488ab43a822ac1ea17a29db8ef36560a28262a5dfa4dbbbf06ed6e431db55abe024b7cd3961 + checksum: 10c0/5b18ff5124e503f0a25d6b195be7351a028b3992d6f2a91fb4037e2a2c386400d66bc1df8f6df0a94c708524f318729e81a95c41906e5a7919a06a43e573a525 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-parameters@npm:7.25.9" +"@babel/plugin-transform-parameters@npm:^7.25.9, @babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" 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: 10c0/aecb446754b9e09d6b6fa95fd09e7cf682f8aaeed1d972874ba24c0a30a7e803ad5f014bb1fffc7bfeed22f93c0d200947407894ea59bf7687816f2f464f8df3 + checksum: 10c0/f2da3804e047d9f1cfb27be6c014e2c7f6cf5e1e38290d1cb3cb2607859e3d6facb4ee8c8c1e336e9fbb440091a174ce95ce156582d7e8bf9c0e735d11681f0f languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" +"@babel/plugin-transform-private-methods@npm:^7.22.5, @babel/plugin-transform-private-methods@npm:^7.25.9, @babel/plugin-transform-private-methods@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-private-methods@npm:7.27.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/64bd71de93d39daefa3e6c878d6f2fd238ed7d4ecfb13b0e771ddbbc131487def3ceb405b62b534a5cbb5043046b504e1b189b0a45229cc75af979a9fbcaa7bd + checksum: 10c0/232bedfe9d28df215fb03cc7623bdde468b1246bdd6dc24465ff4bf9cc5f5a256ae33daea1fafa6cc59705e4d29da9024bb79baccaa5cd92811ac5db9b9244f2 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" +"@babel/plugin-transform-private-property-in-object@npm:^7.25.9, @babel/plugin-transform-private-property-in-object@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/d4965de19d9f204e692cc74dbc39f0bb469e5f29df96dd4457ea23c5e5596fba9d5af76eaa96f9d48a9fc20ec5f12a94c679285e36b8373406868ea228109e27 + checksum: 10c0/a8c4536273ca716dcc98e74ea25ca76431528554922f184392be3ddaf1761d4aa0e06f1311577755bd1613f7054fb51d29de2ada1130f743d329170a1aa1fe56 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" +"@babel/plugin-transform-property-literals@npm:^7.25.9, @babel/plugin-transform-property-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-property-literals@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: 10c0/1639e35b2438ccf3107af760d34e6a8e4f9acdd3ae6186ae771a6e3029bd59dfe778e502d67090f1185ecda5c16addfed77561e39c518a3f51ff10d41790e106 + checksum: 10c0/15713a87edd6db620d6e66eb551b4fbfff5b8232c460c7c76cedf98efdc5cd21080c97040231e19e06594c6d7dfa66e1ab3d0951e29d5814fb25e813f6d6209c languageName: node linkType: hard @@ -1557,42 +1618,41 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.25.9": - version: 7.27.0 - resolution: "@babel/plugin-transform-regenerator@npm:7.27.0" +"@babel/plugin-transform-regenerator@npm:^7.25.9, @babel/plugin-transform-regenerator@npm:^7.28.3": + version: 7.28.4 + resolution: "@babel/plugin-transform-regenerator@npm:7.28.4" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" - regenerator-transform: "npm:^0.15.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/aa1c6a1592338df96034e0c3933d9c84d0ae25e9768413fda90d4896470192a11e2ab146dbcb92005c5059bbea67aea3d11936de8e4be382613efceafc9c92b5 + checksum: 10c0/5ad14647ffaac63c920e28df1b580ee2e932586bbdc71f61ec264398f68a5406c71a7f921de397a41b954a69316c5ab90e5d789ffa2bb34c5e6feb3727cfefb8 languageName: node linkType: hard -"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" +"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0, @babel/plugin-transform-regexp-modifiers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/4abc1db6c964efafc7a927cda814c7275275afa4b530483e0936fd614de23cb5802f7ca43edaa402008a723d4e7eac282b6f5283aa2eeb3b27da6d6c1dd7f8ed + checksum: 10c0/31ae596ab56751cf43468a6c0a9d6bc3521d306d2bee9c6957cdb64bea53812ce24bd13a32f766150d62b737bca5b0650b2c62db379382fff0dccbf076055c33 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" +"@babel/plugin-transform-reserved-words@npm:^7.25.9, @babel/plugin-transform-reserved-words@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-reserved-words@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: 10c0/8b028b80d1983e3e02f74e21924323cc66ba930e5c5758909a122aa7d80e341b8b0f42e1698e42b50d47a6ba911332f584200b28e1a4e2104b7514d9dc011e96 + checksum: 10c0/e1a87691cce21a644a474d7c9a8107d4486c062957be32042d40f0a3d0cc66e00a3150989655019c255ff020d2640ac16aaf544792717d586f219f3bad295567 languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:7.26.10, @babel/plugin-transform-runtime@npm:^7.13.9, @babel/plugin-transform-runtime@npm:^7.23.2, @babel/plugin-transform-runtime@npm:^7.24.3": +"@babel/plugin-transform-runtime@npm:7.26.10": version: 7.26.10 resolution: "@babel/plugin-transform-runtime@npm:7.26.10" dependencies: @@ -1608,121 +1668,137 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" +"@babel/plugin-transform-runtime@npm:^7.13.9, @babel/plugin-transform-runtime@npm:^7.23.2, @babel/plugin-transform-runtime@npm:^7.24.3": + version: 7.28.3 + resolution: "@babel/plugin-transform-runtime@npm:7.28.3" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + babel-plugin-polyfill-corejs2: "npm:^0.4.14" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" + semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/05a20d45f0fb62567644c507ccd4e379c1a74dacf887d2b2cac70247415e3f6d7d3bf4850c8b336053144715fedb6200fc38f7130c4b76c94eec9b9c0c2a8e9b + checksum: 10c0/561629bb6c53561b5ad470df2e76bdd15e177fc518d91087bd7dc64a1025e42303ce333281875c6f0c7bf29b2edc7d99945343a09caf0ed6738d25fe34473254 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-spread@npm:7.25.9" +"@babel/plugin-transform-shorthand-properties@npm:^7.25.9, @babel/plugin-transform-shorthand-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/996c8fed238efc30e0664f9f58bd7ec8c148f4659f84425f68923a094fe891245711d26eb10d1f815f50c124434e076e860dbe9662240844d1b77cd09907dcdf + checksum: 10c0/bd5544b89520a22c41a6df5ddac9039821d3334c0ef364d18b0ba9674c5071c223bcc98be5867dc3865cb10796882b7594e2c40dedaff38e1b1273913fe353e1 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" +"@babel/plugin-transform-spread@npm:^7.25.9, @babel/plugin-transform-spread@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-spread@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/e9612b0615dab4c4fba1c560769616a9bd7b9226c73191ef84b6c3ee185c8b719b4f887cdd8336a0a13400ce606ab4a0d33bc8fa6b4fcdb53e2896d07f2568f6 + checksum: 10c0/b34fc58b33bd35b47d67416655c2cbc8578fbb3948b4592bc15eb6d8b4046986e25c06e3b9929460fa4ab08e9653582415e7ef8b87d265e1239251bdf5a4c162 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/plugin-transform-template-literals@npm:7.26.8" +"@babel/plugin-transform-sticky-regex@npm:^7.25.9, @babel/plugin-transform-sticky-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/205a938ded9554857a604416d369023a961334b6c20943bd861b45f0e5dbbeca1cf6fda1c2049126e38a0d18865993433fdc78eae3028e94836b3b643c08ba0d + checksum: 10c0/5698df2d924f0b1b7bdb7ef370e83f99ed3f0964eb3b9c27d774d021bee7f6d45f9a73e2be369d90b4aff1603ce29827f8743f091789960e7669daf9c3cda850 languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.26.7": - version: 7.27.0 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.0" +"@babel/plugin-transform-template-literals@npm:^7.26.8, @babel/plugin-transform-template-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/00adbd4e044166ac291978bd64173b4a0d36cbcfae3495a196816dd16ba889cc8b5becee232086241d714cd67a80c15742402504fc36f6db4f746a7dd8d2b1c4 + checksum: 10c0/c90f403e42ef062b60654d1c122c70f3ec6f00c2f304b0931ebe6d0b432498ef8a5ef9266ddf00debc535f8390842207e44d3900eff1d2bab0cc1a700f03e083 + languageName: node + linkType: hard + +"@babel/plugin-transform-typeof-symbol@npm:^7.26.7, @babel/plugin-transform-typeof-symbol@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/a13c68015311fefa06a51830bc69d5badd06c881b13d5cf9ba04bf7c73e3fc6311cc889e18d9645ce2a64a79456dc9c7be88476c0b6802f62a686cb6f662ecd6 languageName: node linkType: hard "@babel/plugin-transform-typescript@npm:^7.13.0, @babel/plugin-transform-typescript@npm:^7.27.0": - version: 7.27.0 - resolution: "@babel/plugin-transform-typescript@npm:7.27.0" + version: 7.28.0 + resolution: "@babel/plugin-transform-typescript@npm:7.28.0" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-create-class-features-plugin": "npm:^7.27.0" - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/plugin-syntax-typescript": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/028e75dd6195495dc2d105ca8ded19d62aef90a215d597451cee57c35325960a87963913aa9a21b8ade190c638b588422292ea7e23b21565baf53c469254dbd4 + checksum: 10c0/049c2bd3407bbf5041d8c95805a4fadee6d176e034f6b94ce7967b92a846f1e00f323cf7dfbb2d06c93485f241fb8cf4c10520e30096a6059d251b94e80386e9 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" +"@babel/plugin-transform-unicode-escapes@npm:^7.25.9, @babel/plugin-transform-unicode-escapes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-escapes@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: 10c0/615c84d7c53e1575d54ba9257e753e0b98c5de1e3225237d92f55226eaab8eb5bceb74df43f50f4aa162b0bbcc934ed11feafe2b60b8ec4934ce340fad4b8828 + checksum: 10c0/a6809e0ca69d77ee9804e0c1164e8a2dea5e40718f6dcf234aeddf7292e7414f7ee331d87f17eb6f160823a329d1d6751bd49b35b392ac4a6efc032e4d3038d8 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" +"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9, @babel/plugin-transform-unicode-property-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/1685836fc38af4344c3d2a9edbd46f7c7b28d369b63967d5b83f2f6849ec45b97223461cea3d14cc3f0be6ebb284938e637a5ca3955c0e79c873d62f593d615c + checksum: 10c0/a332bc3cb3eeea67c47502bc52d13a0f8abae5a7bfcb08b93a8300ddaff8d9e1238f912969494c1b494c1898c6f19687054440706700b6d12cb0b90d88beb4d0 languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" +"@babel/plugin-transform-unicode-regex@npm:^7.25.9, @babel/plugin-transform-unicode-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10c0/448004f978279e726af26acd54f63f9002c9e2582ecd70d1c5c4436f6de490fcd817afb60016d11c52f5ef17dbaac2590e8cc7bfaf4e91b58c452cf188c7920f + checksum: 10c0/6abda1bcffb79feba6f5c691859cdbe984cc96481ea65d5af5ba97c2e843154005f0886e25006a37a2d213c0243506a06eaeafd93a040dbe1f79539016a0d17a languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9, @babel/plugin-transform-unicode-sets-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10c0/56ee04fbe236b77cbcd6035cbf0be7566d1386b8349154ac33244c25f61170c47153a9423cd1d92855f7d6447b53a4a653d9e8fd1eaeeee14feb4b2baf59bd9f + checksum: 10c0/236645f4d0a1fba7c18dc8ffe3975933af93e478f2665650c2d91cf528cfa1587cde5cfe277e0e501fc03b5bf57638369575d6539cef478632fb93bd7d7d7178 languageName: node linkType: hard @@ -1736,7 +1812,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.26.9, @babel/preset-env@npm:^7.16.5, @babel/preset-env@npm:^7.23.2, @babel/preset-env@npm:^7.24.4": +"@babel/preset-env@npm:7.26.9": version: 7.26.9 resolution: "@babel/preset-env@npm:7.26.9" dependencies: @@ -1815,6 +1891,86 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.16.5, @babel/preset-env@npm:^7.23.2, @babel/preset-env@npm:^7.24.4": + version: 7.28.3 + resolution: "@babel/preset-env@npm:7.28.3" + dependencies: + "@babel/compat-data": "npm:^7.28.0" + "@babel/helper-compilation-targets": "npm:^7.27.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.27.1" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.28.3" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.27.1" + "@babel/plugin-syntax-import-attributes": "npm:^7.27.1" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.28.0" + "@babel/plugin-transform-async-to-generator": "npm:^7.27.1" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.28.0" + "@babel/plugin-transform-class-properties": "npm:^7.27.1" + "@babel/plugin-transform-class-static-block": "npm:^7.28.3" + "@babel/plugin-transform-classes": "npm:^7.28.3" + "@babel/plugin-transform-computed-properties": "npm:^7.27.1" + "@babel/plugin-transform-destructuring": "npm:^7.28.0" + "@babel/plugin-transform-dotall-regex": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" + "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.0" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.27.1" + "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" + "@babel/plugin-transform-for-of": "npm:^7.27.1" + "@babel/plugin-transform-function-name": "npm:^7.27.1" + "@babel/plugin-transform-json-strings": "npm:^7.27.1" + "@babel/plugin-transform-literals": "npm:^7.27.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.27.1" + "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" + "@babel/plugin-transform-modules-amd": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-modules-systemjs": "npm:^7.27.1" + "@babel/plugin-transform-modules-umd": "npm:^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-new-target": "npm:^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.27.1" + "@babel/plugin-transform-numeric-separator": "npm:^7.27.1" + "@babel/plugin-transform-object-rest-spread": "npm:^7.28.0" + "@babel/plugin-transform-object-super": "npm:^7.27.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" + "@babel/plugin-transform-parameters": "npm:^7.27.7" + "@babel/plugin-transform-private-methods": "npm:^7.27.1" + "@babel/plugin-transform-private-property-in-object": "npm:^7.27.1" + "@babel/plugin-transform-property-literals": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.28.3" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.27.1" + "@babel/plugin-transform-reserved-words": "npm:^7.27.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" + "@babel/plugin-transform-spread": "npm:^7.27.1" + "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" + "@babel/plugin-transform-template-literals": "npm:^7.27.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.27.1" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.14" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10c0/f7320cb062abf62de132ea2901135476938d32a896e03f5b7b3d543de08016053f6abbdaaf921d18fa43a0b76537dfd5ce8ee5dc647249b2057b8c6bf1289305 + languageName: node + linkType: hard + "@babel/preset-flow@npm:^7.22.15": version: 7.25.9 resolution: "@babel/preset-flow@npm:7.25.9" @@ -1914,7 +2070,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.24.5, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.24.4, @babel/runtime@npm:^7.24.5, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.2, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.7": version: 7.27.0 resolution: "@babel/runtime@npm:7.27.0" dependencies: @@ -1932,7 +2088,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9, @babel/template@npm:^7.27.2": +"@babel/template@npm:^7.24.7, @babel/template@npm:^7.26.9, @babel/template@npm:^7.27.1, @babel/template@npm:^7.27.2": version: 7.27.2 resolution: "@babel/template@npm:7.27.2" dependencies: @@ -1961,18 +2117,18 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9, @babel/traverse@npm:^7.27.0, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.27.3, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.4.5": - version: 7.28.0 - resolution: "@babel/traverse@npm:7.28.0" +"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.16.0, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.0, @babel/traverse@npm:^7.28.3, @babel/traverse@npm:^7.28.4, @babel/traverse@npm:^7.4.5": + version: 7.28.5 + resolution: "@babel/traverse@npm:7.28.5" dependencies: "@babel/code-frame": "npm:^7.27.1" - "@babel/generator": "npm:^7.28.0" + "@babel/generator": "npm:^7.28.5" "@babel/helper-globals": "npm:^7.28.0" - "@babel/parser": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.5" "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.28.0" + "@babel/types": "npm:^7.28.5" debug: "npm:^4.3.1" - checksum: 10c0/32794402457827ac558173bcebdcc0e3a18fa339b7c41ca35621f9f645f044534d91bb923ff385f5f960f2e495f56ce18d6c7b0d064d2f0ccb55b285fa6bc7b9 + checksum: 10c0/f6c4a595993ae2b73f2d4cd9c062f2e232174d293edd4abe1d715bd6281da8d99e47c65857e8d0917d9384c65972f4acdebc6749a7c40a8fcc38b3c7fb3e706f languageName: node linkType: hard @@ -1986,13 +2142,13 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.8, @babel/types@npm:^7.26.9, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.6, @babel/types@npm:^7.28.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.7.2, @babel/types@npm:^7.9.6": - version: 7.28.1 - resolution: "@babel/types@npm:7.28.1" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.8, @babel/types@npm:^7.26.9, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.4, @babel/types@npm:^7.28.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.6.1, @babel/types@npm:^7.7.2, @babel/types@npm:^7.9.6": + version: 7.28.5 + resolution: "@babel/types@npm:7.28.5" dependencies: "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10c0/5e99b346c11ee42ffb0cadc28159fe0b184d865a2cc1593df79b199772a534f6453969b4942aa5e4a55a3081863096e1cc3fc1c724d826926dc787cf229b845d + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10c0/a5a483d2100befbf125793640dec26b90b95fd233a94c19573325898a5ce1e52cdfa96e495c7dcc31b5eca5b66ce3e6d4a0f5a4a62daec271455959f208ab08a languageName: node linkType: hard @@ -2174,30 +2330,30 @@ __metadata: linkType: hard "@emnapi/core@npm:^1.1.0, @emnapi/core@npm:^1.4.0": - version: 1.4.3 - resolution: "@emnapi/core@npm:1.4.3" + version: 1.5.0 + resolution: "@emnapi/core@npm:1.5.0" dependencies: - "@emnapi/wasi-threads": "npm:1.0.2" + "@emnapi/wasi-threads": "npm:1.1.0" tslib: "npm:^2.4.0" - checksum: 10c0/e30101d16d37ef3283538a35cad60e22095aff2403fb9226a35330b932eb6740b81364d525537a94eb4fb51355e48ae9b10d779c0dd1cdcd55d71461fe4b45c7 + checksum: 10c0/52ba3485277706d92fa27d92b37e5b4f6ef0742c03ed68f8096f294c6bfa30f0752c82d4c2bfa14bff4dc30d63c9f71a8f9fb64a92743d00807d9e468fafd5ff languageName: node linkType: hard "@emnapi/runtime@npm:^1.1.0, @emnapi/runtime@npm:^1.4.0": - version: 1.4.3 - resolution: "@emnapi/runtime@npm:1.4.3" + version: 1.5.0 + resolution: "@emnapi/runtime@npm:1.5.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/3b7ab72d21cb4e034f07df80165265f85f445ef3f581d1bc87b67e5239428baa00200b68a7d5e37a0425c3a78320b541b07f76c5530f6f6f95336a6294ebf30b + checksum: 10c0/a85c9fc4e3af49cbe41e5437e5be2551392a931910cd0a5b5d3572532786927810c9cc1db11b232ec8f9657b33d4e6f7c4f985f1a052917d7cd703b5b2a20faa languageName: node linkType: hard -"@emnapi/wasi-threads@npm:1.0.2": - version: 1.0.2 - resolution: "@emnapi/wasi-threads@npm:1.0.2" +"@emnapi/wasi-threads@npm:1.1.0": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/f0621b1fc715221bd2d8332c0ca922617bcd77cdb3050eae50a124eb8923c54fa425d23982dc8f29d505c8798a62d1049bace8b0686098ff9dd82270e06d772e + checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 languageName: node linkType: hard @@ -2523,13 +2679,13 @@ __metadata: linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.6.1 - resolution: "@eslint-community/eslint-utils@npm:4.6.1" + version: 4.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" dependencies: eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/cdeb6f8fc33a83726357d7f736075cdbd6e79dc7ac4b00b15680f1111d0f33bda583e7fafa5937245a058cc66302dc47568bba57b251302dc74964d8e87f56d7 + checksum: 10c0/8881e22d519326e7dba85ea915ac7a143367c805e6ba1374c987aa2fbdd09195cc51183d2da72c0e2ff388f84363e1b220fd0d19bef10c272c63455162176817 languageName: node linkType: hard @@ -3331,14 +3487,14 @@ __metadata: linkType: hard "@inquirer/type@npm:^3.0.4, @inquirer/type@npm:^3.0.6": - version: 3.0.6 - resolution: "@inquirer/type@npm:3.0.6" + version: 3.0.8 + resolution: "@inquirer/type@npm:3.0.8" peerDependencies: "@types/node": ">=18" peerDependenciesMeta: "@types/node": optional: true - checksum: 10c0/92382c1b046559ddb16c53e1353a900a43266566a0d73902e5325433c640b6aaeaf3e34cc5b2a68fd089ff5d8add914d0b9875cdec64f7a09313f9c4420b021d + checksum: 10c0/1171bffb9ea0018b12ec4f46a7b485f7e2a328e620e89f3b03f2be8c25889e5b9e62daca3ea10ed040a71d847066c4d9879dc1fea8aa5690ebbc968d3254a5ac languageName: node linkType: hard @@ -3399,12 +3555,22 @@ __metadata: linkType: hard "@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" + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.5.0" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/32f771ae2467e4d440be609581f7338d786d3d621bac3469e943b9d6d116c23c4becb36f84898a92bbf2f3c0511365c54a945a3b86a83141547a2a360a5ec0c7 + checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/3de494219ffeb2c5c38711d0d7bb128097edf91893090a2dbc8ee0b55d092bb7347b1fd0f478486c5eab010e855c73927b1666f2107516d472d24a73017d1194 languageName: node linkType: hard @@ -3425,10 +3591,10 @@ __metadata: 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, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15, @jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0 languageName: node linkType: hard @@ -3443,12 +3609,12 @@ __metadata: linkType: hard "@jridgewell/trace-mapping@npm:^0.3.12, @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" + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/fb547ba31658c4d74eb17e7389f4908bf7c44cef47acb4c5baa57289daf68e6fe53c639f41f751b3923aca67010501264f70e7b49978ad1f040294b22c37b333 + checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9 languageName: node linkType: hard @@ -3865,13 +4031,20 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.3.1, @next/env@npm:^15.0.3": +"@next/env@npm:15.3.1": version: 15.3.1 resolution: "@next/env@npm:15.3.1" checksum: 10c0/edf65ad9d2bb7ccbc784beacf111a6500f79589743e2292a5c505e504ee711aa121cc0ac164b912ab5ea4734ce82f084133d291650de6d589b6ef208f98b4505 languageName: node linkType: hard +"@next/env@npm:16.0.0": + version: 16.0.0 + resolution: "@next/env@npm:16.0.0" + checksum: 10c0/bc6b85d48373a207f95373c5b350e0766774a8453982c8e045539393e165bc25ef3f6aaaf44036c8f2f4a98e857e0ccc7f84da6ea92116bd50f672e06f987750 + languageName: node + linkType: hard + "@next/swc-darwin-arm64@npm:15.3.1": version: 15.3.1 resolution: "@next/swc-darwin-arm64@npm:15.3.1" @@ -4380,10 +4553,10 @@ __metadata: languageName: node linkType: hard -"@octokit/openapi-types@npm:^25.0.0": - version: 25.0.0 - resolution: "@octokit/openapi-types@npm:25.0.0" - checksum: 10c0/59c9e5998e08cecec155b776c93d8f6f88ab1a812add61cc65f3de8f3744201565545eac308083d18c9fa330a4381a27bcd771a311ac0348d3590a00f333f233 +"@octokit/openapi-types@npm:^25.1.0": + version: 25.1.0 + resolution: "@octokit/openapi-types@npm:25.1.0" + checksum: 10c0/b5b1293b11c6ec7112c7a2713f8507c2696d5db8902ce893b594080ab0329f5a6fcda1b5ac6fe6eed9425e897f4d03326c1bdf5c337e35d324e7b925e52a2661 languageName: node linkType: hard @@ -4595,11 +4768,11 @@ __metadata: linkType: hard "@octokit/types@npm:^14.0.0": - version: 14.0.0 - resolution: "@octokit/types@npm:14.0.0" + version: 14.1.0 + resolution: "@octokit/types@npm:14.1.0" dependencies: - "@octokit/openapi-types": "npm:^25.0.0" - checksum: 10c0/c82da635fe99f265dbef7bf954d45a23ca7ce9c6fc9a8478c247b5435799e5d0eab3ff42f085785ee0882b2de293cab0ab831b379c66f41d00b78412df850ba4 + "@octokit/openapi-types": "npm:^25.1.0" + checksum: 10c0/4640a6c0a95386be4d015b96c3a906756ea657f7df3c6e706d19fea6bf3ac44fd2991c8c817afe1e670ff9042b85b0e06f7fd373f6bbd47da64208701bb46d5b languageName: node linkType: hard @@ -5383,7 +5556,7 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-slot@npm:1.2.0, @radix-ui/react-slot@npm:^1.0.2": +"@radix-ui/react-slot@npm:1.2.0": version: 1.2.0 resolution: "@radix-ui/react-slot@npm:1.2.0" dependencies: @@ -5398,6 +5571,21 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-slot@npm:^1.0.2": + version: 1.2.3 + resolution: "@radix-ui/react-slot@npm:1.2.3" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10c0/5913aa0d760f505905779515e4b1f0f71a422350f077cc8d26d1aafe53c97f177fec0e6d7fbbb50d8b5e498aa9df9f707ca75ae3801540c283b26b0136138eef + languageName: node + linkType: hard + "@radix-ui/react-tabs@npm:1.0.4": version: 1.0.4 resolution: "@radix-ui/react-tabs@npm:1.0.4" @@ -5613,9 +5801,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.43.0" +"@rollup/rollup-android-arm-eabi@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.50.2" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -5627,9 +5815,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-android-arm64@npm:4.43.0" +"@rollup/rollup-android-arm64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-android-arm64@npm:4.50.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -5641,9 +5829,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.43.0" +"@rollup/rollup-darwin-arm64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.50.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -5655,9 +5843,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.43.0" +"@rollup/rollup-darwin-x64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.50.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -5669,9 +5857,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.43.0" +"@rollup/rollup-freebsd-arm64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.50.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -5683,9 +5871,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.43.0" +"@rollup/rollup-freebsd-x64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-freebsd-x64@npm:4.50.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -5697,9 +5885,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.43.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.50.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard @@ -5711,9 +5899,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.43.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.50.2" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard @@ -5725,9 +5913,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.43.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.50.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -5739,23 +5927,23 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.43.0" +"@rollup/rollup-linux-arm64-musl@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.50.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8": - version: 4.34.8 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8" +"@rollup/rollup-linux-loong64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.50.2" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.43.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8": + version: 4.34.8 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.34.8" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard @@ -5767,9 +5955,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.43.0" +"@rollup/rollup-linux-ppc64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.50.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard @@ -5781,16 +5969,16 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.43.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.50.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.43.0" +"@rollup/rollup-linux-riscv64-musl@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.50.2" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard @@ -5802,9 +5990,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.43.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.50.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard @@ -5816,9 +6004,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.43.0" +"@rollup/rollup-linux-x64-gnu@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.50.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -5830,13 +6018,20 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.43.0" +"@rollup/rollup-linux-x64-musl@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.50.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard +"@rollup/rollup-openharmony-arm64@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.50.2" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-win32-arm64-msvc@npm:4.34.8": version: 4.34.8 resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.34.8" @@ -5844,9 +6039,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.43.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.50.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -5858,9 +6053,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.43.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.50.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -5872,9 +6067,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.43.0": - version: 4.43.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.43.0" +"@rollup/rollup-win32-x64-msvc@npm:4.50.2": + version: 4.50.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.50.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -5937,6 +6132,13 @@ __metadata: languageName: node linkType: hard +"@standard-schema/spec@npm:^1.0.0": + version: 1.0.0 + resolution: "@standard-schema/spec@npm:1.0.0" + checksum: 10c0/a1ab9a8bdc09b5b47aa8365d0e0ec40cc2df6437be02853696a0e377321653b0d3ac6f079a8c67d5ddbe9821025584b1fb71d9cc041a6666a96f1fadf2ece15f + languageName: node + linkType: hard + "@storybook/addon-a11y@workspace:*, @storybook/addon-a11y@workspace:addons/a11y": version: 0.0.0-use.local resolution: "@storybook/addon-a11y@workspace:addons/a11y" @@ -6010,22 +6212,6 @@ __metadata: languageName: unknown linkType: soft -"@storybook/addon-jest@workspace:*, @storybook/addon-jest@workspace:addons/jest": - version: 0.0.0-use.local - resolution: "@storybook/addon-jest@workspace:addons/jest" - dependencies: - "@storybook/icons": "npm:^1.4.0" - react: "npm:^18.2.0" - react-dom: "npm:^18.2.0" - react-resize-detector: "npm:^7.1.2" - tiny-invariant: "npm:^1.3.1" - typescript: "npm:^5.8.3" - upath: "npm:^2.0.1" - peerDependencies: - storybook: "workspace:^" - languageName: unknown - linkType: soft - "@storybook/addon-links@workspace:*, @storybook/addon-links@workspace:addons/links": version: 0.0.0-use.local resolution: "@storybook/addon-links@workspace:addons/links" @@ -6080,8 +6266,8 @@ __metadata: "@types/micromatch": "npm:^4.0.0" "@types/node": "npm:^22.0.0" "@types/semver": "npm:^7" - "@vitest/browser": "npm:^3.2.4" - "@vitest/runner": "npm:^3.2.4" + "@vitest/browser-playwright": "npm:^4.0.1" + "@vitest/runner": "npm:^4.0.1" boxen: "npm:^8.0.1" es-toolkit: "npm:^1.36.0" execa: "npm:^8.0.1" @@ -6100,15 +6286,18 @@ __metadata: tree-kill: "npm:^1.2.2" ts-dedent: "npm:^2.2.0" typescript: "npm:^5.8.3" - vitest: "npm:^3.2.4" + vitest: "npm:^4.0.1" peerDependencies: - "@vitest/browser": ^3.0.0 - "@vitest/runner": ^3.0.0 + "@vitest/browser": ^3.0.0 || ^4.0.0 + "@vitest/browser-playwright": ^4.0.0 + "@vitest/runner": ^3.0.0 || ^4.0.0 storybook: "workspace:^" - vitest: ^3.0.0 + vitest: ^3.0.0 || ^4.0.0 peerDependenciesMeta: "@vitest/browser": optional: true + "@vitest/browser-playwright": + optional: true "@vitest/runner": optional: true vitest: @@ -6416,9 +6605,9 @@ __metadata: semver: "npm:^7.3.5" styled-jsx: "npm:5.1.6" typescript: "npm:^5.8.3" - vite-plugin-storybook-nextjs: "npm:^2.0.7" + vite-plugin-storybook-nextjs: "npm:^3.0.0" peerDependencies: - next: ^14.1.0 || ^15.0.0 + next: ^14.1.0 || ^15.0.0 || ^16.0.0 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: "workspace:^" @@ -6477,7 +6666,7 @@ __metadata: typescript: "npm:^5.8.3" webpack: "npm:^5.65.0" peerDependencies: - next: ^14.1.0 || ^15.0.0 + next: ^14.1.0 || ^15.0.0 || ^16.0.0 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: "workspace:^" @@ -6720,7 +6909,6 @@ __metadata: "@storybook/addon-a11y": "workspace:*" "@storybook/addon-designs": "npm:9.0.0-next.1" "@storybook/addon-docs": "workspace:*" - "@storybook/addon-jest": "workspace:*" "@storybook/addon-links": "workspace:*" "@storybook/addon-onboarding": "workspace:*" "@storybook/addon-themes": "workspace:*" @@ -7084,7 +7272,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:10.4.0, @testing-library/dom@npm:^10.0.0, @testing-library/dom@npm:^10.4.0": +"@testing-library/dom@npm:10.4.0": version: 10.4.0 resolution: "@testing-library/dom@npm:10.4.0" dependencies: @@ -7100,6 +7288,22 @@ __metadata: languageName: node linkType: hard +"@testing-library/dom@npm:^10.0.0, @testing-library/dom@npm:^10.4.0": + version: 10.4.1 + resolution: "@testing-library/dom@npm:10.4.1" + dependencies: + "@babel/code-frame": "npm:^7.10.4" + "@babel/runtime": "npm:^7.12.5" + "@types/aria-query": "npm:^5.0.1" + aria-query: "npm:5.3.0" + dom-accessibility-api: "npm:^0.5.9" + lz-string: "npm:^1.5.0" + picocolors: "npm:1.1.1" + pretty-format: "npm:^27.0.2" + checksum: 10c0/19ce048012d395ad0468b0dbcc4d0911f6f9e39464d7a8464a587b29707eed5482000dad728f5acc4ed314d2f4d54f34982999a114d2404f36d048278db815b1 + languageName: node + linkType: hard + "@testing-library/dom@npm:^9.0.0, @testing-library/dom@npm:^9.3.3": version: 9.3.4 resolution: "@testing-library/dom@npm:9.3.4" @@ -7548,10 +7752,10 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.7, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5, @types/estree@npm:^1.0.6": - version: 1.0.7 - resolution: "@types/estree@npm:1.0.7" - checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c +"@types/estree@npm:*, @types/estree@npm:1.0.8, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5, @types/estree@npm:^1.0.6": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 languageName: node linkType: hard @@ -8177,7 +8381,7 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.31.0, @typescript-eslint/parser@npm:^8.8.1": +"@typescript-eslint/parser@npm:8.31.0": version: 8.31.0 resolution: "@typescript-eslint/parser@npm:8.31.0" dependencies: @@ -8193,6 +8397,35 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/parser@npm:^8.8.1": + version: 8.44.0 + resolution: "@typescript-eslint/parser@npm:8.44.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.44.0" + "@typescript-eslint/types": "npm:8.44.0" + "@typescript-eslint/typescript-estree": "npm:8.44.0" + "@typescript-eslint/visitor-keys": "npm:8.44.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/21b91fba122a4f5df0065de57c5320f8eb4c4f8e0da245f7ee0e68f08f7c5a692a28ac2cb5100d8ad8c8ee7e3804b23f996cd80e0e1da0a0fe0c37ddd2fd04b8 + languageName: node + linkType: hard + +"@typescript-eslint/project-service@npm:8.44.0": + version: 8.44.0 + resolution: "@typescript-eslint/project-service@npm:8.44.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.44.0" + "@typescript-eslint/types": "npm:^8.44.0" + debug: "npm:^4.3.4" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/b06e94ae2a2c167271b61200136283432b6a80ab8bcc175bdcb8f685f4daeb4e28b1d83a064f0a660f184811d67e16d4291ab5fac563e48f20213409be8e95e3 + languageName: node + linkType: hard + "@typescript-eslint/rule-tester@npm:^8.8.1": version: 8.31.0 resolution: "@typescript-eslint/rule-tester@npm:8.31.0" @@ -8220,6 +8453,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.44.0": + version: 8.44.0 + resolution: "@typescript-eslint/scope-manager@npm:8.44.0" + dependencies: + "@typescript-eslint/types": "npm:8.44.0" + "@typescript-eslint/visitor-keys": "npm:8.44.0" + checksum: 10c0/c221e0b9fe9021b1b41432d96818131c107cfc33fb1f8da6093e236c992ed6160dae6355dd5571fb71b9194a24b24734c032ded4c00500599adda2cc07ef8803 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.44.0, @typescript-eslint/tsconfig-utils@npm:^8.44.0": + version: 8.44.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.44.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/453157f0da2d280b4536db6c80dfee4e5c98a1174109cc8d42b20eeb3fda2d54cb6f03f57a142280710091ed0a8e28f231658c253284b1c62960c2974047f3de + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:8.31.0": version: 8.31.0 resolution: "@typescript-eslint/type-utils@npm:8.31.0" @@ -8242,6 +8494,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.44.0, @typescript-eslint/types@npm:^8.44.0": + version: 8.44.0 + resolution: "@typescript-eslint/types@npm:8.44.0" + checksum: 10c0/d3a4c173294533215b4676a89e454e728cda352d6c923489af4306bf5166e51625bff6980708cb1c191bdb89c864d82bccdf96a9ed5a76f6554d6af8c90e2e1d + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:8.31.0": version: 8.31.0 resolution: "@typescript-eslint/typescript-estree@npm:8.31.0" @@ -8260,6 +8519,26 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:8.44.0": + version: 8.44.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.44.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.44.0" + "@typescript-eslint/tsconfig-utils": "npm:8.44.0" + "@typescript-eslint/types": "npm:8.44.0" + "@typescript-eslint/visitor-keys": "npm:8.44.0" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^2.1.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/303dd3048ee0b980b63022626bdff212c0719ce5c5945fb233464f201aadeb3fd703118c8e255a26e1ae81f772bf76b60163119b09d2168f198d5ce1724c2a70 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:8.31.0, @typescript-eslint/utils@npm:^8.8.1": version: 8.31.0 resolution: "@typescript-eslint/utils@npm:8.31.0" @@ -8285,6 +8564,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.44.0": + version: 8.44.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.44.0" + dependencies: + "@typescript-eslint/types": "npm:8.44.0" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/c1cb5c000ab56ddb96ddb0991a10ef3a48c76b3f3b3ab7a5a94d24e71371bf96aa22cfe4332625e49ad7b961947a21599ff7c6128253cc9495e8cbd2cad25d72 + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" @@ -8447,6 +8736,41 @@ __metadata: languageName: node linkType: hard +"@vitest/browser-playwright@npm:^4.0.1": + version: 4.0.1 + resolution: "@vitest/browser-playwright@npm:4.0.1" + dependencies: + "@vitest/browser": "npm:4.0.1" + "@vitest/mocker": "npm:4.0.1" + tinyrainbow: "npm:^3.0.3" + peerDependencies: + playwright: "*" + vitest: 4.0.1 + peerDependenciesMeta: + playwright: + optional: false + checksum: 10c0/10949c4c431ed0edabe6cefd6ef0ba3e2656f6bf16997a4f772b48101282e7939111555c81c72ea9884e4d6766eb4066e612d778db728ee942c498126a457a52 + languageName: node + linkType: hard + +"@vitest/browser@npm:4.0.1": + version: 4.0.1 + resolution: "@vitest/browser@npm:4.0.1" + dependencies: + "@vitest/mocker": "npm:4.0.1" + "@vitest/utils": "npm:4.0.1" + magic-string: "npm:^0.30.19" + pixelmatch: "npm:7.1.0" + pngjs: "npm:^7.0.0" + sirv: "npm:^3.0.2" + tinyrainbow: "npm:^3.0.3" + ws: "npm:^8.18.3" + peerDependencies: + vitest: 4.0.1 + checksum: 10c0/e8d6cb7b65c83c988c28700470e48ba44ea14db3d222abf40d532714ed5c4e2c10dc3f2e133179cb891ac004f9887b49650101f07e05edee3ec77f0118188bb4 + languageName: node + linkType: hard + "@vitest/browser@npm:^3.2.4": version: 3.2.4 resolution: "@vitest/browser@npm:3.2.4" @@ -8534,6 +8858,20 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:4.0.1": + version: 4.0.1 + resolution: "@vitest/expect@npm:4.0.1" + dependencies: + "@standard-schema/spec": "npm:^1.0.0" + "@types/chai": "npm:^5.2.2" + "@vitest/spy": "npm:4.0.1" + "@vitest/utils": "npm:4.0.1" + chai: "npm:^6.0.1" + tinyrainbow: "npm:^3.0.3" + checksum: 10c0/11c5049fe5960fb8403ede0dbdc7c25ac9a9c6eadfc7f9ae5a59cf9e71a44f025ec8a93363aca838ae9cd672ea2f66a735d44246ae1f05005b45b70f09b2e138 + languageName: node + linkType: hard + "@vitest/expect@patch:@vitest/expect@npm%3A3.2.4#~/.yarn/patches/@vitest-expect-npm-3.2.4-97c526d5cc.patch": version: 3.2.4 resolution: "@vitest/expect@patch:@vitest/expect@npm%3A3.2.4#~/.yarn/patches/@vitest-expect-npm-3.2.4-97c526d5cc.patch::version=3.2.4&hash=6385de" @@ -8566,6 +8904,25 @@ __metadata: languageName: node linkType: hard +"@vitest/mocker@npm:4.0.1": + version: 4.0.1 + resolution: "@vitest/mocker@npm:4.0.1" + dependencies: + "@vitest/spy": "npm:4.0.1" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.19" + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/c175efb88598ae5c71f1e8f1957fb47126648227e3cde28d385b3fde21acccc44195d3c70f3a1b2e2a128b2e809c8498ed8906701bc41fa373e72f4fe2c204f8 + languageName: node + linkType: hard + "@vitest/pretty-format@npm:3.2.4, @vitest/pretty-format@npm:^3.2.4": version: 3.2.4 resolution: "@vitest/pretty-format@npm:3.2.4" @@ -8575,7 +8932,16 @@ __metadata: languageName: node linkType: hard -"@vitest/runner@npm:3.2.4, @vitest/runner@npm:^3.2.4": +"@vitest/pretty-format@npm:4.0.1": + version: 4.0.1 + resolution: "@vitest/pretty-format@npm:4.0.1" + dependencies: + tinyrainbow: "npm:^3.0.3" + checksum: 10c0/4f71073ff474ee5c8fe8481fff219576b27b8f370e83b13ab1f7252f6f8a0d68569f5548ba35286804bc919b0a3cf01f3125ca1edf5f326974a01db53f83d2f9 + languageName: node + linkType: hard + +"@vitest/runner@npm:3.2.4": version: 3.2.4 resolution: "@vitest/runner@npm:3.2.4" dependencies: @@ -8586,6 +8952,16 @@ __metadata: languageName: node linkType: hard +"@vitest/runner@npm:4.0.1, @vitest/runner@npm:^4.0.1": + version: 4.0.1 + resolution: "@vitest/runner@npm:4.0.1" + dependencies: + "@vitest/utils": "npm:4.0.1" + pathe: "npm:^2.0.3" + checksum: 10c0/f8f7507a82ff0510d82e4207d81ff58c7c972c6e43b345a5ebcfe70b845b0f71ce94432b8aa3bbc5ef25d96fd8c0f320c8387691b0e8fcf9fca200897d3318dd + languageName: node + linkType: hard + "@vitest/snapshot@npm:3.2.4": version: 3.2.4 resolution: "@vitest/snapshot@npm:3.2.4" @@ -8593,7 +8969,18 @@ __metadata: "@vitest/pretty-format": "npm:3.2.4" magic-string: "npm:^0.30.17" pathe: "npm:^2.0.3" - checksum: 10c0/f8301a3d7d1559fd3d59ed51176dd52e1ed5c2d23aa6d8d6aa18787ef46e295056bc726a021698d8454c16ed825ecba163362f42fa90258bb4a98cfd2c9424fc + checksum: 10c0/f8301a3d7d1559fd3d59ed51176dd52e1ed5c2d23aa6d8d6aa18787ef46e295056bc726a021698d8454c16ed825ecba163362f42fa90258bb4a98cfd2c9424fc + languageName: node + linkType: hard + +"@vitest/snapshot@npm:4.0.1": + version: 4.0.1 + resolution: "@vitest/snapshot@npm:4.0.1" + dependencies: + "@vitest/pretty-format": "npm:4.0.1" + magic-string: "npm:^0.30.19" + pathe: "npm:^2.0.3" + checksum: 10c0/50fde1be5c3df22ae45acb3885007b8a332595150468fe0ac23efb366efb4b621e4ce7e9c7e81537fd2eb89db1c1798c8ffcb151890645829d497e797f243761 languageName: node linkType: hard @@ -8606,6 +8993,13 @@ __metadata: languageName: node linkType: hard +"@vitest/spy@npm:4.0.1": + version: 4.0.1 + resolution: "@vitest/spy@npm:4.0.1" + checksum: 10c0/7c088c307fc72c033d324563f7b5c8f4f7afdbea51683d896d99b5463ff9f3801b559869a5c9c0078945e3f6d92745273eb19fc20f01b3b95d46f10f81bd9db9 + languageName: node + linkType: hard + "@vitest/utils@npm:3.2.4, @vitest/utils@npm:^3.2.4": version: 3.2.4 resolution: "@vitest/utils@npm:3.2.4" @@ -8617,6 +9011,16 @@ __metadata: languageName: node linkType: hard +"@vitest/utils@npm:4.0.1": + version: 4.0.1 + resolution: "@vitest/utils@npm:4.0.1" + dependencies: + "@vitest/pretty-format": "npm:4.0.1" + tinyrainbow: "npm:^3.0.3" + checksum: 10c0/f042d3ea8d7d224d510db028312998d83bcc36da681c441c6aec7eb641393dc979e20c424bf26f11ca26468c3c2d6a1fd4a86f3b09a75afaa54c2bc2e1cc900a + languageName: node + linkType: hard + "@volar/language-core@npm:2.4.13, @volar/language-core@npm:~2.4.11": version: 2.4.13 resolution: "@volar/language-core@npm:2.4.13" @@ -8657,7 +9061,20 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-dom@npm:3.5.13, @vue/compiler-dom@npm:^3.2.0, @vue/compiler-dom@npm:^3.5.0": +"@vue/compiler-core@npm:3.5.21": + version: 3.5.21 + resolution: "@vue/compiler-core@npm:3.5.21" + dependencies: + "@babel/parser": "npm:^7.28.3" + "@vue/shared": "npm:3.5.21" + entities: "npm:^4.5.0" + estree-walker: "npm:^2.0.2" + source-map-js: "npm:^1.2.1" + checksum: 10c0/b8fa1003551815a27381fb242cf4e52cbb22571009506be91264e288a6b69c24a9d31f8aa76087fffce44d56a71f742953c765d32e55c5b4defd97be904b45b1 + languageName: node + linkType: hard + +"@vue/compiler-dom@npm:3.5.13": version: 3.5.13 resolution: "@vue/compiler-dom@npm:3.5.13" dependencies: @@ -8667,7 +9084,17 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-sfc@npm:3.5.13, @vue/compiler-sfc@npm:^3.2.0": +"@vue/compiler-dom@npm:3.5.21, @vue/compiler-dom@npm:^3.2.0, @vue/compiler-dom@npm:^3.5.0": + version: 3.5.21 + resolution: "@vue/compiler-dom@npm:3.5.21" + dependencies: + "@vue/compiler-core": "npm:3.5.21" + "@vue/shared": "npm:3.5.21" + checksum: 10c0/84c5eb1a99f2c73dfc5596bce3ce3672b30712393b4399e5906d391939e85c0e0c756e344e8d8fdd4b853186fd9ae64786927ecf8b76e12ad47b783c92bcbe55 + languageName: node + linkType: hard + +"@vue/compiler-sfc@npm:3.5.13": version: 3.5.13 resolution: "@vue/compiler-sfc@npm:3.5.13" dependencies: @@ -8684,6 +9111,23 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-sfc@npm:^3.2.0": + version: 3.5.21 + resolution: "@vue/compiler-sfc@npm:3.5.21" + dependencies: + "@babel/parser": "npm:^7.28.3" + "@vue/compiler-core": "npm:3.5.21" + "@vue/compiler-dom": "npm:3.5.21" + "@vue/compiler-ssr": "npm:3.5.21" + "@vue/shared": "npm:3.5.21" + estree-walker: "npm:^2.0.2" + magic-string: "npm:^0.30.18" + postcss: "npm:^8.5.6" + source-map-js: "npm:^1.2.1" + checksum: 10c0/5aea296dbfd3d734a457b3026e08a70ead16e0a0814b2c96732a0e12c773574b1582b36b2eaedf8364953ed002aec6877d5c60b60bbc0c4ea3c76e5f637bb2bc + languageName: node + linkType: hard + "@vue/compiler-ssr@npm:3.5.13": version: 3.5.13 resolution: "@vue/compiler-ssr@npm:3.5.13" @@ -8694,6 +9138,16 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-ssr@npm:3.5.21": + version: 3.5.21 + resolution: "@vue/compiler-ssr@npm:3.5.21" + dependencies: + "@vue/compiler-dom": "npm:3.5.21" + "@vue/shared": "npm:3.5.21" + checksum: 10c0/5baba67df45372f455dd83ada011e2090703a31b27787987a42174ced6010091b4f7fb7bdff22cc4787b4b195ec431fae483bbac7a07372a7cda6f4d775cd718 + languageName: node + linkType: hard + "@vue/compiler-vue2@npm:^2.7.16": version: 2.7.16 resolution: "@vue/compiler-vue2@npm:2.7.16" @@ -8768,13 +9222,20 @@ __metadata: languageName: node linkType: hard -"@vue/shared@npm:3.5.13, @vue/shared@npm:^3.5.0": +"@vue/shared@npm:3.5.13": version: 3.5.13 resolution: "@vue/shared@npm:3.5.13" checksum: 10c0/2c940ef907116f1c2583ca1d7733984e5705983ab07054c4e72f1d95eb0f7bdf4d01efbdaee1776c2008f79595963f44e98fced057f5957d86d57b70028f5025 languageName: node linkType: hard +"@vue/shared@npm:3.5.21, @vue/shared@npm:^3.5.0": + version: 3.5.21 + resolution: "@vue/shared@npm:3.5.21" + checksum: 10c0/fbaf2e973d232ccd6d9afd3440510e2436c5e918f6634eb3e0f95d148041f7b9347bcb349db6265f2ee92e5ffd0e6751bdc649698c52f9179b45d93f68473706 + languageName: node + linkType: hard + "@vue/test-utils@npm:^2.4.1": version: 2.4.6 resolution: "@vue/test-utils@npm:2.4.6" @@ -9076,12 +9537,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.0, acorn@npm:^8.11.0, acorn@npm:^8.12.1, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.6.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.14.1 - resolution: "acorn@npm:8.14.1" +"acorn@npm:^8.0.0, acorn@npm:^8.11.0, acorn@npm:^8.12.1, acorn@npm:^8.14.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1, acorn@npm:^8.6.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 + checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec languageName: node linkType: hard @@ -9459,16 +9920,18 @@ __metadata: linkType: hard "array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": - version: 3.1.8 - resolution: "array-includes@npm:3.1.8" + version: 3.1.9 + resolution: "array-includes@npm:3.1.9" dependencies: - call-bind: "npm:^1.0.7" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.4" define-properties: "npm:^1.2.1" - es-abstract: "npm:^1.23.2" - es-object-atoms: "npm:^1.0.0" - get-intrinsic: "npm:^1.2.4" - is-string: "npm:^1.0.7" - checksum: 10c0/5b1004d203e85873b96ddc493f090c9672fd6c80d7a60b798da8a14bff8a670ff95db5aafc9abc14a211943f05220dacf8ea17638ae0af1a6a47b8c0b48ce370 + es-abstract: "npm:^1.24.0" + es-object-atoms: "npm:^1.1.1" + get-intrinsic: "npm:^1.3.0" + is-string: "npm:^1.1.1" + math-intrinsics: "npm:^1.1.0" + checksum: 10c0/0235fa69078abeac05ac4250699c44996bc6f774a9cbe45db48674ce6bd142f09b327d31482ff75cf03344db4ea03eae23edb862d59378b484b47ed842574856 languageName: node linkType: hard @@ -9918,16 +10381,16 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.13 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.13" +"babel-plugin-polyfill-corejs2@npm:^0.4.10, babel-plugin-polyfill-corejs2@npm:^0.4.14": + version: 0.4.14 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.14" dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.4" + "@babel/compat-data": "npm:^7.27.7" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/b4a54561606d388e6f9499f39f03171af4be7f9ce2355e737135e40afa7086cf6790fdd706c2e59f488c8fa1f76123d28783708e07ddc84647dca8ed8fb98e06 + checksum: 10c0/d74cba0600a6508e86d220bde7164eb528755d91be58020e5ea92ea7fbb12c9d8d2c29246525485adfe7f68ae02618ec428f9a589cac6cbedf53cc3972ad7fbe languageName: node linkType: hard @@ -9943,14 +10406,26 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.4 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.4" +"babel-plugin-polyfill-corejs3@npm:^0.13.0": + version: 0.13.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.4" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10c0/ebaaf9e4e53201c02f496d3f686d815e94177b3e55b35f11223b99c60d197a29f907a2e87bbcccced8b7aff22a807fccc1adaf04722864a8e1862c8845ab830a + checksum: 10c0/5d8e228da425edc040d8c868486fd01ba10b0440f841156a30d9f8986f330f723e2ee61553c180929519563ef5b64acce2caac36a5a847f095d708dda5d8206d + languageName: node + linkType: hard + +"babel-plugin-polyfill-regenerator@npm:^0.6.1, babel-plugin-polyfill-regenerator@npm:^0.6.5": + version: 0.6.5 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.5" + dependencies: + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10c0/63aa8ed716df6a9277c6ab42b887858fa9f57a70cc1d0ae2b91bdf081e45d4502848cba306fb60b02f59f99b32fd02ff4753b373cac48ccdac9b7d19dd56f06d languageName: node linkType: hard @@ -10004,6 +10479,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.3": + version: 2.8.4 + resolution: "baseline-browser-mapping@npm:2.8.4" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10c0/d85c8e9b919d4f7d5b46cf3d89e6a8be6e74086934ff6f362b720be8e06656021a0207e2ba1efe8ae2563dec893a76ad15633e06f3e153984fab8118e2dc4ae7 + languageName: node + linkType: hard + "basic-auth@npm:^2.0.1": version: 2.0.1 resolution: "basic-auth@npm:2.0.1" @@ -10568,17 +11052,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.5, browserslist@npm:^4.23.0, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2, browserslist@npm:^4.24.4": - version: 4.24.4 - resolution: "browserslist@npm:4.24.4" +"browserslist@npm:^4.21.5, browserslist@npm:^4.23.0, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2, browserslist@npm:^4.25.3": + version: 4.26.2 + resolution: "browserslist@npm:4.26.2" dependencies: - caniuse-lite: "npm:^1.0.30001688" - electron-to-chromium: "npm:^1.5.73" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.1" + baseline-browser-mapping: "npm:^2.8.3" + caniuse-lite: "npm:^1.0.30001741" + electron-to-chromium: "npm:^1.5.218" + node-releases: "npm:^2.0.21" + update-browserslist-db: "npm:^1.1.3" bin: browserslist: cli.js - checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 + checksum: 10c0/1146339dad33fda77786b11ea07f1c40c48899edd897d73a9114ee0dbb1ee6475bb4abda263a678c104508bdca8e66760ff8e10be1947d3e20d34bae01d8b89b languageName: node linkType: hard @@ -10816,10 +11301,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001687, caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001746 - resolution: "caniuse-lite@npm:1.0.30001746" - checksum: 10c0/e656a9dc811be2316e3b6dbd3bf25d0e32dbce645b1284821b4ec93fb81dc3e3f73b9473e2f66c921b620ea8b25ebbae9ee70c3d13dad85f8dd69d6bb2c91d46 +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001687, caniuse-lite@npm:^1.0.30001741": + version: 1.0.30001743 + resolution: "caniuse-lite@npm:1.0.30001743" + checksum: 10c0/1bd730ca10d881a1ca9f55ce864d34c3b18501718c03976e0d3419f4694b715159e13fdef6d58ad47b6d2445d315940f3a01266658876828c820a3331aac021d languageName: node linkType: hard @@ -10850,6 +11335,13 @@ __metadata: languageName: node linkType: hard +"chai@npm:^6.0.1": + version: 6.2.0 + resolution: "chai@npm:6.2.0" + checksum: 10c0/a4b7d7f5907187e09f1847afa838d6d1608adc7d822031b7900813c4ed5d9702911ac2468bf290676f22fddb3d727b1be90b57c1d0a69b902534ee29cdc6ff8a + languageName: node + linkType: hard + "chalk@npm:5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" @@ -10889,9 +11381,9 @@ __metadata: linkType: hard "chalk@npm:^5.0.1, chalk@npm:^5.2.0, chalk@npm:^5.3.0": - version: 5.4.1 - resolution: "chalk@npm:5.4.1" - checksum: 10c0/b23e88132c702f4855ca6d25cb5538b1114343e41472d5263ee8a37cccfccd9c4216d111e1097c6a27830407a1dc81fecdf2a56f2c63033d4dbbd88c10b0dcef + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 languageName: node linkType: hard @@ -11669,12 +12161,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.40.0": - version: 3.41.0 - resolution: "core-js-compat@npm:3.41.0" +"core-js-compat@npm:^3.40.0, core-js-compat@npm:^3.43.0": + version: 3.45.1 + resolution: "core-js-compat@npm:3.45.1" dependencies: - browserslist: "npm:^4.24.4" - checksum: 10c0/92d2c748d3dd1c4e3b6cee6b6683b9212db9bc0a6574d933781210daf3baaeb76334ed4636eb8935b45802aa8d9235ab604c9a262694e02a2fa17ad0f6976829 + browserslist: "npm:^4.25.3" + checksum: 10c0/b22996d3ca7e4f6758725f9ebbb61d422466d7ec0359158563264069ec066e7d2539fc7daebaa8aaf7b0bde73114ce42519611a0f0edb471139349e0cd11e183 languageName: node linkType: hard @@ -12114,15 +12606,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.1": - version: 4.4.1 - resolution: "debug@npm:4.4.1" +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55 + checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 languageName: node linkType: hard @@ -12393,9 +12885,9 @@ __metadata: linkType: hard "detect-libc@npm:^2.0.1, detect-libc@npm:^2.0.3": - version: 2.0.4 - resolution: "detect-libc@npm:2.0.4" - checksum: 10c0/c15541f836eba4b1f521e4eecc28eefefdbc10a94d3b8cb4c507689f332cc111babb95deda66f2de050b22122113189986d5190be97d51b5a2b23b938415e67c + version: 2.1.0 + resolution: "detect-libc@npm:2.1.0" + checksum: 10c0/4d0d36c77fdcb1d3221779d8dfc7d5808dd52530d49db67193fb3cd8149e2d499a1eeb87bb830ad7c442294929992c12e971f88ae492965549f8f83e5336eba6 languageName: node linkType: hard @@ -12805,10 +13297,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.73": - version: 1.5.143 - resolution: "electron-to-chromium@npm:1.5.143" - checksum: 10c0/2868655af1b32784395475b1f58d6363c837b198f64cb23e0fbcf1a45f682187cbf2b2aea1df6e4584a4d1a7c7c4ced04a9a09c24644ae0b216af6bdc1501cf5 +"electron-to-chromium@npm:^1.5.218": + version: 1.5.220 + resolution: "electron-to-chromium@npm:1.5.220" + checksum: 10c0/5d0fd9304a25cb6043593f3e7e7c17c5af8b5eb5cc7896b523cbc08eb5e02db0e20e768551b8f866478c95921ee479190e712eb6a3279ea3b7384e2043b1f078 languageName: node linkType: hard @@ -13196,26 +13688,26 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9": - version: 1.23.9 - resolution: "es-abstract@npm:1.23.9" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0": + version: 1.24.0 + resolution: "es-abstract@npm:1.24.0" dependencies: array-buffer-byte-length: "npm:^1.0.2" arraybuffer.prototype.slice: "npm:^1.0.4" available-typed-arrays: "npm:^1.0.7" call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" + call-bound: "npm:^1.0.4" data-view-buffer: "npm:^1.0.2" data-view-byte-length: "npm:^1.0.2" data-view-byte-offset: "npm:^1.0.1" es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" - es-object-atoms: "npm:^1.0.0" + es-object-atoms: "npm:^1.1.1" es-set-tostringtag: "npm:^2.1.0" es-to-primitive: "npm:^1.3.0" function.prototype.name: "npm:^1.1.8" - get-intrinsic: "npm:^1.2.7" - get-proto: "npm:^1.0.0" + get-intrinsic: "npm:^1.3.0" + get-proto: "npm:^1.0.1" get-symbol-description: "npm:^1.1.0" globalthis: "npm:^1.0.4" gopd: "npm:^1.2.0" @@ -13227,21 +13719,24 @@ __metadata: is-array-buffer: "npm:^3.0.5" is-callable: "npm:^1.2.7" is-data-view: "npm:^1.0.2" + is-negative-zero: "npm:^2.0.3" is-regex: "npm:^1.2.1" + is-set: "npm:^2.0.3" is-shared-array-buffer: "npm:^1.0.4" is-string: "npm:^1.1.1" is-typed-array: "npm:^1.1.15" - is-weakref: "npm:^1.1.0" + is-weakref: "npm:^1.1.1" math-intrinsics: "npm:^1.1.0" - object-inspect: "npm:^1.13.3" + object-inspect: "npm:^1.13.4" object-keys: "npm:^1.1.1" object.assign: "npm:^4.1.7" own-keys: "npm:^1.0.1" - regexp.prototype.flags: "npm:^1.5.3" + regexp.prototype.flags: "npm:^1.5.4" safe-array-concat: "npm:^1.1.3" safe-push-apply: "npm:^1.0.0" safe-regex-test: "npm:^1.1.0" set-proto: "npm:^1.0.0" + stop-iteration-iterator: "npm:^1.1.0" string.prototype.trim: "npm:^1.2.10" string.prototype.trimend: "npm:^1.0.9" string.prototype.trimstart: "npm:^1.0.8" @@ -13250,8 +13745,8 @@ __metadata: typed-array-byte-offset: "npm:^1.0.4" typed-array-length: "npm:^1.0.7" unbox-primitive: "npm:^1.1.0" - which-typed-array: "npm:^1.1.18" - checksum: 10c0/1de229c9e08fe13c17fe5abaec8221545dfcd57e51f64909599a6ae896df84b8fd2f7d16c60cb00d7bf495b9298ca3581aded19939d4b7276854a4b066f8422b + which-typed-array: "npm:^1.1.19" + checksum: 10c0/b256e897be32df5d382786ce8cce29a1dd8c97efbab77a26609bd70f2ed29fbcfc7a31758cb07488d532e7ccccdfca76c1118f2afe5a424cdc05ca007867c318 languageName: node linkType: hard @@ -13992,10 +14487,10 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.2.0": - version: 4.2.0 - resolution: "eslint-visitor-keys@npm:4.2.0" - checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 +"eslint-visitor-keys@npm:^4.2.0, eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43 languageName: node linkType: hard @@ -14431,10 +14926,10 @@ __metadata: languageName: node linkType: hard -"expect-type@npm:^1.1.0, expect-type@npm:^1.2.1": - version: 1.2.1 - resolution: "expect-type@npm:1.2.1" - checksum: 10c0/b775c9adab3c190dd0d398c722531726cdd6022849b4adba19dceab58dda7e000a7c6c872408cd73d665baa20d381eca36af4f7b393a4ba60dd10232d1fb8898 +"expect-type@npm:^1.1.0, expect-type@npm:^1.2.1, expect-type@npm:^1.2.2": + version: 1.2.2 + resolution: "expect-type@npm:1.2.2" + checksum: 10c0/6019019566063bbc7a690d9281d920b1a91284a4a093c2d55d71ffade5ac890cf37a51e1da4602546c4b56569d2ad2fc175a2ccee77d1ae06cb3af91ef84f44b languageName: node linkType: hard @@ -14634,15 +15129,15 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.2.0, fdir@npm:^6.4.4, fdir@npm:^6.4.5": - version: 6.4.6 - resolution: "fdir@npm:6.4.6" +"fdir@npm:^6.2.0, fdir@npm:^6.4.4, fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true - checksum: 10c0/45b559cff889934ebb8bc498351e5acba40750ada7e7d6bde197768d2fa67c149be8ae7f8ff34d03f4e1eb20f2764116e56440aaa2f6689e9a4aa7ef06acafe9 + checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f languageName: node linkType: hard @@ -15341,9 +15836,9 @@ __metadata: linkType: hard "get-east-asian-width@npm:^1.0.0": - version: 1.3.0 - resolution: "get-east-asian-width@npm:1.3.0" - checksum: 10c0/1a049ba697e0f9a4d5514c4623781c5246982bdb61082da6b5ae6c33d838e52ce6726407df285cdbb27ec1908b333cf2820989bd3e986e37bb20979437fdf34b + version: 1.4.0 + resolution: "get-east-asian-width@npm:1.4.0" + checksum: 10c0/4e481d418e5a32061c36fbb90d1b225a254cc5b2df5f0b25da215dcd335a3c111f0c2023ffda43140727a9cafb62dac41d022da82c08f31083ee89f714ee3b83 languageName: node linkType: hard @@ -17003,6 +17498,13 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e + languageName: node + linkType: hard + "is-network-error@npm:^1.0.0": version: 1.1.0 resolution: "is-network-error@npm:1.1.0" @@ -17194,7 +17696,7 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.0": +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": version: 1.1.1 resolution: "is-weakref@npm:1.1.1" dependencies: @@ -17453,6 +17955,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.5.1": + version: 2.5.1 + resolution: "jiti@npm:2.5.1" + bin: + jiti: lib/jiti-cli.mjs + checksum: 10c0/f0a38d7d8842cb35ffe883038166aa2d52ffd21f1a4fc839ae4076ea7301c22a1f11373f8fc52e2667de7acde8f3e092835620dd6f72a0fbe9296b268b0874bb + languageName: node + linkType: hard + "jju@npm:^1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" @@ -18536,7 +19047,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:0.30.17, magic-string@npm:^0.30.0, magic-string@npm:^0.30.11, magic-string@npm:^0.30.15, magic-string@npm:^0.30.17, magic-string@npm:^0.30.5": +"magic-string@npm:0.30.17": version: 0.30.17 resolution: "magic-string@npm:0.30.17" dependencies: @@ -18545,6 +19056,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.0, magic-string@npm:^0.30.11, magic-string@npm:^0.30.15, magic-string@npm:^0.30.17, magic-string@npm:^0.30.18, magic-string@npm:^0.30.19, magic-string@npm:^0.30.5": + version: 0.30.19 + resolution: "magic-string@npm:0.30.19" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.5" + checksum: 10c0/db23fd2e2ee98a1aeb88a4cdb2353137fcf05819b883c856dd79e4c7dfb25151e2a5a4d5dbd88add5e30ed8ae5c51bcf4accbc6becb75249d924ec7b4fbcae27 + languageName: node + linkType: hard + "magicast@npm:^0.3.5": version: 0.3.5 resolution: "magicast@npm:0.3.5" @@ -19287,7 +19807,7 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.x.x, mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:1.x.x, mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.54.0": version: 1.54.0 resolution: "mime-db@npm:1.54.0" checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 @@ -19303,6 +19823,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^3.0.1": + version: 3.0.1 + resolution: "mime-types@npm:3.0.1" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10c0/bd8c20d3694548089cf229016124f8f40e6a60bbb600161ae13e45f793a2d5bb40f96bbc61f275836696179c77c1d6bf4967b2a75e0a8ad40fe31f4ed5be4da5 + languageName: node + linkType: hard + "mime@npm:1.6.0, mime@npm:^1.4.1, mime@npm:^1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -20026,10 +20555,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa +"node-releases@npm:^2.0.21": + version: 2.0.21 + resolution: "node-releases@npm:2.0.21" + checksum: 10c0/0eb94916eeebbda9d51da6a9ea47428a12b2bb0dd94930c949632b0c859356abf53b2e5a2792021f96c5fda4f791a8e195f2375b78ae7dba8d8bc3141baa1469 languageName: node linkType: hard @@ -20345,7 +20874,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.3": +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 @@ -20516,14 +21045,14 @@ __metadata: linkType: hard "open@npm:^10.0.3, open@npm:^10.1.0": - version: 10.1.1 - resolution: "open@npm:10.1.1" + version: 10.2.0 + resolution: "open@npm:10.2.0" dependencies: default-browser: "npm:^5.2.1" define-lazy-prop: "npm:^3.0.0" is-inside-container: "npm:^1.0.0" - is-wsl: "npm:^3.1.0" - checksum: 10c0/27706de0a8015fcfa9454394984f726f47aba10f33b1a16eda8d7d3604a01c39b2372638b068401dffd9826dca689947480062742b116ff76e0970c39a5e25c6 + wsl-utils: "npm:^0.1.0" + checksum: 10c0/5a36d0c1fd2f74ce553beb427ca8b8494b623fc22c6132d0c1688f246a375e24584ea0b44c67133d9ab774fa69be8e12fbe1ff12504b1142bd960fb09671948f languageName: node linkType: hard @@ -21165,14 +21694,14 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": +"picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard -"picomatch@npm:4.0.2, picomatch@npm:^4.0.2": +"picomatch@npm:4.0.2": version: 4.0.2 resolution: "picomatch@npm:4.0.2" checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc @@ -21186,6 +21715,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 + languageName: node + linkType: hard + "picoquery@npm:^1.4.0": version: 1.4.0 resolution: "picoquery@npm:1.4.0" @@ -21246,6 +21782,17 @@ __metadata: languageName: node linkType: hard +"pixelmatch@npm:7.1.0": + version: 7.1.0 + resolution: "pixelmatch@npm:7.1.0" + dependencies: + pngjs: "npm:^7.0.0" + bin: + pixelmatch: bin/pixelmatch + checksum: 10c0/ff069f92edaa841ac9b58b0ab74e1afa1f3b5e770eea0218c96bac1da4e752f5f6b79a0f9c4ba6b02afb955d39b8c78bcc3cc884f8122b67a1f2efbbccbe1a73 + languageName: node + linkType: hard + "pkg-dir@npm:^3.0.0": version: 3.0.0 resolution: "pkg-dir@npm:3.0.0" @@ -21335,6 +21882,13 @@ __metadata: languageName: node linkType: hard +"pngjs@npm:^7.0.0": + version: 7.0.0 + resolution: "pngjs@npm:7.0.0" + checksum: 10c0/0d4c7a0fd476a9c33df7d0a2a73e1d56537628a668841f6995c2bca070cf30819f9254a64363266bc14ef2fee47659dd3b4f2b18eec7ab65143015139f497b38 + languageName: node + linkType: hard + "pnp-webpack-plugin@npm:^1.7.0": version: 1.7.0 resolution: "pnp-webpack-plugin@npm:1.7.0" @@ -21437,7 +21991,7 @@ __metadata: languageName: node linkType: hard -"postcss-loader@npm:8.1.1, postcss-loader@npm:^8.1.1": +"postcss-loader@npm:8.1.1": version: 8.1.1 resolution: "postcss-loader@npm:8.1.1" dependencies: @@ -21457,6 +22011,26 @@ __metadata: languageName: node linkType: hard +"postcss-loader@npm:^8.1.1": + version: 8.2.0 + resolution: "postcss-loader@npm:8.2.0" + dependencies: + cosmiconfig: "npm:^9.0.0" + jiti: "npm:^2.5.1" + semver: "npm:^7.6.2" + peerDependencies: + "@rspack/core": 0.x || 1.x + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10c0/471f9a1c313522580f3385b92ab847cf161c6972bedc73525126a3c0a08733f0f6444d04ca9e0a8b1e36b44123e103dfcd8f53378b7e5afc95fa6d9ab423c480 + languageName: node + linkType: hard + "postcss-media-query-parser@npm:^0.2.3": version: 0.2.3 resolution: "postcss-media-query-parser@npm:0.2.3" @@ -21556,14 +22130,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.14, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.48, postcss@npm:^8.4.49, postcss@npm:^8.5.3, postcss@npm:^8.5.4": - version: 8.5.5 - resolution: "postcss@npm:8.5.5" +"postcss@npm:^8.2.14, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.4.48, postcss@npm:^8.4.49, postcss@npm:^8.5.3, postcss@npm:^8.5.6": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/6415873fab84de05c2d8fd18f72ea6654bca437bb4b9f02ca819c438501e4b3a450023e575e17587c6eaa5bedddaaa4dad3af210f5cf166e30cec09cac58baf8 + checksum: 10c0/5127cc7c91ed7a133a1b7318012d8bfa112da9ef092dddf369ae699a1f10ebbd89b1b9f25f3228795b84585c72aabd5ced5fc11f2ba467eedf7b081a66fad024 languageName: node linkType: hard @@ -22810,15 +23384,6 @@ __metadata: languageName: node linkType: hard -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" - dependencies: - "@babel/runtime": "npm:^7.8.4" - checksum: 10c0/7cfe6931ec793269701994a93bab89c0cc95379191fad866270a7fea2adfec67ea62bb5b374db77058b60ba4509319d9b608664d0d288bd9989ca8dbd08fae90 - languageName: node - linkType: hard - "regex-parser@npm:^2.2.11": version: 2.3.1 resolution: "regex-parser@npm:2.3.1" @@ -22826,7 +23391,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3": +"regexp.prototype.flags@npm:^1.5.1, regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: @@ -23106,7 +23671,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.10.1, resolve@npm:^1.12.0, resolve@npm:^1.13.1, resolve@npm:^1.14.2, resolve@npm:^1.15.1, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.4.0": +"resolve@npm:^1.10.0, resolve@npm:^1.10.1, resolve@npm:^1.12.0, resolve@npm:^1.13.1, resolve@npm:^1.15.1, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1, resolve@npm:^1.22.10, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.4.0": version: 1.22.10 resolution: "resolve@npm:1.22.10" dependencies: @@ -23132,7 +23697,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.13.1#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.4.0#optional!builtin": +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.12.0#optional!builtin, resolve@patch:resolve@npm%3A^1.13.1#optional!builtin, resolve@patch:resolve@npm%3A^1.15.1#optional!builtin, resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.10#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin, resolve@patch:resolve@npm%3A^1.4.0#optional!builtin": version: 1.22.10 resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" dependencies: @@ -23376,31 +23941,32 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.30.1, rollup@npm:^4.34.9, rollup@npm:^4.40.0": - version: 4.43.0 - resolution: "rollup@npm:4.43.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.43.0" - "@rollup/rollup-android-arm64": "npm:4.43.0" - "@rollup/rollup-darwin-arm64": "npm:4.43.0" - "@rollup/rollup-darwin-x64": "npm:4.43.0" - "@rollup/rollup-freebsd-arm64": "npm:4.43.0" - "@rollup/rollup-freebsd-x64": "npm:4.43.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.43.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.43.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.43.0" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.43.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-riscv64-musl": "npm:4.43.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.43.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.43.0" - "@rollup/rollup-linux-x64-musl": "npm:4.43.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.43.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.43.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.43.0" - "@types/estree": "npm:1.0.7" +"rollup@npm:^4.30.1, rollup@npm:^4.34.9, rollup@npm:^4.43.0": + version: 4.50.2 + resolution: "rollup@npm:4.50.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.50.2" + "@rollup/rollup-android-arm64": "npm:4.50.2" + "@rollup/rollup-darwin-arm64": "npm:4.50.2" + "@rollup/rollup-darwin-x64": "npm:4.50.2" + "@rollup/rollup-freebsd-arm64": "npm:4.50.2" + "@rollup/rollup-freebsd-x64": "npm:4.50.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.50.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.50.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.50.2" + "@rollup/rollup-linux-loong64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-riscv64-musl": "npm:4.50.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.50.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.50.2" + "@rollup/rollup-linux-x64-musl": "npm:4.50.2" + "@rollup/rollup-openharmony-arm64": "npm:4.50.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.50.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.50.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.50.2" + "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -23423,9 +23989,9 @@ __metadata: optional: true "@rollup/rollup-linux-arm64-musl": optional: true - "@rollup/rollup-linux-loongarch64-gnu": + "@rollup/rollup-linux-loong64-gnu": optional: true - "@rollup/rollup-linux-powerpc64le-gnu": + "@rollup/rollup-linux-ppc64-gnu": optional: true "@rollup/rollup-linux-riscv64-gnu": optional: true @@ -23437,6 +24003,8 @@ __metadata: optional: true "@rollup/rollup-linux-x64-musl": optional: true + "@rollup/rollup-openharmony-arm64": + optional: true "@rollup/rollup-win32-arm64-msvc": optional: true "@rollup/rollup-win32-ia32-msvc": @@ -23447,7 +24015,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/a14a16ee5433f9eddfe803ed1a3f4528e3e96f746e55bf88c5482f9a60a4ad61f507b59f46d5d9c8dc98bb7983483e0c94b760ae37c02157eba9da5665c1641b + checksum: 10c0/5415d0a5ae6f37fa5f10997b3c5cff20c2ea6bd1636db90e59672969a4f83b29f6168bf9dd26c1276c2e37e1d55674472758da90cbc46c8b08ada5d0ec60eb9b languageName: node linkType: hard @@ -24116,14 +24684,14 @@ __metadata: languageName: node linkType: hard -"sirv@npm:^3.0.1": - version: 3.0.1 - resolution: "sirv@npm:3.0.1" +"sirv@npm:^3.0.1, sirv@npm:^3.0.2": + version: 3.0.2 + resolution: "sirv@npm:3.0.2" dependencies: "@polka/url": "npm:^1.0.0-next.24" mrmime: "npm:^2.0.0" totalist: "npm:^3.0.0" - checksum: 10c0/7cf64b28daa69b15f77b38b0efdd02c007b72bb3ec5f107b208ebf59f01b174ef63a1db3aca16d2df925501831f4c209be6ece3302b98765919ef5088b45bf80 + checksum: 10c0/5930e4397afdb14fbae13751c3be983af4bda5c9aadec832607dc2af15a7162f7d518c71b30e83ae3644b9a24cea041543cc969e5fe2b80af6ce8ea3174b2d04 languageName: node linkType: hard @@ -24308,7 +24876,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:0.7.4, source-map@npm:^0.7.0, source-map@npm:^0.7.3, source-map@npm:^0.7.4": +"source-map@npm:0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc @@ -24340,6 +24908,13 @@ __metadata: languageName: node linkType: hard +"source-map@npm:^0.7.0, source-map@npm:^0.7.3, source-map@npm:^0.7.4": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10c0/59f6f05538539b274ba771d2e9e32f6c65451982510564438e048bc1352f019c6efcdc6dd07909b1968144941c14015c2c7d4369fb7c4d7d53ae769716dcc16c + languageName: node + linkType: hard + "space-separated-tokens@npm:^1.0.0": version: 1.1.5 resolution: "space-separated-tokens@npm:1.1.5" @@ -24446,7 +25021,7 @@ __metadata: languageName: node linkType: hard -"stop-iteration-iterator@npm:^1.0.0": +"stop-iteration-iterator@npm:^1.0.0, stop-iteration-iterator@npm:^1.1.0": version: 1.1.0 resolution: "stop-iteration-iterator@npm:1.1.0" dependencies: @@ -24957,7 +25532,7 @@ __metadata: languageName: node linkType: hard -"styled-jsx@npm:5.1.6, styled-jsx@npm:^5.1.6": +"styled-jsx@npm:5.1.6": version: 5.1.6 resolution: "styled-jsx@npm:5.1.6" dependencies: @@ -24973,6 +25548,22 @@ __metadata: languageName: node linkType: hard +"styled-jsx@npm:^5.1.6": + version: 5.1.7 + resolution: "styled-jsx@npm:5.1.7" + dependencies: + client-only: "npm:0.0.1" + peerDependencies: + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + peerDependenciesMeta: + "@babel/core": + optional: true + babel-plugin-macros: + optional: true + checksum: 10c0/7a2544664f74dbd940c96017f81c7066b6c1e88df6e2062fd1ffcada66cfb22eb3367438b4f0ec47de7ba37f7359d153f25da2bf9593a6f3e35af44c7bbaeb48 + languageName: node + linkType: hard + "stylis@npm:4.2.0": version: 4.2.0 resolution: "stylis@npm:4.2.0" @@ -25247,7 +25838,7 @@ __metadata: languageName: node linkType: hard -"terser@npm:5.39.0, terser@npm:^5.10.0, terser@npm:^5.31.1": +"terser@npm:5.39.0": version: 5.39.0 resolution: "terser@npm:5.39.0" dependencies: @@ -25261,6 +25852,20 @@ __metadata: languageName: node linkType: hard +"terser@npm:^5.10.0, terser@npm:^5.31.1": + version: 5.44.0 + resolution: "terser@npm:5.44.0" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.15.0" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10c0/f2838dc65ac2ac6a31c7233065364080de73cc363ecb8fe723a54f663b2fa9429abf08bc3920a6bea85c5c7c29908ffcf822baf1572574f8d3859a009bbf2327 + languageName: node + linkType: hard + "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -25371,13 +25976,13 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.9": - version: 0.2.14 - resolution: "tinyglobby@npm:0.2.14" +"tinyglobby@npm:^0.2.10, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.9": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" dependencies: - fdir: "npm:^6.4.4" - picomatch: "npm:^4.0.2" - checksum: 10c0/f789ed6c924287a9b7d3612056ed0cda67306cd2c80c249fd280cf1504742b12583a2089b61f4abbd24605f390809017240e250241f09938054c9b363e51c0a6 + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 languageName: node linkType: hard @@ -25395,6 +26000,13 @@ __metadata: languageName: node linkType: hard +"tinyrainbow@npm:^3.0.3": + version: 3.0.3 + resolution: "tinyrainbow@npm:3.0.3" + checksum: 10c0/1e799d35cd23cabe02e22550985a3051dc88814a979be02dc632a159c393a998628eacfc558e4c746b3006606d54b00bcdea0c39301133956d10a27aa27e988c + languageName: node + linkType: hard + "tinyspy@npm:^3.0.2": version: 3.0.2 resolution: "tinyspy@npm:3.0.2" @@ -25582,7 +26194,7 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.0.1": +"ts-api-utils@npm:^2.0.1, ts-api-utils@npm:^2.1.0": version: 2.1.0 resolution: "ts-api-utils@npm:2.1.0" peerDependencies: @@ -26210,14 +26822,7 @@ __metadata: languageName: node linkType: hard -"upath@npm:^2.0.1": - version: 2.0.1 - resolution: "upath@npm:2.0.1" - checksum: 10c0/79e8e1296b00e24a093b077cfd7a238712d09290c850ce59a7a01458ec78c8d26dcc2ab50b1b9d6a84dabf6511fb4969afeb8a5c9a001aa7272b9cc74c34670f - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.1.1": +"update-browserslist-db@npm:^1.1.3": version: 1.1.3 resolution: "update-browserslist-db@npm:1.1.3" dependencies: @@ -26559,21 +27164,21 @@ __metadata: languageName: node linkType: hard -"vite-plugin-storybook-nextjs@npm:^2.0.7": - version: 2.0.7 - resolution: "vite-plugin-storybook-nextjs@npm:2.0.7" +"vite-plugin-storybook-nextjs@npm:^3.0.0": + version: 3.0.0 + resolution: "vite-plugin-storybook-nextjs@npm:3.0.0" dependencies: - "@next/env": "npm:^15.0.3" + "@next/env": "npm:16.0.0" image-size: "npm:^2.0.0" magic-string: "npm:^0.30.11" module-alias: "npm:^2.2.3" ts-dedent: "npm:^2.2.0" vite-tsconfig-paths: "npm:^5.1.4" peerDependencies: - next: ^14.1.0 || ^15.0.0 - storybook: ^0.0.0-0 || ^9.0.0 || ^9.1.0-0 + next: ^14.1.0 || ^15.0.0 || ^16.0.0 + storybook: ^0.0.0-0 || ^9.0.0 || ^10.0.0 || ^10.0.0-0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/a7e482cf11ca2201e82c8613eaece6848ff6634ee48b835e215b5f9e698bbbc2c013286487c0b9c0d8562f5d0bc23170d011471eaec0bdd52a34f2f1b1ff83d7 + checksum: 10c0/bb460ddab4d46a98bdd1525c7f18117a0a335a3500243534955532b5a209d3e63aad369a96a669618dd13b785cabe74560b4439ce063c953c51b9ab44abb7b10 languageName: node linkType: hard @@ -26645,17 +27250,17 @@ __metadata: languageName: node linkType: hard -"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0": - version: 7.0.0-beta.1 - resolution: "vite@npm:7.0.0-beta.1" +"vite@npm:^5.0.0 || ^6.0.0 || ^7.0.0-0, vite@npm:^6.0.0 || ^7.0.0": + version: 7.1.12 + resolution: "vite@npm:7.1.12" dependencies: esbuild: "npm:^0.25.0" - fdir: "npm:^6.4.5" + fdir: "npm:^6.5.0" fsevents: "npm:~2.3.3" - picomatch: "npm:^4.0.2" - postcss: "npm:^8.5.4" - rollup: "npm:^4.40.0" - tinyglobby: "npm:^0.2.14" + picomatch: "npm:^4.0.3" + postcss: "npm:^8.5.6" + rollup: "npm:^4.43.0" + tinyglobby: "npm:^0.2.15" peerDependencies: "@types/node": ^20.19.0 || >=22.12.0 jiti: ">=1.21.0" @@ -26696,7 +27301,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/0ab20103182244b310fb2bb4a9f3fb21110a61328052e73accfebf3503270bddd1d19417c2d17bd93f1108125da5ffbc52a1f05c8bf3f564907919ffc64d3d78 + checksum: 10c0/cef4d4b4a84e663e09b858964af36e916892ac8540068df42a05ced637ceeae5e9ef71c72d54f3cfc1f3c254af16634230e221b6e2327c2a66d794bb49203262 languageName: node linkType: hard @@ -26839,6 +27444,65 @@ __metadata: languageName: node linkType: hard +"vitest@npm:^4.0.1": + version: 4.0.1 + resolution: "vitest@npm:4.0.1" + dependencies: + "@vitest/expect": "npm:4.0.1" + "@vitest/mocker": "npm:4.0.1" + "@vitest/pretty-format": "npm:4.0.1" + "@vitest/runner": "npm:4.0.1" + "@vitest/snapshot": "npm:4.0.1" + "@vitest/spy": "npm:4.0.1" + "@vitest/utils": "npm:4.0.1" + debug: "npm:^4.4.3" + es-module-lexer: "npm:^1.7.0" + expect-type: "npm:^1.2.2" + magic-string: "npm:^0.30.19" + pathe: "npm:^2.0.3" + picomatch: "npm:^4.0.3" + std-env: "npm:^3.9.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.2" + tinyglobby: "npm:^0.2.15" + tinyrainbow: "npm:^3.0.3" + vite: "npm:^6.0.0 || ^7.0.0" + why-is-node-running: "npm:^2.3.0" + peerDependencies: + "@edge-runtime/vm": "*" + "@types/debug": ^4.1.12 + "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 + "@vitest/browser-playwright": 4.0.1 + "@vitest/browser-preview": 4.0.1 + "@vitest/browser-webdriverio": 4.0.1 + "@vitest/ui": 4.0.1 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/debug": + optional: true + "@types/node": + optional: true + "@vitest/browser-playwright": + optional: true + "@vitest/browser-preview": + optional: true + "@vitest/browser-webdriverio": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 10c0/e1276e9b36643dde1c3aace3dc174c058139ce41ada92979f1ff23fc59885291378f709536c7965205774c3da03690b2874544d46e753a48eb292f5da07cf5cc + languageName: node + linkType: hard + "vlq@npm:^0.2.1": version: 0.2.3 resolution: "vlq@npm:0.2.3" @@ -26918,13 +27582,27 @@ __metadata: languageName: node linkType: hard -"vue-component-type-helpers@npm:2.2.10, vue-component-type-helpers@npm:^2.0.0, vue-component-type-helpers@npm:latest": +"vue-component-type-helpers@npm:2.2.10": version: 2.2.10 resolution: "vue-component-type-helpers@npm:2.2.10" checksum: 10c0/f4d2219941a6bb987dc813e5e132fa9f8880163efc73faa6871713241dae0358cbfb6ecbee3b7e6e2ef65c02e5b5a8204c6e44c4a7d213499957e4d36f8c99c7 languageName: node linkType: hard +"vue-component-type-helpers@npm:^2.0.0": + version: 2.2.12 + resolution: "vue-component-type-helpers@npm:2.2.12" + checksum: 10c0/ce15a2cdec4a57262a292ac1565aa18da9be73f3dfbcf28758a8a541199944bfff1aefb75802d6de5d955a5529c9667f1b651c659d14815c075e8965ac05175d + languageName: node + linkType: hard + +"vue-component-type-helpers@npm:latest": + version: 3.0.7 + resolution: "vue-component-type-helpers@npm:3.0.7" + checksum: 10c0/0a148ea647d7a05b221b9373f65a09f1435dceab7814a7ad3134606ed62a04947e6c506870e87b66ac04b7d9dde229af47d05f397f0c54f1cf7fb76cdf54f8ca + languageName: node + linkType: hard + "vue-docgen-api@npm:^4.75.1": version: 4.79.2 resolution: "vue-docgen-api@npm:4.79.2" @@ -27052,7 +27730,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:2.4.2, watchpack@npm:^2.2.0, watchpack@npm:^2.4.1": +"watchpack@npm:2.4.2": version: 2.4.2 resolution: "watchpack@npm:2.4.2" dependencies: @@ -27062,6 +27740,16 @@ __metadata: languageName: node linkType: hard +"watchpack@npm:^2.2.0, watchpack@npm:^2.4.1": + version: 2.4.4 + resolution: "watchpack@npm:2.4.4" + dependencies: + glob-to-regexp: "npm:^0.4.1" + graceful-fs: "npm:^4.1.2" + checksum: 10c0/6c0901f75ce245d33991225af915eea1c5ae4ba087f3aee2b70dd377d4cacb34bef02a48daf109da9d59b2d31ec6463d924a0d72f8618ae1643dd07b95de5275 + languageName: node + linkType: hard + "wbuf@npm:^1.1.0, wbuf@npm:^1.7.3": version: 1.7.3 resolution: "wbuf@npm:1.7.3" @@ -27123,7 +27811,7 @@ __metadata: languageName: node linkType: hard -"webpack-dev-middleware@npm:7.4.2, webpack-dev-middleware@npm:^7.4.2": +"webpack-dev-middleware@npm:7.4.2": version: 7.4.2 resolution: "webpack-dev-middleware@npm:7.4.2" dependencies: @@ -27160,6 +27848,25 @@ __metadata: languageName: node linkType: hard +"webpack-dev-middleware@npm:^7.4.2": + version: 7.4.3 + resolution: "webpack-dev-middleware@npm:7.4.3" + dependencies: + colorette: "npm:^2.0.10" + memfs: "npm:^4.6.0" + mime-types: "npm:^3.0.1" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + schema-utils: "npm:^4.0.0" + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 10c0/f0508dbeec706028ba87ba138bac5924db34e8291b1175e0b9a714d2405db5ea9447b78c8f3ef834ad26bda5b4fe19e2bc6618d92c4b14bea3c8416dc2a7b6b8 + languageName: node + linkType: hard + "webpack-dev-server@npm:5.2.0": version: 5.2.0 resolution: "webpack-dev-server@npm:5.2.0" @@ -27237,9 +27944,9 @@ __metadata: linkType: hard "webpack-sources@npm:^3.0.0, webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10c0/2ef63d77c4fad39de4a6db17323d75eb92897b32674e97d76f0a1e87c003882fc038571266ad0ef581ac734cbe20952912aaa26155f1905e96ce251adbb1eb4e + version: 3.3.3 + resolution: "webpack-sources@npm:3.3.3" + checksum: 10c0/ab732f6933b513ba4d505130418995ddef6df988421fccf3289e53583c6a39e205c4a0739cee98950964552d3006604912679c736031337fb4a9d78d8576ed40 languageName: node linkType: hard @@ -27453,7 +28160,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.18, which-typed-array@npm:^1.1.2": +"which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19, which-typed-array@npm:^1.1.2": version: 1.1.19 resolution: "which-typed-array@npm:1.1.19" dependencies: @@ -27648,9 +28355,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.18.0, ws@npm:^8.18.2": - version: 8.18.2 - resolution: "ws@npm:8.18.2" +"ws@npm:^8.18.0, ws@npm:^8.18.2, ws@npm:^8.18.3": + version: 8.18.3 + resolution: "ws@npm:8.18.3" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -27659,7 +28366,16 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10c0/4b50f67931b8c6943c893f59c524f0e4905bbd183016cfb0f2b8653aa7f28dad4e456b9d99d285bbb67cca4fedd9ce90dfdfaa82b898a11414ebd66ee99141e4 + checksum: 10c0/eac918213de265ef7cb3d4ca348b891a51a520d839aa51cdb8ca93d4fa7ff9f6ccb339ccee89e4075324097f0a55157c89fa3f7147bde9d8d7e90335dc087b53 + languageName: node + linkType: hard + +"wsl-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "wsl-utils@npm:0.1.0" + dependencies: + is-wsl: "npm:^3.1.0" + checksum: 10c0/44318f3585eb97be994fc21a20ddab2649feaf1fbe893f1f866d936eea3d5f8c743bec6dc02e49fbdd3c0e69e9b36f449d90a0b165a4f47dd089747af4cf2377 languageName: node linkType: hard @@ -27738,11 +28454,11 @@ __metadata: linkType: hard "yaml@npm:^2.0.0, yaml@npm:^2.3.1, yaml@npm:^2.6.0": - version: 2.7.1 - resolution: "yaml@npm:2.7.1" + version: 2.8.1 + resolution: "yaml@npm:2.8.1" bin: yaml: bin.mjs - checksum: 10c0/ee2126398ab7d1fdde566b4013b68e36930b9e6d8e68b6db356875c99614c10d678b6f45597a145ff6d63814961221fc305bf9242af8bf7450177f8a68537590 + checksum: 10c0/7c587be00d9303d2ae1566e03bc5bc7fe978ba0d9bf39cc418c3139d37929dfcb93a230d9749f2cb578b6aa5d9ebebc322415e4b653cb83acd8bc0bc321707f3 languageName: node linkType: hard diff --git a/docs/_snippets/addon-a11y-config-in-preview.md b/docs/_snippets/addon-a11y-config-in-preview.md index 4dfbf5e8bd55..65c957f01a63 100644 --- a/docs/_snippets/addon-a11y-config-in-preview.md +++ b/docs/_snippets/addon-a11y-config-in-preview.md @@ -22,7 +22,7 @@ export default { options: {}, }, }, - globals: { + initialGlobals: { a11y: { // Optional flag to prevent the automatic check manual: true, @@ -58,7 +58,7 @@ const preview: Preview = { options: {}, }, }, - globals: { + initialGlobals: { a11y: { // Optional flag to prevent the automatic check manual: true, diff --git a/docs/configure/integration/frameworks-feature-support.mdx b/docs/configure/integration/frameworks-feature-support.mdx index 7cb43797d5ca..1d0644497b2b 100644 --- a/docs/configure/integration/frameworks-feature-support.mdx +++ b/docs/configure/integration/frameworks-feature-support.mdx @@ -34,7 +34,7 @@ Core frameworks have dedicated maintainers or contributors who are responsible f | [Events](https://github.com/storybookjs/addon-events) | โœ… | โœ… | โœ… | โœ… | | [Google analytics](https://github.com/storybookjs/addon-google-analytics) | โœ… | โœ… | โœ… | โœ… | | [GraphQL](https://github.com/storybookjs/addon-graphql) | โœ… | | โœ… | | -| [Jest](https://github.com/storybookjs/storybook/tree/next/code/addons/jest) | โœ… | โœ… | โœ… | โœ… | +| [Jest](https://github.com/storybookjs/addon-jest) | โœ… | โœ… | โœ… | โœ… | | [Links](https://github.com/storybookjs/storybook/tree/next/code/addons/links) | โœ… | โœ… | โœ… | โœ… | | [Queryparams](https://github.com/storybookjs/addon-queryparams) | โœ… | โœ… | โœ… | โœ… | | **Docs** | | | | | @@ -83,7 +83,7 @@ Community frameworks have fewer contributors which means they may not be as up t | [Events](https://github.com/storybookjs/addon-events) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | | [Google analytics](https://github.com/storybookjs/addon-google-analytics) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | | [GraphQL](https://github.com/storybookjs/addon-graphql) | | | | | | | -| [Jest](https://github.com/storybookjs/storybook/tree/next/code/addons/jest) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | +| [Jest](https://github.com/storybookjs/addon-jest) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | | [Links](https://github.com/storybookjs/storybook/tree/next/code/addons/links) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | | [Queryparams](https://github.com/storybookjs/addon-queryparams) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | | **Docs** | | | | | | | diff --git a/docs/versions/latest.json b/docs/versions/latest.json index 37ccc596a10e..1b1318d07234 100644 --- a/docs/versions/latest.json +++ b/docs/versions/latest.json @@ -1 +1 @@ -{"version":"9.1.13","info":{"plain":"- Nextjs: Fix config access for Vite - [#32759](https://github.com/storybookjs/storybook/pull/32759), thanks @valentinpalkovic!"}} +{"version":"9.1.14","info":{"plain":"- Addon-Vitest: Support Vitest 4 - [#32819](https://github.com/storybookjs/storybook/pull/32819), thanks @yannbf!\n- CSF: Fix `play-fn` tag for methods - [#32695](https://github.com/storybookjs/storybook/pull/32695), thanks @shilman!"}} diff --git a/docs/versions/next.json b/docs/versions/next.json index f9deff565439..4cb7c3383fae 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"10.0.0-beta.13","info":{"plain":"- CLI: CSF factories codemod - support annotations in npx context - [#32741](https://github.com/storybookjs/storybook/pull/32741), thanks @yannbf!\n- Move: Addon jest into it's own repository - [#32646](https://github.com/storybookjs/storybook/pull/32646), thanks @ndelangen!\n- Upgrade: Enhance ESM compatibility checks and banner generation - [#32694](https://github.com/storybookjs/storybook/pull/32694), thanks @ndelangen!"}} \ No newline at end of file +{"version":"10.0.0-rc.0","info":{"plain":"- A11Y: Bugfix missing `manager.js` entry-file - [#32780](https://github.com/storybookjs/storybook/pull/32780), thanks @ndelangen!\n- Addon Vitest: Support modifying mergeConfig on addon setup - [#32753](https://github.com/storybookjs/storybook/pull/32753), thanks @yannbf!\n- CLI: Change message in downgrade-blocker - [#32745](https://github.com/storybookjs/storybook/pull/32745), thanks @ndelangen!"}} \ No newline at end of file diff --git a/scripts/tasks/sandbox.ts b/scripts/tasks/sandbox.ts index 6d052d537e67..55f0d6f52b42 100644 --- a/scripts/tasks/sandbox.ts +++ b/scripts/tasks/sandbox.ts @@ -85,7 +85,7 @@ export const sandbox: Task = { options.addon.push('@storybook/addon-a11y'); if (shouldAddVitestIntegration) { - extraDeps.push('happy-dom', 'vitest', 'playwright', '@vitest/browser'); + extraDeps.push('happy-dom'); if (details.template.expected.framework.includes('nextjs')) { extraDeps.push('@storybook/nextjs-vite', 'jsdom'); diff --git a/scripts/verdaccio.yaml b/scripts/verdaccio.yaml index 1854b60bfc41..96ad355659e8 100644 --- a/scripts/verdaccio.yaml +++ b/scripts/verdaccio.yaml @@ -125,6 +125,10 @@ packages: access: $all publish: $all proxy: npmjs + '@storybook/addon-jest': + access: $all + publish: $all + proxy: npmjs '@storybook/addon-coverage': access: $all publish: $all diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.eslintrc.cjs b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.eslintrc.cjs new file mode 100644 index 000000000000..29cb6d5a0877 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'plugin:react-hooks/recommended', 'plugin:storybook/recommended'], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.gitignore b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.gitignore new file mode 100644 index 000000000000..b88c8135abcd --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/aliased.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/aliased.ts new file mode 100644 index 000000000000..030574bfd2a6 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/aliased.ts @@ -0,0 +1,4 @@ +// This file is used to test that viteFinal is correctly loaded in Vitest +// main.ts defines this file as a resolve alias, which is used in the ViteFinalTest story + +export const aliasedFunction = () => true; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/get-decorator-string.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/get-decorator-string.ts new file mode 100644 index 000000000000..794f14db5674 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/get-decorator-string.ts @@ -0,0 +1,3 @@ +export const getDecoratorString = () => { + return "Global Decorator"; +}; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/main.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/main.ts new file mode 100644 index 000000000000..0183823b9ae6 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/main.ts @@ -0,0 +1,50 @@ +import { join } from "node:path"; + +import type { StorybookConfig } from "@storybook/react-vite"; + +const config: StorybookConfig = { + stories: ["../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)"], + addons: ["@storybook/addon-vitest", "@storybook/addon-a11y"], + framework: { + name: "@storybook/react-vite", + options: {}, + }, + core: { + disableWhatsNewNotifications: true, + }, + previewHead: (head = "") => `${head} + `, + staticDirs: [{ from: "./test-static-dirs", to: "test-static-dirs" }], + viteFinal: (config) => { + return { + ...config, + optimizeDeps: { + ...config.optimizeDeps, + include: [...(config.optimizeDeps?.include || [])], + }, + resolve: { + ...config.resolve, + alias: { + ...config.resolve?.alias, + "test-alias": join(__dirname, "aliased.ts"), + }, + }, + }; + }, + refs: { + "storybook@8.0.0": { + title: "Storybook 8.0.0", + url: "https://635781f3500dd2c49e189caf-gckybvsekn.chromatic.com/", + }, + "storybook@7.6.18": { + title: "Storybook 7.6.18", + url: "https://635781f3500dd2c49e189caf-oljwjdrftz.chromatic.com/", + }, + }, +}; + +export default config; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/preview-head.html b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/preview-head.html new file mode 100644 index 000000000000..61252d019910 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/preview-head.html @@ -0,0 +1,5 @@ + diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/preview.tsx b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/preview.tsx new file mode 100644 index 000000000000..ee02f0c8d810 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/preview.tsx @@ -0,0 +1,31 @@ +import type { Preview } from '@storybook/react-vite'; +import { getDecoratorString } from './get-decorator-string'; + +console.log('preview file is called!'); + +const preview: Preview = { + decorators: [ + (StoryFn) => ( +
+
{getDecoratorString()}
+
+ +
+ ), + ], + initialGlobals: { + locale: 'en', + }, + globalTypes: { + locale: { + description: 'Locale for components', + toolbar: { + title: 'Locale', + icon: 'circlehollow', + items: ['es', 'en'], + }, + }, + }, +}; + +export default preview; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/setup-file-dependency.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/setup-file-dependency.ts new file mode 100644 index 000000000000..592e8f52b66b --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/setup-file-dependency.ts @@ -0,0 +1,3 @@ +export const getString = () => { + return "initial string"; +}; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/test-static-dirs/static.js b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/test-static-dirs/static.js new file mode 100644 index 000000000000..56ff9f9c7ad4 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/test-static-dirs/static.js @@ -0,0 +1,3 @@ +// This file is used to test that staticDirs are correctly loaded in Vitest + +export const staticFunction = () => true; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/vitest.setup.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/vitest.setup.ts new file mode 100644 index 000000000000..f38642615f5f --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.storybook/vitest.setup.ts @@ -0,0 +1,8 @@ +import { setProjectAnnotations } from "@storybook/react-vite"; +import * as addonA11yAnnotations from "@storybook/addon-a11y/preview"; +import * as projectAnnotations from "./preview"; +import { getString } from "./setup-file-dependency"; + +setProjectAnnotations([addonA11yAnnotations, projectAnnotations]); + +console.log(getString()); diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.yarnrc b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.yarnrc new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.yarnrc.yml b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.yarnrc.yml new file mode 100644 index 000000000000..90f2d213d0f9 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/.yarnrc.yml @@ -0,0 +1 @@ +yarnPath: ../../../.yarn/releases/yarn-4.10.3.cjs diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/component-testing.spec.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/component-testing.spec.ts new file mode 100644 index 000000000000..bb29e71247fb --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/component-testing.spec.ts @@ -0,0 +1,764 @@ +import { promises as fs } from "node:fs"; +import path from "node:path"; + +import { expect, test } from "@playwright/test"; + +import { SbPage } from "../../../../code/e2e-tests/util"; + +const STORYBOOK_URL = "http://localhost:6006"; +const TEST_STORY_PATH = path.resolve( + __dirname, + "..", + "stories", + "AddonTest.stories.tsx" +); +const UNHANDLED_ERRORS_STORY_PATH = path.resolve( + __dirname, + "..", + "stories", + "UnhandledErrors.stories.tsx" +); +const ADDON_TEST_DEPENDENCY_PATH = path.resolve( + __dirname, + "..", + "stories", + "get-button-string.ts" +); +const PREVIEW_DEPENDENCY_PATH = path.resolve( + __dirname, + "..", + ".storybook", + "get-decorator-string.ts" +); +const SETUP_FILE_DEPENDENCY_PATH = path.resolve( + __dirname, + "..", + ".storybook", + "setup-file-dependency.ts" +); + +const setForceFailureFlag = (content: string, value: boolean) => + content.replace(/forceFailure:\s*(true|false)/, `forceFailure: ${value}`); + +const modifiedFiles = new Map(); + +const modifyFile = async ( + filePath: string, + modify: (content: string) => string +) => { + const content = (await fs.readFile(filePath)).toString(); + const modifiedContent = modify(content); + await fs.writeFile(filePath, modifiedContent); + if (!modifiedFiles.has(filePath)) { + modifiedFiles.set(filePath, content); + } + + // the file change causes a HMR event, which causes a browser reload,and that can take a few seconds + await new Promise((resolve) => setTimeout(resolve, 2000)); +}; + +const restoreAllFiles = async () => { + for (const [filePath, originalContent] of modifiedFiles.entries()) { + await fs.writeFile(filePath, originalContent); + } + modifiedFiles.clear(); + // the file change causes a HMR event, which causes a browser reload,and that can take a few seconds + await new Promise((resolve) => setTimeout(resolve, 2000)); +}; + +test.describe("component testing", () => { + test.describe.configure({ mode: "serial" }); + test.beforeEach(async ({ page }) => { + const sbPage = new SbPage(page, expect); + + await page.goto(STORYBOOK_URL); + await page.evaluate(() => window.sessionStorage.clear()); + await sbPage.waitUntilLoaded(); + + const expandTestingModule = page.getByLabel("Expand testing module"); + if (await expandTestingModule.isVisible()) { + await expandTestingModule.click(); + } + }); + + test.afterEach(async ({ page }) => { + await restoreAllFiles(); + + const expandTestingModule = page.getByLabel("Expand testing module"); + if (await expandTestingModule.isVisible()) { + await expandTestingModule.click(); + } + + // Ensure that all test results are removed and features are disabled, as previous tests might have enabled them + const clearStatusesButton = page.getByLabel("Clear all statuses"); + if (await clearStatusesButton.isVisible()) { + await clearStatusesButton.click(); + } + + const disableWatch = page.getByLabel("Disable watch mode"); + if (await disableWatch.isVisible()) { + await disableWatch.click(); + } + + const configs = [ + page.getByLabel("Coverage", { exact: true }), + page.getByLabel("Accessibility", { exact: true }), + ]; + for (const config of configs) { + if (await config.isChecked()) { + await config.click(); + } + } + }); + + test("should show discrepancy between test results", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + test.setTimeout(40_000); + const sbPage = new SbPage(page, expect); + + await sbPage.navigateToStory("addons/group/test", "Mismatch Failure"); + + // For whatever reason, sometimes it takes longer for the story to load + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + await sbPage.viewAddonPanel("Interactions"); + + // For whatever reason, when visiting a story sometimes the story element is collapsed and that causes flake + const testStoryElement = await page.getByRole("button", { + name: "Test", + exact: true, + }); + if ((await testStoryElement.getAttribute("aria-expanded")) !== "true") { + testStoryElement.click(); + } + + const testingModuleDescription = await page.locator( + "#testing-module-description" + ); + + const runTestsButton = await page.getByLabel("Start test run"); + await runTestsButton.click(); + + await expect(testingModuleDescription).not.toContainText(/Ran \d+ tests/, { + timeout: 60000, + }); + + // Wait for test results to appear + await expect(testingModuleDescription).toHaveText(/Ran \d+ tests/, { + timeout: 60000, + }); + + const errorFilter = page.getByLabel("Toggle errors"); + await expect(errorFilter).toBeVisible(); + + // Assert discrepancy: CLI pass + Browser fail + const failingStoryElement = page.locator( + '[data-item-id="addons-group-test--mismatch-failure"] [role="status"]' + ); + await expect(failingStoryElement).toHaveAttribute( + "aria-label", + "Test status: success" + ); + await expect(sbPage.panelContent()).toContainText( + /This interaction test passed in the CLI, but the tests failed in this browser/ + ); + + // Assert discrepancy: CLI fail + Browser pass + await sbPage.navigateToStory("addons/group/test", "Mismatch Success"); + const successfulStoryElement = page.locator( + '[data-item-id="addons-group-test--mismatch-success"] [role="status"]' + ); + await expect(successfulStoryElement).toHaveAttribute( + "aria-label", + "Test status: error" + ); + await expect(sbPage.panelContent()).toContainText( + /This interaction test passed in this browser, but the tests failed in the CLI/ + ); + }); + + test("should execute tests via testing module UI", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + await modifyFile(TEST_STORY_PATH, (content) => + setForceFailureFlag(content, true) + ); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + // For whatever reason, sometimes it takes longer for the story to load + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + await expect(page.locator("#testing-module-title")).toHaveText( + "Run component tests" + ); + + const runTestsButton = await page.getByLabel("Start test run"); + const watchModeButton = await page.getByLabel("Enable watch mode"); + await expect(runTestsButton).toBeEnabled(); + await expect(watchModeButton).toBeEnabled(); + + await runTestsButton.click(); + + // Wait for both the watch mode button to be disabled and the testing text to appear + await Promise.all([ + expect(watchModeButton).toBeDisabled(), + expect(page.locator("#testing-module-description")).toHaveText(/Testing/), + + ]); + + // Wait for test results to appear + await expect(page.locator("#testing-module-description")).toHaveText( + /Ran \d+ tests/, + { timeout: 30000 } + ); + + await expect(runTestsButton).toBeEnabled(); + await expect(watchModeButton).toBeEnabled(); + + const errorFilter = page.getByLabel("Toggle errors"); + await expect(errorFilter).toBeVisible(); + + // Assert for expected success + const successfulStoryElement = page.locator( + '[data-item-id="addons-group-test--expected-success"] [role="status"]' + ); + await expect(successfulStoryElement).toHaveAttribute( + "aria-label", + "Test status: success" + ); + + // Assert for expected failure + const failingStoryElement = page.locator( + '[data-item-id="addons-group-test--expected-failure"] [role="status"]' + ); + await expect(failingStoryElement).toHaveAttribute( + "aria-label", + "Test status: error" + ); + + // Assert that filter works as intended + await errorFilter.click(); + + const sidebarItems = page.locator( + '.sidebar-item[data-ref-id="storybook_internal"][data-nodetype="component"]' + ); + await expect(sidebarItems).toHaveCount(2); + }); + + test("should run tests in watch mode when a story file is changed", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + await modifyFile(TEST_STORY_PATH, (content) => + setForceFailureFlag(content, false) + ); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + // For whatever reason, sometimes it takes longer for the story to load + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + await page.getByLabel("Enable watch mode").click(); + + // We shouldn't have to do an arbitrary wait, but because there is no UI for loading state yet, we have to + await page.waitForTimeout(8000); + await modifyFile(TEST_STORY_PATH, (content) => + setForceFailureFlag(content, true) + ); + + // Wait for test results to appear + const errorFilter = page.getByLabel("Toggle errors"); + await expect(errorFilter).toBeVisible({ timeout: 30000 }); + + // Assert for expected success + const successfulStoryElement = page.locator( + '[data-item-id="addons-group-test--expected-success"] [role="status"]' + ); + await expect(successfulStoryElement).toHaveAttribute( + "aria-label", + "Test status: success" + ); + + // Assert for expected failure + const failingStoryElement = page.locator( + '[data-item-id="addons-group-test--expected-failure"] [role="status"]' + ); + await expect(failingStoryElement).toHaveAttribute( + "aria-label", + "Test status: error" + ); + + // Assert that filter works as intended + await errorFilter.click(); + + const sidebarItems = page.locator( + '.sidebar-item[data-ref-id="storybook_internal"][data-nodetype="component"]' + ); + await expect(sidebarItems).toHaveCount(1); + }); + + test("should run tests in watch mode when a story file's dependency is changed", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + // For whatever reason, sometimes it takes longer for the story to load + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + await page.getByLabel("Enable watch mode").click(); + + // We shouldn't have to do an arbitrary wait, but because there is no UI for loading state yet, we have to + await page.waitForTimeout(3000); + await modifyFile(ADDON_TEST_DEPENDENCY_PATH, (content) => + content.replace("test", "changed") + ); + + // Expect less than 10 tests to have run + await expect(page.locator("#testing-module-description")).toContainText( + /Ran \d tests/, + { timeout: 30000 } + ); + + // Assert for expected failure + const failingStoryElement = page.locator( + '[data-item-id="addons-group-test--expected-content"] [role="status"]' + ); + await expect(failingStoryElement).toHaveAttribute( + "aria-label", + "Test status: error" + ); + }); + + test("should run all tests in watch mode when the preview file's dependency is changed", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + // For whatever reason, sometimes it takes longer for the story to load + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + await page.getByLabel("Enable watch mode").click(); + + // We shouldn't have to do an arbitrary wait, but because there is no UI for loading state yet, we have to + await page.waitForTimeout(3000); + await modifyFile(PREVIEW_DEPENDENCY_PATH, (content) => + content.replace("Global Decorator", "Changed Decorator") + ); + + // Expect at least 20 tests to have run + await expect(page.locator("#testing-module-description")).toContainText( + /Ran [2-9]\d tests/, + { timeout: 30000 } + ); + + // Assert for expected failure + const failingStoryElement = page.locator( + '[data-item-id="addons-group-test--expected-content"] [role="status"]' + ); + + await expect(failingStoryElement).toHaveAttribute( + "aria-label", + "Test status: error" + ); + }); + + test("should run all tests in watch mode when the setup file's dependency is changed", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + // For whatever reason, sometimes it takes longer for the story to load + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + await page.getByLabel("Enable watch mode").click(); + + // We shouldn't have to do an arbitrary wait, but because there is no UI for loading state yet, we have to + await page.waitForTimeout(3000); + await modifyFile(SETUP_FILE_DEPENDENCY_PATH, (content) => + content.replace("initial string", "changed string") + ); + + // Expect at least 20 tests to have run + await expect(page.locator("#testing-module-description")).toContainText( + /Ran [2-9]\d tests/, + { timeout: 30000 } + ); + }); + + test("should collect coverage to testing module and HTML report", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + // Arrange - Prepare Storybook + await modifyFile(TEST_STORY_PATH, (content) => + setForceFailureFlag(content, false) + ); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + // Assert - No coverage report initially + await expect(page.getByLabel("Open coverage report")).toHaveCount(0); + + // Act - Enable coverage and run tests + await page.getByLabel("Coverage", { exact: true }).click(); + // Wait for Vitest to have (re)started + await page.waitForTimeout(2000); + + await page.getByLabel("Start test run").click(); + + // Assert - Coverage report is collected and shown + await expect(page.getByLabel("Open coverage report")).toBeVisible({ + timeout: 30000, + }); + const sbPercentageText = await page + .getByLabel(/percent coverage$/) + .textContent(); + expect(sbPercentageText).toMatch(/^\d+%$/); + const sbPercentage = Number.parseInt( + sbPercentageText!.replace("%", "") ?? "" + ); + expect(sbPercentage).toBeGreaterThanOrEqual(0); + expect(sbPercentage).toBeLessThanOrEqual(100); + + // Act - Open HTML coverage report + const coverageReportLink = await page.getByLabel("Open coverage report"); + // Remove target="_blank" attribute to open in the same tab + await coverageReportLink.evaluate((elem) => elem.removeAttribute("target")); + await page.getByLabel("Open coverage report").click(); + + // Assert - HTML coverage report is accessible and reports the same coverage percentage as Storybook + const htmlPercentageText = + (await page + .locator('span:has(+ :text("Statements"))') + .first() + .textContent()) ?? ""; + const htmlPercentage = Number.parseFloat( + htmlPercentageText.replace("% ", "") + ); + expect(Math.round(htmlPercentage)).toBe(sbPercentage); + + await page.goBack(); + }); + + test("should run focused test for a single story", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + // Arrange - Prepare Storybook + await modifyFile(TEST_STORY_PATH, (content) => + setForceFailureFlag(content, false) + ); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + // Act - Open sidebar context menu and start focused test + await page + .locator('[data-item-id="addons-group-test--expected-failure"]') + .hover(); + await page + .locator( + '[data-item-id="addons-group-test--expected-failure"] div[data-testid="context-menu"] button' + ) + .click(); + const sidebarContextMenu = page.getByTestId("tooltip"); + await sidebarContextMenu.getByLabel("Start test run").click(); + + // Assert - Only one test is running and reported + await expect( + sidebarContextMenu.locator("#testing-module-description") + ).toContainText("Ran 1 test", { timeout: 30000 }); + await expect( + sidebarContextMenu.getByLabel("Component tests passed") + ).toHaveCount(1); + await page.click("body"); + await expect( + page + .locator("#storybook-explorer-menu") + .getByRole("status", { name: "Test status: success" }) + ).toHaveCount(1); + }); + + test("should show unhandled errors in the testing module", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + // Arrange - Prepare Storybook + await modifyFile(UNHANDLED_ERRORS_STORY_PATH, (content) => + setForceFailureFlag(content, true) + ); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("example/unhandlederrors", "Success"); + + const storyElement = sbPage.getCanvasBodyElement().getByText("Hello world"); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + // Act - Open sidebar context menu and start focused test + await page.locator('[data-item-id="example-unhandlederrors"]').hover(); + await page + .locator( + '[data-item-id="example-unhandlederrors"] div[data-testid="context-menu"] button' + ) + .click(); + const sidebarContextMenu = page.getByTestId("tooltip"); + await sidebarContextMenu.getByLabel("Start test run").click(); + + // Assert - Tests are running and errors are reported + const errorLink = page.locator( + "#storybook-testing-module #testing-module-description a" + ); + await expect(errorLink).toContainText("View full error", { + timeout: 30000, + }); + await errorLink.click(); + + await expect(page.locator("pre")).toContainText( + "I THREW AN UNHANDLED ERROR!" + ); + await expect(page.locator("pre")).toContainText("This error originated in"); + await expect(page.locator("pre")).toContainText( + "The latest test that might've caused the error is" + ); + await page.getByLabel("Close modal").click(); + }); + + test("should run focused test for a component", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + // Arrange - Prepare Storybook + await modifyFile(TEST_STORY_PATH, (content) => + setForceFailureFlag(content, false) + ); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + // Act - Open sidebar context menu and start focused test + await page.locator('[data-item-id="addons-group-test"]').hover(); + await page + .locator( + '[data-item-id="addons-group-test"] div[data-testid="context-menu"] button' + ) + .click(); + const sidebarContextMenu = page.getByTestId("tooltip"); + await sidebarContextMenu.getByLabel("Start test run").click(); + + // Assert - Tests are running and reported + await expect( + sidebarContextMenu.locator("#testing-module-description") + ).toContainText("Ran 9 tests", { timeout: 30000 }); + // Assert - Failing test shows as a failed status + await expect( + sidebarContextMenu.getByText("1 story with errors") + ).toBeVisible(); + await expect( + sidebarContextMenu.getByLabel("Component tests failed") + ).toHaveCount(1); + + await page.click("body"); + await expect( + page + .locator("#storybook-explorer-menu") + .getByRole("status", { name: "Test status: success" }) + ).toHaveCount(8); + await expect( + page + .locator("#storybook-explorer-menu") + .getByRole("status", { name: "Test status: error" }) + ).toHaveCount(1); + }); + + test("should run focused test for a group", async ({ page, browserName }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + // Arrange - Prepare Storybook + await modifyFile(TEST_STORY_PATH, (content) => + setForceFailureFlag(content, false) + ); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("addons/group/test", "Expected Failure"); + + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "test" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + // Act - Open sidebar context menu and start focused test + await page.locator('[data-item-id="addons-group"]').hover(); + await page + .locator( + '[data-item-id="addons-group"] div[data-testid="context-menu"] button' + ) + .click(); + const sidebarContextMenu = page.getByTestId("tooltip"); + await sidebarContextMenu.getByLabel("Start test run").click(); + + // Assert - Tests are running and reported + await expect( + sidebarContextMenu.locator("#testing-module-description") + ).toContainText("Ran 11 tests", { timeout: 30000 }); + // Assert - 1 failing test shows as a failed status + await expect( + sidebarContextMenu.getByText("2 stories with errors") + ).toBeVisible(); + await expect( + sidebarContextMenu.getByLabel("Component tests failed") + ).toHaveCount(1); + + await page.click("body"); + await expect( + page + .locator("#storybook-explorer-menu") + .getByRole("status", { name: "Test status: success" }) + ).toHaveCount(8); + await expect( + page + .locator("#storybook-explorer-menu") + .getByRole("status", { name: "Test status: error" }) + ).toHaveCount(1); + }); + + test("should run focused tests without coverage, even when enabled", async ({ + page, + browserName, + }) => { + test.skip(browserName !== "chromium", `Skipping tests for ${browserName}`); + // Arrange - Prepare Storybook + await modifyFile(TEST_STORY_PATH, (content) => + setForceFailureFlag(content, false) + ); + + const sbPage = new SbPage(page, expect); + await sbPage.navigateToStory("example/button", "CSF 3 Primary"); + + const storyElement = sbPage + .getCanvasBodyElement() + .getByRole("button", { name: "foo" }); + await expect(storyElement).toBeVisible({ timeout: 30000 }); + + // Act - Enable coverage + await page.getByLabel("Coverage", { exact: true }).click(); + // Wait for Vitest to have (re)started + await page.waitForTimeout(2000); + + // Act - Open sidebar context menu and start focused test + await page + .locator('[data-item-id="example-button--csf-3-primary"]') + .hover(); + await page + .locator( + '[data-item-id="example-button--csf-3-primary"] div[data-testid="context-menu"] button' + ) + .click(); + const sidebarContextMenu = page.getByTestId("tooltip"); + await sidebarContextMenu.getByLabel("Start test run").click(); + + // Arrange - Wait for test to finish and unfocus sidebar context menu + await expect( + sidebarContextMenu.locator("#testing-module-description") + ).toContainText("Ran 1 test", { timeout: 30000 }); + await page.click("body"); + + // Assert - Coverage is not shown because Focused Tests shouldn't collect coverage + await expect(page.getByLabel("Open coverage report")).not.toBeVisible(); + + // Act - Run ALL tests + await page.getByLabel("Start test run").click(); + + // Arrange - Wait for tests to finish + await expect(page.locator("#testing-module-description")).toContainText( + /Ran \d{2,} tests/, + { timeout: 30000 } + ); + + // Assert - Coverage percentage is now collected and shown because running all tests automatically re-enables coverage + await expect(page.getByLabel("Open coverage report")).toBeVisible({ + timeout: 30000, + }); + const sbPercentageText = await page + .getByLabel(/percent coverage$/) + .textContent(); + expect(sbPercentageText).toMatch(/^\d+%$/); + const sbPercentage = Number.parseInt( + sbPercentageText!.replace("%", "") ?? "" + ); + expect(sbPercentage).toBeGreaterThanOrEqual(0); + expect(sbPercentage).toBeLessThanOrEqual(100); + }); + + test.fixme( + "should still collect statuses even when the browser is closed", + () => {} + ); + + test.fixme( + "should have correct status count globally and in context menus", + () => {} + ); + + test.fixme( + "should open the correct component test and a11y panels when clicking on statuses", + () => {} + ); +}); diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/composition.spec.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/composition.spec.ts new file mode 100644 index 000000000000..da15b351624b --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/composition.spec.ts @@ -0,0 +1,122 @@ +import { expect, test } from "@playwright/test"; + +import { SbPage } from "../../../../code/e2e-tests/util"; + +const STORYBOOK_URL = "http://localhost:6006"; + +test.describe("composition", () => { + // the composed storybook can be slow to load, so we need to increase the timeout + test.describe.configure({ mode: "serial", timeout: 60000, retries: 2 }); + test("should filter and render composed stories", async ({ page }) => { + await page.goto(STORYBOOK_URL); + await new SbPage(page, expect).waitUntilLoaded(); + + // Expect that composed Storybooks are visible + await expect(page.getByTitle("Storybook 8.0.0")).toBeVisible(); + await expect(page.getByTitle("Storybook 7.6.18")).toBeVisible(); + + // Expect composed stories to be available in the sidebar + await page.locator('[id="storybook\\@8\\.0\\.0_components-badge"]').click(); + await expect( + page.locator('[id="storybook\\@8\\.0\\.0_components-badge--default"]') + ).toBeVisible(); + + await page + .locator('[id="storybook\\@7\\.6\\.18_components-badge"]') + .click(); + await expect( + page + .locator('iframe[title="storybook-ref-storybook\\@7\\.6\\.18"]') + .contentFrame() + .locator("#storybook-root") + .getByText("Default") + ).toBeVisible({ timeout: 15000 }); + + // Expect composed stories `to be available in the search + await page.getByPlaceholder("Find components").fill("Button primary"); + await expect( + page.getByRole("option", { + name: "Primary Storybook 7.6.18 / @components / Button", + }) + ).toBeVisible(); + + const buttonStory = page.getByRole("option", { + name: "Primary Storybook 8.0.0 / @blocks / examples / Button", + }); + await expect(buttonStory).toBeVisible(); + await buttonStory.click(); + + // Note: this could potentially be flaky due to it accessing a hosted Storybook + await expect( + page + .locator('iframe[title="storybook-ref-storybook\\@8\\.0\\.0"]') + .contentFrame() + .getByRole("button") + ).toBeVisible({ timeout: 15000 }); + }); + + test("should filter and render composed stories on mobile", async ({ + page, + }) => { + page.setViewportSize({ width: 320, height: 800 }); + await page.goto(STORYBOOK_URL); + await new SbPage(page, expect).waitUntilLoaded(); + + await page.click('button[aria-label="Open navigation menu"]'); + + // scroll down to the bottom of the element getByText('Skip to canvasStorybookSearch') + + await page.getByTitle("Storybook 7.6.18").scrollIntoViewIfNeeded(); + + // Expect that composed Storybooks are visible + await expect(page.getByTitle("Storybook 8.0.0")).toBeVisible(); + await expect(page.getByTitle("Storybook 7.6.18")).toBeVisible(); + + // Expect composed stories to be available in the sidebar + await expect( + page.locator('[id="storybook\\@8\\.0\\.0_components-badge"]') + ).toBeVisible(); + await page.locator('[id="storybook\\@8\\.0\\.0_components-badge"]').click(); + await expect( + page.locator('[id="storybook\\@8\\.0\\.0_components-badge--default"]') + ).toBeVisible(); + + await page + .locator('[id="storybook\\@7\\.6\\.18_components-badge"]') + .click(); + await page + .locator('[id="storybook\\@7\\.6\\.18_components-badge--default"]') + .click(); + await expect( + page + .locator('iframe[title="storybook-ref-storybook\\@7\\.6\\.18"]') + .contentFrame() + .locator("#storybook-root") + .getByText("Default") + ).toBeVisible({ timeout: 15000 }); + + await page.click('button[aria-label="Open navigation menu"]'); + + // Expect composed stories `to be available in the search + await page.getByPlaceholder("Find components").fill("Button primary"); + await expect( + page.getByRole("option", { + name: "Primary Storybook 7.6.18 / @components / Button", + }) + ).toBeVisible(); + + const buttonStory = page.getByRole("option", { + name: "Primary Storybook 8.0.0 / @blocks / examples / Button", + }); + await expect(buttonStory).toBeVisible(); + await buttonStory.click(); + + // Note: this could potentially be flaky due to it accessing a hosted Storybook + await expect( + page + .locator('iframe[title="storybook-ref-storybook\\@8\\.0\\.0"]') + .contentFrame() + .getByRole("button") + ).toBeVisible({ timeout: 15000 }); + }); +}); diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/save-from-controls.spec.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/save-from-controls.spec.ts new file mode 100644 index 000000000000..21341d1276e8 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/e2e-tests/save-from-controls.spec.ts @@ -0,0 +1,90 @@ +import { expect, test } from "@playwright/test"; +import process from "process"; + +import { SbPage } from "../../../../code/e2e-tests/util"; + +const STORYBOOK_URL = "http://localhost:6006"; +const type = process.env.STORYBOOK_TYPE || "dev"; + +test.describe("save-from-controls", () => { + test.describe.configure({ mode: "serial" }); + test.skip( + type === "build", + `Skipping save-from-controls tests for production Storybooks` + ); + + test("Should be able to update a story", async ({ page, browserName }) => { + // this is needed because the e2e test will generate a new file in the system + // which we don't know of its location (it runs in different sandboxes) + // so we just create a random id to make it easier to run tests + const id = Math.random().toString(36).substring(7); + + test.skip( + browserName !== "chromium", + `Skipping save-from-controls tests for ${browserName}` + ); + + await page.goto(STORYBOOK_URL + "/?path=/story/example-mybutton--primary"); + const sbPage = new SbPage(page, expect); + await sbPage.waitUntilLoaded(); + + await sbPage.viewAddonPanel("Controls"); + + // Update an arg + const label = sbPage.panelContent().locator("textarea[name=children]"); + await label.fill(`"Updated ${id}"`); + await label.blur(); + + // Assert the footer is shown + await sbPage + .panelContent() + .locator('[data-short-label="Unsaved changes"]') + .isVisible(); + + // update the story + await sbPage + .panelContent() + .locator("button") + .getByText("Update story") + .click(); + + // Assert the file is saved + const notification1 = sbPage.page.getByTitle("Story saved"); + await expect(notification1).toBeVisible(); + + // dismiss + await notification1.click(); + await notification1.isHidden(); + + // Update an arg + const newStoryValue = `"Copied ${id}"`; + await label.fill(newStoryValue); + await label.blur(); + + // Assert the footer is shown + await sbPage + .panelContent() + .locator('[data-short-label="Unsaved changes"]') + .isVisible(); + + const buttons = sbPage + .panelContent() + .locator('[aria-label="Create new story with these settings"]'); + + // clone the story + await buttons.click(); + + await sbPage.page + .getByPlaceholder("Story export name") + .fill("ClonedStory" + id); + await sbPage.page.getByRole("button", { name: "Create" }).click(); + + // Assert the file is saved + const notification2 = sbPage.page.getByTitle("Story created"); + await expect(notification2).toBeVisible(); + await notification2.click(); + + // Assert the Button components is rendered in the preview + await expect(sbPage.previewRoot()).toContainText(newStoryValue.replace(/"/g, '')); + }); +}); diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/package.json b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/package.json new file mode 100644 index 000000000000..ee1ac6a2ed72 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/package.json @@ -0,0 +1,84 @@ +{ + "name": "portable-stories-react-vitest-3", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "tsc && vite build", + "dev": "vite", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "playwright-e2e": "playwright test -c playwright-e2e.config.ts", + "preview": "vite preview", + "storybook": "NODE_OPTIONS=\"--preserve-symlinks --preserve-symlinks-main\" storybook dev -p 6006", + "vitest": "SKIP_FAIL_ON_PURPOSE=true vitest run" + }, + "resolutions": { + "@playwright/test": "1.52.0", + "@storybook/addon-a11y": "file:../../../code/addons/a11y", + "@storybook/addon-docs": "file:../../../code/addons/docs", + "@storybook/addon-jest": "file:../../../code/addons/jest", + "@storybook/addon-links": "file:../../../code/addons/links", + "@storybook/addon-themes": "file:../../../code/addons/themes", + "@storybook/angular": "file:../../../code/frameworks/angular", + "@storybook/builder-vite": "file:../../../code/builders/builder-vite", + "@storybook/builder-webpack5": "file:../../../code/builders/builder-webpack5", + "@storybook/codemod": "file:../../../code/lib/codemod", + "eslint-plugin-storybook": "file:../../../code/lib/eslint-plugin", + "storybook": "portal:../../../code/core", + "@storybook/core-webpack": "portal:../../../code/lib/core-webpack", + "@storybook/csf-plugin": "portal:../../../code/lib/csf-plugin", + "@storybook/ember": "portal:../../../code/frameworks/ember", + "@storybook/addon-vitest": "file:../../../code/addons/vitest", + "@storybook/html": "file:../../../code/renderers/html", + "@storybook/nextjs": "file:../../../code/frameworks/nextjs", + "@storybook/preact": "file:../../../code/renderers/preact", + "@storybook/preact-vite": "file:../../../code/frameworks/preact-vite", + "@storybook/preset-create-react-app": "file:../../../code/presets/create-react-app", + "@storybook/preset-react-webpack": "file:../../../code/presets/react-webpack", + "@storybook/preset-server-webpack": "file:../../../code/presets/server-webpack", + "@storybook/react": "file:../../../code/renderers/react", + "@storybook/react-dom-shim": "file:../../../code/lib/react-dom-shim", + "@storybook/react-vite": "file:../../../code/frameworks/react-vite", + "@storybook/react-webpack5": "file:../../../code/frameworks/react-webpack5", + "@storybook/server": "file:../../../code/renderers/server", + "@storybook/server-webpack5": "file:../../../code/frameworks/server-webpack5", + "@storybook/svelte": "file:../../../code/renderers/svelte", + "@storybook/svelte-vite": "file:../../../code/frameworks/svelte-vite", + "@storybook/sveltekit": "file:../../../code/frameworks/sveltekit", + "@storybook/vue3": "file:../../../code/renderers/vue3", + "@storybook/vue3-vite": "file:../../../code/frameworks/vue3-vite", + "@storybook/web-components": "file:../../../code/renderers/web-components", + "@storybook/web-components-vite": "file:../../../code/frameworks/web-components-vite", + "playwright": "1.52.0" + }, + "dependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@playwright/test": "1.52.0", + "@storybook/addon-a11y": "^8.0.0", + "@storybook/addon-vitest": "^8.0.0", + "@storybook/react": "^8.0.0", + "@storybook/react-vite": "^8.0.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.2.0", + "@types/identity-obj-proxy": "^3", + "@types/react": "^19.0.8", + "@types/react-dom": "^19.0.3", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vitejs/plugin-react": "^4.2.1", + "@vitest/browser": "^3.2.4", + "@vitest/coverage-v8": "^3.2.4", + "@vitest/ui": "^3.2.4", + "eslint": "^8.56.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "eslint-plugin-storybook": "^0.11.4", + "identity-obj-proxy": "^3.0.0", + "storybook": "^8.0.0", + "typescript": "^5.8.3", + "vite": "^5.1.1", + "vitest": "^3.2.4" + } +} diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/playwright-e2e.config.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/playwright-e2e.config.ts new file mode 100644 index 000000000000..4448147bcc95 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/playwright-e2e.config.ts @@ -0,0 +1,60 @@ +import { defineConfig, devices } from "@playwright/test"; +import path from "node:path"; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "./e2e-tests", + outputDir: "./test-results", + /* Maximum time one test can run for. */ + timeout: (process.env.CI ? 60 : 30) * 1000, + /* Run tests in files in parallel */ + fullyParallel: false, + + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + retries: 0, + /* Run tests serially to avoid side effects */ + workers: 1, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: [ + ["line"], + [ + "junit", + { + embedAnnotationsAsProperties: true, + outputFile: path.join(__dirname, "..", "..", "..", "test-results"), + }, + ], + ], + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "retain-on-failure", + // video: "retain-on-failure", + // headless: false, + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + // { + // name: 'firefox', + // use: { ...devices['Desktop Firefox'] }, + // }, + // { + // name: 'webkit', + // use: { ...devices['Desktop Safari'] }, + // }, + ], + + webServer: { + command: "yarn storybook", + url: "http://127.0.0.1:6006", + reuseExistingServer: true, + }, +}); diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/pre-e2e.js b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/pre-e2e.js new file mode 100644 index 000000000000..a684b479b9ce --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/pre-e2e.js @@ -0,0 +1,10 @@ +/* eslint-disable no-undef */ +/* eslint-disable @typescript-eslint/no-var-requires */ +const fs = require("node:fs"); +const path = require("node:path"); + +const testStoryPath = path.resolve("stories/AddonTest.stories.tsx"); + +console.log(`Pre-e2e script: clearing ${testStoryPath}`); +const storyContent = fs.readFileSync(testStoryPath).toString(); +fs.writeFileSync(testStoryPath, storyContent.replace("forceFailure: true", "forceFailure: false")); \ No newline at end of file diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/AddonTest.stories.tsx b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/AddonTest.stories.tsx new file mode 100644 index 000000000000..fcb59a0ff94e --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/AddonTest.stories.tsx @@ -0,0 +1,100 @@ +import { expect, within } from 'storybook/test'; +import { Meta, type StoryObj } from '@storybook/react-vite'; +import { instrument } from 'storybook/internal/instrumenter'; +import { Component } from './AddonTest'; + +declare global { + // eslint-disable-next-line no-var + var __vitest_browser__: boolean; +} + +const meta = { + title: 'Addons/Group/Test', + component: Component, +} as Meta; + +export default meta; + +type Story = StoryObj; + +const { pass } = instrument({ + pass: async () => {}, +}, { intercept: true }) + +export const ExpectedFailure: Story = { + args: { + forceFailure: false, + }, + play: async ({ args }) => { + await pass(); + if(args.forceFailure) { + throw new Error('Expected failure'); + } + } +}; + +export const ExpectedSuccess: Story = { + play: async () => { + await pass(); + } +}; + +export const ExpectedContent: Story = { + play: async ({ canvasElement }) => { + const button = within(canvasElement).getByRole('button'); + await expect(button).toHaveTextContent('test'); + const decoratorString = within(canvasElement).getByTestId('decorator-string'); + await expect(decoratorString).toHaveTextContent('Global Decorator'); + } +}; + +export const LongRunning: Story = { + loaders: [async () => new Promise((resolve) => setTimeout(resolve, 800))], +}; + +// Tests will pass in browser, but fail in CLI +export const MismatchFailure: Story = { + play: async () => { + await pass(); + if(!globalThis.__vitest_browser__) { + throw new Error('Expected failure'); + } + } +}; + +// Tests will fail in browser, but pass in CLI +export const MismatchSuccess: Story = { + play: async () => { + await pass(); + if(globalThis.__vitest_browser__) { + throw new Error('Unexpected success'); + } + }, + tags: ['fail-on-purpose'], +}; + +export const PreviewHeadTest: Story = { + play: async () => { + const styles = window.getComputedStyle(document.body); + // set in preview-head.html + expect(styles.backgroundColor).toBe('rgb(250, 250, 210)'); + // set in main.js#previewHead + expect(styles.borderColor).toBe('rgb(255, 0, 0)'); + } +}; + +export const StaticDirTest: Story = { + play: async () => { + const path = '/test-static-dirs/static.js'; + const { staticFunction } = await import(/* @vite-ignore */path); + expect(staticFunction()).toBe(true); + } +} + +export const ViteFinalTest: Story = { + play: async () => { + // @ts-expect-error TS doesn't know about the alias + const { aliasedFunction } = await import('test-alias'); + expect(aliasedFunction()).toBe(true); + } +} diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/AddonTest.tsx b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/AddonTest.tsx new file mode 100644 index 000000000000..01850675e5c7 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/AddonTest.tsx @@ -0,0 +1,5 @@ +import { getButtonString } from './get-button-string'; + +export const Component = () => { + return ; +}; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/Button.stories.tsx b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/Button.stories.tsx new file mode 100644 index 000000000000..c40e163b0d32 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/Button.stories.tsx @@ -0,0 +1,113 @@ +import { expect, fn } from 'storybook/test'; +import type { Meta, StoryFn as CSF2Story, StoryObj as CSF3Story } from '@storybook/react-vite'; + +import type { ButtonProps } from './Button'; +import { Button } from './Button'; + +const meta = { + title: 'Example/Button', + component: Button, + argTypes: { + backgroundColor: { control: 'color' }, + }, +} satisfies Meta; + +export default meta; + +const Template: CSF2Story = (args) => + + ); +}; +CSF2StoryWithLocale.storyName = 'WithLocale'; + +export const CSF2StoryWithParamsAndDecorator: CSF2Story = (args) => { + return + ); +}; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/MyButton.stories.tsx b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/MyButton.stories.tsx new file mode 100644 index 000000000000..d79c54c2f1c0 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/MyButton.stories.tsx @@ -0,0 +1,19 @@ +import type { Meta, StoryObj as CSF3Story } from '@storybook/react-vite'; + +import type { ButtonProps } from './Button'; +import { Button } from './Button'; + +const meta = { + title: 'Example/MyButton', + component: Button, + tags: ['!test'], + argTypes: { + backgroundColor: { control: 'color' }, + }, +} satisfies Meta; + +export default meta; + +export const Primary: CSF3Story = { + args: { children: 'foo' }, +}; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/OtherComponent.stories.tsx b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/OtherComponent.stories.tsx new file mode 100644 index 000000000000..cf35c3f8e98e --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/OtherComponent.stories.tsx @@ -0,0 +1,22 @@ +import { Meta, type StoryObj } from '@storybook/react-vite'; + +const Component = () => + +const meta = { + title: 'Addons/Group/Other', + component: Component, +} as Meta; + +export default meta; + +type Story = StoryObj; + +export const Passes: Story = { +}; + +export const Fails: Story = { + play: async () => { + throw new Error('Expected failure'); + }, + tags: ['fail-on-purpose'], +}; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/UnhandledErrors.stories.tsx b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/UnhandledErrors.stories.tsx new file mode 100644 index 000000000000..49a5db3a6ba0 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/UnhandledErrors.stories.tsx @@ -0,0 +1,46 @@ +import type { Meta, StoryObj } from '@storybook/react-vite'; + +async function unhandledRejection() { + throwError('I THREW AN UNHANDLED REJECTION!'); +} + +function unhandledError() { + throwError('I THREW AN UNHANDLED ERROR!'); +} + +function throwError(message: string) { + throw new Error(message); +} +const meta = { + title: 'Example/UnhandledErrors', + args: { + errorType: null, + forceFailure: false, + }, + component: ({ errorType, forceFailure }) => { + if (forceFailure) { + if (errorType === 'rejection') { + setTimeout(unhandledRejection, 0); + } else if (errorType === 'error') { + setTimeout(unhandledError, 0); + } + } + return 'Hello world'; + }, +} as Meta<{ errorType: 'rejection' | 'error' | null; forceFailure?: boolean }>; +export default meta; +type Story = StoryObj; + +export const UnhandledError: Story = { + args: { + errorType: 'error', + }, +}; + +export const UnhandledRejection: Story = { + args: { + errorType: 'rejection', + }, +}; + +export const Success: Story = {}; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/button.css b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/button.css new file mode 100644 index 000000000000..dc91dc76370b --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/button.css @@ -0,0 +1,30 @@ +.storybook-button { + font-family: 'Nunito Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 700; + border: 0; + border-radius: 3em; + cursor: pointer; + display: inline-block; + line-height: 1; +} +.storybook-button--primary { + color: white; + background-color: #1ea7fd; +} +.storybook-button--secondary { + color: #333; + background-color: transparent; + box-shadow: rgba(0, 0, 0, 0.15) 0px 0px 0px 1px inset; +} +.storybook-button--small { + font-size: 12px; + padding: 10px 16px; +} +.storybook-button--medium { + font-size: 14px; + padding: 11px 20px; +} +.storybook-button--large { + font-size: 16px; + padding: 12px 24px; +} diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/get-button-string.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/get-button-string.ts new file mode 100644 index 000000000000..7c9d9ab153d0 --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/stories/get-button-string.ts @@ -0,0 +1,3 @@ +export const getButtonString = () => { + return "test"; +}; diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/tsconfig.json b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/tsconfig.json new file mode 100644 index 000000000000..0bcaa35b673d --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["stories", "e2e-tests"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/tsconfig.node.json b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/tsconfig.node.json new file mode 100644 index 000000000000..97ede7ee6f2d --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/test-storybooks/portable-stories-kitchen-sink/react/vite.config.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/vite.config.ts similarity index 50% rename from test-storybooks/portable-stories-kitchen-sink/react/vite.config.ts rename to test-storybooks/portable-stories-kitchen-sink/react-vitest-3/vite.config.ts index 5a33944a9b41..9cc50ead1c0a 100644 --- a/test-storybooks/portable-stories-kitchen-sink/react/vite.config.ts +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/vite.config.ts @@ -1,7 +1,7 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], -}) +}); diff --git a/test-storybooks/portable-stories-kitchen-sink/react/vitest.workspace.ts b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/vitest.workspace.ts similarity index 58% rename from test-storybooks/portable-stories-kitchen-sink/react/vitest.workspace.ts rename to test-storybooks/portable-stories-kitchen-sink/react-vitest-3/vitest.workspace.ts index 7b4012edb5d1..d09ebcb58a9b 100644 --- a/test-storybooks/portable-stories-kitchen-sink/react/vitest.workspace.ts +++ b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/vitest.workspace.ts @@ -5,29 +5,35 @@ export default defineWorkspace([ { extends: "vite.config.ts", plugins: [ - storybookTest(process.env.SKIP_FAIL_ON_PURPOSE ? { - tags: { - exclude: ["fail-on-purpose"], - } - } : undefined), + storybookTest( + process.env.SKIP_FAIL_ON_PURPOSE + ? { + tags: { + exclude: ["fail-on-purpose"], + }, + } + : undefined + ), ], test: { name: "storybook", pool: "threads", deps: { optimizer: { - web: { - enabled: false - } - } + web: { + enabled: false, + }, + }, }, browser: { enabled: true, provider: "playwright", headless: true, - instances: [{ - browser: 'chromium' - }] + instances: [ + { + browser: "chromium", + }, + ], }, setupFiles: ["./.storybook/vitest.setup.ts"], environment: "jsdom", diff --git a/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/yarn.lock b/test-storybooks/portable-stories-kitchen-sink/react-vitest-3/yarn.lock new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/test-storybooks/portable-stories-kitchen-sink/react/package.json b/test-storybooks/portable-stories-kitchen-sink/react/package.json index 7b323dd99f5b..003526c23a59 100644 --- a/test-storybooks/portable-stories-kitchen-sink/react/package.json +++ b/test-storybooks/portable-stories-kitchen-sink/react/package.json @@ -67,6 +67,7 @@ "@storybook/react-vite": "^8.0.0", "@swc/core": "^1.4.2", "@swc/jest": "^0.2.36", + "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", "@types/identity-obj-proxy": "^3", @@ -75,9 +76,10 @@ "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react": "^4.2.1", - "@vitest/browser": "^3.2.4", - "@vitest/coverage-v8": "^3.2.4", - "@vitest/ui": "^3.2.4", + "@vitest/browser": "^4.0.0", + "@vitest/browser-playwright": "^4.0.0", + "@vitest/coverage-v8": "^4.0.0", + "@vitest/ui": "^4.0.0", "cypress": "^13.6.4", "eslint": "^8.56.0", "eslint-plugin-react-hooks": "^4.6.0", @@ -89,6 +91,6 @@ "storybook": "^8.0.0", "typescript": "^5.8.3", "vite": "^5.1.1", - "vitest": "^3.2.4" + "vitest": "^4.0.0" } -} +} \ No newline at end of file diff --git a/test-storybooks/portable-stories-kitchen-sink/react/vite.config.mts b/test-storybooks/portable-stories-kitchen-sink/react/vite.config.mts new file mode 100644 index 000000000000..1169d7fd3d6d --- /dev/null +++ b/test-storybooks/portable-stories-kitchen-sink/react/vite.config.mts @@ -0,0 +1,43 @@ +import { defineConfig } from "vitest/config"; +import react from "@vitejs/plugin-react"; +import { storybookTest } from "@storybook/addon-vitest/vitest-plugin"; +import { playwright } from "@vitest/browser-playwright"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + storybookTest( + process.env.SKIP_FAIL_ON_PURPOSE + ? { + tags: { + exclude: ["fail-on-purpose"], + }, + } + : undefined + ), + ], + test: { + name: "storybook", + pool: "threads", + deps: { + optimizer: { + web: { + enabled: false, + }, + }, + }, + browser: { + enabled: true, + provider: playwright({}), + headless: true, + instances: [ + { + browser: "chromium", + }, + ], + }, + setupFiles: ["./.storybook/vitest.setup.ts"], + environment: "jsdom", + }, +});