From 49748584123740e2ed3b6c4d8d47affeea198002 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Sun, 15 Dec 2024 20:42:42 +0100 Subject: [PATCH 1/9] Recover interactively when the folder is not specified or is wrong --- packages/steiger-plugin-fsd/package.json | 2 +- packages/steiger/package.json | 6 +- packages/steiger/src/cli.ts | 38 +- .../choose-root-folder/choose-from-guesses.ts | 114 +++ .../choose-root-folder/choose-from-similar.ts | 120 +++ .../choose-root-folder/exit-exception.ts | 1 + .../choose-root-folder/format-command.ts | 5 + .../src/features/choose-root-folder/index.ts | 3 + packages/steiger/src/shared/file-system.ts | 11 + packages/toolkit/package.json | 4 +- pnpm-lock.yaml | 723 ++++++++---------- tooling/eslint-config/eslint.config.mjs | 5 + 12 files changed, 592 insertions(+), 440 deletions(-) create mode 100644 packages/steiger/src/features/choose-root-folder/choose-from-guesses.ts create mode 100644 packages/steiger/src/features/choose-root-folder/choose-from-similar.ts create mode 100644 packages/steiger/src/features/choose-root-folder/exit-exception.ts create mode 100644 packages/steiger/src/features/choose-root-folder/format-command.ts create mode 100644 packages/steiger/src/features/choose-root-folder/index.ts diff --git a/packages/steiger-plugin-fsd/package.json b/packages/steiger-plugin-fsd/package.json index 3090ce73..9e91e670 100644 --- a/packages/steiger-plugin-fsd/package.json +++ b/packages/steiger-plugin-fsd/package.json @@ -50,6 +50,6 @@ "@types/pluralize": "^0.0.33", "tsup": "^8.3.0", "typescript": "^5.6.3", - "vitest": "^1.6.0" + "vitest": "^3.0.0-beta.2" } } diff --git a/packages/steiger/package.json b/packages/steiger/package.json index b124647a..1e76d9e0 100644 --- a/packages/steiger/package.json +++ b/packages/steiger/package.json @@ -40,15 +40,18 @@ "README.md" ], "dependencies": { + "@clack/prompts": "^0.8.2", "@feature-sliced/steiger-plugin": "workspace:*", "chokidar": "^3.6.0", "cosmiconfig": "^9.0.0", "effector": "^23.2.3", + "fastest-levenshtein": "^1.0.16", "globby": "^14.0.2", "immer": "^10.1.1", "lodash-es": "^4.17.21", "minimatch": "^10.0.1", "patronum": "^2.3.0", + "picocolors": "^1.1.1", "prexit": "^2.3.0", "yargs": "^17.7.2", "zod": "^3.23.8", @@ -63,9 +66,10 @@ "@total-typescript/ts-reset": "^0.5.1", "@types/lodash-es": "^4.17.12", "@types/yargs": "^17.0.33", + "memfs": "^4.15.0", "tsup": "^8.3.0", "tsx": "^4.19.1", "typescript": "^5.6.3", - "vitest": "^1.6.0" + "vitest": "^3.0.0-beta.2" } } diff --git a/packages/steiger/src/cli.ts b/packages/steiger/src/cli.ts index d407875b..ba3b7f06 100755 --- a/packages/steiger/src/cli.ts +++ b/packages/steiger/src/cli.ts @@ -1,7 +1,6 @@ #!/usr/bin/env node import { resolve, relative, dirname } from 'node:path' -import { stat } from 'node:fs/promises' import * as process from 'node:process' import yargs from 'yargs' import prexit from 'prexit' @@ -13,9 +12,11 @@ import { cosmiconfig } from 'cosmiconfig' import { linter } from './app' import { processConfiguration, $plugins } from './models/config' import { applyAutofixes } from './features/autofix' +import { chooseRootFolderFromGuesses, chooseRootFolderFromSimilar, ExitException } from './features/choose-root-folder' import fsd from '@feature-sliced/steiger-plugin' import type { Diagnostic } from '@steiger/types' import packageJson from '../package.json' +import { existsAndIsFolder } from './shared/file-system' const { config, filepath } = (await cosmiconfig('steiger').search()) ?? { config: null, filepath: undefined } const defaultConfig = fsd.configs.recommended @@ -64,8 +65,6 @@ const yargsProgram = yargs(hideBin(process.argv)) const filePaths = argv._ if (filePaths.length > 1) { throw new Error('Pass only one path to watch') - } else if (filePaths.length === 0) { - throw new Error('Pass a path to watch') } else { return true } @@ -88,16 +87,31 @@ const yargsProgram = yargs(hideBin(process.argv)) const consoleArgs = yargsProgram.parseSync() -const targetPath = resolve(consoleArgs._[0]) - -try { - if (!(await stat(targetPath)).isDirectory()) { - console.error(`${consoleArgs._[0]} is a file, must be a folder`) - process.exit(102) +let targetPath: string | undefined +if (consoleArgs._.length > 0) { + if (await existsAndIsFolder(consoleArgs._[0])) { + targetPath = resolve(consoleArgs._[0]) + } else { + try { + targetPath = resolve(await chooseRootFolderFromSimilar(consoleArgs._[0])) + } catch (e) { + if (e instanceof ExitException) { + process.exit(0) + } else { + throw e + } + } + } +} else { + try { + targetPath = resolve(await chooseRootFolderFromGuesses()) + } catch (e) { + if (e instanceof ExitException) { + process.exit(0) + } else { + throw e + } } -} catch { - console.error(`Folder ${consoleArgs._[0]} does not exist`) - process.exit(101) } const printDiagnostics = (diagnostics: Array) => { diff --git a/packages/steiger/src/features/choose-root-folder/choose-from-guesses.ts b/packages/steiger/src/features/choose-root-folder/choose-from-guesses.ts new file mode 100644 index 00000000..3bf73deb --- /dev/null +++ b/packages/steiger/src/features/choose-root-folder/choose-from-guesses.ts @@ -0,0 +1,114 @@ +import { sep } from 'node:path' +import { confirm, isCancel, outro, select } from '@clack/prompts' + +import { ExitException } from './exit-exception' +import { formatCommand } from './format-command' +import { existsAndIsFolder } from '../../shared/file-system' + +const commonRootFolders = ['src', 'app'].map((folder) => `.${sep}${folder}`) + +/** Present the user with a choice of folders based on an informed guess. */ +export async function chooseFromGuesses(): Promise { + let targetPath: string | undefined + + const candidates = await findRootFolderCandidates() + if (candidates.length === 0) { + const answer = await confirm({ + message: `You haven't specified a path to check. Would you like to check this folder?`, + inactive: 'No, exit', + }) + + if (answer === true) { + targetPath = '.' + } + } else { + const answer = await select({ + message: `You haven't specified a path to check. Would you like to use one of the following?`, + options: candidates + .map((candidate) => ({ value: candidate, label: candidate })) + .concat({ value: '.', label: 'This folder' }) + .concat({ value: '', label: 'No, exit' }), + }) + + if (!isCancel(answer) && answer !== '') { + targetPath = answer + } + } + + if (targetPath === undefined) { + outro(`Alright! To run checks on a specific folder, run ${formatCommand(`steiger .${sep}your-folder`)}.`) + throw new ExitException() + } else { + outro(`Running ${formatCommand(`steiger ${targetPath}`)}`) + } + + return targetPath +} + +/** + * Check if any of the common root project folders are present + * and return a list of the ones that are present. + */ +async function findRootFolderCandidates(): Promise> { + return ( + await Promise.all(commonRootFolders.map(async (folder) => ((await existsAndIsFolder(folder)) ? folder : undefined))) + ).filter(Boolean) +} + +if (import.meta.vitest) { + const { describe, test, expect, vi, beforeEach } = import.meta.vitest + const { vol } = await import('memfs') + const { joinFromRoot } = await import('@steiger/toolkit') + + vi.mock('node:fs/promises', () => import('memfs').then((memfs) => memfs.fs.promises)) + + describe('findRootFolderCandidates', () => { + const root = joinFromRoot('home', 'project') + beforeEach(() => { + vol.reset() + vi.spyOn(process, 'cwd').mockReturnValue(root) + }) + + test('when src is present, app is not', async () => { + const fileStructure = { + src: {}, + dist: {}, + } + + vol.fromNestedJSON(fileStructure, root) + + await expect(findRootFolderCandidates()).resolves.toEqual([`.${sep}src`]) + }) + + test('when app is present, src is not', async () => { + const fileStructure = { + app: {}, + } + + vol.fromNestedJSON(fileStructure, root) + + await expect(findRootFolderCandidates()).resolves.toEqual([`.${sep}app`]) + }) + + test('when both src and app are present', async () => { + const fileStructure = { + src: {}, + app: {}, + } + + vol.fromNestedJSON(fileStructure, root) + + await expect(findRootFolderCandidates()).resolves.toEqual([`.${sep}src`, `.${sep}app`]) + }) + + test('when neither src nor app are present', async () => { + const fileStructure = { + dist: {}, + } + + vol.fromNestedJSON(fileStructure, root) + + await expect(findRootFolderCandidates()).resolves.toEqual([]) + }) + }) +} diff --git a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts new file mode 100644 index 00000000..b12da258 --- /dev/null +++ b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts @@ -0,0 +1,120 @@ +import { readdir } from 'node:fs/promises' +import { parse, relative, sep, join } from 'node:path' +import pc from 'picocolors' + +import { distance } from 'fastest-levenshtein' +import { isCancel, outro, select, confirm } from '@clack/prompts' +import { formatCommand } from './format-command' +import { ExitException } from './exit-exception' + +/** The maximum Levenshtein distance between the input and the reference for the input to be considered a typo. */ +const typoThreshold = 5 +/** Patterns for folder names that are never suggested. */ +const nonCandidates = [/^node_modules$/, /^dist$/, /^\./] + +/** Present the user with a choice of folders based on similarity to a given input. */ +export async function chooseFromSimilar(input: string): Promise { + const resolved = relative('.', input) + const { dir, base } = parse(resolved) + const existingDir = await resolveWithCorrections(dir || '.') + + const candidates = (await readdir(existingDir, { withFileTypes: true })) + .filter((entry) => entry.isDirectory() && nonCandidates.every((pattern) => !pattern.test(entry.name))) + .map((entry) => entry.name) + const withDistances = candidates.map((candidate) => [candidate, distance(candidate, base)] as const) + const suggestions = withDistances + .filter(([_candidate, distance]) => distance <= typoThreshold) + .sort((a, b) => a[1] - b[1]) + + let answer: string | undefined + if (suggestions.length === 1) { + const confirmation = await confirm({ + message: `${pc.red(input)} is not a folder. Did you mean ${pc.green(`.${sep}${join(existingDir, suggestions[0][0])}`)}?`, + inactive: 'No, exit', + }) + + if (confirmation === true) { + answer = join(existingDir, suggestions[0][0]) + } else { + answer = '' + } + } else { + const selection = await select({ + message: `${pc.red(input)} is not a folder. Did you mean one of the following?`, + options: suggestions + .map(([candidate, _distance]) => ({ value: candidate, label: `.${sep}${join(existingDir, candidate)}` })) + .concat({ value: '', label: 'No, exit' }), + }) + + if (selection !== '' && !isCancel(selection)) { + answer = join(existingDir, selection) + } else { + answer = '' + } + } + + if (answer !== '') { + outro(`Running ${formatCommand(`steiger .${sep}${answer}`)}`) + return answer + } else { + outro(`Alright! To run checks on a specific folder, run ${formatCommand(`steiger .${sep}your-folder`)}.`) + throw new ExitException() + } +} + +/** + * Take a relative path that might contain typos and resolve each typo to the best matching candidate. + * + * @example + * // For a folder structure like: + * // - src + * // - app + * // - shared + * // - dist + * resolveWithCorrections('src/app') // 'src/app' + * resolveWithCorrections('scr/shad') // 'src/shared' + */ +async function resolveWithCorrections(path: string) { + let finalPath = '.' + for (const part of path.split(sep)) { + if (part === '.') { + continue + } else if (part === '..') { + finalPath = join(finalPath, part) + } else { + const candidates = (await readdir(finalPath, { withFileTypes: true })) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name) + const distances = candidates.map((candidate) => distance(candidate, part)) + const bestMatch = candidates[distances.indexOf(Math.min(...distances))] + finalPath = join(finalPath, bestMatch) + } + } + + return finalPath +} + +if (import.meta.vitest) { + const { test, expect, vi } = import.meta.vitest + const { vol } = await import('memfs') + const { joinFromRoot } = await import('@steiger/toolkit') + + vi.mock('node:fs/promises', () => import('memfs').then((memfs) => memfs.fs.promises)) + + test('resolveWithCorrections', async () => { + const root = joinFromRoot('home', 'project') + const fileStructure = { + src: { + app: {}, + shared: {}, + }, + dist: {}, + } + + vi.spyOn(process, 'cwd').mockReturnValue(root) + vol.fromNestedJSON(fileStructure, root) + + expect(await resolveWithCorrections('src/app')).toBe('src/app') + expect(await resolveWithCorrections('scr/shad')).toBe('src/shared') + }) +} diff --git a/packages/steiger/src/features/choose-root-folder/exit-exception.ts b/packages/steiger/src/features/choose-root-folder/exit-exception.ts new file mode 100644 index 00000000..81007c92 --- /dev/null +++ b/packages/steiger/src/features/choose-root-folder/exit-exception.ts @@ -0,0 +1 @@ +export class ExitException extends Error {} diff --git a/packages/steiger/src/features/choose-root-folder/format-command.ts b/packages/steiger/src/features/choose-root-folder/format-command.ts new file mode 100644 index 00000000..c54e2164 --- /dev/null +++ b/packages/steiger/src/features/choose-root-folder/format-command.ts @@ -0,0 +1,5 @@ +import pc from 'picocolors' + +export function formatCommand(command: string): string { + return pc.green(`\`${command}\``) +} diff --git a/packages/steiger/src/features/choose-root-folder/index.ts b/packages/steiger/src/features/choose-root-folder/index.ts new file mode 100644 index 00000000..74886775 --- /dev/null +++ b/packages/steiger/src/features/choose-root-folder/index.ts @@ -0,0 +1,3 @@ +export { chooseFromGuesses as chooseRootFolderFromGuesses } from './choose-from-guesses' +export { chooseFromSimilar as chooseRootFolderFromSimilar } from './choose-from-similar' +export { ExitException } from './exit-exception' diff --git a/packages/steiger/src/shared/file-system.ts b/packages/steiger/src/shared/file-system.ts index a01661be..59109c07 100644 --- a/packages/steiger/src/shared/file-system.ts +++ b/packages/steiger/src/shared/file-system.ts @@ -1,3 +1,4 @@ +import { access, stat } from 'node:fs/promises' import { File, Folder } from '@steiger/types' export function isPathInTree(vfs: Folder, paths: string | Array) { @@ -29,3 +30,13 @@ export function isPathInTree(vfs: Folder, paths: string | Array) { return typeof paths === 'string' ? results[0] : results } + +/** Check if a given path exists and is a folder. */ +export async function existsAndIsFolder(path: string) { + try { + await access(path) + return (await stat(path)).isDirectory() + } catch { + return false + } +} diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 7ec101de..efe39702 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -30,7 +30,7 @@ } ], "peerDependencies": { - "vitest": "^1.6.0" + "vitest": "^1.6.0 || ^2.1.8 || ^3.0.0-beta.2" }, "peerDependenciesMeta": { "vitest": { @@ -44,6 +44,6 @@ "@total-typescript/ts-reset": "^0.5.1", "tsup": "^8.3.0", "typescript": "^5.6.3", - "vitest": "^1.6.0" + "vitest": "^3.0.0-beta.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6a105948..fb260aef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,6 +78,9 @@ importers: packages/steiger: dependencies: + '@clack/prompts': + specifier: ^0.8.2 + version: 0.8.2 '@feature-sliced/steiger-plugin': specifier: workspace:* version: link:../steiger-plugin-fsd @@ -90,6 +93,9 @@ importers: effector: specifier: ^23.2.3 version: 23.2.3 + fastest-levenshtein: + specifier: ^1.0.16 + version: 1.0.16 globby: specifier: ^14.0.2 version: 14.0.2 @@ -105,6 +111,9 @@ importers: patronum: specifier: ^2.3.0 version: 2.3.0(effector@23.2.3) + picocolors: + specifier: ^1.1.1 + version: 1.1.1 prexit: specifier: ^2.3.0 version: 2.3.0 @@ -142,6 +151,9 @@ importers: '@types/yargs': specifier: ^17.0.33 version: 17.0.33 + memfs: + specifier: ^4.15.0 + version: 4.15.0 tsup: specifier: ^8.3.0 version: 8.3.0(@microsoft/api-extractor@7.47.7(@types/node@20.16.11))(postcss@8.4.47)(tsx@4.19.1)(typescript@5.6.3)(yaml@2.5.1) @@ -152,8 +164,8 @@ importers: specifier: ^5.6.3 version: 5.6.3 vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.11) + specifier: ^3.0.0-beta.2 + version: 3.0.0-beta.2(@types/node@20.16.11) packages/steiger-plugin-fsd: dependencies: @@ -201,8 +213,8 @@ importers: specifier: ^5.6.3 version: 5.6.3 vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.11) + specifier: ^3.0.0-beta.2 + version: 3.0.0-beta.2(@types/node@20.16.11) packages/toolkit: devDependencies: @@ -225,8 +237,8 @@ importers: specifier: ^5.6.3 version: 5.6.3 vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.11) + specifier: ^3.0.0-beta.2 + version: 3.0.0-beta.2(@types/node@20.16.11) packages/types: devDependencies: @@ -351,6 +363,12 @@ packages: '@changesets/write@0.3.2': resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@clack/core@0.3.5': + resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==} + + '@clack/prompts@0.8.2': + resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} + '@dependents/detective-less@5.0.0': resolution: {integrity: sha512-D/9dozteKcutI5OdxJd8rU+fL6XgaaRg60sPPJWkT33OCiRfkCu5wO5B/yXTaaL2e6EB0lcCBGe5E0XscZCvvQ==} engines: {node: '>=18'} @@ -698,10 +716,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -717,9 +731,30 @@ packages: '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.1.1': + resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@manypkg/cli@0.21.4': resolution: {integrity: sha512-EACxxb+c/t6G0l1FrlyewZeBnyR5V1cLkXjnBfsay5TN1UgbilFpG6POglzn+lVJet9NqnEKe3RLHABzkIDZ0Q==} engines: {node: '>=14.18.0'} @@ -784,161 +819,81 @@ packages: resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} engines: {node: '>=12'} - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.24.0': resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.24.0': resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.24.0': resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.24.0': resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.0': resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.0': resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} cpu: [x64] @@ -966,9 +921,6 @@ packages: '@rushstack/ts-command-line@4.22.6': resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -990,9 +942,6 @@ packages: '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1100,20 +1049,34 @@ packages: resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@3.0.0-beta.2': + resolution: {integrity: sha512-xdywwsqHOTZ66dBr8sQ+l3c0ZQs/wQY48fBRgLDrUqTU8OlDir6H1JMIOeV+Jb85Ov1XBGXBrSVlPDIo/fN5EQ==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/mocker@3.0.0-beta.2': + resolution: {integrity: sha512-rSYrjKX8RwiKLw9MoZ8FDjos90C//AVphNVVYsv8QJn6brSkJLAOTFjTn13E8mF8kh3Bx8NKNgyDrx48ioJFXQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.0.0-beta.2': + resolution: {integrity: sha512-vMCmIdShOz2vjMCyxk+SoexZxsIbwrRc/weTctKxnQAYv3NubehpwCOaT8nhirmYQtdW+8r079wz1s7cKxNmCA==} + + '@vitest/runner@3.0.0-beta.2': + resolution: {integrity: sha512-Ytyub2tBCGrROrGfVlB8SuWdQjFYzJTTR969CGJF/xkIgdkLE9SiQzBZy4td2VidypntLXAVHYjeGr75pvw93w==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@3.0.0-beta.2': + resolution: {integrity: sha512-6INaNxXyYBmFGHhjmSyoz+/P3F+e6sHZPXLYt2OAa6Zt1v1O91FoGUTwdNHj2ASxMQeVpK/7snxNaeyr2INVOg==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@3.0.0-beta.2': + resolution: {integrity: sha512-tSxQfS/wDWRtyx/a3smGuQr/YFaZk1iUsPbKkEvd6jIsrWBb747MSpdn9xfLgIhI68tXquCzruXiMQG0kHdILA==} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@3.0.0-beta.2': + resolution: {integrity: sha512-Jkib9LoI9Xm3gmzwI+9KgEAJVZNgJQFrR1RAyqBN7k9O3qezOTUjqyYBnvyz3UcPywygP1jEjZWBxUKx4ELpxw==} '@vue/compiler-core@3.4.27': resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} @@ -1135,15 +1098,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} @@ -1202,10 +1156,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -1227,8 +1177,9 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} ast-module-types@6.0.0: resolution: {integrity: sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng==} @@ -1280,9 +1231,9 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + engines: {node: '>=12'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1299,8 +1250,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} @@ -1349,9 +1301,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -1393,12 +1342,21 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} deep-extend@0.6.0: @@ -1459,10 +1417,6 @@ packages: peerDependencies: typescript: ^5.4.4 - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1502,6 +1456,9 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + esbuild@0.20.2: resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} @@ -1599,6 +1556,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -1697,9 +1658,6 @@ packages: resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} engines: {node: '>=18'} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1793,6 +1751,10 @@ packages: engines: {node: '>=18'} hasBin: true + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1898,9 +1860,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1958,10 +1917,6 @@ packages: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1989,8 +1944,8 @@ packages: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} @@ -2010,6 +1965,13 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.15: + resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==} + + memfs@4.15.0: + resolution: {integrity: sha512-q9MmZXd2rRWHS6GU3WEm3HyiXZyyoA1DqdOhEq0lxPBmKb5S7IAOwX0RgUCwJfqjelDCySa5h8ujOy24LqsWcw==} + engines: {node: '>= 4.0.0'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -2066,9 +2028,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.7.0: - resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} - module-definition@6.0.0: resolution: {integrity: sha512-sEGP5nKEXU7fGSZUML/coJbrO+yQtxcppDAYWRE9ovWsTbFoUHB2qDUx564WUzDaBHXsD46JBbIK5WVTwCyu3w==} engines: {node: '>=18'} @@ -2158,10 +2117,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -2228,17 +2183,15 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} patronum@2.3.0: resolution: {integrity: sha512-BfKIOpoymVz6XnkOn8Fi5QZ1a3r/3lXdd8BcdHmYDbIXPTIRnD1EPFBFev/DheWnOge6/ZswEqgNF2ANLGOxLw==} peerDependencies: effector: ^23 - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2263,9 +2216,6 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} - pkg-types@1.1.1: - resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} - pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -2294,10 +2244,6 @@ packages: peerDependencies: postcss: ^8.2.9 - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - postcss@8.4.47: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} @@ -2321,10 +2267,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - prexit@2.3.0: resolution: {integrity: sha512-mX+LIbtS0anKtl2PykYabxninwloblUQMRO6CubeSmjxb+kKlATuJoH9UeN8NLE4TgIEFWfBXw7V3GkWbBrSmg==} engines: {node: '>=12'} @@ -2353,9 +2295,6 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -2416,11 +2355,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.24.0: resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2475,6 +2409,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -2516,8 +2453,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -2563,9 +2500,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2609,19 +2543,32 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} tinyglobby@0.2.9: resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==} engines: {node: '>=12.0.0'} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -2639,6 +2586,12 @@ packages: tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -2662,6 +2615,9 @@ packages: typescript: optional: true + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.3.0: resolution: {integrity: sha512-ALscEeyS03IomcuNdFdc0YWGVIkwH1Ws7nfTbAPuoILvEV2hpGQAY72LIOjglGo4ShWpZfpBqP/jpQVCzqYQag==} engines: {node: '>=18'} @@ -2724,10 +2680,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@1.4.0: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} @@ -2751,9 +2703,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -2771,9 +2720,9 @@ packages: validate-npm-package-name@3.0.0: resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@3.0.0-beta.2: + resolution: {integrity: sha512-ofTf6cfRdL30Wbl9n/BX81EyIR5s4PReLmSurrxQ+koLaWUNOEo8E0lCM53OJkb8vpa2URM2nSrxZsIFyvY1rg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true vite@5.2.12: @@ -2804,15 +2753,15 @@ packages: terser: optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@3.0.0-beta.2: + resolution: {integrity: sha512-ZP0FVJ4tNJJOsjzZSuadEW0BPBgO7DMMen3mIE8TPPiPUMwz9YoS1U5bcqMYZ61r34xGsaYPe1h0l1MXt50f7g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.0-beta.2 + '@vitest/ui': 3.0.0-beta.2 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2844,8 +2793,8 @@ packages: engines: {node: '>= 8'} 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 @@ -2892,10 +2841,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - zod-validation-error@3.4.0: resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} engines: {node: '>=18.0.0'} @@ -2991,7 +2936,7 @@ snapshots: mri: 1.2.0 p-limit: 2.3.0 package-manager-detector: 0.2.2 - picocolors: 1.1.0 + picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.2 spawndamnit: 2.0.0 @@ -3015,7 +2960,7 @@ snapshots: dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.0 + picocolors: 1.1.1 semver: 7.6.2 '@changesets/get-release-plan@4.0.4': @@ -3039,7 +2984,7 @@ snapshots: '@changesets/logger@0.1.1': dependencies: - picocolors: 1.1.0 + picocolors: 1.1.1 '@changesets/parse@0.4.0': dependencies: @@ -3061,7 +3006,7 @@ snapshots: '@changesets/types': 6.0.0 fs-extra: 7.0.1 p-filter: 2.1.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@changesets/should-skip-package@0.1.1': dependencies: @@ -3079,6 +3024,17 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 + '@clack/core@0.3.5': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.8.2': + dependencies: + '@clack/core': 0.3.5 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@dependents/detective-less@5.0.0': dependencies: gonzales-pe: 4.3.0 @@ -3290,10 +3246,6 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -3306,11 +3258,29 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@manypkg/cli@0.21.4': dependencies: '@manypkg/get-packages': 2.2.1 @@ -3427,99 +3397,51 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/rollup-android-arm-eabi@4.18.0': - optional: true - '@rollup/rollup-android-arm-eabi@4.24.0': optional: true - '@rollup/rollup-android-arm64@4.18.0': - optional: true - '@rollup/rollup-android-arm64@4.24.0': optional: true - '@rollup/rollup-darwin-arm64@4.18.0': - optional: true - '@rollup/rollup-darwin-arm64@4.24.0': optional: true - '@rollup/rollup-darwin-x64@4.18.0': - optional: true - '@rollup/rollup-darwin-x64@4.24.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': - optional: true - '@rollup/rollup-linux-arm64-musl@4.24.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': - optional: true - '@rollup/rollup-linux-x64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': - optional: true - '@rollup/rollup-linux-x64-musl@4.24.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': - optional: true - '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true @@ -3561,8 +3483,6 @@ snapshots: - '@types/node' optional: true - '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@5.6.0': {} '@sindresorhus/merge-streams@2.3.0': {} @@ -3578,8 +3498,6 @@ snapshots: '@types/argparse@1.0.38': optional: true - '@types/estree@1.0.5': {} - '@types/estree@1.0.6': {} '@types/http-cache-semantics@4.0.4': {} @@ -3648,7 +3566,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - debug: 4.3.5 + debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -3679,7 +3597,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.8.1 '@typescript-eslint/visitor-keys': 8.8.1 - debug: 4.3.5 + debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.4 @@ -3711,34 +3629,45 @@ snapshots: '@typescript-eslint/types': 8.8.1 eslint-visitor-keys: 3.4.3 - '@vitest/expect@1.6.0': + '@vitest/expect@3.0.0-beta.2': + dependencies: + '@vitest/spy': 3.0.0-beta.2 + '@vitest/utils': 3.0.0-beta.2 + chai: 5.1.2 + tinyrainbow: 1.2.0 + + '@vitest/mocker@3.0.0-beta.2(vite@5.2.12(@types/node@20.16.11))': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + '@vitest/spy': 3.0.0-beta.2 + estree-walker: 3.0.3 + magic-string: 0.30.15 + optionalDependencies: + vite: 5.2.12(@types/node@20.16.11) + + '@vitest/pretty-format@3.0.0-beta.2': + dependencies: + tinyrainbow: 1.2.0 - '@vitest/runner@1.6.0': + '@vitest/runner@3.0.0-beta.2': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 + '@vitest/utils': 3.0.0-beta.2 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@3.0.0-beta.2': dependencies: - magic-string: 0.30.10 + '@vitest/pretty-format': 3.0.0-beta.2 + magic-string: 0.30.15 pathe: 1.1.2 - pretty-format: 29.7.0 - '@vitest/spy@1.6.0': + '@vitest/spy@3.0.0-beta.2': dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.2 - '@vitest/utils@1.6.0': + '@vitest/utils@3.0.0-beta.2': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + '@vitest/pretty-format': 3.0.0-beta.2 + loupe: 3.1.2 + tinyrainbow: 1.2.0 '@vue/compiler-core@3.4.27': dependencies: @@ -3776,10 +3705,6 @@ snapshots: dependencies: acorn: 8.12.1 - acorn-walk@8.3.2: {} - - acorn@8.11.3: {} - acorn@8.12.1: {} ajv-draft-04@1.0.0(ajv@8.13.0): @@ -3837,8 +3762,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} any-promise@1.3.0: {} @@ -3856,7 +3779,7 @@ snapshots: array-union@2.1.0: {} - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} ast-module-types@6.0.0: {} @@ -3904,15 +3827,13 @@ snapshots: callsites@3.1.0: {} - chai@4.4.1: + chai@5.1.2: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.2 + pathval: 2.0.0 chalk@2.4.2: dependencies: @@ -3929,9 +3850,7 @@ snapshots: chardet@0.7.0: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + check-error@2.1.1: {} chokidar@3.6.0: dependencies: @@ -3982,8 +3901,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.7: {} - config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -4020,13 +3937,15 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -4091,8 +4010,6 @@ snapshots: transitivePeerDependencies: - supports-color - diff-sequences@29.6.3: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -4122,6 +4039,8 @@ snapshots: dependencies: is-arrayish: 0.2.1 + es-module-lexer@1.5.4: {} + esbuild@0.20.2: optionalDependencies: '@esbuild/aix-ppc64': 0.20.2 @@ -4264,7 +4183,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 esutils@2.0.3: {} @@ -4294,6 +4213,8 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + expect-type@1.1.0: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -4389,8 +4310,6 @@ snapshots: get-east-asian-width@1.2.0: {} - get-func-name@2.0.2: {} - get-stream@6.0.1: {} get-stream@8.0.1: {} @@ -4485,6 +4404,8 @@ snapshots: husky@9.1.6: {} + hyperdyperid@1.2.0: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -4562,8 +4483,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.0: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -4629,11 +4548,6 @@ snapshots: load-tsconfig@0.2.5: {} - local-pkg@0.5.0: - dependencies: - mlly: 1.7.0 - pkg-types: 1.1.1 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -4661,9 +4575,7 @@ snapshots: strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 + loupe@3.1.2: {} lowercase-keys@3.0.0: {} @@ -4683,6 +4595,17 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + magic-string@0.30.15: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + memfs@4.15.0: + dependencies: + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -4728,13 +4651,6 @@ snapshots: minipass@7.1.2: {} - mlly@1.7.0: - dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.1.1 - ufo: 1.5.3 - module-definition@6.0.0: dependencies: ast-module-types: 6.0.0 @@ -4813,10 +4729,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.0.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -4871,14 +4783,12 @@ snapshots: pathe@1.1.2: {} - pathval@1.1.1: {} + pathval@2.0.0: {} patronum@2.3.0(effector@23.2.3): dependencies: effector: 23.2.3 - picocolors@1.1.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -4891,12 +4801,6 @@ snapshots: pirates@4.0.6: {} - pkg-types@1.1.1: - dependencies: - confbox: 0.1.7 - mlly: 1.7.0 - pathe: 1.1.2 - pluralize@8.0.0: {} postcss-load-config@6.0.1(postcss@8.4.47)(tsx@4.19.1)(yaml@2.5.1): @@ -4914,12 +4818,6 @@ snapshots: postcss: 8.4.47 quote-unquote: 1.0.0 - postcss@8.4.38: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.1 - source-map-js: 1.2.0 - postcss@8.4.47: dependencies: nanoid: 3.3.7 @@ -4952,12 +4850,6 @@ snapshots: prettier@3.3.3: {} - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - prexit@2.3.0: {} proto-list@1.2.4: {} @@ -4979,8 +4871,6 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-is@18.3.1: {} - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -5035,28 +4925,6 @@ snapshots: rfdc@1.4.1: {} - rollup@4.18.0: - 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 - fsevents: 2.3.3 - rollup@4.24.0: dependencies: '@types/estree': 1.0.6 @@ -5117,6 +4985,8 @@ snapshots: signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + slash@3.0.0: {} slash@5.1.0: {} @@ -5151,7 +5021,7 @@ snapshots: stackback@0.0.2: {} - std-env@3.7.0: {} + std-env@3.8.0: {} string-argv@0.3.2: {} @@ -5191,10 +5061,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 - sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -5243,16 +5109,24 @@ snapshots: dependencies: any-promise: 1.3.0 - tinybench@2.8.0: {} + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + tinybench@2.9.0: {} + + tinyexec@0.3.1: {} tinyglobby@0.2.9: dependencies: fdir: 6.4.0(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@0.8.4: {} + tinypool@1.0.2: {} - tinyspy@2.2.1: {} + tinyrainbow@1.2.0: {} + + tinyspy@3.0.2: {} tmp@0.0.33: dependencies: @@ -5268,6 +5142,10 @@ snapshots: dependencies: punycode: 2.3.1 + tree-dump@1.0.2(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + tree-kill@1.2.2: {} ts-api-utils@1.3.0(typescript@5.6.3): @@ -5280,6 +5158,8 @@ snapshots: optionalDependencies: typescript: 5.6.3 + tslib@2.8.1: {} + tsup@8.3.0(@microsoft/api-extractor@7.47.7(@types/node@20.16.11))(postcss@8.4.47)(tsx@4.19.1)(typescript@5.6.3)(yaml@2.5.1): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) @@ -5346,8 +5226,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@1.4.0: {} typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.6.3): @@ -5366,8 +5244,6 @@ snapshots: typescript@5.6.3: {} - ufo@1.5.3: {} - undici-types@6.19.8: {} unicorn-magic@0.1.0: {} @@ -5382,12 +5258,12 @@ snapshots: dependencies: builtins: 1.0.3 - vite-node@1.6.0(@types/node@20.16.11): + vite-node@3.0.0-beta.2(@types/node@20.16.11): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.4.0 + es-module-lexer: 1.5.4 pathe: 1.1.2 - picocolors: 1.1.1 vite: 5.2.12(@types/node@20.16.11) transitivePeerDependencies: - '@types/node' @@ -5402,39 +5278,40 @@ snapshots: vite@5.2.12(@types/node@20.16.11): dependencies: esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.18.0 + postcss: 8.4.47 + rollup: 4.24.0 optionalDependencies: '@types/node': 20.16.11 fsevents: 2.3.3 - vitest@1.6.0(@types/node@20.16.11): - dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.5 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.10 + vitest@3.0.0-beta.2(@types/node@20.16.11): + dependencies: + '@vitest/expect': 3.0.0-beta.2 + '@vitest/mocker': 3.0.0-beta.2(vite@5.2.12(@types/node@20.16.11)) + '@vitest/pretty-format': 3.0.0-beta.2 + '@vitest/runner': 3.0.0-beta.2 + '@vitest/snapshot': 3.0.0-beta.2 + '@vitest/spy': 3.0.0-beta.2 + '@vitest/utils': 3.0.0-beta.2 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.15 pathe: 1.1.2 - picocolors: 1.1.1 - std-env: 3.7.0 - strip-literal: 2.1.0 - tinybench: 2.8.0 - tinypool: 0.8.4 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 vite: 5.2.12(@types/node@20.16.11) - vite-node: 1.6.0(@types/node@20.16.11) - why-is-node-running: 2.2.2 + vite-node: 3.0.0-beta.2(@types/node@20.16.11) + why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.16.11 transitivePeerDependencies: - less - lightningcss + - msw - sass - stylus - sugarss @@ -5457,7 +5334,7 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 @@ -5505,8 +5382,6 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.0.0: {} - zod-validation-error@3.4.0(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/tooling/eslint-config/eslint.config.mjs b/tooling/eslint-config/eslint.config.mjs index 32fd84f6..a0ef3b62 100644 --- a/tooling/eslint-config/eslint.config.mjs +++ b/tooling/eslint-config/eslint.config.mjs @@ -9,4 +9,9 @@ export default [ ...tseslint.configs.recommended, eslintConfigPrettier, { ignores: ['**/node_modules', '**/dist'] }, + { + rules: { + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + }, + }, ] From 4420708520a982bdb4d6fd4ba2c52cc2c90c7cd8 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Sun, 15 Dec 2024 20:46:12 +0100 Subject: [PATCH 2/9] Use joins in tests for Windows --- .../src/features/choose-root-folder/choose-from-similar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts index b12da258..d54e2e64 100644 --- a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts +++ b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts @@ -114,7 +114,7 @@ if (import.meta.vitest) { vi.spyOn(process, 'cwd').mockReturnValue(root) vol.fromNestedJSON(fileStructure, root) - expect(await resolveWithCorrections('src/app')).toBe('src/app') - expect(await resolveWithCorrections('scr/shad')).toBe('src/shared') + expect(await resolveWithCorrections(join('src', 'app'))).toBe(join('src', 'app')) + expect(await resolveWithCorrections(join('scr', 'shad'))).toBe(join('src', 'shared')) }) } From 6a6ce0c8dd0d538c79ba40b9996a7bcc10c0de16 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Sun, 15 Dec 2024 20:48:36 +0100 Subject: [PATCH 3/9] Add a changeset --- .changeset/lovely-queens-occur.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/lovely-queens-occur.md diff --git a/.changeset/lovely-queens-occur.md b/.changeset/lovely-queens-occur.md new file mode 100644 index 00000000..cc28e3f6 --- /dev/null +++ b/.changeset/lovely-queens-occur.md @@ -0,0 +1,5 @@ +--- +'steiger': minor +--- + +Interactively suggest folders when a missing folder was specified in the command or when it wasn't specified at all From f0f292e04cfb870432697a535f53e1355890c4eb Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Thu, 19 Dec 2024 22:06:05 +0100 Subject: [PATCH 4/9] Rename `consoleArgs._` to something meaningful --- packages/steiger/src/cli.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/steiger/src/cli.ts b/packages/steiger/src/cli.ts index ba3b7f06..aaf50fbe 100755 --- a/packages/steiger/src/cli.ts +++ b/packages/steiger/src/cli.ts @@ -86,14 +86,15 @@ const yargsProgram = yargs(hideBin(process.argv)) .showHelpOnFail(true) const consoleArgs = yargsProgram.parseSync() +const inputPaths = consoleArgs._ let targetPath: string | undefined -if (consoleArgs._.length > 0) { - if (await existsAndIsFolder(consoleArgs._[0])) { - targetPath = resolve(consoleArgs._[0]) +if (inputPaths.length > 0) { + if (await existsAndIsFolder(inputPaths[0])) { + targetPath = resolve(inputPaths[0]) } else { try { - targetPath = resolve(await chooseRootFolderFromSimilar(consoleArgs._[0])) + targetPath = resolve(await chooseRootFolderFromSimilar(inputPaths[0])) } catch (e) { if (e instanceof ExitException) { process.exit(0) From bb407b5d3b00ff5b506a6ac0751e1723f32f2dd1 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Thu, 19 Dec 2024 22:51:17 +0100 Subject: [PATCH 5/9] Use `isGitIgnored` to exclude candidates --- .../src/features/choose-root-folder/choose-from-similar.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts index d54e2e64..88404c08 100644 --- a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts +++ b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts @@ -1,6 +1,7 @@ import { readdir } from 'node:fs/promises' import { parse, relative, sep, join } from 'node:path' import pc from 'picocolors' +import { isGitIgnored } from 'globby' import { distance } from 'fastest-levenshtein' import { isCancel, outro, select, confirm } from '@clack/prompts' @@ -9,8 +10,7 @@ import { ExitException } from './exit-exception' /** The maximum Levenshtein distance between the input and the reference for the input to be considered a typo. */ const typoThreshold = 5 -/** Patterns for folder names that are never suggested. */ -const nonCandidates = [/^node_modules$/, /^dist$/, /^\./] +const isIgnored = await isGitIgnored() /** Present the user with a choice of folders based on similarity to a given input. */ export async function chooseFromSimilar(input: string): Promise { @@ -19,7 +19,7 @@ export async function chooseFromSimilar(input: string): Promise { const existingDir = await resolveWithCorrections(dir || '.') const candidates = (await readdir(existingDir, { withFileTypes: true })) - .filter((entry) => entry.isDirectory() && nonCandidates.every((pattern) => !pattern.test(entry.name))) + .filter((entry) => entry.isDirectory() && !isIgnored(join(existingDir, entry.name))) .map((entry) => entry.name) const withDistances = candidates.map((candidate) => [candidate, distance(candidate, base)] as const) const suggestions = withDistances From 4d938cc3e288114ee1c8d9ddaa82fa32a2e9afa6 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Thu, 19 Dec 2024 22:52:15 +0100 Subject: [PATCH 6/9] Make it a patch change --- .changeset/lovely-queens-occur.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/lovely-queens-occur.md b/.changeset/lovely-queens-occur.md index cc28e3f6..e896bc66 100644 --- a/.changeset/lovely-queens-occur.md +++ b/.changeset/lovely-queens-occur.md @@ -1,5 +1,5 @@ --- -'steiger': minor +'steiger': patch --- Interactively suggest folders when a missing folder was specified in the command or when it wasn't specified at all From d79842eea25dc04ee7d85e756bc02b65b1724dd8 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Tue, 24 Dec 2024 18:39:01 +0100 Subject: [PATCH 7/9] Set the cwd for `isGitIgnored` to the Git root --- packages/steiger/package.json | 1 + .../choose-root-folder/choose-from-similar.ts | 3 ++- .../src/features/transfer-fs-to-vfs.ts | 22 +++---------------- pnpm-lock.yaml | 9 ++++++++ 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/packages/steiger/package.json b/packages/steiger/package.json index 2be145c3..f73d04fa 100644 --- a/packages/steiger/package.json +++ b/packages/steiger/package.json @@ -45,6 +45,7 @@ "chokidar": "^4.0.1", "cosmiconfig": "^9.0.0", "effector": "^23.2.3", + "empathic": "^1.0.0", "fastest-levenshtein": "^1.0.16", "globby": "^14.0.2", "immer": "^10.1.1", diff --git a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts index 88404c08..bf2178cd 100644 --- a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts +++ b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts @@ -2,6 +2,7 @@ import { readdir } from 'node:fs/promises' import { parse, relative, sep, join } from 'node:path' import pc from 'picocolors' import { isGitIgnored } from 'globby' +import * as find from 'empathic/find' import { distance } from 'fastest-levenshtein' import { isCancel, outro, select, confirm } from '@clack/prompts' @@ -10,7 +11,7 @@ import { ExitException } from './exit-exception' /** The maximum Levenshtein distance between the input and the reference for the input to be considered a typo. */ const typoThreshold = 5 -const isIgnored = await isGitIgnored() +const isIgnored = await isGitIgnored({ cwd: find.up('.git') }) /** Present the user with a choice of folders based on similarity to a given input. */ export async function chooseFromSimilar(input: string): Promise { diff --git a/packages/steiger/src/features/transfer-fs-to-vfs.ts b/packages/steiger/src/features/transfer-fs-to-vfs.ts index 181e9ec3..02de8ae8 100644 --- a/packages/steiger/src/features/transfer-fs-to-vfs.ts +++ b/packages/steiger/src/features/transfer-fs-to-vfs.ts @@ -1,27 +1,11 @@ -import { join, sep, resolve, parse, dirname } from 'node:path' -import { existsSync } from 'node:fs' +import { join, sep } from 'node:path' import chokidar from 'chokidar' +import * as find from 'empathic/find' import type { Folder } from '@steiger/types' import { isGitIgnored } from 'globby' import { createVfsRoot } from '../models/vfs' -function findGitRoot(startDir: string): string | null { - let currentDir = resolve(startDir) - - while (currentDir !== parse(currentDir).root) { - const gitFolderOrLinkPath = join(currentDir, '.git') - - if (existsSync(gitFolderOrLinkPath)) { - return currentDir - } - // Move up one directory - currentDir = dirname(currentDir) - } - - return null -} - /** * Start watching a given path with chokidar. * @@ -29,7 +13,7 @@ function findGitRoot(startDir: string): string | null { */ export async function createWatcher(path: string) { const vfs = createVfsRoot(path) - const isIgnored = await isGitIgnored({ cwd: findGitRoot(path) || path }) + const isIgnored = await isGitIgnored({ cwd: find.up('.git', { cwd: path }) ?? path }) const watcher = chokidar.watch(path, { ignored: (path) => path.split(sep).includes('node_modules') || isIgnored(path), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79de748c..675c6a26 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,6 +90,9 @@ importers: effector: specifier: ^23.2.3 version: 23.2.3 + empathic: + specifier: ^1.0.0 + version: 1.0.0 fastest-levenshtein: specifier: ^1.0.16 version: 1.0.16 @@ -1628,6 +1631,10 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@1.0.0: + resolution: {integrity: sha512-qtKgI1Mv8rTacvpaTkh28HM2Lbf+IOjXb7rhpt/42kZxRm8TBb/IVlo5iL2ztT19kc/EHAFN0fZ641avlXAgdg==} + engines: {node: '>=16'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -4225,6 +4232,8 @@ snapshots: emoji-regex@9.2.2: {} + empathic@1.0.0: {} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 From e0e6f055ecc420c802e28518ac5ad029a426c1a2 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Fri, 27 Dec 2024 14:08:42 +0100 Subject: [PATCH 8/9] Ignore `.git` along with git-ignored files --- .../src/features/choose-root-folder/choose-from-similar.ts | 2 +- packages/steiger/src/features/transfer-fs-to-vfs.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts index bf2178cd..bfa42574 100644 --- a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts +++ b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts @@ -20,7 +20,7 @@ export async function chooseFromSimilar(input: string): Promise { const existingDir = await resolveWithCorrections(dir || '.') const candidates = (await readdir(existingDir, { withFileTypes: true })) - .filter((entry) => entry.isDirectory() && !isIgnored(join(existingDir, entry.name))) + .filter((entry) => entry.isDirectory() && entry.name !== '.git' && !isIgnored(join(existingDir, entry.name))) .map((entry) => entry.name) const withDistances = candidates.map((candidate) => [candidate, distance(candidate, base)] as const) const suggestions = withDistances diff --git a/packages/steiger/src/features/transfer-fs-to-vfs.ts b/packages/steiger/src/features/transfer-fs-to-vfs.ts index 02de8ae8..d22a8259 100644 --- a/packages/steiger/src/features/transfer-fs-to-vfs.ts +++ b/packages/steiger/src/features/transfer-fs-to-vfs.ts @@ -16,7 +16,7 @@ export async function createWatcher(path: string) { const isIgnored = await isGitIgnored({ cwd: find.up('.git', { cwd: path }) ?? path }) const watcher = chokidar.watch(path, { - ignored: (path) => path.split(sep).includes('node_modules') || isIgnored(path), + ignored: (path) => path.split(sep).includes('node_modules') || path.split(sep).includes('.git') || isIgnored(path), ignoreInitial: false, alwaysStat: true, awaitWriteFinish: true, From 64ce7f24cf457deb674ca3010b8ba7cf022346a7 Mon Sep 17 00:00:00 2001 From: Lev Chelyadinov Date: Fri, 27 Dec 2024 14:46:52 +0100 Subject: [PATCH 9/9] Fix `.git` being the CWD --- .../src/features/choose-root-folder/choose-from-similar.ts | 5 +++-- packages/steiger/src/features/transfer-fs-to-vfs.ts | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts index bfa42574..db188595 100644 --- a/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts +++ b/packages/steiger/src/features/choose-root-folder/choose-from-similar.ts @@ -1,5 +1,5 @@ import { readdir } from 'node:fs/promises' -import { parse, relative, sep, join } from 'node:path' +import { parse, relative, sep, join, dirname } from 'node:path' import pc from 'picocolors' import { isGitIgnored } from 'globby' import * as find from 'empathic/find' @@ -11,7 +11,8 @@ import { ExitException } from './exit-exception' /** The maximum Levenshtein distance between the input and the reference for the input to be considered a typo. */ const typoThreshold = 5 -const isIgnored = await isGitIgnored({ cwd: find.up('.git') }) +const gitFolder = find.up('.git') +const isIgnored = await isGitIgnored({ cwd: gitFolder ? dirname(gitFolder) : undefined }) /** Present the user with a choice of folders based on similarity to a given input. */ export async function chooseFromSimilar(input: string): Promise { diff --git a/packages/steiger/src/features/transfer-fs-to-vfs.ts b/packages/steiger/src/features/transfer-fs-to-vfs.ts index d22a8259..426a6951 100644 --- a/packages/steiger/src/features/transfer-fs-to-vfs.ts +++ b/packages/steiger/src/features/transfer-fs-to-vfs.ts @@ -1,4 +1,4 @@ -import { join, sep } from 'node:path' +import { dirname, join, sep } from 'node:path' import chokidar from 'chokidar' import * as find from 'empathic/find' import type { Folder } from '@steiger/types' @@ -13,7 +13,8 @@ import { createVfsRoot } from '../models/vfs' */ export async function createWatcher(path: string) { const vfs = createVfsRoot(path) - const isIgnored = await isGitIgnored({ cwd: find.up('.git', { cwd: path }) ?? path }) + const gitFolder = find.up('.git', { cwd: path }) + const isIgnored = await isGitIgnored({ cwd: gitFolder ? dirname(gitFolder) : path }) const watcher = chokidar.watch(path, { ignored: (path) => path.split(sep).includes('node_modules') || path.split(sep).includes('.git') || isIgnored(path),