diff --git a/babel.config.mjs b/babel.config.mjs index 0180eb04062203..2342644457586b 100644 --- a/babel.config.mjs +++ b/babel.config.mjs @@ -42,7 +42,6 @@ export default function getBabelConfig(api) { '@mui/utils': resolveAliasPath('./packages/mui-utils/src'), '@mui/joy': resolveAliasPath('./packages/mui-joy/src'), '@mui/internal-docs-utils': resolveAliasPath('./packages-internal/docs-utils/src'), - '@mui/internal-test-utils': resolveAliasPath('./packages-internal/test-utils/src'), docs: resolveAliasPath('./docs'), test: resolveAliasPath('./test'), }; diff --git a/docs/package.json b/docs/package.json index c91c54196b4d37..4e1ca230020d2b 100644 --- a/docs/package.json +++ b/docs/package.json @@ -110,7 +110,6 @@ "@mui-internal/api-docs-builder": "workspace:^", "@mui/internal-docs-utils": "workspace:^", "@mui/internal-scripts": "workspace:^", - "@mui/internal-test-utils": "workspace:^", "@playwright/test": "^1.56.1", "@types/autosuggest-highlight": "^3.2.3", "@types/chai": "^5.2.3", diff --git a/package.json b/package.json index ebf3882e7ef888..f6f9f4f8622146 100644 --- a/package.json +++ b/package.json @@ -55,9 +55,9 @@ "vitest": "vitest", "test:coverage:html": "pnpm test:unit run --coverage --coverage.reporter html", "test:e2e": "cross-env NODE_ENV=production pnpm test:e2e:build && concurrently --success first --kill-others \"pnpm test:e2e:run\" \"pnpm test:e2e:server\"", - "test:e2e:build": "nx run nx_test_e2e_build", + "test:e2e:build": "webpack --config test/e2e/webpack.config.js", "test:e2e:dev": "concurrently \"pnpm test:e2e:build --watch\" \"pnpm test:e2e:server\"", - "test:e2e:run": "nx run nx_test_e2e_run", + "test:e2e:run": "vitest run -r ./test/e2e/", "test:e2e:server": "serve test/e2e -p 5001", "test:e2e-website": "playwright test test/e2e-website --config test/e2e-website/playwright.config.ts", "test:e2e-website:dev": "cross-env PLAYWRIGHT_TEST_BASE_URL=http://localhost:3000 playwright test test/e2e-website --config test/e2e-website/playwright.config.ts", @@ -78,8 +78,6 @@ "validate-declarations": "tsx scripts/validateTypescriptDeclarations.mts", "generate-codeowners": "node scripts/generateCodeowners.mjs", "canary:release": "tsx ./scripts/canaryRelease.mts", - "nx_test_e2e_build": "webpack --config test/e2e/webpack.config.js", - "nx_test_e2e_run": "vitest run -r ./test/e2e/", "clean": "pnpm -r exec rm -rf build" }, "dependencies": { @@ -96,13 +94,13 @@ "@babel/plugin-transform-react-constant-elements": "^7.27.1", "@mui-internal/api-docs-builder": "workspace:^", "@mui-internal/api-docs-builder-core": "workspace:^", - "@mui/internal-babel-plugin-minify-errors": "^2.0.8-canary.13", - "@mui/internal-bundle-size-checker": "^1.0.9-canary.56", - "@mui/internal-code-infra": "^0.0.3-canary.56", + "@mui/internal-babel-plugin-minify-errors": "2.0.8-canary.13", + "@mui/internal-bundle-size-checker": "1.0.9-canary.56", + "@mui/internal-code-infra": "0.0.3-canary.56", "@mui/internal-docs-utils": "workspace:^", "@mui/internal-netlify-cache": "^0.0.2-canary.1", "@mui/internal-scripts": "workspace:^", - "@mui/internal-test-utils": "workspace:^", + "@mui/internal-test-utils": "2.0.18-canary.0", "@mui/joy": "workspace:*", "@mui/material": "workspace:^", "@mui/utils": "workspace:^", @@ -118,8 +116,8 @@ "@types/react": "^19.2.7", "@types/yargs": "^17.0.35", "@vitejs/plugin-react": "^5.1.1", - "@vitest/browser-playwright": "^4.0.10", - "@vitest/coverage-v8": "^4.0.10", + "@vitest/browser-playwright": "^4.0.13", + "@vitest/coverage-v8": "^4.0.13", "@vvago/vale": "^3.12.0", "babel-loader": "^10.0.0", "babel-plugin-istanbul": "^7.0.0", @@ -140,7 +138,6 @@ "lerna": "^9.0.3", "markdownlint-cli2": "^0.18.1", "nx": "^20.8.3", - "nyc": "^17.1.0", "playwright": "1.56.1", "prettier": "^3.6.2", "pretty-quick": "^4.2.2", @@ -154,7 +151,7 @@ "tsx": "^4.20.4", "typescript": "^5.9.2", "vite": "^7.2.2", - "vitest": "^4.0.10", + "vitest": "^4.0.13", "vitest-fail-on-console": "^0.10.1", "webpack": "^5.101.3", "webpack-cli": "^6.0.1", @@ -181,30 +178,5 @@ "@pigment-css/unplugin": "0.0.30", "@pigment-css/nextjs-plugin": "0.0.30", "@pigment-css/vite-plugin": "0.0.30" - }, - "nyc": { - "include": [ - "packages/mui*/src/**/*.?(c|m)[jt]s?(x)" - ], - "exclude": [ - "**/*.test.?(c|m)[jt]s?(x)", - "**/*.test/*" - ], - "sourceMap": false, - "instrument": false - }, - "nx": { - "targets": { - "nx_test_e2e_build": { - "dependsOn": [ - "@mui/internal-test-utils:build" - ] - }, - "nx_test_e2e_run": { - "dependsOn": [ - "@mui/internal-test-utils:build" - ] - } - } } } diff --git a/packages-internal/test-utils/CHANGELOG.md b/packages-internal/test-utils/CHANGELOG.md deleted file mode 100644 index a6c93f9bf457a6..00000000000000 --- a/packages-internal/test-utils/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -# Changelog - -## 1.0.0 - -Initial release as an npm package. diff --git a/packages-internal/test-utils/README.md b/packages-internal/test-utils/README.md deleted file mode 100644 index 44b9199879e356..00000000000000 --- a/packages-internal/test-utils/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# @mui/internal-test-utils - -This package contains test runner initialization functions and common tests shared between MUI packages. -This is an internal package not meant for general use. - -## Release - -1. Build the project: `pnpm build` -2. Publish the build artifacts to npm: `pnpm release:publish` diff --git a/packages-internal/test-utils/package.json b/packages-internal/test-utils/package.json deleted file mode 100644 index 6b1007f4f8dacc..00000000000000 --- a/packages-internal/test-utils/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "@mui/internal-test-utils", - "version": "2.0.16", - "author": "MUI Team", - "description": "Utilities for MUI tests. This is an internal package not meant for general use.", - "repository": { - "type": "git", - "url": "git+https://github.com/mui/material-ui.git", - "directory": "packages-internal/test-utils" - }, - "exports": { - ".": "./src/index.ts", - "./createDescribe": "./src/createDescribe.ts", - "./createRenderer": "./src/createRenderer.tsx", - "./init": "./src/init.js", - "./initMatchers": "./src/initMatchers.ts", - "./initPlaywrightMatchers": "./src/initPlaywrightMatchers.ts", - "./chaiPlugin": "./src/chaiPlugin.ts", - "./setupVitest": "./src/setupVitest.ts" - }, - "scripts": { - "prebuild": "rimraf ./build", - "build": "code-infra build", - "typescript": "tsc -p tsconfig.json", - "release:publish": "pnpm publish --tag latest", - "release:publish:dry-run": "pnpm publish --tag latest --registry=\"http://localhost:4873/\"" - }, - "dependencies": { - "@babel/runtime": "^7.28.4", - "@emotion/cache": "^11.14.0", - "@emotion/react": "^11.14.0", - "@testing-library/dom": "^10.4.1", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "assertion-error": "^2.0.1", - "chai-dom": "^1.12.1", - "dom-accessibility-api": "^0.7.1", - "es-toolkit": "^1.42.0", - "format-util": "^1.0.5", - "jsdom": "^26.1.0", - "prop-types": "^15.8.1", - "sinon": "^21.0.0" - }, - "devDependencies": { - "@playwright/test": "^1.56.1", - "@types/chai": "^5.2.3", - "@types/chai-dom": "^1.11.3", - "@types/format-util": "^1.0.4", - "@types/jsdom": "^21.1.7", - "@types/prop-types": "^15.7.15", - "@types/react": "^19.2.7", - "@types/react-dom": "^19.2.3", - "@types/sinon": "^17.0.4", - "typescript": "^5.9.2" - }, - "peerDependencies": { - "@playwright/test": "^1.53.1", - "chai": "^4.5.0 || ^5.0.0 || ^6.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "publishConfig": { - "access": "public", - "directory": "build" - } -} diff --git a/packages-internal/test-utils/src/chai.types.ts b/packages-internal/test-utils/src/chai.types.ts deleted file mode 100644 index fc6295652c073c..00000000000000 --- a/packages-internal/test-utils/src/chai.types.ts +++ /dev/null @@ -1,107 +0,0 @@ -export {}; - -// https://stackoverflow.com/a/46755166/3406963 -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Chai { - interface Assertion { - /** - * Checks `expectedStyle` is a subset of the elements inline style i.e. `element.style`. - * @example expect(element).toHaveInlineStyle({ width: '200px' }) - */ - toHaveInlineStyle( - expectedStyle: Partial< - Record< - Exclude< - keyof CSSStyleDeclaration, - | 'getPropertyPriority' - | 'getPropertyValue' - | 'item' - | 'removeProperty' - | 'setProperty' - | number - >, - string - > - >, - ): void; - /** - * Checks `expectedStyle` is a subset of the elements computed style i.e. `window.getComputedStyle(element)`. - * @example expect(element).toHaveComputedStyle({ width: '200px' }) - */ - toHaveComputedStyle( - expectedStyle: Partial< - Record< - Exclude< - keyof CSSStyleDeclaration, - | 'getPropertyPriority' - | 'getPropertyValue' - | 'item' - | 'removeProperty' - | 'setProperty' - | number - >, - string - > - >, - ): void; - /** - * Check if an element's [`visibility`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/visibility) is not `hidden` or `collapsed`. - */ - toBeVisible(): void; - /** - * Check if an element's [`visibility`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/visibility) is `hidden` or `collapsed`. - */ - toBeHidden(): void; - /** - * Checks if the element is inaccessible. - * - * Elements are considered inaccessible if they either: - * - have [`visibility`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/visibility) `hidden` - * - have [`display`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/display) `none` - * - have `aria-hidden` `true` or any of their parents - * - * @see [Excluding Elements from the Accessibility Tree](https://www.w3.org/TR/wai-aria-1.2/#tree_exclusion) - */ - toBeInaccessible(): void; - toHaveAccessibleDescription(description: string): void; - /** - * Checks if the accessible name computation (according to `accname` spec) - * matches the expectation. - * - * @see https://www.w3.org/TR/accname-1.2/ - * @param name - */ - toHaveAccessibleName(name: string): void; - /** - * Checks if the element is actually focused i.e. `document.activeElement` is equal to the actual element. - */ - toHaveFocus(): void; - /** - * Checks if the element is the active-descendant of the active element. - */ - toHaveVirtualFocus(): void; - /** - * Matches calls to `console.warn` in the asserted callback. - * - * @example expect(() => render()).not.toWarnDev() - * @example expect(() => render()).toWarnDev('single message') - * @example expect(() => render()).toWarnDev(['first warning', 'then the second']) - */ - toWarnDev(messages?: string | readonly (string | boolean)[]): void; - /** - * Matches calls to `console.error` in the asserted callback. - * - * @example expect(() => render()).not.toErrorDev() - * @example expect(() => render()).toErrorDev('single message') - * @example expect(() => render()).toErrorDev(['first warning', 'then the second']) - */ - toErrorDev(messages?: string | readonly (string | boolean)[]): void; - /** - * Asserts that the given callback throws an error matching the given message in development (process.env.NODE_ENV !== 'production'). - * In production it expects a minified error. - */ - toThrowMinified(message: string | RegExp): void; - } - } -} diff --git a/packages-internal/test-utils/src/chaiPlugin.ts b/packages-internal/test-utils/src/chaiPlugin.ts deleted file mode 100644 index 7bfaff8b3cfeaa..00000000000000 --- a/packages-internal/test-utils/src/chaiPlugin.ts +++ /dev/null @@ -1,497 +0,0 @@ -import { isInaccessible } from '@testing-library/dom'; -import { prettyDOM } from '@testing-library/react/pure'; -import * as chai from 'chai'; -import { computeAccessibleDescription, computeAccessibleName } from 'dom-accessibility-api'; -import formatUtil from 'format-util'; -import { kebabCase } from 'es-toolkit/string'; -import { AssertionError } from 'assertion-error'; -import './chai.types'; -import { isJsdom } from './env'; - -// chai#utils.elToString that looks like stringified elements in testing-library -function elementToString(element: Element | null | undefined) { - if (typeof element?.nodeType === 'number') { - return prettyDOM(element, undefined, { highlight: true, maxDepth: 1 }); - } - return String(element); -} - -const chaiPlugin: Parameters[0] = (chaiAPI, utils) => { - const blockElements = new Set([ - 'html', - 'address', - 'blockquote', - 'body', - 'dd', - 'div', - 'dl', - 'dt', - 'fieldset', - 'form', - 'frame', - 'frameset', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'noframes', - 'ol', - 'p', - 'ul', - 'center', - 'dir', - 'hr', - 'menu', - 'pre', - ]); - - function pretendVisibleGetComputedStyle(element: Element): CSSStyleDeclaration { - // `CSSStyleDeclaration` is not constructable - // https://stackoverflow.com/a/52732909/3406963 - // this is not equivalent to the declaration from `getComputedStyle` - // for example `getComputedStyle` would return a readonly declaration - // let's hope this doesn't get passed around until it's no longer clear where it comes from - const declaration = document.createElement('span').style; - - // initial values - declaration.content = ''; - // technically it's `inline`. We partially apply the default user agent sheet (chrome) here - // we're only interested in elements that use block - declaration.display = blockElements.has(element.tagName) ? 'block' : 'inline'; - declaration.visibility = 'visible'; - - return declaration; - } - - // better diff view for expect(element).to.equal(document.activeElement) - chaiAPI.Assertion.addMethod('toHaveFocus', function elementIsFocused() { - const element = utils.flag(this, 'object'); - - this.assert( - element === document.activeElement, - `expected element to have focus`, - `expected element to NOT have focus \n${elementToString(element)}`, - elementToString(element), - elementToString(document.activeElement), - ); - }); - - chaiAPI.Assertion.addMethod('toHaveVirtualFocus', function elementIsVirtuallyFocused() { - const element = utils.flag(this, 'object'); - const id = element.getAttribute('id'); - - const virtuallyFocusedElementId = document.activeElement!.getAttribute('aria-activedescendant'); - - this.assert( - virtuallyFocusedElementId === id, - `expected element to be virtually focused\nexpected id #{exp}\n${ - virtuallyFocusedElementId === null - ? `activeElement: ${elementToString(document.activeElement)}` - : 'actual id: #{act}' - }`, - 'expected element to NOT to be virtually focused', - id, - virtuallyFocusedElementId, - virtuallyFocusedElementId !== null, - ); - }); - - chaiAPI.Assertion.addMethod('toBeInaccessible', function elementIsAccessible() { - const element = utils.flag(this, 'object'); - - const inaccessible = isInaccessible(element); - - this.assert( - inaccessible === true, - `expected \n${elementToString(element)} to be inaccessible but it was accessible`, - `expected \n${elementToString(element)} to be accessible but it was inaccessible`, - // Not interested in a diff but the typings require the 4th parameter. - undefined, - ); - }); - - chaiAPI.Assertion.addMethod('toHaveAccessibleName', function hasAccessibleName(expectedName) { - const root = utils.flag(this, 'object'); - // make sure it's an Element - new chaiAPI.Assertion(root.nodeType, `Expected an Element but got '${String(root)}'`).to.equal( - 1, - ); - - const actualName = computeAccessibleName(root, { - computedStyleSupportsPseudoElements: !isJsdom(), - // in local development we pretend to be visible. full getComputedStyle is - // expensive and reserved for CI - getComputedStyle: process.env.CI ? undefined : pretendVisibleGetComputedStyle, - }); - - this.assert( - actualName === expectedName, - `expected \n${elementToString(root)} to have accessible name #{exp} but got #{act} instead.`, - `expected \n${elementToString(root)} not to have accessible name #{exp}.`, - expectedName, - actualName, - ); - }); - - chaiAPI.Assertion.addMethod( - 'toHaveAccessibleDescription', - function hasAccessibleDescription(expectedDescription) { - const root = utils.flag(this, 'object'); - // make sure it's an Element - new chaiAPI.Assertion( - root.nodeType, - `Expected an Element but got '${String(root)}'`, - ).to.equal(1); - - const actualDescription = computeAccessibleDescription(root, { - // in local development we pretend to be visible. full getComputedStyle is - // expensive and reserved for CI - getComputedStyle: process.env.CI ? undefined : pretendVisibleGetComputedStyle, - }); - - const possibleDescriptionComputationMessage = root.hasAttribute('title') - ? ' computeAccessibleDescription can be misleading when a `title` attribute is used. This might be a bug in `dom-accessibility-api`.' - : ''; - this.assert( - actualDescription === expectedDescription, - `expected \n${elementToString( - root, - )} to have accessible description #{exp} but got #{act} instead.${possibleDescriptionComputationMessage}`, - `expected \n${elementToString( - root, - )} not to have accessible description #{exp}.${possibleDescriptionComputationMessage}`, - expectedDescription, - actualDescription, - ); - }, - ); - - /** - * Correct name for `to.be.visible` - */ - chaiAPI.Assertion.addMethod('toBeVisible', function toBeVisible() { - // eslint-disable-next-line no-underscore-dangle, @typescript-eslint/no-unused-expressions - new chaiAPI.Assertion(this._obj).to.be.visible; - }); - - /** - * Correct name for `not.to.be.visible` - */ - chaiAPI.Assertion.addMethod('toBeHidden', function toBeHidden() { - // eslint-disable-next-line no-underscore-dangle, @typescript-eslint/no-unused-expressions - new chaiAPI.Assertion(this._obj).not.to.be.visible; - }); - - function assertMatchingStyles( - this: Chai.AssertionStatic, - actualStyleDeclaration: CSSStyleDeclaration, - expectedStyleUnnormalized: Record, - options: { styleTypeHint: string }, - ): void { - const { styleTypeHint } = options; - - // Compare objects using hyphen case. - // This is closer to actual CSS and required for getPropertyValue anyway. - const expectedStyle: Record = {}; - Object.keys(expectedStyleUnnormalized).forEach((cssProperty) => { - const hyphenCasedPropertyName = kebabCase(cssProperty); - const isVendorPrefixed = /^(moz|ms|o|webkit)-/.test(hyphenCasedPropertyName); - const propertyName = isVendorPrefixed - ? `-${hyphenCasedPropertyName}` - : hyphenCasedPropertyName; - expectedStyle[propertyName] = expectedStyleUnnormalized[cssProperty]; - }); - - const shorthandProperties = new Set([ - 'all', - 'animation', - 'background', - 'border', - 'border-block-end', - 'border-block-start', - 'border-bottom', - 'border-color', - 'border-image', - 'border-inline-end', - 'border-inline-start', - 'border-left', - 'border-radius', - 'border-right', - 'border-style', - 'border-top', - 'border-width', - 'column-rule', - 'columns', - 'flex', - 'flex-flow', - 'font', - 'gap', - 'grid', - 'grid-area', - 'grid-column', - 'grid-row', - 'grid-template', - 'list-style', - 'margin', - 'mask', - 'offset', - 'outline', - 'overflow', - 'padding', - 'place-content', - 'place-items', - 'place-self', - 'scroll-margin', - 'scroll-padding', - 'text-decoration', - 'text-emphasis', - 'transition', - ]); - const usedShorthandProperties = Object.keys(expectedStyle).filter((cssProperty) => { - return shorthandProperties.has(cssProperty); - }); - if (usedShorthandProperties.length > 0) { - throw new Error( - [ - `Shorthand properties are not supported in ${styleTypeHint} styles matchers since browsers can compute them differently. `, - 'Use longhand properties instead for the follow shorthand properties:\n', - usedShorthandProperties - .map((cssProperty) => { - return `- https://developer.mozilla.org/en-US/docs/Web/CSS/${cssProperty}#constituent_properties`; - }) - .join('\n'), - ].join(''), - ); - } - - const actualStyle: Record = {}; - Object.keys(expectedStyle).forEach((cssProperty) => { - actualStyle[cssProperty] = actualStyleDeclaration.getPropertyValue(cssProperty); - }); - - const jsdomHint = - 'Styles in JSDOM e.g. from `test:unit` are often misleading since JSDOM does not implement the Cascade nor actual CSS property value computation. ' + - "If results differ between real browsers and JSDOM, skip the test in JSDOM e.g. `it.skipIf(isJsdom())('...`"; - const shorthandHint = - 'Browsers can compute shorthand properties differently. Prefer longhand properties e.g. `borderTopColor`, `borderRightColor` etc. instead of `border` or `border-color`.'; - const messageHint = `${jsdomHint}\n${shorthandHint}`; - - this.assert( - // TODO Fix upstream docs/types - (utils as any).eql(actualStyle, expectedStyle), - `expected #{this} to have ${styleTypeHint} style #{exp} \n\n${messageHint}`, - `expected #{this} not to have ${styleTypeHint} style #{exp}${messageHint}`, - expectedStyle, - actualStyle, - true, - ); - } - - chaiAPI.Assertion.addMethod( - 'toHaveInlineStyle', - function toHaveInlineStyle(expectedStyleUnnormalized: Record) { - const element = utils.flag(this, 'object') as HTMLElement; - if (element?.nodeType !== 1) { - // Same pre-condition for negated and unnegated assertion - throw new AssertionError(`Expected an Element but got ${String(element)}`); - } - - assertMatchingStyles.call(this, element.style, expectedStyleUnnormalized, { - styleTypeHint: 'inline', - }); - }, - ); - - chaiAPI.Assertion.addMethod( - 'toHaveComputedStyle', - function toHaveComputedStyle(expectedStyleUnnormalized: Record) { - const element = utils.flag(this, 'object') as HTMLElement; - if (element?.nodeType !== 1) { - // Same pre-condition for negated and unnegated assertion - throw new AssertionError(`Expected an Element but got ${String(element)}`); - } - const computedStyle = element.ownerDocument.defaultView!.getComputedStyle(element); - - assertMatchingStyles.call(this, computedStyle, expectedStyleUnnormalized, { - styleTypeHint: 'computed', - }); - }, - ); - - chaiAPI.Assertion.addMethod('toThrowMinified', function toThrowMinified(expectedDevMessage) { - // TODO: Investigate if `as any` can be removed after https://github.com/DefinitelyTyped/DefinitelyTyped/issues/48634 is resolved. - if (process.env.NODE_ENV !== 'production') { - (this as any).to.throw(expectedDevMessage); - } else { - utils.flag( - this, - 'message', - "Looks like the error was not minified. This can happen if the error code hasn't been generated yet. Run `pnpm extract-error-codes` and try again.", - ); - // TODO: Investigate if `as any` can be removed after https://github.com/DefinitelyTyped/DefinitelyTyped/issues/48634 is resolved. - (this as any).to.throw('Minified MUI error', 'helper'); - } - }); - - function addConsoleMatcher(matcherName: string, methodName: 'error' | 'warn') { - function matcher( - this: Chai.AssertionStatic, - expectedMessagesInput: readonly (string | false | RegExp)[] = [], - ) { - // documented pattern to get the actual value of the assertion - // eslint-disable-next-line no-underscore-dangle - const callback = this._obj; - - if (process.env.NODE_ENV !== 'production') { - const expectedMessages = Array.isArray(expectedMessagesInput) - ? expectedMessagesInput.slice() - : [expectedMessagesInput]; - const unexpectedMessages: Error[] = []; - // TODO Remove type once MUI X enables noImplicitAny - let caughtError: unknown | null = null; - - this.assert( - expectedMessages.length > 0, - `Expected to call console.${methodName} but didn't provide messages. ` + - `If you don't expect any messages prefer \`expect().not.${matcherName}();\`.`, - `Expected no call to console.${methodName} while also expecting messages.` + - 'Expected no call to console.error but provided messages. ' + - "If you want to make sure a certain message isn't logged prefer the positive. " + - 'By expecting certain messages you automatically expect that no other messages are logged', - // Not interested in a diff but the typings require the 4th parameter. - undefined, - ); - - // Ignore skipped messages in e.g. `[condition && 'foo']` - const remainingMessages = expectedMessages.filter((messageOrFalse) => { - return messageOrFalse !== false; - }); - - // eslint-disable-next-line no-console - const originalMethod = console[methodName]; - - let messagesMatched = 0; - const consoleMatcher = (format: string, ...args: readonly unknown[]) => { - // Ignore legacy root deprecation warnings - // TODO: Remove once we no longer use legacy roots. - if ( - format.includes('Use createRoot instead.') || - format.includes('Use hydrateRoot instead.') - ) { - return; - } - const actualMessage = formatUtil(format, ...args); - const expectedMessage = remainingMessages.shift(); - messagesMatched += 1; - - // TODO Remove type once MUI X enables noImplicitAny - let message: string | null = null; - if (expectedMessage === undefined) { - message = `Expected no more error messages but got:\n"${actualMessage}"`; - } else if ( - (typeof expectedMessage === 'string' && !actualMessage.includes(expectedMessage)) || - (expectedMessage instanceof RegExp && !expectedMessage.test(actualMessage)) - ) { - message = `Expected #${messagesMatched} "${expectedMessage}" to be included in \n"${actualMessage}"`; - } - - if (message !== null) { - const error = new Error(message); - - const { stack: fullStack } = error; - const fullStacktrace = fullStack!.replace(`Error: ${message}\n`, '').split('\n'); - - const usefulStacktrace = fullStacktrace - // - // first line points to this frame which is irrelevant for the tester - .slice(1); - const usefulStack = `${message}\n${usefulStacktrace.join('\n')}`; - - error.stack = usefulStack; - unexpectedMessages.push(error); - } - }; - // eslint-disable-next-line no-console - console[methodName] = consoleMatcher; - - try { - callback(); - } catch (error) { - caughtError = error; - } finally { - // eslint-disable-next-line no-console - console[methodName] = originalMethod; - - // unexpected thrown error takes precedence over unexpected console call - if (caughtError !== null) { - // not the same pattern as described in the block because we don't rethrow in the catch - // eslint-disable-next-line no-unsafe-finally - throw caughtError; - } - - const formatMessages = (messages: ReadonlyArray) => { - const formattedMessages = messages.map((message) => { - if (typeof message === 'string') { - return `"${message}"`; - } - // full Error - return `${message.stack}`; - }); - return `\n\n - ${formattedMessages.join('\n\n- ')}`; - }; - - const shouldHaveWarned = utils.flag(this, 'negate') !== true; - - // unreachable from expect().not.toWarnDev(messages) - if (unexpectedMessages.length > 0) { - const unexpectedMessageRecordedMessage = `Recorded unexpected console.${methodName} calls: ${formatMessages( - unexpectedMessages, - )}`; - // chai will duplicate the stack frames from the unexpected calls in their assertion error - // it's not ideal but the test failure is located the second to last stack frame - // and the origin of the call is the second stackframe in the stack - this.assert( - // force chai to always trigger an assertion error - !shouldHaveWarned, - unexpectedMessageRecordedMessage, - unexpectedMessageRecordedMessage, - // Not interested in a diff but the typings require the 4th parameter. - undefined, - ); - } - - if (shouldHaveWarned) { - this.assert( - remainingMessages.length === 0, - `Could not match the following console.${methodName} calls. ` + - `Make sure previous actions didn't call console.${methodName} by wrapping them in expect(() => {}).not.${matcherName}(): ${formatMessages( - remainingMessages, - )}`, - `Impossible state reached in \`expect().${matcherName}()\`. ` + - `This is a bug in the matcher.`, - // Not interested in a diff but the typings require the 4th parameter. - undefined, - ); - } - } - } else { - // nothing to do in prod - // If there are still console calls than our test setup throws. - callback(); - } - } - - chaiAPI.Assertion.addMethod(matcherName, matcher); - } - - /** - * @example expect(() => render()).toWarnDev('single message') - * @example expect(() => render()).toWarnDev(['first warning', 'then the second']) - */ - addConsoleMatcher('toWarnDev', 'warn'); - addConsoleMatcher('toErrorDev', 'error'); -}; - -export default chaiPlugin; diff --git a/packages-internal/test-utils/src/components.tsx b/packages-internal/test-utils/src/components.tsx deleted file mode 100644 index caca10ff55f04f..00000000000000 --- a/packages-internal/test-utils/src/components.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from 'react'; -import PropTypes from 'prop-types'; - -/** - * A basic error boundary that can be used to assert thrown errors in render. - * @example ; - * expect(errorRef.current.errors).to.have.length(0); - */ -export class ErrorBoundary extends React.Component<{ children: React.ReactNode }> { - static propTypes = { - children: PropTypes.node.isRequired, - }; - - state = { - error: null, - }; - - /** - * @public - */ - errors: unknown[] = []; - - static getDerivedStateFromError(error: unknown) { - return { error }; - } - - componentDidCatch(error: unknown) { - this.errors.push(error); - } - - render() { - if (this.state.error) { - return null; - } - return this.props.children; - } -} - -/** - * Allows counting how many times the owner of `RenderCounter` rendered or - * a component within the RenderCounter tree "commits" an update. - * @example ... - * getRenderCountRef.current() === 2 - */ -export const RenderCounter = React.forwardRef<() => number, { children: React.ReactNode }>( - function RenderCounter({ children }, ref) { - const getRenderCountRef = React.useRef(0); - React.useImperativeHandle(ref, () => () => getRenderCountRef.current); - - return ( - { - getRenderCountRef.current += 1; - }} - > - {children} - - ); - }, -); diff --git a/packages-internal/test-utils/src/createDOM.d.ts b/packages-internal/test-utils/src/createDOM.d.ts deleted file mode 100644 index 4c97c17dc71788..00000000000000 --- a/packages-internal/test-utils/src/createDOM.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -// there's probably a broader solution e.g. levering DOMWindow from 'jsdom' -// interface Window extends DOMWindow doesn't work because jsdom typings use -// triple slash directives. Technical dom.lib.d.ts should already have these properties -interface Window { - DragEvent: typeof DragEvent; - Event: typeof Event; - HTMLButtonElement: HTMLButtonElement; - HTMLParagraphElement: HTMLParagraphElement; -} diff --git a/packages-internal/test-utils/src/createDOM.js b/packages-internal/test-utils/src/createDOM.js deleted file mode 100644 index 53d3b7407204bc..00000000000000 --- a/packages-internal/test-utils/src/createDOM.js +++ /dev/null @@ -1,67 +0,0 @@ -const { JSDOM } = require('jsdom'); - -// We can use jsdom-global at some point if maintaining these lists is a burden. -const whitelist = [ - // used by React's experimental cache API - // Always including it to reduce churn when switching between React builds - 'AbortController', - // required for fake getComputedStyle - 'CSSStyleDeclaration', - 'Element', - 'Event', - 'TouchEvent', - 'Image', - 'HTMLElement', - 'HTMLInputElement', - 'Node', - 'Performance', - 'document', - 'DocumentFragment', -]; -const blacklist = ['sessionStorage', 'localStorage']; - -function createDOM() { - const dom = new JSDOM('', { - pretendToBeVisual: true, - url: 'http://localhost', - }); - globalThis.window = dom.window; - // Not yet supported: https://github.com/jsdom/jsdom/issues/2152 - class Touch { - constructor(instance) { - this.instance = instance; - } - - get identifier() { - return this.instance.identifier; - } - - get pageX() { - return this.instance.pageX; - } - - get pageY() { - return this.instance.pageY; - } - - get clientX() { - return this.instance.clientX; - } - - get clientY() { - return this.instance.clientY; - } - } - globalThis.window.Touch = Touch; - - Object.keys(dom.window) - .filter((key) => !blacklist.includes(key)) - .concat(whitelist) - .forEach((key) => { - if (typeof globalThis[key] === 'undefined') { - globalThis[key] = dom.window[key]; - } - }); -} - -module.exports = createDOM; diff --git a/packages-internal/test-utils/src/createDescribe.ts b/packages-internal/test-utils/src/createDescribe.ts deleted file mode 100644 index 9ee4d22805487a..00000000000000 --- a/packages-internal/test-utils/src/createDescribe.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { describe } from 'vitest'; - -type MUIDescribe

= { - (...args: P): void; - - skip: (...args: P) => void; - only: (...args: P) => void; -}; -export default

( - message: string, - callback: (...args: P) => void, -): MUIDescribe

=> { - const muiDescribe = (...args: P) => { - describe(message, () => { - callback(...args); - }); - }; - - muiDescribe.skip = (...args: P) => { - describe.skip(message, () => { - callback(...args); - }); - }; - muiDescribe.only = (...args: P) => { - describe.only(message, () => { - callback(...args); - }); - }; - - return muiDescribe; -}; diff --git a/packages-internal/test-utils/src/createRenderer.test.js b/packages-internal/test-utils/src/createRenderer.test.js deleted file mode 100644 index 1b20fd8049f7d1..00000000000000 --- a/packages-internal/test-utils/src/createRenderer.test.js +++ /dev/null @@ -1,31 +0,0 @@ -import { expect } from 'chai'; -import * as React from 'react'; -import * as ReactDOM from 'react-dom'; -import { createRenderer } from './createRenderer'; - -describe('createRenderer', () => { - const { render } = createRenderer(); - - it('allows querying descriptions', () => { - function Component() { - return ( - -

- I have a description. -
- {ReactDOM.createPortal(
Description 1
, document.body)} - {/* The ID format is important here. It would fail `querySelectorAll('#r:2')` and ensures we use `getElementById` */} -
Description 2
-
Description 3
- - ); - } - const { getAllDescriptionsOf } = render(); - - const descriptions = getAllDescriptionsOf(document.getElementById('target')); - expect(descriptions).to.have.length(3); - expect(descriptions[0]).to.have.property('id', 'r:1'); - expect(descriptions[1]).to.have.property('id', 'r:2'); - expect(descriptions[2]).to.have.property('id', 'r:3'); - }); -}); diff --git a/packages-internal/test-utils/src/createRenderer.tsx b/packages-internal/test-utils/src/createRenderer.tsx deleted file mode 100644 index 88615ae1b23c99..00000000000000 --- a/packages-internal/test-utils/src/createRenderer.tsx +++ /dev/null @@ -1,598 +0,0 @@ -/* eslint-disable compat/compat -- Test environment */ -import createEmotionCache from '@emotion/cache'; -import { CacheProvider as EmotionCacheProvider } from '@emotion/react'; -import { - buildQueries, - cleanup, - prettyDOM, - queries, - RenderResult, - act as rtlAct, - fireEvent as rtlFireEvent, - screen as rtlScreen, - Screen, - render as testingLibraryRender, - RenderOptions as TestingLibraryRenderOptions, - within, -} from '@testing-library/react/pure'; -import { userEvent } from '@testing-library/user-event'; -import * as React from 'react'; -import * as ReactDOMServer from 'react-dom/server'; -import { useFakeTimers } from 'sinon'; -import { beforeEach, afterEach, beforeAll, vi, expect } from 'vitest'; -import reactMajor from './reactMajor'; - -function queryAllDescriptionsOf(baseElement: HTMLElement, element: Element): HTMLElement[] { - const ariaDescribedBy = element.getAttribute('aria-describedby'); - if (ariaDescribedBy === null) { - return []; - } - return ariaDescribedBy - .split(' ') - .map((id) => { - return document.getElementById(id); - }) - .filter((maybeElement): maybeElement is HTMLElement => { - return maybeElement !== null && baseElement.contains(maybeElement); - }); -} - -const [ - queryDescriptionOf, - getAllDescriptionsOf, - getDescriptionOf, - findAllDescriptionsOf, - findDescriptionOf, -] = buildQueries<[Element]>( - queryAllDescriptionsOf, - function getMultipleError() { - return `Found multiple descriptions.`; - }, - function getMissingError() { - return `Found no describing element.`; - }, -); - -const customQueries = { - queryDescriptionOf, - queryAllDescriptionsOf, - getDescriptionOf, - getAllDescriptionsOf, - findDescriptionOf, - findAllDescriptionsOf, -}; - -interface RenderConfiguration extends Pick { - /** - * https://testing-library.com/docs/react-testing-library/api#container - */ - container?: HTMLElement; - /** - * if true does not cleanup before mount - */ - disableUnmount?: boolean; - /** - * wrap in React.StrictMode? - */ - strict?: boolean; - /** - * Set to `true` if the test fails due to [Strict Effects](https://github.com/reactwg/react-18/discussions/19). - */ - strictEffects?: boolean; - wrapper: React.JSXElementConstructor<{ children?: React.ReactNode }>; -} - -interface ClientRenderConfiguration extends RenderConfiguration { - /** - * https://testing-library.com/docs/react-testing-library/api#hydrate - */ - hydrate: boolean; -} - -interface ServerRenderConfiguration extends RenderConfiguration { - container: HTMLElement; -} - -export type RenderOptions = Omit, 'reactStrictMode'>; - -export interface MuiRenderResult extends RenderResult { - user: ReturnType; - forceUpdate(): void; - /** - * convenience helper. Better than repeating all props. - */ - setProps(props: object): void; -} - -export interface MuiRenderToStringResult { - container: HTMLElement; - hydrate(): MuiRenderResult; -} - -interface DataAttributes { - [key: `data-${string}`]: string; -} - -function render( - element: React.ReactElement, - configuration: ClientRenderConfiguration, -): MuiRenderResult { - const { container, hydrate, wrapper, reactStrictMode } = configuration; - - const testingLibraryRenderResult = testingLibraryRender(element, { - container, - hydrate, - queries: { ...queries, ...customQueries }, - wrapper, - reactStrictMode, - }); - const result: MuiRenderResult = { - ...testingLibraryRenderResult, - user: userEvent.setup({ document }), - forceUpdate() { - testingLibraryRenderResult.rerender( - React.cloneElement(element, { - 'data-force-update': String(Math.random()), - }), - ); - }, - setProps(props) { - testingLibraryRenderResult.rerender(React.cloneElement(element, props)); - }, - }; - - return result; -} - -function renderToString( - element: React.ReactElement, - configuration: ServerRenderConfiguration, -): { container: HTMLElement; hydrate(): MuiRenderResult } { - const { container, wrapper: Wrapper } = configuration; - - container.innerHTML = ReactDOMServer.renderToString({element}); - - return { - container, - hydrate() { - return render(element, { ...configuration, hydrate: true }); - }, - }; -} - -export interface Clock { - /** - * Runs all timers until there are no more remaining. - * WARNING: This may cause an infinite loop if a timeout constantly schedules another timeout. - * Prefer to to run only pending timers with `runToLast` and unmount your component directly. - */ - runAll(): void; - /** - * Runs only the currently pending timers. - */ - runToLast(): void; - /** - * Tick the clock ahead `timeoutMS` milliseconds. - * @param timeoutMS - */ - tick(timeoutMS: number): void; - /** - * Returns true if we're running with "real" i.e. native timers. - */ - isReal(): boolean; - /** - * Runs the current test suite (i.e. `describe` block) with fake timers. - */ - withFakeTimers(): void; - /** - * Restore the real timer - */ - restore(): void; -} - -export type ClockConfig = undefined | number | Date; - -function createClock( - defaultMode: 'fake' | 'real', - config: ClockConfig, - options: Exclude[0], number | Date>, -): Clock { - if (defaultMode === 'fake') { - beforeEach(() => { - vi.useFakeTimers({ - now: config, - // useIsFocusVisible schedules a global timer that needs to persist regardless of whether components are mounted or not. - // Technically we'd want to reset all modules between tests but we don't have that technology. - // In the meantime just continue to clear native timers like we did for the past years when using `sinon` < 8. - shouldClearNativeTimers: true, - toFake: [ - 'setTimeout', - 'setInterval', - 'clearTimeout', - 'clearInterval', - 'requestAnimationFrame', - 'cancelAnimationFrame', - 'performance', - 'Date', - ], - ...options, - }); - if (config) { - vi.setSystemTime(config); - } - }); - } else { - beforeEach(() => { - if (config) { - vi.setSystemTime(config); - } - }); - } - - afterEach(async () => { - if (vi.isFakeTimers()) { - await rtlAct(async () => { - vi.runOnlyPendingTimers(); - }); - vi.useRealTimers(); - } - }); - - return { - withFakeTimers: () => { - if (vi.isFakeTimers()) { - return; - } - beforeEach(() => { - vi.useFakeTimers({ - now: config, - // useIsFocusVisible schedules a global timer that needs to persist regardless of whether components are mounted or not. - // Technically we'd want to reset all modules between tests but we don't have that technology. - // In the meantime just continue to clear native timers like we did for the past years when using `sinon` < 8. - shouldClearNativeTimers: true, - toFake: [ - 'setTimeout', - 'setInterval', - 'clearTimeout', - 'clearInterval', - 'requestAnimationFrame', - 'cancelAnimationFrame', - 'performance', - 'Date', - ], - ...options, - }); - if (config) { - vi.setSystemTime(config); - } - }); - }, - runToLast: () => { - rtlAct(() => { - vi.runOnlyPendingTimers(); - }); - }, - isReal() { - return !vi.isFakeTimers(); - }, - restore() { - vi.useRealTimers(); - }, - tick(timeoutMS: number) { - rtlAct(() => { - vi.advanceTimersByTime(timeoutMS); - }); - }, - runAll() { - rtlAct(() => { - vi.runAllTimers(); - }); - }, - }; -} - -export interface Renderer { - clock: Clock; - render(element: React.ReactElement, options?: RenderOptions): MuiRenderResult; - renderToString( - element: React.ReactElement, - options?: RenderOptions, - ): MuiRenderToStringResult; -} - -export interface CreateRendererOptions extends Pick { - /** - * @default 'real' - */ - clock?: 'fake' | 'real'; - clockConfig?: ClockConfig; - clockOptions?: Parameters[2]; -} - -export function createRenderer(globalOptions: CreateRendererOptions = {}): Renderer { - const { - clock: clockMode = 'real', - clockConfig, - strict: globalStrict = true, - strictEffects: globalStrictEffects = globalStrict, - clockOptions, - } = globalOptions; - // save stack to re-use in test-hooks - const { stack: createClientRenderStack } = new Error(); - const clock = createClock(clockMode, clockConfig, clockOptions); - - /** - * Flag whether `createRenderer` was called in a suite i.e. describe() block. - * For legacy reasons `createRenderer` might accidentally be called in a beforeAll(Each) hook. - */ - let wasCalledInSuite = false; - beforeAll(function beforeHook() { - wasCalledInSuite = true; - }); - - let emotionCache: import('@emotion/cache').EmotionCache = null!; - /** - * target container for SSR - */ - let serverContainer: HTMLElement; - /** - * Flag whether all setup for `configuredClientRender` was completed. - * For legacy reasons `configuredClientRender` might accidentally be called in a beforeAll(Each) hook. - */ - let prepared = false; - beforeEach(function beforeEachHook() { - if (!wasCalledInSuite) { - const error = new Error( - 'Unable to run `before` hook for `createRenderer`. This usually indicates that `createRenderer` was called in a `before` hook instead of in a `describe()` block.', - ); - error.stack = createClientRenderStack; - throw error; - } - - const id = expect.getState().currentTestName; - - if (!id) { - throw new Error( - 'Unable to find the currently running test. This is a bug with the client-renderer. Please report this issue to a maintainer.', - ); - } - - emotionCache = createEmotionCache({ key: 'emotion-client-render' }); - - serverContainer = document.createElement('div'); - document.body.appendChild(serverContainer); - - prepared = true; - }); - - afterEach(() => { - if (!clock.isReal()) { - const error = new Error( - "Can't cleanup before fake timers are restored.\n" + - 'Be sure to:\n' + - ' 1. Only use `clock` from `createRenderer`.\n' + - ' 2. Call `createRenderer` in a suite and not any test hook (for example `beforeEach`) or test itself (for example `it`).', - ); - // Use saved stack otherwise the stack trace will not include the test location. - error.stack = createClientRenderStack; - throw error; - } - - cleanup(); - - emotionCache.sheet.tags.forEach((styleTag) => { - styleTag.remove(); - }); - emotionCache = null!; - - serverContainer.remove(); - serverContainer = null!; - }); - - function createWrapper(options: Pick) { - const { wrapper: InnerWrapper = React.Fragment } = options; - - return function Wrapper({ children }: { children?: React.ReactNode }) { - return ( - - {children} - - ); - }; - } - - return { - clock, - render(element: React.ReactElement, options: RenderOptions = {}) { - if (!prepared) { - throw new Error( - 'Unable to finish setup before `render()` was called. ' + - 'This usually indicates that `render()` was called in a `beforeAll()` or `beforeEach` hook. ' + - 'Move the call into each `it()`. Otherwise you cannot run a specific test and we cannot isolate each test.', - ); - } - - const usesLegacyRoot = reactMajor < 18; - const reactStrictMode = - (options.strict ?? globalStrict) && - ((options.strictEffects ?? globalStrictEffects) || usesLegacyRoot); - - return render(element, { - ...options, - reactStrictMode, - hydrate: false, - wrapper: createWrapper(options), - }); - }, - renderToString(element: React.ReactElement, options: RenderOptions = {}) { - if (!prepared) { - throw new Error( - 'Unable to finish setup before `render()` was called. ' + - 'This usually indicates that `render()` was called in a `beforeAll()` or `beforeEach` hook. ' + - 'Move the call into each `it()`. Otherwise you cannot run a specific test and we cannot isolate each test.', - ); - } - - const { container = serverContainer, ...localOptions } = options; - return renderToString(element, { - ...localOptions, - container, - wrapper: createWrapper(options), - }); - }, - }; -} - -const fireEvent = ((target, event, ...args) => { - return rtlFireEvent(target, event, ...args); -}) as typeof rtlFireEvent; - -Object.keys(rtlFireEvent).forEach( - // @ts-expect-error - (eventType: keyof typeof rtlFireEvent) => { - fireEvent[eventType] = (...args) => rtlFireEvent[eventType](...args); - }, -); - -const originalFireEventKeyDown = rtlFireEvent.keyDown; -fireEvent.keyDown = (desiredTarget, options = {}) => { - const element = desiredTarget as Element | Document; - // `element` shouldn't be `document` but we catch this later anyway - const document = element.ownerDocument || element; - const target = document.activeElement || document.body || document.documentElement; - if (target !== element) { - // see https://www.w3.org/TR/uievents/#keydown - const error = new Error( - `\`keydown\` events can only be targeted at the active element which is ${prettyDOM( - target, - undefined, - { maxDepth: 1 }, - )}`, - ); - // We're only interested in the callsite of fireEvent.keyDown - error.stack = error - .stack!.split('\n') - .filter((line) => !/at Function.key/.test(line)) - .join('\n'); - throw error; - } - - return originalFireEventKeyDown(element, options); -}; - -const originalFireEventKeyUp = rtlFireEvent.keyUp; -fireEvent.keyUp = (desiredTarget, options = {}) => { - const element = desiredTarget as Element | Document; - // `element` shouldn't be `document` but we catch this later anyway - const document = element.ownerDocument || element; - const target = document.activeElement || document.body || document.documentElement; - if (target !== element) { - // see https://www.w3.org/TR/uievents/#keyup - const error = new Error( - `\`keyup\` events can only be targeted at the active element which is ${prettyDOM( - target, - undefined, - { maxDepth: 1 }, - )}`, - ); - // We're only interested in the callsite of fireEvent.keyUp - error.stack = error - .stack!.split('\n') - .filter((line) => !/at Function.key/.test(line)) - .join('\n'); - throw error; - } - - return originalFireEventKeyUp(element, options); -}; - -export function fireTouchChangedEvent( - target: Element, - type: 'touchstart' | 'touchmove' | 'touchend', - options: { changedTouches: Array> }, -): void { - const { changedTouches } = options; - const originalGetBoundingClientRect = target.getBoundingClientRect; - target.getBoundingClientRect = () => ({ - x: 0, - y: 0, - bottom: 0, - height: 0, - left: 0, - right: 0, - top: 0, - width: 0, - toJSON() { - return { - x: 0, - y: 0, - bottom: 0, - height: 0, - left: 0, - right: 0, - top: 0, - width: 0, - }; - }, - }); - - const event = new window.TouchEvent(type, { - bubbles: true, - cancelable: true, - composed: true, - changedTouches: changedTouches.map( - (opts) => - new window.Touch({ - target, - identifier: 0, - ...opts, - }), - ), - }); - - fireEvent(target, event); - target.getBoundingClientRect = originalGetBoundingClientRect; -} - -function act(callback: () => T | Promise): Promise; -function act(callback: () => void): void; -function act(callback: () => void | T | Promise) { - return rtlAct(callback); -} - -const bodyBoundQueries = within(document.body, { ...queries, ...customQueries }); - -export { - renderHook, - waitFor, - within, - createEvent, - type RenderHookResult, - type EventType, -} from '@testing-library/react/pure'; -export { act, fireEvent }; -export const screen: Screen & typeof bodyBoundQueries = { ...rtlScreen, ...bodyBoundQueries }; - -export async function flushEffects(): Promise { - await act(async () => {}); -} - -/** - * returns true when touch is suported and can be mocked - */ -export function supportsTouch() { - // only run in supported browsers - if (typeof Touch === 'undefined') { - return false; - } - - try { - // eslint-disable-next-line no-new - new Touch({ identifier: 0, target: window, pageX: 0, pageY: 0 }); - } catch { - // Touch constructor not supported - return false; - } - - return true; -} diff --git a/packages-internal/test-utils/src/describeConformance.tsx b/packages-internal/test-utils/src/describeConformance.tsx deleted file mode 100644 index a9c51639e552f4..00000000000000 --- a/packages-internal/test-utils/src/describeConformance.tsx +++ /dev/null @@ -1,1230 +0,0 @@ -import { expect } from 'chai'; -import * as React from 'react'; -import { describe, it, afterAll, afterEach, beforeEach } from 'vitest'; -import createDescribe from './createDescribe'; -import { MuiRenderResult } from './createRenderer'; - -function capitalize(string: string): string { - return string.charAt(0).toUpperCase() + string.slice(1); -} - -interface DataProps { - [key: `data-${string}`]: string; -} - -export interface SlotTestingOptions { - /** - * A custom React component to test if the receiving props are correct. - * - * It must: - * - contains at least one DOM which has `data-testid="custom"` - * - spread `className` to the DOM - * - * If not provided, the default custom component tests if the class name is spread. - */ - testWithComponent?: React.ComponentType; - /** - * A custom HTML tag to use for the `slots` prop. - */ - testWithElement?: keyof React.JSX.IntrinsicElements | null; - /** - * To ensure that the slot has this class name when `slotProps` is provided. - */ - expectedClassName: string; - isOptional?: boolean; -} - -interface SlotTestOverride { - slotName: string; - slotClassName?: string; -} - -export interface ConformanceOptions { - muiName: string; - classes: { root: string }; - refInstanceof: any; - after?: () => void; - inheritComponent?: React.ElementType; - render: (node: React.ReactElement) => MuiRenderResult | Promise; - only?: Array; - skip?: Array; - testComponentsRootPropWith?: string; - /** - * A custom React component to test if the component prop is implemented correctly. - * - * It must either: - * - Be a string that is a valid HTML tag, or - * - A component that spread props to the underlying rendered element. - * - * If not provided, the default 'em' element is used. - */ - testComponentPropWith?: string | React.ElementType; - testDeepOverrides?: SlotTestOverride | SlotTestOverride[]; - testRootOverrides?: SlotTestOverride; - testStateOverrides?: { prop?: string; value?: any; styleKey: string }; - testCustomVariant?: boolean; - testVariantProps?: object; - testLegacyComponentsProp?: boolean | string[]; - slots?: Record; - ThemeProvider?: React.ElementType; - /** - * If provided, the component will be tested by the `DefaultPropsProvider` (in addition to the ThemeProvider). - */ - DefaultPropsProvider?: React.ElementType; - createTheme?: (arg: any) => any; -} - -/** - * Glossary - * - root component: - * - renders the outermost host component - * - has the `root` class if the component has one - * - excess props are spread to this component - * - has the type of `inheritComponent` - */ - -export function randomStringValue() { - return `s${Math.random().toString(36).slice(2)}`; -} - -function throwMissingPropError(field: string): never { - throw new Error(`missing "${field}" in options - - > describeConformance(element, () => options) -`); -} - -/** - * MUI components have a `className` prop. The `className` is applied to - * the root component. - */ -export function testClassName( - element: React.ReactElement< - DataProps & { - className: string; - } - >, - getOptions: () => ConformanceOptions, -) { - it('applies the className to the root component', async () => { - const { render } = getOptions(); - - if (!render) { - throwMissingPropError('render'); - } - - const className = randomStringValue(); - const testId = randomStringValue(); - - const { getByTestId } = await render( - React.cloneElement(element, { className, 'data-testid': testId }), - ); - - expect(getByTestId(testId)).to.have.class(className); - }); -} - -/** - * MUI components have a `component` prop that allows rendering a different - * Component from @inheritComponent - */ -export function testComponentProp( - element: React.ReactElement< - DataProps & { - className: string; - component?: string | React.ElementType; - } - >, - getOptions: () => ConformanceOptions, -) { - describe('prop: component', () => { - it('can render another root component with the `component` prop', async () => { - const { render, testComponentPropWith: component = 'em' } = getOptions(); - if (!render) { - throwMissingPropError('render'); - } - - const testId = randomStringValue(); - - if (typeof component === 'string') { - const { getByTestId } = await render( - React.cloneElement(element, { component, 'data-testid': testId }), - ); - expect(getByTestId(testId)).not.to.equal(null); - expect(getByTestId(testId).nodeName.toLowerCase()).to.eq(component); - } else { - const componentWithTestId = (props: {}) => - React.createElement(component, { ...props, 'data-testid': testId }); - const { getByTestId } = await render( - React.cloneElement(element, { - component: componentWithTestId, - }), - ); - expect(getByTestId(testId)).not.to.equal(null); - } - }); - }); -} - -/** - * MUI components spread additional props to its root. - */ -export function testPropsSpread( - element: React.ReactElement< - DataProps & { - className: string; - component: string | React.ElementType; - } - >, - - getOptions: () => ConformanceOptions, -) { - it(`spreads props to the root component`, async () => { - // type def in ConformanceOptions - const { render } = getOptions(); - - if (!render) { - throwMissingPropError('render'); - } - - const testProp = 'data-test-props-spread'; - const value = randomStringValue(); - const testId = randomStringValue(); - - const { getByTestId } = await render( - React.cloneElement(element, { [testProp]: value, 'data-testid': testId }), - ); - - expect(getByTestId(testId)).to.have.attribute(testProp, value); - }); -} - -/** - * Tests that the `ref` of a component will return the correct instance - * - * This is determined by a given constructor i.e. a React.Component or HTMLElement for - * components that forward their ref and attach it to a host component. - */ -export function describeRef( - element: React.ReactElement<{ - ref: React.RefObject; - }>, - getOptions: () => ConformanceOptions, -) { - describe('ref', () => { - it(`attaches the ref`, async () => { - // type def in ConformanceOptions - const { render, refInstanceof } = getOptions(); - - if (!render) { - throwMissingPropError('render'); - } - - const ref = React.createRef(); - - await render(React.cloneElement(element, { ref })); - - expect(ref.current).to.be.instanceof(refInstanceof); - }); - }); -} - -/** - * Tests that the root component has the root class - */ -export function testRootClass( - element: React.ReactElement<{ - className: string; - classes: Record; - }>, - getOptions: () => ConformanceOptions, -) { - it('applies the root class to the root component if it has this class', async () => { - const { classes, render, skip } = getOptions(); - if (classes.root == null) { - return; - } - - const className = randomStringValue(); - const classesRootClassname = randomStringValue(); - const { container } = await render( - React.cloneElement(element, { - className, - classes: { ...classes, root: `${classes.root} ${classesRootClassname}` }, - }), - ); - - // we established that the root component renders the outermost host previously. We immediately - // jump to the host component because some components pass the `root` class - // to the `classes` prop of the root component. - // https://github.com/mui/material-ui/blob/f9896bcd129a1209153106296b3d2487547ba205/packages/material-ui/src/OutlinedInput/OutlinedInput.js#L101 - expect(container.firstChild).to.have.class(className); - expect(container.firstChild).to.have.class(classes.root); - expect(document.querySelectorAll(`.${classes.root}`).length).to.equal(1); - - // classes test only for @mui/material - if (!skip || !skip.includes('classesRoot')) { - // Test that classes prop works - expect(container.firstChild).to.have.class(classesRootClassname); - - // Test that `classes` does not spread to DOM - expect(document.querySelectorAll('[classes]').length).to.equal(0); - } - }); -} - -function forEachSlot( - slots: ConformanceOptions['slots'], - callback: (slotName: string, slot: SlotTestingOptions) => void, -) { - if (!slots) { - return; - } - - const slotNames = Object.keys(slots); - slotNames.forEach((slotName) => { - const slot = slots[slotName]; - callback(slotName, slot); - }); -} - -function testSlotsProp( - element: React.ReactElement<{ - className: string; - classes: Record; - slots: { - [x: string]: - | SlotTestingOptions['testWithComponent'] - | keyof React.JSX.IntrinsicElements - | React.ForwardRefExoticComponent< - { - children: React.ReactNode; - } & React.RefAttributes - >; - }; - components?: { - [x: string]: - | SlotTestingOptions['testWithComponent'] - | keyof React.JSX.IntrinsicElements - | React.ForwardRefExoticComponent< - { - children: React.ReactNode; - } & React.RefAttributes - >; - }; - slotProps: { - [x: string]: DataProps; - }; - componentsProps?: { - [x: string]: DataProps; - }; - }>, - getOptions: () => ConformanceOptions, -) { - const { render, slots, testLegacyComponentsProp } = getOptions(); - - const CustomComponent = React.forwardRef< - HTMLElement, - React.PropsWithChildren<{ className?: string }> - >(({ className, children }, ref) => ( - - {children} - - )); - - forEachSlot(slots, (slotName, slotOptions) => { - it(`allows overriding the ${slotName} slot with a component using the slots.${slotName} prop`, async () => { - if (!render) { - throwMissingPropError('render'); - } - - const slotComponent = slotOptions.testWithComponent ?? CustomComponent; - - const components = { - [slotName]: slotComponent, - }; - - const { queryByTestId } = await render(React.cloneElement(element, { slots: components })); - const renderedElement = queryByTestId('custom'); - expect(renderedElement).not.to.equal(null); - if (slotOptions.expectedClassName) { - expect(renderedElement).to.have.class(slotOptions.expectedClassName); - } - }); - - if (slotOptions.testWithElement !== null) { - it(`allows overriding the ${slotName} slot with an element using the slots.${slotName} prop`, async () => { - if (!render) { - throwMissingPropError('render'); - } - - const slotElement = slotOptions.testWithElement ?? 'i'; - - const components = { - [slotName]: slotElement, - }; - - const slotProps = { - [slotName]: { - 'data-testid': 'customized', - }, - }; - - const { queryByTestId } = await render( - React.cloneElement(element, { slots: components, slotProps }), - ); - - const renderedElement = queryByTestId('customized'); - expect(renderedElement).not.to.equal(null); - - if (typeof slotElement === 'string') { - expect(renderedElement!.nodeName.toLowerCase()).to.equal(slotElement); - } - if (slotOptions.expectedClassName) { - expect(renderedElement).to.have.class(slotOptions.expectedClassName); - } - }); - } - - // For testing Material UI components v5, and v6. Likely to be removed in a future major release. - if ( - testLegacyComponentsProp === true || - (Array.isArray(testLegacyComponentsProp) && testLegacyComponentsProp.includes(slotName)) - ) { - it(`allows overriding the ${slotName} slot with a component using the components.${capitalize( - slotName, - )} prop`, async () => { - if (!render) { - throwMissingPropError('render'); - } - - const slotComponent = slotOptions.testWithComponent ?? CustomComponent; - - const components = { - [capitalize(slotName)]: slotComponent, - }; - - const { queryByTestId } = await render(React.cloneElement(element, { components })); - const renderedElement = queryByTestId('custom'); - expect(renderedElement).not.to.equal(null); - if (slotOptions.expectedClassName) { - expect(renderedElement).to.have.class(slotOptions.expectedClassName); - } - }); - - it(`prioritizes the 'slots.${slotName}' over components.${capitalize( - slotName, - )} if both are defined`, async () => { - if (!render) { - throwMissingPropError('render'); - } - - const ComponentForComponentsProp = React.forwardRef< - HTMLDivElement, - { children: React.ReactNode } - >(({ children }, ref) => { - const SlotComponent = slotOptions.testWithComponent ?? 'div'; - return ( - - {children} - - ); - }); - - const ComponentForSlotsProp = React.forwardRef< - HTMLDivElement, - { children: React.ReactNode } - >(({ children }, ref) => { - const SlotComponent = slotOptions.testWithComponent ?? 'div'; - return ( - - {children} - - ); - }); - - const components = { - [capitalize(slotName)]: ComponentForComponentsProp, - }; - - const slotOverrides = { - [slotName]: ComponentForSlotsProp, - }; - - const { queryByTestId } = await render( - React.cloneElement(element, { components, slots: slotOverrides }), - ); - - expect(queryByTestId('from-slots')).not.to.equal(null); - expect(queryByTestId('from-components')).to.equal(null); - }); - - if (slotOptions.testWithElement !== null) { - it(`allows overriding the ${slotName} slot with an element using the components.${capitalize( - slotName, - )} prop`, async () => { - if (!render) { - throwMissingPropError('render'); - } - - const slotElement = slotOptions.testWithElement ?? 'i'; - - const components = { - [capitalize(slotName)]: slotElement, - }; - - const componentsProps = { - [slotName]: { - 'data-testid': 'customized', - }, - }; - - const { queryByTestId } = await render( - React.cloneElement(element, { components, componentsProps }), - ); - - const renderedElement = queryByTestId('customized'); - expect(renderedElement).not.to.equal(null); - - if (typeof slotElement === 'string') { - expect(renderedElement!.nodeName.toLowerCase()).to.equal(slotElement); - } - if (slotOptions.expectedClassName) { - expect(renderedElement).to.have.class(slotOptions.expectedClassName); - } - }); - } - } - }); -} - -function testSlotPropsProp( - element: React.ReactElement<{ - componentsProps?: Record; - slotProps: Record; - }>, - getOptions: () => ConformanceOptions, -) { - const { render, slots, testLegacyComponentsProp } = getOptions(); - - if (!render) { - throwMissingPropError('render'); - } - - forEachSlot(slots, (slotName, slotOptions) => { - it(`sets custom properties on the ${slotName} slot's element with the slotProps.${slotName} prop`, async () => { - const slotProps = { - [slotName]: { - 'data-testid': 'custom', - }, - }; - - const { queryByTestId } = await render(React.cloneElement(element, { slotProps })); - const slotComponent = queryByTestId('custom'); - expect(slotComponent).not.to.equal(null); - - if (slotOptions.expectedClassName) { - expect(slotComponent).to.have.class(slotOptions.expectedClassName); - } - }); - - if (slotOptions.expectedClassName) { - it(`merges the class names provided in slotsProps.${slotName} with the built-in ones`, async () => { - const slotProps = { - [slotName]: { - 'data-testid': 'custom', - className: randomStringValue(), - }, - }; - - const { getByTestId } = await render(React.cloneElement(element, { slotProps })); - - expect(getByTestId('custom')).to.have.class(slotOptions.expectedClassName); - expect(getByTestId('custom')).to.have.class(slotProps[slotName].className); - }); - } - - if ( - testLegacyComponentsProp === true || - (Array.isArray(testLegacyComponentsProp) && testLegacyComponentsProp.includes(slotName)) - ) { - it(`sets custom properties on the ${slotName} slot's element with the componentsProps.${slotName} prop`, async () => { - const componentsProps = { - [slotName]: { - 'data-testid': 'custom', - }, - }; - - const { queryByTestId } = await render(React.cloneElement(element, { componentsProps })); - const slotComponent = queryByTestId('custom'); - expect(slotComponent).not.to.equal(null); - - if (slotOptions.expectedClassName) { - expect(slotComponent).to.have.class(slotOptions.expectedClassName); - } - }); - - it(`prioritizes the 'slotProps.${slotName}' over componentsProps.${slotName} if both are defined`, async () => { - const componentsProps = { - [slotName]: { - 'data-testid': 'custom', - 'data-from-components-props': 'true', - }, - }; - - const slotProps = { - [slotName]: { - 'data-testid': 'custom', - 'data-from-slot-props': 'true', - }, - }; - - const { queryByTestId } = await render( - React.cloneElement(element, { componentsProps, slotProps }), - ); - const slotComponent = queryByTestId('custom'); - expect(slotComponent).to.have.attribute('data-from-slot-props', 'true'); - expect(slotComponent).not.to.have.attribute('data-from-components-props'); - }); - } - }); -} - -function testSlotPropsCallback( - element: React.ReactElement<{ - slotProps: Record DataProps>; - className: string; - }>, - getOptions: () => ConformanceOptions, -) { - const { render, slots } = getOptions(); - - if (!render) { - throwMissingPropError('render'); - } - - forEachSlot(slots, (slotName) => { - it(`sets custom properties on the ${slotName} slot's element with the slotProps.${slotName} callback`, async () => { - const slotProps = { - [slotName]: () => ({ - 'data-testid': 'custom', - }), - }; - - const { queryByTestId } = await render( - React.cloneElement(element, { slotProps, className: 'custom' }), - ); - const slotComponent = queryByTestId('custom'); - expect(slotComponent).not.to.equal(null); - }); - }); -} - -function testSlotPropsCallbackWithPropsAsOwnerState( - element: React.ReactElement<{ - slotProps: Record) => DataProps>; - className: string; - }>, - getOptions: () => ConformanceOptions, -) { - const { render, slots } = getOptions(); - - if (!render) { - throwMissingPropError('render'); - } - - forEachSlot(slots, (slotName) => { - it(`sets custom properties on the ${slotName} slot's element with the slotProps.${slotName} callback using the ownerState`, async () => { - const slotProps = { - [slotName]: (ownerState: Record) => ({ - 'data-testid': ownerState.className, - }), - }; - - const { queryByTestId } = await render( - React.cloneElement(element, { slotProps, className: 'custom' }), - ); - const slotComponent = queryByTestId('custom', { exact: false }); - expect(slotComponent).not.to.equal(null); - }); - }); -} - -/** - * MUI components have a `components` prop that allows rendering a different - * Components from @inheritComponent - */ -function testComponentsProp( - element: React.ReactElement< - { - components?: Record; - } & DataProps - >, - getOptions: () => ConformanceOptions, -) { - describe('prop components:', () => { - it('can render another root component with the `components` prop', async () => { - const { render, testComponentsRootPropWith: component = 'em' } = getOptions(); - if (!render) { - throwMissingPropError('render'); - } - - const testId = randomStringValue(); - - const { getByTestId } = await render( - React.cloneElement(element, { components: { Root: component }, 'data-testid': testId }), - ); - expect(getByTestId(testId)).not.to.equal(null); - expect(getByTestId(testId).nodeName.toLowerCase()).to.eq(component); - }); - }); -} - -/** - * MUI theme has a components section that allows specifying default props. - * Components from @inheritComponent - */ -function testThemeDefaultProps( - element: React.ReactElement, - getOptions: () => ConformanceOptions, -) { - describe('theme default components:', () => { - it("respect theme's defaultProps", async () => { - const testProp = 'data-id'; - const { muiName, render, ThemeProvider, createTheme } = getOptions(); - - if (!muiName) { - throwMissingPropError('muiName'); - } - - if (!render) { - throwMissingPropError('render'); - } - - if (!ThemeProvider) { - throwMissingPropError('ThemeProvider'); - } - - if (!createTheme) { - throwMissingPropError('createTheme'); - } - - const theme = createTheme({ - components: { - [muiName]: { - defaultProps: { - [testProp]: 'testProp', - }, - }, - }, - }); - - const { container } = await render({element}); - - expect(container.firstChild).to.have.attribute(testProp, 'testProp'); - }); - }); - - describe('default props provider:', () => { - const { muiName, render, DefaultPropsProvider } = getOptions(); - - it.skipIf(!DefaultPropsProvider)('respect custom default props', async function test() { - const testProp = 'data-id'; - - if (!muiName) { - throwMissingPropError('muiName'); - } - - if (!render) { - throwMissingPropError('render'); - } - - const { container } = await render( - // @ts-expect-error we skip it above. - - {element} - , - ); - - expect(container.firstChild).to.have.attribute(testProp, 'testProp'); - }); - }); -} - -/** - * MUI theme has a components section that allows specifying style overrides. - * Components from @inheritComponent - */ -function testThemeStyleOverrides( - element: React.ReactElement, - getOptions: () => ConformanceOptions, -) { - describe('theme style overrides:', () => { - it.skipIf(window.navigator.userAgent.includes('jsdom'))( - "respect theme's styleOverrides custom state", - async function test() { - const { muiName, testStateOverrides, render, ThemeProvider, createTheme } = getOptions(); - - if (!testStateOverrides) { - return; - } - - if (!muiName) { - throwMissingPropError('muiName'); - } - - if (!render) { - throwMissingPropError('render'); - } - - if (!ThemeProvider) { - throwMissingPropError('ThemeProvider'); - } - - if (!createTheme) { - throwMissingPropError('createTheme'); - } - - const testStyle = { - marginTop: '13px', - }; - - const theme = createTheme({ - components: { - [muiName]: { - styleOverrides: { - [testStateOverrides.styleKey]: testStyle, - }, - }, - }, - }); - - if (!testStateOverrides.prop) { - return; - } - - const { container } = await render( - - {React.cloneElement(element, { - [testStateOverrides.prop]: testStateOverrides.value, - })} - , - ); - - expect(container.firstChild).to.toHaveComputedStyle(testStyle); - }, - ); - - it.skipIf(window.navigator.userAgent.includes('jsdom'))( - "respect theme's styleOverrides slots", - async function test() { - const { - muiName, - testDeepOverrides, - testRootOverrides = { slotName: 'root' }, - render, - ThemeProvider, - createTheme, - } = getOptions(); - - if (!ThemeProvider) { - throwMissingPropError('ThemeProvider'); - } - - if (!createTheme) { - throwMissingPropError('createTheme'); - } - - const testStyle = { - mixBlendMode: 'darken', - }; - - function resolveDeepOverrides( - callback: (styles: Record, slot: SlotTestOverride) => void, - ) { - if (!testDeepOverrides) { - return {}; - } - const styles = {}; - if (Array.isArray(testDeepOverrides)) { - testDeepOverrides.forEach((slot) => { - callback(styles, slot); - }); - } else { - callback(styles, testDeepOverrides); - } - return styles; - } - - const theme = createTheme({ - components: { - [muiName]: { - styleOverrides: { - [testRootOverrides.slotName]: { - ...testStyle, - ...resolveDeepOverrides((styles, slot) => { - styles[`& .${slot.slotClassName}`] = { - fontVariantCaps: 'all-petite-caps', - }; - }), - }, - ...resolveDeepOverrides((styles, slot) => { - styles[slot.slotName] = { - mixBlendMode: 'darken', - }; - }), - }, - }, - }, - }); - - const { container, setProps } = await render( - {element}, - ); - - if (testRootOverrides.slotClassName) { - expect( - document.querySelector(`.${testRootOverrides.slotClassName}`), - ).to.toHaveComputedStyle(testStyle); - } else { - expect(container.firstChild).to.toHaveComputedStyle(testStyle); - } - - if (testDeepOverrides) { - (Array.isArray(testDeepOverrides) ? testDeepOverrides : [testDeepOverrides]).forEach( - (slot) => { - expect(document.querySelector(`.${slot.slotClassName}`)).to.toHaveComputedStyle({ - fontVariantCaps: 'all-petite-caps', - mixBlendMode: 'darken', - }); - }, - ); - - const themeWithoutRootOverrides = createTheme({ - components: { - [muiName]: { - styleOverrides: { - ...resolveDeepOverrides((styles, slot) => { - styles[slot.slotName] = testStyle; - }), - }, - }, - }, - }); - - setProps({ theme: themeWithoutRootOverrides }); - - (Array.isArray(testDeepOverrides) ? testDeepOverrides : [testDeepOverrides]).forEach( - (slot) => { - expect(document.querySelector(`.${slot.slotClassName}`)).to.toHaveComputedStyle( - testStyle, - ); - }, - ); - } - }, - ); - - it.skipIf(window.navigator.userAgent.includes('jsdom'))( - 'overrideStyles does not replace each other in slots', - async function test() { - const { muiName, classes, testStateOverrides, render, ThemeProvider, createTheme } = - getOptions(); - - if (!ThemeProvider) { - throwMissingPropError('ThemeProvider'); - } - - if (!createTheme) { - throwMissingPropError('createTheme'); - } - - const classKeys = Object.keys(classes); - - // only test the component that has `root` and other classKey - if (!testStateOverrides || !classKeys.includes('root') || classKeys.length === 1) { - return; - } - - // `styleKey` in some tests is `foo` or `bar`, so need to check if it is a valid classKey. - const isStyleKeyExists = classKeys.includes(testStateOverrides.styleKey); - - if (!isStyleKeyExists) { - return; - } - - const theme = createTheme({ - components: { - [muiName]: { - styleOverrides: { - root: { - [`&.${classes.root}`]: { - filter: 'blur(1px)', - mixBlendMode: 'darken', - }, - }, - ...(testStateOverrides && { - [testStateOverrides.styleKey]: { - [`&.${classes.root}`]: { - mixBlendMode: 'color', - }, - }, - }), - }, - }, - }, - }); - - if (!testStateOverrides.prop) { - return; - } - - await render( - - {React.cloneElement(element, { - [testStateOverrides.prop]: testStateOverrides.value, - })} - , - ); - - expect(document.querySelector(`.${classes.root}`)).toHaveComputedStyle({ - filter: 'blur(1px)', // still valid in root - mixBlendMode: 'color', // overridden by `styleKey` - }); - }, - ); - }); -} - -/** - * MUI theme has a components section that allows specifying custom variants. - * Components from @inheritComponent - */ -function testThemeVariants( - element: React.ReactElement, - getOptions: () => ConformanceOptions, -) { - describe('theme variants:', () => { - it.skipIf(window.navigator.userAgent.includes('jsdom'))( - "respect theme's variants", - async function test() { - const { muiName, testVariantProps, render, ThemeProvider, createTheme } = getOptions(); - - if (!testVariantProps) { - throw new Error('missing testVariantProps'); - } - - if (!muiName) { - throwMissingPropError('muiName'); - } - - if (!render) { - throwMissingPropError('render'); - } - - if (!ThemeProvider) { - throwMissingPropError('ThemeProvider'); - } - - if (!createTheme) { - throwMissingPropError('createTheme'); - } - - const testStyle = { - mixBlendMode: 'darken', - }; - - const theme = createTheme({ - components: { - [muiName]: { - variants: [ - { - props: testVariantProps, - style: testStyle, - }, - ], - }, - }, - }); - - const { getByTestId } = await render( - - {React.cloneElement(element, { ...testVariantProps, 'data-testid': 'with-props' })} - {React.cloneElement(element, { 'data-testid': 'without-props' })} - , - ); - - expect(getByTestId('with-props')).to.toHaveComputedStyle(testStyle); - expect(getByTestId('without-props')).not.to.toHaveComputedStyle(testStyle); - }, - ); - - it.skipIf(window.navigator.userAgent.includes('jsdom'))( - 'supports custom variant', - async function test() { - const { muiName, testCustomVariant, render, ThemeProvider, createTheme } = getOptions(); - - if (!ThemeProvider) { - throwMissingPropError('ThemeProvider'); - } - - if (!createTheme) { - throwMissingPropError('createTheme'); - } - - if (!testCustomVariant) { - return; - } - - const theme = createTheme({ - components: { - [muiName]: { - styleOverrides: { - root: ({ ownerState }: { ownerState: any }) => ({ - ...(ownerState.variant === 'unknown' && { - mixBlendMode: 'darken', - }), - }), - }, - }, - }, - }); - - const { getByTestId } = await render( - - {React.cloneElement(element, { variant: 'unknown', 'data-testid': 'custom-variant' })} - , - ); - - expect(getByTestId('custom-variant')).toHaveComputedStyle({ mixBlendMode: 'darken' }); - }, - ); - }); -} - -/** - * MUI theme supports custom palettes. - * The components that iterate over the palette via `variants` should be able to render with or without applying the custom palette styles. - */ -function testThemeCustomPalette( - element: React.ReactElement, - getOptions: () => ConformanceOptions, -) { - describe('theme extended palette:', () => { - const { render, ThemeProvider, createTheme } = getOptions(); - it.skipIf( - !window.navigator.userAgent.includes('jsdom') || !render || !ThemeProvider || !createTheme, - )('should render without errors', function test() { - // @ts-ignore - const theme = createTheme({ - palette: { - custom: { - main: '#ff5252', - }, - unknown: null, - custom2: { - main: { - blue: { - dark: '#FFCC00', - }, - }, - }, - }, - }); - // @ts-ignore - expect(() => render({element})).not.to.throw(); - }); - }); -} - -const fullSuite = { - componentProp: testComponentProp, - componentsProp: testComponentsProp, - mergeClassName: testClassName, - propsSpread: testPropsSpread, - refForwarding: describeRef, - rootClass: testRootClass, - slotPropsProp: testSlotPropsProp, - slotPropsCallback: testSlotPropsCallback, - slotPropsCallbackWithPropsAsOwnerState: testSlotPropsCallbackWithPropsAsOwnerState, - slotsProp: testSlotsProp, - themeDefaultProps: testThemeDefaultProps, - themeStyleOverrides: testThemeStyleOverrides, - themeVariants: testThemeVariants, - themeCustomPalette: testThemeCustomPalette, -}; - -/** - * Tests various aspects of a component that should be equal across MUI - * components. - */ -function describeConformance( - minimalElement: React.ReactElement, - getOptions: () => ConformanceOptions, -) { - let originalMatchmedia: typeof window.matchMedia; - const storage: Record = {}; - beforeEach(() => { - originalMatchmedia = window.matchMedia; - // Create mocks of localStorage getItem and setItem functions - Object.defineProperty(globalThis, 'localStorage', { - value: { - getItem: (key: string) => storage[key], - setItem: (key: string, value: string) => { - storage[key] = value; - }, - }, - configurable: true, - }); - window.matchMedia = () => - ({ - // Keep mocking legacy methods because @mui/material v5 still uses them - addListener: () => {}, - addEventListener: () => {}, - removeListener: () => {}, - removeEventListener: () => {}, - }) as unknown as MediaQueryList; - }); - afterEach(() => { - window.matchMedia = originalMatchmedia; - }); - const { - after: runAfterHook = () => {}, - only = Object.keys(fullSuite), - slots, - skip = [], - } = getOptions(); - - let filteredTests = Object.keys(fullSuite).filter( - (testKey) => only.includes(testKey) && !skip.includes(testKey as keyof typeof fullSuite), - ) as (keyof typeof fullSuite)[]; - - const slotBasedTests = [ - 'slotsProp', - 'slotPropsProp', - 'slotPropsCallback', - 'slotPropsCallbackWithPropsAsOwnerState', - ]; - - if (!slots) { - // if `slots` are not defined, do not run tests that depend on them - filteredTests = filteredTests.filter((testKey) => !slotBasedTests.includes(testKey)); - } - - afterAll(runAfterHook); - - filteredTests.forEach((testKey) => { - const test = fullSuite[testKey]; - test(minimalElement, getOptions); - }); -} - -export default createDescribe('MUI component API', describeConformance); diff --git a/packages-internal/test-utils/src/env.ts b/packages-internal/test-utils/src/env.ts deleted file mode 100644 index a81ddeb9b74e5b..00000000000000 --- a/packages-internal/test-utils/src/env.ts +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable import/prefer-default-export */ - -export function isJsdom() { - return window.navigator.userAgent.includes('jsdom'); -} diff --git a/packages-internal/test-utils/src/fireDiscreteEvent.ts b/packages-internal/test-utils/src/fireDiscreteEvent.ts deleted file mode 100644 index 245b65ed4e29fd..00000000000000 --- a/packages-internal/test-utils/src/fireDiscreteEvent.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { configure, fireEvent, getConfig } from '@testing-library/react/pure'; -import reactMajor from './reactMajor'; - -const noWrapper = (callback: () => void) => callback(); - -/** - * @param {() => void} callback - * @returns {void} - */ -function withMissingActWarningsIgnored(callback: () => void) { - if (reactMajor >= 18) { - callback(); - return; - } - - const originalConsoleError = console.error; - console.error = function silenceMissingActWarnings(message, ...args) { - const isMissingActWarning = /not wrapped in act\(...\)/.test(message); - if (!isMissingActWarning) { - originalConsoleError.call(console, message, ...args); - } - }; - - const originalConfig = getConfig(); - configure({ - eventWrapper: noWrapper, - }); - - try { - callback(); - } finally { - configure(originalConfig); - console.error = originalConsoleError; - } -} - -// ----------------------------------------- -// WARNING ⚠️ WARNING ⚠️ WARNING ⚠️ WARNING -// -// Do not add events here because you want to ignore "missing act()" warnings. -// Only add events if you made sure that React actually considers these as "discrete". -// Be aware that "discrete events" are an implementation detail of React. -// To test discrete events we cannot use `fireEvent` from `@testing-library/react` because they are all wrapped in `act`. -// `act` overrides the "discrete event" semantics with "batching" semantics: https://github.com/facebook/react/blob/3fbd47b86285b6b7bdeab66d29c85951a84d4525/packages/react-reconciler/src/ReactFiberWorkLoop.old.js#L1061-L1064 -// Note that using `fireEvent` from `@testing-library/dom` would not work since /react configures both `fireEvent` to use `act` as a wrapper. -// ----------------------------------------- - -export function click(...args: Parameters<(typeof fireEvent)['click']>) { - return withMissingActWarningsIgnored(() => { - fireEvent.click(...args); - }); -} - -export function keyDown(...args: Parameters<(typeof fireEvent)['keyDown']>) { - return withMissingActWarningsIgnored(() => { - fireEvent.keyDown(...args); - }); -} - -export function keyUp(...args: Parameters<(typeof fireEvent)['keyUp']>) { - return withMissingActWarningsIgnored(() => { - fireEvent.keyUp(...args); - }); -} - -export function mouseDown(...args: Parameters<(typeof fireEvent)['mouseDown']>) { - return withMissingActWarningsIgnored(() => { - fireEvent.mouseDown(...args); - }); -} - -export function mouseUp(...args: Parameters<(typeof fireEvent)['mouseUp']>) { - return withMissingActWarningsIgnored(() => { - fireEvent.mouseUp(...args); - }); -} diff --git a/packages-internal/test-utils/src/flushMicrotasks.ts b/packages-internal/test-utils/src/flushMicrotasks.ts deleted file mode 100644 index 9e56cad307e441..00000000000000 --- a/packages-internal/test-utils/src/flushMicrotasks.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { act } from './createRenderer'; - -export default async function flushMicrotasks() { - await act(async () => {}); -} diff --git a/packages-internal/test-utils/src/focusVisible.ts b/packages-internal/test-utils/src/focusVisible.ts deleted file mode 100644 index af0ef8dfc5c2c8..00000000000000 --- a/packages-internal/test-utils/src/focusVisible.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { act, fireEvent } from './createRenderer'; - -export default function focusVisible(element: HTMLElement) { - act(() => { - element.blur(); - }); - fireEvent.keyDown(document.body, { key: 'Tab' }); - act(() => { - element.focus(); - }); -} - -export function simulatePointerDevice() { - // first focus on a page triggers focus visible until a pointer event - // has been dispatched - fireEvent.pointerDown(document.body); -} - -export function simulateKeyboardDevice() { - fireEvent.keyDown(document.body, { key: 'TAB' }); -} - -/** - * See https://issues.chromium.org/issues/40719291 for more details. - */ -export function programmaticFocusTriggersFocusVisible(): boolean { - try { - // So far this only applies to Chrome 86 beta which is the only tested browser supporting this pseudo class. - document.createElement('button').matches(':focus-visible'); - return true; - } catch (error) { - return false; - } -} diff --git a/packages-internal/test-utils/src/index.ts b/packages-internal/test-utils/src/index.ts deleted file mode 100644 index 90d56a2348e802..00000000000000 --- a/packages-internal/test-utils/src/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from 'react'; - -export * from './components'; -export { default as describeConformance } from './describeConformance'; -export * from './describeConformance'; -export { default as createDescribe } from './createDescribe'; -export * from './createRenderer'; -export { - default as focusVisible, - simulatePointerDevice, - simulateKeyboardDevice, - programmaticFocusTriggersFocusVisible, -} from './focusVisible'; -export {} from './initMatchers'; -export * as fireDiscreteEvent from './fireDiscreteEvent'; -export { default as flushMicrotasks } from './flushMicrotasks'; -export { default as reactMajor } from './reactMajor'; -export * from './env'; - -/** - * Set to true if console logs during [lifecycles that are invoked twice in `React.StrictMode`](https://reactjs.org/docs/strict-mode.html#detecting-unexpected-side-effects) are suppressed. - * Useful for asserting on `console.warn` or `console.error` via `toErrorDev()`. - * TODO: Refactor to use reactMajor when fixing the React 17 cron test. - * https://github.com/mui/material-ui/issues/43153 - */ -export const strictModeDoubleLoggingSuppressed = React.version.startsWith('17'); diff --git a/packages-internal/test-utils/src/init.js b/packages-internal/test-utils/src/init.js deleted file mode 100644 index 85e2fe80a5eb6c..00000000000000 --- a/packages-internal/test-utils/src/init.js +++ /dev/null @@ -1,11 +0,0 @@ -import * as testingLibrary from '@testing-library/react/pure'; -import './initMatchers'; - -// checking if an element is hidden is quite expensive -// this is only done in CI as a fail safe. It can still explicitly be checked -// in the test files which helps documenting what is part of the DOM but hidden -// from assistive technology -const defaultHidden = !process.env.CI; -// adds verbosity for something that might be confusing -console.warn(`${defaultHidden ? 'including' : 'excluding'} inaccessible elements by default`); -testingLibrary.configure({ defaultHidden }); diff --git a/packages-internal/test-utils/src/initMatchers.test.js b/packages-internal/test-utils/src/initMatchers.test.js deleted file mode 100644 index 7af2d04adb5b8c..00000000000000 --- a/packages-internal/test-utils/src/initMatchers.test.js +++ /dev/null @@ -1,124 +0,0 @@ -import { expect } from 'chai'; -import { createSandbox } from 'sinon'; - -describe('custom matchers', () => { - const consoleSandbox = createSandbox(); - - beforeEach(() => { - // otherwise our global setup throws on unexpected calls in afterEach - consoleSandbox.stub(console, 'warn'); - consoleSandbox.stub(console, 'error'); - }); - - afterEach(() => { - consoleSandbox.restore(); - }); - - describe('toErrorDev()', () => { - it('passes if the message is exactly the same', () => { - expect(() => console.error('expected message')).toErrorDev('expected message'); - }); - - it('passes if the message is a subset', () => { - expect(() => console.error('expected message')).toErrorDev('pected messa'); - }); - - it('passes if multiple messages are expected', () => { - expect(() => { - console.error('expected message'); - console.error('another message'); - }).toErrorDev(['expected message', 'another message']); - }); - - it("fails if an expected console.error call wasn't recorded with a useful stacktrace", () => { - let caughtError; - try { - console.error('expected message'); - expect(() => {}).toErrorDev('expected message'); - } catch (error) { - caughtError = error; - } - - expect(caughtError).to.have.property('stack'); - expect(caughtError.stack).to.include( - 'Could not match the following console.error calls. ' + - "Make sure previous actions didn't call console.error by wrapping them in expect(() => {}).not.toErrorDev(): \n\n" + - ' - "expected message"\n', - ); - // check that the top stackframe points to this test - // if this test is moved to another file the next assertion fails - expect(caughtError.stack).to.match( - /- "expected message"\s+at .*\/initMatchers\.test\.js:\d+:\d+/, - ); - }); - - it('is case sensitive', () => { - let caughtError; - try { - expect(() => console.error('expected Message')).toErrorDev('expected message'); - } catch (error) { - caughtError = error; - } - - expect(caughtError).to.have.property('stack'); - expect(caughtError.stack).to.include( - 'Recorded unexpected console.error calls: \n\n' + - ' - Expected #1 "expected message" to be included in \n' + - '"expected Message"\n', - ); - // check that the top stackframe points to this test - // if this test is moved to another file the next assertion fails - expect(caughtError.stack).to.match( - /"expected Message"\s+at .*\/initMatchers\.test\.js:\d+:\d+/, - ); - }); - - it('fails if the order of calls does not match', () => { - expect(() => { - expect(() => { - console.error('another message'); - console.error('expected message'); - }).toErrorDev(['expected message', 'another message']); - }).to.throw('Recorded unexpected console.error calls'); - }); - - it('fails if there are fewer messages than expected', () => { - expect(() => { - expect(() => { - console.error('expected message'); - }).toErrorDev(['expected message', 'another message']); - }).to.throw('Could not match the following console.error calls'); - }); - - it('passes if no messages were recorded if expected', () => { - expect(() => {}).not.toErrorDev(); - expect(() => {}).not.toErrorDev([]); - }); - - it('fails if no arguments are used as a way of negating', () => { - expect(() => { - expect(() => {}).toErrorDev(); - }).to.throw( - "Expected to call console.error but didn't provide messages. " + - "If you don't expect any messages prefer `expect().not.toErrorDev();", - ); - }); - - it('fails if arguments are passed when negated', () => { - expect(() => { - expect(() => {}).not.toErrorDev('not unexpected?'); - }).to.throw( - 'Expected no call to console.error but provided messages. ' + - "If you want to make sure a certain message isn't logged prefer the positive. " + - 'By expecting certain messages you automatically expect that no other messages are logged', - ); - }); - - it('ignores `false` messages', () => { - const isReact16 = false; - expect(() => { - expect(() => {}).toErrorDev([isReact16 && 'some legacy error message']); - }).not.to.throw(); - }); - }); -}); diff --git a/packages-internal/test-utils/src/initMatchers.ts b/packages-internal/test-utils/src/initMatchers.ts deleted file mode 100644 index 5f15eefb55e48d..00000000000000 --- a/packages-internal/test-utils/src/initMatchers.ts +++ /dev/null @@ -1,7 +0,0 @@ -import * as chai from 'chai'; -import chaiDom from 'chai-dom'; -import './chai.types'; -import chaiPlugin from './chaiPlugin'; - -chai.use(chaiDom); -chai.use(chaiPlugin); diff --git a/packages-internal/test-utils/src/initPlaywrightMatchers.ts b/packages-internal/test-utils/src/initPlaywrightMatchers.ts deleted file mode 100644 index 74f70e7e1dcea8..00000000000000 --- a/packages-internal/test-utils/src/initPlaywrightMatchers.ts +++ /dev/null @@ -1,98 +0,0 @@ -import * as chai from 'chai'; -import * as DomTestingLibrary from '@testing-library/dom'; -import type { ElementHandle } from '@playwright/test'; -import { AssertionError } from 'assertion-error'; - -// https://stackoverflow.com/a/46755166/3406963 -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Chai { - interface Assertion { - /** - * Checks if the element handle is actually focused i.e. the element handle is pointing to `document.activeElement`. - */ - toHaveFocus(): Promise; - /** - * Checks if the element handle has the given attribute. - * @example expect($element).toHaveAttribute('aria-expanded') is like `[aria-expanded]` CSS selector - * @example expect($element).toHaveAttribute('aria-expanded', 'true') is like `[aria-expanded="true"]` CSS selector - */ - toHaveAttribute(attributeName: string, attributeValue?: string): Promise; - } - } - - interface Window { - DomTestingLibrary: typeof DomTestingLibrary; - /** - * @example $element.evaluate(element => window.pageElementToString(element)) - */ - elementToString(element: Node | null | undefined): string | false; - } -} - -chai.use((chaiAPI, utils) => { - chai.Assertion.addMethod('toHaveFocus', async function elementHandleIsFocused() { - const $elementOrHandle: ElementHandle | Promise = utils.flag(this, 'object'); - if ($elementOrHandle == null) { - throw new AssertionError(`Expected an element handle but got ${String($elementOrHandle)}.`); - } - const $element = - typeof ($elementOrHandle as Promise).then === 'function' - ? await ($elementOrHandle as Promise) - : ($elementOrHandle as ElementHandle); - - const { isFocused, stringifiedActiveElement, stringifiedElement } = await $element.evaluate( - (element) => { - const activeElement = - element.ownerDocument !== null ? element.ownerDocument.activeElement : null; - return { - isFocused: activeElement === element, - stringifiedElement: window.elementToString(element), - stringifiedActiveElement: window.elementToString(activeElement), - }; - }, - ); - - this.assert( - isFocused, - `expected element to have focus`, - `expected element to NOT have focus \n${stringifiedElement}`, - stringifiedElement, - stringifiedActiveElement, - ); - }); - - chai.Assertion.addMethod( - 'toHaveAttribute', - async function elementHandleHasAttribute(attributeName: string, attributeValue?: string) { - const $elementOrHandle: ElementHandle | Promise = utils.flag(this, 'object'); - if ($elementOrHandle == null) { - throw new AssertionError(`Expected an element handle but got ${String($elementOrHandle)}.`); - } - const $element = - typeof ($elementOrHandle as Promise).then === 'function' - ? await ($elementOrHandle as Promise) - : ($elementOrHandle as ElementHandle); - - const actualAttributeValue = await $element.getAttribute(attributeName); - - if (attributeValue === undefined) { - this.assert( - actualAttributeValue !== null, - `expected element to have attribute \`${attributeName}\``, - `expected element to NOT have attribute \`${attributeName}\``, - null, - null, - ); - } else { - this.assert( - actualAttributeValue === attributeValue, - `expected element to have attribute \`${attributeName}="${attributeValue}"\``, - `expected element to NOT have attribute \`${attributeName}="${attributeValue}"\``, - attributeValue, - actualAttributeValue, - ); - } - }, - ); -}); diff --git a/packages-internal/test-utils/src/setup.js b/packages-internal/test-utils/src/setup.js deleted file mode 100644 index b0886c0e59254a..00000000000000 --- a/packages-internal/test-utils/src/setup.js +++ /dev/null @@ -1,10 +0,0 @@ -const testingLibrary = require('@testing-library/dom'); -const createDOM = require('./createDOM'); - -createDOM(); -require('./init'); - -testingLibrary.configure({ - // JSDOM logs errors otherwise on `getComputedStyle(element, pseudoElement)` calls. - computedStyleSupportsPseudoElements: false, -}); diff --git a/packages-internal/test-utils/src/setupVitest.ts b/packages-internal/test-utils/src/setupVitest.ts deleted file mode 100644 index a7896a1aa8e348..00000000000000 --- a/packages-internal/test-utils/src/setupVitest.ts +++ /dev/null @@ -1,36 +0,0 @@ -import failOnConsole from 'vitest-fail-on-console'; -import * as chai from 'chai'; -import './chai.types'; -import chaiPlugin from './chaiPlugin'; - -chai.use(chaiPlugin); - -failOnConsole({ - silenceMessage: (message: string) => { - if (process.env.NODE_ENV === 'production') { - // TODO: mock scheduler - if (message.includes('act(...) is not supported in production builds of React')) { - return true; - } - } - - if (message.includes('Warning: useLayoutEffect does nothing on the server')) { - // Controversial warning that is commonly ignored by switching to `useEffect` on the server. - // https://github.com/facebook/react/issues/14927 - // However, this switch doesn't work since it relies on environment sniffing and we test SSR in a browser environment. - return true; - } - - // Unclear why this is an issue for the current occurrences of this warning. - // TODO: Revisit once https://github.com/facebook/react/issues/22796 is resolved - if ( - message.includes( - 'Detected multiple renderers concurrently rendering the same context provider.', - ) - ) { - return true; - } - - return false; - }, -}); diff --git a/packages-internal/test-utils/src/setupVitestBrowser.ts b/packages-internal/test-utils/src/setupVitestBrowser.ts deleted file mode 100644 index e3a0ce06df95fd..00000000000000 --- a/packages-internal/test-utils/src/setupVitestBrowser.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as chai from 'chai'; -import chaiDom from 'chai-dom'; - -chai.use(chaiDom); - -// Enable missing act warnings: https://github.com/reactwg/react-18/discussions/102 -(globalThis as any).jest = null; -(globalThis as any).IS_REACT_ACT_ENVIRONMENT = true; - -if (window.navigator.userAgent.includes('jsdom')) { - // Not yet supported: https://github.com/jsdom/jsdom/issues/2152 - (globalThis as any).window.Touch = class Touch { - instance: any; - - constructor(instance: any) { - this.instance = instance; - } - - get identifier() { - return this.instance.identifier; - } - - get pageX() { - return this.instance.pageX; - } - - get pageY() { - return this.instance.pageY; - } - - get clientX() { - return this.instance.clientX; - } - - get clientY() { - return this.instance.clientY; - } - }; -} diff --git a/packages-internal/test-utils/tsconfig.build.json b/packages-internal/test-utils/tsconfig.build.json deleted file mode 100644 index ad660fff8c5d2a..00000000000000 --- a/packages-internal/test-utils/tsconfig.build.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./build", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "noEmit": false, - "composite": true, - "tsBuildInfoFile": "./build/.tsbuildinfo", - "target": "ES2020", - "types": ["node"], - "allowJs": true - } -} diff --git a/packages-internal/test-utils/tsconfig.json b/packages-internal/test-utils/tsconfig.json deleted file mode 100644 index 15e1f987ac763c..00000000000000 --- a/packages-internal/test-utils/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "lib": ["es2020", "dom"], - "noEmit": true, - "module": "nodenext", - "moduleResolution": "nodenext", - "types": ["node"], - "strict": true, - "esModuleInterop": true, - "isolatedModules": true, - "jsx": "react", - // Remove when https://github.com/thomasbrodusch/vitest-fail-on-console/issues/160 is resolved - "skipLibCheck": true - }, - "include": ["./src/**/*"] -} diff --git a/packages-internal/test-utils/vitest.config.mts b/packages-internal/test-utils/vitest.config.mts deleted file mode 100644 index f1f21ca13ccdd6..00000000000000 --- a/packages-internal/test-utils/vitest.config.mts +++ /dev/null @@ -1,4 +0,0 @@ -// eslint-disable-next-line import/no-relative-packages -import sharedConfig from '../../vitest.shared.mts'; - -export default sharedConfig(import.meta.url, { jsdom: true }); diff --git a/packages/mui-joy/package.json b/packages/mui-joy/package.json index 5ae8597ed29897..8227d47e7cc1ed 100644 --- a/packages/mui-joy/package.json +++ b/packages/mui-joy/package.json @@ -40,7 +40,6 @@ "prop-types": "^15.8.1" }, "devDependencies": { - "@mui/internal-test-utils": "workspace:^", "@mui/material": "workspace:^", "@types/chai": "^5.2.3", "@types/prop-types": "^15.7.15", diff --git a/packages/mui-lab/package.json b/packages/mui-lab/package.json index f60a19c2c0e285..3cc83b0fe1ef1a 100644 --- a/packages/mui-lab/package.json +++ b/packages/mui-lab/package.json @@ -41,7 +41,6 @@ "prop-types": "^15.8.1" }, "devDependencies": { - "@mui/internal-test-utils": "workspace:^", "@mui/material": "workspace:^", "@types/chai": "^5.2.3", "@types/prop-types": "^15.7.15", diff --git a/packages/mui-material/package.json b/packages/mui-material/package.json index efed4fcad1e3fa..dc414f6af47b26 100644 --- a/packages/mui-material/package.json +++ b/packages/mui-material/package.json @@ -47,7 +47,6 @@ "react-transition-group": "^4.4.5" }, "devDependencies": { - "@mui/internal-test-utils": "workspace:^", "@types/chai": "^5.2.3", "@types/prop-types": "^15.7.15", "@types/react": "^19.2.7", diff --git a/packages/mui-material/src/ClickAwayListener/ClickAwayListener.test.js b/packages/mui-material/src/ClickAwayListener/ClickAwayListener.test.js index 21929a583c985d..40f522755e8486 100644 --- a/packages/mui-material/src/ClickAwayListener/ClickAwayListener.test.js +++ b/packages/mui-material/src/ClickAwayListener/ClickAwayListener.test.js @@ -2,13 +2,7 @@ import * as React from 'react'; import * as ReactDOM from 'react-dom'; import { expect } from 'chai'; import { spy } from 'sinon'; -import { - act, - createRenderer, - fireEvent, - fireDiscreteEvent, - screen, -} from '@mui/internal-test-utils'; +import { act, createRenderer, fireEvent, screen } from '@mui/internal-test-utils'; import Portal from '@mui/material/Portal'; import ClickAwayListener from '@mui/material/ClickAwayListener'; @@ -183,7 +177,7 @@ describe('', () => { } render(); - fireDiscreteEvent.click(screen.getByTestId('trigger')); + fireEvent.click(screen.getByTestId('trigger')); expect(screen.getByTestId('child')).not.to.equal(null); }); @@ -247,12 +241,12 @@ describe('', () => { render(); const mouseDownTarget = screen.getByTestId('trigger'); - fireDiscreteEvent.mouseDown(mouseDownTarget); + fireEvent.mouseDown(mouseDownTarget); const mouseUpTarget = screen.getByTestId('interleaved-element'); // https://w3c.github.io/uievents/#events-mouseevent-event-order const clickTarget = findNearestCommonAncestor(mouseDownTarget, mouseUpTarget); - fireDiscreteEvent.mouseUp(mouseUpTarget); - fireDiscreteEvent.click(clickTarget); + fireEvent.mouseUp(mouseUpTarget); + fireEvent.click(clickTarget); expect(onClickAway.callCount).to.equal(1); }); diff --git a/packages/mui-material/src/SpeedDial/SpeedDial.test.js b/packages/mui-material/src/SpeedDial/SpeedDial.test.js index c526c7803a424e..12913acc8f0d64 100644 --- a/packages/mui-material/src/SpeedDial/SpeedDial.test.js +++ b/packages/mui-material/src/SpeedDial/SpeedDial.test.js @@ -4,7 +4,6 @@ import { createRenderer, act, fireEvent, - fireDiscreteEvent, screen, flushEffects, isJsdom, @@ -242,9 +241,8 @@ describe('', () => { clock.runAll(); expect(screen.queryByRole('tooltip')).not.to.equal(null); - await act(async () => { - fireDiscreteEvent.keyDown(actions[0], { key: 'Escape' }); - }); + fireEvent.keyDown(actions[0], { key: 'Escape' }); + clock.runAll(); expect(screen.queryByRole('tooltip')).to.equal(null); diff --git a/packages/mui-private-theming/package.json b/packages/mui-private-theming/package.json index e7258dc6fab21b..f30b0749ede8aa 100644 --- a/packages/mui-private-theming/package.json +++ b/packages/mui-private-theming/package.json @@ -35,7 +35,6 @@ "prop-types": "^15.8.1" }, "devDependencies": { - "@mui/internal-test-utils": "workspace:^", "@mui/types": "workspace:^", "@types/chai": "^5.2.3", "@types/react": "^19.2.7", diff --git a/packages/mui-styled-engine-sc/package.json b/packages/mui-styled-engine-sc/package.json index 3de4b10e0cfc38..4203c5f7a38d4e 100644 --- a/packages/mui-styled-engine-sc/package.json +++ b/packages/mui-styled-engine-sc/package.json @@ -37,7 +37,6 @@ "prop-types": "^15.8.1" }, "devDependencies": { - "@mui/internal-test-utils": "workspace:^", "@types/chai": "^5.2.3", "@types/react": "^19.2.7", "chai": "^6.0.1", diff --git a/packages/mui-styled-engine/package.json b/packages/mui-styled-engine/package.json index f8a22ff72176de..0b00046a4ecdbf 100644 --- a/packages/mui-styled-engine/package.json +++ b/packages/mui-styled-engine/package.json @@ -41,7 +41,6 @@ "devDependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@mui/internal-test-utils": "workspace:^", "@mui/styled-engine": "workspace:*", "@types/chai": "^5.2.3", "@types/react": "^19.2.7", diff --git a/packages/mui-stylis-plugin-rtl/package.json b/packages/mui-stylis-plugin-rtl/package.json index 75866d63533325..948b49c7f35e0c 100644 --- a/packages/mui-stylis-plugin-rtl/package.json +++ b/packages/mui-stylis-plugin-rtl/package.json @@ -35,7 +35,6 @@ "cssjanus": "^2.3.0" }, "devDependencies": { - "@mui/internal-test-utils": "workspace:^", "@types/chai": "^5.2.3", "@types/node": "^20.19.26", "@types/sinon": "^17.0.4", diff --git a/packages/mui-system/package.json b/packages/mui-system/package.json index 83a6ab7eff9955..5efdc261d95bd6 100644 --- a/packages/mui-system/package.json +++ b/packages/mui-system/package.json @@ -44,7 +44,6 @@ "devDependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@mui/internal-test-utils": "workspace:^", "@mui/system": "workspace:*", "@types/chai": "^5.2.3", "@types/prop-types": "^15.7.15", diff --git a/packages/mui-utils/package.json b/packages/mui-utils/package.json index 7872fd7ccaf617..f90ef153b41b98 100644 --- a/packages/mui-utils/package.json +++ b/packages/mui-utils/package.json @@ -39,7 +39,6 @@ "react-is": "^19.2.1" }, "devDependencies": { - "@mui/internal-test-utils": "workspace:^", "@mui/types": "workspace:^", "@types/chai": "^5.2.3", "@types/node": "^20.19.26", diff --git a/packages/mui-utils/src/elementTypeAcceptingRef/elementTypeAcceptingRef.test.tsx b/packages/mui-utils/src/elementTypeAcceptingRef/elementTypeAcceptingRef.test.tsx index 1ea995556a60e1..68cb7c9a0e544f 100644 --- a/packages/mui-utils/src/elementTypeAcceptingRef/elementTypeAcceptingRef.test.tsx +++ b/packages/mui-utils/src/elementTypeAcceptingRef/elementTypeAcceptingRef.test.tsx @@ -2,10 +2,11 @@ import * as React from 'react'; import { expect } from 'chai'; import PropTypes from 'prop-types'; -import { createRenderer, reactMajor, waitFor } from '@mui/internal-test-utils'; -import { reactMinor } from '@mui/internal-test-utils/reactMajor'; +import { createRenderer, waitFor } from '@mui/internal-test-utils'; import elementTypeAcceptingRef from './elementTypeAcceptingRef'; +const [reactMajor, reactMinor] = React.version.split('.').map(Number); + describe('elementTypeAcceptingRef', () => { const { render } = createRenderer(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20f99367ef03f3..2cc5376c4c8343 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,7 +38,7 @@ importers: version: 4.6.0(@types/express@5.0.0) '@vitest/eslint-plugin': specifier: ^1.5.2 - version: 1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.10) + version: 1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13) babel-plugin-transform-import-meta: specifier: ^2.3.3 version: 2.3.3(@babel/core@7.28.5) @@ -65,14 +65,14 @@ importers: specifier: workspace:^ version: link:packages/api-docs-builder-core '@mui/internal-babel-plugin-minify-errors': - specifier: ^2.0.8-canary.13 + specifier: 2.0.8-canary.13 version: 2.0.8-canary.13(@babel/core@7.28.5) '@mui/internal-bundle-size-checker': - specifier: ^1.0.9-canary.56 + specifier: 1.0.9-canary.56 version: 1.0.9-canary.56(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.46.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) '@mui/internal-code-infra': - specifier: ^0.0.3-canary.56 - version: 0.0.3-canary.56(@next/eslint-plugin-next@15.5.7)(@types/node@20.19.27)(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-webpack@0.13.10)(eslint@9.39.1(jiti@2.6.1))(postcss@8.5.6)(prettier@3.7.4)(stylelint@16.23.1(typescript@5.9.3))(typescript@5.9.3)(vitest@4.0.10) + specifier: 0.0.3-canary.56 + version: 0.0.3-canary.56(@next/eslint-plugin-next@15.5.7)(@types/node@20.19.27)(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-webpack@0.13.10)(eslint@9.39.1(jiti@2.6.1))(postcss@8.5.6)(prettier@3.7.4)(stylelint@16.23.1(typescript@5.9.3))(typescript@5.9.3)(vitest@4.0.13) '@mui/internal-docs-utils': specifier: workspace:^ version: link:packages-internal/docs-utils @@ -83,8 +83,8 @@ importers: specifier: workspace:^ version: link:packages-internal/scripts '@mui/internal-test-utils': - specifier: workspace:^ - version: link:packages-internal/test-utils/build + specifier: 2.0.18-canary.0 + version: 2.0.18-canary.0(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@playwright/test@1.56.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(@vitest/utils@4.0.15)(chai@6.2.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13) '@mui/joy': specifier: workspace:* version: link:packages/mui-joy/build @@ -131,11 +131,11 @@ importers: specifier: ^5.1.1 version: 5.1.1(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0)) '@vitest/browser-playwright': - specifier: ^4.0.10 - version: 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(playwright@1.56.1)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10) + specifier: ^4.0.13 + version: 4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(playwright@1.56.1)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13) '@vitest/coverage-v8': - specifier: ^4.0.10 - version: 4.0.10(@vitest/browser@4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10))(vitest@4.0.10) + specifier: ^4.0.13 + version: 4.0.13(@vitest/browser@4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13))(vitest@4.0.13) '@vvago/vale': specifier: ^3.12.0 version: 3.12.0 @@ -196,9 +196,6 @@ importers: nx: specifier: ^20.8.3 version: 20.8.3 - nyc: - specifier: ^17.1.0 - version: 17.1.0 playwright: specifier: 1.56.1 version: 1.56.1 @@ -239,11 +236,11 @@ importers: specifier: ^7.2.2 version: 7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) vitest: - specifier: ^4.0.10 - version: 4.0.10(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.10)(@vitest/browser-webdriverio@4.0.10)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) + specifier: ^4.0.13 + version: 4.0.13(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.13)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) vitest-fail-on-console: specifier: ^0.10.1 - version: 0.10.1(@vitest/utils@4.0.10)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10) + version: 0.10.1(@vitest/utils@4.0.15)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13) webpack: specifier: ^5.101.3 version: 5.101.3(webpack-cli@6.0.1(webpack@5.101.3)) @@ -530,9 +527,6 @@ importers: '@mui/internal-scripts': specifier: workspace:^ version: link:../packages-internal/scripts - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../packages-internal/test-utils/build '@playwright/test': specifier: ^1.56.1 version: 1.56.1 @@ -673,92 +667,6 @@ importers: specifier: ^6.0.1 version: 6.1.2 - packages-internal/test-utils: - dependencies: - '@babel/runtime': - specifier: ^7.28.4 - version: 7.28.4 - '@emotion/cache': - specifier: ^11.14.0 - version: 11.14.0 - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@19.2.7)(react@19.2.3) - '@testing-library/dom': - specifier: ^10.4.1 - version: 10.4.1 - '@testing-library/react': - specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@testing-library/user-event': - specifier: ^14.6.1 - version: 14.6.1(@testing-library/dom@10.4.1) - assertion-error: - specifier: ^2.0.1 - version: 2.0.1 - chai: - specifier: ^4.5.0 || ^5.0.0 || ^6.0.0 - version: 6.2.1 - chai-dom: - specifier: ^1.12.1 - version: 1.12.1(chai@6.2.1) - dom-accessibility-api: - specifier: ^0.7.1 - version: 0.7.1 - es-toolkit: - specifier: ^1.42.0 - version: 1.42.0 - format-util: - specifier: ^1.0.5 - version: 1.0.5 - jsdom: - specifier: ^26.1.0 - version: 26.1.0 - prop-types: - specifier: ^15.8.1 - version: 15.8.1 - react: - specifier: ^18.0.0 || ^19.0.0 - version: 19.2.3 - react-dom: - specifier: ^18.0.0 || ^19.0.0 - version: 19.2.3(react@19.2.3) - sinon: - specifier: ^21.0.0 - version: 21.0.0 - devDependencies: - '@playwright/test': - specifier: ^1.56.1 - version: 1.56.1 - '@types/chai': - specifier: ^5.2.3 - version: 5.2.3 - '@types/chai-dom': - specifier: ^1.11.3 - version: 1.11.3 - '@types/format-util': - specifier: ^1.0.4 - version: 1.0.4 - '@types/jsdom': - specifier: ^21.1.7 - version: 21.1.7 - '@types/prop-types': - specifier: ^15.7.15 - version: 15.7.15 - '@types/react': - specifier: ^19.2.7 - version: 19.2.7 - '@types/react-dom': - specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.7) - '@types/sinon': - specifier: ^17.0.4 - version: 17.0.4 - typescript: - specifier: ^5.9.2 - version: 5.9.3 - publishDirectory: build - packages/api-docs-builder: dependencies: '@babel/core': @@ -1133,9 +1041,6 @@ importers: specifier: ^15.8.1 version: 15.8.1 devDependencies: - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@mui/material': specifier: workspace:^ version: link:../mui-material/build @@ -1207,9 +1112,6 @@ importers: specifier: ^15.8.1 version: 15.8.1 devDependencies: - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@mui/material': specifier: workspace:^ version: link:../mui-material/build @@ -1290,9 +1192,6 @@ importers: specifier: ^4.4.5 version: 4.4.5(react-dom@19.2.3(react@19.2.3))(react@19.2.3) devDependencies: - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@types/chai': specifier: ^5.2.3 version: 5.2.3 @@ -1392,9 +1291,6 @@ importers: specifier: ^15.8.1 version: 15.8.1 devDependencies: - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@mui/types': specifier: workspace:^ version: link:../mui-types/build @@ -1439,9 +1335,6 @@ importers: '@emotion/styled': specifier: ^11.14.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3) - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@mui/styled-engine': specifier: workspace:* version: link:build @@ -1477,9 +1370,6 @@ importers: specifier: ^15.8.1 version: 15.8.1 devDependencies: - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@types/chai': specifier: ^5.2.3 version: 5.2.3 @@ -1506,9 +1396,6 @@ importers: specifier: ^2.3.0 version: 2.3.0 devDependencies: - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@types/chai': specifier: ^5.2.3 version: 5.2.3 @@ -1565,9 +1452,6 @@ importers: '@emotion/styled': specifier: ^11.14.1 version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3) - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@mui/system': specifier: workspace:* version: link:build @@ -1638,9 +1522,6 @@ importers: specifier: ^19.2.1 version: 19.2.1 devDependencies: - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../../packages-internal/test-utils/build '@types/chai': specifier: ^5.2.3 version: 5.2.3 @@ -1702,9 +1583,6 @@ importers: '@mui/icons-material': specifier: workspace:^ version: link:../packages/mui-icons-material/build - '@mui/internal-test-utils': - specifier: workspace:^ - version: link:../packages-internal/test-utils/build '@mui/joy': specifier: workspace:* version: link:../packages/mui-joy/build @@ -3722,6 +3600,21 @@ packages: '@mui/internal-netlify-cache@0.0.2-canary.1': resolution: {integrity: sha512-d161tpMN7WJF2qxIoXt4hqNWVNAFjOJKj5xQNKOfap93YYtGXiDgHWcH76CJaSPK2PCzKDbsq7pkz5DyMo2IdQ==} + '@mui/internal-test-utils@2.0.18-canary.0': + resolution: {integrity: sha512-2wTaHtGWX7cUYtxPNh2QeJD3woR3FmdbwXlCQ0rGXq2/DMJY7WR4361i80yyoc2AbYTjN9JcEZY66XTb9eIRzA==} + peerDependencies: + '@emotion/cache': '11' + '@emotion/react': '11' + '@playwright/test': ^1.53.1 + chai: ^4.5.0 || ^5.0.0 || ^6.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/cache': + optional: true + '@emotion/react': + optional: true + '@mui/joy@5.0.0-beta.22': resolution: {integrity: sha512-XFJd/cWXqt9MMlaUh10QQH893YaRw2CORYRhQovXvaJk7mmt/Sc4q3Fb7ANCXf4xMUPdwqdnvawLkAOAKVHuXg==} engines: {node: '>=12.0.0'} @@ -4725,14 +4618,6 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@promptbook/utils@0.69.5': - resolution: {integrity: sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==} - - '@puppeteer/browsers@2.11.0': - resolution: {integrity: sha512-n6oQX6mYkG8TRPuPXmbPidkUbsSRalhmaaVAQxvH1IkQy63cwsH+kOjB3e4cpCDHg0aSvsiX9bQ4s2VB6mGWUQ==} - engines: {node: '>=18'} - hasBin: true - '@react-spring/animated@10.0.3': resolution: {integrity: sha512-7MrxADV3vaUADn2V9iYhaIL6iOWRx9nCJjYrsk2AHD2kwPr6fg7Pt0v+deX5RnCDmCKNnD6W5fasiyM8D+wzJQ==} peerDependencies: @@ -5285,9 +5170,6 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@tufjs/canonical-json@2.0.0': resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} @@ -5398,9 +5280,6 @@ packages: '@types/fg-loadcss@3.1.3': resolution: {integrity: sha512-l9Cf3szP7MbYXRuWnnctz6BRRADeGIakbY7+FtZSvvV+Rg+Ytv961FcXBtwpQrdjCbd4lIyawBADayxKA2GiaA==} - '@types/format-util@1.0.4': - resolution: {integrity: sha512-xrCYOdHh5zA3LUrn6CvspYwlzSWxPso11Lx32WnAG6KvLCRecKZ/Rh21PLXUkzUFsQmrGcx/traJAFjR6dVS5Q==} - '@types/gtag.js@0.0.20': resolution: {integrity: sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==} @@ -5424,9 +5303,6 @@ packages: '@types/jscodeshift@0.12.0': resolution: {integrity: sha512-Jr2fQbEoDmjwEa92TreR/mX2t9iAaY/l5P/GKezvK4BodXahex60PDLXaQR0vAgP0KfCzc1CivHusQB9NhzX8w==} - '@types/jsdom@21.1.7': - resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -5533,9 +5409,6 @@ packages: '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - '@types/which@2.0.2': - resolution: {integrity: sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==} - '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -5545,9 +5418,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.46.3': resolution: {integrity: sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5708,28 +5578,22 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitest/browser-playwright@4.0.10': - resolution: {integrity: sha512-pm7Hl7BNyluox+uGJPnT7vCRDSI+ibHcWQRtnCACAZWxD6/b2gN+8pO0qTDPHpxDSTPKDS5sT2dKTHLcr+lsng==} + '@vitest/browser-playwright@4.0.13': + resolution: {integrity: sha512-oaRY+/pvwS4/sN2rE2aZh9jdli8EkXm5AidmXEbWRu2wW0omG9PmgChWCX2jsD9qRLQxXTSLl5oKezANNF6LnQ==} peerDependencies: playwright: '*' - vitest: 4.0.10 - - '@vitest/browser-webdriverio@4.0.10': - resolution: {integrity: sha512-DRaeYGu2hMwJyIaQX8TrYi71HnHWAj8glKhxct7KlZNoR/c+1v9K70Lnm2Y09ChnMFNyiHh9Xlo3DMUNhVMRTw==} - peerDependencies: - vitest: 4.0.10 - webdriverio: '*' + vitest: 4.0.13 - '@vitest/browser@4.0.10': - resolution: {integrity: sha512-irO+aGxYx/rAhjEBLsGPO4JQ8dA+A43enIST0j4xQ2kYHatHi9tUcxkRRGpClGuUVU42mi+iQsFFzd4xxpoV3g==} + '@vitest/browser@4.0.13': + resolution: {integrity: sha512-lruSgrYPVAJzKmX6EJYCg9nY+0A4VkeTLpTzf1jRD/XMjNbzD9yy7D499xmVKglwJczANYJXBvZSPGcRlon+0w==} peerDependencies: - vitest: 4.0.10 + vitest: 4.0.13 - '@vitest/coverage-v8@4.0.10': - resolution: {integrity: sha512-g+brmtoKa/sAeIohNJnnWhnHtU6GuqqVOSQ4SxDIPcgZWZyhJs5RmF5LpqXs8Kq64lANP+vnbn5JLzhLj/G56g==} + '@vitest/coverage-v8@4.0.13': + resolution: {integrity: sha512-w77N6bmtJ3CFnL/YHiYotwW/JI3oDlR3K38WEIqegRfdMSScaYxwYKB/0jSNpOTZzUjQkG8HHEz4sdWQMWpQ5g==} peerDependencies: - '@vitest/browser': 4.0.10 - vitest: 4.0.10 + '@vitest/browser': 4.0.13 + vitest: 4.0.13 peerDependenciesMeta: '@vitest/browser': optional: true @@ -5747,11 +5611,11 @@ packages: vitest: optional: true - '@vitest/expect@4.0.10': - resolution: {integrity: sha512-3QkTX/lK39FBNwARCQRSQr0TP9+ywSdxSX+LgbJ2M1WmveXP72anTbnp2yl5fH+dU6SUmBzNMrDHs80G8G2DZg==} + '@vitest/expect@4.0.13': + resolution: {integrity: sha512-zYtcnNIBm6yS7Gpr7nFTmq8ncowlMdOJkWLqYvhr/zweY6tFbDkDi8BPPOeHxEtK1rSI69H7Fd4+1sqvEGli6w==} - '@vitest/mocker@4.0.10': - resolution: {integrity: sha512-e2OfdexYkjkg8Hh3L9NVEfbwGXq5IZbDovkf30qW2tOh7Rh9sVtmSr2ztEXOFbymNxS4qjzLXUQIvATvN4B+lg==} + '@vitest/mocker@4.0.13': + resolution: {integrity: sha512-eNCwzrI5djoauklwP1fuslHBjrbR8rqIVbvNlAnkq1OTa6XT+lX68mrtPirNM9TnR69XUPt4puBCx2Wexseylg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -5761,48 +5625,31 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.10': - resolution: {integrity: sha512-99EQbpa/zuDnvVjthwz5bH9o8iPefoQZ63WV8+bsRJZNw3qQSvSltfut8yu1Jc9mqOYi7pEbsKxYTi/rjaq6PA==} + '@vitest/pretty-format@4.0.13': + resolution: {integrity: sha512-ooqfze8URWbI2ozOeLDMh8YZxWDpGXoeY3VOgcDnsUxN0jPyPWSUvjPQWqDGCBks+opWlN1E4oP1UYl3C/2EQA==} + + '@vitest/pretty-format@4.0.15': + resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} - '@vitest/runner@4.0.10': - resolution: {integrity: sha512-EXU2iSkKvNwtlL8L8doCpkyclw0mc/t4t9SeOnfOFPyqLmQwuceMPA4zJBa6jw0MKsZYbw7kAn+gl7HxrlB8UQ==} + '@vitest/runner@4.0.13': + resolution: {integrity: sha512-9IKlAru58wcVaWy7hz6qWPb2QzJTKt+IOVKjAx5vb5rzEFPTL6H4/R9BMvjZ2ppkxKgTrFONEJFtzvnyEpiT+A==} - '@vitest/snapshot@4.0.10': - resolution: {integrity: sha512-2N4X2ZZl7kZw0qeGdQ41H0KND96L3qX1RgwuCfy6oUsF2ISGD/HpSbmms+CkIOsQmg2kulwfhJ4CI0asnZlvkg==} + '@vitest/snapshot@4.0.13': + resolution: {integrity: sha512-hb7Usvyika1huG6G6l191qu1urNPsq1iFc2hmdzQY3F5/rTgqQnwwplyf8zoYHkpt7H6rw5UfIw6i/3qf9oSxQ==} - '@vitest/spy@4.0.10': - resolution: {integrity: sha512-AsY6sVS8OLb96GV5RoG8B6I35GAbNrC49AO+jNRF9YVGb/g9t+hzNm1H6kD0NDp8tt7VJLs6hb7YMkDXqu03iw==} + '@vitest/spy@4.0.13': + resolution: {integrity: sha512-hSu+m4se0lDV5yVIcNWqjuncrmBgwaXa2utFLIrBkQCQkt+pSwyZTPFQAZiiF/63j8jYa8uAeUZ3RSfcdWaYWw==} - '@vitest/utils@4.0.10': - resolution: {integrity: sha512-kOuqWnEwZNtQxMKg3WmPK1vmhZu9WcoX69iwWjVz+jvKTsF1emzsv3eoPcDr6ykA3qP2bsCQE7CwqfNtAVzsmg==} + '@vitest/utils@4.0.13': + resolution: {integrity: sha512-ydozWyQ4LZuu8rLp47xFUWis5VOKMdHjXCWhs1LuJsTNKww+pTHQNK4e0assIB9K80TxFyskENL6vCu3j34EYA==} + + '@vitest/utils@4.0.15': + resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} '@vvago/vale@3.12.0': resolution: {integrity: sha512-9VxKDaJT0oyxJh+qN+tW2e78M+1xGMkXqbbZ2XlAvyhOrjA3OSOCaZQjRu6+c9lv/h1OQRNT50XIuhngrVoSew==} hasBin: true - '@wdio/config@9.20.0': - resolution: {integrity: sha512-ggwd3EMsVj/LTcbYw2h+hma+/7fQ1cTXMuy9B5WTkLjDlOtbLjsqs9QLt4BLIo1cdsxvAw/UVpRVUuYy7rTmtQ==} - engines: {node: '>=18.20.0'} - - '@wdio/logger@9.18.0': - resolution: {integrity: sha512-HdzDrRs+ywAqbXGKqe1i/bLtCv47plz4TvsHFH3j729OooT5VH38ctFn5aLXgECmiAKDkmH/A6kOq2Zh5DIxww==} - engines: {node: '>=18.20.0'} - - '@wdio/protocols@9.16.2': - resolution: {integrity: sha512-h3k97/lzmyw5MowqceAuY3HX/wGJojXHkiPXA3WlhGPCaa2h4+GovV2nJtRvknCKsE7UHA1xB5SWeI8MzloBew==} - - '@wdio/repl@9.16.2': - resolution: {integrity: sha512-FLTF0VL6+o5BSTCO7yLSXocm3kUnu31zYwzdsz4n9s5YWt83sCtzGZlZpt7TaTzb3jVUfxuHNQDTb8UMkCu0lQ==} - engines: {node: '>=18.20.0'} - - '@wdio/types@9.20.0': - resolution: {integrity: sha512-zMmAtse2UMCSOW76mvK3OejauAdcFGuKopNRH7crI0gwKTZtvV89yXWRziz9cVXpFgfmJCjf9edxKFWdhuF5yw==} - engines: {node: '>=18.20.0'} - - '@wdio/utils@9.20.0': - resolution: {integrity: sha512-T1ze005kncUTocYImSBQc/FAVcOwP/vOU4MDJFgzz/RTcps600qcKX98sVdWM5/ukXCVkjOufWteDHIbX5/tEA==} - engines: {node: '>=18.20.0'} - '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -5901,10 +5748,6 @@ packages: '@zeit/schemas@2.36.0': resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} - '@zip.js/zip.js@2.8.11': - resolution: {integrity: sha512-0fztsk/0ryJ+2PPr9EyXS5/Co7OK8q3zY/xOoozEWaUsL5x+C0cyZ4YyMuUffOO2Dx/rAdq4JMPqW0VUtm+vzA==} - engines: {bun: '>=0.7.0', deno: '>=1.0.0', node: '>=18.0.0'} - '@zkochan/js-yaml@0.0.7': resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true @@ -6029,10 +5872,6 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - append-transform@2.0.0: - resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} - engines: {node: '>=8'} - aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -6047,9 +5886,6 @@ packages: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} - archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -6140,10 +5976,6 @@ packages: ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - ast-types@0.14.2: resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} engines: {node: '>=4'} @@ -6285,36 +6117,6 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.2: - resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} - engines: {bare: '>=1.16.0'} - peerDependencies: - bare-buffer: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} - engines: {bare: '>=1.14.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.7.0: - resolution: {integrity: sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} - base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -6322,10 +6124,6 @@ packages: resolution: {integrity: sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==} hasBin: true - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -6385,9 +6183,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-crc32@1.0.0: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} @@ -6447,10 +6242,6 @@ packages: cacheable@1.10.3: resolution: {integrity: sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==} - caching-transform@4.0.0: - resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} - engines: {node: '>=8'} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -6544,13 +6335,6 @@ packages: chardet@2.1.1: resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - - cheerio@1.1.2: - resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} - engines: {node: '>=20.18.1'} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -6632,9 +6416,6 @@ packages: resolution: {integrity: sha512-pJ5ZDWjOT593Nli4TqlRLy33KomlAPxIFntMFxXrCqJON1cGcGPT5nNFxRxJ9m4HbfrccsYve7XwXjywW6nXVw==} engines: {node: '>=20'} - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -6736,10 +6517,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} @@ -6938,9 +6715,6 @@ packages: css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - css-shorthand-properties@1.1.2: - resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} - css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} @@ -6952,9 +6726,6 @@ packages: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-value@0.0.1: - resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} - css-vendor@2.0.8: resolution: {integrity: sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==} @@ -7044,14 +6815,6 @@ packages: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - data-urls@5.0.0: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} @@ -7135,10 +6898,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decamelize@6.0.1: - resolution: {integrity: sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} @@ -7160,10 +6919,6 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge-ts@7.1.5: - resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} - engines: {node: '>=16.0.0'} - deepmerge@2.2.1: resolution: {integrity: sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==} engines: {node: '>=0.10.0'} @@ -7176,10 +6931,6 @@ packages: resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} engines: {node: '>=18'} - default-require-extensions@3.0.0: - resolution: {integrity: sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==} - engines: {node: '>=8'} - defaults@1.0.3: resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} @@ -7199,10 +6950,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -7328,15 +7075,6 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - edge-paths@3.0.5: - resolution: {integrity: sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==} - engines: {node: '>=14.0.0'} - - edgedriver@6.2.0: - resolution: {integrity: sha512-49G6010o0VYXUMNi5OvxqE9O/kazs0qmJVqHcSHNvp1VfojO21Kb/NaJN40uy11yrlGHRp7y6a372xoCnShzlA==} - engines: {node: '>=20.0.0'} - hasBin: true - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -7368,9 +7106,6 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - encoding-sniffer@0.2.1: - resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} - encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} @@ -7473,9 +7208,6 @@ packages: es-toolkit@1.42.0: resolution: {integrity: sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==} - es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - esbuild@0.25.6: resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} engines: {node: '>=18'} @@ -7496,11 +7228,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true @@ -7732,11 +7459,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} @@ -7744,9 +7466,6 @@ packages: resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} engines: {node: '>=10.0.0'} - fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -7774,10 +7493,6 @@ packages: resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true - fast-xml-parser@5.3.3: - resolution: {integrity: sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==} - hasBin: true - fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -7785,9 +7500,6 @@ packages: fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -7801,10 +7513,6 @@ packages: resolution: {integrity: sha512-qGNhgYygnefSkAHHrNHqC7p3R8J0/xQDS/cYUud8er/qD9EFGWyCdUDfULHTJQN1d3H3WprzVwMc9MfB4J50Wg==} engines: {node: '>=20', pnpm: '>=10'} - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} @@ -7927,10 +7635,6 @@ packages: format-util@1.0.5: resolution: {integrity: sha512-varLbTj0e0yVyRpqQhuWV+8hlePAgaoFRhNFj50BNjEIrw1/DphHSObtqwskVCPWNgzwPoQrZAbfa/SBiicNeg==} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -7946,9 +7650,6 @@ packages: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - front-matter@4.0.2: resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} @@ -7998,11 +7699,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - geckodriver@5.0.0: - resolution: {integrity: sha512-vn7TtQ3b9VMJtVXsyWtQQl1fyBVFhQy7UvJF96kPuuJ0or5THH496AD3eUyaDD11+EqCxH9t6V+EP9soZQk4YQ==} - engines: {node: '>=18.0.0'} - hasBin: true - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -8032,10 +7728,6 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} - get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} - engines: {node: '>=16'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -8048,10 +7740,6 @@ packages: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@6.0.0: resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} engines: {node: '>=10'} @@ -8075,10 +7763,6 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} - git-raw-commits@3.0.0: resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} engines: {node: '>=14'} @@ -8200,9 +7884,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -8256,10 +7937,6 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -8337,12 +8014,6 @@ packages: webpack: optional: true - htmlfy@0.8.1: - resolution: {integrity: sha512-xWROBw9+MEGwxpotll0h672KCaLrKKiCYzsyN8ZgL9cQbVumFnyvsk2JqiB9ELAV1GLj1GG/jxZUjV9OZZi/yQ==} - - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} - htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -8431,9 +8102,6 @@ packages: engines: {node: '>=8'} hasBin: true - import-meta-resolve@4.2.0: - resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -8715,9 +8383,6 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -8742,10 +8407,6 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -8782,26 +8443,14 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} - istanbul-lib-instrument@6.0.2: resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} engines: {node: '>=10'} - istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} - istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - istanbul-lib-source-maps@5.0.6: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} @@ -9183,9 +8832,6 @@ packages: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} - locate-app@2.5.0: - resolution: {integrity: sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==} - locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -9214,9 +8860,6 @@ packages: lodash.find@4.6.0: resolution: {integrity: sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==} - lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. @@ -9267,9 +8910,6 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - lodash.zip@4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -9277,13 +8917,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} - - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -9308,10 +8941,6 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - luxon@3.6.1: resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} engines: {node: '>=12'} @@ -9677,9 +9306,6 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -9762,10 +9388,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - next@15.5.9: resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -9800,11 +9422,6 @@ packages: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - node-emoji@2.2.0: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} @@ -9821,10 +9438,6 @@ packages: encoding: optional: true - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-gyp@11.5.0: resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -9839,10 +9452,6 @@ packages: node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} - node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} @@ -9970,11 +9579,6 @@ packages: '@swc/core': optional: true - nyc@17.1.0: - resolution: {integrity: sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==} - engines: {node: '>=18'} - hasBin: true - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -10121,10 +9725,6 @@ packages: resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} engines: {node: '>=8'} - p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -10169,18 +9769,6 @@ packages: resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} engines: {node: '>=8'} - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - - package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} - package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -10251,12 +9839,6 @@ packages: parse5-htmlparser2-tree-adapter@6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - parse5-htmlparser2-tree-adapter@7.1.0: - resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} - - parse5-parser-stream@7.1.2: - resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - parse5@5.1.1: resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} @@ -10339,9 +9921,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -10547,10 +10126,6 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} - engines: {node: '>=8'} - process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -10559,10 +10134,6 @@ packages: resolution: {integrity: sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q==} engines: {node: ^18.17.0 || >=20.5.0} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} @@ -10587,10 +10158,6 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -10612,9 +10179,6 @@ packages: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} - query-selector-shadow-dom@1.0.1: - resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} - querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -10893,10 +10457,6 @@ packages: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} - release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} - remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -10920,9 +10480,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -10960,17 +10517,10 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - resq@1.11.0: - resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} - restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} - ret@0.5.0: - resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} - engines: {node: '>=10'} - retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -10983,9 +10533,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rgb2hex@0.2.5: - resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} - rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -11052,10 +10599,6 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safaridriver@1.0.0: - resolution: {integrity: sha512-J92IFbskyo7OYB3Dt4aTdyhag1GlInrfbPCmMteb7aBK7PwlnGz1HI0+oyNN97j7pV9DqUAVoVgkNRMrfY47mQ==} - engines: {node: '>=18.0.0'} - safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -11074,9 +10617,6 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} - safe-regex2@5.0.0: - resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -11123,10 +10663,6 @@ packages: resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} engines: {node: '>= 18'} - serialize-error@12.0.0: - resolution: {integrity: sha512-ZYkZLAvKTKQXWuh5XpBw7CdbSzagarX39WyZ2H07CDLC5/KfsRGlIXV8d4+tfqX1M7916mRqR1QfNHSij+c9Pw==} - engines: {node: '>=18'} - serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -11306,13 +10842,6 @@ packages: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - spacetrim@0.11.59: - resolution: {integrity: sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==} - - spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} - spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -11328,10 +10857,6 @@ packages: split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - split@1.0.1: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} @@ -11587,9 +11112,6 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} - tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -11815,10 +11337,6 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.26.0: - resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} - engines: {node: '>=16'} - type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -11847,9 +11365,6 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -11885,14 +11400,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@6.22.0: - resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} - engines: {node: '>=18.17'} - - undici@7.16.0: - resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} - engines: {node: '>=20.18.1'} - unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} @@ -11990,9 +11497,6 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - urlpattern-polyfill@10.1.0: - resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} - use-count-up@3.0.1: resolution: {integrity: sha512-jlVsXJYje6jh+xwQaCEYrwHoB+nRyillNEmr21bhe9kw7tpRzyrSq9jQs9UOlo+8hCFkuOmjUihL3IjEK/piVg==} peerDependencies: @@ -12008,10 +11512,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - userhome@1.0.1: - resolution: {integrity: sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==} - engines: {node: '>= 0.8.0'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -12109,23 +11609,26 @@ packages: vite: '>=4.5.2' vitest: '>=0.26.2' - vitest@4.0.10: - resolution: {integrity: sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==} + vitest@4.0.13: + resolution: {integrity: sha512-QSD4I0fN6uZQfftryIXuqvqgBxTvJ3ZNkF6RWECd82YGAYAfhcppBLFXzXJHQAAhVFyYEuFTrq6h0hQqjB7jIQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 '@types/debug': ^4.1.12 '@types/node': ^20.19.26 - '@vitest/browser-playwright': 4.0.10 - '@vitest/browser-preview': 4.0.10 - '@vitest/browser-webdriverio': 4.0.10 - '@vitest/ui': 4.0.10 + '@vitest/browser-playwright': 4.0.13 + '@vitest/browser-preview': 4.0.13 + '@vitest/browser-webdriverio': 4.0.13 + '@vitest/ui': 4.0.13 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@opentelemetry/api': + optional: true '@types/debug': optional: true '@types/node': @@ -12147,11 +11650,6 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - wait-port@1.1.0: - resolution: {integrity: sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==} - engines: {node: '>=10'} - hasBin: true - walk-up-path@4.0.0: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} engines: {node: 20 || >=22} @@ -12166,23 +11664,6 @@ packages: wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - - webdriver@9.20.0: - resolution: {integrity: sha512-Kk+AGV1xWLNHVpzUynQJDULMzbcO3IjXo3s0BzfC30OpGxhpaNmoazMQodhtv0Lp242Mb1VYXD89dCb4oAHc4w==} - engines: {node: '>=18.20.0'} - - webdriverio@9.20.0: - resolution: {integrity: sha512-cqaXfahTzCFaQLlk++feZaze6tAsW8OSdaVRgmOGJRII1z2A4uh4YGHtusTpqOiZAST7OBPqycOwfh01G/Ktbg==} - engines: {node: '>=18.20.0'} - peerDependencies: - puppeteer-core: '>=22.x || <=24.x' - peerDependenciesMeta: - puppeteer-core: - optional: true - webfontloader@1.6.28: resolution: {integrity: sha512-Egb0oFEga6f+nSgasH3E0M405Pzn6y3/9tOVanv/DLfa1YBIgcv90L18YyWnvXkRbIM17v5Kv6IT2N6g1x5tvQ==} @@ -12264,9 +11745,6 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-module@2.0.0: - resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} - which-typed-array@1.1.19: resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} @@ -12330,9 +11808,6 @@ packages: write-file-atomic@2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - write-file-atomic@5.0.1: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -12399,9 +11874,6 @@ packages: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -12425,10 +11897,6 @@ packages: engines: {node: '>= 14.6'} hasBin: true - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -12441,10 +11909,6 @@ packages: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -12457,9 +11921,6 @@ packages: resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -15052,7 +14513,7 @@ snapshots: - tsx - yaml - '@mui/internal-code-infra@0.0.3-canary.56(@next/eslint-plugin-next@15.5.7)(@types/node@20.19.27)(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-webpack@0.13.10)(eslint@9.39.1(jiti@2.6.1))(postcss@8.5.6)(prettier@3.7.4)(stylelint@16.23.1(typescript@5.9.3))(typescript@5.9.3)(vitest@4.0.10)': + '@mui/internal-code-infra@0.0.3-canary.56(@next/eslint-plugin-next@15.5.7)(@types/node@20.19.27)(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-webpack@0.13.10)(eslint@9.39.1(jiti@2.6.1))(postcss@8.5.6)(prettier@3.7.4)(stylelint@16.23.1(typescript@5.9.3))(typescript@5.9.3)(vitest@4.0.13)': dependencies: '@argos-ci/core': 4.5.0 '@babel/cli': 7.28.3(@babel/core@7.28.5) @@ -15077,7 +14538,7 @@ snapshots: '@octokit/oauth-methods': 6.0.2 '@octokit/rest': 22.0.1 '@pnpm/find-workspace-dir': 1000.1.3 - '@vitest/eslint-plugin': 1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.10) + '@vitest/eslint-plugin': 1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13) babel-plugin-optimize-clsx: 2.6.2 babel-plugin-react-compiler: 1.0.0 babel-plugin-transform-inline-environment-variables: 0.4.4 @@ -15128,6 +14589,40 @@ snapshots: '@mui/internal-netlify-cache@0.0.2-canary.1': {} + '@mui/internal-test-utils@2.0.18-canary.0(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@playwright/test@1.56.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(@vitest/utils@4.0.15)(chai@6.2.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13)': + dependencies: + '@babel/runtime': 7.28.4 + '@playwright/test': 1.56.1 + '@testing-library/dom': 10.4.1 + '@testing-library/react': 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) + '@types/chai-dom': 1.11.3 + assertion-error: 2.0.1 + chai: 6.2.1 + chai-dom: 1.12.1(chai@6.2.1) + dom-accessibility-api: 0.7.1 + es-toolkit: 1.42.0 + format-util: 1.0.5 + jsdom: 26.1.0 + prop-types: 15.8.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + sinon: 21.0.0 + vitest-fail-on-console: 0.10.1(@vitest/utils@4.0.15)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13) + optionalDependencies: + '@emotion/cache': 11.14.0 + '@emotion/react': 11.14.0(@types/react@19.2.7)(react@19.2.3) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - '@vitest/utils' + - bufferutil + - canvas + - supports-color + - utf-8-validate + - vite + - vitest + '@mui/joy@5.0.0-beta.22(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react@19.2.3))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@babel/runtime': 7.28.4 @@ -16176,27 +15671,6 @@ snapshots: '@popperjs/core@2.11.8': {} - '@promptbook/utils@0.69.5': - dependencies: - spacetrim: 0.11.59 - optional: true - - '@puppeteer/browsers@2.11.0': - dependencies: - debug: 4.4.3 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.5.0 - semver: 7.7.3 - tar-fs: 3.1.1 - yargs: 17.7.2 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - optional: true - '@react-spring/animated@10.0.3(react@19.2.3)': dependencies: '@react-spring/shared': 10.0.3(react@19.2.3) @@ -16856,9 +16330,6 @@ snapshots: '@tootallnate/once@2.0.0': {} - '@tootallnate/quickjs-emscripten@0.23.0': - optional: true - '@tufjs/canonical-json@2.0.0': {} '@tufjs/models@4.0.0': @@ -16990,8 +16461,6 @@ snapshots: '@types/fg-loadcss@3.1.3': {} - '@types/format-util@1.0.4': {} - '@types/gtag.js@0.0.20': {} '@types/hoist-non-react-statics@3.3.7(@types/react@19.2.7)': @@ -17014,12 +16483,6 @@ snapshots: ast-types: 0.14.2 recast: 0.20.5 - '@types/jsdom@21.1.7': - dependencies: - '@types/node': 20.19.27 - '@types/tough-cookie': 4.0.5 - parse5: 7.3.0 - '@types/json-schema@7.0.15': {} '@types/json2mq@0.2.2': {} @@ -17104,7 +16567,8 @@ snapshots: '@types/stylis@4.2.7': {} - '@types/tough-cookie@4.0.5': {} + '@types/tough-cookie@4.0.5': + optional: true '@types/unist@2.0.11': {} @@ -17112,9 +16576,6 @@ snapshots: '@types/uuid@10.0.0': {} - '@types/which@2.0.2': - optional: true - '@types/ws@8.18.1': dependencies: '@types/node': 20.19.27 @@ -17125,11 +16586,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 20.19.27 - optional: true - '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -17294,41 +16750,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser-playwright@4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(playwright@1.56.1)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10)': + '@vitest/browser-playwright@4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(playwright@1.56.1)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13)': dependencies: - '@vitest/browser': 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10) - '@vitest/mocker': 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0)) + '@vitest/browser': 4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13) + '@vitest/mocker': 4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0)) playwright: 1.56.1 tinyrainbow: 3.0.3 - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.10)(@vitest/browser-webdriverio@4.0.10)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - - '@vitest/browser-webdriverio@4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10)(webdriverio@9.20.0)': - dependencies: - '@vitest/browser': 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10) - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.10)(@vitest/browser-webdriverio@4.0.10)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) - webdriverio: 9.20.0 + vitest: 4.0.13(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.13)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - optional: true - '@vitest/browser@4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10)': + '@vitest/browser@4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13)': dependencies: - '@vitest/mocker': 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0)) - '@vitest/utils': 4.0.10 + '@vitest/mocker': 4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0)) + '@vitest/utils': 4.0.13 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.10)(@vitest/browser-webdriverio@4.0.10)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) + vitest: 4.0.13(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.13)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -17336,10 +16780,10 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-v8@4.0.10(@vitest/browser@4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10))(vitest@4.0.10)': + '@vitest/coverage-v8@4.0.13(@vitest/browser@4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13))(vitest@4.0.13)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.10 + '@vitest/utils': 4.0.13 ast-v8-to-istanbul: 0.3.8 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 @@ -17349,61 +16793,70 @@ snapshots: magicast: 0.5.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.10)(@vitest/browser-webdriverio@4.0.10)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) + vitest: 4.0.13(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.13)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) optionalDependencies: - '@vitest/browser': 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10) + '@vitest/browser': 4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13) transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.10)': + '@vitest/eslint-plugin@1.5.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.13)': dependencies: '@typescript-eslint/scope-manager': 8.46.3 '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) optionalDependencies: typescript: 5.9.3 - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.10)(@vitest/browser-webdriverio@4.0.10)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) + vitest: 4.0.13(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.13)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.10': + '@vitest/expect@4.0.13': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.0.10 - '@vitest/utils': 4.0.10 + '@vitest/spy': 4.0.13 + '@vitest/utils': 4.0.13 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))': + '@vitest/mocker@4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))': dependencies: - '@vitest/spy': 4.0.10 + '@vitest/spy': 4.0.13 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.3(@types/node@20.19.27)(typescript@5.9.3) vite: 7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) - '@vitest/pretty-format@4.0.10': + '@vitest/pretty-format@4.0.13': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.10': + '@vitest/pretty-format@4.0.15': dependencies: - '@vitest/utils': 4.0.10 + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.13': + dependencies: + '@vitest/utils': 4.0.13 pathe: 2.0.3 - '@vitest/snapshot@4.0.10': + '@vitest/snapshot@4.0.13': dependencies: - '@vitest/pretty-format': 4.0.10 + '@vitest/pretty-format': 4.0.13 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.10': {} + '@vitest/spy@4.0.13': {} + + '@vitest/utils@4.0.13': + dependencies: + '@vitest/pretty-format': 4.0.13 + tinyrainbow: 3.0.3 - '@vitest/utils@4.0.10': + '@vitest/utils@4.0.15': dependencies: - '@vitest/pretty-format': 4.0.10 + '@vitest/pretty-format': 4.0.15 tinyrainbow: 3.0.3 '@vvago/vale@3.12.0': @@ -17415,67 +16868,6 @@ snapshots: transitivePeerDependencies: - debug - '@wdio/config@9.20.0': - dependencies: - '@wdio/logger': 9.18.0 - '@wdio/types': 9.20.0 - '@wdio/utils': 9.20.0 - deepmerge-ts: 7.1.5 - glob: 10.5.0 - import-meta-resolve: 4.2.0 - jiti: 2.6.1 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - optional: true - - '@wdio/logger@9.18.0': - dependencies: - chalk: 5.6.2 - loglevel: 1.9.2 - loglevel-plugin-prefix: 0.8.4 - safe-regex2: 5.0.0 - strip-ansi: 7.1.2 - optional: true - - '@wdio/protocols@9.16.2': - optional: true - - '@wdio/repl@9.16.2': - dependencies: - '@types/node': 20.19.27 - optional: true - - '@wdio/types@9.20.0': - dependencies: - '@types/node': 20.19.27 - optional: true - - '@wdio/utils@9.20.0': - dependencies: - '@puppeteer/browsers': 2.11.0 - '@wdio/logger': 9.18.0 - '@wdio/types': 9.20.0 - decamelize: 6.0.1 - deepmerge-ts: 7.1.5 - edgedriver: 6.2.0 - geckodriver: 5.0.0 - get-port: 7.1.0 - import-meta-resolve: 4.2.0 - locate-app: 2.5.0 - mitt: 3.0.1 - safaridriver: 1.0.0 - split2: 4.2.0 - wait-port: 1.1.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - optional: true - '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -17616,9 +17008,6 @@ snapshots: '@zeit/schemas@2.36.0': {} - '@zip.js/zip.js@2.8.11': - optional: true - '@zkochan/js-yaml@0.0.7': dependencies: argparse: 2.0.1 @@ -17743,10 +17132,6 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 - append-transform@2.0.0: - dependencies: - default-require-extensions: 3.0.0 - aproba@2.0.0: {} arch@2.2.0: {} @@ -17774,8 +17159,6 @@ snapshots: - bare-abort-controller - react-native-b4a - archy@1.0.0: {} - arg@5.0.2: {} argparse@1.0.10: @@ -17889,11 +17272,6 @@ snapshots: ast-types-flow@0.0.8: {} - ast-types@0.13.4: - dependencies: - tslib: 2.8.1 - optional: true - ast-types@0.14.2: dependencies: tslib: 2.8.1 @@ -18052,48 +17430,10 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.2: - dependencies: - bare-events: 2.8.2 - bare-path: 3.0.0 - bare-stream: 2.7.0(bare-events@2.8.2) - bare-url: 2.3.2 - fast-fifo: 1.3.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-os@3.6.2: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.6.2 - optional: true - - bare-stream@2.7.0(bare-events@2.8.2): - dependencies: - streamx: 2.23.0 - optionalDependencies: - bare-events: 2.8.2 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - optional: true - - bare-url@2.3.2: - dependencies: - bare-path: 3.0.0 - optional: true - base64-js@1.5.1: {} baseline-browser-mapping@2.8.28: {} - basic-ftp@5.0.5: - optional: true - before-after-hook@2.2.3: {} before-after-hook@4.0.0: {} @@ -18176,9 +17516,6 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.28.0) - buffer-crc32@0.2.13: - optional: true - buffer-crc32@1.0.0: {} buffer-equal-constant-time@1.0.1: {} @@ -18260,13 +17597,6 @@ snapshots: hookified: 1.11.0 keyv: 5.5.0 - caching-transform@4.0.0: - dependencies: - hasha: 5.2.2 - make-dir: 3.1.0 - package-hash: 4.0.0 - write-file-atomic: 3.0.3 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -18351,31 +17681,6 @@ snapshots: chardet@2.1.1: {} - cheerio-select@2.1.0: - dependencies: - boolbase: 1.0.0 - css-select: 5.2.2 - css-what: 6.2.2 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - optional: true - - cheerio@1.1.2: - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.2.2 - encoding-sniffer: 0.2.1 - htmlparser2: 10.0.0 - parse5: 7.3.0 - parse5-htmlparser2-tree-adapter: 7.1.0 - parse5-parser-stream: 7.1.2 - undici: 7.16.0 - whatwg-mimetype: 4.0.0 - optional: true - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -18452,12 +17757,6 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -18537,9 +17836,6 @@ snapshots: commander@8.3.0: {} - commander@9.5.0: - optional: true - common-ancestor-path@1.0.1: {} commondir@1.0.1: {} @@ -18794,9 +18090,6 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 - css-shorthand-properties@1.1.2: - optional: true - css-to-react-native@3.2.0: dependencies: camelize: 1.0.0 @@ -18813,9 +18106,6 @@ snapshots: mdn-data: 2.12.2 source-map-js: 1.2.1 - css-value@0.0.1: - optional: true - css-vendor@2.0.8: dependencies: '@babel/runtime': 7.28.4 @@ -18933,12 +18223,6 @@ snapshots: dargs@7.0.0: {} - data-uri-to-buffer@4.0.1: - optional: true - - data-uri-to-buffer@6.0.2: - optional: true - data-urls@5.0.0: dependencies: whatwg-mimetype: 4.0.0 @@ -19004,9 +18288,6 @@ snapshots: decamelize@1.2.0: {} - decamelize@6.0.1: - optional: true - decimal.js@10.5.0: {} decode-named-character-reference@1.0.2: @@ -19021,9 +18302,6 @@ snapshots: deep-is@0.1.4: {} - deepmerge-ts@7.1.5: - optional: true - deepmerge@2.2.1: {} default-browser-id@5.0.0: {} @@ -19033,10 +18311,6 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.0 - default-require-extensions@3.0.0: - dependencies: - strip-bom: 4.0.0 - defaults@1.0.3: dependencies: clone: 1.0.4 @@ -19057,13 +18331,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - optional: true - delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -19184,26 +18451,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - edge-paths@3.0.5: - dependencies: - '@types/which': 2.0.2 - which: 2.0.2 - optional: true - - edgedriver@6.2.0: - dependencies: - '@wdio/logger': 9.18.0 - '@zip.js/zip.js': 2.8.11 - decamelize: 6.0.1 - edge-paths: 3.0.5 - fast-xml-parser: 5.3.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - which: 6.0.0 - transitivePeerDependencies: - - supports-color - optional: true - ee-first@1.1.1: {} ejs@3.1.10: @@ -19224,12 +18471,6 @@ snapshots: encodeurl@2.0.0: {} - encoding-sniffer@0.2.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-encoding: 3.1.1 - optional: true - encoding@0.1.13: dependencies: iconv-lite: 0.6.3 @@ -19388,8 +18629,6 @@ snapshots: es-toolkit@1.42.0: {} - es6-error@4.1.1: {} - esbuild@0.25.6: optionalDependencies: '@esbuild/aix-ppc64': 0.25.6 @@ -19427,15 +18666,6 @@ snapshots: escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - optional: true - eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)): dependencies: eslint: 9.39.1(jiti@2.6.1) @@ -19833,17 +19063,6 @@ snapshots: extend@3.0.2: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - optional: true - fast-content-type-parse@3.0.0: {} fast-csv@4.3.6: @@ -19851,9 +19070,6 @@ snapshots: '@fast-csv/format': 4.3.5 '@fast-csv/parse': 4.3.6 - fast-deep-equal@2.0.1: - optional: true - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -19884,22 +19100,12 @@ snapshots: dependencies: strnum: 2.1.2 - fast-xml-parser@5.3.3: - dependencies: - strnum: 2.1.2 - optional: true - fastest-levenshtein@1.0.16: {} fastq@1.13.0: dependencies: reusify: 1.0.4 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - optional: true - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -19908,12 +19114,6 @@ snapshots: dependencies: xml-js: 1.6.11 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - optional: true - fflate@0.8.2: {} fg-loadcss@3.1.0: {} @@ -20044,11 +19244,6 @@ snapshots: format-util@1.0.5: {} - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - optional: true - forwarded@0.2.0: {} fraction.js@5.3.4: {} @@ -20057,8 +19252,6 @@ snapshots: fresh@2.0.0: {} - fromentries@1.3.2: {} - front-matter@4.0.2: dependencies: js-yaml: 3.14.1 @@ -20109,23 +19302,6 @@ snapshots: functions-have-names@1.2.3: {} - geckodriver@5.0.0: - dependencies: - '@wdio/logger': 9.18.0 - '@zip.js/zip.js': 2.8.11 - decamelize: 6.0.1 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - node-fetch: 3.3.2 - tar-fs: 3.1.1 - which: 5.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - optional: true - gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} @@ -20156,9 +19332,6 @@ snapshots: get-port@5.1.1: {} - get-port@7.1.0: - optional: true - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -20170,11 +19343,6 @@ snapshots: dependencies: pump: 3.0.3 - get-stream@5.2.0: - dependencies: - pump: 3.0.3 - optional: true - get-stream@6.0.0: {} get-stream@6.0.1: {} @@ -20196,15 +19364,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-uri@6.0.5: - dependencies: - basic-ftp: 5.0.5 - data-uri-to-buffer: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - git-raw-commits@3.0.0: dependencies: dargs: 7.0.0 @@ -20369,9 +19528,6 @@ snapshots: graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: - optional: true - graphemer@1.4.0: {} graphql@16.12.0: @@ -20418,11 +19574,6 @@ snapshots: has-unicode@2.0.1: {} - hasha@5.2.2: - dependencies: - is-stream: 2.0.1 - type-fest: 0.8.1 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -20500,17 +19651,6 @@ snapshots: optionalDependencies: webpack: 5.101.3(webpack-cli@6.0.1(webpack@5.101.3)) - htmlfy@0.8.1: - optional: true - - htmlparser2@10.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 6.0.1 - optional: true - htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -20605,9 +19745,6 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - import-meta-resolve@4.2.0: - optional: true - imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -20845,8 +19982,6 @@ snapshots: dependencies: which-typed-array: 1.1.19 - is-typedarray@1.0.0: {} - is-unicode-supported@0.1.0: {} is-unicode-supported@2.0.0: {} @@ -20864,8 +19999,6 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-windows@1.0.2: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -20892,10 +20025,6 @@ snapshots: istanbul-lib-coverage@3.2.2: {} - istanbul-lib-hook@3.0.0: - dependencies: - append-transform: 2.0.0 - istanbul-lib-instrument@6.0.2: dependencies: '@babel/core': 7.28.5 @@ -20906,29 +20035,12 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-lib-processinfo@2.0.3: - dependencies: - archy: 1.0.0 - cross-spawn: 7.0.6 - istanbul-lib-coverage: 3.2.2 - p-map: 3.0.0 - rimraf: 3.0.2 - uuid: 8.3.2 - istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.4.3 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - istanbul-lib-source-maps@5.0.6: dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -21443,13 +20555,6 @@ snapshots: loader-runner@4.3.0: {} - locate-app@2.5.0: - dependencies: - '@promptbook/utils': 0.69.5 - type-fest: 4.26.0 - userhome: 1.0.1 - optional: true - locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -21476,8 +20581,6 @@ snapshots: lodash.find@4.6.0: {} - lodash.flattendeep@4.4.0: {} - lodash.get@4.4.2: {} lodash.groupby@4.6.0: {} @@ -21510,9 +20613,6 @@ snapshots: lodash.uniq@4.5.0: {} - lodash.zip@4.2.0: - optional: true - lodash@4.17.21: {} log-symbols@4.1.0: @@ -21520,12 +20620,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loglevel-plugin-prefix@0.8.4: - optional: true - - loglevel@1.9.2: - optional: true - longest-streak@3.1.0: {} loose-envify@1.4.0: @@ -21548,9 +20642,6 @@ snapshots: dependencies: yallist: 4.0.0 - lru-cache@7.18.3: - optional: true - luxon@3.6.1: optional: true @@ -22051,9 +21142,6 @@ snapshots: dependencies: minipass: 7.1.2 - mitt@3.0.1: - optional: true - mkdirp@0.5.6: dependencies: minimist: 1.2.8 @@ -22133,9 +21221,6 @@ snapshots: neo-async@2.6.2: {} - netmask@2.0.2: - optional: true - next@15.5.9(@babel/core@7.28.5)(@opentelemetry/api@1.8.0)(@playwright/test@1.56.1)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 15.5.9 @@ -22175,9 +21260,6 @@ snapshots: dependencies: minimatch: 3.1.2 - node-domexception@1.0.0: - optional: true - node-emoji@2.2.0: dependencies: '@sindresorhus/is': 4.6.0 @@ -22196,13 +21278,6 @@ snapshots: optionalDependencies: encoding: 0.1.13 - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - optional: true - node-gyp@11.5.0: dependencies: env-paths: 2.2.1 @@ -22227,10 +21302,6 @@ snapshots: node-machine-id@1.1.12: {} - node-preload@0.2.1: - dependencies: - process-on-spawn: 1.0.0 - node-releases@2.0.27: {} nopt@8.1.0: @@ -22456,38 +21527,6 @@ snapshots: transitivePeerDependencies: - debug - nyc@17.1.0: - dependencies: - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - caching-transform: 4.0.0 - convert-source-map: 1.8.0 - decamelize: 1.2.0 - find-cache-dir: 3.3.2 - find-up: 4.1.0 - foreground-child: 3.3.1 - get-package-type: 0.1.0 - glob: 7.2.3 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-hook: 3.0.0 - istanbul-lib-instrument: 6.0.2 - istanbul-lib-processinfo: 2.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.2.0 - make-dir: 3.1.0 - node-preload: 0.2.1 - p-map: 3.0.0 - process-on-spawn: 1.0.0 - resolve-from: 5.0.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - spawn-wrap: 2.0.0 - test-exclude: 6.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - supports-color - object-assign@4.1.1: {} object-hash@2.2.0: {} @@ -22655,10 +21694,6 @@ snapshots: p-map-series@2.1.0: {} - p-map@3.0.0: - dependencies: - aggregate-error: 3.1.0 - p-map@4.0.0: dependencies: aggregate-error: 3.1.0 @@ -22693,33 +21728,6 @@ snapshots: dependencies: p-reduce: 2.1.0 - pac-proxy-agent@7.2.0: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.3 - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - optional: true - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - optional: true - - package-hash@4.0.0: - dependencies: - graceful-fs: 4.2.11 - hasha: 5.2.2 - lodash.flattendeep: 4.4.0 - release-zalgo: 1.0.0 - package-json-from-dist@1.0.1: {} pacote@21.0.1: @@ -22834,17 +21842,6 @@ snapshots: dependencies: parse5: 6.0.1 - parse5-htmlparser2-tree-adapter@7.1.0: - dependencies: - domhandler: 5.0.3 - parse5: 7.3.0 - optional: true - - parse5-parser-stream@7.1.2: - dependencies: - parse5: 7.3.0 - optional: true - parse5@5.1.1: {} parse5@6.0.1: {} @@ -22908,9 +21905,6 @@ snapshots: pathe@2.0.3: {} - pend@1.2.0: - optional: true - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -23100,17 +22094,10 @@ snapshots: process-nextick-args@2.0.1: {} - process-on-spawn@1.0.0: - dependencies: - fromentries: 1.3.2 - process@0.11.10: {} proggy@3.0.0: {} - progress@2.0.3: - optional: true - promise-all-reject-late@1.0.1: {} promise-call-limit@3.0.2: {} @@ -23137,20 +22124,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-agent@6.5.0: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - optional: true - proxy-from-env@1.1.0: {} psl@1.15.0: @@ -23171,9 +22144,6 @@ snapshots: dependencies: side-channel: 1.1.0 - query-selector-shadow-dom@1.0.1: - optional: true - querystringify@2.2.0: optional: true @@ -23505,10 +22475,6 @@ snapshots: relateurl@0.2.7: {} - release-zalgo@1.0.0: - dependencies: - es6-error: 4.1.1 - remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -23547,8 +22513,6 @@ snapshots: require-from-string@2.0.2: {} - require-main-filename@2.0.0: {} - requires-port@1.0.0: optional: true @@ -23580,28 +22544,17 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resq@1.11.0: - dependencies: - fast-deep-equal: 2.0.1 - optional: true - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - ret@0.5.0: - optional: true - retry@0.12.0: {} retry@0.13.1: {} reusify@1.0.4: {} - rgb2hex@0.2.5: - optional: true - rimraf@2.7.1: dependencies: glob: 7.2.3 @@ -23686,9 +22639,6 @@ snapshots: dependencies: tslib: 2.8.1 - safaridriver@1.0.0: - optional: true - safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -23712,11 +22662,6 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 - safe-regex2@5.0.0: - dependencies: - ret: 0.5.0 - optional: true - safer-buffer@2.1.2: {} sax@1.4.1: {} @@ -23765,11 +22710,6 @@ snapshots: transitivePeerDependencies: - supports-color - serialize-error@12.0.0: - dependencies: - type-fest: 4.41.0 - optional: true - serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -24017,18 +22957,6 @@ snapshots: source-map@0.7.4: {} - spacetrim@0.11.59: - optional: true - - spawn-wrap@2.0.0: - dependencies: - foreground-child: 2.0.0 - is-windows: 1.0.2 - make-dir: 3.1.0 - rimraf: 3.0.2 - signal-exit: 3.0.7 - which: 2.0.2 - spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -24047,9 +22975,6 @@ snapshots: dependencies: readable-stream: 3.6.2 - split2@4.2.0: - optional: true - split@1.0.1: dependencies: through: 2.3.8 @@ -24357,19 +23282,6 @@ snapshots: tapable@2.2.1: {} - tar-fs@3.1.1: - dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.5.2 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - optional: true - tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -24591,9 +23503,6 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.26.0: - optional: true - type-fest@4.41.0: optional: true @@ -24641,10 +23550,6 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.10 - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - typedarray@0.0.6: {} typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): @@ -24676,12 +23581,6 @@ snapshots: undici-types@6.21.0: {} - undici@6.22.0: - optional: true - - undici@7.16.0: - optional: true - unicode-canonical-property-names-ecmascript@2.0.0: {} unicode-emoji-modifier-base@1.0.0: {} @@ -24815,9 +23714,6 @@ snapshots: requires-port: 1.0.0 optional: true - urlpattern-polyfill@10.1.0: - optional: true - use-count-up@3.0.1(react@19.2.3): dependencies: react: 19.2.3 @@ -24831,9 +23727,6 @@ snapshots: dependencies: react: 19.2.3 - userhome@1.0.1: - optional: true - util-deprecate@1.0.2: {} util@0.10.4: @@ -24896,22 +23789,22 @@ snapshots: tsx: 4.20.4 yaml: 2.8.0 - vitest-fail-on-console@0.10.1(@vitest/utils@4.0.10)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10): + vitest-fail-on-console@0.10.1(@vitest/utils@4.0.15)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13): dependencies: - '@vitest/utils': 4.0.10 + '@vitest/utils': 4.0.15 chalk: 5.6.2 vite: 7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.10)(@vitest/browser-webdriverio@4.0.10)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) + vitest: 4.0.13(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.13)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0) - vitest@4.0.10(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.10)(@vitest/browser-webdriverio@4.0.10)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0): + vitest@4.0.13(@types/debug@4.1.12)(@types/node@20.19.27)(@vitest/browser-playwright@4.0.13)(happy-dom@15.11.6)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0): dependencies: - '@vitest/expect': 4.0.10 - '@vitest/mocker': 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0)) - '@vitest/pretty-format': 4.0.10 - '@vitest/runner': 4.0.10 - '@vitest/snapshot': 4.0.10 - '@vitest/spy': 4.0.10 - '@vitest/utils': 4.0.10 + '@vitest/expect': 4.0.13 + '@vitest/mocker': 4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0)) + '@vitest/pretty-format': 4.0.13 + '@vitest/runner': 4.0.13 + '@vitest/snapshot': 4.0.13 + '@vitest/spy': 4.0.13 + '@vitest/utils': 4.0.13 debug: 4.4.3 es-module-lexer: 1.7.0 expect-type: 1.2.2 @@ -24928,8 +23821,7 @@ snapshots: optionalDependencies: '@types/debug': 4.1.12 '@types/node': 20.19.27 - '@vitest/browser-playwright': 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(playwright@1.56.1)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10) - '@vitest/browser-webdriverio': 4.0.10(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.10)(webdriverio@9.20.0) + '@vitest/browser-playwright': 4.0.13(msw@2.7.3(@types/node@20.19.27)(typescript@5.9.3))(playwright@1.56.1)(vite@7.2.2(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.39.0)(tsx@4.20.4)(yaml@2.8.0))(vitest@4.0.13) happy-dom: 15.11.6 jsdom: 26.1.0 transitivePeerDependencies: @@ -24950,15 +23842,6 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - wait-port@1.1.0: - dependencies: - chalk: 4.1.2 - commander: 9.5.0 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - optional: true - walk-up-path@4.0.0: {} warning@4.0.3: @@ -24974,67 +23857,6 @@ snapshots: dependencies: defaults: 1.0.3 - web-streams-polyfill@3.3.3: - optional: true - - webdriver@9.20.0: - dependencies: - '@types/node': 20.19.27 - '@types/ws': 8.18.1 - '@wdio/config': 9.20.0 - '@wdio/logger': 9.18.0 - '@wdio/protocols': 9.16.2 - '@wdio/types': 9.20.0 - '@wdio/utils': 9.20.0 - deepmerge-ts: 7.1.5 - https-proxy-agent: 7.0.6 - undici: 6.22.0 - ws: 8.18.3 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate - optional: true - - webdriverio@9.20.0: - dependencies: - '@types/node': 20.19.27 - '@types/sinonjs__fake-timers': 8.1.5 - '@wdio/config': 9.20.0 - '@wdio/logger': 9.18.0 - '@wdio/protocols': 9.16.2 - '@wdio/repl': 9.16.2 - '@wdio/types': 9.20.0 - '@wdio/utils': 9.20.0 - archiver: 7.0.1 - aria-query: 5.3.2 - cheerio: 1.1.2 - css-shorthand-properties: 1.1.2 - css-value: 0.0.1 - grapheme-splitter: 1.0.4 - htmlfy: 0.8.1 - is-plain-obj: 4.1.0 - jszip: 3.10.1 - lodash.clonedeep: 4.5.0 - lodash.zip: 4.2.0 - query-selector-shadow-dom: 1.0.1 - resq: 1.11.0 - rgb2hex: 0.2.5 - serialize-error: 12.0.0 - urlpattern-polyfill: 10.1.0 - webdriver: 9.20.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate - optional: true - webfontloader@1.6.28: {} webidl-conversions@3.0.1: {} @@ -25168,8 +23990,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-module@2.0.0: {} - which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 @@ -25245,13 +24065,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - write-file-atomic@3.0.3: - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 @@ -25301,8 +24114,6 @@ snapshots: xtend@4.0.2: {} - y18n@4.0.3: {} - y18n@5.0.8: {} yallist@3.1.1: {} @@ -25315,31 +24126,12 @@ snapshots: yaml@2.8.0: {} - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} yargs-parser@22.0.0: {} - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 18.1.3 - yargs@16.2.0: dependencies: cliui: 7.0.4 @@ -25369,12 +24161,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - optional: true - yocto-queue@0.1.0: {} yoctocolors-cjs@2.1.3: {} diff --git a/test/e2e/vitest.config.ts b/test/e2e/vitest.config.ts index 7382f40e7d2ca7..4035a59d929ae1 100644 --- a/test/e2e/vitest.config.ts +++ b/test/e2e/vitest.config.ts @@ -3,5 +3,10 @@ import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { globals: true, + server: { + deps: { + inline: ['@mui/internal-test-utils'], + }, + }, }, }); diff --git a/test/package.json b/test/package.json index 978d024dbb1044..d6676af7fc1432 100644 --- a/test/package.json +++ b/test/package.json @@ -10,7 +10,6 @@ "@emotion/react": "^11.14.0", "@mui/base": "5.0.0-beta.70", "@mui/icons-material": "workspace:^", - "@mui/internal-test-utils": "workspace:^", "@mui/joy": "workspace:*", "@mui/lab": "workspace:*", "@mui/material": "workspace:^", diff --git a/test/regressions/vite.config.mts b/test/regressions/vite.config.mts index 4c660f58aac27c..6f0544a1b74a93 100644 --- a/test/regressions/vite.config.mts +++ b/test/regressions/vite.config.mts @@ -65,10 +65,6 @@ export default defineConfig({ WORKSPACE_ROOT, './packages-internal/scripts/typescript-to-proptypes/src', ), - '@mui/internal-test-utils': path.resolve( - WORKSPACE_ROOT, - './packages-internal/test-utils/src', - ), docs: path.resolve(WORKSPACE_ROOT, './docs'), }, }, diff --git a/test/setupVitest.ts b/test/setupVitest.ts new file mode 100644 index 00000000000000..7f41ebf7f3c709 --- /dev/null +++ b/test/setupVitest.ts @@ -0,0 +1,3 @@ +import setupVitest from '@mui/internal-test-utils/setupVitest'; + +setupVitest({ emotion: true }); diff --git a/tsconfig.json b/tsconfig.json index 4c0bc5866d33e7..b9e617b03c85d9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -49,8 +49,6 @@ "@mui/internal-scripts/generate-llms-txt": [ "./packages-internal/scripts/generate-llms-txt/src" ], - "@mui/internal-test-utils": ["./packages-internal/test-utils/src"], - "@mui/internal-test-utils/*": ["./packages-internal/test-utils/src/*"], "@mui/stylis-plugin-rtl": ["./packages/mui-stylis-plugin-rtl/src"], "@mui/stylis-plugin-rtl/*": ["./packages/mui-stylis-plugin-rtl/src/*"], "docs/*": ["./docs/*"] diff --git a/vitest.shared.mts b/vitest.shared.mts index 5fe1664d223db7..9a1dfe818be1f3 100644 --- a/vitest.shared.mts +++ b/vitest.shared.mts @@ -78,17 +78,12 @@ export default async function create( exclude: ['**/node_modules/**', '**/build/**', '**/*.spec.*', '**/.next/**', ...excludes], globals: true, disableConsoleIntercept: true, - setupFiles: [ - path.resolve(MONOREPO_ROOT, './packages-internal/test-utils/src/setupVitest.ts'), - ...(jsdom || testEnv === 'browser' - ? [ - path.resolve( - MONOREPO_ROOT, - './packages-internal/test-utils/src/setupVitestBrowser.ts', - ), - ] - : []), - ], + setupFiles: [path.resolve(MONOREPO_ROOT, './test/setupVitest.ts')], + server: { + deps: { + inline: ['@mui/internal-test-utils'], + }, + }, environment: jsdom ? 'jsdom' : 'node', fakeTimers: { @@ -119,10 +114,6 @@ export default async function create( resolve: { dedupe: ['react', 'react-dom'], alias: { - '@mui/internal-test-utils': path.resolve( - MONOREPO_ROOT, - './packages-internal/test-utils/src', - ), '@mui/internal-docs-utils': path.resolve( MONOREPO_ROOT, './packages-internal/docs-utils/src',