diff --git a/docs/config/index.md b/docs/config/index.md index 0417edf7b5fb..6f768ab4cf62 100644 --- a/docs/config/index.md +++ b/docs/config/index.md @@ -1103,7 +1103,7 @@ List of files included in coverage as glob patterns #### coverage.extension - **Type:** `string | string[]` -- **Default:** `['.js', '.cjs', '.mjs', '.ts', '.mts', '.cts', '.tsx', '.jsx', '.vue', '.svelte', '.marko']` +- **Default:** `['.js', '.cjs', '.mjs', '.ts', '.mts', '.tsx', '.jsx', '.vue', '.svelte', '.marko']` - **Available for providers:** `'v8' | 'istanbul'` - **CLI:** `--coverage.extension=`, `--coverage.extension= --coverage.extension=` @@ -1345,6 +1345,11 @@ Shortcut for `--coverage.thresholds.lines 100 --coverage.thresholds.functions 10 Sets thresholds for files matching the glob pattern. +::: tip NOTE +Vitest counts all files, including those covered by glob-patterns, into the global coverage thresholds. +This is different from Jest behavior. +::: + ```ts { @@ -1372,6 +1377,31 @@ Sets thresholds for files matching the glob pattern. } ``` +##### coverage.thresholds[glob-pattern].100 + +- **Type:** `boolean` +- **Default:** `false` +- **Available for providers:** `'v8' | 'istanbul'` + +Sets thresholds to 100 for files matching the glob pattern. + + +```ts +{ + coverage: { + thresholds: { + // Thresholds for all files + functions: 95, + branches: 70, + + // Thresholds for matching glob pattern + 'src/utils/**.ts': { 100: true }, + '**/math.ts': { 100: true } + } + } +} +``` + #### coverage.ignoreEmptyLines - **Type:** `boolean` diff --git a/docs/guide/browser/commands.md b/docs/guide/browser/commands.md index 958099351279..c54fc4f3199a 100644 --- a/docs/guide/browser/commands.md +++ b/docs/guide/browser/commands.md @@ -132,16 +132,20 @@ Vitest exposes several `playwright` specific properties on the command context. - `context` refers to the unique [BrowserContext](https://playwright.dev/docs/api/class-browsercontext). ```ts -import { defineCommand } from '@vitest/browser' +import { BrowserCommand } from 'vitest/node' -export const myCommand = defineCommand(async (ctx, arg1, arg2) => { +export const myCommand: BrowserCommand<[string, number]> = async ( + ctx, + arg1: string, + arg2: number +) => { if (ctx.provider.name === 'playwright') { const element = await ctx.iframe.findByRole('alert') const screenshot = await element.screenshot() // do something with the screenshot return difference } -}) +} ``` ::: tip diff --git a/docs/guide/browser/index.md b/docs/guide/browser/index.md index 764a0b2a9ed9..2224255d016f 100644 --- a/docs/guide/browser/index.md +++ b/docs/guide/browser/index.md @@ -258,7 +258,7 @@ Vitest browser requires spinning up the provider and the browser during the init ## Cross-Browser Testing -When you specify a browser name in the browser option, Vitest will try to run the specified browser using [WebdriverIO](https://webdriver.io/) by default, and then run the tests there. This feature makes cross-browser testing easy to use and configure in environments like a CI. If you don't want to use WebdriverIO, you can configure the custom browser provider by using `browser.provider` option. +When you specify a browser name in the browser option, Vitest will try to run the specified browser using `preview` by default, and then run the tests there. If you don't want to use `preview`, you can configure the custom browser provider by using `browser.provider` option. To specify a browser using the CLI, use the `--browser` flag followed by the browser name, like this: diff --git a/docs/guide/cli-table.md b/docs/guide/cli-table.md index c343c3bb6250..1ffef7e1f322 100644 --- a/docs/guide/cli-table.md +++ b/docs/guide/cli-table.md @@ -20,7 +20,7 @@ | `--coverage.enabled` | Enables coverage collection. Can be overridden using the `--coverage` CLI option (default: `false`) | | `--coverage.include ` | Files included in coverage as glob patterns. May be specified more than once when using multiple patterns (default: `**`) | | `--coverage.exclude ` | Files to be excluded in coverage. May be specified more than once when using multiple extensions (default: Visit [`coverage.exclude`](https://vitest.dev/config/#coverage-exclude)) | -| `--coverage.extension ` | Extension to be included in coverage. May be specified more than once when using multiple extensions (default: `[".js", ".cjs", ".mjs", ".ts", ".mts", ".cts", ".tsx", ".jsx", ".vue", ".svelte"]`) | +| `--coverage.extension ` | Extension to be included in coverage. May be specified more than once when using multiple extensions (default: `[".js", ".cjs", ".mjs", ".ts", ".mts", ".tsx", ".jsx", ".vue", ".svelte"]`) | | `--coverage.clean` | Clean coverage results before running tests (default: true) | | `--coverage.cleanOnRerun` | Clean coverage report on watch rerun (default: true) | | `--coverage.reportsDirectory ` | Directory to write coverage report to (default: ./coverage) | diff --git a/docs/guide/environment.md b/docs/guide/environment.md index d6f899fe2e1d..88816518a91c 100644 --- a/docs/guide/environment.md +++ b/docs/guide/environment.md @@ -13,6 +13,12 @@ By default, you can use these environments: - `happy-dom` emulates browser environment by providing Browser API, and considered to be faster than jsdom, but lacks some API, uses [`happy-dom`](https://github.com/capricorn86/happy-dom) package - `edge-runtime` emulates Vercel's [edge-runtime](https://edge-runtime.vercel.app/), uses [`@edge-runtime/vm`](https://www.npmjs.com/package/@edge-runtime/vm) package +::: info +When using `jsdom` or `happy-dom` environments, Vitest follows the same rules that Vite does when importing [CSS](https://vitejs.dev/guide/features.html#css) and [assets](https://vitejs.dev/guide/features.html#static-assets). If importing external dependency fails with `unknown extension .css` error, you need to inline the whole import chain manually by adding all packages to [`server.deps.external`](/config/#server-deps-external). For example, if the error happens in `package-3` in this import chain: `source code -> package-1 -> package-2 -> package-3`, you need to add all three packages to `server.deps.external`. + +Since Vitest 2.0.4 the `require` of CSS and assets inside the external dependencies are resolved automatically. +::: + ## Environments for Specific Files When setting `environment` option in your config, it will apply to all the test files in your project. To have more fine-grained control, you can use control comments to specify environment for specific files. Control comments are comments that start with `@vitest-environment` and are followed by the environment name: diff --git a/docs/guide/migration.md b/docs/guide/migration.md index 76baccac610f..8083b68b1344 100644 --- a/docs/guide/migration.md +++ b/docs/guide/migration.md @@ -331,6 +331,15 @@ Where Jest does it by default, when mocking a module and wanting this mocking to server.deps.inline: ["lib-name"] ``` +### expect.getState().currentTestName + +Vitest's `test` names are joined with a `>` symbol to make it easier to distinguish tests from suites, while Jest uses an empty space (` `). + +``` +- `${describeTitle} ${testTitle}` ++ `${describeTitle} > ${testTitle}` +``` + ### Envs Just like Jest, Vitest sets `NODE_ENV` to `test`, if it wasn't set before. Vitest also has a counterpart for `JEST_WORKER_ID` called `VITEST_POOL_ID` (always less than or equal to `maxThreads`), so if you rely on it, don't forget to rename it. Vitest also exposes `VITEST_WORKER_ID` which is a unique ID of a running worker - this number is not affected by `maxThreads`, and will increase with each created worker. diff --git a/docs/guide/mocking.md b/docs/guide/mocking.md index 604913bcc371..7fad80d2fbb3 100644 --- a/docs/guide/mocking.md +++ b/docs/guide/mocking.md @@ -256,7 +256,7 @@ export function foo() { } export function foobar(injectedFoo) { - return injectedFoo !== foo // false + return injectedFoo === foo // false } ``` diff --git a/docs/guide/snapshot.md b/docs/guide/snapshot.md index 756a5a64b874..5fd0bc2c9bf0 100644 --- a/docs/guide/snapshot.md +++ b/docs/guide/snapshot.md @@ -95,7 +95,7 @@ vitest -u When calling `toMatchSnapshot()`, we store all snapshots in a formatted snap file. That means we need to escape some characters (namely the double-quote `"` and backtick `` ` ``) in the snapshot string. Meanwhile, you might lose the syntax highlighting for the snapshot content (if they are in some language). -To improve this case, we introduce [`toMatchFileSnapshot()`](/api/expect#tomatchfilesnapshot) to explicitly snapshot in a file. This allows you to assign any file extension to the snapshot file, and making them more readable. +In light of this, we introduced [`toMatchFileSnapshot()`](/api/expect#tomatchfilesnapshot) to explicitly match against a file. This allows you to assign any file extension to the snapshot file, and makes them more readable. ```ts import { expect, it } from 'vitest' diff --git a/docs/package.json b/docs/package.json index 09da2f98a13e..eec305b69e57 100644 --- a/docs/package.json +++ b/docs/package.json @@ -20,18 +20,18 @@ "devDependencies": { "@iconify-json/carbon": "^1.1.36", "@iconify-json/logos": "^1.1.43", - "@shikijs/vitepress-twoslash": "^1.10.0", - "@unocss/reset": "^0.61.0", + "@shikijs/vitepress-twoslash": "^1.10.3", + "@unocss/reset": "^0.61.3", "@vite-pwa/assets-generator": "^0.2.4", "@vite-pwa/vitepress": "^0.5.0", "@vitejs/plugin-vue": "latest", "fast-glob": "^3.3.2", "https-localhost": "^4.7.1", - "unocss": "^0.61.0", + "unocss": "^0.61.3", "unplugin-vue-components": "^0.27.2", "vite": "^5.2.8", "vite-plugin-pwa": "^0.20.0", - "vitepress": "^1.2.3", + "vitepress": "^1.3.1", "workbox-window": "^7.1.0" } } diff --git a/eslint.config.js b/eslint.config.js index cba65838bba2..6d2c55325d3e 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -51,6 +51,7 @@ export default antfu( // TODO: migrate and turn it back on 'ts/ban-types': 'off', + 'ts/no-unsafe-function-type': 'off', 'no-restricted-imports': [ 'error', diff --git a/package.json b/package.json index ad094d41d1a0..91e6f68f4326 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/monorepo", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "private": true, "packageManager": "pnpm@9.5.0", "description": "Next generation testing framework powered by Vite", @@ -36,34 +36,34 @@ "test:browser:playwright": "pnpm -C test/browser run test:playwright" }, "devDependencies": { - "@antfu/eslint-config": "^2.21.2", - "@antfu/ni": "^0.21.12", - "@playwright/test": "^1.45.0", + "@antfu/eslint-config": "^2.22.2", + "@antfu/ni": "^0.22.0", + "@playwright/test": "^1.45.1", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", - "@types/node": "^20.14.9", - "@types/ws": "^8.5.10", + "@types/node": "^20.14.10", + "@types/ws": "^8.5.11", "@vitest/browser": "workspace:*", "@vitest/coverage-istanbul": "workspace:*", "@vitest/coverage-v8": "workspace:*", "@vitest/ui": "workspace:*", "bumpp": "^9.4.1", - "esbuild": "^0.22.0", - "eslint": "^9.6.0", + "esbuild": "^0.23.0", + "eslint": "^9.7.0", "fast-glob": "^3.3.2", "magic-string": "^0.30.10", "pathe": "^1.1.2", "rimraf": "^6.0.1", - "rollup": "^4.18.0", + "rollup": "^4.18.1", "rollup-plugin-dts": "^6.1.1", "rollup-plugin-esbuild": "^6.1.1", - "rollup-plugin-license": "^3.5.1", - "tsx": "^4.16.0", - "typescript": "^5.5.2", + "rollup-plugin-license": "^3.5.2", + "tsx": "^4.16.2", + "typescript": "^5.5.3", "vite": "^5.3.3", "vitest": "workspace:*", - "zx": "^8.1.3" + "zx": "^8.1.4" }, "pnpm": { "overrides": { diff --git a/packages/browser/package.json b/packages/browser/package.json index d7623dc3b417..cec5746b957b 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/browser", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Browser running for Vitest", "license": "MIT", "funding": "https://opencollective.com/vitest", @@ -76,17 +76,17 @@ } }, "dependencies": { - "@testing-library/dom": "^10.2.0", + "@testing-library/dom": "^10.3.1", "@testing-library/user-event": "^14.5.2", "@vitest/utils": "workspace:*", "magic-string": "^0.30.10", "msw": "^2.3.1", "sirv": "^2.0.4", - "ws": "^8.17.1" + "ws": "^8.18.0" }, "devDependencies": { "@testing-library/jest-dom": "^6.4.6", - "@types/ws": "^8.5.10", + "@types/ws": "^8.5.11", "@vitest/runner": "workspace:*", "@vitest/ui": "workspace:*", "@vitest/ws-client": "workspace:*", @@ -95,10 +95,10 @@ "flatted": "^3.3.1", "pathe": "^1.1.2", "periscopic": "^4.0.2", - "playwright": "^1.45.0", - "playwright-core": "^1.45.0", + "playwright": "^1.45.1", + "playwright-core": "^1.45.1", "safaridriver": "^0.1.2", "vitest": "workspace:*", - "webdriverio": "^8.39.0" + "webdriverio": "^8.39.1" } } diff --git a/packages/browser/rollup.config.js b/packages/browser/rollup.config.js index 64987eb9cb74..f846fb865e0b 100644 --- a/packages/browser/rollup.config.js +++ b/packages/browser/rollup.config.js @@ -43,7 +43,22 @@ export default () => format: 'esm', }, external, - plugins, + plugins: [ + { + name: 'no-side-effects', + async resolveId(id, importer) { + // Clipboard injects "afterEach" callbacks + // We mark it as having no side effects to prevent it from being included in the bundle + if (id.includes('dataTransfer/Clipboard')) { + return { + ...await this.resolve(id, importer), + moduleSideEffects: false, + } + } + }, + }, + ...plugins, + ], }, { input: './src/client/tester/context.ts', diff --git a/packages/browser/src/client/tester/mocker.ts b/packages/browser/src/client/tester/mocker.ts index 785e0bc3292d..7b6dd34dee53 100644 --- a/packages/browser/src/client/tester/mocker.ts +++ b/packages/browser/src/client/tester/mocker.ts @@ -236,7 +236,7 @@ export class VitestBrowserClientMocker { try { Object.defineProperty(newContainer, property, descriptor) } - catch (error) { + catch { // Ignore errors, just move on to the next prop. } continue diff --git a/packages/browser/src/client/tester/runner.ts b/packages/browser/src/client/tester/runner.ts index 4ec5a4c9531a..ff4212c73ff2 100644 --- a/packages/browser/src/client/tester/runner.ts +++ b/packages/browser/src/client/tester/runner.ts @@ -110,7 +110,7 @@ export function createBrowserRunner( try { await updateFilesLocations(files, this.sourceMapCache) } - catch (_) {} + catch {} } return rpc().onCollected(files) } diff --git a/packages/browser/src/client/tester/tester.ts b/packages/browser/src/client/tester/tester.ts index 0df244db66bc..5d8bb1ded675 100644 --- a/packages/browser/src/client/tester/tester.ts +++ b/packages/browser/src/client/tester/tester.ts @@ -112,6 +112,8 @@ async function executeTests(method: 'run' | 'collect', files: string[]) { try { await setupCommonEnv(config) for (const file of files) { + state.filepath = file + if (method === 'run') { await startTests([file], runner) } diff --git a/packages/browser/src/node/plugin.ts b/packages/browser/src/node/plugin.ts index e4dc57e83cac..38b72b87aa9b 100644 --- a/packages/browser/src/node/plugin.ts +++ b/packages/browser/src/node/plugin.ts @@ -1,7 +1,8 @@ import { fileURLToPath } from 'node:url' import { createRequire } from 'node:module' -import { readFileSync } from 'node:fs' -import { basename, resolve } from 'pathe' +import { lstatSync, readFileSync } from 'node:fs' +import type { Stats } from 'node:fs' +import { basename, extname, resolve } from 'pathe' import sirv from 'sirv' import type { WorkspaceProject } from 'vitest/node' import { getFilePoolName, resolveApiServerConfig, resolveFsAllow, distDir as vitestDist } from 'vitest/node' @@ -87,19 +88,69 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => { ) } - coverageFolder && server.middlewares.use( - coveragePath!, - sirv(coverageFolder[0], { - single: true, - dev: true, - setHeaders: (res) => { - res.setHeader( - 'Cache-Control', - 'public,max-age=0,must-revalidate', - ) - }, - }), - ) + if (coverageFolder) { + server.middlewares.use( + coveragePath!, + sirv(coverageFolder[0], { + single: true, + dev: true, + setHeaders: (res) => { + res.setHeader( + 'Cache-Control', + 'public,max-age=0,must-revalidate', + ) + }, + }), + ) + } + + const screenshotFailures = project.config.browser.ui && project.config.browser.screenshotFailures + + if (screenshotFailures) { + // eslint-disable-next-line prefer-arrow-callback + server.middlewares.use(`${base}__screenshot-error`, function vitestBrowserScreenshotError(req, res) { + if (!req.url || !browserServer.provider) { + res.statusCode = 404 + res.end() + return + } + + const url = new URL(req.url, 'http://localhost') + const file = url.searchParams.get('file') + if (!file) { + res.statusCode = 404 + res.end() + return + } + + let stat: Stats | undefined + try { + stat = lstatSync(file) + } + catch { + } + + if (!stat?.isFile()) { + res.statusCode = 404 + res.end() + return + } + + const ext = extname(file) + const buffer = readFileSync(file) + res.setHeader( + 'Cache-Control', + 'public,max-age=0,must-revalidate', + ) + res.setHeader('Content-Length', buffer.length) + res.setHeader('Content-Type', ext === 'jpeg' || ext === 'jpg' + ? 'image/jpeg' + : ext === 'webp' + ? 'image/webp' + : 'image/png') + res.end(buffer) + }) + } }, }, { @@ -268,6 +319,7 @@ export default (browserServer: BrowserServer, base = '/'): Plugin[] => { project.ctx.config.root, project.ctx.server.config.configFile, ), + distRoot, ) return { diff --git a/packages/coverage-istanbul/package.json b/packages/coverage-istanbul/package.json index bbbccefc14ea..cca9d12085b0 100644 --- a/packages/coverage-istanbul/package.json +++ b/packages/coverage-istanbul/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/coverage-istanbul", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Istanbul coverage provider for Vitest", "author": "Anthony Fu ", "license": "MIT", diff --git a/packages/coverage-istanbul/src/constants.ts b/packages/coverage-istanbul/src/constants.ts index 1f81d8ad9fd9..a8ff606d23bf 100644 --- a/packages/coverage-istanbul/src/constants.ts +++ b/packages/coverage-istanbul/src/constants.ts @@ -1 +1 @@ -export const COVERAGE_STORE_KEY = '__VITEST_COVERAGE__' +export const COVERAGE_STORE_KEY: string = '__VITEST_COVERAGE__' diff --git a/packages/coverage-istanbul/src/index.ts b/packages/coverage-istanbul/src/index.ts index f20c95582c96..b02518138873 100644 --- a/packages/coverage-istanbul/src/index.ts +++ b/packages/coverage-istanbul/src/index.ts @@ -1,6 +1,7 @@ import { COVERAGE_STORE_KEY } from './constants' +import type { IstanbulCoverageProvider } from './provider' -export async function getProvider() { +export async function getProvider(): Promise { // to not bundle the provider const providerPath = './provider.js' const { IstanbulCoverageProvider } = (await import( @@ -10,7 +11,7 @@ export async function getProvider() { return new IstanbulCoverageProvider() } -export function takeCoverage() { +export function takeCoverage(): any { // @ts-expect-error -- untyped global const coverage = globalThis[COVERAGE_STORE_KEY] @@ -21,7 +22,12 @@ export function takeCoverage() { return coverage } -export default { +const _default: { + getProvider: () => Promise + takeCoverage: () => any +} = { getProvider, takeCoverage, } + +export default _default diff --git a/packages/coverage-istanbul/src/provider.ts b/packages/coverage-istanbul/src/provider.ts index ae909f519cb0..8597ef200c56 100644 --- a/packages/coverage-istanbul/src/provider.ts +++ b/packages/coverage-istanbul/src/provider.ts @@ -57,13 +57,11 @@ interface TestExclude { } } -const DEFAULT_PROJECT = Symbol.for('default-project') +const DEFAULT_PROJECT: unique symbol = Symbol.for('default-project') const debug = createDebug('vitest:coverage') let uniqueId = 0 -export class IstanbulCoverageProvider - extends BaseCoverageProvider - implements CoverageProvider { +export class IstanbulCoverageProvider extends BaseCoverageProvider implements CoverageProvider { name = 'istanbul' ctx!: Vitest @@ -71,11 +69,11 @@ export class IstanbulCoverageProvider instrumenter!: Instrumenter testExclude!: InstanceType - coverageFiles = new Map() + coverageFiles: Map = new Map() coverageFilesDirectory!: string pendingPromises: Promise[] = [] - initialize(ctx: Vitest) { + initialize(ctx: Vitest): void { const config: CoverageIstanbulOptions = ctx.config.coverage this.ctx = ctx @@ -145,11 +143,14 @@ export class IstanbulCoverageProvider ) } - resolveOptions() { + resolveOptions(): Options { return this.options } - onFileTransform(sourceCode: string, id: string, pluginCtx: any) { + onFileTransform(sourceCode: string, id: string, pluginCtx: any): { + code: string + map: any + } | undefined { if (!this.testExclude.shouldInstrument(id)) { return } @@ -178,7 +179,7 @@ export class IstanbulCoverageProvider * Note that adding new entries here and requiring on those without * backwards compatibility is a breaking change. */ - onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta) { + onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta): void { if (!coverage) { return } @@ -204,7 +205,7 @@ export class IstanbulCoverageProvider this.pendingPromises.push(promise) } - async clean(clean = true) { + async clean(clean = true): Promise { if (clean && existsSync(this.options.reportsDirectory)) { await fs.rm(this.options.reportsDirectory, { recursive: true, @@ -227,7 +228,7 @@ export class IstanbulCoverageProvider this.pendingPromises = [] } - async generateCoverage({ allTestsRun }: ReportContext) { + async generateCoverage({ allTestsRun }: ReportContext): Promise { const coverageMap = libCoverage.createCoverageMap({}) let index = 0 const total = this.pendingPromises.length @@ -282,7 +283,7 @@ export class IstanbulCoverageProvider return coverageMap } - async reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext) { + async reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext): Promise { await this.generateReports( (coverageMap as CoverageMap) || libCoverage.createCoverageMap({}), allTestsRun, @@ -305,7 +306,7 @@ export class IstanbulCoverageProvider async generateReports( coverageMap: CoverageMap, allTestsRun: boolean | undefined, - ) { + ): Promise { const context = libReport.createContext({ dir: this.options.reportsDirectory, coverageMap, @@ -370,7 +371,7 @@ export class IstanbulCoverageProvider } } - async mergeReports(coverageMaps: unknown[]) { + async mergeReports(coverageMaps: unknown[]): Promise { const coverageMap = libCoverage.createCoverageMap({}) for (const coverage of coverageMaps) { diff --git a/packages/coverage-istanbul/tsconfig.json b/packages/coverage-istanbul/tsconfig.json index 8bcb003f8ee0..73cb131061ac 100644 --- a/packages/coverage-istanbul/tsconfig.json +++ b/packages/coverage-istanbul/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler" + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] } diff --git a/packages/coverage-v8/package.json b/packages/coverage-v8/package.json index 78f1e4b92f5d..89942b95ef2d 100644 --- a/packages/coverage-v8/package.json +++ b/packages/coverage-v8/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/coverage-v8", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "V8 coverage provider for Vitest", "author": "Anthony Fu ", "license": "MIT", @@ -54,7 +54,6 @@ "magic-string": "^0.30.10", "magicast": "^0.3.4", "std-env": "^3.7.0", - "strip-literal": "^2.1.0", "test-exclude": "^7.0.1", "tinyrainbow": "^1.2.0" }, diff --git a/packages/coverage-v8/src/index.ts b/packages/coverage-v8/src/index.ts index c7a0ee47a8e6..fb03b3b8b387 100644 --- a/packages/coverage-v8/src/index.ts +++ b/packages/coverage-v8/src/index.ts @@ -1,8 +1,18 @@ +import type { Profiler } from 'node:inspector' import * as coverage from './takeCoverage' +import type { V8CoverageProvider } from './provider' export default { - ...coverage, - async getProvider() { + startCoverage(): void { + return coverage.startCoverage() + }, + takeCoverage(): Promise<{ result: Profiler.ScriptCoverage[] }> { + return coverage.takeCoverage() + }, + stopCoverage(): void { + return coverage.stopCoverage() + }, + async getProvider(): Promise { // to not bundle the provider const name = './provider.js' const { V8CoverageProvider } = (await import( diff --git a/packages/coverage-v8/src/provider.ts b/packages/coverage-v8/src/provider.ts index aa01dced6bfe..ca038ed47902 100644 --- a/packages/coverage-v8/src/provider.ts +++ b/packages/coverage-v8/src/provider.ts @@ -19,7 +19,6 @@ import remapping from '@ampproject/remapping' import { normalize, resolve } from 'pathe' import c from 'tinyrainbow' import { provider } from 'std-env' -import { stripLiteral } from 'strip-literal' import createDebug from 'debug' import { cleanUrl } from 'vite-node/utils' import type { EncodedSourceMap, FetchResult } from 'vite-node' @@ -73,25 +72,23 @@ const VITE_EXPORTS_LINE_PATTERN = /Object\.defineProperty\(__vite_ssr_exports__.*\n/g const DECORATOR_METADATA_PATTERN = /_ts_metadata\("design:paramtypes", \[[^\]]*\]\),*/g -const DEFAULT_PROJECT = Symbol.for('default-project') +const DEFAULT_PROJECT: unique symbol = Symbol.for('default-project') const debug = createDebug('vitest:coverage') let uniqueId = 0 -export class V8CoverageProvider - extends BaseCoverageProvider - implements CoverageProvider { +export class V8CoverageProvider extends BaseCoverageProvider implements CoverageProvider { name = 'v8' ctx!: Vitest options!: Options testExclude!: InstanceType - coverageFiles = new Map() + coverageFiles: Map = new Map() coverageFilesDirectory!: string pendingPromises: Promise[] = [] - initialize(ctx: Vitest) { + initialize(ctx: Vitest): void { const config: CoverageV8Options = ctx.config.coverage this.ctx = ctx @@ -142,11 +139,11 @@ export class V8CoverageProvider ) } - resolveOptions() { + resolveOptions(): Options { return this.options } - async clean(clean = true) { + async clean(clean = true): Promise { if (clean && existsSync(this.options.reportsDirectory)) { await fs.rm(this.options.reportsDirectory, { recursive: true, @@ -174,7 +171,7 @@ export class V8CoverageProvider * Note that adding new entries here and requiring on those without * backwards compatibility is a breaking change. */ - onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta) { + onAfterSuiteRun({ coverage, transformMode, projectName }: AfterSuiteRunMeta): void { if (transformMode !== 'web' && transformMode !== 'ssr') { throw new Error(`Invalid transform mode: ${transformMode}`) } @@ -196,7 +193,7 @@ export class V8CoverageProvider this.pendingPromises.push(promise) } - async generateCoverage({ allTestsRun }: ReportContext) { + async generateCoverage({ allTestsRun }: ReportContext): Promise { const coverageMap = libCoverage.createCoverageMap({}) let index = 0 const total = this.pendingPromises.length @@ -255,7 +252,7 @@ export class V8CoverageProvider return coverageMap } - async reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext) { + async reportCoverage(coverageMap: unknown, { allTestsRun }: ReportContext): Promise { if (provider === 'stackblitz') { this.ctx.logger.log( c.blue(' % ') @@ -284,7 +281,7 @@ export class V8CoverageProvider } } - async generateReports(coverageMap: CoverageMap, allTestsRun?: boolean) { + async generateReports(coverageMap: CoverageMap, allTestsRun?: boolean): Promise { const context = libReport.createContext({ dir: this.options.reportsDirectory, coverageMap, @@ -349,7 +346,7 @@ export class V8CoverageProvider } } - async mergeReports(coverageMaps: unknown[]) { + async mergeReports(coverageMaps: unknown[]): Promise { const coverageMap = libCoverage.createCoverageMap({}) for (const coverage of coverageMaps) { @@ -393,16 +390,11 @@ export class V8CoverageProvider const coverages = await Promise.all( chunk.map(async (filename) => { - const { originalSource, source } = await this.getSources( + const { originalSource } = await this.getSources( filename.href, transformResults, ) - // Ignore empty files, e.g. files that contain only typescript types and no runtime code - if (source && stripLiteral(source).trim() === '') { - return null - } - const coverage = { url: filename.href, scriptId: '0', diff --git a/packages/coverage-v8/src/takeCoverage.ts b/packages/coverage-v8/src/takeCoverage.ts index 0172ff0d8be9..4ffabbd93017 100644 --- a/packages/coverage-v8/src/takeCoverage.ts +++ b/packages/coverage-v8/src/takeCoverage.ts @@ -8,7 +8,7 @@ import { provider } from 'std-env' const session = new inspector.Session() -export function startCoverage() { +export function startCoverage(): void { session.connect() session.post('Profiler.enable') session.post('Profiler.startPreciseCoverage', { @@ -17,7 +17,7 @@ export function startCoverage() { }) } -export async function takeCoverage() { +export async function takeCoverage(): Promise<{ result: Profiler.ScriptCoverage[] }> { return new Promise((resolve, reject) => { session.post('Profiler.takePreciseCoverage', async (error, coverage) => { if (error) { @@ -36,7 +36,7 @@ export async function takeCoverage() { }) } -export function stopCoverage() { +export function stopCoverage(): void { session.post('Profiler.stopPreciseCoverage') session.post('Profiler.disable') session.disconnect() diff --git a/packages/coverage-v8/tsconfig.json b/packages/coverage-v8/tsconfig.json index 8bcb003f8ee0..73cb131061ac 100644 --- a/packages/coverage-v8/tsconfig.json +++ b/packages/coverage-v8/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler" + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] } diff --git a/packages/expect/package.json b/packages/expect/package.json index e51dde74e920..1423a9a504b4 100644 --- a/packages/expect/package.json +++ b/packages/expect/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/expect", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Jest's expect matchers as a Chai plugin", "license": "MIT", "funding": "https://opencollective.com/vitest", diff --git a/packages/expect/src/jest-matcher-utils.ts b/packages/expect/src/jest-matcher-utils.ts index b206802f3223..918b3be1ca14 100644 --- a/packages/expect/src/jest-matcher-utils.ts +++ b/packages/expect/src/jest-matcher-utils.ts @@ -1,97 +1,101 @@ import { getType, stringify } from '@vitest/utils' import c from 'tinyrainbow' +import { diff, printDiffOrStringify } from '@vitest/utils/diff' import type { MatcherHintOptions, Tester } from './types' import { JEST_MATCHERS_OBJECT } from './constants' export { diff } from '@vitest/utils/diff' export { stringify } -export function getMatcherUtils() { - const EXPECTED_COLOR = c.green - const RECEIVED_COLOR = c.red - const INVERTED_COLOR = c.inverse - const BOLD_WEIGHT = c.bold - const DIM_COLOR = c.dim - - function matcherHint( - matcherName: string, - received = 'received', - expected = 'expected', - options: MatcherHintOptions = {}, - ) { - const { - comment = '', - isDirectExpectCall = false, // seems redundant with received === '' - isNot = false, - promise = '', - secondArgument = '', - expectedColor = EXPECTED_COLOR, - receivedColor = RECEIVED_COLOR, - secondArgumentColor = EXPECTED_COLOR, - } = options - let hint = '' - let dimString = 'expect' // concatenate adjacent dim substrings - - if (!isDirectExpectCall && received !== '') { - hint += DIM_COLOR(`${dimString}(`) + receivedColor(received) - dimString = ')' - } - - if (promise !== '') { - hint += DIM_COLOR(`${dimString}.`) + promise - dimString = '' - } +const EXPECTED_COLOR = c.green +const RECEIVED_COLOR = c.red +const INVERTED_COLOR = c.inverse +const BOLD_WEIGHT = c.bold +const DIM_COLOR = c.dim + +function matcherHint( + matcherName: string, + received = 'received', + expected = 'expected', + options: MatcherHintOptions = {}, +) { + const { + comment = '', + isDirectExpectCall = false, // seems redundant with received === '' + isNot = false, + promise = '', + secondArgument = '', + expectedColor = EXPECTED_COLOR, + receivedColor = RECEIVED_COLOR, + secondArgumentColor = EXPECTED_COLOR, + } = options + let hint = '' + let dimString = 'expect' // concatenate adjacent dim substrings + + if (!isDirectExpectCall && received !== '') { + hint += DIM_COLOR(`${dimString}(`) + receivedColor(received) + dimString = ')' + } - if (isNot) { - hint += `${DIM_COLOR(`${dimString}.`)}not` - dimString = '' - } + if (promise !== '') { + hint += DIM_COLOR(`${dimString}.`) + promise + dimString = '' + } - if (matcherName.includes('.')) { - // Old format: for backward compatibility, - // especially without promise or isNot options - dimString += matcherName - } - else { - // New format: omit period from matcherName arg - hint += DIM_COLOR(`${dimString}.`) + matcherName - dimString = '' - } + if (isNot) { + hint += `${DIM_COLOR(`${dimString}.`)}not` + dimString = '' + } - if (expected === '') { - dimString += '()' - } - else { - hint += DIM_COLOR(`${dimString}(`) + expectedColor(expected) - if (secondArgument) { - hint += DIM_COLOR(', ') + secondArgumentColor(secondArgument) - } - dimString = ')' - } + if (matcherName.includes('.')) { + // Old format: for backward compatibility, + // especially without promise or isNot options + dimString += matcherName + } + else { + // New format: omit period from matcherName arg + hint += DIM_COLOR(`${dimString}.`) + matcherName + dimString = '' + } - if (comment !== '') { - dimString += ` // ${comment}` + if (expected === '') { + dimString += '()' + } + else { + hint += DIM_COLOR(`${dimString}(`) + expectedColor(expected) + if (secondArgument) { + hint += DIM_COLOR(', ') + secondArgumentColor(secondArgument) } + dimString = ')' + } - if (dimString !== '') { - hint += DIM_COLOR(dimString) - } + if (comment !== '') { + dimString += ` // ${comment}` + } - return hint + if (dimString !== '') { + hint += DIM_COLOR(dimString) } - const SPACE_SYMBOL = '\u{00B7}' // middle dot + return hint +} + +const SPACE_SYMBOL = '\u{00B7}' // middle dot - // Instead of inverse highlight which now implies a change, - // replace common spaces with middle dot at the end of any line. - const replaceTrailingSpaces = (text: string): string => - text.replace(/\s+$/gm, spaces => SPACE_SYMBOL.repeat(spaces.length)) +// Instead of inverse highlight which now implies a change, +// replace common spaces with middle dot at the end of any line. +function replaceTrailingSpaces(text: string): string { + return text.replace(/\s+$/gm, spaces => SPACE_SYMBOL.repeat(spaces.length)) +} - const printReceived = (object: unknown): string => - RECEIVED_COLOR(replaceTrailingSpaces(stringify(object))) - const printExpected = (value: unknown): string => - EXPECTED_COLOR(replaceTrailingSpaces(stringify(value))) +function printReceived(object: unknown): string { + return RECEIVED_COLOR(replaceTrailingSpaces(stringify(object))) +} +function printExpected(value: unknown): string { + return EXPECTED_COLOR(replaceTrailingSpaces(stringify(value))) +} +export function getMatcherUtils() { return { EXPECTED_COLOR, RECEIVED_COLOR, @@ -99,9 +103,11 @@ export function getMatcherUtils() { BOLD_WEIGHT, DIM_COLOR, + diff, matcherHint, printReceived, printExpected, + printDiffOrStringify, } } diff --git a/packages/expect/src/types.ts b/packages/expect/src/types.ts index 47e0e1d07610..633f6212ce36 100644 --- a/packages/expect/src/types.ts +++ b/packages/expect/src/types.ts @@ -119,7 +119,7 @@ export interface JestAssertion extends jest.Matchers { toStrictEqual: (expected: E) => void toBe: (expected: E) => void toMatch: (expected: string | RegExp) => void - toMatchObject: (expected: E) => void + toMatchObject: (expected: E) => void toContain: (item: E) => void toContainEqual: (item: E) => void toBeTruthy: () => void @@ -212,7 +212,7 @@ declare global { // support augmenting jest.Matchers by other libraries // eslint-disable-next-line ts/no-namespace namespace jest { - // eslint-disable-next-line unused-imports/no-unused-vars + // eslint-disable-next-line unused-imports/no-unused-vars, ts/no-empty-object-type interface Matchers {} } } diff --git a/packages/pretty-format/package.json b/packages/pretty-format/package.json index 3515b316b505..5dc54503ea7c 100644 --- a/packages/pretty-format/package.json +++ b/packages/pretty-format/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/pretty-format", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Fork of pretty-format with support for ESM", "license": "MIT", "funding": "https://opencollective.com/vitest", diff --git a/packages/pretty-format/src/index.ts b/packages/pretty-format/src/index.ts index 875bc00d7431..3872d68449f8 100644 --- a/packages/pretty-format/src/index.ts +++ b/packages/pretty-format/src/index.ts @@ -402,7 +402,7 @@ const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME) as Array< keyof typeof DEFAULT_THEME > -export const DEFAULT_OPTIONS = { +export const DEFAULT_OPTIONS: Options = { callToJSON: true, compareKeys: undefined, escapeRegex: false, @@ -528,7 +528,14 @@ export function format(val: unknown, options?: OptionsReceived): string { return printComplexValue(val, getConfig(options), '', 0, []) } -export const plugins = { +export const plugins: { + AsymmetricMatcher: NewPlugin + DOMCollection: NewPlugin + DOMElement: NewPlugin + Immutable: NewPlugin + ReactElement: NewPlugin + ReactTestComponent: NewPlugin +} = { AsymmetricMatcher, DOMCollection, DOMElement, diff --git a/packages/pretty-format/tsconfig.json b/packages/pretty-format/tsconfig.json index 42a2e6729e88..0cf27b66ffcf 100644 --- a/packages/pretty-format/tsconfig.json +++ b/packages/pretty-format/tsconfig.json @@ -1,7 +1,9 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "lib": ["ESNext", "DOM", "DOM.Iterable"] + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "moduleResolution": "Bundler", + "isolatedDeclarations": true }, "include": ["src/**/*"], "exclude": ["**/dist/**"] diff --git a/packages/runner/package.json b/packages/runner/package.json index bb37fc0ed77e..8a03f6168885 100644 --- a/packages/runner/package.json +++ b/packages/runner/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/runner", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Vitest test runner", "license": "MIT", "funding": "https://opencollective.com/vitest", diff --git a/packages/runner/rollup.config.js b/packages/runner/rollup.config.js index 5b5fb6e1d1d2..98b09420675d 100644 --- a/packages/runner/rollup.config.js +++ b/packages/runner/rollup.config.js @@ -17,7 +17,7 @@ const external = [ const entries = { index: 'src/index.ts', utils: 'src/utils/index.ts', - types: 'src/types/index.ts', + types: 'src/types.ts', } const plugins = [ diff --git a/packages/runner/src/collect.ts b/packages/runner/src/collect.ts index 63837a6ba1d7..74c2d1230095 100644 --- a/packages/runner/src/collect.ts +++ b/packages/runner/src/collect.ts @@ -1,5 +1,5 @@ import { processError } from '@vitest/utils/error' -import type { File, SuiteHooks } from './types' +import type { File, SuiteHooks } from './types/tasks' import type { VitestRunner } from './types/runner' import { calculateSuiteHash, diff --git a/packages/runner/src/context.ts b/packages/runner/src/context.ts index a4b77e38cb4f..f03b389c2484 100644 --- a/packages/runner/src/context.ts +++ b/packages/runner/src/context.ts @@ -7,7 +7,7 @@ import type { SuiteCollector, TaskContext, Test, -} from './types' +} from './types/tasks' import type { VitestRunner } from './types/runner' import { PendingError } from './errors' @@ -16,14 +16,14 @@ export const collectorContext: RuntimeContext = { currentSuite: null, } -export function collectTask(task: SuiteCollector) { +export function collectTask(task: SuiteCollector): void { collectorContext.currentSuite?.tasks.push(task) } export async function runWithSuite( suite: SuiteCollector, fn: () => Awaitable, -) { +): Promise { const prev = collectorContext.currentSuite collectorContext.currentSuite = suite await fn() diff --git a/packages/runner/src/errors.ts b/packages/runner/src/errors.ts index b9c50bcd47f9..3ce264122843 100644 --- a/packages/runner/src/errors.ts +++ b/packages/runner/src/errors.ts @@ -1,4 +1,4 @@ -import type { TaskBase } from './types' +import type { TaskBase } from './types/tasks' export class PendingError extends Error { public code = 'VITEST_PENDING' diff --git a/packages/runner/src/fixture.ts b/packages/runner/src/fixture.ts index 79f4a5d895a5..11bf8756b726 100644 --- a/packages/runner/src/fixture.ts +++ b/packages/runner/src/fixture.ts @@ -1,6 +1,6 @@ import { createDefer, isObject } from '@vitest/utils' import { getFixture } from './map' -import type { FixtureOptions, TestContext } from './types' +import type { FixtureOptions, TestContext } from './types/tasks' export interface FixtureItem extends FixtureOptions { prop: string @@ -18,7 +18,9 @@ export interface FixtureItem extends FixtureOptions { export function mergeContextFixtures( fixtures: Record, context: { fixtures?: FixtureItem[] } = {}, -) { +): { + fixtures?: FixtureItem[] + } { const fixtureOptionKeys = ['auto'] const fixtureArray: FixtureItem[] = Object.entries(fixtures).map( ([prop, value]) => { @@ -69,7 +71,7 @@ const cleanupFnArrayMap = new Map< Array<() => void | Promise> >() -export async function callFixtureCleanup(context: TestContext) { +export async function callFixtureCleanup(context: TestContext): Promise { const cleanupFnArray = cleanupFnArrayMap.get(context) ?? [] for (const cleanup of cleanupFnArray.reverse()) { await cleanup() @@ -78,7 +80,7 @@ export async function callFixtureCleanup(context: TestContext) { } export function withFixtures(fn: Function, testContext?: TestContext) { - return (hookContext?: TestContext) => { + return (hookContext?: TestContext): any => { const context: (TestContext & { [key: string]: any }) | undefined = hookContext || testContext diff --git a/packages/runner/src/hooks.ts b/packages/runner/src/hooks.ts index 694ecfc1d2e0..44ea8eea2a14 100644 --- a/packages/runner/src/hooks.ts +++ b/packages/runner/src/hooks.ts @@ -1,9 +1,13 @@ import type { + AfterAllListener, + AfterEachListener, + BeforeAllListener, + BeforeEachListener, OnTestFailedHandler, OnTestFinishedHandler, - SuiteHooks, + TaskHook, TaskPopulated, -} from './types' +} from './types/tasks' import { getCurrentSuite, getRunner } from './suite' import { getCurrentTest } from './test-state' import { withTimeout } from './context' @@ -13,65 +17,172 @@ function getDefaultHookTimeout() { return getRunner().config.hookTimeout } -// suite hooks -export function beforeAll(fn: SuiteHooks['beforeAll'][0], timeout?: number) { +/** + * Registers a callback function to be executed once before all tests within the current suite. + * This hook is useful for scenarios where you need to perform setup operations that are common to all tests in a suite, such as initializing a database connection or setting up a test environment. + * + * **Note:** The `beforeAll` hooks are executed in the order they are defined one after another. You can configure this by changing the `sequence.hooks` option in the config file. + * + * @param {Function} fn - The callback function to be executed before all tests. + * @param {number} [timeout] - Optional timeout in milliseconds for the hook. If not provided, the default hook timeout from the runner's configuration is used. + * @returns {void} + * + * @example + * // Example of using beforeAll to set up a database connection + * beforeAll(async () => { + * await database.connect(); + * }); + */ +export function beforeAll(fn: BeforeAllListener, timeout?: number): void { return getCurrentSuite().on( 'beforeAll', withTimeout(fn, timeout ?? getDefaultHookTimeout(), true), ) } -export function afterAll(fn: SuiteHooks['afterAll'][0], timeout?: number) { + +/** + * Registers a callback function to be executed once after all tests within the current suite have completed. + * This hook is useful for scenarios where you need to perform cleanup operations after all tests in a suite have run, such as closing database connections or cleaning up temporary files. + * + * **Note:** The `afterAll` hooks are running in reverse order of their registration. You can configure this by changing the `sequence.hooks` option in the config file. + * + * @param {Function} fn - The callback function to be executed after all tests. + * @param {number} [timeout] - Optional timeout in milliseconds for the hook. If not provided, the default hook timeout from the runner's configuration is used. + * @returns {void} + * + * @example + * // Example of using afterAll to close a database connection + * afterAll(async () => { + * await database.disconnect(); + * }); + */ +export function afterAll(fn: AfterAllListener, timeout?: number): void { return getCurrentSuite().on( 'afterAll', withTimeout(fn, timeout ?? getDefaultHookTimeout(), true), ) } -export function beforeEach( - fn: SuiteHooks['beforeEach'][0], + +/** + * Registers a callback function to be executed before each test within the current suite. + * This hook is useful for scenarios where you need to reset or reinitialize the test environment before each test runs, such as resetting database states, clearing caches, or reinitializing variables. + * + * **Note:** The `beforeEach` hooks are executed in the order they are defined one after another. You can configure this by changing the `sequence.hooks` option in the config file. + * + * @param {Function} fn - The callback function to be executed before each test. This function receives an `TestContext` parameter if additional test context is needed. + * @param {number} [timeout] - Optional timeout in milliseconds for the hook. If not provided, the default hook timeout from the runner's configuration is used. + * @returns {void} + * + * @example + * // Example of using beforeEach to reset a database state + * beforeEach(async () => { + * await database.reset(); + * }); + */ +export function beforeEach( + fn: BeforeEachListener, timeout?: number, -) { +): void { return getCurrentSuite().on( 'beforeEach', withTimeout(withFixtures(fn), timeout ?? getDefaultHookTimeout(), true), ) } -export function afterEach( - fn: SuiteHooks['afterEach'][0], + +/** + * Registers a callback function to be executed after each test within the current suite has completed. + * This hook is useful for scenarios where you need to clean up or reset the test environment after each test runs, such as deleting temporary files, clearing test-specific database entries, or resetting mocked functions. + * + * **Note:** The `afterEach` hooks are running in reverse order of their registration. You can configure this by changing the `sequence.hooks` option in the config file. + * + * @param {Function} fn - The callback function to be executed after each test. This function receives an `TestContext` parameter if additional test context is needed. + * @param {number} [timeout] - Optional timeout in milliseconds for the hook. If not provided, the default hook timeout from the runner's configuration is used. + * @returns {void} + * + * @example + * // Example of using afterEach to delete temporary files created during a test + * afterEach(async () => { + * await fileSystem.deleteTempFiles(); + * }); + */ +export function afterEach( + fn: AfterEachListener, timeout?: number, -) { +): void { return getCurrentSuite().on( 'afterEach', withTimeout(withFixtures(fn), timeout ?? getDefaultHookTimeout(), true), ) } -export const onTestFailed = createTestHook( +/** + * Registers a callback function to be executed when a test fails within the current suite. + * This function allows for custom actions to be performed in response to test failures, such as logging, cleanup, or additional diagnostics. + * + * **Note:** The `onTestFailed` hooks are running in reverse order of their registration. You can configure this by changing the `sequence.hooks` option in the config file. + * + * @param {Function} fn - The callback function to be executed upon a test failure. The function receives the test result (including errors). + * @param {number} [timeout] - Optional timeout in milliseconds for the hook. If not provided, the default hook timeout from the runner's configuration is used. + * @throws {Error} Throws an error if the function is not called within a test. + * @returns {void} + * + * @example + * // Example of using onTestFailed to log failure details + * onTestFailed(({ errors }) => { + * console.log(`Test failed: ${test.name}`, errors); + * }); + */ +export const onTestFailed: TaskHook = createTestHook( 'onTestFailed', - (test, handler) => { + (test, handler, timeout) => { test.onFailed ||= [] - test.onFailed.push(handler) + test.onFailed.push( + withTimeout(handler, timeout ?? getDefaultHookTimeout(), true), + ) }, ) -export const onTestFinished = createTestHook( +/** + * Registers a callback function to be executed when the current test finishes, regardless of the outcome (pass or fail). + * This function is ideal for performing actions that should occur after every test execution, such as cleanup, logging, or resetting shared resources. + * + * This hook is useful if you have access to a resource in the test itself and you want to clean it up after the test finishes. It is a more compact way to clean up resources than using the combination of `beforeEach` and `afterEach`. + * + * **Note:** The `onTestFinished` hooks are running in reverse order of their registration. You can configure this by changing the `sequence.hooks` option in the config file. + * + * @param {Function} fn - The callback function to be executed after a test finishes. The function can receive parameters providing details about the completed test, including its success or failure status. + * @param {number} [timeout] - Optional timeout in milliseconds for the hook. If not provided, the default hook timeout from the runner's configuration is used. + * @throws {Error} Throws an error if the function is not called within a test. + * @returns {void} + * + * @example + * // Example of using onTestFinished for cleanup + * const db = await connectToDatabase(); + * onTestFinished(async () => { + * await db.disconnect(); + * }); + */ +export const onTestFinished: TaskHook = createTestHook( 'onTestFinished', - (test, handler) => { + (test, handler, timeout) => { test.onFinished ||= [] - test.onFinished.push(handler) + test.onFinished.push( + withTimeout(handler, timeout ?? getDefaultHookTimeout(), true), + ) }, ) function createTestHook( name: string, - handler: (test: TaskPopulated, handler: T) => void, -) { - return (fn: T) => { + handler: (test: TaskPopulated, handler: T, timeout?: number) => void, +): TaskHook { + return (fn: T, timeout?: number) => { const current = getCurrentTest() if (!current) { throw new Error(`Hook ${name}() can only be called inside a test`) } - return handler(current, fn) + return handler(current, fn, timeout) } } diff --git a/packages/runner/src/index.ts b/packages/runner/src/index.ts index 56c5cc5927e3..906c387cad37 100644 --- a/packages/runner/src/index.ts +++ b/packages/runner/src/index.ts @@ -18,4 +18,5 @@ export { export { setFn, getFn, getHooks, setHooks } from './map' export { getCurrentTest } from './test-state' export { processError } from '@vitest/utils/error' -export * from './types' + +export type * from './types' diff --git a/packages/runner/src/map.ts b/packages/runner/src/map.ts index 91964b16f7b6..4450ca59e760 100644 --- a/packages/runner/src/map.ts +++ b/packages/runner/src/map.ts @@ -1,5 +1,5 @@ import type { Awaitable } from '@vitest/utils' -import type { Custom, Suite, SuiteHooks, Test, TestContext } from './types' +import type { Custom, Suite, SuiteHooks, Test, TestContext } from './types/tasks' import type { FixtureItem } from './fixture' // use WeakMap here to make the Test and Suite object serializable @@ -7,7 +7,7 @@ const fnMap = new WeakMap() const fixtureMap = new WeakMap() const hooksMap = new WeakMap() -export function setFn(key: Test | Custom, fn: () => Awaitable) { +export function setFn(key: Test | Custom, fn: () => Awaitable): void { fnMap.set(key, fn) } @@ -18,7 +18,7 @@ export function getFn(key: Task): () => Awaitable { export function setFixture( key: TestContext, fixture: FixtureItem[] | undefined, -) { +): void { fixtureMap.set(key, fixture) } @@ -26,7 +26,7 @@ export function getFixture(key: Context): FixtureItem[] { return fixtureMap.get(key as any) } -export function setHooks(key: Suite, hooks: SuiteHooks) { +export function setHooks(key: Suite, hooks: SuiteHooks): void { hooksMap.set(key, hooks) } diff --git a/packages/runner/src/run.ts b/packages/runner/src/run.ts index 68b6623c8a5d..d27ee69d5bd4 100644 --- a/packages/runner/src/run.ts +++ b/packages/runner/src/run.ts @@ -17,7 +17,7 @@ import type { TaskResultPack, TaskState, Test, -} from './types' +} from './types/tasks' import { partitionSuiteChildren } from './utils/suite' import { limitConcurrency } from './utils/limit-concurrency' import { getFn, getHooks } from './map' @@ -90,8 +90,7 @@ export async function callSuiteHook( const callbacks: HookCleanupCallback[] = [] // stop at file level - const parentSuite: Suite | null - = 'filepath' in suite ? null : suite.suite || suite.file + const parentSuite: Suite | null = 'filepath' in suite ? null : suite.suite || suite.file if (name === 'beforeEach' && parentSuite) { callbacks.push( @@ -105,12 +104,12 @@ export async function callSuiteHook( if (sequence === 'parallel') { callbacks.push( - ...(await Promise.all(hooks.map(fn => fn(...(args as any))))), + ...(await Promise.all(hooks.map(hook => (hook as any)(...args)))), ) } else { for (const hook of hooks) { - callbacks.push(await hook(...(args as any))) + callbacks.push(await (hook as any)(...args)) } } @@ -129,7 +128,7 @@ const packs = new Map() let updateTimer: any let previousUpdate: Promise | undefined -export function updateTask(task: Task, runner: VitestRunner) { +export function updateTask(task: Task, runner: VitestRunner): void { packs.set(task.id, [task.result, task.meta]) const { clearTimeout, setTimeout } = getSafeTimers() @@ -166,7 +165,7 @@ async function callCleanupHooks(cleanups: HookCleanupCallback[]) { ) } -export async function runTest(test: Test | Custom, runner: VitestRunner) { +export async function runTest(test: Test | Custom, runner: VitestRunner): Promise { await runner.onBeforeRunTask?.(test) if (test.mode !== 'run') { @@ -364,7 +363,7 @@ function markTasksAsSkipped(suite: Suite, runner: VitestRunner) { }) } -export async function runSuite(suite: Suite, runner: VitestRunner) { +export async function runSuite(suite: Suite, runner: VitestRunner): Promise { await runner.onBeforeRunSuite?.(suite) if (suite.result?.state === 'fail') { @@ -477,7 +476,7 @@ async function runSuiteChild(c: Task, runner: VitestRunner) { } } -export async function runFiles(files: File[], runner: VitestRunner) { +export async function runFiles(files: File[], runner: VitestRunner): Promise { limitMaxConcurrency ??= limitConcurrency(runner.config.maxConcurrency) for (const file of files) { @@ -496,7 +495,7 @@ export async function runFiles(files: File[], runner: VitestRunner) { } } -export async function startTests(paths: string[], runner: VitestRunner) { +export async function startTests(paths: string[], runner: VitestRunner): Promise { await runner.onBeforeCollect?.(paths) const files = await collectTests(paths, runner) @@ -513,7 +512,7 @@ export async function startTests(paths: string[], runner: VitestRunner) { return files } -async function publicCollect(paths: string[], runner: VitestRunner) { +async function publicCollect(paths: string[], runner: VitestRunner): Promise { await runner.onBeforeCollect?.(paths) const files = await collectTests(paths, runner) diff --git a/packages/runner/src/setup.ts b/packages/runner/src/setup.ts index f54a8b03378c..ea3a129263e2 100644 --- a/packages/runner/src/setup.ts +++ b/packages/runner/src/setup.ts @@ -1,10 +1,10 @@ import { toArray } from '@vitest/utils' -import type { VitestRunner, VitestRunnerConfig } from './types' +import type { VitestRunner, VitestRunnerConfig } from './types/runner' export async function runSetupFiles( config: VitestRunnerConfig, runner: VitestRunner, -) { +): Promise { const files = toArray(config.setupFiles) if (config.sequence.setupFiles === 'parallel') { await Promise.all( diff --git a/packages/runner/src/suite.ts b/packages/runner/src/suite.ts index ea768e723940..93c6cf4bd1a9 100644 --- a/packages/runner/src/suite.ts +++ b/packages/runner/src/suite.ts @@ -24,7 +24,7 @@ import type { TestAPI, TestFunction, TestOptions, -} from './types' +} from './types/tasks' import type { VitestRunner } from './types/runner' import { createChainable } from './utils/chain' import { @@ -39,9 +39,63 @@ import type { FixtureItem } from './fixture' import { mergeContextFixtures, withFixtures } from './fixture' import { getCurrentTest } from './test-state' -// apis -export const suite = createSuite() -export const test = createTest(function ( +/** + * Creates a suite of tests, allowing for grouping and hierarchical organization of tests. + * Suites can contain both tests and other suites, enabling complex test structures. + * + * @param {string} name - The name of the suite, used for identification and reporting. + * @param {Function} fn - A function that defines the tests and suites within this suite. + * + * @example + * // Define a suite with two tests + * suite('Math operations', () => { + * test('should add two numbers', () => { + * expect(add(1, 2)).toBe(3); + * }); + * + * test('should subtract two numbers', () => { + * expect(subtract(5, 2)).toBe(3); + * }); + * }); + * + * @example + * // Define nested suites + * suite('String operations', () => { + * suite('Trimming', () => { + * test('should trim whitespace from start and end', () => { + * expect(' hello '.trim()).toBe('hello'); + * }); + * }); + * + * suite('Concatenation', () => { + * test('should concatenate two strings', () => { + * expect('hello' + ' ' + 'world').toBe('hello world'); + * }); + * }); + * }); + */ +export const suite: SuiteAPI = createSuite() +/** + * Defines a test case with a given name and test function. The test function can optionally be configured with test options. + * + * @param {string | Function} name - The name of the test or a function that will be used as a test name. + * @param {TestOptions | TestFunction} [optionsOrFn] - Optional. The test options or the test function if no explicit name is provided. + * @param {number | TestOptions | TestFunction} [optionsOrTest] - Optional. The test function or options, depending on the previous parameters. + * @throws {Error} If called inside another test function. + * + * @example + * // Define a simple test + * test('should add two numbers', () => { + * expect(add(1, 2)).toBe(3); + * }); + * + * @example + * // Define a test with options + * test('should subtract two numbers', { retry: 3 }, () => { + * expect(subtract(5, 2)).toBe(3); + * }); + */ +export const test: TestAPI = createTest(function ( name: string | Function, optionsOrFn?: TestOptions | TestFunction, optionsOrTest?: number | TestOptions | TestFunction, @@ -60,23 +114,77 @@ export const test = createTest(function ( ) }) -// alias -export const describe = suite -export const it = test +/** + * Creates a suite of tests, allowing for grouping and hierarchical organization of tests. + * Suites can contain both tests and other suites, enabling complex test structures. + * + * @param {string} name - The name of the suite, used for identification and reporting. + * @param {Function} fn - A function that defines the tests and suites within this suite. + * + * @example + * // Define a suite with two tests + * describe('Math operations', () => { + * test('should add two numbers', () => { + * expect(add(1, 2)).toBe(3); + * }); + * + * test('should subtract two numbers', () => { + * expect(subtract(5, 2)).toBe(3); + * }); + * }); + * + * @example + * // Define nested suites + * describe('String operations', () => { + * describe('Trimming', () => { + * test('should trim whitespace from start and end', () => { + * expect(' hello '.trim()).toBe('hello'); + * }); + * }); + * + * describe('Concatenation', () => { + * test('should concatenate two strings', () => { + * expect('hello' + ' ' + 'world').toBe('hello world'); + * }); + * }); + * }); + */ +export const describe: SuiteAPI = suite +/** + * Defines a test case with a given name and test function. The test function can optionally be configured with test options. + * + * @param {string | Function} name - The name of the test or a function that will be used as a test name. + * @param {TestOptions | TestFunction} [optionsOrFn] - Optional. The test options or the test function if no explicit name is provided. + * @param {number | TestOptions | TestFunction} [optionsOrTest] - Optional. The test function or options, depending on the previous parameters. + * @throws {Error} If called inside another test function. + * + * @example + * // Define a simple test + * it('adds two numbers', () => { + * expect(add(1, 2)).toBe(3); + * }); + * + * @example + * // Define a test with options + * it('subtracts two numbers', { retry: 3 }, () => { + * expect(subtract(5, 2)).toBe(3); + * }); + */ +export const it: TestAPI = test let runner: VitestRunner let defaultSuite: SuiteCollector let currentTestFilepath: string -export function getDefaultSuite() { +export function getDefaultSuite(): SuiteCollector { return defaultSuite } -export function getTestFilepath() { +export function getTestFilepath(): string { return currentTestFilepath } -export function getRunner() { +export function getRunner(): VitestRunner { return runner } @@ -89,7 +197,7 @@ function createDefaultSuite(runner: VitestRunner) { export function clearCollectorContext( filepath: string, currentRunner: VitestRunner, -) { +): void { if (!defaultSuite) { defaultSuite = createDefaultSuite(currentRunner) } @@ -100,12 +208,12 @@ export function clearCollectorContext( collectorContext.currentSuite = defaultSuite } -export function getCurrentSuite() { +export function getCurrentSuite() { return (collectorContext.currentSuite || defaultSuite) as SuiteCollector } -export function createSuiteHooks() { +export function createSuiteHooks(): SuiteHooks { return { beforeAll: [], afterAll: [], @@ -429,19 +537,24 @@ function createSuite() { cases.forEach((i, idx) => { const items = Array.isArray(i) ? i : [i] if (fnFirst) { - arrayOnlyCases - ? suite( + if (arrayOnlyCases) { + suite( formatTitle(_name, items, idx), () => handler(...items), options, ) - : suite(formatTitle(_name, items, idx), () => handler(i), options) + } + else { + suite(formatTitle(_name, items, idx), () => handler(i), options) + } } else { - arrayOnlyCases - ? suite(formatTitle(_name, items, idx), options, () => - handler(...items)) - : suite(formatTitle(_name, items, idx), options, () => handler(i)) + if (arrayOnlyCases) { + suite(formatTitle(_name, items, idx), options, () => handler(...items)) + } + else { + suite(formatTitle(_name, items, idx), options, () => handler(i)) + } } }) @@ -463,7 +576,7 @@ function createSuite() { export function createTaskCollector( fn: (...args: any[]) => any, context?: Record, -) { +): CustomAPI { const taskFn = fn as any taskFn.each = function ( @@ -497,19 +610,24 @@ export function createTaskCollector( const items = Array.isArray(i) ? i : [i] if (fnFirst) { - arrayOnlyCases - ? test( + if (arrayOnlyCases) { + test( formatTitle(_name, items, idx), () => handler(...items), options, ) - : test(formatTitle(_name, items, idx), () => handler(i), options) + } + else { + test(formatTitle(_name, items, idx), () => handler(i), options) + } } else { - arrayOnlyCases - ? test(formatTitle(_name, items, idx), options, () => - handler(...items)) - : test(formatTitle(_name, items, idx), options, () => handler(i)) + if (arrayOnlyCases) { + test(formatTitle(_name, items, idx), options, () => handler(...items)) + } + else { + test(formatTitle(_name, items, idx), options, () => handler(i)) + } } }) diff --git a/packages/runner/src/test-state.ts b/packages/runner/src/test-state.ts index a661eea3a5e1..6e7bd01957ea 100644 --- a/packages/runner/src/test-state.ts +++ b/packages/runner/src/test-state.ts @@ -1,8 +1,8 @@ -import type { Custom, Test } from './types' +import type { Custom, Test } from './types/tasks.ts' let _test: Test | Custom | undefined -export function setCurrentTest(test: T | undefined) { +export function setCurrentTest(test: T | undefined): void { _test = test } diff --git a/packages/runner/src/types.ts b/packages/runner/src/types.ts new file mode 100644 index 000000000000..cfd7c420c811 --- /dev/null +++ b/packages/runner/src/types.ts @@ -0,0 +1,52 @@ +export type { + RunMode, + TaskState, + TaskBase, + TaskPopulated, + TaskMeta, + TaskResult, + TaskResultPack, + Suite, + File, + Test, + Custom, + Task, + DoneCallback, + TestFunction, + TestOptions, + CustomAPI, + TestAPI, + FixtureOptions, + Use, + FixtureFn, + Fixture, + Fixtures, + InferFixturesTypes, + SuiteAPI, + HookListener, + HookCleanupCallback, + SuiteHooks, + TaskCustomOptions, + SuiteCollector, + SuiteFactory, + RuntimeContext, + TestContext, + TaskContext, + ExtendedContext, + OnTestFailedHandler, + OnTestFinishedHandler, + SequenceHooks, + SequenceSetupFiles, + AfterAllListener, + AfterEachListener, + BeforeAllListener, + BeforeEachListener, + TaskHook, +} from './types/tasks' +export type { + VitestRunnerConfig, + VitestRunnerImportSource, + VitestRunnerConstructor, + CancelReason, + VitestRunner, +} from './types/runner' diff --git a/packages/runner/src/types/index.ts b/packages/runner/src/types/index.ts deleted file mode 100644 index 01ac112a8a57..000000000000 --- a/packages/runner/src/types/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './tasks' -export * from './runner' diff --git a/packages/runner/src/types/tasks.ts b/packages/runner/src/types/tasks.ts index 706cb75e4d71..0ce647420afb 100644 --- a/packages/runner/src/types/tasks.ts +++ b/packages/runner/src/types/tasks.ts @@ -74,12 +74,12 @@ export interface File extends Suite { local?: boolean } -export interface Test extends TaskPopulated { +export interface Test extends TaskPopulated { type: 'test' context: TaskContext & ExtraContext & TestContext } -export interface Custom extends TaskPopulated { +export interface Custom extends TaskPopulated { type: 'custom' context: TaskContext & ExtraContext & TestContext } @@ -87,7 +87,7 @@ export interface Custom extends TaskPopulated { export type Task = Test | Suite | Custom | File export type DoneCallback = (error?: any) => void -export type TestFunction = ( +export type TestFunction = ( context: ExtendedContext & ExtraContext ) => Awaitable | void @@ -187,7 +187,7 @@ interface TestForFunction { > } -interface TestCollectorCallable { +interface TestCollectorCallable { /** * @deprecated Use options as the second argument instead */ @@ -208,7 +208,7 @@ interface TestCollectorCallable { ): void } -type ChainableTestAPI = ChainableFunction< +type ChainableTestAPI = ChainableFunction< 'concurrent' | 'sequential' | 'only' | 'skip' | 'todo' | 'fails', TestCollectorCallable, { @@ -269,9 +269,9 @@ interface ExtendedAPI { runIf: (condition: any) => ChainableTestAPI } -export type CustomAPI = ChainableTestAPI & +export type CustomAPI = ChainableTestAPI & ExtendedAPI & { - extend: = {}>( + extend: = object>( fixtures: Fixtures ) => CustomAPI<{ [K in keyof T | keyof ExtraContext]: K extends keyof T @@ -282,9 +282,9 @@ export type CustomAPI = ChainableTestAPI & }> } -export type TestAPI = ChainableTestAPI & +export type TestAPI = ChainableTestAPI & ExtendedAPI & { - extend: = {}>( + extend: = object>( fixtures: Fixtures ) => TestAPI<{ [K in keyof T | keyof ExtraContext]: K extends keyof T @@ -307,7 +307,7 @@ export type FixtureFn = ( context: Omit & ExtraContext, use: Use ) => Promise -export type Fixture = (( +export type Fixture = (( ...args: any ) => any) extends T[K] ? T[K] extends any @@ -318,7 +318,7 @@ export type Fixture = (( | (T[K] extends any ? FixtureFn>> : never) -export type Fixtures, ExtraContext = {}> = { +export type Fixtures, ExtraContext = object> = { [K in keyof T]: | Fixture> | [Fixture>, FixtureOptions?]; @@ -326,7 +326,7 @@ export type Fixtures, ExtraContext = {}> = { export type InferFixturesTypes = T extends TestAPI ? C : T -interface SuiteCollectorCallable { +interface SuiteCollectorCallable { /** * @deprecated Use options as the second argument instead */ @@ -347,7 +347,7 @@ interface SuiteCollectorCallable { ): SuiteCollector } -type ChainableSuiteAPI = ChainableFunction< +type ChainableSuiteAPI = ChainableFunction< 'concurrent' | 'sequential' | 'only' | 'skip' | 'todo' | 'shuffle', SuiteCollectorCallable, { @@ -355,27 +355,47 @@ type ChainableSuiteAPI = ChainableFunction< } > -export type SuiteAPI = ChainableSuiteAPI & { +export type SuiteAPI = ChainableSuiteAPI & { skipIf: (condition: any) => ChainableSuiteAPI runIf: (condition: any) => ChainableSuiteAPI } +/** + * @deprecated + */ export type HookListener = ( ...args: T ) => Awaitable export type HookCleanupCallback = (() => Awaitable) | void -export interface SuiteHooks { - beforeAll: HookListener<[Readonly], HookCleanupCallback>[] - afterAll: HookListener<[Readonly]>[] - beforeEach: HookListener< - [ExtendedContext & ExtraContext, Readonly], - HookCleanupCallback - >[] - afterEach: HookListener< - [ExtendedContext & ExtraContext, Readonly] - >[] +export interface BeforeAllListener { + (suite: Readonly): Awaitable +} + +export interface AfterAllListener { + (suite: Readonly): Awaitable +} + +export interface BeforeEachListener { + ( + context: ExtendedContext & ExtraContext, + suite: Readonly + ): Awaitable +} + +export interface AfterEachListener { + ( + context: ExtendedContext & ExtraContext, + suite: Readonly + ): Awaitable +} + +export interface SuiteHooks { + beforeAll: BeforeAllListener[] + afterAll: AfterAllListener[] + beforeEach: BeforeEachListener[] + afterEach: AfterEachListener[] } export interface TaskCustomOptions extends TestOptions { @@ -391,7 +411,7 @@ export interface TaskCustomOptions extends TestOptions { handler?: (context: TaskContext) => Awaitable } -export interface SuiteCollector { +export interface SuiteCollector { readonly name: string readonly mode: RunMode options?: TestOptions @@ -412,7 +432,7 @@ export interface SuiteCollector { ) => void } -export type SuiteFactory = ( +export type SuiteFactory = ( test: TestAPI ) => Awaitable @@ -451,5 +471,9 @@ export type ExtendedContext = TaskContext & export type OnTestFailedHandler = (result: TaskResult) => Awaitable export type OnTestFinishedHandler = (result: TaskResult) => Awaitable +export interface TaskHook { + (fn: HookListener, timeout?: number): void +} + export type SequenceHooks = 'stack' | 'list' | 'parallel' export type SequenceSetupFiles = 'list' | 'parallel' diff --git a/packages/runner/src/utils/chain.ts b/packages/runner/src/utils/chain.ts index dbfe9ab69cdf..b50c24d03960 100644 --- a/packages/runner/src/utils/chain.ts +++ b/packages/runner/src/utils/chain.ts @@ -1,7 +1,7 @@ export type ChainableFunction< T extends string, F extends (...args: any) => any, - C = {}, + C = object, > = F & { [x in T]: ChainableFunction; } & { diff --git a/packages/runner/src/utils/collect.ts b/packages/runner/src/utils/collect.ts index 7173a048ae80..376994ca9b0f 100644 --- a/packages/runner/src/utils/collect.ts +++ b/packages/runner/src/utils/collect.ts @@ -1,6 +1,6 @@ import { processError } from '@vitest/utils/error' import { relative } from 'pathe' -import type { File, Suite, TaskBase } from '../types' +import type { File, Suite, TaskBase } from '../types/tasks' /** * If any tasks been marked as `only`, mark all other tasks as `skip`. @@ -11,7 +11,7 @@ export function interpretTaskModes( onlyMode?: boolean, parentIsOnly?: boolean, allowOnly?: boolean, -) { +): void { const suiteIsOnly = parentIsOnly || suite.mode === 'only' suite.tasks.forEach((t) => { @@ -105,7 +105,7 @@ export function generateHash(str: string): string { return `${hash}` } -export function calculateSuiteHash(parent: Suite) { +export function calculateSuiteHash(parent: Suite): void { parent.tasks.forEach((t, idx) => { t.id = `${parent.id}_${idx}` if (t.type === 'suite') { @@ -119,7 +119,7 @@ export function createFileTask( root: string, projectName: string, pool?: string, -) { +): File { const path = relative(root, filepath) const file: File = { id: generateHash(`${path}${projectName || ''}`), diff --git a/packages/runner/src/utils/index.ts b/packages/runner/src/utils/index.ts index 83c5b1633f57..1e1cf3ae9a89 100644 --- a/packages/runner/src/utils/index.ts +++ b/packages/runner/src/utils/index.ts @@ -1,5 +1,19 @@ -export * from './collect' -export * from './suite' -export * from './tasks' -export * from './chain' -export * from './limit-concurrency' +export { + interpretTaskModes, + someTasksAreOnly, + generateHash, + calculateSuiteHash, + createFileTask, +} from './collect' +export { partitionSuiteChildren } from './suite' +export { + isAtomTest, + getTests, + getTasks, + getSuites, + hasTests, + hasFailed, + getNames, +} from './tasks' +export { createChainable, type ChainableFunction } from './chain' +export { limitConcurrency } from './limit-concurrency' diff --git a/packages/runner/src/utils/limit-concurrency.ts b/packages/runner/src/utils/limit-concurrency.ts index 3ba509da2fa2..4f42d5792774 100644 --- a/packages/runner/src/utils/limit-concurrency.ts +++ b/packages/runner/src/utils/limit-concurrency.ts @@ -4,7 +4,7 @@ type QueueNode = [value: T, next?: QueueNode] /** * Return a function for running multiple async operations with limited concurrency. */ -export function limitConcurrency(concurrency = Infinity): (func: (...args: Args) => PromiseLike | T, ...args: Args) => Promise { +export function limitConcurrency(concurrency: number = Infinity): (func: (...args: Args) => PromiseLike | T, ...args: Args) => Promise { // The number of currently active + pending tasks. let count = 0 diff --git a/packages/runner/src/utils/suite.ts b/packages/runner/src/utils/suite.ts index 1c9d89aadc9e..b0eb1f9d4c18 100644 --- a/packages/runner/src/utils/suite.ts +++ b/packages/runner/src/utils/suite.ts @@ -1,9 +1,9 @@ -import type { Suite, Task } from '../types' +import type { Suite, Task } from '../types/tasks' /** * Partition in tasks groups by consecutive concurrent */ -export function partitionSuiteChildren(suite: Suite) { +export function partitionSuiteChildren(suite: Suite): Task[][] { let tasksGroup: Task[] = [] const tasksGroups: Task[][] = [] for (const c of suite.tasks) { diff --git a/packages/runner/src/utils/tasks.ts b/packages/runner/src/utils/tasks.ts index 50ac4cedc43d..3212de13c6b0 100644 --- a/packages/runner/src/utils/tasks.ts +++ b/packages/runner/src/utils/tasks.ts @@ -1,5 +1,5 @@ import { type Arrayable, toArray } from '@vitest/utils' -import type { Custom, Suite, Task, Test } from '../types' +import type { Custom, Suite, Task, Test } from '../types/tasks' export function isAtomTest(s: Task): s is Test | Custom { return s.type === 'test' || s.type === 'custom' @@ -54,7 +54,7 @@ export function hasFailed(suite: Arrayable): boolean { ) } -export function getNames(task: Task) { +export function getNames(task: Task): string[] { const names = [task.name] let current: Task | undefined = task diff --git a/packages/runner/tsconfig.json b/packages/runner/tsconfig.json index 8bcb003f8ee0..1f52dab27ae6 100644 --- a/packages/runner/tsconfig.json +++ b/packages/runner/tsconfig.json @@ -1,5 +1,11 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "isolatedDeclarations": true + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] } diff --git a/packages/snapshot/package.json b/packages/snapshot/package.json index 8c1f200f1eef..4e6d0bc8d87c 100644 --- a/packages/snapshot/package.json +++ b/packages/snapshot/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/snapshot", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Vitest snapshot manager", "license": "MIT", "funding": "https://opencollective.com/vitest", diff --git a/packages/snapshot/src/client.ts b/packages/snapshot/src/client.ts index dcbdff37ba26..4faf6802a9cf 100644 --- a/packages/snapshot/src/client.ts +++ b/packages/snapshot/src/client.ts @@ -1,6 +1,6 @@ import { deepMergeSnapshot } from './port/utils' import SnapshotState from './port/state' -import type { SnapshotStateOptions } from './types' +import type { SnapshotResult, SnapshotStateOptions } from './types' import type { RawSnapshotInfo } from './port/rawSnapshot' function createMismatchError( @@ -53,7 +53,7 @@ export class SnapshotClient { filepath?: string name?: string snapshotState: SnapshotState | undefined - snapshotStateMap = new Map() + snapshotStateMap: Map = new Map() constructor(private options: SnapshotClientOptions = {}) {} @@ -61,7 +61,7 @@ export class SnapshotClient { filepath: string, name: string, options: SnapshotStateOptions, - ) { + ): Promise { this.filepath = filepath this.name = name @@ -78,16 +78,16 @@ export class SnapshotClient { } } - getSnapshotState(filepath: string) { + getSnapshotState(filepath: string): SnapshotState { return this.snapshotStateMap.get(filepath)! } - clearTest() { + clearTest(): void { this.filepath = undefined this.name = undefined } - skipTestSnapshots(name: string) { + skipTestSnapshots(name: string): void { this.snapshotState?.markSnapshotsAsCheckedForTest(name) } @@ -189,7 +189,7 @@ export class SnapshotClient { return this.assert(options) } - async finishCurrentRun() { + async finishCurrentRun(): Promise { if (!this.snapshotState) { return null } @@ -199,7 +199,7 @@ export class SnapshotClient { return result } - clear() { + clear(): void { this.snapshotStateMap.clear() } } diff --git a/packages/snapshot/src/env/node.ts b/packages/snapshot/src/env/node.ts index 32a61795d5c7..4463e23fbcd6 100644 --- a/packages/snapshot/src/env/node.ts +++ b/packages/snapshot/src/env/node.ts @@ -13,7 +13,7 @@ export class NodeSnapshotEnvironment implements SnapshotEnvironment { return `// Snapshot v${this.getVersion()}` } - async resolveRawPath(testPath: string, rawPath: string) { + async resolveRawPath(testPath: string, rawPath: string): Promise { return isAbsolute(rawPath) ? rawPath : resolve(dirname(testPath), rawPath) } diff --git a/packages/snapshot/src/manager.ts b/packages/snapshot/src/manager.ts index 16c1f0fe9fa6..44c88aaca8f2 100644 --- a/packages/snapshot/src/manager.ts +++ b/packages/snapshot/src/manager.ts @@ -15,18 +15,17 @@ export class SnapshotManager { this.clear() } - clear() { + clear(): void { this.summary = emptySummary(this.options) } - add(result: SnapshotResult) { + add(result: SnapshotResult): void { addSnapshotResult(this.summary, result) } - resolvePath(testPath: string) { + resolvePath(testPath: string): string { const resolver - = this.options.resolveSnapshotPath - || (() => { + = this.options.resolveSnapshotPath || (() => { return join( join(dirname(testPath), '__snapshots__'), `${basename(testPath)}${this.extension}`, @@ -37,7 +36,7 @@ export class SnapshotManager { return path } - resolveRawPath(testPath: string, rawPath: string) { + resolveRawPath(testPath: string, rawPath: string): string { return isAbsolute(rawPath) ? rawPath : resolve(dirname(testPath), rawPath) } } diff --git a/packages/snapshot/src/port/inlineSnapshot.ts b/packages/snapshot/src/port/inlineSnapshot.ts index af69121b5547..11487738e82b 100644 --- a/packages/snapshot/src/port/inlineSnapshot.ts +++ b/packages/snapshot/src/port/inlineSnapshot.ts @@ -17,7 +17,7 @@ export interface InlineSnapshot { export async function saveInlineSnapshots( environment: SnapshotEnvironment, snapshots: Array, -) { +): Promise { const MagicString = (await import('magic-string')).default const files = new Set(snapshots.map(i => i.file)) await Promise.all( @@ -148,7 +148,7 @@ export function replaceInlineSnap( s: MagicString, currentIndex: number, newSnap: string, -) { +): boolean { const { code: codeStartingAtIndex, index } = getCodeStartingAtIndex(code, currentIndex) const startMatch = startRegex.exec(codeStartingAtIndex) @@ -182,7 +182,7 @@ export function replaceInlineSnap( } const INDENTATION_REGEX = /^([^\S\n]*)\S/m -export function stripSnapshotIndentation(inlineSnapshot: string) { +export function stripSnapshotIndentation(inlineSnapshot: string): string { // Find indentation if exists. const match = inlineSnapshot.match(INDENTATION_REGEX) if (!match || !match[1]) { diff --git a/packages/snapshot/src/port/rawSnapshot.ts b/packages/snapshot/src/port/rawSnapshot.ts index f544c5532a2f..c7d445bccc58 100644 --- a/packages/snapshot/src/port/rawSnapshot.ts +++ b/packages/snapshot/src/port/rawSnapshot.ts @@ -14,7 +14,7 @@ export interface RawSnapshot extends RawSnapshotInfo { export async function saveRawSnapshots( environment: SnapshotEnvironment, snapshots: Array, -) { +): Promise { await Promise.all( snapshots.map(async (snap) => { if (!snap.readonly) { diff --git a/packages/snapshot/src/port/state.ts b/packages/snapshot/src/port/state.ts index 0f47b4e5a82c..eab28e81e005 100644 --- a/packages/snapshot/src/port/state.ts +++ b/packages/snapshot/src/port/state.ts @@ -94,7 +94,7 @@ export default class SnapshotState { this._environment = options.snapshotEnvironment } - static async create(testFilePath: string, options: SnapshotStateOptions) { + static async create(testFilePath: string, options: SnapshotStateOptions): Promise { const snapshotPath = await options.snapshotEnvironment.resolvePath( testFilePath, ) @@ -104,7 +104,7 @@ export default class SnapshotState { return new SnapshotState(testFilePath, snapshotPath, content, options) } - get environment() { + get environment(): SnapshotEnvironment { return this._environment } @@ -116,7 +116,7 @@ export default class SnapshotState { }) } - protected _inferInlineSnapshotStack(stacks: ParsedStack[]) { + protected _inferInlineSnapshotStack(stacks: ParsedStack[]): ParsedStack | null { // if called inside resolves/rejects, stacktrace is different const promiseIndex = stacks.findIndex(i => i.method.match(/__VITEST_(RESOLVES|REJECTS)__/), diff --git a/packages/snapshot/src/port/utils.ts b/packages/snapshot/src/port/utils.ts index d247616f2af6..35b31dfd1cd8 100644 --- a/packages/snapshot/src/port/utils.ts +++ b/packages/snapshot/src/port/utils.ts @@ -131,7 +131,7 @@ function printBacktickString(str: string): string { return `\`${escapeBacktickString(str)}\`` } -export function normalizeNewlines(string: string) { +export function normalizeNewlines(string: string): string { return string.replace(/\r\n|\r/g, '\n') } @@ -139,7 +139,7 @@ export async function saveSnapshotFile( environment: SnapshotEnvironment, snapshotData: SnapshotData, snapshotPath: string, -) { +): Promise { const snapshots = Object.keys(snapshotData) .sort(naturalCompare) .map( @@ -164,7 +164,7 @@ export async function saveSnapshotFileRaw( environment: SnapshotEnvironment, content: string, snapshotPath: string, -) { +): Promise { const oldContent = await environment.readSnapshotFile(snapshotPath) const skipWriting = oldContent != null && oldContent === content @@ -175,7 +175,7 @@ export async function saveSnapshotFileRaw( await environment.saveSnapshotFile(snapshotPath, content) } -export function prepareExpected(expected?: string) { +export function prepareExpected(expected?: string): string | undefined { function findStartIndent() { // Attempts to find indentation for objects. // Matches the ending tag of the object. diff --git a/packages/snapshot/tsconfig.json b/packages/snapshot/tsconfig.json index 8bcb003f8ee0..93e30d6aadd0 100644 --- a/packages/snapshot/tsconfig.json +++ b/packages/snapshot/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler", + "isolatedDeclarations": true + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] } diff --git a/packages/spy/package.json b/packages/spy/package.json index 20783b9e6490..f05d1ac2a46e 100644 --- a/packages/spy/package.json +++ b/packages/spy/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/spy", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Lightweight Jest compatible spy implementation", "license": "MIT", "funding": "https://opencollective.com/vitest", diff --git a/packages/spy/src/index.ts b/packages/spy/src/index.ts index 9e698adf8d5a..f8e52892c66b 100644 --- a/packages/spy/src/index.ts +++ b/packages/spy/src/index.ts @@ -141,6 +141,8 @@ export interface MockContext { } type Procedure = (...args: any[]) => any +// pick a single function type from function overloads, unions, etc... +type NormalizedPrecedure = (...args: Parameters) => ReturnType type Methods = keyof { [K in keyof T as T[K] extends Procedure ? K : never]: T[K]; @@ -204,14 +206,14 @@ export interface MockInstance { * * If mock was created with `vi.spyOn`, it will return `undefined` unless a custom implementation was provided. */ - getMockImplementation(): T | undefined + getMockImplementation(): NormalizedPrecedure | undefined /** * Accepts a function that will be used as an implementation of the mock. * @example * const increment = vi.fn().mockImplementation(count => count + 1); * expect(increment(3)).toBe(4); */ - mockImplementation(fn: T): this + mockImplementation(fn: NormalizedPrecedure): this /** * Accepts a function that will be used as a mock implementation during the next call. Can be chained so that multiple function calls produce different results. * @example @@ -219,7 +221,7 @@ export interface MockInstance { * expect(fn(3)).toBe(4); * expect(fn(3)).toBe(3); */ - mockImplementationOnce(fn: T): this + mockImplementationOnce(fn: NormalizedPrecedure): this /** * Overrides the original mock implementation temporarily while the callback is being executed. * @example @@ -231,7 +233,7 @@ export interface MockInstance { * * myMockFn() // 'original' */ - withImplementation(fn: T, cb: () => T2): T2 extends Promise ? Promise : this + withImplementation(fn: NormalizedPrecedure, cb: () => T2): T2 extends Promise ? Promise : this /** * Use this if you need to return `this` context from the method without invoking actual implementation. @@ -380,7 +382,7 @@ export type Mocked = { : T[P]; } & T -export const mocks = new Set() +export const mocks: Set = new Set() export function isMockFunction(fn: any): fn is MockInstance { return ( diff --git a/packages/spy/tsconfig.json b/packages/spy/tsconfig.json index 8bcb003f8ee0..93e30d6aadd0 100644 --- a/packages/spy/tsconfig.json +++ b/packages/spy/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler", + "isolatedDeclarations": true + }, "include": ["./src/**/*.ts"], "exclude": ["./dist"] } diff --git a/packages/ui/client/components.d.ts b/packages/ui/client/components.d.ts index a7a4abf4326f..0a7fe8fa8abb 100644 --- a/packages/ui/client/components.d.ts +++ b/packages/ui/client/components.d.ts @@ -27,6 +27,7 @@ declare module 'vue' { ProgressBar: typeof import('./components/ProgressBar.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + ScreenshotError: typeof import('./components/views/ScreenshotError.vue')['default'] StatusIcon: typeof import('./components/StatusIcon.vue')['default'] TestFilesEntry: typeof import('./components/dashboard/TestFilesEntry.vue')['default'] TestsEntry: typeof import('./components/dashboard/TestsEntry.vue')['default'] diff --git a/packages/ui/client/components/views/ScreenshotError.vue b/packages/ui/client/components/views/ScreenshotError.vue new file mode 100644 index 000000000000..b9c8ca6ab569 --- /dev/null +++ b/packages/ui/client/components/views/ScreenshotError.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/ui/client/components/views/ViewReport.vue b/packages/ui/client/components/views/ViewReport.vue index f55508a2f0da..231b33c0b5e6 100644 --- a/packages/ui/client/components/views/ViewReport.vue +++ b/packages/ui/client/components/views/ViewReport.vue @@ -3,7 +3,7 @@ import type { ErrorWithDiff, File, Suite, Task } from 'vitest' import type Convert from 'ansi-to-html' import { isDark } from '~/composables/dark' import { createAnsiToHtmlFilter } from '~/composables/error' -import { config } from '~/composables/client' +import { browserState, config } from '~/composables/client' import { escapeHtml } from '~/utils/escape' const props = defineProps<{ @@ -103,6 +103,30 @@ const failed = computed(() => { ? mapLeveledTaskStacks(isDark.value, failedFlatMap) : failedFlatMap }) + +function open(task: Task) { + const filePath = task.meta?.failScreenshotPath + if (filePath) { + fetch(`/__open-in-editor?file=${encodeURIComponent(filePath)}`) + } +} + +const showScreenshot = ref(false) +const timestamp = ref(Date.now()) +const currentTask = ref() +const currentScreenshotUrl = computed(() => { + const file = currentTask.value?.meta.failScreenshotPath + // force refresh + const t = timestamp.value + // browser plugin using /, change this if base can be modified + return file ? `/__screenshot-error?file=${encodeURIComponent(file)}&t=${t}` : undefined +}) + +function showScreenshotModal(task: Task) { + currentTask.value = task + timestamp.value = Date.now() + showScreenshot.value = true +} + diff --git a/packages/ui/client/composables/explorer/collector.ts b/packages/ui/client/composables/explorer/collector.ts index 3d8e433af94f..55178f0a494d 100644 --- a/packages/ui/client/composables/explorer/collector.ts +++ b/packages/ui/client/composables/explorer/collector.ts @@ -232,7 +232,9 @@ function doRunFilter( function refreshExplorer(search: string, filter: Filter, end: boolean) { runFilter(search, filter) // update only at the end - end && updateRunningTodoTests() + if (end) { + updateRunningTodoTests() + } } function createOrUpdateEntry(tasks: Task[]) { diff --git a/packages/ui/client/composables/explorer/filter.ts b/packages/ui/client/composables/explorer/filter.ts index 3894b522e8ca..99634be68803 100644 --- a/packages/ui/client/composables/explorer/filter.ts +++ b/packages/ui/client/composables/explorer/filter.ts @@ -71,7 +71,9 @@ export function* filterNode( if (isParentNode(child)) { parentsMap.set(child.id, match) if (isFileNode(child)) { - match && (fileId = child.id) + if (match) { + fileId = child.id + } list.push([match, child]) } else { diff --git a/packages/ui/client/composables/explorer/search.ts b/packages/ui/client/composables/explorer/search.ts index 7a086a2a5a02..dbd1689c8d54 100644 --- a/packages/ui/client/composables/explorer/search.ts +++ b/packages/ui/client/composables/explorer/search.ts @@ -30,7 +30,9 @@ export function useSearch(searchBox: Ref) { function clearSearch(focus: boolean) { search.value = '' - focus && searchBox.value?.focus() + if (focus) { + searchBox.value?.focus() + } } function clearFilter(focus: boolean) { @@ -38,7 +40,9 @@ export function useSearch(searchBox: Ref) { filter.success = false filter.skipped = false filter.onlyTests = false - focus && searchBox.value?.focus() + if (focus) { + searchBox.value?.focus() + } } function clearAll() { diff --git a/packages/ui/node/index.ts b/packages/ui/node/index.ts index 56242d0574c1..d7135bd6832d 100644 --- a/packages/ui/node/index.ts +++ b/packages/ui/node/index.ts @@ -21,20 +21,22 @@ export default (ctx: Vitest): Plugin => { ) } - coverageFolder - && server.middlewares.use( - coveragePath!, - sirv(coverageFolder[0], { - single: true, - dev: true, - setHeaders: (res) => { - res.setHeader( - 'Cache-Control', - 'public,max-age=0,must-revalidate', - ) - }, - }), - ) + if (coverageFolder) { + server.middlewares.use( + coveragePath!, + sirv(coverageFolder[0], { + single: true, + dev: true, + setHeaders: (res) => { + res.setHeader( + 'Cache-Control', + 'public,max-age=0,must-revalidate', + ) + }, + }), + ) + } + const clientDist = resolve(fileURLToPath(import.meta.url), '../client') server.middlewares.use( base, diff --git a/packages/ui/node/reporter.ts b/packages/ui/node/reporter.ts index bd9de737334f..1389affefca9 100644 --- a/packages/ui/node/reporter.ts +++ b/packages/ui/node/reporter.ts @@ -83,7 +83,7 @@ export default class HTMLReporter implements Reporter { encoding: 'utf-8', }) } - catch (_) { + catch { // just ignore } } diff --git a/packages/ui/package.json b/packages/ui/package.json index 25a2c9ea0ba0..c752d3252bf8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/ui", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "UI for Vitest", "license": "MIT", "funding": "https://opencollective.com/vitest", @@ -63,8 +63,8 @@ "@types/codemirror": "^5.60.15", "@types/d3-force": "^3.0.10", "@types/d3-selection": "^3.0.10", - "@types/ws": "^8.5.10", - "@unocss/reset": "^0.61.0", + "@types/ws": "^8.5.11", + "@unocss/reset": "^0.61.3", "@vitejs/plugin-vue": "^5.0.5", "@vitest/runner": "workspace:*", "@vitest/ws-client": "workspace:*", @@ -77,7 +77,7 @@ "d3-graph-controller": "^3.0.10", "floating-vue": "^5.2.2", "splitpanes": "^3.1.5", - "unocss": "^0.61.0", + "unocss": "^0.61.3", "unplugin-auto-import": "^0.18.0", "unplugin-vue-components": "^0.27.2", "vite": "^5.0.0", diff --git a/packages/utils/package.json b/packages/utils/package.json index de43f44b6db6..3d4d989d1f00 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/utils", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Shared Vitest utility functions", "license": "MIT", "funding": "https://opencollective.com/vitest", diff --git a/packages/utils/src/ast/esmWalker.ts b/packages/utils/src/ast/esmWalker.ts index ab534ec73f12..c233112a51b4 100644 --- a/packages/utils/src/ast/esmWalker.ts +++ b/packages/utils/src/ast/esmWalker.ts @@ -27,7 +27,7 @@ interface Visitors { } const isNodeInPatternWeakSet = new WeakSet<_Node>() -export function setIsNodeInPattern(node: Property) { +export function setIsNodeInPattern(node: Property): WeakSet<_Node> { return isNodeInPatternWeakSet.add(node) } export function isNodeInPattern(node: _Node): node is Property { @@ -41,7 +41,7 @@ export function isNodeInPattern(node: _Node): node is Property { export function esmWalker( root: Node, { onIdentifier, onImportMeta, onDynamicImport }: Visitors, -) { +): void { const parentStack: Node[] = [] const varKindStack: VariableDeclaration['kind'][] = [] const scopeMap = new WeakMap<_Node, Set>() @@ -292,7 +292,7 @@ export function isStaticProperty(node: _Node): node is Property { return node && node.type === 'Property' && !node.computed } -export function isStaticPropertyKey(node: _Node, parent: _Node) { +export function isStaticPropertyKey(node: _Node, parent: _Node): boolean { return isStaticProperty(parent) && parent.key === node } diff --git a/packages/utils/src/ast/index.ts b/packages/utils/src/ast/index.ts index bf98e57a92e2..370a401ccc51 100644 --- a/packages/utils/src/ast/index.ts +++ b/packages/utils/src/ast/index.ts @@ -47,7 +47,7 @@ interface Visitors { } const isNodeInPatternWeakSet = new WeakSet<_Node>() -export function setIsNodeInPattern(node: Property) { +export function setIsNodeInPattern(node: Property): WeakSet<_Node> { return isNodeInPatternWeakSet.add(node) } export function isNodeInPattern(node: _Node): node is Property { @@ -61,7 +61,7 @@ export function isNodeInPattern(node: _Node): node is Property { export function esmWalker( root: Node, { onIdentifier, onImportMeta, onDynamicImport, onCallExpression }: Visitors, -) { +): void { const parentStack: Node[] = [] const varKindStack: VariableDeclaration['kind'][] = [] const scopeMap = new WeakMap<_Node, Set>() @@ -340,7 +340,7 @@ export function isStaticProperty(node: _Node): node is Property { return node && node.type === 'Property' && !node.computed } -export function isStaticPropertyKey(node: _Node, parent: _Node) { +export function isStaticPropertyKey(node: _Node, parent: _Node): boolean { return isStaticProperty(parent) && parent.key === node } diff --git a/packages/utils/src/base.ts b/packages/utils/src/base.ts deleted file mode 100644 index 892196d8188c..000000000000 --- a/packages/utils/src/base.ts +++ /dev/null @@ -1,22 +0,0 @@ -interface ErrorOptions { - message?: string - stackTraceLimit?: number -} -/** - * Get original stacktrace without source map support the most performant way. - * - Create only 1 stack frame. - * - Rewrite prepareStackTrace to bypass "support-stack-trace" (usually takes ~250ms). - */ -export function createSimpleStackTrace(options?: ErrorOptions) { - const { message = '$$stack trace error', stackTraceLimit = 1 } - = options || {} - const limit = Error.stackTraceLimit - const prepareStackTrace = Error.prepareStackTrace - Error.stackTraceLimit = stackTraceLimit - Error.prepareStackTrace = e => e.stack - const err = new Error(message) - const stackTrace = err.stack || '' - Error.prepareStackTrace = prepareStackTrace - Error.stackTraceLimit = limit - return stackTrace -} diff --git a/packages/utils/src/constants.ts b/packages/utils/src/constants.ts deleted file mode 100644 index 1b285a267dab..000000000000 --- a/packages/utils/src/constants.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const SAFE_TIMERS_SYMBOL = Symbol('vitest:SAFE_TIMERS') -export const SAFE_COLORS_SYMBOL = Symbol('vitest:SAFE_COLORS') diff --git a/packages/utils/src/diff/cleanupSemantic.ts b/packages/utils/src/diff/cleanupSemantic.ts index 09e396e7810d..b794df613778 100644 --- a/packages/utils/src/diff/cleanupSemantic.ts +++ b/packages/utils/src/diff/cleanupSemantic.ts @@ -189,7 +189,7 @@ const diff_commonOverlap_ = function (text1: string, text2: string): number { * Reduce the number of edits by eliminating semantically trivial equalities. * @param {!Array.} diffs Array of diff tuples. */ -const diff_cleanupSemantic = function (diffs: Array) { +const diff_cleanupSemantic = function (diffs: Array): void { let changes = false const equalities = [] // Stack of indices where equalities are found. let equalitiesLength = 0 // Keeping our own length var is faster in JS. diff --git a/packages/utils/src/diff/constants.ts b/packages/utils/src/diff/constants.ts index 4245a83c1d78..d67ba5881993 100644 --- a/packages/utils/src/diff/constants.ts +++ b/packages/utils/src/diff/constants.ts @@ -5,8 +5,8 @@ * LICENSE file in the root directory of this source tree. */ -export const NO_DIFF_MESSAGE = 'Compared values have no visual difference.' +export const NO_DIFF_MESSAGE: string = 'Compared values have no visual difference.' -export const SIMILAR_MESSAGE +export const SIMILAR_MESSAGE: string = 'Compared values serialize to the same structure.\n' + 'Printing internal object structure without calling `toJSON` instead.' diff --git a/packages/utils/src/diff/index.ts b/packages/utils/src/diff/index.ts index 77a0da76ec67..82777b6c4de0 100644 --- a/packages/utils/src/diff/index.ts +++ b/packages/utils/src/diff/index.ts @@ -12,6 +12,9 @@ import { format as prettyFormat, plugins as prettyFormatPlugins, } from '@vitest/pretty-format' +import c from 'tinyrainbow' +import { stringify } from '../display' +import { deepClone, getOwnProperties, getType as getSimpleType } from '../helpers' import { getType } from './getType' import { DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, Diff } from './cleanupSemantic' import { NO_DIFF_MESSAGE, SIMILAR_MESSAGE } from './constants' @@ -211,3 +214,160 @@ function getObjectsDifference( ) } } + +const MAX_DIFF_STRING_LENGTH = 20_000 + +function isAsymmetricMatcher(data: any) { + const type = getSimpleType(data) + return type === 'Object' && typeof data.asymmetricMatch === 'function' +} + +function isReplaceable(obj1: any, obj2: any) { + const obj1Type = getSimpleType(obj1) + const obj2Type = getSimpleType(obj2) + return ( + obj1Type === obj2Type && (obj1Type === 'Object' || obj1Type === 'Array') + ) +} + +export function printDiffOrStringify( + expected: unknown, + received: unknown, + options?: DiffOptions, +): string | null { + const { aAnnotation, bAnnotation } = normalizeDiffOptions(options) + + if ( + typeof expected === 'string' + && typeof received === 'string' + && expected.length > 0 + && received.length > 0 + && expected.length <= MAX_DIFF_STRING_LENGTH + && received.length <= MAX_DIFF_STRING_LENGTH + && expected !== received + ) { + if (expected.includes('\n') || received.includes('\n')) { + return diffStringsUnified(received, expected, options) + } + + const [diffs] = diffStringsRaw(received, expected, true) + const hasCommonDiff = diffs.some(diff => diff[0] === DIFF_EQUAL) + + const printLabel = getLabelPrinter(aAnnotation, bAnnotation) + const expectedLine + = printLabel(aAnnotation) + + printExpected( + getCommonAndChangedSubstrings(diffs, DIFF_DELETE, hasCommonDiff), + ) + const receivedLine + = printLabel(bAnnotation) + + printReceived( + getCommonAndChangedSubstrings(diffs, DIFF_INSERT, hasCommonDiff), + ) + + return `${expectedLine}\n${receivedLine}` + } + + // if (isLineDiffable(expected, received)) { + const clonedExpected = deepClone(expected, { forceWritable: true }) + const clonedReceived = deepClone(received, { forceWritable: true }) + const { replacedExpected, replacedActual } = replaceAsymmetricMatcher(clonedExpected, clonedReceived) + const difference = diff(replacedExpected, replacedActual, options) + + return difference + // } + + // const printLabel = getLabelPrinter(aAnnotation, bAnnotation) + // const expectedLine = printLabel(aAnnotation) + printExpected(expected) + // const receivedLine + // = printLabel(bAnnotation) + // + (stringify(expected) === stringify(received) + // ? 'serializes to the same string' + // : printReceived(received)) + + // return `${expectedLine}\n${receivedLine}` +} + +export function replaceAsymmetricMatcher( + actual: any, + expected: any, + actualReplaced: WeakSet = new WeakSet(), + expectedReplaced: WeakSet = new WeakSet(), +): { + replacedActual: any + replacedExpected: any + } { + if (!isReplaceable(actual, expected)) { + return { replacedActual: actual, replacedExpected: expected } + } + if (actualReplaced.has(actual) || expectedReplaced.has(expected)) { + return { replacedActual: actual, replacedExpected: expected } + } + actualReplaced.add(actual) + expectedReplaced.add(expected) + getOwnProperties(expected).forEach((key) => { + const expectedValue = expected[key] + const actualValue = actual[key] + if (isAsymmetricMatcher(expectedValue)) { + if (expectedValue.asymmetricMatch(actualValue)) { + actual[key] = expectedValue + } + } + else if (isAsymmetricMatcher(actualValue)) { + if (actualValue.asymmetricMatch(expectedValue)) { + expected[key] = actualValue + } + } + else if (isReplaceable(actualValue, expectedValue)) { + const replaced = replaceAsymmetricMatcher( + actualValue, + expectedValue, + actualReplaced, + expectedReplaced, + ) + actual[key] = replaced.replacedActual + expected[key] = replaced.replacedExpected + } + }) + return { + replacedActual: actual, + replacedExpected: expected, + } +} + +type PrintLabel = (string: string) => string +export function getLabelPrinter(...strings: Array): PrintLabel { + const maxLength = strings.reduce( + (max, string) => (string.length > max ? string.length : max), + 0, + ) + return (string: string): string => + `${string}: ${' '.repeat(maxLength - string.length)}` +} + +const SPACE_SYMBOL = '\u{00B7}' // middle dot +function replaceTrailingSpaces(text: string): string { + return text.replace(/\s+$/gm, spaces => SPACE_SYMBOL.repeat(spaces.length)) +} + +function printReceived(object: unknown): string { + return c.red(replaceTrailingSpaces(stringify(object))) +} +function printExpected(value: unknown): string { + return c.green(replaceTrailingSpaces(stringify(value))) +} + +function getCommonAndChangedSubstrings(diffs: Array, op: number, hasCommonDiff: boolean): string { + return diffs.reduce( + (reduced: string, diff: Diff): string => + reduced + + (diff[0] === DIFF_EQUAL + ? diff[1] + : diff[0] === op + ? hasCommonDiff + ? c.inverse(diff[1]) + : diff[1] + : ''), + '', + ) +} diff --git a/packages/utils/src/display.ts b/packages/utils/src/display.ts index be80c3c8f231..67c9902b1776 100644 --- a/packages/utils/src/display.ts +++ b/packages/utils/src/display.ts @@ -1,5 +1,10 @@ // since this is already part of Vitest via Chai, we can just reuse it without increasing the size of bundle import * as loupe from 'loupe' +import type { PrettyFormatOptions } from '@vitest/pretty-format' +import { + format as prettyFormat, + plugins as prettyFormatPlugins, +} from '@vitest/pretty-format' type Inspect = (value: unknown, options: Options) => string interface Options { @@ -18,9 +23,60 @@ interface Options { type LoupeOptions = Partial +const { + AsymmetricMatcher, + DOMCollection, + DOMElement, + Immutable, + ReactElement, + ReactTestComponent, +} = prettyFormatPlugins + +const PLUGINS = [ + ReactTestComponent, + ReactElement, + DOMElement, + DOMCollection, + Immutable, + AsymmetricMatcher, +] + +export function stringify( + object: unknown, + maxDepth = 10, + { maxLength, ...options }: PrettyFormatOptions & { maxLength?: number } = {}, +): string { + const MAX_LENGTH = maxLength ?? 10000 + let result + + try { + result = prettyFormat(object, { + maxDepth, + escapeString: false, + // min: true, + plugins: PLUGINS, + ...options, + }) + } + catch { + result = prettyFormat(object, { + callToJSON: false, + maxDepth, + escapeString: false, + // min: true, + plugins: PLUGINS, + ...options, + }) + } + + return result.length >= MAX_LENGTH && maxDepth > 1 + ? stringify(object, Math.floor(maxDepth / 2)) + : result +} + const formatRegExp = /%[sdjifoOc%]/g -export function format(...args: unknown[]) { +export function format(...args: unknown[]): string { if (typeof args[0] !== 'string') { const objects = [] for (let i = 0; i < args.length; i++) { @@ -134,7 +190,7 @@ export function objDisplay(obj: unknown, options: LoupeOptions = {}): string { return `[ Array(${(obj as []).length}) ]` } else if (type === '[object Object]') { - const keys = Object.keys(obj as {}) + const keys = Object.keys(obj as object) const kstr = keys.length > 2 ? `${keys.splice(0, 2).join(', ')}, ...` diff --git a/packages/utils/src/error.ts b/packages/utils/src/error.ts index e1dc8fbdb22d..2e0cf0c57152 100644 --- a/packages/utils/src/error.ts +++ b/packages/utils/src/error.ts @@ -1,7 +1,5 @@ -import { type DiffOptions, diff } from './diff' -import { format } from './display' -import { deepClone, getOwnProperties, getType } from './helpers' -import { stringify } from './stringify' +import { type DiffOptions, printDiffOrStringify } from './diff' +import { format, stringify } from './display' // utils is bundled for any environment and might not support `Element` declare class Element { @@ -28,7 +26,7 @@ function getUnserializableMessage(err: unknown) { } // https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm -export function serializeError(val: any, seen = new WeakMap()): any { +export function serializeError(val: any, seen: WeakMap = new WeakMap()): any { if (!val || typeof val === 'string') { return val } @@ -113,8 +111,8 @@ function normalizeErrorMessage(message: string) { export function processError( err: any, diffOptions?: DiffOptions, - seen = new WeakSet(), -) { + seen: WeakSet = new WeakSet(), +): any { if (!err || typeof err !== 'object') { return { message: err } } @@ -133,14 +131,7 @@ export function processError( && err.expected !== undefined && err.actual !== undefined) ) { - const clonedActual = deepClone(err.actual, { forceWritable: true }) - const clonedExpected = deepClone(err.expected, { forceWritable: true }) - - const { replacedActual, replacedExpected } = replaceAsymmetricMatcher( - clonedActual, - clonedExpected, - ) - err.diff = diff(replacedExpected, replacedActual, { + err.diff = printDiffOrStringify(err.actual, err.expected, { ...diffOptions, ...err.diffOptions, }) @@ -182,60 +173,3 @@ export function processError( ) } } - -function isAsymmetricMatcher(data: any) { - const type = getType(data) - return type === 'Object' && typeof data.asymmetricMatch === 'function' -} - -function isReplaceable(obj1: any, obj2: any) { - const obj1Type = getType(obj1) - const obj2Type = getType(obj2) - return ( - obj1Type === obj2Type && (obj1Type === 'Object' || obj1Type === 'Array') - ) -} - -export function replaceAsymmetricMatcher( - actual: any, - expected: any, - actualReplaced = new WeakSet(), - expectedReplaced = new WeakSet(), -) { - if (!isReplaceable(actual, expected)) { - return { replacedActual: actual, replacedExpected: expected } - } - if (actualReplaced.has(actual) || expectedReplaced.has(expected)) { - return { replacedActual: actual, replacedExpected: expected } - } - actualReplaced.add(actual) - expectedReplaced.add(expected) - getOwnProperties(expected).forEach((key) => { - const expectedValue = expected[key] - const actualValue = actual[key] - if (isAsymmetricMatcher(expectedValue)) { - if (expectedValue.asymmetricMatch(actualValue)) { - actual[key] = expectedValue - } - } - else if (isAsymmetricMatcher(actualValue)) { - if (actualValue.asymmetricMatch(expectedValue)) { - expected[key] = actualValue - } - } - else if (isReplaceable(actualValue, expectedValue)) { - const replaced = replaceAsymmetricMatcher( - actualValue, - expectedValue, - actualReplaced, - expectedReplaced, - ) - actual[key] = replaced.replacedActual - expected[key] = replaced.replacedExpected - } - }) - return { - replacedActual: actual, - replacedExpected: expected, - } -} diff --git a/packages/utils/src/helpers.ts b/packages/utils/src/helpers.ts index 19e3e63d0936..dd7bc3c93705 100644 --- a/packages/utils/src/helpers.ts +++ b/packages/utils/src/helpers.ts @@ -4,6 +4,30 @@ interface CloneOptions { forceWritable?: boolean } +interface ErrorOptions { + message?: string + stackTraceLimit?: number +} + +/** + * Get original stacktrace without source map support the most performant way. + * - Create only 1 stack frame. + * - Rewrite prepareStackTrace to bypass "support-stack-trace" (usually takes ~250ms). + */ +export function createSimpleStackTrace(options?: ErrorOptions): string { + const { message = '$$stack trace error', stackTraceLimit = 1 } + = options || {} + const limit = Error.stackTraceLimit + const prepareStackTrace = Error.prepareStackTrace + Error.stackTraceLimit = stackTraceLimit + Error.prepareStackTrace = e => e.stack + const err = new Error(message) + const stackTrace = err.stack || '' + Error.prepareStackTrace = prepareStackTrace + Error.stackTraceLimit = limit + return stackTrace +} + export function notNullish(v: T | null | undefined): v is NonNullable { return v != null } @@ -22,13 +46,13 @@ export function assertTypes( } } -export function isPrimitive(value: unknown) { +export function isPrimitive(value: unknown): boolean { return ( value === null || (typeof value !== 'function' && typeof value !== 'object') ) } -export function slash(path: string) { +export function slash(path: string): string { return path.replace(/\\/g, '/') } @@ -93,7 +117,7 @@ function collectOwnProperties( Object.getOwnPropertySymbols(obj).forEach(collect) } -export function getOwnProperties(obj: any) { +export function getOwnProperties(obj: any): (string | symbol)[] { const ownProps = new Set() if (isFinalObj(obj)) { return [] @@ -170,13 +194,13 @@ export function clone( return val } -export function noop() {} +export function noop(): void {} export function objectAttr( source: any, path: string, defaultValue = undefined, -) { +): any { // a[3].b -> a.3.b const paths = path.replace(/\[(\d+)\]/g, '.$1').split('.') let result = source @@ -217,7 +241,7 @@ export function createDefer(): DeferPromise { * toBeAliased('123') * ``` */ -export function getCallLastIndex(code: string) { +export function getCallLastIndex(code: string): number | null { let charIndex = -1 let inString: string | null = null let startedBracers = 0 @@ -255,7 +279,7 @@ export function getCallLastIndex(code: string) { return null } -export function isNegativeNaN(val: number) { +export function isNegativeNaN(val: number): boolean { if (!Number.isNaN(val)) { return false } diff --git a/packages/utils/src/highlight.ts b/packages/utils/src/highlight.ts index 6ab5de815e61..0f5c86bc8d80 100644 --- a/packages/utils/src/highlight.ts +++ b/packages/utils/src/highlight.ts @@ -39,7 +39,7 @@ interface HighlightOptions { export function highlight( code: string, options: HighlightOptions = { jsx: false }, -) { +): string { return baseHighlight(code, { jsx: options.jsx, colors: getDefs(options.colors || c), diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 77b3fb30075e..dce716edf4b4 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -1,10 +1,50 @@ -export * from './helpers' -export * from './types' -export * from './stringify' -export * from './timers' -export * from './random' -export * from './display' -export * from './constants' -export * from './base' -export * from './offset' -export * from './highlight' +export { + notNullish, + assertTypes, + isPrimitive, + slash, + parseRegexp, + isObject, + getType, + getOwnProperties, + deepClone, + clone, + noop, + objectAttr, + createDefer, + getCallLastIndex, + isNegativeNaN, + createSimpleStackTrace, + toArray, +} from './helpers' +export type { DeferPromise } from './helpers' + +export { getSafeTimers, setSafeTimers } from './timers' +export type { SafeTimers } from './timers' + +export { shuffle } from './random' +export { + stringify, + format, + inspect, + objDisplay, +} from './display' +export { + positionToOffset, + offsetToLineNumber, + lineSplitRE, +} from './offset' +export { highlight } from './highlight' + +export type { + Awaitable, + Nullable, + Arrayable, + ArgumentsType, + MergeInsertions, + DeepMerge, + MutableArray, + Constructable, + ParsedStack, + ErrorWithDiff, +} from './types' diff --git a/packages/utils/src/offset.ts b/packages/utils/src/offset.ts index 8d340281a30e..f76a007fb033 100644 --- a/packages/utils/src/offset.ts +++ b/packages/utils/src/offset.ts @@ -1,4 +1,4 @@ -export const lineSplitRE = /\r?\n/ +export const lineSplitRE: RegExp = /\r?\n/ export function positionToOffset( source: string, diff --git a/packages/utils/src/random.ts b/packages/utils/src/random.ts index 7cd33217275c..a0ecf2488b45 100644 --- a/packages/utils/src/random.ts +++ b/packages/utils/src/random.ts @@ -5,7 +5,7 @@ function random(seed: number) { return x - Math.floor(x) } -export function shuffle(array: T[], seed = RealDate.now()): T[] { +export function shuffle(array: T[], seed: number = RealDate.now()): T[] { let length = array.length while (length) { diff --git a/packages/utils/src/source-map.ts b/packages/utils/src/source-map.ts index 99ebab691d13..c549c290772e 100644 --- a/packages/utils/src/source-map.ts +++ b/packages/utils/src/source-map.ts @@ -107,7 +107,7 @@ export function parseSingleFFOrSafariStack(raw: string): ParsedStack | null { } } -export function parseSingleStack(raw: string) { +export function parseSingleStack(raw: string): ParsedStack | null { const line = raw.trim() if (!CHROME_IE_STACK_REGEXP.test(line)) { return parseSingleFFOrSafariStack(line) diff --git a/packages/utils/src/stringify.ts b/packages/utils/src/stringify.ts deleted file mode 100644 index 574d5ef70365..000000000000 --- a/packages/utils/src/stringify.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { PrettyFormatOptions } from '@vitest/pretty-format' -import { - format as prettyFormat, - plugins as prettyFormatPlugins, -} from '@vitest/pretty-format' - -const { - AsymmetricMatcher, - DOMCollection, - DOMElement, - Immutable, - ReactElement, - ReactTestComponent, -} = prettyFormatPlugins - -const PLUGINS = [ - ReactTestComponent, - ReactElement, - DOMElement, - DOMCollection, - Immutable, - AsymmetricMatcher, -] - -export function stringify( - object: unknown, - maxDepth = 10, - { maxLength, ...options }: PrettyFormatOptions & { maxLength?: number } = {}, -): string { - const MAX_LENGTH = maxLength ?? 10000 - let result - - try { - result = prettyFormat(object, { - maxDepth, - escapeString: false, - // min: true, - plugins: PLUGINS, - ...options, - }) - } - catch { - result = prettyFormat(object, { - callToJSON: false, - maxDepth, - escapeString: false, - // min: true, - plugins: PLUGINS, - ...options, - }) - } - - return result.length >= MAX_LENGTH && maxDepth > 1 - ? stringify(object, Math.floor(maxDepth / 2)) - : result -} diff --git a/packages/utils/src/timers.ts b/packages/utils/src/timers.ts index 1ca76e815e5d..bc95037d64ee 100644 --- a/packages/utils/src/timers.ts +++ b/packages/utils/src/timers.ts @@ -1,6 +1,16 @@ -import { SAFE_TIMERS_SYMBOL } from './constants' +const SAFE_TIMERS_SYMBOL = Symbol('vitest:SAFE_TIMERS') -export function getSafeTimers() { +export interface SafeTimers { + nextTick: (cb: () => void) => void + setTimeout: typeof setTimeout + setInterval: typeof setInterval + clearInterval: typeof clearInterval + clearTimeout: typeof clearTimeout + setImmediate: typeof setImmediate + clearImmediate: typeof clearImmediate +} + +export function getSafeTimers(): SafeTimers { const { setTimeout: safeSetTimeout, setInterval: safeSetInterval, @@ -24,7 +34,7 @@ export function getSafeTimers() { } } -export function setSafeTimers() { +export function setSafeTimers(): void { const { setTimeout: safeSetTimeout, setInterval: safeSetInterval, diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index c2166451fdb0..53f9fd0cccc4 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.base.json", + "compilerOptions": { + "moduleResolution": "Bundler", + "isolatedDeclarations": true + }, "include": ["src/**/*"], "exclude": ["**/dist/**"] } diff --git a/packages/vite-node/package.json b/packages/vite-node/package.json index 252feb4fe4ee..985928a1c48b 100644 --- a/packages/vite-node/package.json +++ b/packages/vite-node/package.json @@ -1,7 +1,7 @@ { "name": "vite-node", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Vite as Node.js runtime", "author": "Anthony Fu ", "license": "MIT", diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index 849bdc5cf99b..aa02826d8a67 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -152,7 +152,9 @@ export class ModuleCacheMap extends Map { const subIds = Array.from(super.entries()) .filter(([, mod]) => mod.importers?.has(id)) .map(([key]) => key) - subIds.length && this.invalidateSubDepTree(subIds, invalidated) + if (subIds.length) { + this.invalidateSubDepTree(subIds, invalidated) + } super.delete(id) } return invalidated @@ -621,7 +623,7 @@ function exportAll(exports: any, sourceModule: any) { try { defineExport(exports, key, () => sourceModule[key]) } - catch (_err) {} + catch {} } } } diff --git a/packages/vite-node/src/source-map-handler.ts b/packages/vite-node/src/source-map-handler.ts index b15e7beeb778..e08c11a6a6b1 100644 --- a/packages/vite-node/src/source-map-handler.ts +++ b/packages/vite-node/src/source-map-handler.ts @@ -79,7 +79,7 @@ retrieveFileHandlers.push((path) => { contents = fs.readFileSync(path, 'utf8') } } - catch (er) { + catch { /* ignore any errors */ } diff --git a/packages/vitest/package.json b/packages/vitest/package.json index e59610584a66..ae90696c5a5c 100644 --- a/packages/vitest/package.json +++ b/packages/vitest/package.json @@ -1,7 +1,7 @@ { "name": "vitest", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Next generation testing framework powered by Vite", "author": "Anthony Fu ", "license": "MIT", @@ -165,7 +165,7 @@ "tinyrainbow": "^1.2.0", "vite": "^5.0.0", "vite-node": "workspace:*", - "why-is-node-running": "^2.2.2" + "why-is-node-running": "^2.3.0" }, "devDependencies": { "@antfu/install-pkg": "0.3.1", @@ -177,7 +177,7 @@ "@types/istanbul-reports": "^3.0.4", "@types/jsdom": "^21.1.7", "@types/micromatch": "^4.0.9", - "@types/node": "^20.14.9", + "@types/node": "^20.14.10", "@types/prompts": "^2.4.9", "@types/sinonjs__fake-timers": "^8.1.5", "acorn-walk": "^8.3.3", @@ -199,6 +199,6 @@ "prompts": "^2.4.2", "strip-ansi": "^7.1.0", "strip-literal": "^2.1.0", - "ws": "^8.17.1" + "ws": "^8.18.0" } } diff --git a/packages/vitest/src/defaults.ts b/packages/vitest/src/defaults.ts index 4b1ade73230b..cd412103235e 100644 --- a/packages/vitest/src/defaults.ts +++ b/packages/vitest/src/defaults.ts @@ -68,7 +68,6 @@ export const coverageConfigDefaults: ResolvedCoverageOptions = { '.mjs', '.ts', '.mts', - '.cts', '.tsx', '.jsx', '.vue', diff --git a/packages/vitest/src/node/cli/cli-config.ts b/packages/vitest/src/node/cli/cli-config.ts index f9b8b1a3ac97..055a05387a15 100644 --- a/packages/vitest/src/node/cli/cli-config.ts +++ b/packages/vitest/src/node/cli/cli-config.ts @@ -24,12 +24,12 @@ export type CLIOption = { array?: boolean normalize?: boolean } & (NestedOption extends never // require subcommands for nested options - ? {} + ? object : { subcommands: CLIOptions> | null }) & // require argument for non-boolean options - (NonNullable extends boolean ? {} : { argument: string }) + (NonNullable extends boolean ? object : { argument: string }) -export type CLIOptions = { +export type CLIOptions = { [Key in keyof Config as NonNullable extends Function ? never : Key]-?: CLIOption | null; @@ -203,7 +203,7 @@ export const cliOptionsConfig: VitestCLIOptions = { }, extension: { description: - 'Extension to be included in coverage. May be specified more than once when using multiple extensions (default: `[".js", ".cjs", ".mjs", ".ts", ".mts", ".cts", ".tsx", ".jsx", ".vue", ".svelte"]`)', + 'Extension to be included in coverage. May be specified more than once when using multiple extensions (default: `[".js", ".cjs", ".mjs", ".ts", ".mts", ".tsx", ".jsx", ".vue", ".svelte"]`)', argument: '', array: true, }, diff --git a/packages/vitest/src/node/config.ts b/packages/vitest/src/node/config.ts index e43a7596fde8..a3a0cd1e0257 100644 --- a/packages/vitest/src/node/config.ts +++ b/packages/vitest/src/node/config.ts @@ -591,7 +591,7 @@ export function resolveConfig( for (const reporter of options.reporters) { if (Array.isArray(reporter)) { // Reporter with options, e.g. { reporters: [ [ 'json', { outputFile: 'test.json' } ] ] } - resolved.reporters.push([reporter[0], reporter[1] || {}]) + resolved.reporters.push([reporter[0], reporter[1] as Record || {}]) } else if (typeof reporter === 'string') { // Reporter name in array, e.g. { reporters: ["html", "json"]} diff --git a/packages/vitest/src/node/packageInstaller.ts b/packages/vitest/src/node/packageInstaller.ts index 5feb78fc14e2..481b22c2211f 100644 --- a/packages/vitest/src/node/packageInstaller.ts +++ b/packages/vitest/src/node/packageInstaller.ts @@ -18,7 +18,7 @@ export class VitestPackageInstaller { targetRequire.resolve(dependency, { paths: [root, __dirname] }) return true } - catch (error) {} + catch {} } if ( diff --git a/packages/vitest/src/node/reporters/base.ts b/packages/vitest/src/node/reporters/base.ts index 5d6677c772a8..fe8a099cb47a 100644 --- a/packages/vitest/src/node/reporters/base.ts +++ b/packages/vitest/src/node/reporters/base.ts @@ -12,7 +12,6 @@ import type { } from '../../types' import { getFullName, - getSafeTimers, getSuites, getTestName, getTests, @@ -72,7 +71,7 @@ export abstract class BaseReporter implements Reporter { private _filesInWatchMode = new Map() private _lastRunTimeout = 0 - private _lastRunTimer: NodeJS.Timer | undefined + private _lastRunTimer: NodeJS.Timeout | undefined private _lastRunCount = 0 private _timeStart = new Date() private _offUnhandledRejection?: () => void @@ -216,7 +215,6 @@ export abstract class BaseReporter implements Reporter { ] this.ctx.logger.logUpdate(BADGE_PADDING + LAST_RUN_TEXTS[0]) this._lastRunTimeout = 0 - const { setInterval } = getSafeTimers() this._lastRunTimer = setInterval(() => { this._lastRunTimeout += 1 if (this._lastRunTimeout >= LAST_RUN_TEXTS.length) { @@ -232,7 +230,6 @@ export abstract class BaseReporter implements Reporter { } private resetLastRunLog() { - const { clearInterval } = getSafeTimers() clearInterval(this._lastRunTimer) this._lastRunTimer = undefined this.ctx.logger.logUpdate.clear() diff --git a/packages/vitest/src/runtime/mocker.ts b/packages/vitest/src/runtime/mocker.ts index ddf245f5d8a2..75dd253f9f23 100644 --- a/packages/vitest/src/runtime/mocker.ts +++ b/packages/vitest/src/runtime/mocker.ts @@ -364,7 +364,7 @@ export class VitestMocker { try { Object.defineProperty(newContainer, property, descriptor) } - catch (error) { + catch { // Ignore errors, just move on to the next prop. } continue diff --git a/packages/vitest/src/runtime/runVmTests.ts b/packages/vitest/src/runtime/runVmTests.ts index 5b3b4107501e..621022a316cc 100644 --- a/packages/vitest/src/runtime/runVmTests.ts +++ b/packages/vitest/src/runtime/runVmTests.ts @@ -4,6 +4,7 @@ import timers from 'node:timers' import { performance } from 'node:perf_hooks' import { collectTests, startTests } from '@vitest/runner' import { installSourcemapsSupport } from 'vite-node/source-map' +import { KNOWN_ASSET_TYPES } from 'vite-node/constants' import { setupChaiConfig } from '../integrations/chai/config' import { startCoverageInsideWorker, @@ -36,10 +37,14 @@ export async function run( if (workerState.environment.transformMode === 'web') { const _require = createRequire(import.meta.url) // always mock "required" `css` files, because we cannot process them - _require.extensions['.css'] = () => ({}) - _require.extensions['.scss'] = () => ({}) - _require.extensions['.sass'] = () => ({}) - _require.extensions['.less'] = () => ({}) + _require.extensions['.css'] = resolveCss + _require.extensions['.scss'] = resolveCss + _require.extensions['.sass'] = resolveCss + _require.extensions['.less'] = resolveCss + // since we are using Vite, we can assume how these will be resolved + KNOWN_ASSET_TYPES.forEach((type) => { + _require.extensions[`.${type}`] = resolveAsset + }) } // @ts-expect-error not typed global for patched timers @@ -93,3 +98,11 @@ export async function run( await stopCoverageInsideWorker(config.coverage, executor) } + +function resolveCss(mod: NodeJS.Module) { + mod.exports = '' +} + +function resolveAsset(mod: NodeJS.Module, url: string) { + mod.exports = url +} diff --git a/packages/vitest/src/runtime/setup-node.ts b/packages/vitest/src/runtime/setup-node.ts index 5fe45557d895..100a7d302072 100644 --- a/packages/vitest/src/runtime/setup-node.ts +++ b/packages/vitest/src/runtime/setup-node.ts @@ -2,6 +2,7 @@ import { createRequire } from 'node:module' import util from 'node:util' import timers from 'node:timers' import { installSourcemapsSupport } from 'vite-node/source-map' +import { KNOWN_ASSET_TYPES } from 'vite-node/constants' import type { EnvironmentOptions, ResolvedConfig, @@ -44,10 +45,14 @@ export async function setupGlobalEnv( if (environment.transformMode === 'web') { const _require = createRequire(import.meta.url) // always mock "required" `css` files, because we cannot process them - _require.extensions['.css'] = () => ({}) - _require.extensions['.scss'] = () => ({}) - _require.extensions['.sass'] = () => ({}) - _require.extensions['.less'] = () => ({}) + _require.extensions['.css'] = resolveCss + _require.extensions['.scss'] = resolveCss + _require.extensions['.sass'] = resolveCss + _require.extensions['.less'] = resolveCss + // since we are using Vite, we can assume how these will be resolved + KNOWN_ASSET_TYPES.forEach((type) => { + _require.extensions[`.${type}`] = resolveAsset + }) process.env.SSR = '' } else { @@ -69,6 +74,14 @@ export async function setupGlobalEnv( } } +function resolveCss(mod: NodeJS.Module) { + mod.exports = '' +} + +function resolveAsset(mod: NodeJS.Module, url: string) { + mod.exports = url +} + export async function setupConsoleLogSpy() { const { createCustomConsole } = await import('./console') diff --git a/packages/vitest/src/runtime/vm/types.ts b/packages/vitest/src/runtime/vm/types.ts index 84295cf926fc..4547663e88a5 100644 --- a/packages/vitest/src/runtime/vm/types.ts +++ b/packages/vitest/src/runtime/vm/types.ts @@ -11,7 +11,7 @@ interface ModuleEvaluateOptions { type ModuleLinker = ( specifier: string, referencingModule: VMModule, - extra: { assert: Object } + extra: { assert: object } ) => VMModule | Promise type ModuleStatus = | 'unlinked' @@ -25,7 +25,7 @@ export declare class VMModule { error: any identifier: string context: vm.Context - namespace: Object + namespace: object status: ModuleStatus evaluate(options?: ModuleEvaluateOptions): Promise link(linker: ModuleLinker): Promise @@ -62,7 +62,7 @@ export declare class VMSyntheticModule extends VMModule { } export declare interface ImportModuleDynamically { - (specifier: string, script: VMModule, importAssertions: Object): + (specifier: string, script: VMModule, importAssertions: object): | VMModule | Promise } diff --git a/packages/vitest/src/types/config.ts b/packages/vitest/src/types/config.ts index ba88445d1911..bfb0b849614c 100644 --- a/packages/vitest/src/types/config.ts +++ b/packages/vitest/src/types/config.ts @@ -224,7 +224,7 @@ type ReporterName = BuiltinReporters | 'html' | (string & {}) type ReporterWithOptions = Name extends keyof BuiltinReporterOptions ? BuiltinReporterOptions[Name] extends never - ? [Name, {}] + ? [Name, object] : [Name, Partial] : [Name, Record] diff --git a/packages/vitest/src/types/coverage.ts b/packages/vitest/src/types/coverage.ts index 92153f6f8e96..9bc381515b36 100644 --- a/packages/vitest/src/types/coverage.ts +++ b/packages/vitest/src/types/coverage.ts @@ -83,7 +83,7 @@ type CoverageReporterWithOptions< ReporterName extends CoverageReporter = CoverageReporter, > = ReporterName extends keyof ReportOptions ? ReportOptions[ReporterName] extends never - ? [ReporterName, {}] // E.g. the "none" reporter + ? [ReporterName, object] // E.g. the "none" reporter : [ReporterName, Partial] : [ReporterName, Record] @@ -222,7 +222,7 @@ export interface BaseCoverageOptions { | ({ [glob: string]: Pick< Thresholds, - 'statements' | 'functions' | 'branches' | 'lines' + 100 | 'statements' | 'functions' | 'branches' | 'lines' > } & Thresholds) diff --git a/packages/vitest/src/utils/base.ts b/packages/vitest/src/utils/base.ts index 1834de872df9..f165f4a931ec 100644 --- a/packages/vitest/src/utils/base.ts +++ b/packages/vitest/src/utils/base.ts @@ -144,15 +144,16 @@ export function deepMerge( if (isMergeableObject(target) && isMergeableObject(source)) { (Object.keys(source) as (keyof T)[]).forEach((key) => { - if (isMergeableObject(source[key])) { + const _source = source as T + if (isMergeableObject(_source[key])) { if (!target[key]) { target[key] = {} as any } - deepMerge(target[key] as any, source[key] as any) + deepMerge(target[key] as any, _source[key]) } else { - target[key] = source[key] as any + target[key] = _source[key] as any } }) } @@ -160,7 +161,7 @@ export function deepMerge( return deepMerge(target, ...sources) } -function isMergeableObject(item: any): item is Object { +function isMergeableObject(item: any): item is object { return isPlainObject(item) && !Array.isArray(item) } diff --git a/packages/vitest/src/utils/coverage.ts b/packages/vitest/src/utils/coverage.ts index e5755c330373..b8ac873f2d77 100644 --- a/packages/vitest/src/utils/coverage.ts +++ b/packages/vitest/src/utils/coverage.ts @@ -182,7 +182,6 @@ export class BaseCoverageProvider { }): ResolvedThreshold[] { const resolvedThresholds: ResolvedThreshold[] = [] const files = coverageMap.files() - const filesMatchedByGlobs: string[] = [] const globalCoverageMap = createCoverageMap() for (const key of Object.keys( @@ -204,7 +203,6 @@ export class BaseCoverageProvider { const matchingFiles = files.filter(file => mm.isMatch(relative(root, file), glob), ) - filesMatchedByGlobs.push(...matchingFiles) for (const file of matchingFiles) { const fileCoverage = coverageMap.fileCoverageFor(file) @@ -218,10 +216,8 @@ export class BaseCoverageProvider { }) } - // Global threshold is for all files that were not included by glob patterns - for (const file of files.filter( - file => !filesMatchedByGlobs.includes(file), - )) { + // Global threshold is for all files, even if they are included by glob patterns + for (const file of files) { const fileCoverage = coverageMap.fileCoverageFor(file) globalCoverageMap.addFileCoverage(fileCoverage) } @@ -256,7 +252,7 @@ export class BaseCoverageProvider { for (const reporter of configReporters) { if (Array.isArray(reporter)) { // E.g. { reporter: [ ["html", { skipEmpty: true }], ["lcov"], ["json", { file: "map.json" }] ]} - resolvedReporters.push([reporter[0], reporter[1] || {}]) + resolvedReporters.push([reporter[0], reporter[1] as Record || {}]) } else { // E.g. { reporter: ["html", "json"]} @@ -305,6 +301,15 @@ function resolveGlobThresholds( return {} } + if (100 in thresholds && thresholds[100] === true) { + return { + lines: 100, + branches: 100, + functions: 100, + statements: 100, + } + } + return { lines: 'lines' in thresholds && typeof thresholds.lines === 'number' diff --git a/packages/web-worker/package.json b/packages/web-worker/package.json index 734f27aebd85..27660dd00f2e 100644 --- a/packages/web-worker/package.json +++ b/packages/web-worker/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/web-worker", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "Web Worker support for testing in Vitest", "license": "MIT", "funding": "https://opencollective.com/vitest", diff --git a/packages/web-worker/src/utils.ts b/packages/web-worker/src/utils.ts index 136d1068d91b..74150884b626 100644 --- a/packages/web-worker/src/utils.ts +++ b/packages/web-worker/src/utils.ts @@ -43,13 +43,14 @@ function createClonedMessageEvent( } if (clone !== 'none') { debug('create message event, using polyfilled structured clone') - transfer?.length - && console.warn( - '[@vitest/web-worker] `structuredClone` is not supported in this environment. ' - + 'Falling back to polyfill, your transferable options will be lost. ' - + 'Set `VITEST_WEB_WORKER_CLONE` environmental variable to "none", if you don\'t want to loose it,' - + 'or update to Node 17+.', - ) + if (transfer?.length) { + console.warn( + '[@vitest/web-worker] `structuredClone` is not supported in this environment. ' + + 'Falling back to polyfill, your transferable options will be lost. ' + + 'Set `VITEST_WEB_WORKER_CLONE` environmental variable to "none", if you don\'t want to loose it,' + + 'or update to Node 17+.', + ) + } return new MessageEvent('message', { data: ponyfillStructuredClone(data, { lossy: true } as any), origin, diff --git a/packages/ws-client/package.json b/packages/ws-client/package.json index 82f260a1de05..607421253026 100644 --- a/packages/ws-client/package.json +++ b/packages/ws-client/package.json @@ -1,7 +1,7 @@ { "name": "@vitest/ws-client", "type": "module", - "version": "2.0.3", + "version": "2.0.4", "description": "WebSocket client wrapper for communicating with Vitest", "author": "Anthony Fu ", "license": "MIT", @@ -40,7 +40,7 @@ "dependencies": { "birpc": "0.2.17", "flatted": "^3.3.1", - "ws": "^8.17.1" + "ws": "^8.18.0" }, "devDependencies": { "@vitest/runner": "workspace:*" diff --git a/packages/ws-client/src/index.ts b/packages/ws-client/src/index.ts index 99d7ae3576f0..8301c19b719c 100644 --- a/packages/ws-client/src/index.ts +++ b/packages/ws-client/src/index.ts @@ -49,7 +49,7 @@ export function createClient(url: string, options: VitestClientOptions = {}) { ctx.state.filesMap = reactive(ctx.state.filesMap, 'filesMap') ctx.state.idMap = reactive(ctx.state.idMap, 'idMap') - let onMessage: Function + let onMessage: (data: any) => void const functions: WebSocketEvents = { onSpecsCollected(specs) { specs?.forEach(([config, file]) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26cbcbe4a5ff..7bbcde7fd05c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ settings: overrides: mlly: ^1.7.1 - rollup: ^4.18.0 + rollup: ^4.18.1 vite: ^5.3.3 vitest: workspace:* @@ -35,29 +35,29 @@ importers: .: devDependencies: '@antfu/eslint-config': - specifier: ^2.21.2 - version: 2.21.2(@vue/compiler-sfc@3.4.31)(eslint@9.6.0)(svelte@3.59.1)(typescript@5.5.2)(vitest@packages+vitest) + specifier: ^2.22.2 + version: 2.22.2(@vue/compiler-sfc@3.4.31)(eslint@9.7.0)(svelte@3.59.1)(typescript@5.5.3)(vitest@packages+vitest) '@antfu/ni': - specifier: ^0.21.12 - version: 0.21.12 + specifier: ^0.22.0 + version: 0.22.0 '@playwright/test': - specifier: ^1.45.0 - version: 1.45.0 + specifier: ^1.45.1 + version: 1.45.1 '@rollup/plugin-commonjs': specifier: ^26.0.1 - version: 26.0.1(rollup@4.18.0) + version: 26.0.1(rollup@4.18.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.18.0) + version: 6.1.0(rollup@4.18.1) '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.2.3(rollup@4.18.0) + version: 15.2.3(rollup@4.18.1) '@types/node': - specifier: ^20.14.9 - version: 20.14.9 + specifier: ^20.14.10 + version: 20.14.10 '@types/ws': - specifier: ^8.5.10 - version: 8.5.10 + specifier: ^8.5.11 + version: 8.5.11 '@vitest/browser': specifier: workspace:* version: link:packages/browser @@ -74,11 +74,11 @@ importers: specifier: ^9.4.1 version: 9.4.1 esbuild: - specifier: ^0.22.0 - version: 0.22.0 + specifier: ^0.23.0 + version: 0.23.0 eslint: - specifier: ^9.6.0 - version: 9.6.0 + specifier: ^9.7.0 + version: 9.7.0 fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -92,41 +92,41 @@ importers: specifier: ^6.0.1 version: 6.0.1 rollup: - specifier: ^4.18.0 - version: 4.18.0 + specifier: ^4.18.1 + version: 4.18.1 rollup-plugin-dts: specifier: ^6.1.1 - version: 6.1.1(rollup@4.18.0)(typescript@5.5.2) + version: 6.1.1(rollup@4.18.1)(typescript@5.5.3) rollup-plugin-esbuild: specifier: ^6.1.1 - version: 6.1.1(esbuild@0.22.0)(rollup@4.18.0) + version: 6.1.1(esbuild@0.23.0)(rollup@4.18.1) rollup-plugin-license: - specifier: ^3.5.1 - version: 3.5.1(rollup@4.18.0) + specifier: ^3.5.2 + version: 3.5.2(rollup@4.18.1) tsx: - specifier: ^4.16.0 - version: 4.16.0 + specifier: ^4.16.2 + version: 4.16.2 typescript: - specifier: ^5.5.2 - version: 5.5.2 + specifier: ^5.5.3 + version: 5.5.3 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:packages/vitest zx: - specifier: ^8.1.3 - version: 8.1.3 + specifier: ^8.1.4 + version: 8.1.4 docs: dependencies: '@vueuse/core': specifier: ^10.11.0 - version: 10.11.0(vue@3.4.31(typescript@5.5.2)) + version: 10.11.0(vue@3.4.31(typescript@5.5.3)) vue: specifier: ^3.4.31 - version: 3.4.31(typescript@5.5.2) + version: 3.4.31(typescript@5.5.3) devDependencies: '@iconify-json/carbon': specifier: ^1.1.36 @@ -135,20 +135,20 @@ importers: specifier: ^1.1.43 version: 1.1.43 '@shikijs/vitepress-twoslash': - specifier: ^1.10.0 - version: 1.10.0(typescript@5.5.2) + specifier: ^1.10.3 + version: 1.10.3(typescript@5.5.3) '@unocss/reset': - specifier: ^0.61.0 - version: 0.61.0 + specifier: ^0.61.3 + version: 0.61.3 '@vite-pwa/assets-generator': specifier: ^0.2.4 version: 0.2.4 '@vite-pwa/vitepress': specifier: ^0.5.0 - version: 0.5.0(@vite-pwa/assets-generator@0.2.4)(vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0)) + version: 0.5.0(@vite-pwa/assets-generator@0.2.4)(vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0)) '@vitejs/plugin-vue': specifier: latest - version: 5.0.5(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(vue@3.4.31(typescript@5.5.2)) + version: 5.0.5(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(vue@3.4.31(typescript@5.5.3)) fast-glob: specifier: ^3.3.2 version: 3.3.2 @@ -156,20 +156,20 @@ importers: specifier: ^4.7.1 version: 4.7.1 unocss: - specifier: ^0.61.0 - version: 0.61.0(postcss@8.4.39)(rollup@4.18.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + specifier: ^0.61.3 + version: 0.61.3(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) unplugin-vue-components: specifier: ^0.27.2 - version: 0.27.2(@babel/parser@7.24.7)(rollup@4.18.0)(vue@3.4.31(typescript@5.5.2)) + version: 0.27.2(@babel/parser@7.24.7)(rollup@4.18.1)(vue@3.4.31(typescript@5.5.3)) vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vite-plugin-pwa: specifier: ^0.20.0 - version: 0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0) + version: 0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0) vitepress: - specifier: ^1.2.3 - version: 1.2.3(@algolia/client-search@4.20.0)(@types/node@20.14.9)(@types/react@18.2.79)(axios@0.26.1)(postcss@8.4.39)(react-dom@18.0.0(react@18.2.0))(react@18.2.0)(search-insights@2.9.0)(terser@5.22.0)(typescript@5.5.2) + specifier: ^1.3.1 + version: 1.3.1(@algolia/client-search@4.20.0)(@types/node@20.14.10)(@types/react@18.2.79)(postcss@8.4.39)(react-dom@18.0.0(react@18.2.0))(react@18.2.0)(search-insights@2.9.0)(terser@5.22.0)(typescript@5.5.3) workbox-window: specifier: ^7.1.0 version: 7.1.0 @@ -181,7 +181,7 @@ importers: version: 2.0.2(vitest@packages+vitest) vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -202,7 +202,7 @@ importers: version: 4.7.2 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -215,7 +215,7 @@ importers: devDependencies: '@vitest/browser': specifier: latest - version: 2.0.2(playwright@1.45.0)(typescript@5.5.2)(vitest@packages+vitest)(webdriverio@8.32.2(typescript@5.5.2)) + version: 2.0.2(playwright@1.45.1)(typescript@5.5.3)(vitest@packages+vitest)(webdriverio@8.32.2(typescript@5.5.3)) '@vitest/ui': specifier: latest version: 2.0.2(vitest@packages+vitest) @@ -224,13 +224,13 @@ importers: version: 24.1.0 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest webdriverio: specifier: ^8.32.2 - version: 8.32.2(typescript@5.5.2) + version: 8.32.2(typescript@5.5.3) examples/preact: dependencies: @@ -249,7 +249,7 @@ importers: devDependencies: '@preact/preset-vite': specifier: ^2.8.2 - version: 2.8.2(@babel/core@7.24.5)(preact@10.21.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + version: 2.8.2(@babel/core@7.24.5)(preact@10.21.0)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) '@testing-library/jest-dom': specifier: ^6.4.2 version: 6.4.2(@types/jest@29.0.0)(vitest@packages+vitest) @@ -264,7 +264,7 @@ importers: version: 5.4.5 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -283,7 +283,7 @@ importers: version: 13.4.0(react-dom@18.0.0(react@18.2.0))(react@18.2.0) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.2.0) + version: 14.5.2(@testing-library/dom@10.3.1) '@types/react': specifier: ^18.2.79 version: 18.2.79 @@ -295,7 +295,7 @@ importers: version: 24.0.0 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -317,10 +317,10 @@ importers: version: 24.1.0 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vite-plugin-solid: specifier: ^2.7.2 - version: 2.7.2(solid-js@1.8.3)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + version: 2.7.2(solid-js@1.8.3)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -329,10 +329,10 @@ importers: devDependencies: '@sveltejs/adapter-auto': specifier: ^2.1.0 - version: 2.1.0(@sveltejs/kit@1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))) + version: 2.1.0(@sveltejs/kit@1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))) '@sveltejs/kit': specifier: ^1.20.2 - version: 1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + version: 1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) svelte: specifier: ^3.59.1 version: 3.59.1 @@ -347,7 +347,7 @@ importers: version: 5.2.2 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -380,13 +380,13 @@ importers: version: 13.4.0(react-dom@18.0.0(react@18.2.0))(react@18.2.0) '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.2.0) + version: 14.5.2(@testing-library/dom@10.3.1) '@types/react': specifier: ^18.2.79 version: 18.2.79 '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.2.1(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + version: 4.2.1(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) '@vitest/ui': specifier: latest version: 2.0.2(vitest@packages+vitest) @@ -407,7 +407,7 @@ importers: version: 4.7.2 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -415,11 +415,11 @@ importers: packages/browser: dependencies: '@testing-library/dom': - specifier: ^10.2.0 - version: 10.2.0 + specifier: ^10.3.1 + version: 10.3.1 '@testing-library/user-event': specifier: ^14.5.2 - version: 14.5.2(@testing-library/dom@10.2.0) + version: 14.5.2(@testing-library/dom@10.3.1) '@vitest/utils': specifier: workspace:* version: link:../utils @@ -428,20 +428,20 @@ importers: version: 0.30.10 msw: specifier: ^2.3.1 - version: 2.3.1(typescript@5.5.2) + version: 2.3.1(typescript@5.5.3) sirv: specifier: ^2.0.4 version: 2.0.4 ws: - specifier: ^8.17.1 - version: 8.17.1 + specifier: ^8.18.0 + version: 8.18.0 devDependencies: '@testing-library/jest-dom': specifier: ^6.4.6 version: 6.4.6(@types/jest@29.0.0)(vitest@packages+vitest) '@types/ws': - specifier: ^8.5.10 - version: 8.5.10 + specifier: ^8.5.11 + version: 8.5.11 '@vitest/runner': specifier: workspace:* version: link:../runner @@ -467,11 +467,11 @@ importers: specifier: ^4.0.2 version: 4.0.2 playwright: - specifier: ^1.45.0 - version: 1.45.0 + specifier: ^1.45.1 + version: 1.45.1 playwright-core: - specifier: ^1.45.0 - version: 1.45.0 + specifier: ^1.45.1 + version: 1.45.1 safaridriver: specifier: ^0.1.2 version: 0.1.2 @@ -479,8 +479,8 @@ importers: specifier: workspace:* version: link:../vitest webdriverio: - specifier: ^8.39.0 - version: 8.39.0(typescript@5.5.2) + specifier: ^8.39.1 + version: 8.39.1(typescript@5.5.3) packages/coverage-istanbul: dependencies: @@ -572,9 +572,6 @@ importers: std-env: specifier: ^3.7.0 version: 3.7.0 - strip-literal: - specifier: ^2.1.0 - version: 2.1.0 test-exclude: specifier: ^7.0.1 version: 7.0.1 @@ -723,7 +720,7 @@ importers: version: 1.1.43 '@testing-library/vue': specifier: ^8.1.0 - version: 8.1.0(@vue/compiler-sfc@3.4.31)(vue@3.4.31(typescript@5.5.2)) + version: 8.1.0(@vue/compiler-sfc@3.4.31)(vue@3.4.31(typescript@5.5.3)) '@types/codemirror': specifier: ^5.60.15 version: 5.60.15 @@ -734,14 +731,14 @@ importers: specifier: ^3.0.10 version: 3.0.10 '@types/ws': - specifier: ^8.5.10 - version: 8.5.10 + specifier: ^8.5.11 + version: 8.5.11 '@unocss/reset': - specifier: ^0.61.0 - version: 0.61.0 + specifier: ^0.61.3 + version: 0.61.3 '@vitejs/plugin-vue': specifier: ^5.0.5 - version: 5.0.5(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(vue@3.4.31(typescript@5.5.2)) + version: 5.0.5(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(vue@3.4.31(typescript@5.5.3)) '@vitest/runner': specifier: workspace:* version: link:../runner @@ -753,7 +750,7 @@ importers: version: 2.4.6 '@vueuse/core': specifier: ^10.11.0 - version: 10.11.0(vue@3.4.31(typescript@5.5.2)) + version: 10.11.0(vue@3.4.31(typescript@5.5.3)) ansi-to-html: specifier: ^0.7.2 version: 0.7.2 @@ -771,34 +768,34 @@ importers: version: 3.0.10 floating-vue: specifier: ^5.2.2 - version: 5.2.2(vue@3.4.31(typescript@5.5.2)) + version: 5.2.2(vue@3.4.31(typescript@5.5.3)) splitpanes: specifier: ^3.1.5 version: 3.1.5 unocss: - specifier: ^0.61.0 - version: 0.61.0(postcss@8.4.39)(rollup@4.18.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + specifier: ^0.61.3 + version: 0.61.3(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) unplugin-auto-import: specifier: ^0.18.0 - version: 0.18.0(@vueuse/core@10.11.0(vue@3.4.31(typescript@5.5.2)))(rollup@4.18.0) + version: 0.18.0(@vueuse/core@10.11.0(vue@3.4.31(typescript@5.5.3)))(rollup@4.18.1) unplugin-vue-components: specifier: ^0.27.2 - version: 0.27.2(@babel/parser@7.24.7)(rollup@4.18.0)(vue@3.4.31(typescript@5.5.2)) + version: 0.27.2(@babel/parser@7.24.7)(rollup@4.18.1)(vue@3.4.31(typescript@5.5.3)) vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vite-plugin-pages: specifier: ^0.32.3 - version: 0.32.3(@vue/compiler-sfc@3.4.31)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(vue-router@4.4.0(vue@3.4.31(typescript@5.5.2))) + version: 0.32.3(@vue/compiler-sfc@3.4.31)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(vue-router@4.4.0(vue@3.4.31(typescript@5.5.3))) vue: specifier: ^3.4.31 - version: 3.4.31(typescript@5.5.2) + version: 3.4.31(typescript@5.5.3) vue-router: specifier: ^4.4.0 - version: 4.4.0(vue@3.4.31(typescript@5.5.2)) + version: 4.4.0(vue@3.4.31(typescript@5.5.3)) vue-virtual-scroller: specifier: 2.0.0-beta.8 - version: 2.0.0-beta.8(vue@3.4.31(typescript@5.5.2)) + version: 2.0.0-beta.8(vue@3.4.31(typescript@5.5.3)) packages/utils: dependencies: @@ -844,7 +841,7 @@ importers: version: 1.2.0 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) devDependencies: '@jridgewell/trace-mapping': specifier: ^0.3.25 @@ -911,13 +908,13 @@ importers: version: 1.2.0 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vite-node: specifier: workspace:* version: link:../vite-node why-is-node-running: - specifier: ^2.2.2 - version: 2.2.2 + specifier: ^2.3.0 + version: 2.3.0 devDependencies: '@antfu/install-pkg': specifier: 0.3.1 @@ -947,8 +944,8 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ^20.14.9 - version: 20.14.9 + specifier: ^20.14.10 + version: 20.14.10 '@types/prompts': specifier: ^2.4.9 version: 2.4.9 @@ -1013,8 +1010,8 @@ importers: specifier: ^2.1.0 version: 2.1.0 ws: - specifier: ^8.17.1 - version: 8.17.1 + specifier: ^8.18.0 + version: 8.18.0 packages/web-worker: dependencies: @@ -1044,8 +1041,8 @@ importers: specifier: ^3.3.1 version: 3.3.1 ws: - specifier: ^8.17.1 - version: 8.17.1 + specifier: ^8.18.0 + version: 8.18.0 devDependencies: '@vitest/runner': specifier: workspace:* @@ -1061,7 +1058,7 @@ importers: devDependencies: '@vitejs/plugin-basic-ssl': specifier: ^1.0.2 - version: 1.0.2(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + version: 1.0.2(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) '@vitest/browser': specifier: workspace:* version: link:../../packages/browser @@ -1085,7 +1082,7 @@ importers: version: link:../../packages/vitest webdriverio: specifier: ^8.32.2 - version: 8.32.2(typescript@5.5.2) + version: 8.32.2(typescript@5.5.3) test/cli: devDependencies: @@ -1097,7 +1094,7 @@ importers: version: 8.5.9 '@vitejs/plugin-basic-ssl': specifier: ^1.0.2 - version: 1.0.2(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + version: 1.0.2(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) '@vitest/runner': specifier: workspace:^ version: link:../../packages/runner @@ -1112,10 +1109,10 @@ importers: version: 8.0.1 unplugin-swc: specifier: ^1.4.4 - version: 1.4.4(@swc/core@1.4.1)(rollup@4.18.0) + version: 1.4.4(@swc/core@1.4.1)(rollup@4.18.1) vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -1130,7 +1127,7 @@ importers: version: 8.0.1 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest @@ -1166,7 +1163,7 @@ importers: version: link:../../packages/web-worker '@vueuse/integrations': specifier: ^10.9.0 - version: 10.9.0(axios@0.26.1(debug@4.3.4))(focus-trap@7.5.4)(vue@3.4.26(typescript@5.5.2)) + version: 10.9.0(axios@0.26.1(debug@4.3.4))(focus-trap@7.5.4)(vue@3.4.26(typescript@5.5.3)) axios: specifier: ^0.26.1 version: 0.26.1(debug@4.3.4) @@ -1191,6 +1188,9 @@ importers: url: specifier: ^0.11.0 version: 0.11.0 + vite-node: + specifier: workspace:* + version: link:../../packages/vite-node vitest: specifier: workspace:* version: link:../../packages/vitest @@ -1199,7 +1199,7 @@ importers: version: file:test/core/vitest-environment-custom vue: specifier: ^3.4.26 - version: 3.4.26(typescript@5.5.2) + version: 3.4.26(typescript@5.5.3) zustand: specifier: ^4.1.1 version: 4.1.1(react@18.2.0) @@ -1217,7 +1217,7 @@ importers: version: 3.0.3 '@vitejs/plugin-vue': specifier: latest - version: 5.0.5(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(vue@3.4.31(typescript@5.5.2)) + version: 5.0.5(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(vue@3.4.31(typescript@5.5.3)) '@vitest/browser': specifier: workspace:* version: link:../../packages/browser @@ -1247,19 +1247,19 @@ importers: version: 0.3.3 unplugin-swc: specifier: ^1.4.4 - version: 1.4.4(@swc/core@1.4.1)(rollup@4.18.0) + version: 1.4.4(@swc/core@1.4.1)(rollup@4.18.1) vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest vue: specifier: latest - version: 3.4.31(typescript@5.5.2) + version: 3.4.31(typescript@5.5.3) webdriverio: specifier: latest - version: 8.39.1(typescript@5.5.2) + version: 8.39.1(typescript@5.5.3) test/global-setup: devDependencies: @@ -1310,7 +1310,7 @@ importers: version: 7.0.1 vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vite-node: specifier: workspace:* version: link:../../packages/vite-node @@ -1371,13 +1371,13 @@ importers: version: link:../../packages/browser vite: specifier: ^5.3.3 - version: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + version: 5.3.3(@types/node@20.14.10)(terser@5.22.0) vitest: specifier: workspace:* version: link:../../packages/vitest webdriverio: specifier: latest - version: 8.39.1(typescript@5.5.2) + version: 8.39.1(typescript@5.5.3) test/workspaces: devDependencies: @@ -1491,8 +1491,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/eslint-config@2.21.2': - resolution: {integrity: sha512-qaKf+af5GeSNTvTzxtSmpitwLZWIwl/uURxQZhhoHCoA1PxofFHSpCNVYLSvPlj17lwT/DzWgovgL/08uXG9aQ==} + '@antfu/eslint-config@2.22.2': + resolution: {integrity: sha512-LKC61Rm1VC0CduV4XAZzzEQ1nmTd+H4Y1rVvNg47MgcaCVGftUpY50MD2us3QCC+ktt3AAQYT9Kmbr/nsFW73g==} hasBin: true peerDependencies: '@eslint-react/eslint-plugin': ^1.5.8 @@ -1546,8 +1546,8 @@ packages: '@antfu/install-pkg@0.3.3': resolution: {integrity: sha512-nHHsk3NXQ6xkCfiRRC8Nfrg8pU5kkr3P3Y9s9dKqiuRmBD0Yap7fymNDjGFKeWhZQHqqbCS5CfeMy9wtExM24w==} - '@antfu/ni@0.21.12': - resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==} + '@antfu/ni@0.22.0': + resolution: {integrity: sha512-qP2zFsmypfWpKnmQcjoqMfYrPRHbqcXnhaUrg3VGqPGFXyN9sKz2+/TvNKByWDqAfuVStE8Fy2ppuVdoWQDjkw==} hasBin: true '@antfu/utils@0.7.10': @@ -2339,6 +2339,10 @@ packages: resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==} engines: {node: '>=16'} + '@es-joy/jsdoccomment@0.46.0': + resolution: {integrity: sha512-C3Axuq1xd/9VqFZpW4YAzOx5O9q/LP46uIQy/iNDpHG3fmPa6TBtvfglMCs3RBiBxAIi0Go97r8+jvTt55XMyQ==} + engines: {node: '>=16'} + '@esbuild/aix-ppc64@0.19.11': resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} engines: {node: '>=12'} @@ -2351,8 +2355,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.22.0': - resolution: {integrity: sha512-uvQR2crZ/zgzSHDvdygHyNI+ze9zwS8mqz0YtGXotSqvEE0UkYE9s+FZKQNTt1VtT719mfP3vHrUdCpxBNQZhQ==} + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -2369,8 +2373,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.22.0': - resolution: {integrity: sha512-UKhPb3o2gAB/bfXcl58ZXTn1q2oVu1rEu/bKrCtmm+Nj5MKUbrOwR5WAixE2v+lk0amWuwPvhnPpBRLIGiq7ig==} + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -2387,8 +2391,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.22.0': - resolution: {integrity: sha512-PBnyP+r8vJE4ifxsWys9l+Mc2UY/yYZOpX82eoyGISXXb3dRr0M21v+s4fgRKWMFPMSf/iyowqPW/u7ScSUkjQ==} + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -2405,8 +2409,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.22.0': - resolution: {integrity: sha512-IjTYtvIrjhR41Ijy2dDPgYjQHWG/x/A4KXYbs1fiU3efpRdoxMChK3oEZV6GPzVEzJqxFgcuBaiX1kwEvWUxSw==} + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -2423,8 +2427,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.22.0': - resolution: {integrity: sha512-mqt+Go4y9wRvEz81bhKd9RpHsQR1LwU8Xm6jZRUV/xpM7cIQFbFH6wBCLPTNsdELBvfoHeumud7X78jQQJv2TA==} + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -2441,8 +2445,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.22.0': - resolution: {integrity: sha512-vTaTQ9OgYc3VTaWtOE5pSuDT6H3d/qSRFRfSBbnxFfzAvYoB3pqKXA0LEbi/oT8GUOEAutspfRMqPj2ezdFaMw==} + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -2459,8 +2463,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.22.0': - resolution: {integrity: sha512-0e1ZgoobJzaGnR4reD7I9rYZ7ttqdh1KPvJWnquUoDJhL0rYwdneeLailBzd2/4g/U5p4e5TIHEWa68NF2hFpQ==} + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -2477,8 +2481,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.22.0': - resolution: {integrity: sha512-BFgyYwlCwRWyPQJtkzqq2p6pJbiiWgp0P9PNf7a5FQ1itKY4czPuOMAlFVItirSmEpRPCeImuwePNScZS0pL5Q==} + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -2495,8 +2499,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.22.0': - resolution: {integrity: sha512-V/K2rctCUgC0PCXpN7AqT4hoazXKgIYugFGu/myk2+pfe6jTW2guz/TBwq4cZ7ESqusR/IzkcQaBkcjquuBWsw==} + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -2513,8 +2517,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.22.0': - resolution: {integrity: sha512-KEMWiA9aGuPUD4BH5yjlhElLgaRXe+Eri6gKBoDazoPBTo1BXc/e6IW5FcJO9DoL19FBeCxgONyh95hLDNepIg==} + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -2531,8 +2535,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.22.0': - resolution: {integrity: sha512-r2ZZqkOMOrpUhzNwxI7uLAHIDwkfeqmTnrv1cjpL/rjllPWszgqmprd/om9oviKXUBpMqHbXmppvjAYgISb26Q==} + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -2549,8 +2553,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.22.0': - resolution: {integrity: sha512-qaowLrV/YOMAL2RfKQ4C/VaDzAuLDuylM2sd/LH+4OFirMl6CuDpRlCq4u49ZBaVV8pkI/Y+hTdiibvQRhojCA==} + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -2567,8 +2571,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.22.0': - resolution: {integrity: sha512-hgrezzjQTRxjkQ5k08J6rtZN5PNnkWx/Rz6Kmj9gnsdCAX1I4Dn4ZPqvFRkXo55Q3pnVQJBwbdtrTO7tMGtyVA==} + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -2585,8 +2589,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.22.0': - resolution: {integrity: sha512-ewxg6FLLUio883XgSjfULEmDl3VPv/TYNnRprVAS3QeGFLdCYdx1tIudBcd7n9jIdk82v1Ajov4jx87qW7h9+g==} + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -2603,8 +2607,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.22.0': - resolution: {integrity: sha512-Az5XbgSJC2lE8XK8pdcutsf9RgdafWdTpUK/+6uaDdfkviw/B4JCwAfh1qVeRWwOohwdsl4ywZrWBNWxwrPLFg==} + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -2621,8 +2625,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.22.0': - resolution: {integrity: sha512-8j4a2ChT9+V34NNNY9c/gMldutaJFmfMacTPq4KfNKwv2fitBCLYjee7c+Vxaha2nUhPK7cXcZpJtJ3+Y7ZdVQ==} + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -2639,8 +2643,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.22.0': - resolution: {integrity: sha512-JUQyOnpbAkkRFOk/AhsEemz5TfWN4FJZxVObUlnlNCbe7QBl61ZNfM4cwBXayQA6laMJMUcqLHaYQHAB6YQ95Q==} + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -2657,14 +2661,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.22.0': - resolution: {integrity: sha512-11PoCoHXo4HFNbLsXuMB6bpMPWGDiw7xETji6COdJss4SQZLvcgNoeSqWtATRm10Jj1uEHiaIk4N0PiN6x4Fcg==} + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.22.0': - resolution: {integrity: sha512-Ezlhu/YyITmXwKSB+Zu/QqD7cxrjrpiw85cc0Rbd3AWr2wsgp+dWbWOE8MqHaLW9NKMZvuL0DhbJbvzR7F6Zvg==} + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -2681,8 +2685,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.22.0': - resolution: {integrity: sha512-ufjdW5tFJGUjlH9j/5cCE9lrwRffyZh+T4vYvoDKoYsC6IXbwaFeV/ENxeNXcxotF0P8CDzoICXVSbJaGBhkrw==} + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -2699,8 +2703,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.22.0': - resolution: {integrity: sha512-zY6ly/AoSmKnmNTowDJsK5ehra153/5ZhqxNLfq9NRsTTltetr+yHHcQ4RW7QDqw4JC8A1uC1YmeSfK9NRcK1w==} + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -2717,8 +2721,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.22.0': - resolution: {integrity: sha512-Kml5F7tv/1Maam0pbbCrvkk9vj046dPej30kFzlhXnhuCtYYBP6FGy/cLbc5yUT1lkZznGLf2OvuvmLjscO5rw==} + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2735,8 +2739,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.22.0': - resolution: {integrity: sha512-IOgwn+mYTM3RrcydP4Og5IpXh+ftN8oF+HELTXSmbWBlujuci4Qa3DTeO+LEErceisI7KUSfEIiX+WOUlpELkw==} + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2753,8 +2757,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.22.0': - resolution: {integrity: sha512-4bDHJrk2WHBXJPhy1y80X7/5b5iZTZP3LGcKIlAP1J+KqZ4zQAPMLEzftGyjjfcKbA4JDlPt/+2R/F1ZTeRgrw==} + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2769,6 +2773,10 @@ packages: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.17.0': resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2777,8 +2785,8 @@ packages: resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.6.0': - resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} + '@eslint/js@9.7.0': + resolution: {integrity: sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': @@ -2827,8 +2835,8 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@2.1.24': - resolution: {integrity: sha512-H8r2KpL5uKyrkb3z9/3HD/22JcxqW3BJyjEWZhX2T7DehnYVZthEap1cNsEl/UtCDC3TlpNmwiPX8wg3y8E4dg==} + '@iconify/utils@2.1.25': + resolution: {integrity: sha512-Y+iGko8uv/Fz5bQLLJyNSZGOdMW0G7cnlEX1CiNcKsRXX9cq/y/vwxrIAtLCZhKHr3m0VJmsjVPsvnM4uX8YLg==} '@inquirer/confirm@3.1.9': resolution: {integrity: sha512-UF09aejxCi4Xqm6N/jJAiFXArXfi9al52AFaSD+2uIHnhZGtd1d6lIGTRMPouVSJxbGEi+HkOWSYaiEY/+szUw==} @@ -2947,8 +2955,8 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.45.0': - resolution: {integrity: sha512-TVYsfMlGAaxeUllNkywbwek67Ncf8FRGn8ZlRdO291OL3NjG9oMbfVhyP82HQF0CZLMrYsvesqoUekxdWuF9Qw==} + '@playwright/test@1.45.1': + resolution: {integrity: sha512-Wo1bWTzQvGA7LyKGIZc8nFSTFf2TkthGIFBR+QVNilvwouGzFd4PYukZe3rvf5PSqjHi1+1NyKSDZKcQWETzaA==} engines: {node: '>=18'} hasBin: true @@ -3008,7 +3016,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 '@types/babel__core': ^7.1.9 - rollup: ^4.18.0 + rollup: ^4.18.1 peerDependenciesMeta: '@types/babel__core': optional: true @@ -3017,7 +3025,7 @@ packages: resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 peerDependenciesMeta: rollup: optional: true @@ -3026,7 +3034,7 @@ packages: resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 peerDependenciesMeta: rollup: optional: true @@ -3035,7 +3043,7 @@ packages: resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 peerDependenciesMeta: rollup: optional: true @@ -3043,13 +3051,13 @@ packages: '@rollup/plugin-replace@2.4.2': resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 '@rollup/plugin-terser@0.4.4': resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 peerDependenciesMeta: rollup: optional: true @@ -3058,7 +3066,7 @@ packages: resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} engines: {node: '>= 8.0.0'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 '@rollup/pluginutils@4.2.1': resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -3068,7 +3076,7 @@ packages: resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 peerDependenciesMeta: rollup: optional: true @@ -3077,105 +3085,105 @@ packages: resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 peerDependenciesMeta: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + '@rollup/rollup-android-arm-eabi@4.18.1': + resolution: {integrity: sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + '@rollup/rollup-android-arm64@4.18.1': + resolution: {integrity: sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + '@rollup/rollup-darwin-arm64@4.18.1': + resolution: {integrity: sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + '@rollup/rollup-darwin-x64@4.18.1': + resolution: {integrity: sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + '@rollup/rollup-linux-arm-gnueabihf@4.18.1': + resolution: {integrity: sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + '@rollup/rollup-linux-arm-musleabihf@4.18.1': + resolution: {integrity: sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + '@rollup/rollup-linux-arm64-gnu@4.18.1': + resolution: {integrity: sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + '@rollup/rollup-linux-arm64-musl@4.18.1': + resolution: {integrity: sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': + resolution: {integrity: sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + '@rollup/rollup-linux-riscv64-gnu@4.18.1': + resolution: {integrity: sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + '@rollup/rollup-linux-s390x-gnu@4.18.1': + resolution: {integrity: sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + '@rollup/rollup-linux-x64-gnu@4.18.1': + resolution: {integrity: sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + '@rollup/rollup-linux-x64-musl@4.18.1': + resolution: {integrity: sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + '@rollup/rollup-win32-arm64-msvc@4.18.1': + resolution: {integrity: sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + '@rollup/rollup-win32-ia32-msvc@4.18.1': + resolution: {integrity: sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + '@rollup/rollup-win32-x64-msvc@4.18.1': + resolution: {integrity: sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==} cpu: [x64] os: [win32] - '@shikijs/core@1.10.0': - resolution: {integrity: sha512-BZcr6FCmPfP6TXaekvujZcnkFmJHZ/Yglu97r/9VjzVndQA56/F4WjUKtJRQUnK59Wi7p/UTAOekMfCJv7jnYg==} + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@shikijs/core@1.6.4': - resolution: {integrity: sha512-WTU9rzZae1p2v6LOxMf6LhtmZOkIHYYW160IuahUyJy7YXPPjyWZLR1ag+SgD22ZMxZtz1gfU6Tccc8t0Il/XA==} + '@shikijs/core@1.10.3': + resolution: {integrity: sha512-D45PMaBaeDHxww+EkcDQtDAtzv00Gcsp72ukBtaLSmqRvh0WgGMq3Al0rl1QQBZfuneO75NXMIzEZGFitThWbg==} - '@shikijs/transformers@1.6.4': - resolution: {integrity: sha512-NqDt7gUg3ayVBnsipT/KoL1pqsVbsvT/2cB0pb5SG2q72qjAv9Lb5OP99pL//BMmI+sMTo+TeARntklyBu4mZQ==} + '@shikijs/transformers@1.10.3': + resolution: {integrity: sha512-MNjsyye2WHVdxfZUSr5frS97sLGe6G1T+1P41QjyBFJehZphMcr4aBlRLmq6OSPBslYe9byQPVvt/LJCOfxw8Q==} - '@shikijs/twoslash@1.10.0': - resolution: {integrity: sha512-LMvsYyFs73Saf0VsxrScXQZkV2UszxnYa4gGJbK0Ct8NH6YpQDg+FROsNsbqKk+SsKsbbydZP0W8ojKuvq69pA==} + '@shikijs/twoslash@1.10.3': + resolution: {integrity: sha512-9HlQgvy51jnO46Tcr87A7v6gxlzdKzcpYk15/CQfO48svAslOf+6QYXf0Gao3HWPywOwVj2alMAe0zQhT59y9w==} - '@shikijs/vitepress-twoslash@1.10.0': - resolution: {integrity: sha512-Qvua0BIb5uSDryLBkSRx8EX7cNwvTa2GDq53Yh7NbqhwFlYPVp3pnBaRtiDiyYl3Ng+rR2UAakMFiF4PTdnMFg==} + '@shikijs/vitepress-twoslash@1.10.3': + resolution: {integrity: sha512-rTfayHA8J4B0z9J9XspwQRg40m0xYLzBgNRhjBWGVGgfymh3OdM0CpEsqwGEFxGgRmDRYCEpf3jqdBejWMekgQ==} '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -3202,31 +3210,31 @@ packages: '@solidjs/router': '>=0.6.0' solid-js: '>=1.0.0' - '@stylistic/eslint-plugin-js@2.3.0': - resolution: {integrity: sha512-lQwoiYb0Fs6Yc5QS3uT8+T9CPKK2Eoxc3H8EnYJgM26v/DgtW+1lvy2WNgyBflU+ThShZaHm3a6CdD9QeKx23w==} + '@stylistic/eslint-plugin-js@2.6.0-beta.0': + resolution: {integrity: sha512-KQiNvzNzvl9AmMs1MiIBszLIy/Xy1bTExnyaVy5dSzOF9c+yT64JQfH0p0jP6XpGwoCnZsrPUNflwP30G42QBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' - '@stylistic/eslint-plugin-jsx@2.3.0': - resolution: {integrity: sha512-tsQ0IEKB195H6X9A4iUSgLLLKBc8gUBWkBIU8tp1/3g2l8stu+PtMQVV/VmK1+3bem5FJCyvfcZIQ/WF1fsizA==} + '@stylistic/eslint-plugin-jsx@2.6.0-beta.0': + resolution: {integrity: sha512-TOimEpr3vndXHRhuQ5gMqmJv1SBlFI3poIJzyeNMmXi3NWVHoPxfd4QAJHGNJe5G3EO2NAXGf2H7nl8gY5QaZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' - '@stylistic/eslint-plugin-plus@2.3.0': - resolution: {integrity: sha512-xboPWGUU5yaPlR+WR57GwXEuY4PSlPqA0C3IdNA/+1o2MuBi95XgDJcZiJ9N+aXsqBXAPIpFFb+WQ7QEHo4f7g==} + '@stylistic/eslint-plugin-plus@2.6.0-beta.0': + resolution: {integrity: sha512-Wp+e4sTbFq0Uk5ncU3PETYfg1IcCZ1KycdlqFYXIA7/bgcieeShXouXUcA+S/S5+gWLXGuVJ12IxNzY8yfe4IA==} peerDependencies: eslint: '*' - '@stylistic/eslint-plugin-ts@2.3.0': - resolution: {integrity: sha512-wqOR38/uz/0XPnHX68ftp8sNMSAqnYGjovOTN7w00xnjS6Lxr3Sk7q6AaxWWqbMvOj7V2fQiMC5HWAbTruJsCg==} + '@stylistic/eslint-plugin-ts@2.6.0-beta.0': + resolution: {integrity: sha512-WMz1zgmMC3bvg1L/tiYt5ygvDbTDKlbezoHoX2lV9MnUCAEQZUP4xJ9Wj3jmIKxb4mUuK5+vFZJVcOygvbbqow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' - '@stylistic/eslint-plugin@2.3.0': - resolution: {integrity: sha512-rtiz6u5gRyyEZp36FcF1/gHJbsbT3qAgXZ1qkad6Nr/xJ9wrSJkiSFFQhpYVTIZ7FJNRJurEcumZDCwN9dEI4g==} + '@stylistic/eslint-plugin@2.6.0-beta.0': + resolution: {integrity: sha512-1NJy1iIDSFC4gelDJ82VMTq9J32tNvQ9k1lnxOsipZ0YQB826U5zGLiH37QAM8dRfNY6yeYhjlrUVtZUxFR19w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.40.0' @@ -3345,6 +3353,10 @@ packages: resolution: {integrity: sha512-CytIvb6tVOADRngTHGWNxH8LPgO/3hi/BdCEHOf7Qd2GvZVClhVP0Wo/QHzWhpki49Bk0b4VT6xpt3fx8HTSIw==} engines: {node: '>=18'} + '@testing-library/dom@10.3.1': + resolution: {integrity: sha512-q/WL+vlXMpC0uXDyfsMtc1rmotzLV8Y0gq6q1gfrrDjQeHoeLrqHbxdPvPNAh1i+xuJl7+BezywcXArz7vLqKQ==} + engines: {node: '>=18'} + '@testing-library/dom@8.19.0': resolution: {integrity: sha512-6YWYPPpxG3e/xOo6HIWwB/58HukkwIVTOaZ0VwdMVjhRUX/01E4FtQbck9GazOOj7MXHc5RBzMrU86iBJHbI+A==} engines: {node: '>=12'} @@ -3573,11 +3585,8 @@ packages: '@types/node@20.11.5': resolution: {integrity: sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==} - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} - - '@types/node@20.14.9': - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + '@types/node@20.14.10': + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} '@types/normalize-package-data@2.4.1': resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3645,8 +3654,8 @@ packages: '@types/wrap-ansi@3.0.0': resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@types/ws@8.5.11': + resolution: {integrity: sha512-4+q7P5h3SpJxaBft0Dzpbr6lmMaqh0Jr2tbhJZ/luAwvD7ohSCniYkwz/pLxuT2h0EOa6QADgJj1Ko+TzRfZ+w==} '@types/ws@8.5.9': resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} @@ -3660,55 +3669,62 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@7.14.1': - resolution: {integrity: sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.0.0-alpha.40': + resolution: {integrity: sha512-yku4NjpP0UujYq8d1GWXYELpKYwuoESSgvXPd9uAiO24OszGxQhPsGWTe4fmZV05J47qILfaGANO9SCa9fEU0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/parser@7.14.1': - resolution: {integrity: sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.0.0-alpha.40': + resolution: {integrity: sha512-cjIgiaxmGtjlA6rRSs0Gsh0mWR08kPv1W+HsrZcuFwWxoGavBZPKtNctXND0NVf6MgSKyIcd4AHqBwE0htp5uw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/scope-manager@7.13.0': - resolution: {integrity: sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@7.14.1': resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.14.1': - resolution: {integrity: sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.0.0-alpha.40': + resolution: {integrity: sha512-KQL502sCGZW+dYvxIzF6rEozbgppN0mBkYV6kT8ciY5OtFIRlLDTP7NdVAMMDk7q35T7Ad8negaQ9AGpZ8+Y5w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/scope-manager@8.0.0-alpha.44': + resolution: {integrity: sha512-0w0pDILwfwRXSz9lQBXnJmeGaIbSBgl4vAw/lB2kCnOKYl2SXCVbdNOHPwxWigvQ08QVpuaKy+wEjbFKr9Xwfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.0.0-alpha.40': + resolution: {integrity: sha512-/Aynkgxy3x22i6Zxy73MR/r0y1OELOMC9Atn7MO97NsjBOrQQYJHi/UEklZ423aB8SCkYH34lO6EAzXX/lIN3g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/types@7.13.0': - resolution: {integrity: sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@7.14.1': resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.13.0': - resolution: {integrity: sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==} + '@typescript-eslint/types@8.0.0-alpha.40': + resolution: {integrity: sha512-44mUq4VZVydxNlOM8Xtp/BXDkyfuvvjgPIBf7vRQDutrLDeNS0pJ9pcSloSbop5MwKLfJjBU+PbwnJPQM+DWNg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.0.0-alpha.44': + resolution: {integrity: sha512-FNBBUTJBNbIaTJhhBbSNxKv+qS8lrwwnpBg36APp5fhDRu8K/YFQZP/VEa19nKBz+8+QUK7R6wV9DHYjj56S7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@7.14.1': + resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -3716,20 +3732,23 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.14.1': - resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.0.0-alpha.40': + resolution: {integrity: sha512-bz1rX5GXvGdx686FghDxPqGwgntlseZCQSRrVGDDOZlLSoWJnbfkzxXGOWch9c3ttcGkdFy/DiCyKKga3hrq0g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@7.13.0': - resolution: {integrity: sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@8.0.0-alpha.44': + resolution: {integrity: sha512-IyLELYPMFaleWpEVrcYhSfgFXFx4/505P4/vi9Dfp6s6T2xapyAdti6WL9iZbnXk72SL5M0wMp3V73nHn8ce1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@typescript-eslint/utils@7.14.1': resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} @@ -3737,103 +3756,119 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.13.0': - resolution: {integrity: sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/utils@8.0.0-alpha.40': + resolution: {integrity: sha512-ijxO1Hs3YWveuWK+Vbt25D05Q41UeK08JwEJbWTzV38LmkdCBktQd7X1sTw4W9Qku692HWuHgesZf6OhC8t3aA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/utils@8.0.0-alpha.44': + resolution: {integrity: sha512-gOSA4Yo1jufcOuV68yX3hzpwzufd/Ru6KYL04od1T1c5tt6cvN3i5D5Tc3BBJ3xYFE7ge821mJbUJMTc+BMaWg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 '@typescript-eslint/visitor-keys@7.14.1': resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.0.0-alpha.40': + resolution: {integrity: sha512-y1stojSPb5D3M8VlGGpaiBU5XxGLe+sPuW0YbLe09Lxvo4AwKGvhAr5lhqJZo4z6qHNz385+6+BS63+qIQdYLw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.0.0-alpha.44': + resolution: {integrity: sha512-geWzLM8S6vYGdhA01mWJyGh2V/7VRzAmsD6ZKuc/rLkeJhYjvkMY0g0uMDw/7wmNLeRrpjHnL8HJklrpAlrb9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/vfs@1.5.0': resolution: {integrity: sha512-AJS307bPgbsZZ9ggCT3wwpg3VbTKMFNHfaY/uF0ahSkYYrPF2dSSKDNIDIQAHm9qJqbLvCsSJH7yN4Vs/CsMMg==} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@unocss/astro@0.61.0': - resolution: {integrity: sha512-cbgztX/to5rMhAtEGCcR3ClMlK9F+lPxq21A72qsbWVQjiKa7W4O7qKBmUKPYsWRzJEJtdyN11A65H2037aKQw==} + '@unocss/astro@0.61.3': + resolution: {integrity: sha512-VTgO+nm7PW7/VJt1kf1/4qTqMp4X4CdNG1XjYRGmCTONW+yHhFUEC1NAXt7t2wKEvCYSf5ObmjYowr2qM+GafQ==} peerDependencies: vite: ^5.3.3 peerDependenciesMeta: vite: optional: true - '@unocss/cli@0.61.0': - resolution: {integrity: sha512-NuwBFHpnI40PBu84/3c9JpyO02TBNoRPzZ+kJ0hmFa+dv8Ro7Sb1AMlLJ5t3ZjELhsh0zXQf6ucS9mpqu+785g==} + '@unocss/cli@0.61.3': + resolution: {integrity: sha512-yj4whI4PwwK9cZXVrtl10AkZlyl9+569xYX+g89cBxqG2wpnbfBvug/hsvw3DyPG6i2MxKAv3Z78uruKnzCIjw==} engines: {node: '>=14'} hasBin: true - '@unocss/config@0.61.0': - resolution: {integrity: sha512-k8uV4n8eMti4S6BFeAkc9QBXJefDIlPyOWrdKykUMOHLIWVAIS53JixW9FJNgJRw0RVI6B7UR+rOznWwKpORPA==} + '@unocss/config@0.61.3': + resolution: {integrity: sha512-ZSSj5ST8XhiKoi2hLtVcyS8YJxn+Ug/WfasQ2wwOArcYfVFzZUoOQKbLo85hFuI7NV5Fh/aQREoVaJQI111jDA==} engines: {node: '>=14'} - '@unocss/core@0.61.0': - resolution: {integrity: sha512-Y/Ly3LPIAzOBlWCdKBVzVzIaaWDsf+oWPIUZlaW7DL++WWypVBCghmxXIT5dyuMGXE560Hj92st4AkXfuVdxGQ==} + '@unocss/core@0.61.3': + resolution: {integrity: sha512-9vixY1i5E0DQFtHJz/pHyFlFsiXJgL1bKHuocbl+GUi09lY/gE9TRm2qr2JOJx/BF720tMv9VxYI8Zq3EyPOXA==} - '@unocss/extractor-arbitrary-variants@0.61.0': - resolution: {integrity: sha512-9ru/UR4kZ1+jGXpMawV9T8kpL54FrJBmWKMuFlDTEDIwtzDyyfLbt/buoXdzKDLmil9hOXH3IH8+dah/OiiDoA==} + '@unocss/extractor-arbitrary-variants@0.61.3': + resolution: {integrity: sha512-8yFAavi4PXTZTyJqsSQJuZNdaERMyLP4Gs4IzBDt8zjmUrXmYfgV+bKif2eE52QKvtb5/Jsij3fgfMsJouln7A==} - '@unocss/inspector@0.61.0': - resolution: {integrity: sha512-gpL2RNw6Cp145kTxWN0BG/tWd4x3LVbgkZfyUlh5IAZHWKAq9MWA0jIifV2RU94h4rbSBNHxz50bodYtkzeM8A==} + '@unocss/inspector@0.61.3': + resolution: {integrity: sha512-F2WfVYdzM+CnocVSptBh945G85+RcxGd0KDm6q+Ctjs5NrHtT0TzX83USMLSjfFzTz/j+Q/kR1WOJWjKynVTXQ==} - '@unocss/postcss@0.61.0': - resolution: {integrity: sha512-0ZHUeLYu057xL1vXg2coV62ly6zaCgYdA/oHKCMaU9KT0TI49+DE73GouHypRNM5YXfuUPfXhPGGUuFWkAbI1A==} + '@unocss/postcss@0.61.3': + resolution: {integrity: sha512-i76kuYbrvqkVhdfD37mnVqiBJiq9azGzbKZHFIjFWApOxFLak1OTHX5TIwxPspFm8u7U7kmU03JCnqyxWIE0wQ==} engines: {node: '>=14'} peerDependencies: postcss: ^8.4.21 - '@unocss/preset-attributify@0.61.0': - resolution: {integrity: sha512-E0oIfYAnnm8piSU7cbAnLIKKz0TwlHMOfAcg0Z0jv2N/MatCpq0BCJZHeE0fEw53OUc+oa6Dpd509rOEUXp/tA==} + '@unocss/preset-attributify@0.61.3': + resolution: {integrity: sha512-TSgje5WDfoicTOoh/Od6qlizkZd68vXTdtT7jYEvjCm2mV7EgDJpX+sj2eVv0rPuaARtIqs1b4yG7w3HA6BBnQ==} - '@unocss/preset-icons@0.61.0': - resolution: {integrity: sha512-xI7isKu1fQbyGee1lcJBLwvUlmubYbPN4ymepUamfprNPlWrzb5Gj2+SROERlzzrTaI8C0YdBxsYMGyOV94dXQ==} + '@unocss/preset-icons@0.61.3': + resolution: {integrity: sha512-XNti2mgfbRCClzKxy7eMPukgk/mepyGGJNqtONnZmOkzkyhx6KQ2/luhMYnz5xONMG/aseoXMc4Zc1VzOqePRA==} - '@unocss/preset-mini@0.61.0': - resolution: {integrity: sha512-P+DdMtPtzAQ2aQ1/WWPoO3X/qvky+Fqq4eKXIvbqXOQ9c2oem7/dnsPeT08zzLIqxVJnuykymPwRT85EumS0gg==} + '@unocss/preset-mini@0.61.3': + resolution: {integrity: sha512-QY9P7jcLePkmCGQSqX+ha4Rh2YhY9b9P8gtLFnjzqcdmSxvDFkT7Kf5Un/u/jwV+zCz/5t4F88vWLzBM6js6yQ==} - '@unocss/preset-tagify@0.61.0': - resolution: {integrity: sha512-Q3709A8/4fFZdQ4vfKfgDSugQYd21BoSO+TomJp/QMi9iyPjGsrERQilciMmkuRyAe8Q1rdLh+6ioGiJEU0XHQ==} + '@unocss/preset-tagify@0.61.3': + resolution: {integrity: sha512-ir+gZJ20hZKapsrxWRTjFjyVJmmUcnkvhk1AiMgoG62MP6GzBQgbkAiy2TzJIEU0zQb8pYhtZ5KePtno+1vcaQ==} - '@unocss/preset-typography@0.61.0': - resolution: {integrity: sha512-chT2KvgeKsXoDFSedfP0BjhFLYgcDUBJCX0omJOXVVz9q7vB898abhZ5zA9Rcpmbkby4ovtbIjc2RqG9uIKLaQ==} + '@unocss/preset-typography@0.61.3': + resolution: {integrity: sha512-0b1JSk5/oi4DT86dO2sdscZlih4fVo//U6bh1cROAfLlYJsHlAEZau8IxLADcgBAYwCGtY94npfp6y60R37T/A==} - '@unocss/preset-uno@0.61.0': - resolution: {integrity: sha512-mkKOra3dQEc3uI7aPIqa3t8MJXlmpLSgGaPfEJK52xkFe991ex6CiUunYMMWbh6ZSzmdxkO31IwQIH9lcmj/Uw==} + '@unocss/preset-uno@0.61.3': + resolution: {integrity: sha512-ULP0hLBTNJuB0iQqaYaJZYbC4jwQYy0C6H7un3o4R+KsqIuyDanme2VsY51U5mN/pp7K6QJK6qE8EHVvtjCLHQ==} - '@unocss/preset-web-fonts@0.61.0': - resolution: {integrity: sha512-9bYvk2BSryLgguZ5qTDPVEhgD/olZiTAy/7JqHzrKKTh7xPURO1IcG2vbX354unfhTDR6GZIKiAkk64qJZUDPw==} + '@unocss/preset-web-fonts@0.61.3': + resolution: {integrity: sha512-uBQKjIY+vUWCEqcgjEzdxok8svOmNNHDk1r+qh/Y5VLPWvPdA+Bb5iIwrxib3zzQvkT+au/utCeTGKGgIVhcXA==} - '@unocss/preset-wind@0.61.0': - resolution: {integrity: sha512-PooyLVAF4wH9KvW4OKfDxYFuM4qmnlU+Ci6O6RGgVsKyQMq76crRqqK76lbnehg7jOoZJVxmWfQ6k5gT3aQeXQ==} + '@unocss/preset-wind@0.61.3': + resolution: {integrity: sha512-THdTNAYEtvLz/jhHNgkpLFxC+LNn4W2VqDmpmK/fVMgSlhOYJ8IoQlt8nwgBRbNkEksvgItq8gL/t5+2sHGHhA==} - '@unocss/reset@0.61.0': - resolution: {integrity: sha512-VqemtmzH8Rgu5yNomtv50gIcy4KZ2x1aP+7WZCds9x5ZdTSEjbfCOgUDI9rDrrGSipJkCmJ1yOhUPMC7ND6Hfw==} + '@unocss/reset@0.61.3': + resolution: {integrity: sha512-WegQ6Plmr/H0D9wuKCVjhUMzi/xAn55A0mJgUnKl1pJHTZetRdK29u0bnpVQzynmlh/Lh4YtD+X4r8DVkASgPw==} - '@unocss/rule-utils@0.61.0': - resolution: {integrity: sha512-MCdmfhE6Q9HSWjWqi2sx5/nnKyOEhfhoo+pVumHIqkHQICQ/LuKioFf7Y7e5ycqjFE/7dC2hKGZJ8WTMGIOMwA==} + '@unocss/rule-utils@0.61.3': + resolution: {integrity: sha512-XwzXE6YUAEc1+4TvJruZfntIM7eo+HdQDMlMI289w9YLLAXw973fp00E9U1dR16JRt1BWzlCnnY1RHAqSiXCVw==} engines: {node: '>=14'} - '@unocss/scope@0.61.0': - resolution: {integrity: sha512-uDk84LX2meZHskSvy0Mad7jgF0Be6el16F9DKYYvxlUxlzu/mCj6PQpQrXi8uZ2+O3akneHFqAbO6ewYShKdQA==} + '@unocss/scope@0.61.3': + resolution: {integrity: sha512-yElJs2uUiBHyTHKLqWZRK5zvY+7XIqoFXc1Fkv+fxiGy1+4u+zLGoGA66bUWwbjDFLiFgEqwUBJ2+SzDC4Q0Ig==} - '@unocss/transformer-attributify-jsx-babel@0.61.0': - resolution: {integrity: sha512-D9z28MQM4w8oowMZRiz7kxEVlor1/XUfaVBTujAS6Ks7Ly+0/91LuOLSHU9uC7vcKmMRI0Q2+Ww2hsVNf2z7ww==} + '@unocss/transformer-attributify-jsx-babel@0.61.3': + resolution: {integrity: sha512-Ubr2/XhB61C2EqrH0TnbJ9bGREvrORyotdRxpCCAzkBWh3i+J+kPrdGCFUgB+wHFcUPUuOKou+8o0rhWVY7mjw==} - '@unocss/transformer-attributify-jsx@0.61.0': - resolution: {integrity: sha512-mC0+O7KmxP5b0DlPyGVdu/3NM/33f9CgfXmwu+U+3NSsAfcCLjJ7nD1MOjl3vcFV5YpudTy1EVaqhcROQRSZIg==} + '@unocss/transformer-attributify-jsx@0.61.3': + resolution: {integrity: sha512-KK4pi7xsxjRKk/RSFxkdl1JODsefD1YMaqgs6HM2KCdXctqUXd6RYQez7IfQwxnAeZupgatwoFe2CZd0Bbhq2g==} - '@unocss/transformer-compile-class@0.61.0': - resolution: {integrity: sha512-iTQyWz+IbNZrQWCQaibHMY2+8+VoG4ZpizeyYKXHZe11/HaomSvorJwZdufEUTrdWmUzRhJgumGl1TW4FaJwpg==} + '@unocss/transformer-compile-class@0.61.3': + resolution: {integrity: sha512-qHxJtRo+yjC0d+IIoNrOxnO8j5bdw7R4XDpR8+MKpGZgVQRmEGwl7Ej0PUGTudVknYGUdPmDTZGr693bzhwzQg==} - '@unocss/transformer-directives@0.61.0': - resolution: {integrity: sha512-15nIynJPYFYnW/TUQu0NyZ5uxTDcrRyY8sB3axcYZOqqlu1hgPFotVukl6jqCZgGUR1AbfbnJwuDlcBQeT8xpA==} + '@unocss/transformer-directives@0.61.3': + resolution: {integrity: sha512-FNJCOlXwi62tVXr4B8lDkHGxOIhNJw2qQpM5jeohLT7xpGPOmVvscWaWI0h6fjSREFwnnbRNif4YPLe/rB6PsA==} - '@unocss/transformer-variant-group@0.61.0': - resolution: {integrity: sha512-5DHEram3iv+c9jPQW8p629aFyptyzdP5yNnRSMLBZcwyJ672VAKzPUZLYHh5UOUb69eaet3og1cU8uxpHhGKtQ==} + '@unocss/transformer-variant-group@0.61.3': + resolution: {integrity: sha512-F7v05kfVDhIJ4lu3fjgkwV2GWoeJX4aszER8iqhwWz+0jVUaJRYAxzsVqE299uJ0ut07d+Di+JB7M4ZBRoH3qw==} - '@unocss/vite@0.61.0': - resolution: {integrity: sha512-gjxLJrja1hqDwdd8z3QvzfMCcKppGqiL2+A6aHwG/AXfEmZMydA50U7VvJK7Wx8/Enm26G6JQrtGrpu+kK3QpQ==} + '@unocss/vite@0.61.3': + resolution: {integrity: sha512-Z2kq/hSv1RC3PYAaoXOGB0PEWXCVsgYtdnuFXR/8Tp0Yj2Wdeq906/s411/sqMUvXIaIhm2O9WaDfe0ISoV0sg==} peerDependencies: vite: ^5.3.3 @@ -3947,16 +3982,14 @@ packages: '@vue/devtools-api@6.5.1': resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==} - '@vue/devtools-api@7.2.1': - resolution: {integrity: sha512-6oNCtyFOrNdqm6GUkFujsCgFlpbsHLnZqq7edeM/+cxAbMyCWvsaCsIMUaz7AiluKLccCGEM8fhOsjaKgBvb7g==} + '@vue/devtools-api@7.3.6': + resolution: {integrity: sha512-z6cKyxdXrIGgA++eyGBfquj6dCplRdgjt+I18fJx8hjWTXDTIyeQvryyEBMchnfZVyvUTjK3QjGjDpLCnJxPjw==} - '@vue/devtools-kit@7.2.1': - resolution: {integrity: sha512-Wak/fin1X0Q8LLIfCAHBrdaaB+R6IdpSXsDByPHbQ3BmkCP0/cIo/oEGp9i0U2+gEqD4L3V9RDjNf1S34DTzQQ==} - peerDependencies: - vue: ^3.0.0 + '@vue/devtools-kit@7.3.6': + resolution: {integrity: sha512-5Ym9V3fkJenEoptqKoo+cgY5RTVwrSssFdzRsuyIgaeiskCT+rRJeQdwoo81tyrQ1mfS7Er1rYZlSzr3Y3L/ew==} - '@vue/devtools-shared@7.2.1': - resolution: {integrity: sha512-PCJF4UknJmOal68+X9XHyVeQ+idv0LFujkTOIW30+GaMJqwFVN9LkQKX4gLqn61KkGMdJTzQ1bt7EJag3TI6AA==} + '@vue/devtools-shared@7.3.6': + resolution: {integrity: sha512-R/FOmdJV+hhuwcNoxp6e87RRkEeDMVhWH+nOsnHUrwjjsyeXJ2W1475Ozmw+cbZhejWQzftkHVKO28Fuo1yqCw==} '@vue/language-core@1.8.20': resolution: {integrity: sha512-vNJaqjCTSrWEr+erSq6Rq0CqDC8MOAwyxirxwK8esOxd+1LmAUJUTG2p7I84Mj1Izy5uHiHQAkRTVR2QxMBY+A==} @@ -4005,12 +4038,6 @@ packages: '@vue/shared@3.4.26': resolution: {integrity: sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==} - '@vue/shared@3.4.27': - resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} - - '@vue/shared@3.4.29': - resolution: {integrity: sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==} - '@vue/shared@3.4.31': resolution: {integrity: sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==} @@ -4020,30 +4047,27 @@ packages: '@vue/typescript@1.8.20': resolution: {integrity: sha512-F0XX1wK71Fo9ewtzLSCSo5dfOuwKrSi/dR2AlI00iTJ4Bfk0wq1BNTRgnlvfx4kz/vQovaGXqwpIkif14W9KrA==} - '@vueuse/core@10.10.1': - resolution: {integrity: sha512-8Vr8wxILdK+qfBjbngav8LVI+6UuM2TQCufRKMPz/GrpLHQ6dbY6kL5PLa9Eobq8JRrMaDyArPX9Jj18fMTPew==} - '@vueuse/core@10.11.0': resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==} '@vueuse/core@10.9.0': resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} - '@vueuse/integrations@10.10.1': - resolution: {integrity: sha512-b4iPz4NLk2g5u9GNgTpYqNN1pzYWPpIglHTg6eDjJwKB7OfzJP4m5kQlzn2oRH7U0OlEOCVPrdDfqneuS9YNTg==} + '@vueuse/integrations@10.11.0': + resolution: {integrity: sha512-Pp6MtWEIr+NDOccWd8j59Kpjy5YDXogXI61Kb1JxvSfVBO8NzFQkmrKmSZz47i+ZqHnIzxaT38L358yDHTncZg==} peerDependencies: - async-validator: '*' - axios: '*' - change-case: '*' - drauu: '*' - focus-trap: '*' - fuse.js: '*' - idb-keyval: '*' - jwt-decode: '*' - nprogress: '*' - qrcode: '*' - sortablejs: '*' - universal-cookie: '*' + async-validator: ^4 + axios: ^1 + change-case: ^4 + drauu: ^0.3 + focus-trap: ^7 + fuse.js: ^6 + idb-keyval: ^6 + jwt-decode: ^3 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^6 peerDependenciesMeta: async-validator: optional: true @@ -4111,18 +4135,12 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@10.10.1': - resolution: {integrity: sha512-dpEL5afVLUqbchwGiLrV6spkl4/6UOKJ3YgxFE+wWLj/LakyIZUC83bfeFgbHkRcNhsAqTQCGR74jImsLfK8pg==} - '@vueuse/metadata@10.11.0': resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==} '@vueuse/metadata@10.9.0': resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} - '@vueuse/shared@10.10.1': - resolution: {integrity: sha512-edqexI+RQpoeqDxTatqBZa+K87ganbrwpoP++Fd9828U3js5jzwcEDeyrYcUgkKZ5LLL8q7M5SOMvSpMrxBPxg==} - '@vueuse/shared@10.11.0': resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==} @@ -4780,6 +4798,10 @@ packages: cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + core-js-compat@3.37.1: resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} @@ -5204,8 +5226,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.22.0: - resolution: {integrity: sha512-zNYA6bFZsVnsU481FnGAQjLDW0Pl/8BGG7EvAp15RzUvGC+ME7hf1q7LvIfStEQBz/iEHuBJCYcOwPmNCf1Tlw==} + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} engines: {node: '>=18'} hasBin: true @@ -5249,8 +5271,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-flat-gitignore@0.1.5: - resolution: {integrity: sha512-hEZLwuZjDBGDERA49c2q7vxc8sCGv8EdBp6PQYzGOMcHIgrfG9YOM6s/4jx24zhD+wnK9AI8mgN5RxSss5nClQ==} + eslint-config-flat-gitignore@0.1.7: + resolution: {integrity: sha512-K4UcPriNg6IvNozipPVnLRxuhxys9vRkxYoLLdMPgPDngtWEP/xBT946oUYQHUWLoz4jvX5k+AF/MWh3VN5Lrg==} eslint-flat-config-utils@0.2.5: resolution: {integrity: sha512-iO+yLZtC/LKgACerkpvsZ6NoRVB2sxT04mOpnNcEM1aTwKy+6TsT46PUvrML4y2uVBS6I67hRCd2JiKAPaL/Uw==} @@ -5263,8 +5285,8 @@ packages: peerDependencies: eslint: '*' - eslint-plugin-antfu@2.3.3: - resolution: {integrity: sha512-TAgYNuc20QyKw8NXtpzR3LeMTTv1qAJVKkjCVzjRSGiSR1EetEY7LRgQVhcgP/C1FnI87isQERAIkKvkYyLq0Q==} + eslint-plugin-antfu@2.3.4: + resolution: {integrity: sha512-5RIjJpBK1tuNHuLyFyZ90/iW9s439dP1u2cxA4dH70djx9sKq1CqI+O6Q95aVjgFNTDtQzSC9uYdAD5uEEKciQ==} peerDependencies: eslint: '*' @@ -5285,14 +5307,14 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import-x@0.5.2: - resolution: {integrity: sha512-6f1YMmg3PdLwfiJDYnCRPfh67zJKbwbOKL99l6xGZDmIFkMht/4xyudafGEcDOmDlgp36e41W4RXDfOn7+pGRg==} + eslint-plugin-import-x@3.0.1: + resolution: {integrity: sha512-jzQgJuE4ssxwNi0aMBkOL8whd4eHb0Z/uFWsk8uEoYB7xwTkAptSKojLzRswxgf/1bhH6QgcLjgabUBQqluBIg==} engines: {node: '>=16'} peerDependencies: eslint: ^8.56.0 || ^9.0.0-0 - eslint-plugin-jsdoc@48.5.0: - resolution: {integrity: sha512-ukXPNpGby3KjCveCizIS8t1EbuJEHYEu/tBg8GCbn/YbHcXwphyvYCdvRZ/oMRfTscGSSzfsWoZ+ZkAP0/6YMQ==} + eslint-plugin-jsdoc@48.7.0: + resolution: {integrity: sha512-5oiVf7Y+ZxGYQTlLq81X72n+S+hjvS/u0upAdbpPEeaIZILK3MKN8lm/6QqKioBjm/qZ0B5XpMQUtc2fUkqXAg==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -5303,8 +5325,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-plugin-markdown@5.0.0: - resolution: {integrity: sha512-kY2u9yDhzvfZ0kmRTsvgm3mTnvZgTSGIIPeHg3yesSx4R5CTCnITUjCPhzCD1MUhNcqHU5Tr6lzx+02EclVPbw==} + eslint-plugin-markdown@5.1.0: + resolution: {integrity: sha512-SJeyKko1K6GwI0AN6xeCDToXDkfKZfXcexA6B+O2Wr2btUS9GrC+YgwSyVli5DJnctUHjFXcQ2cqTaAmVoLi2A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8' @@ -5355,12 +5377,12 @@ packages: peerDependencies: eslint: '>=8.56.0' - eslint-plugin-unused-imports@3.2.0: - resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-plugin-unused-imports@4.0.0: + resolution: {integrity: sha512-mzM+y2B7XYpQryVa1usT+Y/BdNAtAZiXzwpSyDCboFoJN/LZRN67TNvQxKtuTK/Aplya3sLNQforiubzPPaIcQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/eslint-plugin': 6 - 7 - eslint: '8' + '@typescript-eslint/eslint-plugin': '8' + eslint: '9' peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true @@ -5378,8 +5400,8 @@ packages: vitest: optional: true - eslint-plugin-vue@9.26.0: - resolution: {integrity: sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==} + eslint-plugin-vue@9.27.0: + resolution: {integrity: sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -5404,8 +5426,8 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.0.1: - resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -5416,18 +5438,14 @@ packages: resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.6.0: - resolution: {integrity: sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==} + eslint@9.7.0: + resolution: {integrity: sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} - espree@10.0.1: - resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@10.1.0: resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5449,6 +5467,10 @@ packages: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -5849,8 +5871,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.7.0: - resolution: {integrity: sha512-ivatRXWwKC6ImcdKO7dOwXuXR5XFrdwo45qFwD7D0qOkEPzzJdLXC3BHceBdyrPOD3p1suPaWi4Y4NMm2D++AQ==} + globals@15.8.0: + resolution: {integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==} engines: {node: '>=18'} globalthis@1.0.3: @@ -6878,8 +6900,8 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minisearch@6.3.0: - resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} + minisearch@7.0.0: + resolution: {integrity: sha512-0OIJ3hUE+YBJNruDCqbTMFmk/IoB1CpZzuGfl11khFIel66ew9UoLF/+gfq3bdyrneqr3P7BTjFZApUbmk+9Dg==} minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -7183,8 +7205,8 @@ packages: resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} engines: {node: '>=14'} - parse-imports@2.1.0: - resolution: {integrity: sha512-JQWgmK2o4w8leUkZeZPatWdAny6vXGU/3siIUvMF6J2rDCud9aTt8h/px9oZJ6U3EcfhngBJ635uPFI0q0VAeA==} + parse-imports@2.1.1: + resolution: {integrity: sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==} engines: {node: '>= 18'} parse-json@5.2.0: @@ -7293,8 +7315,8 @@ packages: engines: {node: '>=16'} hasBin: true - playwright-core@1.45.0: - resolution: {integrity: sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ==} + playwright-core@1.45.1: + resolution: {integrity: sha512-LF4CUUtrUu2TCpDw4mcrAIuYrEjVDfT1cHbJMfwnE2+1b8PZcFzPNgvZCvq2JfQ4aTjRCCHw5EJ2tmr2NSzdPg==} engines: {node: '>=18'} hasBin: true @@ -7303,8 +7325,8 @@ packages: engines: {node: '>=16'} hasBin: true - playwright@1.45.0: - resolution: {integrity: sha512-4z3ac3plDfYzGB6r0Q3LF8POPR20Z8D0aXcxbJvmfMgSSq1hkcgvFRXJk9rUq5H/MJ0Ktal869hhOdI/zUTeLA==} + playwright@1.45.1: + resolution: {integrity: sha512-Hjrgae4kpSQBr98nhCj3IScxVeVUixqj+5oyif8TdIn2opTCPEzqAqNMeK42i3cWDCVu9MI+ZsGWw+gVR4ISBg==} engines: {node: '>=18'} hasBin: true @@ -7613,6 +7635,9 @@ packages: rfdc@1.3.1: resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rgb2hex@0.2.5: resolution: {integrity: sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==} @@ -7634,7 +7659,7 @@ packages: resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} engines: {node: '>=16'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 typescript: ^4.5 || ^5.0 rollup-plugin-esbuild@6.1.1: @@ -7642,16 +7667,16 @@ packages: engines: {node: '>=14.18.0'} peerDependencies: esbuild: '>=0.18.0' - rollup: ^4.18.0 + rollup: ^4.18.1 - rollup-plugin-license@3.5.1: - resolution: {integrity: sha512-z/UN/d5KbJhyvmmAg6no/2M2XK1QH8DUZyhbQeuaxe48hkIBTvvMlUP97g4txOzEC82HlZzb7dlWslc/rmBskg==} + rollup-plugin-license@3.5.2: + resolution: {integrity: sha512-NNeXBcE6RyQdZdSC8Vxe8Cheax2aUa/K0Ok6JDZwr9isjkSDer4aMg0sovas1Ua76ojLZX1BrNQ6ZFspztKkZQ==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^4.18.0 + rollup: ^4.18.1 - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + rollup@4.18.1: + resolution: {integrity: sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7801,11 +7826,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.10.0: - resolution: {integrity: sha512-YD2sXQ+TMD/F9BimV9Jn0wj35pqOvywvOG/3PB6hGHyGKlM7TJ9tyJ02jOb2kF8F0HfJwKNYrh3sW7jEcuRlXA==} - - shiki@1.6.4: - resolution: {integrity: sha512-X88chM7w8jnadoZtjPTi5ahCJx9pc9f8GfEkZAEYUTlcUZIEw2D/RY86HI/LkkE7Nj8TQWkiBfaFTJ3VJT6ESg==} + shiki@1.10.3: + resolution: {integrity: sha512-eneCLncGuvPdTutJuLyUGS8QNPAVFO5Trvld2wgEq1e002mwctAhJKeMGWtWVXOIEzmlcLRqcgPSorR6AVzOmQ==} side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} @@ -7953,6 +7975,9 @@ packages: splitpanes@3.1.5: resolution: {integrity: sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw==} + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stack-trace@1.0.0-pre2: resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} engines: {node: '>=16'} @@ -8071,6 +8096,10 @@ packages: engines: {node: '>=6.4.0 <13 || >=14'} deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net + superjson@2.2.1: + resolution: {integrity: sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==} + engines: {node: '>=16'} + supertest@6.3.4: resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} engines: {node: '>=6.4.0'} @@ -8302,8 +8331,8 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsx@4.16.0: - resolution: {integrity: sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ==} + tsx@4.16.2: + resolution: {integrity: sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -8401,8 +8430,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.5.2: - resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} engines: {node: '>=14.17'} hasBin: true @@ -8490,11 +8519,11 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - unocss@0.61.0: - resolution: {integrity: sha512-7642v5tHpEpHO9dl9sqYbKT/Ri4X4lmGHhj/znE4uheEfXcptPPiZ1/hVmQVciHUSI8CnQBqDwkZuxNPDG3bTQ==} + unocss@0.61.3: + resolution: {integrity: sha512-Mpci+yP9CUnDjSwm0EAq9U76cgiNB5UM0ztXfDjjMiSe+jOS6sZ2A+kZ5JY9ZBRx5TX0Wh4kQBoPQQ1ooxHicg==} engines: {node: '>=14'} peerDependencies: - '@unocss/webpack': 0.61.0 + '@unocss/webpack': 0.61.3 vite: ^5.3.3 peerDependenciesMeta: '@unocss/webpack': @@ -8698,8 +8727,8 @@ packages: vite: optional: true - vitepress@1.2.3: - resolution: {integrity: sha512-GvEsrEeNLiDE1+fuwDAYJCYLNZDAna+EtnXlPajhv/MYeTjbNK6Bvyg6NoTdO1sbwuQJ0vuJR99bOlH53bo6lg==} + vitepress@1.3.1: + resolution: {integrity: sha512-soZDpg2rRVJNIM/IYMNDPPr+zTHDA5RbLDHAxacRu+Q9iZ2GwSR0QSUlLs+aEZTkG0SOX1dc8RmUYwyuxK8dfQ==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 @@ -8831,15 +8860,6 @@ packages: devtools: optional: true - webdriverio@8.39.0: - resolution: {integrity: sha512-pDpGu0V+TL1LkXPode67m3s+IPto4TcmcOzMpzFgu2oeLMBornoLN3yQSFR1fjZd1gK4UfnG3lJ4poTGOfbWfw==} - engines: {node: ^16.13 || >=18} - peerDependencies: - devtools: ^8.14.0 - peerDependenciesMeta: - devtools: - optional: true - webdriverio@8.39.1: resolution: {integrity: sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ==} engines: {node: ^16.13 || >=18} @@ -8908,8 +8928,8 @@ packages: engines: {node: ^16.13.0 || >=18.0.0} hasBin: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} hasBin: true @@ -9013,6 +9033,18 @@ packages: utf-8-validate: optional: true + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -9038,11 +9070,6 @@ packages: resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==} engines: {node: ^14.17.0 || >=16.0.0} - yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} - hasBin: true - yaml@2.4.5: resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} engines: {node: '>= 14'} @@ -9097,8 +9124,8 @@ packages: zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - zx@8.1.3: - resolution: {integrity: sha512-fA44CRlggDOKeqt66aMwzLj1tb0zEQJmIjsSDXpmNjRRKaLFYkpeGE/zXnO05sJvSuzAlbVM50zexJJGMrIvuQ==} + zx@8.1.4: + resolution: {integrity: sha512-QFDYYpnzdpRiJ3dL2102Cw26FpXpWshW4QLTGxiYfIcwdAqg084jRCkK/kuP/NOSkxOjydRwNFG81qzA5r1a6w==} engines: {node: '>= 12.17.0'} hasBin: true @@ -9212,42 +9239,42 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@antfu/eslint-config@2.21.2(@vue/compiler-sfc@3.4.31)(eslint@9.6.0)(svelte@3.59.1)(typescript@5.5.2)(vitest@packages+vitest)': + '@antfu/eslint-config@2.22.2(@vue/compiler-sfc@3.4.31)(eslint@9.7.0)(svelte@3.59.1)(typescript@5.5.3)(vitest@packages+vitest)': dependencies: '@antfu/install-pkg': 0.3.3 '@clack/prompts': 0.7.0 - '@stylistic/eslint-plugin': 2.3.0(eslint@9.6.0)(typescript@5.5.2) - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2) - '@typescript-eslint/parser': 7.14.1(eslint@9.6.0)(typescript@5.5.2) - eslint: 9.6.0 - eslint-config-flat-gitignore: 0.1.5 + '@stylistic/eslint-plugin': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 + eslint-config-flat-gitignore: 0.1.7 eslint-flat-config-utils: 0.2.5 - eslint-merge-processors: 0.1.0(eslint@9.6.0) - eslint-plugin-antfu: 2.3.3(eslint@9.6.0) - eslint-plugin-command: 0.2.3(eslint@9.6.0) - eslint-plugin-eslint-comments: 3.2.0(eslint@9.6.0) - eslint-plugin-import-x: 0.5.2(eslint@9.6.0)(typescript@5.5.2) - eslint-plugin-jsdoc: 48.5.0(eslint@9.6.0) - eslint-plugin-jsonc: 2.16.0(eslint@9.6.0) - eslint-plugin-markdown: 5.0.0(eslint@9.6.0) - eslint-plugin-n: 17.9.0(eslint@9.6.0) + eslint-merge-processors: 0.1.0(eslint@9.7.0) + eslint-plugin-antfu: 2.3.4(eslint@9.7.0) + eslint-plugin-command: 0.2.3(eslint@9.7.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@9.7.0) + eslint-plugin-import-x: 3.0.1(eslint@9.7.0)(typescript@5.5.3) + eslint-plugin-jsdoc: 48.7.0(eslint@9.7.0) + eslint-plugin-jsonc: 2.16.0(eslint@9.7.0) + eslint-plugin-markdown: 5.1.0(eslint@9.7.0) + eslint-plugin-n: 17.9.0(eslint@9.7.0) eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-perfectionist: 2.11.0(eslint@9.6.0)(svelte@3.59.1)(typescript@5.5.2)(vue-eslint-parser@9.4.3(eslint@9.6.0)) - eslint-plugin-regexp: 2.6.0(eslint@9.6.0) - eslint-plugin-toml: 0.11.1(eslint@9.6.0) - eslint-plugin-unicorn: 54.0.0(eslint@9.6.0) - eslint-plugin-unused-imports: 3.2.0(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2)(vitest@packages+vitest) - eslint-plugin-vue: 9.26.0(eslint@9.6.0) - eslint-plugin-yml: 1.14.0(eslint@9.6.0) - eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.31)(eslint@9.6.0) - globals: 15.7.0 + eslint-plugin-perfectionist: 2.11.0(eslint@9.7.0)(svelte@3.59.1)(typescript@5.5.3)(vue-eslint-parser@9.4.3(eslint@9.7.0)) + eslint-plugin-regexp: 2.6.0(eslint@9.7.0) + eslint-plugin-toml: 0.11.1(eslint@9.7.0) + eslint-plugin-unicorn: 54.0.0(eslint@9.7.0) + eslint-plugin-unused-imports: 4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@packages+vitest) + eslint-plugin-vue: 9.27.0(eslint@9.7.0) + eslint-plugin-yml: 1.14.0(eslint@9.7.0) + eslint-processor-vue-blocks: 0.1.2(@vue/compiler-sfc@3.4.31)(eslint@9.7.0) + globals: 15.8.0 jsonc-eslint-parser: 2.4.0 local-pkg: 0.5.0 parse-gitignore: 2.0.0 picocolors: 1.0.1 toml-eslint-parser: 0.10.0 - vue-eslint-parser: 9.4.3(eslint@9.6.0) + vue-eslint-parser: 9.4.3(eslint@9.7.0) yaml-eslint-parser: 1.2.3 yargs: 17.7.2 transitivePeerDependencies: @@ -9270,7 +9297,7 @@ snapshots: dependencies: '@jsdevtools/ez-spawn': 3.0.4 - '@antfu/ni@0.21.12': {} + '@antfu/ni@0.22.0': {} '@antfu/utils@0.7.10': {} @@ -10408,18 +10435,24 @@ snapshots: dependencies: '@types/eslint': 8.56.10 '@types/estree': 1.0.5 - '@typescript-eslint/types': 7.13.0 + '@typescript-eslint/types': 7.14.1 comment-parser: 1.4.1 esquery: 1.5.0 jsdoc-type-pratt-parser: 4.0.0 + '@es-joy/jsdoccomment@0.46.0': + dependencies: + comment-parser: 1.4.1 + esquery: 1.6.0 + jsdoc-type-pratt-parser: 4.0.0 + '@esbuild/aix-ppc64@0.19.11': optional: true '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.22.0': + '@esbuild/aix-ppc64@0.23.0': optional: true '@esbuild/android-arm64@0.19.11': @@ -10428,7 +10461,7 @@ snapshots: '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.22.0': + '@esbuild/android-arm64@0.23.0': optional: true '@esbuild/android-arm@0.19.11': @@ -10437,7 +10470,7 @@ snapshots: '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.22.0': + '@esbuild/android-arm@0.23.0': optional: true '@esbuild/android-x64@0.19.11': @@ -10446,7 +10479,7 @@ snapshots: '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.22.0': + '@esbuild/android-x64@0.23.0': optional: true '@esbuild/darwin-arm64@0.19.11': @@ -10455,7 +10488,7 @@ snapshots: '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.22.0': + '@esbuild/darwin-arm64@0.23.0': optional: true '@esbuild/darwin-x64@0.19.11': @@ -10464,7 +10497,7 @@ snapshots: '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.22.0': + '@esbuild/darwin-x64@0.23.0': optional: true '@esbuild/freebsd-arm64@0.19.11': @@ -10473,7 +10506,7 @@ snapshots: '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.22.0': + '@esbuild/freebsd-arm64@0.23.0': optional: true '@esbuild/freebsd-x64@0.19.11': @@ -10482,7 +10515,7 @@ snapshots: '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.22.0': + '@esbuild/freebsd-x64@0.23.0': optional: true '@esbuild/linux-arm64@0.19.11': @@ -10491,7 +10524,7 @@ snapshots: '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.22.0': + '@esbuild/linux-arm64@0.23.0': optional: true '@esbuild/linux-arm@0.19.11': @@ -10500,7 +10533,7 @@ snapshots: '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.22.0': + '@esbuild/linux-arm@0.23.0': optional: true '@esbuild/linux-ia32@0.19.11': @@ -10509,7 +10542,7 @@ snapshots: '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.22.0': + '@esbuild/linux-ia32@0.23.0': optional: true '@esbuild/linux-loong64@0.19.11': @@ -10518,7 +10551,7 @@ snapshots: '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.22.0': + '@esbuild/linux-loong64@0.23.0': optional: true '@esbuild/linux-mips64el@0.19.11': @@ -10527,7 +10560,7 @@ snapshots: '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.22.0': + '@esbuild/linux-mips64el@0.23.0': optional: true '@esbuild/linux-ppc64@0.19.11': @@ -10536,7 +10569,7 @@ snapshots: '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.22.0': + '@esbuild/linux-ppc64@0.23.0': optional: true '@esbuild/linux-riscv64@0.19.11': @@ -10545,7 +10578,7 @@ snapshots: '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.22.0': + '@esbuild/linux-riscv64@0.23.0': optional: true '@esbuild/linux-s390x@0.19.11': @@ -10554,7 +10587,7 @@ snapshots: '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.22.0': + '@esbuild/linux-s390x@0.23.0': optional: true '@esbuild/linux-x64@0.19.11': @@ -10563,7 +10596,7 @@ snapshots: '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.22.0': + '@esbuild/linux-x64@0.23.0': optional: true '@esbuild/netbsd-x64@0.19.11': @@ -10572,10 +10605,10 @@ snapshots: '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.22.0': + '@esbuild/netbsd-x64@0.23.0': optional: true - '@esbuild/openbsd-arm64@0.22.0': + '@esbuild/openbsd-arm64@0.23.0': optional: true '@esbuild/openbsd-x64@0.19.11': @@ -10584,7 +10617,7 @@ snapshots: '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.22.0': + '@esbuild/openbsd-x64@0.23.0': optional: true '@esbuild/sunos-x64@0.19.11': @@ -10593,7 +10626,7 @@ snapshots: '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.22.0': + '@esbuild/sunos-x64@0.23.0': optional: true '@esbuild/win32-arm64@0.19.11': @@ -10602,7 +10635,7 @@ snapshots: '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.22.0': + '@esbuild/win32-arm64@0.23.0': optional: true '@esbuild/win32-ia32@0.19.11': @@ -10611,7 +10644,7 @@ snapshots: '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.22.0': + '@esbuild/win32-ia32@0.23.0': optional: true '@esbuild/win32-x64@0.19.11': @@ -10620,16 +10653,18 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.22.0': + '@esbuild/win32-x64@0.23.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.7.0)': dependencies: - eslint: 9.6.0 + eslint: 9.7.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.11.0': {} + '@eslint/config-array@0.17.0': dependencies: '@eslint/object-schema': 2.1.4 @@ -10652,7 +10687,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.6.0': {} + '@eslint/js@9.7.0': {} '@eslint/object-schema@2.1.4': {} @@ -10698,7 +10733,7 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@2.1.24': + '@iconify/utils@2.1.25': dependencies: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.7.10 @@ -10720,7 +10755,7 @@ snapshots: '@inquirer/figures': 1.0.3 '@inquirer/type': 1.3.3 '@types/mute-stream': 0.0.4 - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -10759,7 +10794,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/yargs': 17.0.12 chalk: 4.1.2 @@ -10846,9 +10881,9 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/test@1.45.0': + '@playwright/test@1.45.1': dependencies: - playwright: 1.45.0 + playwright: 1.45.1 '@polka/url@1.0.0-next.24': {} @@ -10856,12 +10891,12 @@ snapshots: dependencies: preact: 10.21.0 - '@preact/preset-vite@2.8.2(@babel/core@7.24.5)(preact@10.21.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@preact/preset-vite@2.8.2(@babel/core@7.24.5)(preact@10.21.0)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: '@babel/core': 7.24.5 '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.5) '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.5) - '@prefresh/vite': 2.4.1(preact@10.21.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + '@prefresh/vite': 2.4.1(preact@10.21.0)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.5) debug: 4.3.4 @@ -10871,7 +10906,7 @@ snapshots: resolve: 1.22.8 source-map: 0.7.4 stack-trace: 1.0.0-pre2 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) transitivePeerDependencies: - preact - supports-color @@ -10884,7 +10919,7 @@ snapshots: '@prefresh/utils@1.2.0': {} - '@prefresh/vite@2.4.1(preact@10.21.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@prefresh/vite@2.4.1(preact@10.21.0)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: '@babel/core': 7.24.5 '@prefresh/babel-plugin': 0.5.0 @@ -10892,11 +10927,11 @@ snapshots: '@prefresh/utils': 1.2.0 '@rollup/pluginutils': 4.2.1 preact: 10.21.0 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) transitivePeerDependencies: - supports-color - '@puppeteer/browsers@1.4.6(typescript@5.5.2)': + '@puppeteer/browsers@1.4.6(typescript@5.5.3)': dependencies: debug: 4.3.4 extract-zip: 2.0.1 @@ -10906,7 +10941,7 @@ snapshots: unbzip2-stream: 1.4.3 yargs: 17.7.1 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -10924,162 +10959,164 @@ snapshots: '@remix-run/router@1.16.0': {} - '@rollup/plugin-babel@5.3.1(@babel/core@7.24.7)(@types/babel__core@7.20.5)(rollup@4.18.0)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.24.7)(@types/babel__core@7.20.5)(rollup@4.18.1)': dependencies: '@babel/core': 7.24.7 '@babel/helper-module-imports': 7.24.7 - '@rollup/pluginutils': 3.1.0(rollup@4.18.0) - rollup: 4.18.0 + '@rollup/pluginutils': 3.1.0(rollup@4.18.1) + rollup: 4.18.1 optionalDependencies: '@types/babel__core': 7.20.5 transitivePeerDependencies: - supports-color - '@rollup/plugin-commonjs@26.0.1(rollup@4.18.0)': + '@rollup/plugin-commonjs@26.0.1(rollup@4.18.1)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) commondir: 1.0.1 estree-walker: 2.0.2 glob: 10.4.1 is-reference: 1.2.1 magic-string: 0.30.10 optionalDependencies: - rollup: 4.18.0 + rollup: 4.18.1 - '@rollup/plugin-json@6.1.0(rollup@4.18.0)': + '@rollup/plugin-json@6.1.0(rollup@4.18.1)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) optionalDependencies: - rollup: 4.18.0 + rollup: 4.18.1 - '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.0)': + '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.1)': dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.18.0) + '@rollup/pluginutils': 5.0.5(rollup@4.18.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.18.0 + rollup: 4.18.1 - '@rollup/plugin-replace@2.4.2(rollup@4.18.0)': + '@rollup/plugin-replace@2.4.2(rollup@4.18.1)': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@4.18.0) + '@rollup/pluginutils': 3.1.0(rollup@4.18.1) magic-string: 0.25.9 - rollup: 4.18.0 + rollup: 4.18.1 - '@rollup/plugin-terser@0.4.4(rollup@4.18.0)': + '@rollup/plugin-terser@0.4.4(rollup@4.18.1)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.22.0 optionalDependencies: - rollup: 4.18.0 + rollup: 4.18.1 - '@rollup/pluginutils@3.1.0(rollup@4.18.0)': + '@rollup/pluginutils@3.1.0(rollup@4.18.1)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: 4.18.0 + rollup: 4.18.1 '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.0.5(rollup@4.18.0)': + '@rollup/pluginutils@5.0.5(rollup@4.18.1)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.18.0 + rollup: 4.18.1 - '@rollup/pluginutils@5.1.0(rollup@4.18.0)': + '@rollup/pluginutils@5.1.0(rollup@4.18.1)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.18.0 + rollup: 4.18.1 - '@rollup/rollup-android-arm-eabi@4.18.0': + '@rollup/rollup-android-arm-eabi@4.18.1': optional: true - '@rollup/rollup-android-arm64@4.18.0': + '@rollup/rollup-android-arm64@4.18.1': optional: true - '@rollup/rollup-darwin-arm64@4.18.0': + '@rollup/rollup-darwin-arm64@4.18.1': optional: true - '@rollup/rollup-darwin-x64@4.18.0': + '@rollup/rollup-darwin-x64@4.18.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + '@rollup/rollup-linux-arm-gnueabihf@4.18.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': + '@rollup/rollup-linux-arm-musleabihf@4.18.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': + '@rollup/rollup-linux-arm64-gnu@4.18.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': + '@rollup/rollup-linux-arm64-musl@4.18.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.18.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': + '@rollup/rollup-linux-riscv64-gnu@4.18.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': + '@rollup/rollup-linux-s390x-gnu@4.18.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': + '@rollup/rollup-linux-x64-gnu@4.18.1': optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': + '@rollup/rollup-linux-x64-musl@4.18.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': + '@rollup/rollup-win32-arm64-msvc@4.18.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': + '@rollup/rollup-win32-ia32-msvc@4.18.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': + '@rollup/rollup-win32-x64-msvc@4.18.1': optional: true - '@shikijs/core@1.10.0': {} + '@rtsao/scc@1.1.0': {} - '@shikijs/core@1.6.4': {} + '@shikijs/core@1.10.3': + dependencies: + '@types/hast': 3.0.4 - '@shikijs/transformers@1.6.4': + '@shikijs/transformers@1.10.3': dependencies: - shiki: 1.6.4 + shiki: 1.10.3 - '@shikijs/twoslash@1.10.0(typescript@5.5.2)': + '@shikijs/twoslash@1.10.3(typescript@5.5.3)': dependencies: - '@shikijs/core': 1.10.0 - twoslash: 0.2.9(typescript@5.5.2) + '@shikijs/core': 1.10.3 + twoslash: 0.2.9(typescript@5.5.3) transitivePeerDependencies: - supports-color - typescript - '@shikijs/vitepress-twoslash@1.10.0(typescript@5.5.2)': + '@shikijs/vitepress-twoslash@1.10.3(typescript@5.5.3)': dependencies: - '@shikijs/twoslash': 1.10.0(typescript@5.5.2) - floating-vue: 5.2.2(vue@3.4.31(typescript@5.5.2)) + '@shikijs/twoslash': 1.10.3(typescript@5.5.3) + floating-vue: 5.2.2(vue@3.4.31(typescript@5.5.3)) mdast-util-from-markdown: 2.0.1 mdast-util-gfm: 3.0.0 mdast-util-to-hast: 13.2.0 - shiki: 1.10.0 - twoslash: 0.2.9(typescript@5.5.2) - twoslash-vue: 0.2.9(typescript@5.5.2) - vue: 3.4.31(typescript@5.5.2) + shiki: 1.10.3 + twoslash: 0.2.9(typescript@5.5.3) + twoslash-vue: 0.2.9(typescript@5.5.3) + vue: 3.4.31(typescript@5.5.3) transitivePeerDependencies: - '@nuxt/kit' - supports-color @@ -11107,49 +11144,49 @@ snapshots: '@testing-library/dom': 9.3.3 solid-js: 1.8.3 - '@stylistic/eslint-plugin-js@2.3.0(eslint@9.6.0)': + '@stylistic/eslint-plugin-js@2.6.0-beta.0(eslint@9.7.0)': dependencies: '@types/eslint': 8.56.10 acorn: 8.12.0 - eslint: 9.6.0 + eslint: 9.7.0 eslint-visitor-keys: 4.0.0 - espree: 10.0.1 + espree: 10.1.0 - '@stylistic/eslint-plugin-jsx@2.3.0(eslint@9.6.0)': + '@stylistic/eslint-plugin-jsx@2.6.0-beta.0(eslint@9.7.0)': dependencies: - '@stylistic/eslint-plugin-js': 2.3.0(eslint@9.6.0) + '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0) '@types/eslint': 8.56.10 - eslint: 9.6.0 + eslint: 9.7.0 estraverse: 5.3.0 picomatch: 4.0.2 - '@stylistic/eslint-plugin-plus@2.3.0(eslint@9.6.0)(typescript@5.5.2)': + '@stylistic/eslint-plugin-plus@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@types/eslint': 8.56.10 - '@typescript-eslint/utils': 7.13.0(eslint@9.6.0)(typescript@5.5.2) - eslint: 9.6.0 + '@typescript-eslint/utils': 8.0.0-alpha.44(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@stylistic/eslint-plugin-ts@2.3.0(eslint@9.6.0)(typescript@5.5.2)': + '@stylistic/eslint-plugin-ts@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.3.0(eslint@9.6.0) + '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0) '@types/eslint': 8.56.10 - '@typescript-eslint/utils': 7.13.0(eslint@9.6.0)(typescript@5.5.2) - eslint: 9.6.0 + '@typescript-eslint/utils': 8.0.0-alpha.44(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@stylistic/eslint-plugin@2.3.0(eslint@9.6.0)(typescript@5.5.2)': + '@stylistic/eslint-plugin@2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.3.0(eslint@9.6.0) - '@stylistic/eslint-plugin-jsx': 2.3.0(eslint@9.6.0) - '@stylistic/eslint-plugin-plus': 2.3.0(eslint@9.6.0)(typescript@5.5.2) - '@stylistic/eslint-plugin-ts': 2.3.0(eslint@9.6.0)(typescript@5.5.2) + '@stylistic/eslint-plugin-js': 2.6.0-beta.0(eslint@9.7.0) + '@stylistic/eslint-plugin-jsx': 2.6.0-beta.0(eslint@9.7.0) + '@stylistic/eslint-plugin-plus': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3) + '@stylistic/eslint-plugin-ts': 2.6.0-beta.0(eslint@9.7.0)(typescript@5.5.3) '@types/eslint': 8.56.10 - eslint: 9.6.0 + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript @@ -11161,14 +11198,14 @@ snapshots: magic-string: 0.25.9 string.prototype.matchall: 4.0.10 - '@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)))': + '@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)))': dependencies: - '@sveltejs/kit': 1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + '@sveltejs/kit': 1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) import-meta-resolve: 3.0.0 - '@sveltejs/kit@1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@sveltejs/kit@1.20.2(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) '@types/cookie': 0.5.1 cookie: 0.5.0 devalue: 4.3.2 @@ -11182,30 +11219,30 @@ snapshots: svelte: 3.59.1 tiny-glob: 0.2.9 undici: 5.22.1 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)))(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)))(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + '@sveltejs/vite-plugin-svelte': 2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) debug: 4.3.5 svelte: 3.59.1 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@sveltejs/vite-plugin-svelte@2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)))(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.4.6(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)))(svelte@3.59.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) debug: 4.3.5 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.10 svelte: 3.59.1 svelte-hmr: 0.15.3(svelte@3.59.1) - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) - vitefu: 0.2.5(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) + vitefu: 0.2.5(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) transitivePeerDependencies: - supports-color @@ -11274,6 +11311,17 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 + '@testing-library/dom@10.3.1': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/runtime': 7.24.4 + '@types/aria-query': 5.0.3 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + '@testing-library/dom@8.19.0': dependencies: '@babel/code-frame': 7.24.2 @@ -11364,12 +11412,16 @@ snapshots: dependencies: '@testing-library/dom': 10.2.0 - '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.31)(vue@3.4.31(typescript@5.5.2))': + '@testing-library/user-event@14.5.2(@testing-library/dom@10.3.1)': + dependencies: + '@testing-library/dom': 10.3.1 + + '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.4.31)(vue@3.4.31(typescript@5.5.3))': dependencies: '@babel/runtime': 7.24.4 '@testing-library/dom': 9.3.4 '@vue/test-utils': 2.4.6 - vue: 3.4.31(typescript@5.5.2) + vue: 3.4.31(typescript@5.5.3) optionalDependencies: '@vue/compiler-sfc': 3.4.31 @@ -11442,17 +11494,17 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 20.14.9 + '@types/node': 20.14.10 optional: true '@types/fs-extra@8.1.3': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.1 - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/hast@3.0.4': dependencies: @@ -11493,7 +11545,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 @@ -11501,7 +11553,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 optional: true '@types/linkify-it@5.0.0': {} @@ -11531,7 +11583,7 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/natural-compare@1.4.3': {} @@ -11543,11 +11595,7 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@20.12.11': - dependencies: - undici-types: 5.26.5 - - '@types/node@20.14.9': + '@types/node@20.14.10': dependencies: undici-types: 5.26.5 @@ -11555,7 +11603,7 @@ snapshots: '@types/prompts@2.4.9': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 kleur: 3.0.3 '@types/prop-types@15.7.9': {} @@ -11593,7 +11641,7 @@ snapshots: '@types/through@0.0.30': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/tough-cookie@4.0.2': {} @@ -11611,13 +11659,13 @@ snapshots: '@types/wrap-ansi@3.0.0': {} - '@types/ws@8.5.10': + '@types/ws@8.5.11': dependencies: - '@types/node': 20.12.11 + '@types/node': 20.14.10 '@types/ws@8.5.9': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/yargs-parser@21.0.0': {} @@ -11627,128 +11675,166 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 optional: true - '@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2)': + '@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.14.1(eslint@9.6.0)(typescript@5.5.2) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/type-utils': 7.14.1(eslint@9.6.0)(typescript@5.5.2) - '@typescript-eslint/utils': 7.14.1(eslint@9.6.0)(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 7.14.1 - eslint: 9.6.0 + '@typescript-eslint/parser': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 8.0.0-alpha.40 + '@typescript-eslint/type-utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 + eslint: 9.7.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.2) + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2)': + '@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/scope-manager': 8.0.0-alpha.40 + '@typescript-eslint/types': 8.0.0-alpha.40 + '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 debug: 4.3.5 - eslint: 9.6.0 + eslint: 9.7.0 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.13.0': - dependencies: - '@typescript-eslint/types': 7.13.0 - '@typescript-eslint/visitor-keys': 7.13.0 - '@typescript-eslint/scope-manager@7.14.1': dependencies: '@typescript-eslint/types': 7.14.1 '@typescript-eslint/visitor-keys': 7.14.1 - '@typescript-eslint/type-utils@7.14.1(eslint@9.6.0)(typescript@5.5.2)': + '@typescript-eslint/scope-manager@8.0.0-alpha.40': + dependencies: + '@typescript-eslint/types': 8.0.0-alpha.40 + '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 + + '@typescript-eslint/scope-manager@8.0.0-alpha.44': dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) - '@typescript-eslint/utils': 7.14.1(eslint@9.6.0)(typescript@5.5.2) + '@typescript-eslint/types': 8.0.0-alpha.44 + '@typescript-eslint/visitor-keys': 8.0.0-alpha.44 + + '@typescript-eslint/type-utils@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3) + '@typescript-eslint/utils': 8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3) debug: 4.3.5 - eslint: 9.6.0 - ts-api-utils: 1.3.0(typescript@5.5.2) + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: + - eslint - supports-color - '@typescript-eslint/types@7.13.0': {} - '@typescript-eslint/types@7.14.1': {} - '@typescript-eslint/typescript-estree@7.13.0(typescript@5.5.2)': + '@typescript-eslint/types@8.0.0-alpha.40': {} + + '@typescript-eslint/types@8.0.0-alpha.44': {} + + '@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.3)': dependencies: - '@typescript-eslint/types': 7.13.0 - '@typescript-eslint/visitor-keys': 7.13.0 + '@typescript-eslint/types': 7.14.1 + '@typescript-eslint/visitor-keys': 7.14.1 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.5.2) + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@8.0.0-alpha.40(typescript@5.5.3)': dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/types': 8.0.0-alpha.40 + '@typescript-eslint/visitor-keys': 8.0.0-alpha.40 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.5.2) + ts-api-utils: 1.3.0(typescript@5.5.3) optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.13.0(eslint@9.6.0)(typescript@5.5.2)': + '@typescript-eslint/typescript-estree@8.0.0-alpha.44(typescript@5.5.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@typescript-eslint/scope-manager': 7.13.0 - '@typescript-eslint/types': 7.13.0 - '@typescript-eslint/typescript-estree': 7.13.0(typescript@5.5.2) - eslint: 9.6.0 + '@typescript-eslint/types': 8.0.0-alpha.44 + '@typescript-eslint/visitor-keys': 8.0.0-alpha.44 + debug: 4.3.5 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/utils@7.14.1(eslint@9.6.0)(typescript@5.5.2)': + '@typescript-eslint/utils@7.14.1(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@typescript-eslint/scope-manager': 7.14.1 '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.2) - eslint: 9.6.0 + '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.5.3) + eslint: 9.7.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.13.0': + '@typescript-eslint/utils@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3)': dependencies: - '@typescript-eslint/types': 7.13.0 - eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + '@typescript-eslint/scope-manager': 8.0.0-alpha.40 + '@typescript-eslint/types': 8.0.0-alpha.40 + '@typescript-eslint/typescript-estree': 8.0.0-alpha.40(typescript@5.5.3) + eslint: 9.7.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@8.0.0-alpha.44(eslint@9.7.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + '@typescript-eslint/scope-manager': 8.0.0-alpha.44 + '@typescript-eslint/types': 8.0.0-alpha.44 + '@typescript-eslint/typescript-estree': 8.0.0-alpha.44(typescript@5.5.3) + eslint: 9.7.0 + transitivePeerDependencies: + - supports-color + - typescript '@typescript-eslint/visitor-keys@7.14.1': dependencies: '@typescript-eslint/types': 7.14.1 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.0.0-alpha.40': + dependencies: + '@typescript-eslint/types': 8.0.0-alpha.40 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@8.0.0-alpha.44': + dependencies: + '@typescript-eslint/types': 8.0.0-alpha.44 + eslint-visitor-keys: 3.4.3 + '@typescript/vfs@1.5.0': dependencies: debug: 4.3.5 @@ -11757,23 +11843,23 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unocss/astro@0.61.0(rollup@4.18.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@unocss/astro@0.61.3(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: - '@unocss/core': 0.61.0 - '@unocss/reset': 0.61.0 - '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + '@unocss/core': 0.61.3 + '@unocss/reset': 0.61.3 + '@unocss/vite': 0.61.3(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) optionalDependencies: - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) transitivePeerDependencies: - rollup - '@unocss/cli@0.61.0(rollup@4.18.0)': + '@unocss/cli@0.61.3(rollup@4.18.1)': dependencies: '@ampproject/remapping': 2.3.0 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@unocss/config': 0.61.0 - '@unocss/core': 0.61.0 - '@unocss/preset-uno': 0.61.0 + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) + '@unocss/config': 0.61.3 + '@unocss/core': 0.61.3 + '@unocss/preset-uno': 0.61.3 cac: 6.7.14(patch_hash=slh3cigivjjjktoa42g2agwaem) chokidar: 3.6.0 colorette: 2.0.20 @@ -11785,128 +11871,128 @@ snapshots: transitivePeerDependencies: - rollup - '@unocss/config@0.61.0': + '@unocss/config@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 unconfig: 0.3.13 - '@unocss/core@0.61.0': {} + '@unocss/core@0.61.3': {} - '@unocss/extractor-arbitrary-variants@0.61.0': + '@unocss/extractor-arbitrary-variants@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 - '@unocss/inspector@0.61.0': + '@unocss/inspector@0.61.3': dependencies: - '@unocss/core': 0.61.0 - '@unocss/rule-utils': 0.61.0 + '@unocss/core': 0.61.3 + '@unocss/rule-utils': 0.61.3 gzip-size: 6.0.0 sirv: 2.0.4 - '@unocss/postcss@0.61.0(postcss@8.4.39)': + '@unocss/postcss@0.61.3(postcss@8.4.39)': dependencies: - '@unocss/config': 0.61.0 - '@unocss/core': 0.61.0 - '@unocss/rule-utils': 0.61.0 + '@unocss/config': 0.61.3 + '@unocss/core': 0.61.3 + '@unocss/rule-utils': 0.61.3 css-tree: 2.3.1 fast-glob: 3.3.2 magic-string: 0.30.10 postcss: 8.4.39 - '@unocss/preset-attributify@0.61.0': + '@unocss/preset-attributify@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 - '@unocss/preset-icons@0.61.0': + '@unocss/preset-icons@0.61.3': dependencies: - '@iconify/utils': 2.1.24 - '@unocss/core': 0.61.0 + '@iconify/utils': 2.1.25 + '@unocss/core': 0.61.3 ofetch: 1.3.4 transitivePeerDependencies: - supports-color - '@unocss/preset-mini@0.61.0': + '@unocss/preset-mini@0.61.3': dependencies: - '@unocss/core': 0.61.0 - '@unocss/extractor-arbitrary-variants': 0.61.0 - '@unocss/rule-utils': 0.61.0 + '@unocss/core': 0.61.3 + '@unocss/extractor-arbitrary-variants': 0.61.3 + '@unocss/rule-utils': 0.61.3 - '@unocss/preset-tagify@0.61.0': + '@unocss/preset-tagify@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 - '@unocss/preset-typography@0.61.0': + '@unocss/preset-typography@0.61.3': dependencies: - '@unocss/core': 0.61.0 - '@unocss/preset-mini': 0.61.0 + '@unocss/core': 0.61.3 + '@unocss/preset-mini': 0.61.3 - '@unocss/preset-uno@0.61.0': + '@unocss/preset-uno@0.61.3': dependencies: - '@unocss/core': 0.61.0 - '@unocss/preset-mini': 0.61.0 - '@unocss/preset-wind': 0.61.0 - '@unocss/rule-utils': 0.61.0 + '@unocss/core': 0.61.3 + '@unocss/preset-mini': 0.61.3 + '@unocss/preset-wind': 0.61.3 + '@unocss/rule-utils': 0.61.3 - '@unocss/preset-web-fonts@0.61.0': + '@unocss/preset-web-fonts@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 ofetch: 1.3.4 - '@unocss/preset-wind@0.61.0': + '@unocss/preset-wind@0.61.3': dependencies: - '@unocss/core': 0.61.0 - '@unocss/preset-mini': 0.61.0 - '@unocss/rule-utils': 0.61.0 + '@unocss/core': 0.61.3 + '@unocss/preset-mini': 0.61.3 + '@unocss/rule-utils': 0.61.3 - '@unocss/reset@0.61.0': {} + '@unocss/reset@0.61.3': {} - '@unocss/rule-utils@0.61.0': + '@unocss/rule-utils@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 magic-string: 0.30.10 - '@unocss/scope@0.61.0': {} + '@unocss/scope@0.61.3': {} - '@unocss/transformer-attributify-jsx-babel@0.61.0': + '@unocss/transformer-attributify-jsx-babel@0.61.3': dependencies: '@babel/core': 7.24.7 '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) '@babel/preset-typescript': 7.24.7(@babel/core@7.24.7) - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 transitivePeerDependencies: - supports-color - '@unocss/transformer-attributify-jsx@0.61.0': + '@unocss/transformer-attributify-jsx@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 - '@unocss/transformer-compile-class@0.61.0': + '@unocss/transformer-compile-class@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 - '@unocss/transformer-directives@0.61.0': + '@unocss/transformer-directives@0.61.3': dependencies: - '@unocss/core': 0.61.0 - '@unocss/rule-utils': 0.61.0 + '@unocss/core': 0.61.3 + '@unocss/rule-utils': 0.61.3 css-tree: 2.3.1 - '@unocss/transformer-variant-group@0.61.0': + '@unocss/transformer-variant-group@0.61.3': dependencies: - '@unocss/core': 0.61.0 + '@unocss/core': 0.61.3 - '@unocss/vite@0.61.0(rollup@4.18.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@unocss/vite@0.61.3(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: '@ampproject/remapping': 2.3.0 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) - '@unocss/config': 0.61.0 - '@unocss/core': 0.61.0 - '@unocss/inspector': 0.61.0 - '@unocss/scope': 0.61.0 - '@unocss/transformer-directives': 0.61.0 + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) + '@unocss/config': 0.61.3 + '@unocss/core': 0.61.3 + '@unocss/inspector': 0.61.3 + '@unocss/scope': 0.61.3 + '@unocss/transformer-directives': 0.61.3 chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.10 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) transitivePeerDependencies: - rollup @@ -11919,45 +12005,45 @@ snapshots: sharp-ico: 0.1.5 unconfig: 0.3.11 - '@vite-pwa/vitepress@0.5.0(@vite-pwa/assets-generator@0.2.4)(vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0))': + '@vite-pwa/vitepress@0.5.0(@vite-pwa/assets-generator@0.2.4)(vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0))': dependencies: - vite-plugin-pwa: 0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0) + vite-plugin-pwa: 0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0) optionalDependencies: '@vite-pwa/assets-generator': 0.2.4 - '@vitejs/plugin-basic-ssl@1.0.2(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@vitejs/plugin-basic-ssl@1.0.2(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) - '@vitejs/plugin-react@4.2.1(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))': + '@vitejs/plugin-react@4.2.1(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))': dependencies: '@babel/core': 7.24.4 '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.24.4) '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.24.4) '@types/babel__core': 7.20.5 react-refresh: 0.14.0 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.0.5(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(vue@3.4.31(typescript@5.5.2))': + '@vitejs/plugin-vue@5.0.5(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(vue@3.4.31(typescript@5.5.3))': dependencies: - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) - vue: 3.4.31(typescript@5.5.2) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) + vue: 3.4.31(typescript@5.5.3) - '@vitest/browser@2.0.2(playwright@1.45.0)(typescript@5.5.2)(vitest@packages+vitest)(webdriverio@8.32.2(typescript@5.5.2))': + '@vitest/browser@2.0.2(playwright@1.45.1)(typescript@5.5.3)(vitest@packages+vitest)(webdriverio@8.32.2(typescript@5.5.3))': dependencies: '@testing-library/dom': 10.2.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.2.0) '@vitest/utils': 2.0.2 magic-string: 0.30.10 - msw: 2.3.1(typescript@5.5.2) + msw: 2.3.1(typescript@5.5.3) sirv: 2.0.4 vitest: link:packages/vitest ws: 8.17.1 optionalDependencies: - playwright: 1.45.0 - webdriverio: 8.32.2(typescript@5.5.2) + playwright: 1.45.1 + webdriverio: 8.32.2(typescript@5.5.3) transitivePeerDependencies: - bufferutil - typescript @@ -12073,31 +12159,30 @@ snapshots: '@vue/devtools-api@6.5.1': {} - '@vue/devtools-api@7.2.1(vue@3.4.31(typescript@5.5.2))': + '@vue/devtools-api@7.3.6': dependencies: - '@vue/devtools-kit': 7.2.1(vue@3.4.31(typescript@5.5.2)) - transitivePeerDependencies: - - vue + '@vue/devtools-kit': 7.3.6 - '@vue/devtools-kit@7.2.1(vue@3.4.31(typescript@5.5.2))': + '@vue/devtools-kit@7.3.6': dependencies: - '@vue/devtools-shared': 7.2.1 + '@vue/devtools-shared': 7.3.6 + birpc: 0.2.17 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 - vue: 3.4.31(typescript@5.5.2) + superjson: 2.2.1 - '@vue/devtools-shared@7.2.1': + '@vue/devtools-shared@7.3.6': dependencies: - rfdc: 1.3.1 + rfdc: 1.4.1 '@vue/language-core@1.8.20(typescript@5.2.2)': dependencies: '@volar/language-core': 1.10.4 '@volar/source-map': 1.10.4 '@vue/compiler-dom': 3.4.31 - '@vue/shared': 3.4.29 + '@vue/shared': 3.4.31 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.3.1 @@ -12105,18 +12190,18 @@ snapshots: optionalDependencies: typescript: 5.2.2 - '@vue/language-core@2.0.24(typescript@5.5.2)': + '@vue/language-core@2.0.24(typescript@5.5.3)': dependencies: '@volar/language-core': 2.4.0-alpha.5 '@vue/compiler-dom': 3.4.31 - '@vue/shared': 3.4.29 + '@vue/shared': 3.4.31 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 vue-template-compiler: 2.7.15 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 '@vue/reactivity@3.4.26': dependencies: @@ -12149,24 +12234,20 @@ snapshots: '@vue/shared': 3.4.31 csstype: 3.1.3 - '@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.5.2))': + '@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.5.3))': dependencies: '@vue/compiler-ssr': 3.4.26 '@vue/shared': 3.4.26 - vue: 3.4.26(typescript@5.5.2) + vue: 3.4.26(typescript@5.5.3) - '@vue/server-renderer@3.4.31(vue@3.4.31(typescript@5.5.2))': + '@vue/server-renderer@3.4.31(vue@3.4.31(typescript@5.5.3))': dependencies: '@vue/compiler-ssr': 3.4.31 '@vue/shared': 3.4.31 - vue: 3.4.31(typescript@5.5.2) + vue: 3.4.31(typescript@5.5.3) '@vue/shared@3.4.26': {} - '@vue/shared@3.4.27': {} - - '@vue/shared@3.4.29': {} - '@vue/shared@3.4.31': {} '@vue/test-utils@2.4.6': @@ -12181,53 +12262,42 @@ snapshots: transitivePeerDependencies: - typescript - '@vueuse/core@10.10.1(vue@3.4.31(typescript@5.5.2))': - dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.10.1 - '@vueuse/shared': 10.10.1(vue@3.4.31(typescript@5.5.2)) - vue-demi: 0.14.8(vue@3.4.31(typescript@5.5.2)) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - - '@vueuse/core@10.11.0(vue@3.4.31(typescript@5.5.2))': + '@vueuse/core@10.11.0(vue@3.4.31(typescript@5.5.3))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 10.11.0 - '@vueuse/shared': 10.11.0(vue@3.4.31(typescript@5.5.2)) - vue-demi: 0.14.8(vue@3.4.31(typescript@5.5.2)) + '@vueuse/shared': 10.11.0(vue@3.4.31(typescript@5.5.3)) + vue-demi: 0.14.8(vue@3.4.31(typescript@5.5.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/core@10.9.0(vue@3.4.26(typescript@5.5.2))': + '@vueuse/core@10.9.0(vue@3.4.26(typescript@5.5.3))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 10.9.0 - '@vueuse/shared': 10.9.0(vue@3.4.26(typescript@5.5.2)) - vue-demi: 0.14.8(vue@3.4.26(typescript@5.5.2)) + '@vueuse/shared': 10.9.0(vue@3.4.26(typescript@5.5.3)) + vue-demi: 0.14.8(vue@3.4.26(typescript@5.5.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/integrations@10.10.1(axios@0.26.1)(focus-trap@7.5.4)(vue@3.4.31(typescript@5.5.2))': + '@vueuse/integrations@10.11.0(focus-trap@7.5.4)(vue@3.4.31(typescript@5.5.3))': dependencies: - '@vueuse/core': 10.10.1(vue@3.4.31(typescript@5.5.2)) - '@vueuse/shared': 10.10.1(vue@3.4.31(typescript@5.5.2)) - vue-demi: 0.14.8(vue@3.4.31(typescript@5.5.2)) + '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.5.3)) + '@vueuse/shared': 10.11.0(vue@3.4.31(typescript@5.5.3)) + vue-demi: 0.14.8(vue@3.4.31(typescript@5.5.3)) optionalDependencies: - axios: 0.26.1(debug@4.3.4) focus-trap: 7.5.4 transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/integrations@10.9.0(axios@0.26.1(debug@4.3.4))(focus-trap@7.5.4)(vue@3.4.26(typescript@5.5.2))': + '@vueuse/integrations@10.9.0(axios@0.26.1(debug@4.3.4))(focus-trap@7.5.4)(vue@3.4.26(typescript@5.5.3))': dependencies: - '@vueuse/core': 10.9.0(vue@3.4.26(typescript@5.5.2)) - '@vueuse/shared': 10.9.0(vue@3.4.26(typescript@5.5.2)) - vue-demi: 0.14.7(vue@3.4.26(typescript@5.5.2)) + '@vueuse/core': 10.9.0(vue@3.4.26(typescript@5.5.3)) + '@vueuse/shared': 10.9.0(vue@3.4.26(typescript@5.5.3)) + vue-demi: 0.14.7(vue@3.4.26(typescript@5.5.3)) optionalDependencies: axios: 0.26.1(debug@4.3.4) focus-trap: 7.5.4 @@ -12235,29 +12305,20 @@ snapshots: - '@vue/composition-api' - vue - '@vueuse/metadata@10.10.1': {} - '@vueuse/metadata@10.11.0': {} '@vueuse/metadata@10.9.0': {} - '@vueuse/shared@10.10.1(vue@3.4.31(typescript@5.5.2))': + '@vueuse/shared@10.11.0(vue@3.4.31(typescript@5.5.3))': dependencies: - vue-demi: 0.14.8(vue@3.4.31(typescript@5.5.2)) + vue-demi: 0.14.8(vue@3.4.31(typescript@5.5.3)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/shared@10.11.0(vue@3.4.31(typescript@5.5.2))': + '@vueuse/shared@10.9.0(vue@3.4.26(typescript@5.5.3))': dependencies: - vue-demi: 0.14.8(vue@3.4.31(typescript@5.5.2)) - transitivePeerDependencies: - - '@vue/composition-api' - - vue - - '@vueuse/shared@10.9.0(vue@3.4.26(typescript@5.5.2))': - dependencies: - vue-demi: 0.14.8(vue@3.4.26(typescript@5.5.2)) + vue-demi: 0.14.8(vue@3.4.26(typescript@5.5.3)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -12306,15 +12367,15 @@ snapshots: '@wdio/repl@8.24.12': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@wdio/types@8.32.2': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@wdio/types@8.39.0': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@wdio/utils@8.32.2': dependencies: @@ -12993,6 +13054,10 @@ snapshots: cookiejar@2.1.4: {} + copy-anything@3.0.5: + dependencies: + is-what: 4.1.8 + core-js-compat@3.37.1: dependencies: browserslist: 4.23.0 @@ -13482,32 +13547,32 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.22.0: + esbuild@0.23.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.22.0 - '@esbuild/android-arm': 0.22.0 - '@esbuild/android-arm64': 0.22.0 - '@esbuild/android-x64': 0.22.0 - '@esbuild/darwin-arm64': 0.22.0 - '@esbuild/darwin-x64': 0.22.0 - '@esbuild/freebsd-arm64': 0.22.0 - '@esbuild/freebsd-x64': 0.22.0 - '@esbuild/linux-arm': 0.22.0 - '@esbuild/linux-arm64': 0.22.0 - '@esbuild/linux-ia32': 0.22.0 - '@esbuild/linux-loong64': 0.22.0 - '@esbuild/linux-mips64el': 0.22.0 - '@esbuild/linux-ppc64': 0.22.0 - '@esbuild/linux-riscv64': 0.22.0 - '@esbuild/linux-s390x': 0.22.0 - '@esbuild/linux-x64': 0.22.0 - '@esbuild/netbsd-x64': 0.22.0 - '@esbuild/openbsd-arm64': 0.22.0 - '@esbuild/openbsd-x64': 0.22.0 - '@esbuild/sunos-x64': 0.22.0 - '@esbuild/win32-arm64': 0.22.0 - '@esbuild/win32-ia32': 0.22.0 - '@esbuild/win32-x64': 0.22.0 + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 escalade@3.1.2: {} @@ -13529,16 +13594,16 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.1.2(eslint@9.6.0): + eslint-compat-utils@0.1.2(eslint@9.7.0): dependencies: - eslint: 9.6.0 + eslint: 9.7.0 - eslint-compat-utils@0.5.0(eslint@9.6.0): + eslint-compat-utils@0.5.0(eslint@9.7.0): dependencies: - eslint: 9.6.0 + eslint: 9.7.0 semver: 7.6.2 - eslint-config-flat-gitignore@0.1.5: + eslint-config-flat-gitignore@0.1.7: dependencies: find-up: 7.0.0 parse-gitignore: 2.0.0 @@ -13556,140 +13621,142 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-merge-processors@0.1.0(eslint@9.6.0): + eslint-merge-processors@0.1.0(eslint@9.7.0): dependencies: - eslint: 9.6.0 + eslint: 9.7.0 - eslint-plugin-antfu@2.3.3(eslint@9.6.0): + eslint-plugin-antfu@2.3.4(eslint@9.7.0): dependencies: '@antfu/utils': 0.7.10 - eslint: 9.6.0 + eslint: 9.7.0 - eslint-plugin-command@0.2.3(eslint@9.6.0): + eslint-plugin-command@0.2.3(eslint@9.7.0): dependencies: '@es-joy/jsdoccomment': 0.43.1 - eslint: 9.6.0 + eslint: 9.7.0 - eslint-plugin-es-x@7.5.0(eslint@9.6.0): + eslint-plugin-es-x@7.5.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@eslint-community/regexpp': 4.10.0 - eslint: 9.6.0 - eslint-compat-utils: 0.1.2(eslint@9.6.0) + eslint: 9.7.0 + eslint-compat-utils: 0.1.2(eslint@9.7.0) - eslint-plugin-eslint-comments@3.2.0(eslint@9.6.0): + eslint-plugin-eslint-comments@3.2.0(eslint@9.7.0): dependencies: escape-string-regexp: 1.0.5 - eslint: 9.6.0 + eslint: 9.7.0 ignore: 5.3.1 - eslint-plugin-import-x@0.5.2(eslint@9.6.0)(typescript@5.5.2): + eslint-plugin-import-x@3.0.1(eslint@9.7.0)(typescript@5.5.3): dependencies: - '@typescript-eslint/utils': 7.13.0(eslint@9.6.0)(typescript@5.5.2) + '@rtsao/scc': 1.1.0 + '@typescript-eslint/utils': 7.14.1(eslint@9.7.0)(typescript@5.5.3) debug: 4.3.5 doctrine: 3.0.0 - eslint: 9.6.0 + eslint: 9.7.0 eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.7.5 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.2 + stable-hash: 0.0.4 tslib: 2.6.2 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jsdoc@48.5.0(eslint@9.6.0): + eslint-plugin-jsdoc@48.7.0(eslint@9.7.0): dependencies: - '@es-joy/jsdoccomment': 0.43.1 + '@es-joy/jsdoccomment': 0.46.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.3.5 escape-string-regexp: 4.0.0 - eslint: 9.6.0 - esquery: 1.5.0 - parse-imports: 2.1.0 + eslint: 9.7.0 + esquery: 1.6.0 + parse-imports: 2.1.1 semver: 7.6.2 spdx-expression-parse: 4.0.0 synckit: 0.9.0 transitivePeerDependencies: - supports-color - eslint-plugin-jsonc@2.16.0(eslint@9.6.0): + eslint-plugin-jsonc@2.16.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - eslint: 9.6.0 - eslint-compat-utils: 0.5.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + eslint: 9.7.0 + eslint-compat-utils: 0.5.0(eslint@9.7.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 natural-compare: 1.4.0 synckit: 0.6.2 - eslint-plugin-markdown@5.0.0(eslint@9.6.0): + eslint-plugin-markdown@5.1.0(eslint@9.7.0): dependencies: - eslint: 9.6.0 + eslint: 9.7.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - eslint-plugin-n@17.9.0(eslint@9.6.0): + eslint-plugin-n@17.9.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) enhanced-resolve: 5.17.0 - eslint: 9.6.0 - eslint-plugin-es-x: 7.5.0(eslint@9.6.0) + eslint: 9.7.0 + eslint-plugin-es-x: 7.5.0(eslint@9.7.0) get-tsconfig: 4.7.5 - globals: 15.7.0 + globals: 15.8.0 ignore: 5.3.1 minimatch: 9.0.5 semver: 7.6.2 eslint-plugin-no-only-tests@3.1.0: {} - eslint-plugin-perfectionist@2.11.0(eslint@9.6.0)(svelte@3.59.1)(typescript@5.5.2)(vue-eslint-parser@9.4.3(eslint@9.6.0)): + eslint-plugin-perfectionist@2.11.0(eslint@9.7.0)(svelte@3.59.1)(typescript@5.5.3)(vue-eslint-parser@9.4.3(eslint@9.7.0)): dependencies: - '@typescript-eslint/utils': 7.13.0(eslint@9.6.0)(typescript@5.5.2) - eslint: 9.6.0 + '@typescript-eslint/utils': 7.14.1(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 minimatch: 9.0.5 natural-compare-lite: 1.4.0 optionalDependencies: svelte: 3.59.1 - vue-eslint-parser: 9.4.3(eslint@9.6.0) + vue-eslint-parser: 9.4.3(eslint@9.7.0) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-regexp@2.6.0(eslint@9.6.0): + eslint-plugin-regexp@2.6.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@eslint-community/regexpp': 4.10.0 comment-parser: 1.4.1 - eslint: 9.6.0 + eslint: 9.7.0 jsdoc-type-pratt-parser: 4.0.0 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 - eslint-plugin-toml@0.11.1(eslint@9.6.0): + eslint-plugin-toml@0.11.1(eslint@9.7.0): dependencies: debug: 4.3.5 - eslint: 9.6.0 - eslint-compat-utils: 0.5.0(eslint@9.6.0) + eslint: 9.7.0 + eslint-compat-utils: 0.5.0(eslint@9.7.0) lodash: 4.17.21 toml-eslint-parser: 0.10.0 transitivePeerDependencies: - supports-color - eslint-plugin-unicorn@54.0.0(eslint@9.6.0): + eslint-plugin-unicorn@54.0.0(eslint@9.7.0): dependencies: '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) '@eslint/eslintrc': 3.1.0 ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.37.1 - eslint: 9.6.0 + eslint: 9.7.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -13703,53 +13770,53 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0): + eslint-plugin-unused-imports@4.0.0(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0): dependencies: - eslint: 9.6.0 + eslint: 9.7.0 eslint-rule-composer: 0.3.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2) + '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3) - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2)(vitest@packages+vitest): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@packages+vitest): dependencies: - '@typescript-eslint/utils': 7.13.0(eslint@9.6.0)(typescript@5.5.2) - eslint: 9.6.0 + '@typescript-eslint/utils': 7.14.1(eslint@9.7.0)(typescript@5.5.3) + eslint: 9.7.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.14.1(@typescript-eslint/parser@7.14.1(eslint@9.6.0)(typescript@5.5.2))(eslint@9.6.0)(typescript@5.5.2) + '@typescript-eslint/eslint-plugin': 8.0.0-alpha.40(@typescript-eslint/parser@8.0.0-alpha.40(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3) vitest: link:packages/vitest transitivePeerDependencies: - supports-color - typescript - eslint-plugin-vue@9.26.0(eslint@9.6.0): + eslint-plugin-vue@9.27.0(eslint@9.7.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - eslint: 9.6.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + eslint: 9.7.0 globals: 13.24.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.16 semver: 7.6.2 - vue-eslint-parser: 9.4.3(eslint@9.6.0) + vue-eslint-parser: 9.4.3(eslint@9.7.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-yml@1.14.0(eslint@9.6.0): + eslint-plugin-yml@1.14.0(eslint@9.7.0): dependencies: debug: 4.3.5 - eslint: 9.6.0 - eslint-compat-utils: 0.5.0(eslint@9.6.0) + eslint: 9.7.0 + eslint-compat-utils: 0.5.0(eslint@9.7.0) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.3 transitivePeerDependencies: - supports-color - eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.31)(eslint@9.6.0): + eslint-processor-vue-blocks@0.1.2(@vue/compiler-sfc@3.4.31)(eslint@9.7.0): dependencies: '@vue/compiler-sfc': 3.4.31 - eslint: 9.6.0 + eslint: 9.7.0 eslint-rule-composer@0.3.0: {} @@ -13758,7 +13825,7 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-scope@8.0.1: + eslint-scope@8.0.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -13767,13 +13834,13 @@ snapshots: eslint-visitor-keys@4.0.0: {} - eslint@9.6.0: + eslint@9.7.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.7.0) + '@eslint-community/regexpp': 4.11.0 '@eslint/config-array': 0.17.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.6.0 + '@eslint/js': 9.7.0 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.0 '@nodelib/fs.walk': 1.2.8 @@ -13782,7 +13849,7 @@ snapshots: cross-spawn: 7.0.3 debug: 4.3.5 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 + eslint-scope: 8.0.2 eslint-visitor-keys: 4.0.0 espree: 10.1.0 esquery: 1.5.0 @@ -13808,12 +13875,6 @@ snapshots: esm-env@1.0.0: {} - espree@10.0.1: - dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) - eslint-visitor-keys: 4.0.0 - espree@10.1.0: dependencies: acorn: 8.12.0 @@ -13836,6 +13897,10 @@ snapshots: dependencies: estraverse: 5.3.0 + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -14122,11 +14187,11 @@ snapshots: flatted@3.3.1: {} - floating-vue@5.2.2(vue@3.4.31(typescript@5.5.2)): + floating-vue@5.2.2(vue@3.4.31(typescript@5.5.3)): dependencies: '@floating-ui/dom': 1.1.1 - vue: 3.4.31(typescript@5.5.2) - vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.2)) + vue: 3.4.31(typescript@5.5.3) + vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)) focus-trap@7.5.4: dependencies: @@ -14357,7 +14422,7 @@ snapshots: globals@14.0.0: {} - globals@15.7.0: {} + globals@15.8.0: {} globalthis@1.0.3: dependencies: @@ -14884,7 +14949,7 @@ snapshots: jest-util@29.0.1: dependencies: '@jest/types': 29.0.1 - '@types/node': 20.14.9 + '@types/node': 20.14.10 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15571,7 +15636,7 @@ snapshots: minipass@7.1.2: {} - minisearch@6.3.0: {} + minisearch@7.0.0: {} minizlib@2.1.2: dependencies: @@ -15613,7 +15678,7 @@ snapshots: ms@2.1.3: {} - msw@2.3.1(typescript@5.5.2): + msw@2.3.1(typescript@5.5.3): dependencies: '@bundled-es-modules/cookie': 2.0.0 '@bundled-es-modules/statuses': 1.0.1 @@ -15633,7 +15698,7 @@ snapshots: type-fest: 4.20.0 yargs: 17.7.2 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 muggle-string@0.3.1: {} @@ -15868,7 +15933,7 @@ snapshots: parse-gitignore@2.0.0: {} - parse-imports@2.1.0: + parse-imports@2.1.1: dependencies: es-module-lexer: 1.5.4 slashes: 3.0.12 @@ -15973,7 +16038,7 @@ snapshots: playwright-core@1.41.0: {} - playwright-core@1.45.0: {} + playwright-core@1.45.1: {} playwright@1.41.0: dependencies: @@ -15981,9 +16046,9 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - playwright@1.45.0: + playwright@1.45.1: dependencies: - playwright-core: 1.45.0 + playwright-core: 1.45.1 optionalDependencies: fsevents: 2.3.2 @@ -16087,16 +16152,16 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@20.9.0(typescript@5.5.2): + puppeteer-core@20.9.0(typescript@5.5.3): dependencies: - '@puppeteer/browsers': 1.4.6(typescript@5.5.2) + '@puppeteer/browsers': 1.4.6(typescript@5.5.3) chromium-bidi: 0.4.16(devtools-protocol@0.0.1147663) cross-fetch: 4.0.0 debug: 4.3.4 devtools-protocol: 0.0.1147663 ws: 8.13.0 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - bufferutil - encoding @@ -16315,6 +16380,8 @@ snapshots: rfdc@1.3.1: {} + rfdc@1.4.1: {} + rgb2hex@0.2.5: {} rimraf@2.7.1: @@ -16334,26 +16401,26 @@ snapshots: globby: 10.0.1 is-plain-object: 3.0.1 - rollup-plugin-dts@6.1.1(rollup@4.18.0)(typescript@5.5.2): + rollup-plugin-dts@6.1.1(rollup@4.18.1)(typescript@5.5.3): dependencies: magic-string: 0.30.10 - rollup: 4.18.0 - typescript: 5.5.2 + rollup: 4.18.1 + typescript: 5.5.3 optionalDependencies: '@babel/code-frame': 7.24.7 - rollup-plugin-esbuild@6.1.1(esbuild@0.22.0)(rollup@4.18.0): + rollup-plugin-esbuild@6.1.1(esbuild@0.23.0)(rollup@4.18.1): dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.18.0) + '@rollup/pluginutils': 5.0.5(rollup@4.18.1) debug: 4.3.5 es-module-lexer: 1.3.1 - esbuild: 0.22.0 + esbuild: 0.23.0 get-tsconfig: 4.7.5 - rollup: 4.18.0 + rollup: 4.18.1 transitivePeerDependencies: - supports-color - rollup-plugin-license@3.5.1(rollup@4.18.0): + rollup-plugin-license@3.5.2(rollup@4.18.1): dependencies: commenting: 1.1.0 fdir: 6.1.1 @@ -16361,32 +16428,32 @@ snapshots: magic-string: 0.30.10 moment: 2.30.1 package-name-regex: 2.0.6 - rollup: 4.18.0 + rollup: 4.18.1 spdx-expression-validate: 2.0.0 spdx-satisfies: 5.0.1 transitivePeerDependencies: - picomatch - rollup@4.18.0: + rollup@4.18.1: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.18.1 + '@rollup/rollup-android-arm64': 4.18.1 + '@rollup/rollup-darwin-arm64': 4.18.1 + '@rollup/rollup-darwin-x64': 4.18.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.1 + '@rollup/rollup-linux-arm-musleabihf': 4.18.1 + '@rollup/rollup-linux-arm64-gnu': 4.18.1 + '@rollup/rollup-linux-arm64-musl': 4.18.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.1 + '@rollup/rollup-linux-riscv64-gnu': 4.18.1 + '@rollup/rollup-linux-s390x-gnu': 4.18.1 + '@rollup/rollup-linux-x64-gnu': 4.18.1 + '@rollup/rollup-linux-x64-musl': 4.18.1 + '@rollup/rollup-win32-arm64-msvc': 4.18.1 + '@rollup/rollup-win32-ia32-msvc': 4.18.1 + '@rollup/rollup-win32-x64-msvc': 4.18.1 fsevents: 2.3.3 rrweb-cssom@0.6.0: {} @@ -16556,13 +16623,10 @@ snapshots: shebang-regex@3.0.0: {} - shiki@1.10.0: - dependencies: - '@shikijs/core': 1.10.0 - - shiki@1.6.4: + shiki@1.10.3: dependencies: - '@shikijs/core': 1.6.4 + '@shikijs/core': 1.10.3 + '@types/hast': 3.0.4 side-channel@1.0.4: dependencies: @@ -16736,6 +16800,8 @@ snapshots: splitpanes@3.1.5: {} + stable-hash@0.0.4: {} + stack-trace@1.0.0-pre2: {} stack-utils@2.0.5: @@ -16872,6 +16938,10 @@ snapshots: transitivePeerDependencies: - supports-color + superjson@2.2.1: + dependencies: + copy-anything: 3.0.5 + supertest@6.3.4: dependencies: methods: 1.1.2 @@ -17084,15 +17154,15 @@ snapshots: trim-lines@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.5.2): + ts-api-utils@1.3.0(typescript@5.5.3): dependencies: - typescript: 5.5.2 + typescript: 5.5.3 tslib@2.5.3: {} tslib@2.6.2: {} - tsx@4.16.0: + tsx@4.16.2: dependencies: esbuild: 0.21.5 get-tsconfig: 4.7.5 @@ -17112,20 +17182,20 @@ snapshots: twoslash-protocol@0.2.9: {} - twoslash-vue@0.2.9(typescript@5.5.2): + twoslash-vue@0.2.9(typescript@5.5.3): dependencies: - '@vue/language-core': 2.0.24(typescript@5.5.2) - twoslash: 0.2.9(typescript@5.5.2) + '@vue/language-core': 2.0.24(typescript@5.5.3) + twoslash: 0.2.9(typescript@5.5.3) twoslash-protocol: 0.2.9 - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color - twoslash@0.2.9(typescript@5.5.2): + twoslash@0.2.9(typescript@5.5.3): dependencies: '@typescript/vfs': 1.5.0 twoslash-protocol: 0.2.9 - typescript: 5.5.2 + typescript: 5.5.3 transitivePeerDependencies: - supports-color @@ -17189,7 +17259,7 @@ snapshots: typescript@5.4.5: {} - typescript@5.5.2: {} + typescript@5.5.3: {} ufo@1.5.3: {} @@ -17239,9 +17309,9 @@ snapshots: unicorn-magic@0.1.0: {} - unimport@3.7.2(rollup@4.18.0): + unimport@3.7.2(rollup@4.18.1): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) acorn: 8.12.0 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 @@ -17294,30 +17364,30 @@ snapshots: universalify@2.0.0: {} - unocss@0.61.0(postcss@8.4.39)(rollup@4.18.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)): - dependencies: - '@unocss/astro': 0.61.0(rollup@4.18.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) - '@unocss/cli': 0.61.0(rollup@4.18.0) - '@unocss/core': 0.61.0 - '@unocss/extractor-arbitrary-variants': 0.61.0 - '@unocss/postcss': 0.61.0(postcss@8.4.39) - '@unocss/preset-attributify': 0.61.0 - '@unocss/preset-icons': 0.61.0 - '@unocss/preset-mini': 0.61.0 - '@unocss/preset-tagify': 0.61.0 - '@unocss/preset-typography': 0.61.0 - '@unocss/preset-uno': 0.61.0 - '@unocss/preset-web-fonts': 0.61.0 - '@unocss/preset-wind': 0.61.0 - '@unocss/reset': 0.61.0 - '@unocss/transformer-attributify-jsx': 0.61.0 - '@unocss/transformer-attributify-jsx-babel': 0.61.0 - '@unocss/transformer-compile-class': 0.61.0 - '@unocss/transformer-directives': 0.61.0 - '@unocss/transformer-variant-group': 0.61.0 - '@unocss/vite': 0.61.0(rollup@4.18.0)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + unocss@0.61.3(postcss@8.4.39)(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)): + dependencies: + '@unocss/astro': 0.61.3(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) + '@unocss/cli': 0.61.3(rollup@4.18.1) + '@unocss/core': 0.61.3 + '@unocss/extractor-arbitrary-variants': 0.61.3 + '@unocss/postcss': 0.61.3(postcss@8.4.39) + '@unocss/preset-attributify': 0.61.3 + '@unocss/preset-icons': 0.61.3 + '@unocss/preset-mini': 0.61.3 + '@unocss/preset-tagify': 0.61.3 + '@unocss/preset-typography': 0.61.3 + '@unocss/preset-uno': 0.61.3 + '@unocss/preset-web-fonts': 0.61.3 + '@unocss/preset-wind': 0.61.3 + '@unocss/reset': 0.61.3 + '@unocss/transformer-attributify-jsx': 0.61.3 + '@unocss/transformer-attributify-jsx-babel': 0.61.3 + '@unocss/transformer-compile-class': 0.61.3 + '@unocss/transformer-directives': 0.61.3 + '@unocss/transformer-variant-group': 0.61.3 + '@unocss/vite': 0.61.3(rollup@4.18.1)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) optionalDependencies: - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) transitivePeerDependencies: - postcss - rollup @@ -17325,34 +17395,34 @@ snapshots: unpipe@1.0.0: {} - unplugin-auto-import@0.18.0(@vueuse/core@10.11.0(vue@3.4.31(typescript@5.5.2)))(rollup@4.18.0): + unplugin-auto-import@0.18.0(@vueuse/core@10.11.0(vue@3.4.31(typescript@5.5.3)))(rollup@4.18.1): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) fast-glob: 3.3.2 local-pkg: 0.5.0 magic-string: 0.30.10 minimatch: 9.0.5 - unimport: 3.7.2(rollup@4.18.0) + unimport: 3.7.2(rollup@4.18.1) unplugin: 1.11.0 optionalDependencies: - '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.5.2)) + '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.5.3)) transitivePeerDependencies: - rollup - unplugin-swc@1.4.4(@swc/core@1.4.1)(rollup@4.18.0): + unplugin-swc@1.4.4(@swc/core@1.4.1)(rollup@4.18.1): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) '@swc/core': 1.4.1 load-tsconfig: 0.2.5 unplugin: 1.7.1 transitivePeerDependencies: - rollup - unplugin-vue-components@0.27.2(@babel/parser@7.24.7)(rollup@4.18.0)(vue@3.4.31(typescript@5.5.2)): + unplugin-vue-components@0.27.2(@babel/parser@7.24.7)(rollup@4.18.1)(vue@3.4.31(typescript@5.5.3)): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.0(rollup@4.18.0) + '@rollup/pluginutils': 5.1.0(rollup@4.18.1) chokidar: 3.6.0 debug: 4.3.5 fast-glob: 3.3.2 @@ -17361,7 +17431,7 @@ snapshots: minimatch: 9.0.5 mlly: 1.7.1 unplugin: 1.10.1 - vue: 3.4.31(typescript@5.5.2) + vue: 3.4.31(typescript@5.5.3) optionalDependencies: '@babel/parser': 7.24.7 transitivePeerDependencies: @@ -17471,7 +17541,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-plugin-pages@0.32.3(@vue/compiler-sfc@3.4.31)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(vue-router@4.4.0(vue@3.4.31(typescript@5.5.2))): + vite-plugin-pages@0.32.3(@vue/compiler-sfc@3.4.31)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(vue-router@4.4.0(vue@3.4.31(typescript@5.5.3))): dependencies: '@types/debug': 4.1.12 debug: 4.3.5 @@ -17481,20 +17551,20 @@ snapshots: json5: 2.2.3 local-pkg: 0.5.0 picocolors: 1.0.1 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) yaml: 2.4.5 optionalDependencies: '@vue/compiler-sfc': 3.4.31 - vue-router: 4.4.0(vue@3.4.31(typescript@5.5.2)) + vue-router: 4.4.0(vue@3.4.31(typescript@5.5.3)) transitivePeerDependencies: - supports-color - vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0): + vite-plugin-pwa@0.20.0(@vite-pwa/assets-generator@0.2.4)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.1.0): dependencies: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) workbox-build: 7.1.0(@types/babel__core@7.20.5) workbox-window: 7.1.0 optionalDependencies: @@ -17502,7 +17572,7 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-solid@2.7.2(solid-js@1.8.3)(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)): + vite-plugin-solid@2.7.2(solid-js@1.8.3)(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)): dependencies: '@babel/core': 7.23.3 '@babel/preset-typescript': 7.23.2(@babel/core@7.23.3) @@ -17511,8 +17581,8 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.8.3 solid-refresh: 0.5.3(solid-js@1.8.3) - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) - vitefu: 0.2.4(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) + vitefu: 0.2.4(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)) transitivePeerDependencies: - supports-color @@ -17520,48 +17590,48 @@ snapshots: dependencies: esbuild: 0.21.5 postcss: 8.4.39 - rollup: 4.18.0 + rollup: 4.18.1 optionalDependencies: '@types/node': 20.11.5 fsevents: 2.3.3 terser: 5.22.0 - vite@5.3.3(@types/node@20.14.9)(terser@5.22.0): + vite@5.3.3(@types/node@20.14.10)(terser@5.22.0): dependencies: esbuild: 0.21.5 postcss: 8.4.39 - rollup: 4.18.0 + rollup: 4.18.1 optionalDependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 fsevents: 2.3.3 terser: 5.22.0 - vitefu@0.2.4(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)): + vitefu@0.2.4(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)): optionalDependencies: - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) - vitefu@0.2.5(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0)): + vitefu@0.2.5(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0)): optionalDependencies: - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) - vitepress@1.2.3(@algolia/client-search@4.20.0)(@types/node@20.14.9)(@types/react@18.2.79)(axios@0.26.1)(postcss@8.4.39)(react-dom@18.0.0(react@18.2.0))(react@18.2.0)(search-insights@2.9.0)(terser@5.22.0)(typescript@5.5.2): + vitepress@1.3.1(@algolia/client-search@4.20.0)(@types/node@20.14.10)(@types/react@18.2.79)(postcss@8.4.39)(react-dom@18.0.0(react@18.2.0))(react@18.2.0)(search-insights@2.9.0)(terser@5.22.0)(typescript@5.5.3): dependencies: '@docsearch/css': 3.6.0 '@docsearch/js': 3.6.0(@algolia/client-search@4.20.0)(@types/react@18.2.79)(react-dom@18.0.0(react@18.2.0))(react@18.2.0)(search-insights@2.9.0) - '@shikijs/core': 1.6.4 - '@shikijs/transformers': 1.6.4 + '@shikijs/core': 1.10.3 + '@shikijs/transformers': 1.10.3 '@types/markdown-it': 14.1.1 - '@vitejs/plugin-vue': 5.0.5(vite@5.3.3(@types/node@20.14.9)(terser@5.22.0))(vue@3.4.31(typescript@5.5.2)) - '@vue/devtools-api': 7.2.1(vue@3.4.31(typescript@5.5.2)) - '@vue/shared': 3.4.27 - '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.5.2)) - '@vueuse/integrations': 10.10.1(axios@0.26.1)(focus-trap@7.5.4)(vue@3.4.31(typescript@5.5.2)) + '@vitejs/plugin-vue': 5.0.5(vite@5.3.3(@types/node@20.14.10)(terser@5.22.0))(vue@3.4.31(typescript@5.5.3)) + '@vue/devtools-api': 7.3.6 + '@vue/shared': 3.4.31 + '@vueuse/core': 10.11.0(vue@3.4.31(typescript@5.5.3)) + '@vueuse/integrations': 10.11.0(focus-trap@7.5.4)(vue@3.4.31(typescript@5.5.3)) focus-trap: 7.5.4 mark.js: 8.11.1 - minisearch: 6.3.0 - shiki: 1.6.4 - vite: 5.3.3(@types/node@20.14.9)(terser@5.22.0) - vue: 3.4.31(typescript@5.5.2) + minisearch: 7.0.0 + shiki: 1.10.3 + vite: 5.3.3(@types/node@20.14.10)(terser@5.22.0) + vue: 3.4.31(typescript@5.5.3) optionalDependencies: postcss: 8.4.39 transitivePeerDependencies: @@ -17599,22 +17669,22 @@ snapshots: vue-component-type-helpers@2.0.17: {} - vue-demi@0.14.7(vue@3.4.26(typescript@5.5.2)): + vue-demi@0.14.7(vue@3.4.26(typescript@5.5.3)): dependencies: - vue: 3.4.26(typescript@5.5.2) + vue: 3.4.26(typescript@5.5.3) - vue-demi@0.14.8(vue@3.4.26(typescript@5.5.2)): + vue-demi@0.14.8(vue@3.4.26(typescript@5.5.3)): dependencies: - vue: 3.4.26(typescript@5.5.2) + vue: 3.4.26(typescript@5.5.3) - vue-demi@0.14.8(vue@3.4.31(typescript@5.5.2)): + vue-demi@0.14.8(vue@3.4.31(typescript@5.5.3)): dependencies: - vue: 3.4.31(typescript@5.5.2) + vue: 3.4.31(typescript@5.5.3) - vue-eslint-parser@9.4.3(eslint@9.6.0): + vue-eslint-parser@9.4.3(eslint@9.7.0): dependencies: debug: 4.3.5 - eslint: 9.6.0 + eslint: 9.7.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -17624,18 +17694,18 @@ snapshots: transitivePeerDependencies: - supports-color - vue-observe-visibility@2.0.0-alpha.1(vue@3.4.31(typescript@5.5.2)): + vue-observe-visibility@2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)): dependencies: - vue: 3.4.31(typescript@5.5.2) + vue: 3.4.31(typescript@5.5.3) - vue-resize@2.0.0-alpha.1(vue@3.4.31(typescript@5.5.2)): + vue-resize@2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)): dependencies: - vue: 3.4.31(typescript@5.5.2) + vue: 3.4.31(typescript@5.5.3) - vue-router@4.4.0(vue@3.4.31(typescript@5.5.2)): + vue-router@4.4.0(vue@3.4.31(typescript@5.5.3)): dependencies: '@vue/devtools-api': 6.5.1 - vue: 3.4.31(typescript@5.5.2) + vue: 3.4.31(typescript@5.5.3) vue-template-compiler@2.7.15: dependencies: @@ -17649,32 +17719,32 @@ snapshots: semver: 7.5.4 typescript: 5.2.2 - vue-virtual-scroller@2.0.0-beta.8(vue@3.4.31(typescript@5.5.2)): + vue-virtual-scroller@2.0.0-beta.8(vue@3.4.31(typescript@5.5.3)): dependencies: mitt: 2.1.0 - vue: 3.4.31(typescript@5.5.2) - vue-observe-visibility: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.2)) - vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.2)) + vue: 3.4.31(typescript@5.5.3) + vue-observe-visibility: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)) + vue-resize: 2.0.0-alpha.1(vue@3.4.31(typescript@5.5.3)) - vue@3.4.26(typescript@5.5.2): + vue@3.4.26(typescript@5.5.3): dependencies: '@vue/compiler-dom': 3.4.26 '@vue/compiler-sfc': 3.4.26 '@vue/runtime-dom': 3.4.26 - '@vue/server-renderer': 3.4.26(vue@3.4.26(typescript@5.5.2)) + '@vue/server-renderer': 3.4.26(vue@3.4.26(typescript@5.5.3)) '@vue/shared': 3.4.26 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 - vue@3.4.31(typescript@5.5.2): + vue@3.4.31(typescript@5.5.3): dependencies: '@vue/compiler-dom': 3.4.31 '@vue/compiler-sfc': 3.4.31 '@vue/runtime-dom': 3.4.31 - '@vue/server-renderer': 3.4.31(vue@3.4.31(typescript@5.5.2)) + '@vue/server-renderer': 3.4.31(vue@3.4.31(typescript@5.5.3)) '@vue/shared': 3.4.31 optionalDependencies: - typescript: 5.5.2 + typescript: 5.5.3 w3c-xmlserializer@5.0.0: dependencies: @@ -17700,8 +17770,8 @@ snapshots: webdriver@8.32.2: dependencies: - '@types/node': 20.14.9 - '@types/ws': 8.5.10 + '@types/node': 20.14.10 + '@types/ws': 8.5.11 '@wdio/config': 8.32.2 '@wdio/logger': 8.28.0 '@wdio/protocols': 8.32.0 @@ -17710,7 +17780,7 @@ snapshots: deepmerge-ts: 5.1.0 got: 12.6.1 ky: 0.33.3 - ws: 8.17.1 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - supports-color @@ -17718,8 +17788,8 @@ snapshots: webdriver@8.39.0: dependencies: - '@types/node': 20.14.9 - '@types/ws': 8.5.10 + '@types/node': 20.14.10 + '@types/ws': 8.5.11 '@wdio/config': 8.39.0 '@wdio/logger': 8.38.0 '@wdio/protocols': 8.38.0 @@ -17728,13 +17798,13 @@ snapshots: deepmerge-ts: 5.1.0 got: 12.6.1 ky: 0.33.3 - ws: 8.17.1 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - webdriverio@8.32.2(typescript@5.5.2): + webdriverio@8.32.2(typescript@5.5.3): dependencies: '@types/node': 20.11.19 '@wdio/config': 8.32.2 @@ -17754,7 +17824,7 @@ snapshots: lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 minimatch: 9.0.3 - puppeteer-core: 20.9.0(typescript@5.5.2) + puppeteer-core: 20.9.0(typescript@5.5.3) query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 @@ -17767,43 +17837,9 @@ snapshots: - typescript - utf-8-validate - webdriverio@8.39.0(typescript@5.5.2): + webdriverio@8.39.1(typescript@5.5.3): dependencies: - '@types/node': 20.14.9 - '@wdio/config': 8.39.0 - '@wdio/logger': 8.38.0 - '@wdio/protocols': 8.38.0 - '@wdio/repl': 8.24.12 - '@wdio/types': 8.39.0 - '@wdio/utils': 8.39.0 - archiver: 7.0.1 - aria-query: 5.3.0 - css-shorthand-properties: 1.1.1 - css-value: 0.0.1 - devtools-protocol: 0.0.1302984 - grapheme-splitter: 1.0.4 - import-meta-resolve: 4.0.0 - is-plain-obj: 4.1.0 - jszip: 3.10.1 - lodash.clonedeep: 4.5.0 - lodash.zip: 4.2.0 - minimatch: 9.0.4 - puppeteer-core: 20.9.0(typescript@5.5.2) - query-selector-shadow-dom: 1.0.1 - resq: 1.11.0 - rgb2hex: 0.2.5 - serialize-error: 11.0.2 - webdriver: 8.39.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - - webdriverio@8.39.1(typescript@5.5.2): - dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@wdio/config': 8.39.0 '@wdio/logger': 8.38.0 '@wdio/protocols': 8.38.0 @@ -17822,7 +17858,7 @@ snapshots: lodash.clonedeep: 4.5.0 lodash.zip: 4.2.0 minimatch: 9.0.5 - puppeteer-core: 20.9.0(typescript@5.5.2) + puppeteer-core: 20.9.0(typescript@5.5.3) query-selector-shadow-dom: 1.0.1 resq: 1.11.0 rgb2hex: 0.2.5 @@ -17900,7 +17936,7 @@ snapshots: dependencies: isexe: 3.1.1 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -17920,10 +17956,10 @@ snapshots: '@babel/core': 7.24.7 '@babel/preset-env': 7.23.2(@babel/core@7.24.7) '@babel/runtime': 7.24.4 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.7)(@types/babel__core@7.20.5)(rollup@4.18.0) - '@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.0) - '@rollup/plugin-replace': 2.4.2(rollup@4.18.0) - '@rollup/plugin-terser': 0.4.4(rollup@4.18.0) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.7)(@types/babel__core@7.20.5)(rollup@4.18.1) + '@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.1) + '@rollup/plugin-replace': 2.4.2(rollup@4.18.1) + '@rollup/plugin-terser': 0.4.4(rollup@4.18.1) '@surma/rollup-plugin-off-main-thread': 2.2.3 ajv: 8.12.0 common-tags: 1.8.2 @@ -17932,7 +17968,7 @@ snapshots: glob: 7.2.3 lodash: 4.17.21 pretty-bytes: 5.6.0 - rollup: 4.18.0 + rollup: 4.18.1 source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 @@ -18044,6 +18080,8 @@ snapshots: ws@8.17.1: {} + ws@8.18.0: {} + xml-name-validator@4.0.0: {} xml-name-validator@5.0.0: {} @@ -18060,9 +18098,7 @@ snapshots: dependencies: eslint-visitor-keys: 3.4.3 lodash: 4.17.21 - yaml: 2.4.2 - - yaml@2.4.2: {} + yaml: 2.4.5 yaml@2.4.5: {} @@ -18119,7 +18155,7 @@ snapshots: zwitch@2.0.4: {} - zx@8.1.3: + zx@8.1.4: optionalDependencies: '@types/fs-extra': 11.0.4 - '@types/node': 20.14.9 + '@types/node': 20.14.10 diff --git a/test/core/package.json b/test/core/package.json index dfbe63a501de..2439a810a807 100644 --- a/test/core/package.json +++ b/test/core/package.json @@ -28,6 +28,7 @@ "tinyrainbow": "^1.2.0", "tinyspy": "^1.0.2", "url": "^0.11.0", + "vite-node": "workspace:*", "vitest": "workspace:*", "vitest-environment-custom": "file:./vitest-environment-custom", "vue": "^3.4.26", diff --git a/test/core/src/file-txt.txt b/test/core/src/file-txt.txt new file mode 100644 index 000000000000..8e27be7d6154 --- /dev/null +++ b/test/core/src/file-txt.txt @@ -0,0 +1 @@ +text diff --git a/test/core/src/mocks/retry-dynamic-import.ts b/test/core/src/mocks/retry-dynamic-import.ts index 3b3593c207fb..58dc09e0341c 100644 --- a/test/core/src/mocks/retry-dynamic-import.ts +++ b/test/core/src/mocks/retry-dynamic-import.ts @@ -4,7 +4,7 @@ export async function retryDynamicImport() { try { return await import('./dynamic-module') } - catch (e) { + catch { if (retryTimes === 3) { throw new Error('import dynamic module failed.') } diff --git a/test/core/src/wasm/wasm-bindgen/index_bg.js b/test/core/src/wasm/wasm-bindgen/index_bg.js index b673cdc4f66f..809d7412290a 100644 --- a/test/core/src/wasm/wasm-bindgen/index_bg.js +++ b/test/core/src/wasm/wasm-bindgen/index_bg.js @@ -47,7 +47,7 @@ function logError(f, args) { ? `${e.message}\n\nStack:\n${e.stack}` : e.toString() } - catch (_) { + catch { return '' } })() diff --git a/test/core/test/__snapshots__/jest-expect.test.ts.snap b/test/core/test/__snapshots__/jest-expect.test.ts.snap index 3e92bdac56d4..a8aff8bc9627 100644 --- a/test/core/test/__snapshots__/jest-expect.test.ts.snap +++ b/test/core/test/__snapshots__/jest-expect.test.ts.snap @@ -344,11 +344,8 @@ exports[`toHaveBeenNthCalledWith error 2`] = ` exports[`toMatch/toContain diff 1`] = ` { "actual": "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", - "diff": "- Expected -+ Received - -- world -+ hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", + "diff": "Expected: "world" +Received: "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello"", "expected": "world", "message": "expected 'hellohellohellohellohellohellohellohe…' to contain 'world'", } @@ -357,11 +354,8 @@ exports[`toMatch/toContain diff 1`] = ` exports[`toMatch/toContain diff 2`] = ` { "actual": "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", - "diff": "- Expected -+ Received - -- world -+ hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", + "diff": "Expected: "world" +Received: "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello"", "expected": "world", "message": "expected 'hellohellohellohellohellohellohellohe…' to match 'world'", } diff --git a/test/core/test/chainable.test.ts b/test/core/test/chainable.test.ts index d5f880f7c308..35b284affa5c 100644 --- a/test/core/test/chainable.test.ts +++ b/test/core/test/chainable.test.ts @@ -10,6 +10,7 @@ describe('chainable', () => { expect(chain()).toEqual({}) expect(chain.a()).toEqual({ a: true }) + // eslint-disable-next-line ts/no-unused-expressions chain.a expect(chain()).toEqual({}) diff --git a/test/core/test/diff.test.ts b/test/core/test/diff.test.ts index 1cc368fb95f6..5e027808499b 100644 --- a/test/core/test/diff.test.ts +++ b/test/core/test/diff.test.ts @@ -1,10 +1,23 @@ import { expect, test, vi } from 'vitest' import stripAnsi from 'strip-ansi' import type { DiffOptions } from '@vitest/utils/diff' -import { diff, diffStringsUnified } from '@vitest/utils/diff' +import { diff, diffStringsUnified, printDiffOrStringify } from '@vitest/utils/diff' import { processError } from '@vitest/runner' import { displayDiff } from '../../../packages/vitest/src/node/error' +test('displays string diff', () => { + const stringA = 'Hello AWorld' + const stringB = 'Hello BWorld' + const console = { log: vi.fn(), error: vi.fn() } + displayDiff(printDiffOrStringify(stringA, stringB), console as any) + expect(stripAnsi(console.error.mock.calls[0][0])).toMatchInlineSnapshot(` + " + Expected: "Hello BWorld" + Received: "Hello AWorld" + " + `) +}) + test('displays object diff', () => { const objectA = { a: 1, b: 2 } const objectB = { a: 1, b: 3 } diff --git a/test/core/test/environments/jsdom.spec.ts b/test/core/test/environments/jsdom.spec.ts index c0a32408a880..95f196fa0d0a 100644 --- a/test/core/test/environments/jsdom.spec.ts +++ b/test/core/test/environments/jsdom.spec.ts @@ -71,11 +71,8 @@ test('toContain correctly handles DOM nodes', () => { } catch (err: any) { expect(stripAnsi(processError(err).diff)).toMatchInlineSnapshot(` - "- Expected - + Received - - - flex flex-col flex-row - + flex flex-col" + "Expected: "flex flex-col flex-row" + Received: "flex flex-col"" `) } @@ -85,11 +82,8 @@ test('toContain correctly handles DOM nodes', () => { } catch (err: any) { expect(stripAnsi(processError(err).diff)).toMatchInlineSnapshot(` - "- Expected - + Received - - - flex-col - + flex flex-col" + "Expected: "flex-col" + Received: "flex flex-col"" `) } }) diff --git a/test/core/test/jest-expect.test.ts b/test/core/test/jest-expect.test.ts index 67ed5dbe2f18..c057bb825c43 100644 --- a/test/core/test/jest-expect.test.ts +++ b/test/core/test/jest-expect.test.ts @@ -1066,11 +1066,8 @@ it('toHaveProperty error diff', () => { expect(getError(() => expect({ name: 'foo' }).toHaveProperty('name', 'bar'))).toMatchInlineSnapshot(` [ "expected { name: 'foo' } to have property "name" with value 'bar'", - "- Expected - + Received - - - bar - + foo", + "Expected: "bar" + Received: "foo"", ] `) @@ -1114,11 +1111,8 @@ it('toHaveProperty error diff', () => { expect(getError(() => expect({ parent: { name: 'foo' } }).toHaveProperty('parent.name', 'bar'))).toMatchInlineSnapshot(` [ "expected { parent: { name: 'foo' } } to have property "parent.name" with value 'bar'", - "- Expected - + Received - - - bar - + foo", + "Expected: "bar" + Received: "foo"", ] `) diff --git a/test/core/test/replace-matcher.test.ts b/test/core/test/replace-matcher.test.ts index 3c77007650b0..42a95d0f8d4d 100644 --- a/test/core/test/replace-matcher.test.ts +++ b/test/core/test/replace-matcher.test.ts @@ -1,4 +1,4 @@ -import { replaceAsymmetricMatcher } from '@vitest/utils/error' +import { replaceAsymmetricMatcher } from '@vitest/utils/diff' import { describe, expect, it } from 'vitest' describe('replace asymmetric matcher', () => { diff --git a/test/core/test/require.test.ts b/test/core/test/require.test.ts index 4d66074db582..17df9ace9714 100644 --- a/test/core/test/require.test.ts +++ b/test/core/test/require.test.ts @@ -1,5 +1,6 @@ // @vitest-environment jsdom +// import { KNOWN_ASSET_RE } from 'vite-node/constants' import { describe, expect, it } from 'vitest' const _require = require @@ -11,9 +12,14 @@ describe('using "require" to import a module', () => { const scss = _require('./../src/file-scss.scss') const less = _require('./../src/file-less.less') - expect(css).toEqual({}) - expect(sass).toEqual({}) - expect(scss).toEqual({}) - expect(less).toEqual({}) + expect(css).toEqual('') + expect(sass).toEqual('') + expect(scss).toEqual('') + expect(less).toEqual('') + }) + + it('importing assets works', () => { + const path = _require.resolve('./../src/file-txt.txt') + expect(_require('./../src/file-txt.txt')).toBe(path) }) }) diff --git a/test/core/test/vi.spec.ts b/test/core/test/vi.spec.ts index 292aa1c19e3a..45a0b632ea85 100644 --- a/test/core/test/vi.spec.ts +++ b/test/core/test/vi.spec.ts @@ -152,6 +152,22 @@ describe('testing vi utils', () => { expectTypeOf(gSpy.mock.contexts).toEqualTypeOf() }) + test('mockImplementation types', async () => { + // overload + const fs = { readFileSync() {} } as any as typeof import('node:fs') + vi.spyOn(fs, 'readFileSync').mockImplementation(() => 'str') + vi.spyOn(fs, 'readFileSync').mockImplementation(() => Buffer.from('buf')) + vi.fn(fs.readFileSync).mockImplementation(() => 'str') + vi.fn(fs.readFileSync).mockImplementation(() => Buffer.from('buf')) + + // union + interface Handler { + (v: number): number + other: (v: number) => number + } + vi.fn().mockImplementation(v => v + 1) + }) + test('can change config', () => { const state = getWorkerState() expect(state.config.hookTimeout).toBe(10000) diff --git a/test/core/test/wait.test.ts b/test/core/test/wait.test.ts index 03a968c3bfb7..5061a365d315 100644 --- a/test/core/test/wait.test.ts +++ b/test/core/test/wait.test.ts @@ -114,7 +114,7 @@ describe('waitFor', () => { timeout: 50, }) } - catch (error) { + catch { timedOut = true } expect(timedOut).toBe(true) @@ -214,7 +214,7 @@ describe('waitUntil', () => { timeout: 50, }) } - catch (error) { + catch { timedOut = true } expect(timedOut).toBe(true) diff --git a/test/coverage-test/fixtures/src/should-be-excluded-by-default.cts b/test/coverage-test/fixtures/src/should-be-excluded-by-default.cts new file mode 100644 index 000000000000..8047d5ad4ce7 --- /dev/null +++ b/test/coverage-test/fixtures/src/should-be-excluded-by-default.cts @@ -0,0 +1,7 @@ +/* + * Vite does not transform `*.cts` files. + * If this file is picked by Istanbul provider, it will make Babel crash on TS syntax. + */ +interface Props { + name: string; +} diff --git a/test/coverage-test/test/configuration-options.test-d.ts b/test/coverage-test/test/configuration-options.test-d.ts index 5b3b8c1f7db3..67d33be7cdfa 100644 --- a/test/coverage-test/test/configuration-options.test-d.ts +++ b/test/coverage-test/test/configuration-options.test-d.ts @@ -38,6 +38,7 @@ test('provider options, generic', () => { 'statements': 100, '**/some-file.ts': { + 100: true, lines: 12, branches: 12, functions: 12, @@ -54,9 +55,14 @@ test('provider options, generic', () => { statements: [80, 95], }, thresholds: { - '100': true, + '100': false, + 'lines': 1, + 'autoUpdate': true, + 'perFile': true, + 'statements': 100, '**/some-file.ts': { + 100: false, lines: 12, branches: 12, functions: 12, diff --git a/test/coverage-test/test/empty-lines.v8.test.ts b/test/coverage-test/test/empty-lines.v8.test.ts index c6b3a2f6d8a2..7c55590327dc 100644 --- a/test/coverage-test/test/empty-lines.v8.test.ts +++ b/test/coverage-test/test/empty-lines.v8.test.ts @@ -12,7 +12,6 @@ type LineCoverage = Record describe('include empty lines', () => { let coveredFileLines: LineCoverage let uncoveredFileLines: LineCoverage - let files: string[] beforeAll(async () => { await runVitest({ @@ -28,16 +27,7 @@ describe('include empty lines', () => { }, }) - ;({ coveredFileLines, uncoveredFileLines, files } = await readCoverage()) - }) - - test('file containing only types is ignored', () => { - expect(files).toMatchInlineSnapshot(` - [ - "/fixtures/src/empty-lines.ts", - "/fixtures/src/untested-file.ts", - ] - `) + ;({ coveredFileLines, uncoveredFileLines } = await readCoverage()) }) test('lines are included', async () => { @@ -64,7 +54,7 @@ describe('include empty lines', () => { describe('ignore empty lines', () => { let coveredFileLines: LineCoverage let uncoveredFileLines: LineCoverage - let files: string[] + let typesOnlyFileLines: LineCoverage beforeAll(async () => { await runVitest({ @@ -79,16 +69,13 @@ describe('ignore empty lines', () => { }, }) - ;({ coveredFileLines, uncoveredFileLines, files } = await readCoverage()) + ;({ coveredFileLines, uncoveredFileLines, typesOnlyFileLines } = await readCoverage()) }) - test('file containing only types is ignored', () => { - expect(files).toMatchInlineSnapshot(` - [ - "/fixtures/src/empty-lines.ts", - "/fixtures/src/untested-file.ts", - ] - `) + test('file containing only types has no uncovered lines', () => { + expect(typesOnlyFileLines[1]).toBe(undefined) + expect(typesOnlyFileLines[2]).toBe(undefined) + expect(typesOnlyFileLines[3]).toBe(undefined) }) test('empty lines are ignored', async () => { @@ -184,12 +171,12 @@ coverageTest('cover some lines', () => { async function readCoverage() { const coverageMap = await readCoverageMap() - const files = coverageMap.files() const coveredFileLines = coverageMap.fileCoverageFor('/fixtures/src/empty-lines.ts').getLineCoverage() as LineCoverage const uncoveredFileLines = coverageMap.fileCoverageFor('/fixtures/src/untested-file.ts').getLineCoverage() as LineCoverage + const typesOnlyFileLines = coverageMap.fileCoverageFor('/fixtures/src/types-only.ts').getLineCoverage() as LineCoverage - return { coveredFileLines, uncoveredFileLines, files } + return { coveredFileLines, uncoveredFileLines, typesOnlyFileLines } } function range(count: number, options: { base: number } = { base: 1 }) { diff --git a/test/coverage-test/test/threshold-auto-update.test.ts b/test/coverage-test/test/threshold-auto-update.test.ts index cbce27e170cb..f39ea10158b9 100644 --- a/test/coverage-test/test/threshold-auto-update.test.ts +++ b/test/coverage-test/test/threshold-auto-update.test.ts @@ -53,10 +53,10 @@ test('thresholds.autoUpdate updates thresholds', async () => { autoUpdate: true, // Global ones - lines: 66.66, - functions: 50, + lines: 55.55, + functions: 33.33, branches: 100, - statements: 66.66, + statements: 55.55, '**/src/math.ts': { branches: 100, @@ -81,10 +81,10 @@ test('thresholds.autoUpdate updates thresholds', async () => { autoUpdate: true, // Global ones - lines: 50, - functions: 50, + lines: 33.33, + functions: 33.33, branches: 100, - statements: 50, + statements: 33.33, '**/src/math.ts': { branches: 100, diff --git a/test/coverage-test/test/threshold-glob.test.ts b/test/coverage-test/test/threshold-glob.test.ts new file mode 100644 index 000000000000..d1cba59ae38d --- /dev/null +++ b/test/coverage-test/test/threshold-glob.test.ts @@ -0,0 +1,72 @@ +import { expect } from 'vitest' +import { coverageTest, isV8Provider, normalizeURL, runVitest, test } from '../utils' +import { sum } from '../fixtures/src/math' +import { isEven, isOdd } from '../fixtures/src/even' + +test('threshold glob patterns count in global coverage', async () => { + await runVitest({ + include: [normalizeURL(import.meta.url)], + coverage: { + all: false, + include: ['**/fixtures/src/**'], + thresholds: { + 'branches': 100, + 'functions': 50, + 'lines': isV8Provider() ? 66 : 50, + 'statements': isV8Provider() ? 66 : 50, + + '**/fixtures/src/even.ts': { + branches: 100, + functions: 100, + lines: 100, + statements: 100, + }, + }, + }, + }) +}) + +test('{ thresholds: { 100: true } } on glob pattern', async () => { + const { stderr, exitCode } = await runVitest({ + include: [normalizeURL(import.meta.url)], + coverage: { + include: [ + '**/fixtures/src/even.ts', + '**/fixtures/src/math.ts', + ], + thresholds: { + '**/fixtures/src/even.ts': { + 100: true, + }, + '**/fixtures/src/math.ts': { + 100: true, + }, + }, + }, + }, { throwOnError: false }) + + expect(exitCode).toBe(1) + + if (isV8Provider()) { + expect(stderr).toMatchInlineSnapshot(` + "ERROR: Coverage for lines (50%) does not meet "**/fixtures/src/math.ts" threshold (100%) + ERROR: Coverage for functions (25%) does not meet "**/fixtures/src/math.ts" threshold (100%) + ERROR: Coverage for statements (50%) does not meet "**/fixtures/src/math.ts" threshold (100%) + " + `) + } + else { + expect(stderr).toMatchInlineSnapshot(` + "ERROR: Coverage for lines (25%) does not meet "**/fixtures/src/math.ts" threshold (100%) + ERROR: Coverage for functions (25%) does not meet "**/fixtures/src/math.ts" threshold (100%) + ERROR: Coverage for statements (25%) does not meet "**/fixtures/src/math.ts" threshold (100%) + " + `) + } +}) + +coverageTest('cover some lines, but not too much', () => { + expect(sum(1, 2)).toBe(3) + expect(isEven(4)).toBe(true) + expect(isOdd(4)).toBe(false) +}) diff --git a/test/coverage-test/utils.ts b/test/coverage-test/utils.ts index dd9418a33405..dde5e15583ab 100644 --- a/test/coverage-test/utils.ts +++ b/test/coverage-test/utils.ts @@ -14,7 +14,7 @@ export function test(name: string, fn: TestFunction, skip = false) { } } -export function describe(name: string, fn: Function) { +export function describe(name: string, fn: () => void) { if (process.env.COVERAGE_TEST !== 'true') { return vitestDescribe(name, () => fn()) } diff --git a/test/test-utils/index.ts b/test/test-utils/index.ts index ce8980f1e918..c0c0b34a352b 100644 --- a/test/test-utils/index.ts +++ b/test/test-utils/index.ts @@ -2,11 +2,12 @@ import { Readable, Writable } from 'node:stream' import fs from 'node:fs' import { fileURLToPath } from 'node:url' import type { UserConfig as ViteUserConfig } from 'vite' -import { type UserConfig, type VitestRunMode, type WorkerGlobalState, afterEach } from 'vitest' +import { type UserConfig, type VitestRunMode, type WorkerGlobalState, afterEach, onTestFinished } from 'vitest' import type { Vitest } from 'vitest/node' import { startVitest } from 'vitest/node' import { type Options, execa } from 'execa' import { dirname, resolve } from 'pathe' +import { getCurrentTest } from 'vitest/suite' import { Cli } from './cli' interface VitestRunnerCLIOptions { @@ -60,7 +61,22 @@ export async function runVitest( // "none" can be used to disable passing "reporter" option so that default value is used (it's not same as reporters: ["default"]) ...(reporters === 'none' ? {} : reporters ? { reporters } : { reporters: ['verbose'] }), ...rest, - }, viteOverrides, { + }, { + ...viteOverrides, + server: { + // we never need a websocket connection for the root config because it doesn't connect to the browser + // browser mode uses a separate config that doesn't inherit CLI overrides + ws: false, + watch: { + // During tests we edit the files too fast and sometimes chokidar + // misses change events, so enforce polling for consistency + // https://github.com/vitejs/vite/blob/b723a753ced0667470e72b4853ecda27b17f546a/playground/vitestSetup.ts#L211 + usePolling: true, + interval: 100, + }, + ...viteOverrides?.server, + }, + }, { stdin, stdout, stderr, @@ -74,11 +90,20 @@ export async function runVitest( exitCode = process.exitCode process.exitCode = 0 - afterEach(async () => { - await ctx?.close() - await ctx?.closingPromise - process.exit = exit - }) + if (getCurrentTest()) { + onTestFinished(async () => { + await ctx?.close() + await ctx?.closingPromise + process.exit = exit + }) + } + else { + afterEach(async () => { + await ctx?.close() + await ctx?.closingPromise + process.exit = exit + }) + } } return { diff --git a/test/typescript/test-d/test.test-d.ts b/test/typescript/test-d/test.test-d.ts index 1be4a10c0d62..11ee3bd9e2b7 100644 --- a/test/typescript/test-d/test.test-d.ts +++ b/test/typescript/test-d/test.test-d.ts @@ -24,7 +24,7 @@ describe('test', () => { }) test('ignored error', () => { - // eslint-disable-next-line ts/prefer-ts-expect-error + // eslint-disable-next-line ts/prefer-ts-expect-error, ts/ban-ts-comment // @ts-ignore 45 is not a string expectTypeOf(45).toEqualTypeOf() }) diff --git a/test/ui/test/html-report.spec.ts b/test/ui/test/html-report.spec.ts index b715eac8877a..53046a3ff20d 100644 --- a/test/ui/test/html-report.spec.ts +++ b/test/ui/test/html-report.spec.ts @@ -20,7 +20,12 @@ test.describe('html report', () => { test.afterAll(async () => { await new Promise((resolve, reject) => { previewServer.httpServer.close((err) => { - err ? reject(err) : resolve() + if (err) { + reject(err) + } + else { + resolve() + } }) }) }) diff --git a/test/vite-node/test/sourcemap.test.ts b/test/vite-node/test/sourcemap.test.ts index 9639a9a3b735..25c1cd0c63a4 100644 --- a/test/vite-node/test/sourcemap.test.ts +++ b/test/vite-node/test/sourcemap.test.ts @@ -6,7 +6,7 @@ import { withInlineSourcemap } from '../../../packages/vite-node/src/source-map' it('regex match', () => { const regex = /\/\/# sourceMappingURL=data:application\/json;charset=utf-8;base64,[A-Za-z0-9+/=]+$/gm - expect('function foo(src) {\n return `//# sourceMappingURL=data:application/json;base64,${src}`;\n}\nObject.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ return foo }});\n'.match(regex)).null + expect('function foo(src) {\n return `//# sourceMappingURL=data:application/json;base64,${src}`;\n}\nObject.defineProperty(__vite_ssr_exports__, "foo", { enumerable: true, configurable: true, get(){ return foo }});\n'.match(regex)).toBeNull() expect(`function foo(src) { return \`//# sourceMappingURL=data:application/json;base64,\${src}\`; } diff --git a/test/watch/test/reporter-failed.test.ts b/test/watch/test/reporter-failed.test.ts index f1b0e5ef8bbe..4294eddaa528 100644 --- a/test/watch/test/reporter-failed.test.ts +++ b/test/watch/test/reporter-failed.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, onTestFinished } from 'vitest' +import { describe, expect, it } from 'vitest' import { editFile, runVitest } from '../../test-utils' describe.each([ @@ -7,15 +7,12 @@ describe.each([ ['basic', false], ])('%s reporter with %s tty', (reporter, isTTY) => { it('prints previously failed tests on rerun', async () => { - const { vitest, ctx } = await runVitest({ + const { vitest } = await runVitest({ watch: true, fileParallelism: false, root: './fixtures/single-failed', reporters: [[reporter, { isTTY }]], }) - onTestFinished(async () => { - await ctx?.close() - }) expect(vitest.stderr).toContain('failed.test.ts > fails') expect(vitest.stdout).toContain('❯ failed.test.ts') @@ -38,15 +35,12 @@ describe.each([ }) it('prints tests once if changed test is the same', async () => { - const { vitest, ctx } = await runVitest({ + const { vitest } = await runVitest({ watch: true, fileParallelism: false, root: './fixtures/single-failed', reporters: [[reporter, { isTTY }]], }) - onTestFinished(async () => { - await ctx?.close() - }) expect(vitest.stderr).toContain('failed.test.ts > fails') expect(vitest.stdout).toContain('❯ failed.test.ts')