From 8be1f43ddf4ffeb8f20850751ae5a514e9e6d578 Mon Sep 17 00:00:00 2001 From: Sandeep Ramgolam Date: Tue, 6 May 2025 00:37:58 +0400 Subject: [PATCH 01/15] add vue-pacer + debounce helper --- packages/vue-pacer/eslint.config.js | 40 ++++++++ packages/vue-pacer/package.json | 63 +++++++++++++ packages/vue-pacer/src/debouncer/index.ts | 2 + .../src/debouncer/useDebouncedValue.ts | 92 ++++++++++++++++++ .../vue-pacer/src/debouncer/useDebouncer.ts | 94 +++++++++++++++++++ packages/vue-pacer/src/index.ts | 2 + packages/vue-pacer/src/types/index.ts | 11 +++ packages/vue-pacer/tsconfig.json | 4 + packages/vue-pacer/vite.config.ts | 27 ++++++ 9 files changed, 335 insertions(+) create mode 100644 packages/vue-pacer/eslint.config.js create mode 100644 packages/vue-pacer/package.json create mode 100644 packages/vue-pacer/src/debouncer/index.ts create mode 100644 packages/vue-pacer/src/debouncer/useDebouncedValue.ts create mode 100644 packages/vue-pacer/src/debouncer/useDebouncer.ts create mode 100644 packages/vue-pacer/src/index.ts create mode 100644 packages/vue-pacer/src/types/index.ts create mode 100644 packages/vue-pacer/tsconfig.json create mode 100644 packages/vue-pacer/vite.config.ts diff --git a/packages/vue-pacer/eslint.config.js b/packages/vue-pacer/eslint.config.js new file mode 100644 index 00000000..ae0c9cca --- /dev/null +++ b/packages/vue-pacer/eslint.config.js @@ -0,0 +1,40 @@ +// @ts-check + +// @ts-ignore Needed due to moduleResolution Node vs Bundler +import { tanstackConfig } from '@tanstack/config/eslint' + +export default [ + ...tanstackConfig, + { + name: 'tanstack/vue', + rules: { + 'import/order': [ + 'error', + { + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + 'object', + 'type', + ], + pathGroups: [ + { + pattern: 'vue', + group: 'external', + position: 'before', + }, + ], + 'newlines-between': 'never', + alphabetize: { + order: 'asc', + caseInsensitive: true, + }, + }, + ], + }, + }, +] diff --git a/packages/vue-pacer/package.json b/packages/vue-pacer/package.json new file mode 100644 index 00000000..26f27449 --- /dev/null +++ b/packages/vue-pacer/package.json @@ -0,0 +1,63 @@ +{ + "name": "@tanstack/vue-pacer", + "version": "0.0.1", + "description": "Vue adapter for TanStack Pacer - Utilities for debouncing, throttling, rate limiting, queuing", + "author": "Sandeep Ramgolam", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/tanstack/pacer.git", + "directory": "packages/vue-pacer" + }, + "homepage": "https://tanstack.com/pacer", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "type": "module", + "types": "dist/esm/types/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/types/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/types/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "scripts": { + "clean": "premove ./build ./dist", + "test:eslint": "eslint ./src", + "test:lib": "vitest --passWithNoTests", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc", + "test:build": "publint --strict", + "build": "vite build" + }, + "files": [ + "dist", + "src" + ], + "dependencies": { + "@tanstack/pacer": "workspace:*", + "vue": "^3.3.0" + }, + "devDependencies": { + "@tanstack/config": "0.18.0", + "@vitejs/plugin-vue": "^4.5.0", + "@vue/test-utils": "^2.4.0", + "typescript": "^5.0.0", + "vite": "^5.0.0", + "vitest": "^0.34.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/vue-pacer/src/debouncer/index.ts b/packages/vue-pacer/src/debouncer/index.ts new file mode 100644 index 00000000..c87c02b2 --- /dev/null +++ b/packages/vue-pacer/src/debouncer/index.ts @@ -0,0 +1,2 @@ +export { useDebouncer } from './useDebouncer' +export { useDebouncedValue } from './useDebouncedValue' diff --git a/packages/vue-pacer/src/debouncer/useDebouncedValue.ts b/packages/vue-pacer/src/debouncer/useDebouncedValue.ts new file mode 100644 index 00000000..eea52b8f --- /dev/null +++ b/packages/vue-pacer/src/debouncer/useDebouncedValue.ts @@ -0,0 +1,92 @@ +import type { ComputedRef, Ref } from 'vue' +import { unref, watch } from 'vue' +import { useDebouncer } from './useDebouncer' +import type { MaybeRefOrGetter } from '../types' +import type { DebouncerOptions } from '@tanstack/pacer' + +export interface UseDebouncedValueReturn { + /** The current debounced value */ + value: Ref + /** Force immediate update of the value */ + flush: () => void + /** Cancel any pending updates */ + cancel: () => void + /** Check if there are any pending updates */ + isPending: ComputedRef +} + +/** + * A Vue composable that creates a debounced value that updates only after a specified delay. + * This composable automatically tracks changes to the input value and updates the + * debounced value accordingly. + * + * The debounced value will only update after the specified wait time has elapsed since + * the last change to the input value. If the input value changes again before the wait + * time expires, the timer resets and starts waiting again. + * + * @example + * ```vue + * + * + * + * ``` + */ +export function useDebouncedValue( + inputValue: MaybeRefOrGetter, + options: DebouncerOptions<(value: TValue) => void> +): UseDebouncedValueReturn { + const getValue = typeof inputValue === 'function' + ? inputValue as () => TValue + : () => unref(inputValue) + + const { value: debouncedValue, setValue, flush, cancel, isPending } = useDebouncer(getValue(), options) + + watch( + getValue, + (newValue) => { + setValue(newValue) + }, + { immediate: true } + ) + + return { + value: debouncedValue, + flush, + cancel, + isPending + } +} diff --git a/packages/vue-pacer/src/debouncer/useDebouncer.ts b/packages/vue-pacer/src/debouncer/useDebouncer.ts new file mode 100644 index 00000000..b6692ad9 --- /dev/null +++ b/packages/vue-pacer/src/debouncer/useDebouncer.ts @@ -0,0 +1,94 @@ +import type { ComputedRef, Ref } from 'vue' +import { Debouncer } from '@tanstack/pacer' +import { computed, ref, unref } from 'vue' +import type { MaybeRef } from '../types' +import type { DebouncerOptions } from '@tanstack/pacer' + +export interface UseDebouncerReturn { + /** The current debounced value */ + value: Ref + /** Set a new value (will be debounced) */ + setValue: (newValue: TValue) => void + /** Force immediate update of the value */ + flush: () => void + /** Cancel any pending updates */ + cancel: () => void + /** Check if there are any pending updates */ + isPending: ComputedRef +} + +/** + * Creates a debouncer instance with Vue reactivity integration. + * This composable provides a debounced value that updates only after + * a specified delay has passed since the last update. + * + * @example + * ```vue + * + * + * + * ``` + */ +export function useDebouncer( + initialValue: MaybeRef, + options: DebouncerOptions<(value: TValue) => void> +): UseDebouncerReturn { + const value = ref(unref(initialValue)) as Ref + + const debouncer = new Debouncer((newValue: TValue) => { + value.value = newValue + }, options) + + const isPending = computed(() => debouncer.getIsPending()) + + return { + value, + setValue: (newValue: TValue) => { + debouncer.maybeExecute(newValue) + }, + flush: () => { + if (value.value !== undefined) { + // Force immediate execution by setting wait to 0 + debouncer.setOptions({ ...options, wait: 0 }) + debouncer.maybeExecute(value.value) + debouncer.setOptions(options) + } + }, + cancel: () => debouncer.cancel(), + isPending + } +} diff --git a/packages/vue-pacer/src/index.ts b/packages/vue-pacer/src/index.ts new file mode 100644 index 00000000..d492d2de --- /dev/null +++ b/packages/vue-pacer/src/index.ts @@ -0,0 +1,2 @@ +export * from './debouncer' +export * from './types' diff --git a/packages/vue-pacer/src/types/index.ts b/packages/vue-pacer/src/types/index.ts new file mode 100644 index 00000000..27f7dc41 --- /dev/null +++ b/packages/vue-pacer/src/types/index.ts @@ -0,0 +1,11 @@ +import type { Ref } from 'vue' +import type { Debouncer } from '@tanstack/pacer/debouncer' + +export type VueDebouncer = Debouncer<(value: TValue) => void> & { + readonly value: TValue +} + +export type MaybeRef = T | Ref +export type MaybeRefOrGetter = MaybeRef | (() => T) +export type UnwrapRef = T extends Ref ? U : T +export type UnwrapMaybeRef = T extends Ref ? U : T diff --git a/packages/vue-pacer/tsconfig.json b/packages/vue-pacer/tsconfig.json new file mode 100644 index 00000000..44533f71 --- /dev/null +++ b/packages/vue-pacer/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src", "eslint.config.js", "vite.config.ts", "tests"] +} diff --git a/packages/vue-pacer/vite.config.ts b/packages/vue-pacer/vite.config.ts new file mode 100644 index 00000000..1e15167a --- /dev/null +++ b/packages/vue-pacer/vite.config.ts @@ -0,0 +1,27 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import vue from '@vitejs/plugin-vue' +import packageJson from './package.json' + +const config = defineConfig({ + plugins: [vue()], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + globals: true, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: [ + './src/debouncer/index.ts', + './src/index.ts', + './src/types/index.ts', + ], + srcDir: './src', + }), +) From 28e9fb4b59c948f0b8cd037332c1628f4681c583 Mon Sep 17 00:00:00 2001 From: Sandeep Ramgolam Date: Tue, 6 May 2025 00:38:19 +0400 Subject: [PATCH 02/15] add vue-pacer example from debounce --- examples/vue/debounce/index.html | 12 ++ examples/vue/debounce/package.json | 21 +++ examples/vue/debounce/src/App.vue | 187 +++++++++++++++++++++++ examples/vue/debounce/src/env.d.ts | 8 + examples/vue/debounce/src/main.ts | 4 + examples/vue/debounce/tsconfig.json | 25 +++ examples/vue/debounce/tsconfig.node.json | 10 ++ examples/vue/debounce/vite.config.ts | 6 + 8 files changed, 273 insertions(+) create mode 100644 examples/vue/debounce/index.html create mode 100644 examples/vue/debounce/package.json create mode 100644 examples/vue/debounce/src/App.vue create mode 100644 examples/vue/debounce/src/env.d.ts create mode 100644 examples/vue/debounce/src/main.ts create mode 100644 examples/vue/debounce/tsconfig.json create mode 100644 examples/vue/debounce/tsconfig.node.json create mode 100644 examples/vue/debounce/vite.config.ts diff --git a/examples/vue/debounce/index.html b/examples/vue/debounce/index.html new file mode 100644 index 00000000..7de25718 --- /dev/null +++ b/examples/vue/debounce/index.html @@ -0,0 +1,12 @@ + + + + + + Vue Debouncing Example - TanStack Pacer + + +
+ + + diff --git a/examples/vue/debounce/package.json b/examples/vue/debounce/package.json new file mode 100644 index 00000000..09d5ad40 --- /dev/null +++ b/examples/vue/debounce/package.json @@ -0,0 +1,21 @@ +{ + "name": "vue-debouncing-example", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@tanstack/vue-pacer": "workspace:*", + "vue": "^3.3.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.3.0", + "typescript": "^5.0.0", + "vite": "^4.4.9", + "vue-tsc": "^1.8.8" + } +} diff --git a/examples/vue/debounce/src/App.vue b/examples/vue/debounce/src/App.vue new file mode 100644 index 00000000..b39ac837 --- /dev/null +++ b/examples/vue/debounce/src/App.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/examples/vue/debounce/src/env.d.ts b/examples/vue/debounce/src/env.d.ts new file mode 100644 index 00000000..6977c557 --- /dev/null +++ b/examples/vue/debounce/src/env.d.ts @@ -0,0 +1,8 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/examples/vue/debounce/src/main.ts b/examples/vue/debounce/src/main.ts new file mode 100644 index 00000000..01433bca --- /dev/null +++ b/examples/vue/debounce/src/main.ts @@ -0,0 +1,4 @@ +import { createApp } from 'vue' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/examples/vue/debounce/tsconfig.json b/examples/vue/debounce/tsconfig.json new file mode 100644 index 00000000..ee327f7d --- /dev/null +++ b/examples/vue/debounce/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src", "vite.config.ts"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/examples/vue/debounce/tsconfig.node.json b/examples/vue/debounce/tsconfig.node.json new file mode 100644 index 00000000..42872c59 --- /dev/null +++ b/examples/vue/debounce/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/vue/debounce/vite.config.ts b/examples/vue/debounce/vite.config.ts new file mode 100644 index 00000000..c40aa3c3 --- /dev/null +++ b/examples/vue/debounce/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + plugins: [vue()], +}) From 9511d37338e91f7b3513069ea8ebb358aafecf6c Mon Sep 17 00:00:00 2001 From: Sandeep Ramgolam Date: Tue, 6 May 2025 00:39:06 +0400 Subject: [PATCH 03/15] update the documentation for vue-pacer and the debounce helper --- docs/framework/vue/adapter.md | 38 ++++++++++ .../reference/functions/usedebouncedvalue.md | 74 +++++++++++++++++++ .../vue/reference/functions/usedebouncer.md | 58 +++++++++++++++ docs/framework/vue/reference/index.md | 13 ++++ 4 files changed, 183 insertions(+) create mode 100644 docs/framework/vue/adapter.md create mode 100644 docs/framework/vue/reference/functions/usedebouncedvalue.md create mode 100644 docs/framework/vue/reference/functions/usedebouncer.md create mode 100644 docs/framework/vue/reference/index.md diff --git a/docs/framework/vue/adapter.md b/docs/framework/vue/adapter.md new file mode 100644 index 00000000..59f95364 --- /dev/null +++ b/docs/framework/vue/adapter.md @@ -0,0 +1,38 @@ +--- +title: TanStack Pacer Vue Adapter +id: adapter +--- + +If you are using TanStack Pacer in a Vue application, we recommend using the Vue Adapter. The Vue Adapter provides a set of easy-to-use composables on top of the core Pacer utilities. If you find yourself wanting to use the core Pacer classes/functions directly, the Vue Adapter will also re-export everything from the core package. + +## Installation + +```sh +npm install @tanstack/vue-pacer +``` + +## Vue Composables + +See the [Vue Functions Reference](./reference/index.md) to see the full list of composables available in the Vue Adapter. + +## Basic Usage + +Import a Vue specific composable from the Vue Adapter. + +```vue + +``` + +Or import a core Pacer class/function that is re-exported from the Vue Adapter. + +```ts +import { debounce, Debouncer } from '@tanstack/vue-pacer' // no need to install the core package separately +``` diff --git a/docs/framework/vue/reference/functions/usedebouncedvalue.md b/docs/framework/vue/reference/functions/usedebouncedvalue.md new file mode 100644 index 00000000..3ea394be --- /dev/null +++ b/docs/framework/vue/reference/functions/usedebouncedvalue.md @@ -0,0 +1,74 @@ +--- +title: useDebouncedValue +id: usedebouncedvalue +--- + +# useDebouncedValue + +A Vue composable that creates a debounced value that updates only after a specified delay. This composable automatically tracks changes to the input value and updates the debounced value accordingly. + +## Usage + +```vue + + + +``` + +## Type Declaration + +```ts +function useDebouncedValue( + value: MaybeRefOrGetter, + options: DebouncerOptions<(value: TValue) => void> +): [Ref, VueDebouncer] +``` + +## Parameters + +- `value`: The value to debounce. Can be: + - A raw value + - A Vue ref + - A getter function +- `options`: Configuration options for the debouncer + - `wait`: The number of milliseconds to delay + - `maxWait`: Optional maximum time the debouncer will wait before invoking + - `leading`: Optional, if true the debouncer will invoke on the leading edge + - `trailing`: Optional, if true the debouncer will invoke on the trailing edge + +## Returns + +Returns a tuple containing: +1. A Vue ref containing the current debounced value +2. A debouncer instance with the following methods: + - `set(value)`: Update the debounced value + - `cancel()`: Cancel any pending debounced invocations + - `flush()`: Immediately invoke any pending debounced invocations + - `isPending()`: Check if there are any pending invocations + - `value`: Get the current debounced value diff --git a/docs/framework/vue/reference/functions/usedebouncer.md b/docs/framework/vue/reference/functions/usedebouncer.md new file mode 100644 index 00000000..d04602d2 --- /dev/null +++ b/docs/framework/vue/reference/functions/usedebouncer.md @@ -0,0 +1,58 @@ +--- +title: useDebouncer +id: usedebouncer +--- + +# useDebouncer + +A Vue composable that creates a debouncer instance with Vue reactivity integration. This composable provides a debounced value that updates only after a specified delay has passed since the last update. + +## Usage + +```vue + +``` + +## Type Declaration + +```ts +function useDebouncer( + initialValue: MaybeRef, + options: DebouncerOptions<(value: TValue) => void> +): [Ref, VueDebouncer] +``` + +## Parameters + +- `initialValue`: The initial value for the debouncer. Can be a raw value or a Vue ref. +- `options`: Configuration options for the debouncer + - `wait`: The number of milliseconds to delay + - `maxWait`: Optional maximum time the debouncer will wait before invoking + - `leading`: Optional, if true the debouncer will invoke on the leading edge + - `trailing`: Optional, if true the debouncer will invoke on the trailing edge + +## Returns + +Returns a tuple containing: +1. A Vue ref containing the current debounced value +2. A debouncer instance with the following methods: + - `set(value)`: Update the debounced value + - `cancel()`: Cancel any pending debounced invocations + - `flush()`: Immediately invoke any pending debounced invocations + - `isPending()`: Check if there are any pending invocations + - `value`: Get the current debounced value diff --git a/docs/framework/vue/reference/index.md b/docs/framework/vue/reference/index.md new file mode 100644 index 00000000..3375c212 --- /dev/null +++ b/docs/framework/vue/reference/index.md @@ -0,0 +1,13 @@ +--- +title: Vue Functions Reference +id: reference +--- + +# Vue Functions Reference + +The Vue Adapter provides a set of composables that wrap the core Pacer utilities. These composables are designed to work seamlessly with Vue's reactivity system and provide an idiomatic Vue experience. + +## Debouncing + +- [useDebouncer](./functions/usedebouncer.md) - Creates a debouncer instance with Vue reactivity integration +- [useDebouncedValue](./functions/usedebouncedvalue.md) - Creates a debounced value that updates after a delay From 5b0d423ebf252e1c33235b2e2ec1415ef93736c8 Mon Sep 17 00:00:00 2001 From: Sandeep Ramgolam Date: Tue, 6 May 2025 00:49:19 +0400 Subject: [PATCH 04/15] docs: update useDeboucer + useDebouncedValue --- .../reference/functions/usedebouncedvalue.md | 84 +++++++++++++----- .../vue/reference/functions/usedebouncer.md | 88 +++++++++++++++---- 2 files changed, 130 insertions(+), 42 deletions(-) diff --git a/docs/framework/vue/reference/functions/usedebouncedvalue.md b/docs/framework/vue/reference/functions/usedebouncedvalue.md index 3ea394be..81c51f33 100644 --- a/docs/framework/vue/reference/functions/usedebouncedvalue.md +++ b/docs/framework/vue/reference/functions/usedebouncedvalue.md @@ -10,33 +10,72 @@ A Vue composable that creates a debounced value that updates only after a specif ## Usage ```vue - ``` @@ -47,7 +86,7 @@ debouncer.cancel() // Cancel pending updates function useDebouncedValue( value: MaybeRefOrGetter, options: DebouncerOptions<(value: TValue) => void> -): [Ref, VueDebouncer] +): UseDebouncedValueReturn ``` ## Parameters @@ -64,11 +103,8 @@ function useDebouncedValue( ## Returns -Returns a tuple containing: -1. A Vue ref containing the current debounced value -2. A debouncer instance with the following methods: - - `set(value)`: Update the debounced value - - `cancel()`: Cancel any pending debounced invocations - - `flush()`: Immediately invoke any pending debounced invocations - - `isPending()`: Check if there are any pending invocations - - `value`: Get the current debounced value +Returns an object containing: +- `value`: A Vue ref containing the current debounced value +- `flush()`: Immediately invoke any pending debounced invocations +- `cancel()`: Cancel any pending debounced invocations +- `isPending`: A Vue ref indicating if there are pending updates diff --git a/docs/framework/vue/reference/functions/usedebouncer.md b/docs/framework/vue/reference/functions/usedebouncer.md index d04602d2..da4fed37 100644 --- a/docs/framework/vue/reference/functions/usedebouncer.md +++ b/docs/framework/vue/reference/functions/usedebouncer.md @@ -10,22 +10,76 @@ A Vue composable that creates a debouncer instance with Vue reactivity integrati ## Usage ```vue - + + ``` ## Type Declaration @@ -34,7 +88,7 @@ debouncer.cancel() function useDebouncer( initialValue: MaybeRef, options: DebouncerOptions<(value: TValue) => void> -): [Ref, VueDebouncer] +): UseDebouncerReturn ``` ## Parameters @@ -48,11 +102,9 @@ function useDebouncer( ## Returns -Returns a tuple containing: -1. A Vue ref containing the current debounced value -2. A debouncer instance with the following methods: - - `set(value)`: Update the debounced value - - `cancel()`: Cancel any pending debounced invocations - - `flush()`: Immediately invoke any pending debounced invocations - - `isPending()`: Check if there are any pending invocations - - `value`: Get the current debounced value +Returns an object containing: +- `value`: A Vue ref containing the current debounced value +- `setValue(newValue)`: Function to update the debounced value +- `flush()`: Immediately invoke any pending debounced invocations +- `cancel()`: Cancel any pending debounced invocations +- `isPending`: A Vue ref indicating if there are pending updates From 848a70e1c861861f17bb6fa8d6328873a6479587 Mon Sep 17 00:00:00 2001 From: Sandeep Ramgolam Date: Tue, 6 May 2025 00:49:42 +0400 Subject: [PATCH 05/15] docs: update inline docs to vue3 script setup --- .../src/debouncer/useDebouncedValue.ts | 73 +++++++++++++------ .../vue-pacer/src/debouncer/useDebouncer.ts | 71 +++++++++++++----- 2 files changed, 104 insertions(+), 40 deletions(-) diff --git a/packages/vue-pacer/src/debouncer/useDebouncedValue.ts b/packages/vue-pacer/src/debouncer/useDebouncedValue.ts index eea52b8f..d6d2f39c 100644 --- a/packages/vue-pacer/src/debouncer/useDebouncedValue.ts +++ b/packages/vue-pacer/src/debouncer/useDebouncedValue.ts @@ -26,41 +26,72 @@ export interface UseDebouncedValueReturn { * * @example * ```vue - * * * * ``` diff --git a/packages/vue-pacer/src/debouncer/useDebouncer.ts b/packages/vue-pacer/src/debouncer/useDebouncer.ts index b6692ad9..d28005f5 100644 --- a/packages/vue-pacer/src/debouncer/useDebouncer.ts +++ b/packages/vue-pacer/src/debouncer/useDebouncer.ts @@ -24,29 +24,36 @@ export interface UseDebouncerReturn { * * @example * ```vue - * From 6ced06f78019b58122353486b0bb69d635fc1a1f Mon Sep 17 00:00:00 2001 From: Sandeep Ramgolam Date: Wed, 7 May 2025 23:35:49 +0400 Subject: [PATCH 10/15] add elapsed time example fix status and execution count not wrapped properly --- examples/vue/debounce/src/App.vue | 59 +++++++++++-- .../src/debouncer/useDebouncedValue.ts | 4 +- .../vue-pacer/src/debouncer/useDebouncer.ts | 86 +++++++++++++------ 3 files changed, 116 insertions(+), 33 deletions(-) diff --git a/examples/vue/debounce/src/App.vue b/examples/vue/debounce/src/App.vue index aad27c5f..c8577bf7 100644 --- a/examples/vue/debounce/src/App.vue +++ b/examples/vue/debounce/src/App.vue @@ -57,6 +57,7 @@

Debounced value: {{ debouncedControlled }}

Status: {{ controlledIsPending ? 'Update Pending...' : 'Up to date' }}

Execution count: {{ controlledExecutionCount }}

+

Time typing: {{ elapsedTypingTime }}ms

Leading edge: {{ isLeading ? 'Enabled' : 'Disabled' }}

Debouncer: {{ isEnabled ? 'Enabled' : 'Disabled' }}

@@ -94,6 +95,11 @@ const controlledValue = ref('') const isEnabled = ref(true) const isLeading = ref(false) +// Timing for typing duration +const typingStartTime = ref(null) +const elapsedTypingTime = ref(0) +const elapsedTimeInterval = ref(null) + // Toggle functions const toggleEnabled = () => { isEnabled.value = !isEnabled.value @@ -104,27 +110,66 @@ const toggleLeading = () => { isLeading.value = !isLeading.value setControlledOptions({ leading: isLeading.value }) } + const { value: debouncedControlled, executionCount: controlledExecutionCount, isPending: controlledIsPending, setOptions: setControlledOptions, cancel: cancelControlled, - flush: flushControlled + flush: flushControlled, + setValue: setDebouncedControlledValue } = useDebouncer( - controlledValue, + controlledValue.value, { wait: 1000, - leading: false, // Don't execute on first call - trailing: true, // Execute after wait period - enabled: true, // Start enabled + leading: isLeading.value, + trailing: true, + enabled: isEnabled.value, }, ) +// Watch the raw input and call the debouncer's setValue +watch(controlledValue, (newValue) => { + setDebouncedControlledValue(newValue) +}) + +// Watch for pending state changes to manage typing timer +watch(controlledIsPending, (pending, oldPending) => { + console.log(`[App.vue] controlledIsPending changed from ${oldPending} to ${pending}`); + if (pending) { + typingStartTime.value = Date.now(); + console.log(`[App.vue] Typing timer started. Start time: ${typingStartTime.value}`); + if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value); // Clear previous, just in case + elapsedTimeInterval.value = setInterval(() => { + if (typingStartTime.value) { + elapsedTypingTime.value = Date.now() - typingStartTime.value; + // console.log(`[App.vue] Interval: elapsedTypingTime = ${elapsedTypingTime.value}`); // Optional: can be noisy + } else { + // This case should ideally not happen if interval is cleared promptly + if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value); + elapsedTimeInterval.value = null; + } + }, 50); // Update every 50ms + } else { + if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value); + elapsedTimeInterval.value = null; + typingStartTime.value = null; // Ensure this is nulled + console.log(`[App.vue] Typing timer stopped. Final elapsed: ${elapsedTypingTime.value}ms`); + // elapsedTypingTime holds the last value until next typing or reset + } +}); + // Reset both value and pending state const resetControlled = () => { - cancelControlled() - controlledValue.value = '' + console.log('[App.vue] resetControlled called'); + cancelControlled(); // This will make controlledIsPending false + controlledValue.value = ''; + // Also explicitly reset typing time on manual reset + if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value); + elapsedTimeInterval.value = null; + typingStartTime.value = null; + elapsedTypingTime.value = 0; } diff --git a/packages/vue-pacer/src/debouncer/useDebouncedValue.ts b/packages/vue-pacer/src/debouncer/useDebouncedValue.ts index d6d2f39c..4ba21c77 100644 --- a/packages/vue-pacer/src/debouncer/useDebouncedValue.ts +++ b/packages/vue-pacer/src/debouncer/useDebouncedValue.ts @@ -1,4 +1,4 @@ -import type { ComputedRef, Ref } from 'vue' +import type { Ref } from 'vue' import { unref, watch } from 'vue' import { useDebouncer } from './useDebouncer' import type { MaybeRefOrGetter } from '../types' @@ -12,7 +12,7 @@ export interface UseDebouncedValueReturn { /** Cancel any pending updates */ cancel: () => void /** Check if there are any pending updates */ - isPending: ComputedRef + isPending: Readonly> } /** diff --git a/packages/vue-pacer/src/debouncer/useDebouncer.ts b/packages/vue-pacer/src/debouncer/useDebouncer.ts index 98c50330..9d87d6b9 100644 --- a/packages/vue-pacer/src/debouncer/useDebouncer.ts +++ b/packages/vue-pacer/src/debouncer/useDebouncer.ts @@ -1,6 +1,6 @@ -import type { ComputedRef, Ref } from 'vue' +import type { Ref } from 'vue' import { Debouncer } from '@tanstack/pacer' -import { computed, ref, unref } from 'vue' +import { readonly, ref, unref } from 'vue' import type { MaybeRef } from '../types' import type { DebouncerOptions } from '@tanstack/pacer' @@ -14,9 +14,9 @@ export interface UseDebouncerReturn { /** Cancel any pending updates */ cancel: () => void /** Check if there are any pending updates */ - isPending: ComputedRef + isPending: Readonly> /** Get the number of times the value has been updated */ - executionCount: ComputedRef + executionCount: Readonly> /** Update debouncer options */ setOptions: (newOptions: Partial void>>) => void /** Get current debouncer options */ @@ -104,36 +104,74 @@ export interface UseDebouncerReturn { */ export function useDebouncer( initialValue: MaybeRef, - options: DebouncerOptions<(value: TValue) => void> + optionsInput: DebouncerOptions<(value: TValue) => void> ): UseDebouncerReturn { const value = ref(unref(initialValue)) as Ref + const _isPending = ref(false) + const _executionCount = ref(0) + const getEffectiveOptions = (currentOpts: DebouncerOptions<(v: TValue) => void>) => { + return { + ...currentOpts, + onExecute: () => { + // Call original onExecute if it exists + if (currentOpts.onExecute) { + // Assuming currentOpts.onExecute expects the debouncer instance + currentOpts.onExecute(debouncer as any); // Type assertion for now, can be refined + } + _isPending.value = debouncer.getIsPending() // Sync after execution + _executionCount.value = debouncer.getExecutionCount() // Sync execution count + } + } as Required void>>; + } + const debouncer = new Debouncer((newValue: TValue) => { value.value = newValue - }, options) + }, getEffectiveOptions(optionsInput)) - const isPending = computed(() => debouncer.getIsPending()) + // Initialize reactive refs with initial state from debouncer + _isPending.value = debouncer.getIsPending(); + _executionCount.value = debouncer.getExecutionCount(); - const executionCount = computed(() => debouncer.getExecutionCount()) + const wrappedSetValue = (newValue: TValue) => { + debouncer.maybeExecute(newValue) + _isPending.value = debouncer.getIsPending() // Update after trying to execute + console.log(`[useDebouncer.ts] after maybeExecute, _isPending.value = ${_isPending.value}`); + } + + const wrappedCancel = () => { + debouncer.cancel() + _isPending.value = debouncer.getIsPending() // Update after cancelling + } + + const wrappedFlush = () => { + // The core debouncer doesn't have a 'pending value' to flush to. + // It flushes by cancelling current timer and executing with last *successful* value if leading, or current *input* value for trailing. + // The previous logic was: cancel and then maybeExecute the current `value.value`. + if (value.value !== undefined) { // This is the current debounced value + debouncer.cancel() // This sets its internal _isPending to false + debouncer.maybeExecute(value.value) // This might make it pending again or execute immediately + } + _isPending.value = debouncer.getIsPending(); // Sync after flush actions + } + + const wrappedSetOptions = (newOptions: Partial void>>) => { + const currentCoreOptions = debouncer.getOptions(); + const mergedOptions = { ...currentCoreOptions, ...newOptions }; + debouncer.setOptions(getEffectiveOptions(mergedOptions)); // Re-wrap onExecute + _isPending.value = debouncer.getIsPending(); // Sync after options change + // Note: if `wait` changes, the existing timer isn't automatically rescheduled by core setOptions. + // This behavior is inherited from the core debouncer. + } return { value, - setValue: (newValue: TValue) => { - debouncer.maybeExecute(newValue) - }, - flush: () => { - if (value.value !== undefined) { - // Cancel any pending execution and force immediate execution - debouncer.cancel() - debouncer.maybeExecute(value.value) - } - }, - cancel: () => debouncer.cancel(), - isPending, - executionCount, - setOptions: (newOptions: Partial void>>) => { - debouncer.setOptions(newOptions) - }, + setValue: wrappedSetValue, + flush: wrappedFlush, + cancel: wrappedCancel, + isPending: readonly(_isPending), + executionCount: readonly(_executionCount), + setOptions: wrappedSetOptions, getOptions: () => debouncer.getOptions() } } From 93d8ef153eebd1894d330e557b26fec5acd79e5e Mon Sep 17 00:00:00 2001 From: Sandeep Ramgolam Date: Sat, 31 May 2025 16:09:54 +0300 Subject: [PATCH 11/15] update lock file --- pnpm-lock.yaml | 1357 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1357 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ec46ae6..494ec4e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1264,6 +1264,28 @@ importers: specifier: ^2.11.6 version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0)) + examples/vue/debounce: + dependencies: + '@tanstack/vue-pacer': + specifier: workspace:* + version: link:../../../packages/vue-pacer + vue: + specifier: ^3.3.0 + version: 3.5.16(typescript@5.8.3) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^4.3.0 + version: 4.6.2(vite@4.5.14(@types/node@22.15.21))(vue@3.5.16(typescript@5.8.3)) + typescript: + specifier: ^5.0.0 + version: 5.8.3 + vite: + specifier: ^4.4.9 + version: 4.5.14(@types/node@22.15.21) + vue-tsc: + specifier: ^1.8.8 + version: 1.8.27(typescript@5.8.3) + packages/pacer: {} packages/react-pacer: @@ -1307,6 +1329,34 @@ importers: specifier: ^2.11.6 version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0)) + packages/vue-pacer: + dependencies: + '@tanstack/pacer': + specifier: workspace:* + version: link:../pacer + vue: + specifier: ^3.3.0 + version: 3.5.16(typescript@5.8.3) + devDependencies: + '@tanstack/config': + specifier: 0.18.0 + version: 0.18.0(@types/node@22.15.21)(eslint@9.27.0(jiti@2.4.2))(rollup@4.35.0)(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.21)) + '@vitejs/plugin-vue': + specifier: ^4.5.0 + version: 4.6.2(vite@5.4.19(@types/node@22.15.21))(vue@3.5.16(typescript@5.8.3)) + '@vue/test-utils': + specifier: ^2.4.0 + version: 2.4.6 + typescript: + specifier: ^5.0.0 + version: 5.8.3 + vite: + specifier: ^5.0.0 + version: 5.4.19(@types/node@22.15.21) + vitest: + specifier: ^0.34.0 + version: 0.34.6(jsdom@26.1.0) + packages: '@adobe/css-tools@4.4.2': @@ -1397,10 +1447,18 @@ packages: resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} @@ -1423,6 +1481,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.27.4': + resolution: {integrity: sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-proposal-private-methods@7.18.6': resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -1476,6 +1539,10 @@ packages: resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} + '@babel/types@7.27.3': + resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} + engines: {node: '>=6.9.0'} + '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -1588,102 +1655,300 @@ packages: '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.25.0': resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.25.0': resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.25.0': resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.25.0': resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.25.0': resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.25.0': resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.25.0': resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.0': resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.25.0': resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.25.0': resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.25.0': resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.25.0': resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.25.0': resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.25.0': resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.25.0': resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.25.0': resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.25.0': resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} @@ -1696,6 +1961,18 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.0': resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} @@ -1708,30 +1985,90 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.0': resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.25.0': resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.25.0': resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.25.0': resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.25.0': resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} @@ -1841,6 +2178,10 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} + '@isaacs/cliui@8.0.2': + 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} @@ -1956,6 +2297,9 @@ packages: cpu: [x64] os: [win32] + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@oxc-resolver/binding-darwin-arm64@9.0.2': resolution: {integrity: sha512-MVyRgP2gzJJtAowjG/cHN3VQXwNLWnY+FpOEsyvDepJki1SdAX/8XDijM1yN6ESD1kr9uhBKjGelC6h3qtT+rA==} cpu: [arm64] @@ -2021,6 +2365,10 @@ packages: cpu: [x64] os: [win32] + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@publint/pack@0.1.2': resolution: {integrity: sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==} engines: {node: '>=18'} @@ -2257,6 +2605,14 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/chai-subset@1.3.6': + resolution: {integrity: sha512-m8lERkkQj+uek18hXOZuec3W/fCRTrU4hrnXjH3qhHy96ytuPaPiWGgu7sJb7tZxZonO75vYAjCvpe/e4VUwRw==} + peerDependencies: + '@types/chai': <5.2.0 + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} @@ -2399,6 +2755,16 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + '@vitejs/plugin-vue@4.6.2': + resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.2.25 + + '@vitest/expect@0.34.6': + resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} + '@vitest/expect@3.1.4': resolution: {integrity: sha512-xkD/ljeliyaClDYqHPNCiJ0plY5YIcM0OlRiZizLhlPmpXWpxnGMyTZXOHFhFeG7w9P5PBeL4IdtJ/HeQwTbQA==} @@ -2416,36 +2782,77 @@ packages: '@vitest/pretty-format@3.1.4': resolution: {integrity: sha512-cqv9H9GvAEoTaoq+cYqUTCGscUjKqlJZC7PRwY5FMySVj5J+xOm1KQcCiYHJOEzOKRUhLH4R2pTwvFlWCEScsg==} + '@vitest/runner@0.34.6': + resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} + '@vitest/runner@3.1.4': resolution: {integrity: sha512-djTeF1/vt985I/wpKVFBMWUlk/I7mb5hmD5oP8K9ACRmVXgKTae3TUOtXAEBfslNKPzUQvnKhNd34nnRSYgLNQ==} + '@vitest/snapshot@0.34.6': + resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} + '@vitest/snapshot@3.1.4': resolution: {integrity: sha512-JPHf68DvuO7vilmvwdPr9TS0SuuIzHvxeaCkxYcCD4jTk67XwL45ZhEHFKIuCm8CYstgI6LZ4XbwD6ANrwMpFg==} + '@vitest/spy@0.34.6': + resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} + '@vitest/spy@3.1.4': resolution: {integrity: sha512-Xg1bXhu+vtPXIodYN369M86K8shGLouNjoVI78g8iAq2rFoHFdajNvJJ5A/9bPMFcfQqdaCpOgWKEoMQg/s0Yg==} + '@vitest/utils@0.34.6': + resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} + '@vitest/utils@3.1.4': resolution: {integrity: sha512-yriMuO1cfFhmiGc8ataN51+9ooHRuURdfAZfwFd3usWynjzpLslZdYnRegTv32qdgtJTsj15FoeZe2g15fY1gg==} + '@volar/language-core@1.11.1': + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + '@volar/language-core@2.4.12': resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} + '@volar/source-map@1.11.1': + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + '@volar/source-map@2.4.12': resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} + '@volar/typescript@1.11.1': + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + '@volar/typescript@2.4.12': resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} '@vue/compiler-core@3.5.13': resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.16': + resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} + '@vue/compiler-dom@3.5.13': resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.16': + resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==} + + '@vue/compiler-sfc@3.5.16': + resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==} + + '@vue/compiler-ssr@3.5.16': + resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==} + '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/language-core@1.8.27': + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@vue/language-core@2.1.6': resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} peerDependencies: @@ -2454,9 +2861,29 @@ packages: typescript: optional: true + '@vue/reactivity@3.5.16': + resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==} + + '@vue/runtime-core@3.5.16': + resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==} + + '@vue/runtime-dom@3.5.16': + resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==} + + '@vue/server-renderer@3.5.16': + resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==} + peerDependencies: + vue: 3.5.16 + '@vue/shared@3.5.13': resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.16': + resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==} + + '@vue/test-utils@2.4.6': + resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} + '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -2478,11 +2905,19 @@ packages: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} @@ -2525,6 +2960,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -2533,6 +2972,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2550,6 +2993,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'} @@ -2630,6 +3076,10 @@ packages: caniuse-lite@1.0.30001702: resolution: {integrity: sha512-LoPe/D7zioC0REI5W73PeR1e1MLCipRGq/VkovJnd6Df+QVqT+vT33OXCp8QUd7kA7RZrHWxb1B36OQKI/0gOA==} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + chai@5.2.0: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} @@ -2649,6 +3099,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'} @@ -2699,6 +3152,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} @@ -2714,6 +3171,9 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + conventional-changelog-angular@7.0.0: resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} engines: {node: '>=16'} @@ -2777,6 +3237,10 @@ packages: decimal.js@10.5.0: resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -2843,12 +3307,23 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + electron-to-chromium@1.5.113: resolution: {integrity: sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encoding-sniffer@0.2.0: resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} @@ -2890,6 +3365,16 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.25.0: resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} @@ -3171,6 +3656,10 @@ packages: debug: optional: true + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data@4.0.2: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} @@ -3210,6 +3699,9 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -3229,6 +3721,10 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -3347,6 +3843,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -3419,6 +3918,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3434,6 +3936,15 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3518,6 +4029,10 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + local-pkg@0.5.1: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} @@ -3546,6 +4061,9 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -3622,6 +4140,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -3633,6 +4155,10 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} @@ -3643,6 +4169,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -3677,6 +4206,11 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -3740,6 +4274,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -3756,6 +4294,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} @@ -3789,13 +4330,23 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -3851,6 +4402,9 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -3954,6 +4508,11 @@ packages: peerDependencies: rollup: 2.x || 3.x || 4.x + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + rollup@4.35.0: resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -4123,6 +4682,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -4130,6 +4693,10 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -4146,6 +4713,9 @@ packages: resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} engines: {node: '>=14.16'} + strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -4198,6 +4768,10 @@ packages: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} + tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + engines: {node: '>=14.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4206,6 +4780,10 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + tinyspy@3.0.2: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} @@ -4284,6 +4862,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + typedoc-plugin-frontmatter@1.2.1: resolution: {integrity: sha512-TKiOOQCxC1uUYldokAegap2oAtDy9QpsUoVDRohcB6Dm45T91qMgkWqHVS8qbCpDc4SJoGqmGTULGfrqeRqXtA==} peerDependencies: @@ -4355,6 +4937,11 @@ packages: validate-html-nesting@1.2.2: resolution: {integrity: sha512-hGdgQozCsQJMyfK5urgFcWEqsSSrK63Awe0t/IMR0bZ0QMtnuaiHzThW81guu3qx9abLi99NEuiaN6P9gVYsNg==} + vite-node@0.34.6: + resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} + engines: {node: '>=v14.18.0'} + hasBin: true + vite-node@3.1.4: resolution: {integrity: sha512-6enNwYnpyDo4hEgytbmc6mYWHXDHYEn0D1/rw4Q+tnHUGtKTJsn8T1YkX6Q18wI5LCrS8CTYlBaiCqxOy2kvUA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -4393,6 +4980,65 @@ packages: vite: optional: true + vite@4.5.14: + resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vite@6.3.5: resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -4441,6 +5087,37 @@ packages: vite: optional: true + vitest@0.34.6: + resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + vitest@3.1.4: resolution: {integrity: sha512-Ta56rT7uWxCSJXlBtKgIlApJnT6e6IGmTYxYcmxjJ4ujuZDI59GUQgVDObXXJujOmPDBYXHK1qmaGtneu6TNIQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -4472,12 +5149,32 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vue-component-type-helpers@2.2.10: + resolution: {integrity: sha512-iDUO7uQK+Sab2tYuiP9D1oLujCWlhHELHMgV/cB13cuGbG4qwkLHvtfWb6FzvxrIOPDnU0oHsz2MlQjhYDeaHA==} + vue-eslint-parser@9.4.3: resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + + vue-tsc@1.8.27: + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + + vue@3.5.16: + resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -4528,6 +5225,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -4577,6 +5278,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} @@ -4755,8 +5460,12 @@ snapshots: '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.25.9': {} '@babel/helpers@7.26.9': @@ -4777,6 +5486,10 @@ snapshots: dependencies: '@babel/types': 7.27.0 + '@babel/parser@7.27.4': + dependencies: + '@babel/types': 7.27.3 + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -4850,6 +5563,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.27.3': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -5059,78 +5777,213 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.25.0': optional: true + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.25.0': optional: true + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.25.0': optional: true + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.25.0': optional: true + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.25.0': optional: true + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.25.0': optional: true + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.25.0': optional: true + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.25.0': optional: true + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.25.0': optional: true + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.25.0': optional: true + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.25.0': optional: true + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.25.0': optional: true + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.25.0': optional: true + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.25.0': optional: true + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.25.0': optional: true + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.25.0': optional: true + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.25.0': optional: true '@esbuild/netbsd-arm64@0.25.0': optional: true + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.25.0': optional: true '@esbuild/openbsd-arm64@0.25.0': optional: true + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.25.0': optional: true + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.25.0': optional: true + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.25.0': optional: true + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.25.0': optional: true + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.25.0': optional: true @@ -5293,6 +6146,15 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 @@ -5428,6 +6290,8 @@ snapshots: '@nx/nx-win32-x64-msvc@21.1.2': optional: true + '@one-ini/wasm@0.1.1': {} + '@oxc-resolver/binding-darwin-arm64@9.0.2': optional: true @@ -5469,6 +6333,9 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@9.0.2': optional: true + '@pkgjs/parseargs@0.11.0': + optional: true + '@publint/pack@0.1.2': {} '@rolldown/pluginutils@1.0.0-beta.9': {} @@ -5619,6 +6486,20 @@ snapshots: transitivePeerDependencies: - encoding + '@tanstack/config@0.18.0(@types/node@22.15.21)(eslint@9.27.0(jiti@2.4.2))(rollup@4.35.0)(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.21))': + dependencies: + '@tanstack/eslint-config': 0.1.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@tanstack/publish-config': 0.1.0 + '@tanstack/typedoc-config': 0.2.0(typescript@5.8.3) + '@tanstack/vite-config': 0.2.0(@types/node@22.15.21)(rollup@4.35.0)(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.21)) + transitivePeerDependencies: + - '@types/node' + - eslint + - rollup + - supports-color + - typescript + - vite + '@tanstack/config@0.18.0(@types/node@22.15.21)(eslint@9.27.0(jiti@2.4.2))(rollup@4.35.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@tanstack/eslint-config': 0.1.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) @@ -5679,6 +6560,19 @@ snapshots: transitivePeerDependencies: - typescript + '@tanstack/vite-config@0.2.0(@types/node@22.15.21)(rollup@4.35.0)(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.21))': + dependencies: + rollup-plugin-preserve-directives: 0.4.0(rollup@4.35.0) + vite-plugin-dts: 4.2.3(@types/node@22.15.21)(rollup@4.35.0)(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.21)) + vite-plugin-externalize-deps: 0.9.0(vite@5.4.19(@types/node@22.15.21)) + vite-tsconfig-paths: 5.1.4(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.21)) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + - typescript + - vite + '@tanstack/vite-config@0.2.0(@types/node@22.15.21)(rollup@4.35.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0))': dependencies: rollup-plugin-preserve-directives: 0.4.0(rollup@4.35.0) @@ -5729,6 +6623,12 @@ snapshots: dependencies: '@babel/types': 7.26.9 + '@types/chai-subset@1.3.6(@types/chai@4.3.20)': + dependencies: + '@types/chai': 4.3.20 + + '@types/chai@4.3.20': {} + '@types/conventional-commits-parser@5.0.1': dependencies: '@types/node': 22.15.21 @@ -5933,6 +6833,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitejs/plugin-vue@4.6.2(vite@4.5.14(@types/node@22.15.21))(vue@3.5.16(typescript@5.8.3))': + dependencies: + vite: 4.5.14(@types/node@22.15.21) + vue: 3.5.16(typescript@5.8.3) + + '@vitejs/plugin-vue@4.6.2(vite@5.4.19(@types/node@22.15.21))(vue@3.5.16(typescript@5.8.3))': + dependencies: + vite: 5.4.19(@types/node@22.15.21) + vue: 3.5.16(typescript@5.8.3) + + '@vitest/expect@0.34.6': + dependencies: + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + chai: 4.5.0 + '@vitest/expect@3.1.4': dependencies: '@vitest/spy': 3.1.4 @@ -5952,33 +6868,68 @@ snapshots: dependencies: tinyrainbow: 2.0.0 + '@vitest/runner@0.34.6': + dependencies: + '@vitest/utils': 0.34.6 + p-limit: 4.0.0 + pathe: 1.1.2 + '@vitest/runner@3.1.4': dependencies: '@vitest/utils': 3.1.4 pathe: 2.0.3 + '@vitest/snapshot@0.34.6': + dependencies: + magic-string: 0.30.17 + pathe: 1.1.2 + pretty-format: 29.7.0 + '@vitest/snapshot@3.1.4': dependencies: '@vitest/pretty-format': 3.1.4 magic-string: 0.30.17 pathe: 2.0.3 + '@vitest/spy@0.34.6': + dependencies: + tinyspy: 2.2.1 + '@vitest/spy@3.1.4': dependencies: tinyspy: 3.0.2 + '@vitest/utils@0.34.6': + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + '@vitest/utils@3.1.4': dependencies: '@vitest/pretty-format': 3.1.4 loupe: 3.1.3 tinyrainbow: 2.0.0 + '@volar/language-core@1.11.1': + dependencies: + '@volar/source-map': 1.11.1 + '@volar/language-core@2.4.12': dependencies: '@volar/source-map': 2.4.12 + '@volar/source-map@1.11.1': + dependencies: + muggle-string: 0.3.1 + '@volar/source-map@2.4.12': {} + '@volar/typescript@1.11.1': + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + '@volar/typescript@2.4.12': dependencies: '@volar/language-core': 2.4.12 @@ -5993,16 +6944,60 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 + '@vue/compiler-core@3.5.16': + dependencies: + '@babel/parser': 7.27.4 + '@vue/shared': 3.5.16 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + '@vue/compiler-dom@3.5.13': dependencies: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 + '@vue/compiler-dom@3.5.16': + dependencies: + '@vue/compiler-core': 3.5.16 + '@vue/shared': 3.5.16 + + '@vue/compiler-sfc@3.5.16': + dependencies: + '@babel/parser': 7.27.4 + '@vue/compiler-core': 3.5.16 + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-ssr': 3.5.16 + '@vue/shared': 3.5.16 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.3 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.16': + dependencies: + '@vue/compiler-dom': 3.5.16 + '@vue/shared': 3.5.16 + '@vue/compiler-vue2@2.7.16': dependencies: de-indent: 1.0.2 he: 1.2.0 + '@vue/language-core@1.8.27(typescript@5.8.3)': + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.8.3 + '@vue/language-core@2.1.6(typescript@5.8.3)': dependencies: '@volar/language-core': 2.4.12 @@ -6016,8 +7011,37 @@ snapshots: optionalDependencies: typescript: 5.8.3 + '@vue/reactivity@3.5.16': + dependencies: + '@vue/shared': 3.5.16 + + '@vue/runtime-core@3.5.16': + dependencies: + '@vue/reactivity': 3.5.16 + '@vue/shared': 3.5.16 + + '@vue/runtime-dom@3.5.16': + dependencies: + '@vue/reactivity': 3.5.16 + '@vue/runtime-core': 3.5.16 + '@vue/shared': 3.5.16 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.16(vue@3.5.16(typescript@5.8.3))': + dependencies: + '@vue/compiler-ssr': 3.5.16 + '@vue/shared': 3.5.16 + vue: 3.5.16(typescript@5.8.3) + '@vue/shared@3.5.13': {} + '@vue/shared@3.5.16': {} + + '@vue/test-utils@2.4.6': + dependencies: + js-beautify: 1.15.4 + vue-component-type-helpers: 2.2.10 + '@yarnpkg/lockfile@1.1.0': {} '@yarnpkg/parsers@3.0.2': @@ -6040,10 +7064,16 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 + abbrev@2.0.0: {} + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.1 + acorn@8.14.1: {} agent-base@7.1.3: {} @@ -6081,12 +7111,16 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.1.0: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -6099,6 +7133,8 @@ snapshots: array-union@2.1.0: {} + assertion-error@1.1.0: {} + assertion-error@2.0.1: {} asynckit@0.4.0: {} @@ -6184,6 +7220,16 @@ snapshots: caniuse-lite@1.0.30001702: {} + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + chai@5.2.0: dependencies: assertion-error: 2.0.1 @@ -6206,6 +7252,10 @@ snapshots: chardet@0.7.0: {} + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + check-error@2.1.1: {} cheerio-select@2.1.0: @@ -6263,6 +7313,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@10.0.1: {} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 @@ -6276,6 +7328,11 @@ snapshots: confbox@0.1.8: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 @@ -6333,6 +7390,10 @@ snapshots: decimal.js@10.5.0: {} + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + deep-eql@5.0.2: {} deep-is@0.1.4: {} @@ -6393,10 +7454,21 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + eastasianwidth@0.2.0: {} + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + electron-to-chromium@1.5.113: {} emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + encoding-sniffer@0.2.0: dependencies: iconv-lite: 0.6.3 @@ -6439,6 +7511,57 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.0: optionalDependencies: '@esbuild/aix-ppc64': 0.25.0 @@ -6835,6 +7958,11 @@ snapshots: follow-redirects@1.15.9: {} + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.2: dependencies: asynckit: 0.4.0 @@ -6873,6 +8001,8 @@ snapshots: get-caller-file@2.0.5: {} + get-func-name@2.0.2: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -6903,6 +8033,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + globals@11.12.0: {} globals@14.0.0: {} @@ -7006,6 +8145,8 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -7062,6 +8203,12 @@ snapshots: isexe@2.0.0: {} + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -7075,6 +8222,16 @@ snapshots: jju@1.4.0: {} + js-beautify@1.15.4: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -7176,6 +8333,8 @@ snapshots: dependencies: uc.micro: 2.1.0 + local-pkg@0.4.3: {} + local-pkg@0.5.1: dependencies: mlly: 1.7.4 @@ -7202,6 +8361,10 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + loupe@3.1.3: {} lru-cache@10.4.3: {} @@ -7271,6 +8434,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 @@ -7281,6 +8448,8 @@ snapshots: minimist@1.2.8: {} + minipass@7.1.2: {} + mlly@1.7.4: dependencies: acorn: 8.14.1 @@ -7292,6 +8461,8 @@ snapshots: ms@2.1.3: {} + muggle-string@0.3.1: {} + muggle-string@0.4.1: {} nanoid@3.3.9: {} @@ -7312,6 +8483,10 @@ snapshots: node-releases@2.0.19: {} + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -7439,6 +8614,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -7451,6 +8630,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.11: dependencies: quansync: 0.2.8 @@ -7482,10 +8663,19 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + path-type@4.0.0: {} + pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@1.1.1: {} + pathval@2.0.0: {} picocolors@1.1.1: {} @@ -7527,6 +8717,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + proto-list@1.2.4: {} + proxy-from-env@1.1.0: {} publint@0.3.12: @@ -7613,6 +8805,10 @@ snapshots: magic-string: 0.30.17 rollup: 4.35.0 + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + rollup@4.35.0: dependencies: '@types/estree': 1.0.6 @@ -7779,6 +8975,12 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -7787,6 +8989,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + strip-bom@3.0.0: {} strip-indent@3.0.0: @@ -7797,6 +9003,10 @@ snapshots: strip-json-comments@5.0.1: {} + strip-literal@1.3.0: + dependencies: + acorn: 8.14.1 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -7856,10 +9066,14 @@ snapshots: fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 + tinypool@0.7.0: {} + tinypool@1.0.2: {} tinyrainbow@2.0.0: {} + tinyspy@2.2.1: {} + tinyspy@3.0.2: {} tldts-core@6.1.83: {} @@ -7925,6 +9139,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.1.0: {} + typedoc-plugin-frontmatter@1.2.1(typedoc-plugin-markdown@4.4.2(typedoc@0.27.9(typescript@5.8.3))): dependencies: typedoc-plugin-markdown: 4.4.2(typedoc@0.27.9(typescript@5.8.3)) @@ -7983,6 +9199,25 @@ snapshots: validate-html-nesting@1.2.2: {} + vite-node@0.34.6(@types/node@22.15.21): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + mlly: 1.7.4 + pathe: 1.1.2 + picocolors: 1.1.1 + vite: 5.4.19(@types/node@22.15.21) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@3.1.4(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0): dependencies: cac: 6.7.14 @@ -8004,6 +9239,25 @@ snapshots: - tsx - yaml + vite-plugin-dts@4.2.3(@types/node@22.15.21)(rollup@4.35.0)(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.21)): + dependencies: + '@microsoft/api-extractor': 7.47.7(@types/node@22.15.21) + '@rollup/pluginutils': 5.1.4(rollup@4.35.0) + '@volar/typescript': 2.4.12 + '@vue/language-core': 2.1.6(typescript@5.8.3) + compare-versions: 6.1.1 + debug: 4.4.0 + kolorist: 1.8.0 + local-pkg: 0.5.1 + magic-string: 0.30.17 + typescript: 5.8.3 + optionalDependencies: + vite: 5.4.19(@types/node@22.15.21) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + vite-plugin-dts@4.2.3(@types/node@22.15.21)(rollup@4.35.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0)): dependencies: '@microsoft/api-extractor': 7.47.7(@types/node@22.15.21) @@ -8023,6 +9277,10 @@ snapshots: - rollup - supports-color + vite-plugin-externalize-deps@0.9.0(vite@5.4.19(@types/node@22.15.21)): + dependencies: + vite: 5.4.19(@types/node@22.15.21) + vite-plugin-externalize-deps@0.9.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0)): dependencies: vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0) @@ -8042,6 +9300,17 @@ snapshots: transitivePeerDependencies: - supports-color + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@5.4.19(@types/node@22.15.21)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.8.3) + optionalDependencies: + vite: 5.4.19(@types/node@22.15.21) + transitivePeerDependencies: + - supports-color + - typescript + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0)): dependencies: debug: 4.4.0 @@ -8053,6 +9322,24 @@ snapshots: - supports-color - typescript + vite@4.5.14(@types/node@22.15.21): + dependencies: + esbuild: 0.18.20 + postcss: 8.5.3 + rollup: 3.29.5 + optionalDependencies: + '@types/node': 22.15.21 + fsevents: 2.3.3 + + vite@5.4.19(@types/node@22.15.21): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.35.0 + optionalDependencies: + '@types/node': 22.15.21 + fsevents: 2.3.3 + vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0): dependencies: esbuild: 0.25.0 @@ -8072,6 +9359,44 @@ snapshots: optionalDependencies: vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.0) + vitest@0.34.6(jsdom@26.1.0): + dependencies: + '@types/chai': 4.3.20 + '@types/chai-subset': 1.3.6(@types/chai@4.3.20) + '@types/node': 22.15.21 + '@vitest/expect': 0.34.6 + '@vitest/runner': 0.34.6 + '@vitest/snapshot': 0.34.6 + '@vitest/spy': 0.34.6 + '@vitest/utils': 0.34.6 + acorn: 8.14.1 + acorn-walk: 8.3.4 + cac: 6.7.14 + chai: 4.5.0 + debug: 4.4.0 + local-pkg: 0.4.3 + magic-string: 0.30.17 + pathe: 1.1.2 + picocolors: 1.1.1 + std-env: 3.9.0 + strip-literal: 1.3.0 + tinybench: 2.9.0 + tinypool: 0.7.0 + vite: 5.4.19(@types/node@22.15.21) + vite-node: 0.34.6(@types/node@22.15.21) + why-is-node-running: 2.3.0 + optionalDependencies: + jsdom: 26.1.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@3.1.4(@types/node@22.15.21)(jiti@2.4.2)(jsdom@26.1.0)(tsx@4.19.3)(yaml@2.7.0): dependencies: '@vitest/expect': 3.1.4 @@ -8114,6 +9439,8 @@ snapshots: vscode-uri@3.1.0: {} + vue-component-type-helpers@2.2.10: {} + vue-eslint-parser@9.4.3(eslint@9.27.0(jiti@2.4.2)): dependencies: debug: 4.4.0 @@ -8127,6 +9454,28 @@ snapshots: transitivePeerDependencies: - supports-color + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + vue-tsc@1.8.27(typescript@5.8.3): + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.8.3) + semver: 7.7.1 + typescript: 5.8.3 + + vue@3.5.16(typescript@5.8.3): + dependencies: + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-sfc': 3.5.16 + '@vue/runtime-dom': 3.5.16 + '@vue/server-renderer': 3.5.16(vue@3.5.16(typescript@5.8.3)) + '@vue/shared': 3.5.16 + optionalDependencies: + typescript: 5.8.3 + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -8174,6 +9523,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} ws@8.18.1: {} @@ -8204,6 +9559,8 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.1: {} + zimmerframe@1.1.2: {} zod-validation-error@3.4.0(zod@3.24.2): From 3756242a3f95a203745dd10335f0884e4ee22fa0 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Sat, 31 May 2025 17:58:22 +0000 Subject: [PATCH 12/15] ci: apply automated fixes --- examples/vue/debounce/index.html | 2 +- examples/vue/debounce/src/App.vue | 124 ++++++++++-------- .../src/debouncer/useDebouncedValue.ts | 41 +++--- .../vue-pacer/src/debouncer/useDebouncer.ts | 71 +++++----- 4 files changed, 135 insertions(+), 103 deletions(-) diff --git a/examples/vue/debounce/index.html b/examples/vue/debounce/index.html index 7de25718..608b05f4 100644 --- a/examples/vue/debounce/index.html +++ b/examples/vue/debounce/index.html @@ -1,4 +1,4 @@ - + diff --git a/examples/vue/debounce/src/App.vue b/examples/vue/debounce/src/App.vue index c8577bf7..5d67de2d 100644 --- a/examples/vue/debounce/src/App.vue +++ b/examples/vue/debounce/src/App.vue @@ -8,9 +8,9 @@
-
@@ -18,7 +18,9 @@

Instant value: {{ searchQuery }}

Debounced value: {{ debouncedQuery }}

Update count: {{ updateCount }}

-

Time since last update: {{ timeSinceUpdate }}ms

+

+ Time since last update: {{ timeSinceUpdate }}ms +

@@ -29,37 +31,45 @@
-
- - - - + +

Instant value: {{ controlledValue }}

Debounced value: {{ debouncedControlled }}

-

Status: {{ controlledIsPending ? 'Update Pending...' : 'Up to date' }}

-

Execution count: {{ controlledExecutionCount }}

+

+ Status: + {{ controlledIsPending ? 'Update Pending...' : 'Up to date' }} +

+

+ Execution count: {{ controlledExecutionCount }} +

Time typing: {{ elapsedTypingTime }}ms

-

Leading edge: {{ isLeading ? 'Enabled' : 'Disabled' }}

-

Debouncer: {{ isEnabled ? 'Enabled' : 'Disabled' }}

+

+ Leading edge: + {{ isLeading ? 'Enabled' : 'Disabled' }} +

+

+ Debouncer: {{ isEnabled ? 'Enabled' : 'Disabled' }} +

@@ -111,23 +121,20 @@ const toggleLeading = () => { setControlledOptions({ leading: isLeading.value }) } -const { - value: debouncedControlled, +const { + value: debouncedControlled, executionCount: controlledExecutionCount, isPending: controlledIsPending, setOptions: setControlledOptions, cancel: cancelControlled, flush: flushControlled, - setValue: setDebouncedControlledValue -} = useDebouncer( - controlledValue.value, - { - wait: 1000, - leading: isLeading.value, - trailing: true, - enabled: isEnabled.value, - }, -) + setValue: setDebouncedControlledValue, +} = useDebouncer(controlledValue.value, { + wait: 1000, + leading: isLeading.value, + trailing: true, + enabled: isEnabled.value, +}) // Watch the raw input and call the debouncer's setValue watch(controlledValue, (newValue) => { @@ -136,40 +143,46 @@ watch(controlledValue, (newValue) => { // Watch for pending state changes to manage typing timer watch(controlledIsPending, (pending, oldPending) => { - console.log(`[App.vue] controlledIsPending changed from ${oldPending} to ${pending}`); + console.log( + `[App.vue] controlledIsPending changed from ${oldPending} to ${pending}`, + ) if (pending) { - typingStartTime.value = Date.now(); - console.log(`[App.vue] Typing timer started. Start time: ${typingStartTime.value}`); - if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value); // Clear previous, just in case + typingStartTime.value = Date.now() + console.log( + `[App.vue] Typing timer started. Start time: ${typingStartTime.value}`, + ) + if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value) // Clear previous, just in case elapsedTimeInterval.value = setInterval(() => { if (typingStartTime.value) { - elapsedTypingTime.value = Date.now() - typingStartTime.value; + elapsedTypingTime.value = Date.now() - typingStartTime.value // console.log(`[App.vue] Interval: elapsedTypingTime = ${elapsedTypingTime.value}`); // Optional: can be noisy } else { // This case should ideally not happen if interval is cleared promptly - if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value); - elapsedTimeInterval.value = null; + if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value) + elapsedTimeInterval.value = null } - }, 50); // Update every 50ms + }, 50) // Update every 50ms } else { - if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value); - elapsedTimeInterval.value = null; - typingStartTime.value = null; // Ensure this is nulled - console.log(`[App.vue] Typing timer stopped. Final elapsed: ${elapsedTypingTime.value}ms`); + if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value) + elapsedTimeInterval.value = null + typingStartTime.value = null // Ensure this is nulled + console.log( + `[App.vue] Typing timer stopped. Final elapsed: ${elapsedTypingTime.value}ms`, + ) // elapsedTypingTime holds the last value until next typing or reset } -}); +}) // Reset both value and pending state const resetControlled = () => { - console.log('[App.vue] resetControlled called'); - cancelControlled(); // This will make controlledIsPending false - controlledValue.value = ''; + console.log('[App.vue] resetControlled called') + cancelControlled() // This will make controlledIsPending false + controlledValue.value = '' // Also explicitly reset typing time on manual reset - if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value); - elapsedTimeInterval.value = null; - typingStartTime.value = null; - elapsedTypingTime.value = 0; + if (elapsedTimeInterval.value) clearInterval(elapsedTimeInterval.value) + elapsedTimeInterval.value = null + typingStartTime.value = null + elapsedTypingTime.value = 0 } @@ -178,7 +191,10 @@ const resetControlled = () => { max-width: 800px; margin: 0 auto; padding: 2rem; - font-family: system-ui, -apple-system, sans-serif; + font-family: + system-ui, + -apple-system, + sans-serif; } h1 { diff --git a/packages/vue-pacer/src/debouncer/useDebouncedValue.ts b/packages/vue-pacer/src/debouncer/useDebouncedValue.ts index 4ba21c77..e1b64dd6 100644 --- a/packages/vue-pacer/src/debouncer/useDebouncedValue.ts +++ b/packages/vue-pacer/src/debouncer/useDebouncedValue.ts @@ -29,27 +29,27 @@ export interface UseDebouncedValueReturn { * - * + * *