diff --git a/docs/config.json b/docs/config.json index d905826fb4..98044339aa 100644 --- a/docs/config.json +++ b/docs/config.json @@ -1585,6 +1585,31 @@ "to": "framework/vue/plugins/createPersister" } ] + }, + { + "label": "preact", + "children": [ + { + "label": "persistQueryClient", + "to": "framework/preact/plugins/persistQueryClient" + }, + { + "label": "createSyncStoragePersister", + "to": "framework/preact/plugins/createSyncStoragePersister" + }, + { + "label": "createAsyncStoragePersister", + "to": "framework/preact/plugins/createAsyncStoragePersister" + }, + { + "label": "broadcastQueryClient (Experimental)", + "to": "framework/preact/plugins/broadcastQueryClient" + }, + { + "label": "createPersister (Experimental)", + "to": "framework/preact/plugins/createPersister" + } + ] } ] } diff --git a/docs/framework/preact/plugins/createAsyncStoragePersister.md b/docs/framework/preact/plugins/createAsyncStoragePersister.md new file mode 100644 index 0000000000..eee0136912 --- /dev/null +++ b/docs/framework/preact/plugins/createAsyncStoragePersister.md @@ -0,0 +1,6 @@ +--- +id: createAsyncStoragePersister +title: createAsyncStoragePersister +ref: docs/framework/react/plugins/createAsyncStoragePersister.md +replace: { 'react-query': 'preact-query' } +--- diff --git a/docs/framework/preact/plugins/createPersister.md b/docs/framework/preact/plugins/createPersister.md new file mode 100644 index 0000000000..890f3cc5d2 --- /dev/null +++ b/docs/framework/preact/plugins/createPersister.md @@ -0,0 +1,6 @@ +--- +id: createPersister +title: experimental_createPersister +ref: docs/framework/react/plugins/createPersister.md +replace: { 'react-query': 'preact-query' } +--- diff --git a/docs/framework/preact/plugins/createSyncStoragePersister.md b/docs/framework/preact/plugins/createSyncStoragePersister.md new file mode 100644 index 0000000000..087210dcd8 --- /dev/null +++ b/docs/framework/preact/plugins/createSyncStoragePersister.md @@ -0,0 +1,6 @@ +--- +id: createSyncStoragePersister +title: createSyncStoragePersister +ref: docs/framework/react/plugins/createSyncStoragePersister.md +replace: { 'react-query': 'preact-query' } +--- diff --git a/packages/preact-query-persist-client/eslint.config.js b/packages/preact-query-persist-client/eslint.config.js new file mode 100644 index 0000000000..4e7c7b4c7b --- /dev/null +++ b/packages/preact-query-persist-client/eslint.config.js @@ -0,0 +1,38 @@ +// @ts-check +// @ts-ignore: no types for eslint-config-preact +import preact from 'eslint-config-preact' +// eslint-config-preact uses typescript-eslint under the hood +import tseslint from 'typescript-eslint' + +import rootConfig from './root.eslint.config.js' + +export default [ + ...rootConfig, + ...preact, + { + files: ['**/*.{ts,tsx}'], + languageOptions: { + parser: tseslint.parser, + parserOptions: { + project: true, + }, + }, + plugins: { + 'typescript-eslint': tseslint.plugin, + }, + rules: { + // Disable base rule to prevent overload false positives + 'no-redeclare': 'off', + 'no-duplicate-imports': 'off', + 'no-unused-vars': 'off', + 'import/order': 'off', + 'sort-imports': 'off', + 'no-import-assign': 'off', + // TS-aware version handles overloads correctly + '@typescript-eslint/no-redeclare': 'error', + '@typescript-eslint/array-type': 'off', + '@typescript-eslint/no-unnecessary-type-assertion': 'off', + '@typescript-eslint/no-unnecessary-condition': 'off', + }, + }, +] diff --git a/packages/preact-query-persist-client/package.json b/packages/preact-query-persist-client/package.json new file mode 100644 index 0000000000..6d52cd850c --- /dev/null +++ b/packages/preact-query-persist-client/package.json @@ -0,0 +1,77 @@ +{ + "name": "@tanstack/preact-query-persist-client", + "version": "5.91.0", + "description": "Preact bindings to work with persisters in TanStack/preact-query", + "author": "tannerlinsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/TanStack/query.git", + "directory": "packages/preact-query-persist-client" + }, + "homepage": "https://tanstack.com/query", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "scripts": { + "clean": "premove ./build ./coverage ./dist-ts", + "compile": "tsc --build", + "test:eslint": "eslint --concurrency=auto ./src", + "test:types": "npm-run-all --serial test:types:*", + "test:types:ts50": "node ../../node_modules/typescript50/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js --build tsconfig.legacy.json", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js --build tsconfig.legacy.json", + "test:types:tscurrent": "tsc --build", + "test:lib": "vitest --retry=3", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict && attw --pack", + "build": "tsup --tsconfig tsconfig.prod.json" + }, + "type": "module", + "types": "build/legacy/index.d.ts", + "main": "build/legacy/index.cjs", + "module": "build/legacy/index.js", + "exports": { + ".": { + "@tanstack/custom-condition": "./src/index.ts", + "import": { + "types": "./build/modern/index.d.ts", + "default": "./build/modern/index.js" + }, + "require": { + "types": "./build/modern/index.d.cts", + "default": "./build/modern/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "build", + "src", + "!src/__tests__" + ], + "dependencies": { + "@tanstack/query-persist-client-core": "workspace:*" + }, + "devDependencies": { + "@preact/preset-vite": "^2.10.2", + "@tanstack/preact-query": "workspace:*", + "@tanstack/query-test-utils": "workspace:*", + "@testing-library/preact": "^3.2.4", + "eslint-config-preact": "^2.0.0", + "npm-run-all2": "^5.0.0", + "preact": "^10.28.0", + "typescript-eslint": "^8.54.0" + }, + "peerDependencies": { + "@tanstack/preact-query": "workspace:^", + "preact": "^10.0.0" + } +} diff --git a/packages/preact-query-persist-client/root.eslint.config.js b/packages/preact-query-persist-client/root.eslint.config.js new file mode 120000 index 0000000000..35dedbe5a4 --- /dev/null +++ b/packages/preact-query-persist-client/root.eslint.config.js @@ -0,0 +1 @@ +../../eslint.config.js \ No newline at end of file diff --git a/packages/preact-query-persist-client/root.tsup.config.js b/packages/preact-query-persist-client/root.tsup.config.js new file mode 120000 index 0000000000..fb8e9add9a --- /dev/null +++ b/packages/preact-query-persist-client/root.tsup.config.js @@ -0,0 +1 @@ +../../scripts/getTsupConfig.js \ No newline at end of file diff --git a/packages/preact-query-persist-client/src/PersistQueryClientProvider.tsx b/packages/preact-query-persist-client/src/PersistQueryClientProvider.tsx new file mode 100644 index 0000000000..8e10449c60 --- /dev/null +++ b/packages/preact-query-persist-client/src/PersistQueryClientProvider.tsx @@ -0,0 +1,61 @@ +import { useEffect, useRef, useState } from 'preact/hooks' +import type { VNode } from 'preact' + +import { + persistQueryClientRestore, + persistQueryClientSubscribe, +} from '@tanstack/query-persist-client-core' +import { + IsRestoringProvider, + QueryClientProvider, +} from '@tanstack/preact-query' +import type { PersistQueryClientOptions } from '@tanstack/query-persist-client-core' +import type { + OmitKeyof, + QueryClientProviderProps, +} from '@tanstack/preact-query' + +export type PersistQueryClientProviderProps = QueryClientProviderProps & { + persistOptions: OmitKeyof + onSuccess?: () => Promise | unknown + onError?: () => Promise | unknown +} + +export const PersistQueryClientProvider = ({ + children, + persistOptions, + onSuccess, + onError, + ...props +}: PersistQueryClientProviderProps): VNode => { + const [isRestoring, setIsRestoring] = useState(true) + const refs = useRef({ persistOptions, onSuccess, onError }) + const didRestore = useRef(false) + + useEffect(() => { + refs.current = { persistOptions, onSuccess, onError } + }) + + useEffect(() => { + const options = { + ...refs.current.persistOptions, + queryClient: props.client, + } + if (!didRestore.current) { + didRestore.current = true + persistQueryClientRestore(options) + .then(() => refs.current.onSuccess?.()) + .catch(() => refs.current.onError?.()) + .finally(() => { + setIsRestoring(false) + }) + } + return isRestoring ? undefined : persistQueryClientSubscribe(options) + }, [props.client, isRestoring]) + + return ( + + {children} + + ) +} diff --git a/packages/preact-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx b/packages/preact-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx new file mode 100644 index 0000000000..25a68912b7 --- /dev/null +++ b/packages/preact-query-persist-client/src/__tests__/PersistQueryClientProvider.test.tsx @@ -0,0 +1,126 @@ +/** @jsxRuntime automatic */ +/** @jsxImportSource preact */ +import '@testing-library/jest-dom/vitest' + +import type { + PersistedClient, + Persister, +} from '../../../query-persist-client-core/src' +import { persistQueryClientSave } from '../../../query-persist-client-core/src' +import { notifyManager } from '../../../query-core/src' +import { act, cleanup, render } from '@testing-library/preact' +import type { UseQueryResult } from '../../../preact-query/src' +import { QueryClient, useQuery } from '../../../preact-query/src' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' +import { queryKey, sleep } from '@tanstack/query-test-utils' + +import { PersistQueryClientProvider } from './testPersistProvider' + +notifyManager.setNotifyFunction((fn) => { + act(fn) +}) + +const createMockPersister = (): Persister => { + let storedState: PersistedClient | undefined + + return { + persistClient(persistClient: PersistedClient) { + storedState = persistClient + return Promise.resolve() + }, + async restoreClient() { + return sleep(10).then(() => storedState) + }, + removeClient() { + storedState = undefined + return Promise.resolve() + }, + } +} + +describe('PersistQueryClientProvider (preact)', () => { + beforeEach(() => { + vi.useFakeTimers() + }) + + afterEach(() => { + cleanup() + vi.useRealTimers() + }) + + test('restores cache from persister and refetches', async () => { + const key = queryKey() + const states: Array> = [] + + const queryClient = new QueryClient() + queryClient.prefetchQuery({ + queryKey: key, + queryFn: () => sleep(10).then(() => 'hydrated'), + }) + await vi.advanceTimersByTimeAsync(10) + + const persister = createMockPersister() + + persistQueryClientSave({ queryClient, persister }) + await vi.advanceTimersByTimeAsync(0) + + queryClient.clear() + + function Page() { + const state = useQuery({ + queryKey: key, + queryFn: () => sleep(10).then(() => 'fetched'), + }) + + states.push(state) + + return ( +
+

{state.data}

+

fetchStatus: {state.fetchStatus}

+
+ ) + } + + const rendered = render( + + + , + ) + + expect(rendered.getByText('fetchStatus: idle')).toBeInTheDocument() + + await act(async () => { + await vi.advanceTimersByTimeAsync(10) + }) + expect(rendered.getByText('hydrated')).toBeInTheDocument() + + await act(async () => { + await vi.advanceTimersByTimeAsync(11) + }) + expect(rendered.getByText('fetched')).toBeInTheDocument() + + expect(states.length).toBeGreaterThanOrEqual(3) + expect(states[0]).toMatchObject({ + status: 'pending', + fetchStatus: 'idle', + data: undefined, + }) + + expect( + states.some( + (state) => + state.fetchStatus === 'fetching' && state.data === 'hydrated', + ), + ).toBe(true) + + expect(states.at(-1)).toMatchObject({ + status: 'success', + fetchStatus: 'idle', + data: 'fetched', + }) + }) +}) diff --git a/packages/preact-query-persist-client/src/__tests__/testPersistProvider.tsx b/packages/preact-query-persist-client/src/__tests__/testPersistProvider.tsx new file mode 100644 index 0000000000..187f7b6240 --- /dev/null +++ b/packages/preact-query-persist-client/src/__tests__/testPersistProvider.tsx @@ -0,0 +1,61 @@ +/** @jsxRuntime automatic */ +/** @jsxImportSource preact */ +import { + persistQueryClientRestore, + persistQueryClientSubscribe, +} from '../../../query-persist-client-core/src' +import { + IsRestoringProvider, + QueryClientProvider, +} from '../../../preact-query/src' +import type { ComponentChildren } from 'preact' +import { useEffect, useRef, useState } from 'preact/hooks' + +type Props = { + children?: ComponentChildren + client: any + persistOptions: any + onSuccess?: () => void | Promise + onError?: () => void +} + +export function PersistQueryClientProvider({ + children, + persistOptions, + onSuccess, + onError, + ...props +}: Props) { + const [isRestoring, setIsRestoring] = useState(true) + const refs = useRef({ persistOptions, onSuccess, onError }) + const didRestore = useRef(false) + + useEffect(() => { + refs.current = { persistOptions, onSuccess, onError } + }) + + useEffect(() => { + const options = { + ...refs.current.persistOptions, + queryClient: props.client, + } + + if (!didRestore.current) { + didRestore.current = true + persistQueryClientRestore(options) + .then(() => refs.current.onSuccess?.()) + .catch(() => refs.current.onError?.()) + .finally(() => { + setIsRestoring(false) + }) + } + + return isRestoring ? undefined : persistQueryClientSubscribe(options) + }, [props.client, isRestoring]) + + return ( + + {children} + + ) +} diff --git a/packages/preact-query-persist-client/src/__tests__/use-queries-with-persist.test.tsx b/packages/preact-query-persist-client/src/__tests__/use-queries-with-persist.test.tsx new file mode 100644 index 0000000000..88dbef6d77 --- /dev/null +++ b/packages/preact-query-persist-client/src/__tests__/use-queries-with-persist.test.tsx @@ -0,0 +1,155 @@ +/** @jsxRuntime automatic */ +/** @jsxImportSource preact */ +import '@testing-library/jest-dom/vitest' + +import type { QueryObserverResult } from '../../../query-core/src' +import { notifyManager } from '../../../query-core/src' +import type { + PersistedClient, + Persister, +} from '../../../query-persist-client-core/src' +import { act, cleanup, render } from '@testing-library/preact' +import { QueryClient, useQueries } from '../../../preact-query/src' +import { useCallback } from 'preact/hooks' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { sleep } from '@tanstack/query-test-utils' + +import { PersistQueryClientProvider } from './testPersistProvider' + +notifyManager.setNotifyFunction((fn) => { + act(fn) +}) + +describe('useQueries with persist and memoized combine (preact)', () => { + const storage: Record = {} + + beforeEach(() => { + vi.useFakeTimers() + Object.defineProperty(window, 'localStorage', { + value: { + getItem: (key: string) => storage[key] || null, + setItem: (key: string, value: string) => { + storage[key] = value + }, + removeItem: (key: string) => { + delete storage[key] + }, + clear: () => { + Object.keys(storage).forEach((key) => delete storage[key]) + }, + }, + writable: true, + }) + }) + + afterEach(() => { + cleanup() + vi.useRealTimers() + Object.keys(storage).forEach((key) => delete storage[key]) + }) + + it('updates UI when combine is memoized with persisted results', async () => { + const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 30_000, + gcTime: 1000 * 60 * 60 * 24, + }, + }, + }) + + const persister: Persister = { + persistClient: (client: PersistedClient) => { + storage.REACT_QUERY_OFFLINE_CACHE = JSON.stringify(client) + return Promise.resolve() + }, + restoreClient: async () => { + const stored = storage.REACT_QUERY_OFFLINE_CACHE + if (stored) { + return sleep(10).then(() => JSON.parse(stored) as PersistedClient) + } + + return undefined + }, + removeClient: () => { + delete storage.REACT_QUERY_OFFLINE_CACHE + return Promise.resolve() + }, + } + + const persistedData: PersistedClient = { + timestamp: Date.now(), + buster: '', + clientState: { + mutations: [], + queries: [1, 2, 3].map((id) => ({ + queryHash: `["post",${id}]`, + queryKey: ['post', id], + state: { + data: id, + dataUpdateCount: 1, + dataUpdatedAt: Date.now() - 1000, + error: null, + errorUpdateCount: 0, + errorUpdatedAt: 0, + fetchFailureCount: 0, + fetchFailureReason: null, + fetchMeta: null, + isInvalidated: false, + status: 'success' as const, + fetchStatus: 'idle' as const, + }, + })), + }, + } + + storage.REACT_QUERY_OFFLINE_CACHE = JSON.stringify(persistedData) + + function TestComponent() { + const combinedQueries = useQueries({ + queries: [1, 2, 3].map((id) => ({ + queryKey: ['post', id], + queryFn: () => sleep(100).then(() => id), + staleTime: 30_000, + })), + combine: useCallback( + (results: Array>) => ({ + data: results.map((result) => result.data), + isPending: results.some((result) => result.isPending), + }), + [], + ), + }) + + return ( +
+
{String(combinedQueries.isPending)}
+
+ {combinedQueries.data + .filter((value) => value !== undefined) + .join(',')} +
+
+ ) + } + + const rendered = render( + + + , + ) + + await act(async () => { + await vi.advanceTimersByTimeAsync(10) + }) + await act(async () => { + await vi.advanceTimersByTimeAsync(0) + }) + + expect(rendered.getByTestId('pending').textContent).toBe('false') + expect(rendered.getByTestId('data').textContent).toBe('1,2,3') + }) +}) diff --git a/packages/preact-query-persist-client/src/index.ts b/packages/preact-query-persist-client/src/index.ts new file mode 100644 index 0000000000..cd94f0dee9 --- /dev/null +++ b/packages/preact-query-persist-client/src/index.ts @@ -0,0 +1,4 @@ +// Re-export core +export * from '@tanstack/query-persist-client-core' + +export * from './PersistQueryClientProvider' diff --git a/packages/preact-query-persist-client/test-setup.ts b/packages/preact-query-persist-client/test-setup.ts new file mode 100644 index 0000000000..62f11f2a29 --- /dev/null +++ b/packages/preact-query-persist-client/test-setup.ts @@ -0,0 +1,14 @@ +import '@testing-library/jest-dom/vitest' +import { act, cleanup as cleanupRTL } from '@testing-library/preact' +import { afterEach } from 'vitest' +import { notifyManager } from '@tanstack/preact-query' + +// https://testing-library.com/docs/preact-testing-library/api#cleanup +afterEach(() => { + cleanupRTL() +}) + +// Wrap notifications with act to make sure Preact knows about Query updates +notifyManager.setNotifyFunction((fn) => { + act(fn) +}) diff --git a/packages/preact-query-persist-client/tsconfig.json b/packages/preact-query-persist-client/tsconfig.json new file mode 100644 index 0000000000..7551d3b9cf --- /dev/null +++ b/packages/preact-query-persist-client/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist-ts", + "rootDir": ".", + "jsx": "react-jsx", + "jsxImportSource": "preact" + }, + "include": ["src", "test-setup.ts", "*.config.*", "package.json"], + "references": [ + { "path": "../query-persist-client-core" }, + { "path": "../preact-query" } + ] +} diff --git a/packages/preact-query-persist-client/tsconfig.legacy.json b/packages/preact-query-persist-client/tsconfig.legacy.json new file mode 100644 index 0000000000..c31e0fb485 --- /dev/null +++ b/packages/preact-query-persist-client/tsconfig.legacy.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "preact", + "outDir": "./dist-ts/legacy" + }, + "include": ["src"], + "exclude": ["src/__tests__"], + "references": [ + { "path": "../query-persist-client-core" }, + { "path": "../preact-query" } + ] +} diff --git a/packages/preact-query-persist-client/tsconfig.prod.json b/packages/preact-query-persist-client/tsconfig.prod.json new file mode 100644 index 0000000000..0f4c92da06 --- /dev/null +++ b/packages/preact-query-persist-client/tsconfig.prod.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "incremental": false, + "composite": false, + "rootDir": "../../" + } +} diff --git a/packages/preact-query-persist-client/tsup.config.ts b/packages/preact-query-persist-client/tsup.config.ts new file mode 100644 index 0000000000..ef4a978d12 --- /dev/null +++ b/packages/preact-query-persist-client/tsup.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'tsup' +import { legacyConfig, modernConfig } from './root.tsup.config.js' + +export default defineConfig([ + modernConfig({ entry: ['src/*.ts', 'src/*.tsx'] }), + legacyConfig({ entry: ['src/*.ts', 'src/*.tsx'] }), +]) diff --git a/packages/preact-query-persist-client/vite.config.ts b/packages/preact-query-persist-client/vite.config.ts new file mode 100644 index 0000000000..f18f9c8268 --- /dev/null +++ b/packages/preact-query-persist-client/vite.config.ts @@ -0,0 +1,35 @@ +import preact from '@preact/preset-vite' +import { defineConfig } from 'vitest/config' +import type { UserConfig as ViteUserConfig } from 'vite' + +import packageJson from './package.json' + +export default defineConfig({ + plugins: [preact() as ViteUserConfig['plugins']], + // fix from https://github.com/vitest-dev/vitest/issues/6992#issuecomment-2509408660 + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + environments: { + ssr: { + resolve: { + conditions: ['@tanstack/custom-condition'], + }, + }, + }, + test: { + name: packageJson.name, + dir: './src', + watch: false, + environment: 'jsdom', + setupFiles: ['test-setup.ts'], + coverage: { + enabled: true, + provider: 'istanbul', + include: ['src/**/*'], + exclude: ['src/__tests__/**'], + }, + typecheck: { enabled: true }, + restoreMocks: true, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d268d79262..04d9551e74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2311,13 +2311,13 @@ importers: version: 7.8.2 vite-plugin-dts: specifier: 4.2.3 - version: 4.2.3(@types/node@22.19.11)(rollup@4.57.1)(typescript@5.8.3)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) + version: 4.2.3(@types/node@22.19.11)(rollup@4.57.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) vite-plugin-externalize-deps: specifier: ^0.9.0 version: 0.9.0(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) optionalDependencies: '@tanstack/query-devtools': specifier: workspace:* @@ -2424,7 +2424,38 @@ importers: version: 6.6.5(preact@10.28.3) typescript-eslint: specifier: ^8.54.0 - version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.8.3) + version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + + packages/preact-query-persist-client: + dependencies: + '@tanstack/query-persist-client-core': + specifier: workspace:* + version: link:../query-persist-client-core + devDependencies: + '@preact/preset-vite': + specifier: ^2.10.2 + version: 2.10.3(@babel/core@7.29.0)(preact@10.28.3)(rollup@4.57.1)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) + '@tanstack/preact-query': + specifier: workspace:* + version: link:../preact-query + '@tanstack/query-test-utils': + specifier: workspace:* + version: link:../query-test-utils + '@testing-library/preact': + specifier: ^3.2.4 + version: 3.2.4(preact@10.28.3) + eslint-config-preact: + specifier: ^2.0.0 + version: 2.0.0(eslint@9.39.3(jiti@2.6.1)) + npm-run-all2: + specifier: ^5.0.0 + version: 5.0.2 + preact: + specifier: ^10.28.0 + version: 10.28.3 + typescript-eslint: + specifier: ^8.54.0 + version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) packages/query-async-storage-persister: dependencies: @@ -2762,7 +2793,7 @@ importers: devDependencies: '@sveltejs/package': specifier: ^2.4.0 - version: 2.5.7(svelte@5.51.5)(typescript@5.8.3) + version: 2.5.7(svelte@5.51.5)(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 version: 5.1.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) @@ -2771,10 +2802,10 @@ importers: version: link:../query-test-utils '@testing-library/svelte': specifier: ^5.2.8 - version: 5.3.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.8.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.3.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.9.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) '@typescript-eslint/parser': specifier: ^8.48.0 - version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.8.3) + version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-svelte: specifier: ^3.11.0 version: 3.14.0(eslint@9.39.3(jiti@2.6.1))(svelte@5.51.5) @@ -2783,7 +2814,7 @@ importers: version: 5.51.5 svelte-check: specifier: ^4.3.1 - version: 4.3.6(picomatch@4.0.3)(svelte@5.51.5)(typescript@5.8.3) + version: 4.3.6(picomatch@4.0.3)(svelte@5.51.5)(typescript@5.9.3) packages/svelte-query-devtools: dependencies: @@ -2796,7 +2827,7 @@ importers: devDependencies: '@sveltejs/package': specifier: ^2.4.0 - version: 2.5.7(svelte@5.51.5)(typescript@5.8.3) + version: 2.5.7(svelte@5.51.5)(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 version: 5.1.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) @@ -2805,7 +2836,7 @@ importers: version: link:../svelte-query '@typescript-eslint/parser': specifier: ^8.48.0 - version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.8.3) + version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-svelte: specifier: ^3.11.0 version: 3.14.0(eslint@9.39.3(jiti@2.6.1))(svelte@5.51.5) @@ -2814,7 +2845,7 @@ importers: version: 5.51.5 svelte-check: specifier: ^4.3.1 - version: 4.3.6(picomatch@4.0.3)(svelte@5.51.5)(typescript@5.8.3) + version: 4.3.6(picomatch@4.0.3)(svelte@5.51.5)(typescript@5.9.3) packages/svelte-query-persist-client: dependencies: @@ -2824,7 +2855,7 @@ importers: devDependencies: '@sveltejs/package': specifier: ^2.4.0 - version: 2.5.7(svelte@5.51.5)(typescript@5.8.3) + version: 2.5.7(svelte@5.51.5)(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 version: 5.1.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) @@ -2836,10 +2867,10 @@ importers: version: link:../svelte-query '@testing-library/svelte': specifier: ^5.2.8 - version: 5.3.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.8.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) + version: 5.3.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.9.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) '@typescript-eslint/parser': specifier: ^8.48.0 - version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.8.3) + version: 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-svelte: specifier: ^3.11.0 version: 3.14.0(eslint@9.39.3(jiti@2.6.1))(svelte@5.51.5) @@ -2848,7 +2879,7 @@ importers: version: 5.51.5 svelte-check: specifier: ^4.3.1 - version: 4.3.6(picomatch@4.0.3)(svelte@5.51.5)(typescript@5.8.3) + version: 4.3.6(picomatch@4.0.3)(svelte@5.51.5)(typescript@5.9.3) packages/vue-query: dependencies: @@ -4647,7 +4678,7 @@ packages: '@expo/bunyan@4.0.1': resolution: {integrity: sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==} - engines: {node: '>=0.10.0'} + engines: {'0': node >=0.10.0} '@expo/cli@0.22.28': resolution: {integrity: sha512-lvt72KNitGuixYD2l3SZmRKVu2G4zJpmg5V7WfUBNpmUU5oODBw/6qmiJ6kSLAlfDozscUk+BBGknBBzxUrwrA==} @@ -20278,14 +20309,14 @@ snapshots: optionalDependencies: typescript: 5.8.3 - '@sveltejs/package@2.5.7(svelte@5.51.5)(typescript@5.8.3)': + '@sveltejs/package@2.5.7(svelte@5.51.5)(typescript@5.9.3)': dependencies: chokidar: 5.0.0 kleur: 4.1.5 sade: 1.8.1 semver: 7.7.4 svelte: 5.51.5 - svelte2tsx: 0.7.47(svelte@5.51.5)(typescript@5.8.3) + svelte2tsx: 0.7.47(svelte@5.51.5)(typescript@5.9.3) transitivePeerDependencies: - typescript @@ -20593,14 +20624,14 @@ snapshots: dependencies: svelte: 5.51.5 - '@testing-library/svelte@5.3.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.8.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))': + '@testing-library/svelte@5.3.1(svelte@5.51.5)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))(vitest@4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.9.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/svelte-core': 1.0.0(svelte@5.51.5) svelte: 5.51.5 optionalDependencies: vite: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) - vitest: 4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.8.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) + vitest: 4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.9.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) '@tsconfig/svelte@5.0.7': {} @@ -20792,6 +20823,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/type-utils': 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.55.0 + eslint: 9.39.3(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.55.0 @@ -20815,7 +20862,6 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - supports-color - optional: true '@typescript-eslint/project-service@8.55.0(typescript@5.8.3)': dependencies: @@ -20834,7 +20880,6 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - supports-color - optional: true '@typescript-eslint/rule-tester@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.8.3)': dependencies: @@ -20862,7 +20907,6 @@ snapshots: '@typescript-eslint/tsconfig-utils@8.55.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - optional: true '@typescript-eslint/type-utils@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.8.3)': dependencies: @@ -20876,6 +20920,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.3(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.55.0': {} '@typescript-eslint/typescript-estree@8.55.0(typescript@5.8.3)': @@ -20907,7 +20963,6 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - supports-color - optional: true '@typescript-eslint/utils@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.8.3)': dependencies: @@ -20920,6 +20975,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.55.0 + '@typescript-eslint/types': 8.55.0 + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + eslint: 9.39.3(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.55.0': dependencies: '@typescript-eslint/types': 8.55.0 @@ -21174,6 +21240,16 @@ snapshots: msw: 2.12.9(@types/node@22.19.11)(typescript@5.8.3) vite: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) + '@vitest/mocker@4.0.18(msw@2.12.9(@types/node@22.19.11)(typescript@5.9.3))(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@vitest/spy': 4.0.18 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.12.9(@types/node@22.19.11)(typescript@5.9.3) + vite: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) + optional: true + '@vitest/pretty-format@4.0.18': dependencies: tinyrainbow: 3.0.3 @@ -21320,6 +21396,19 @@ snapshots: optionalDependencies: typescript: 5.8.3 + '@vue/language-core@2.1.6(typescript@5.9.3)': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.28 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.28 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.9.3 + '@vue/language-core@2.2.12(typescript@5.8.3)': dependencies: '@volar/language-core': 2.4.15 @@ -27288,6 +27377,32 @@ snapshots: transitivePeerDependencies: - '@types/node' + msw@2.12.9(@types/node@22.19.11)(typescript@5.9.3): + dependencies: + '@inquirer/confirm': 5.1.21(@types/node@22.19.11) + '@mswjs/interceptors': 0.41.2 + '@open-draft/deferred-promise': 2.2.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.12.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.10.1 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.0 + type-fest: 5.4.4 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@types/node' + optional: true + muggle-string@0.4.1: {} mute-stream@2.0.0: {} @@ -30149,6 +30264,18 @@ snapshots: transitivePeerDependencies: - picomatch + svelte-check@4.3.6(picomatch@4.0.3)(svelte@5.51.5)(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.51.5 + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch + svelte-eslint-parser@1.4.1(svelte@5.51.5): dependencies: eslint-scope: 8.4.0 @@ -30160,12 +30287,12 @@ snapshots: optionalDependencies: svelte: 5.51.5 - svelte2tsx@0.7.47(svelte@5.51.5)(typescript@5.8.3): + svelte2tsx@0.7.47(svelte@5.51.5)(typescript@5.9.3): dependencies: dedent-js: 1.0.1 scule: 1.3.0 svelte: 5.51.5 - typescript: 5.8.3 + typescript: 5.9.3 svelte@5.51.5: dependencies: @@ -30470,7 +30597,6 @@ snapshots: ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 - optional: true ts-declaration-location@1.0.7(typescript@5.8.3): dependencies: @@ -30487,6 +30613,10 @@ snapshots: optionalDependencies: typescript: 5.8.3 + tsconfck@3.1.6(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -30670,6 +30800,17 @@ snapshots: transitivePeerDependencies: - supports-color + typescript-eslint@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.55.0(@typescript-eslint/parser@8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.55.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.55.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.3(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript@5.0.4: {} typescript@5.1.6: {} @@ -31134,6 +31275,25 @@ snapshots: - rollup - supports-color + vite-plugin-dts@4.2.3(@types/node@22.19.11)(rollup@4.57.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)): + dependencies: + '@microsoft/api-extractor': 7.47.7(@types/node@22.19.11) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + '@volar/typescript': 2.4.28 + '@vue/language-core': 2.1.6(typescript@5.9.3) + compare-versions: 6.1.1 + debug: 4.4.3 + kolorist: 1.8.0 + local-pkg: 0.5.1 + magic-string: 0.30.21 + typescript: 5.9.3 + optionalDependencies: + vite: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + vite-plugin-externalize-deps@0.10.0(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)): dependencies: vite: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) @@ -31193,6 +31353,17 @@ snapshots: - supports-color - typescript + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)): + dependencies: + debug: 4.4.3 + globrex: 0.1.2 + tsconfck: 3.1.6(typescript@5.9.3) + optionalDependencies: + vite: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + - typescript + vite@6.4.1(@types/node@22.19.11)(jiti@1.21.7)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 @@ -31273,6 +31444,45 @@ snapshots: - tsx - yaml + vitest@4.0.18(@types/node@22.19.11)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(msw@2.12.9(@types/node@22.19.11)(typescript@5.9.3))(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2): + dependencies: + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(msw@2.12.9(@types/node@22.19.11)(typescript@5.9.3))(vite@6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 6.4.1(@types/node@22.19.11)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.90.0)(terser@5.46.0)(yaml@2.8.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.19.11 + jsdom: 27.4.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + optional: true + vlq@1.0.1: {} vm-browserify@1.1.2: {}