├── .prettierignore ├── .gitignore ├── tests ├── vitest-setup.ts ├── utils │ └── createZustandContext.tsx ├── 01_basic.spec.tsx ├── 05_createSliceWithImmer.spec.tsx ├── 04_componentWithActions.spec.tsx ├── 03_component.spec.tsx └── 02_type.spec.tsx ├── src ├── immer │ ├── index.ts │ └── create-slice-with-immer.ts ├── index.ts ├── create-slice.ts ├── with-actions.ts └── with-slices.ts ├── .codesandbox └── ci.json ├── tsconfig.esm.json ├── examples ├── tsconfig.json ├── 01_counter │ ├── index.html │ ├── src │ │ ├── main.tsx │ │ └── app.tsx │ ├── tsconfig.json │ └── package.json ├── 02_async │ ├── index.html │ ├── src │ │ ├── main.tsx │ │ └── app.tsx │ ├── tsconfig.json │ └── package.json ├── 03_actions │ ├── index.html │ ├── src │ │ ├── main.tsx │ │ └── app.tsx │ ├── tsconfig.json │ └── package.json └── 04_immer │ ├── index.html │ ├── src │ ├── main.tsx │ └── app.tsx │ ├── tsconfig.json │ └── package.json ├── tsconfig.cjs.json ├── .github └── workflows │ ├── ci.yml │ └── cd.yml ├── tsconfig.json ├── CHANGELOG.md ├── vite.config.ts ├── eslint.config.js ├── docs ├── integrations │ └── 01_middleware.md ├── guides │ ├── 01_create-slice.md │ ├── 02_combine-slices-into-single-store.md │ ├── 03_attaching-store-level-actions.md │ └── 04_collision-handling.md └── getting-started │ └── 01_introduction.md ├── LICENSE ├── package.json ├── README.md └── pnpm-lock.yaml /.prettierignore: -------------------------------------------------------------------------------- 1 | /pnpm-lock.yaml 2 | /dist 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.swp 3 | node_modules 4 | /dist 5 | -------------------------------------------------------------------------------- /tests/vitest-setup.ts: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom/vitest'; 2 | -------------------------------------------------------------------------------- /src/immer/index.ts: -------------------------------------------------------------------------------- 1 | export { createSliceWithImmer } from './create-slice-with-immer.js'; 2 | -------------------------------------------------------------------------------- /.codesandbox/ci.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildCommand": "compile", 3 | "sandboxes": ["new", "react-typescript-react-ts"], 4 | "node": "18" 5 | } 6 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { createSlice } from './create-slice.js'; 2 | export { withSlices } from './with-slices.js'; 3 | export { withActions } from './with-actions.js'; 4 | -------------------------------------------------------------------------------- /tsconfig.esm.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "declaration": true, 5 | "outDir": "./dist" 6 | }, 7 | "include": ["src"] 8 | } 9 | -------------------------------------------------------------------------------- /examples/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "module": "esnext", 5 | "moduleResolution": "bundler" 6 | }, 7 | "exclude": [] 8 | } 9 | -------------------------------------------------------------------------------- /examples/01_counter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | example 4 | 5 | 6 |
7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /examples/02_async/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | example 4 | 5 | 6 |
7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /examples/03_actions/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | example 4 | 5 | 6 |
7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /examples/04_immer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | example 4 | 5 | 6 |
7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /tsconfig.cjs.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "verbatimModuleSyntax": false, 6 | "declaration": true, 7 | "outDir": "./dist/cjs" 8 | }, 9 | "include": ["src"] 10 | } 11 | -------------------------------------------------------------------------------- /examples/01_counter/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | 4 | import App from './app'; 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ); 11 | -------------------------------------------------------------------------------- /examples/02_async/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | 4 | import App from './app'; 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ); 11 | -------------------------------------------------------------------------------- /examples/03_actions/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | 4 | import App from './app'; 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ); 11 | -------------------------------------------------------------------------------- /examples/04_immer/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | 4 | import App from './app'; 5 | 6 | createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ); 11 | -------------------------------------------------------------------------------- /examples/02_async/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "es2018", 5 | "esModuleInterop": true, 6 | "module": "esnext", 7 | "moduleResolution": "bundler", 8 | "skipLibCheck": true, 9 | "allowJs": true, 10 | "noUncheckedIndexedAccess": true, 11 | "exactOptionalPropertyTypes": true, 12 | "jsx": "react-jsx" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /examples/04_immer/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "es2018", 5 | "esModuleInterop": true, 6 | "module": "esnext", 7 | "moduleResolution": "bundler", 8 | "skipLibCheck": true, 9 | "allowJs": true, 10 | "noUncheckedIndexedAccess": true, 11 | "exactOptionalPropertyTypes": true, 12 | "jsx": "react-jsx" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /examples/01_counter/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "es2018", 5 | "esModuleInterop": true, 6 | "module": "esnext", 7 | "moduleResolution": "bundler", 8 | "skipLibCheck": true, 9 | "allowJs": true, 10 | "noUncheckedIndexedAccess": true, 11 | "exactOptionalPropertyTypes": true, 12 | "jsx": "react-jsx" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /examples/03_actions/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "es2018", 5 | "esModuleInterop": true, 6 | "module": "esnext", 7 | "moduleResolution": "bundler", 8 | "skipLibCheck": true, 9 | "allowJs": true, 10 | "noUncheckedIndexedAccess": true, 11 | "exactOptionalPropertyTypes": true, 12 | "jsx": "react-jsx" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | pull_request: 6 | 7 | jobs: 8 | test: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | - uses: pnpm/action-setup@v4 13 | - uses: actions/setup-node@v4 14 | with: 15 | node-version: 'lts/*' 16 | cache: 'pnpm' 17 | - run: pnpm install 18 | - run: pnpm test 19 | -------------------------------------------------------------------------------- /examples/01_counter/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "dependencies": { 7 | "react": "latest", 8 | "react-dom": "latest", 9 | "zustand": "latest", 10 | "zustand-slices": "latest" 11 | }, 12 | "devDependencies": { 13 | "@types/react": "latest", 14 | "@types/react-dom": "latest", 15 | "typescript": "latest", 16 | "vite": "latest" 17 | }, 18 | "scripts": { 19 | "dev": "vite" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /examples/02_async/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "dependencies": { 7 | "react": "latest", 8 | "react-dom": "latest", 9 | "zustand": "latest", 10 | "zustand-slices": "latest" 11 | }, 12 | "devDependencies": { 13 | "@types/react": "latest", 14 | "@types/react-dom": "latest", 15 | "typescript": "latest", 16 | "vite": "latest" 17 | }, 18 | "scripts": { 19 | "dev": "vite" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /examples/03_actions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "dependencies": { 7 | "react": "latest", 8 | "react-dom": "latest", 9 | "zustand": "latest", 10 | "zustand-slices": "latest" 11 | }, 12 | "devDependencies": { 13 | "@types/react": "latest", 14 | "@types/react-dom": "latest", 15 | "typescript": "latest", 16 | "vite": "latest" 17 | }, 18 | "scripts": { 19 | "dev": "vite" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/create-slice.ts: -------------------------------------------------------------------------------- 1 | type SliceActions = { 2 | [actionName: string]: (...args: never[]) => (prev: Value) => Value; 3 | }; 4 | 5 | export type SliceConfig< 6 | Name extends string, 7 | Value, 8 | Actions extends SliceActions, 9 | > = { 10 | name: Name; 11 | value: Value; 12 | actions: Actions; 13 | }; 14 | 15 | export function createSlice< 16 | Name extends string, 17 | Value, 18 | Actions extends SliceActions, 19 | >(config: SliceConfig) { 20 | return config; 21 | } 22 | -------------------------------------------------------------------------------- /examples/04_immer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "dependencies": { 7 | "immer": "latest", 8 | "react": "latest", 9 | "react-dom": "latest", 10 | "zustand": "latest", 11 | "zustand-slices": "latest" 12 | }, 13 | "devDependencies": { 14 | "@types/react": "latest", 15 | "@types/react-dom": "latest", 16 | "typescript": "latest", 17 | "vite": "latest" 18 | }, 19 | "scripts": { 20 | "dev": "vite" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "target": "es2018", 5 | "esModuleInterop": true, 6 | "module": "nodenext", 7 | "skipLibCheck": true, 8 | "allowJs": true, 9 | "verbatimModuleSyntax": true, 10 | "noUncheckedIndexedAccess": true, 11 | "exactOptionalPropertyTypes": true, 12 | "jsx": "react-jsx", 13 | "baseUrl": ".", 14 | "paths": { 15 | "zustand-slices": ["./src/index.ts"], 16 | "zustand-slices/immer": ["./src/immer/index.ts"] 17 | } 18 | }, 19 | "exclude": ["dist", "examples"] 20 | } 21 | -------------------------------------------------------------------------------- /.github/workflows/cd.yml: -------------------------------------------------------------------------------- 1 | name: CD 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: pnpm/action-setup@v4 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version: 'lts/*' 17 | registry-url: 'https://registry.npmjs.org' 18 | cache: 'pnpm' 19 | - run: pnpm install 20 | - run: pnpm run compile 21 | - run: npm publish 22 | env: 23 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 24 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [Unreleased] 4 | 5 | ## [0.4.0] - 2024-10-11 6 | 7 | ### Added 8 | 9 | - breaking: avoid action merging #32 10 | 11 | ## [0.3.0] - 2024-07-11 12 | 13 | ### Added 14 | 15 | - feat: create slice with immer #24 16 | 17 | ## [0.2.0] - 2024-05-04 18 | 19 | ### Added 20 | 21 | - feat: store actions #10 22 | 23 | ## [0.1.0] - 2024-04-22 24 | 25 | ### Changed 26 | 27 | - ESM-first build #5 28 | 29 | ## [0.0.2] - 2024-04-19 30 | 31 | ### Changed 32 | 33 | - Detect name collisions #1 34 | 35 | ## [0.0.1] - 2024-04-18 36 | 37 | ### Added 38 | 39 | - Initial release 40 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import { resolve } from 'node:path'; 4 | import { defineConfig } from 'vite'; 5 | import tsconfigPaths from 'vite-tsconfig-paths'; 6 | 7 | const { DIR, PORT = '8080' } = process.env; 8 | 9 | export default defineConfig(({ mode }) => { 10 | if (mode === 'test') { 11 | return { 12 | test: { 13 | environment: 'happy-dom', 14 | setupFiles: ['./tests/vitest-setup.ts'], 15 | }, 16 | plugins: [tsconfigPaths()], 17 | }; 18 | } 19 | if (!DIR) { 20 | throw new Error('DIR environment variable is required'); 21 | } 22 | return { 23 | root: resolve('examples', DIR), 24 | server: { port: Number(PORT) }, 25 | plugins: [tsconfigPaths({ root: resolve('.') })], 26 | }; 27 | }); 28 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import tseslint from 'typescript-eslint'; 3 | import importPlugin from 'eslint-plugin-import'; 4 | import jsxA11y from 'eslint-plugin-jsx-a11y'; 5 | import react from 'eslint-plugin-react'; 6 | import reactHooks from 'eslint-plugin-react-hooks'; 7 | 8 | export default tseslint.config( 9 | { ignores: ['dist/', 'website/'] }, 10 | eslint.configs.recommended, 11 | tseslint.configs.recommended, 12 | importPlugin.flatConfigs.recommended, 13 | jsxA11y.flatConfigs.recommended, 14 | react.configs.flat.recommended, 15 | react.configs.flat['jsx-runtime'], 16 | reactHooks.configs.recommended, 17 | { 18 | settings: { 19 | 'import/resolver': { typescript: true }, 20 | react: { version: 'detect' }, 21 | }, 22 | rules: { 23 | '@typescript-eslint/no-unused-vars': [ 24 | 'error', 25 | { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }, 26 | ], 27 | 'react-hooks/react-compiler': 'error', 28 | }, 29 | }, 30 | ); 31 | -------------------------------------------------------------------------------- /docs/integrations/01_middleware.md: -------------------------------------------------------------------------------- 1 | ## Middleware 2 | 3 | zustand-slices seamlessly integrates with Zustand middleware. The following example demonstrates how you can leverage `persist` and `devtools` utilities from `zustand/middleware`. This allows for persisting the store in local storage, as well as inspecting it through Redux dev tools. 4 | 5 | You can try a live demo [here](https://t.co/7AognoqHWV). 6 | 7 | ```js 8 | import { create } from 'zustand'; 9 | import { devtools, persist } from 'zustand/middleware'; 10 | import { createSlice, withSlices } from 'zustand-slices'; 11 | 12 | const countSlice = createSlice({ 13 | name: 'count', 14 | value: 0, 15 | actions: { 16 | inc: () => (prev) => prev + 1, 17 | reset: () => () => 0, 18 | }, 19 | }); 20 | 21 | const textSlice = createSlice({ 22 | name: 'text', 23 | value: 'Hello', 24 | actions: { 25 | updateText: (newText: string) => () => newText, 26 | reset: () => () => 'Hello', 27 | }, 28 | }); 29 | 30 | const useCountStore = create( 31 | devtools(persist(withSlices(countSlice, textSlice), { name: 'foo' })) 32 | ); 33 | ``` 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2024 Daishi Kato 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /docs/guides/01_create-slice.md: -------------------------------------------------------------------------------- 1 | ## Create slice 2 | 3 | `createSlice` allows you to define a slice of state within your Zustand store. With this function, you specify the name of the slice, its initial value, as well as any corresponding actions associated with it. A slice consists of the following components: 4 | 5 | - `name`: The identifier of the slice data within the store. 6 | - `value`: The starting value for your slice's data. 7 | - `actions`: Functions that can be utilized in order to update the slice's state. They can receive the current state, along with additional data required to perform the update. 8 | 9 | You can create a slice as demonstrated in the following example: 10 | 11 | ```jsx 12 | import { createSlice } from 'zustand-slices'; 13 | 14 | const countSlice = createSlice({ 15 | name: 'count', 16 | value: 0, 17 | actions: { 18 | inc: () => (prev) => prev + 1, 19 | reset: () => () => 0, 20 | }, 21 | }); 22 | ``` 23 | 24 | After creating your slices, you can utilize `withSlices` along with `create` from Zustand to combine them into a single store. A detailed guide can be found [here](../guides/02_combine-slices-into-single-store.md). 25 | -------------------------------------------------------------------------------- /src/with-actions.ts: -------------------------------------------------------------------------------- 1 | type InferStateActions = Actions extends { 2 | [actionName: string]: (...args: never[]) => unknown; 3 | } 4 | ? { 5 | [actionName in keyof Actions]: ( 6 | ...args: Parameters 7 | ) => void; 8 | } 9 | : unknown; 10 | 11 | type IsValidActions = 12 | Extract extends never ? Actions : never; 13 | 14 | type SetState = (fn: (state: T) => Partial) => void; 15 | type GetState = () => T; 16 | 17 | export function withActions< 18 | State, 19 | Actions extends { 20 | [actionName: string]: (...args: never[]) => (state: State) => void; 21 | }, 22 | >( 23 | config: (set: SetState, get: GetState) => State, 24 | actions: IsValidActions, 25 | ): ( 26 | set: SetState>, 27 | get: GetState>, 28 | ) => State & InferStateActions { 29 | return (set, get) => { 30 | const state: Record = config(set as never, get) as never; 31 | for (const [actionName, actionFn] of Object.entries(actions)) { 32 | state[actionName] = (...args: unknown[]) => { 33 | actionFn(...(args as never[]))(get()); 34 | }; 35 | } 36 | return state as never; 37 | }; 38 | } 39 | -------------------------------------------------------------------------------- /tests/utils/createZustandContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext, useContext, useRef } from 'react'; 2 | import type { ReactNode } from 'react'; 3 | import { useStore } from 'zustand'; 4 | import type { StoreApi } from 'zustand'; 5 | 6 | type ExtractState = S extends { 7 | getState: () => infer State; 8 | } 9 | ? State 10 | : never; 11 | 12 | function createZustandContext>( 13 | initializeStore: () => Store, 14 | ) { 15 | const Context = createContext(undefined); 16 | const StoreProvider = ({ children }: { children: ReactNode }) => { 17 | const storeRef = useRef(undefined); 18 | if (!storeRef.current) { 19 | storeRef.current = initializeStore(); 20 | } 21 | return ( 22 | {children} 23 | ); 24 | }; 25 | function useStoreApi() { 26 | const store = useContext(Context); 27 | if (!store) { 28 | throw new Error('useStoreApi must be used within a StoreProvider'); 29 | } 30 | return store; 31 | } 32 | function useSelector( 33 | selector: (state: ExtractState) => Selected, 34 | ) { 35 | const store = useStoreApi(); 36 | return useStore(store, selector); 37 | } 38 | return { StoreProvider, useStoreApi, useSelector }; 39 | } 40 | 41 | export default createZustandContext; 42 | -------------------------------------------------------------------------------- /src/immer/create-slice-with-immer.ts: -------------------------------------------------------------------------------- 1 | import { produce } from 'immer'; 2 | import type { Draft } from 'immer'; 3 | 4 | // Utility type to infer the argument types of the actions 5 | type InferArgs = T extends (...args: infer A) => unknown ? A : never; 6 | 7 | type SliceActions = { 8 | [actionName: string]: ( 9 | ...args: never[] 10 | ) => (draft: Draft) => Draft | void; 11 | }; 12 | 13 | export type SliceConfig< 14 | Name extends string, 15 | Value, 16 | Actions extends SliceActions, 17 | > = { 18 | name: Name; 19 | value: Value; 20 | actions: Actions; 21 | }; 22 | 23 | type ImmerActions> = { 24 | [K in keyof Actions]: ( 25 | ...args: InferArgs 26 | ) => (prev: Value) => Value; 27 | }; 28 | 29 | export function createSliceWithImmer< 30 | Name extends string, 31 | Value, 32 | Actions extends SliceActions, 33 | >(config: SliceConfig) { 34 | const immerActions = Object.fromEntries( 35 | Object.entries(config.actions).map(([actionKey, action]) => [ 36 | actionKey, 37 | (...args: InferArgs) => 38 | (prev: Value) => 39 | produce(prev, (draft) => action(...args)(draft)), 40 | ]), 41 | ) as unknown as ImmerActions; 42 | return { 43 | ...config, 44 | actions: immerActions, 45 | }; 46 | } 47 | -------------------------------------------------------------------------------- /examples/01_counter/src/app.tsx: -------------------------------------------------------------------------------- 1 | import { create } from 'zustand'; 2 | import { createSlice, withSlices } from 'zustand-slices'; 3 | 4 | const countSlice = createSlice({ 5 | name: 'count', 6 | value: 0, 7 | actions: { 8 | incCount: () => (prev) => prev + 1, 9 | resetCount: () => () => 0, 10 | }, 11 | }); 12 | 13 | const textSlice = createSlice({ 14 | name: 'text', 15 | value: 'Hello', 16 | actions: { 17 | updateText: (newText: string) => () => newText, 18 | resetText: () => () => 'Hello', 19 | }, 20 | }); 21 | 22 | const useCountStore = create(withSlices(countSlice, textSlice)); 23 | 24 | const Counter = () => { 25 | const count = useCountStore((state) => state.count); 26 | const text = useCountStore((state) => state.text); 27 | const { incCount, resetCount, updateText, resetText } = 28 | // eslint-disable-next-line react-hooks/react-compiler 29 | useCountStore.getState(); 30 | const reset = () => { 31 | resetCount(); 32 | resetText(); 33 | }; 34 | return ( 35 | <> 36 |

37 | Count: {count} 38 | 41 |

42 |

43 | updateText(e.target.value)} /> 44 |

45 |

46 | 49 |

50 | 51 | ); 52 | }; 53 | 54 | const App = () => ( 55 |
56 | 57 |
58 | ); 59 | 60 | export default App; 61 | -------------------------------------------------------------------------------- /tests/01_basic.spec.tsx: -------------------------------------------------------------------------------- 1 | import { expect, test } from 'vitest'; 2 | import { create } from 'zustand'; 3 | import { createSlice, withSlices } from 'zustand-slices'; 4 | 5 | test('should export functions', () => { 6 | expect(createSlice).toBeDefined(); 7 | expect(withSlices).toBeDefined(); 8 | }); 9 | 10 | test('createSlice', () => { 11 | const slice = createSlice({ 12 | name: 'counter', 13 | value: 0, 14 | actions: { 15 | increment: () => (prev) => prev + 1, 16 | }, 17 | }); 18 | // returns the input 19 | expect(createSlice(slice)).toBe(slice); 20 | }); 21 | 22 | test('withSlices', () => { 23 | const countSlice = createSlice({ 24 | name: 'count', 25 | value: 0, 26 | actions: { 27 | incCount: () => (prev) => prev + 1, 28 | resetCount: () => () => 0, 29 | }, 30 | }); 31 | const textSlice = createSlice({ 32 | name: 'text', 33 | value: 'Hello', 34 | actions: { 35 | updateText: (newText: string) => () => newText, 36 | resetText: () => () => 'Hello', 37 | }, 38 | }); 39 | const combinedConfig = withSlices(countSlice, textSlice); 40 | expect(combinedConfig).toBeInstanceOf(Function); 41 | const store = create(combinedConfig); 42 | const state = store.getState(); 43 | expect(state.count).toBe(countSlice.value); 44 | expect(state.text).toBe(textSlice.value); 45 | expect(state.incCount).toBeInstanceOf(Function); 46 | expect(state.resetCount).toBeInstanceOf(Function); 47 | expect(state.updateText).toBeInstanceOf(Function); 48 | expect(state.resetText).toBeInstanceOf(Function); 49 | }); 50 | -------------------------------------------------------------------------------- /tests/05_createSliceWithImmer.spec.tsx: -------------------------------------------------------------------------------- 1 | import { expect, test } from 'vitest'; 2 | import { createSliceWithImmer } from 'zustand-slices/immer'; 3 | 4 | test('should export functions', () => { 5 | expect(createSliceWithImmer).toBeDefined(); 6 | }); 7 | 8 | test('createSliceWithImmer', () => { 9 | const immerSlice = createSliceWithImmer({ 10 | name: 'counter', 11 | value: { 12 | count: 0, 13 | text: 'First', 14 | }, 15 | actions: { 16 | increment: () => (prev) => { 17 | prev.count += 1; 18 | }, 19 | setText: (payload: { newText: string }) => (prev) => { 20 | prev.text = payload.newText; 21 | }, 22 | reset: () => () => { 23 | return { 24 | count: 0, 25 | text: 'First', 26 | }; 27 | }, 28 | }, 29 | }); 30 | const result = createSliceWithImmer(immerSlice); 31 | 32 | // should not be equal as createSliceWithImmer should wrap actions in `produce` 33 | expect(result.actions.increment).not.toBe(immerSlice.actions.increment); 34 | 35 | expect(result.name).toEqual(immerSlice.name); 36 | expect(result.value).toEqual(immerSlice.value); 37 | 38 | expect(typeof result.actions.increment).toBe('function'); 39 | 40 | const incrementedState = result.actions.increment()(result.value); 41 | const newTextState = result.actions.setText({ newText: 'Second' })( 42 | result.value, 43 | ); 44 | const resetState = result.actions.reset()(result.value); 45 | 46 | expect(incrementedState.count).toBe(1); 47 | expect(newTextState.text).toBe('Second'); 48 | expect(resetState).toEqual({ count: 0, text: 'First' }); 49 | }); 50 | -------------------------------------------------------------------------------- /examples/02_async/src/app.tsx: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import { create } from 'zustand'; 4 | import { createSlice, withSlices } from 'zustand-slices'; 5 | import { use } from 'react'; 6 | 7 | const countSlice = createSlice({ 8 | name: 'count', 9 | value: Promise.resolve(0), 10 | actions: { 11 | incCount: () => async (prev) => (await prev) + 1, 12 | resetCount: () => async () => 0, 13 | }, 14 | }); 15 | 16 | const textSlice = createSlice({ 17 | name: 'text', 18 | value: 'Hello', 19 | actions: { 20 | updateText: (newText: string) => () => newText, 21 | resetText: () => () => 'Hello', 22 | }, 23 | }); 24 | 25 | const useCountStore = create(withSlices(countSlice, textSlice)); 26 | 27 | const Counter = () => { 28 | const count = use(useCountStore((state) => state.count)); 29 | const text = useCountStore((state) => state.text); 30 | const { incCount, resetCount, updateText, resetText } = 31 | // eslint-disable-next-line react-hooks/react-compiler 32 | useCountStore.getState(); 33 | const reset = () => { 34 | resetCount(); 35 | resetText(); 36 | }; 37 | return ( 38 | <> 39 |

40 | Count: {count} 41 | 44 |

45 |

46 | updateText(e.target.value)} /> 47 |

48 |

49 | 52 |

53 | 54 | ); 55 | }; 56 | 57 | const App = () => ( 58 |
59 | 60 |
61 | ); 62 | 63 | export default App; 64 | -------------------------------------------------------------------------------- /examples/04_immer/src/app.tsx: -------------------------------------------------------------------------------- 1 | import { create } from 'zustand'; 2 | import { withSlices } from 'zustand-slices'; 3 | import { createSliceWithImmer } from 'zustand-slices/immer'; 4 | 5 | const countSlice = createSliceWithImmer({ 6 | name: 'count', 7 | value: { 8 | count: 0, 9 | }, 10 | actions: { 11 | incCount: () => (state) => { 12 | state.count += 1; 13 | }, 14 | resetCount: () => () => ({ count: 0 }), 15 | }, 16 | }); 17 | 18 | const textSlice = createSliceWithImmer({ 19 | name: 'text', 20 | value: 'Hello', 21 | actions: { 22 | updateText: (newText: string) => () => newText, 23 | resetText: () => () => 'Hello', 24 | }, 25 | }); 26 | 27 | const useCountStore = create(withSlices(countSlice, textSlice)); 28 | 29 | const Counter = () => { 30 | const { count } = useCountStore((state) => state.count); 31 | const text = useCountStore((state) => state.text); 32 | const { incCount, resetCount, updateText, resetText } = 33 | // eslint-disable-next-line react-hooks/react-compiler 34 | useCountStore.getState(); 35 | const reset = () => { 36 | resetCount(); 37 | resetText(); 38 | }; 39 | return ( 40 | <> 41 |

42 | Count: {count} 43 | 46 |

47 |

48 | updateText(e.target.value)} /> 49 |

50 |

51 | 54 |

55 | 56 | ); 57 | }; 58 | 59 | const App = () => ( 60 |
61 | 62 |
63 | ); 64 | 65 | export default App; 66 | -------------------------------------------------------------------------------- /examples/03_actions/src/app.tsx: -------------------------------------------------------------------------------- 1 | import { create } from 'zustand'; 2 | import { createSlice, withSlices, withActions } from 'zustand-slices'; 3 | 4 | const countSlice = createSlice({ 5 | name: 'count', 6 | value: 0, 7 | actions: { 8 | incCount: () => (prev) => prev + 1, 9 | setCount: (newCount: number) => () => newCount, 10 | resetCount: () => () => 0, 11 | }, 12 | }); 13 | 14 | const textSlice = createSlice({ 15 | name: 'text', 16 | value: 'Hello', 17 | actions: { 18 | updateText: (newText: string) => () => newText, 19 | resetText: () => () => 'Hello', 20 | }, 21 | }); 22 | 23 | const useCountStore = create( 24 | withActions(withSlices(countSlice, textSlice), { 25 | reset: () => (state) => { 26 | state.resetCount(); 27 | state.resetText(); 28 | }, 29 | setCountWithTextLength: () => (state) => { 30 | state.setCount(state.text.length); 31 | }, 32 | }), 33 | ); 34 | 35 | const Counter = () => { 36 | const count = useCountStore((state) => state.count); 37 | const text = useCountStore((state) => state.text); 38 | const { incCount, updateText, reset, setCountWithTextLength } = 39 | // eslint-disable-next-line react-hooks/react-compiler 40 | useCountStore.getState(); 41 | return ( 42 | <> 43 |

44 | Count: {count} 45 | 48 |

49 |

50 | updateText(e.target.value)} /> 51 |

52 |

53 | 56 |

57 |

58 | 61 |

62 | 63 | ); 64 | }; 65 | 66 | const App = () => ( 67 |
68 | 69 |
70 | ); 71 | 72 | export default App; 73 | -------------------------------------------------------------------------------- /src/with-slices.ts: -------------------------------------------------------------------------------- 1 | import type { SliceConfig } from './create-slice.js'; 2 | 3 | type InferState = Configs extends [ 4 | SliceConfig, 5 | ...infer Rest, 6 | ] 7 | ? { [name in Name]: Value } & { 8 | [actionName in keyof Actions]: ( 9 | ...args: Parameters 10 | ) => void; 11 | } & InferState 12 | : unknown; 13 | 14 | type HasDuplicatedNames = Configs extends [ 15 | SliceConfig, 16 | ...infer Rest, 17 | ] 18 | ? Extract extends never 19 | ? HasDuplicatedNames 20 | : true 21 | : false; 22 | 23 | type ValidConfigs = 24 | HasDuplicatedNames extends true ? never : Configs; 25 | 26 | type SetState = (fn: (state: T) => Partial) => void; 27 | type GetState = () => T; 28 | 29 | export function withSlices< 30 | Configs extends SliceConfig>[], 31 | >( 32 | ...configs: ValidConfigs 33 | ): ( 34 | set: SetState>, 35 | get: GetState>, 36 | ) => InferState { 37 | return (set) => { 38 | const state: Record = {}; 39 | type ActionFn = (...args: unknown[]) => (prev: unknown) => unknown; 40 | for (const config of configs) { 41 | state[config.name] = config.value; 42 | for (const [actionName, actionFn] of Object.entries( 43 | config.actions, 44 | )) { 45 | state[actionName] = (...args: unknown[]) => { 46 | set(((prevState: Record) => { 47 | const prevSlice = prevState[config.name]; 48 | const nextSlice = actionFn(...args)(prevSlice); 49 | if (Object.is(prevSlice, nextSlice)) { 50 | return prevState; 51 | } 52 | return { [config.name]: nextSlice }; 53 | }) as never); 54 | }; 55 | } 56 | } 57 | return state as never; 58 | }; 59 | } 60 | -------------------------------------------------------------------------------- /docs/guides/02_combine-slices-into-single-store.md: -------------------------------------------------------------------------------- 1 | ## Combine slices into single store 2 | 3 | `withSlices` is a utility that allows you to combine multiple slices into a single Zustand store. By using `withSlices`, you can merge different slices of state, each with its own set of actions, into a unified store. 4 | 5 | ```jsx 6 | import { create } from 'zustand'; 7 | import { createSlice, withSlices } from 'zustand-slices'; 8 | 9 | const countSlice = createSlice({ 10 | name: 'count', 11 | value: 0, 12 | actions: { 13 | inc: () => (prev) => prev + 1, 14 | reset: () => () => 0, 15 | }, 16 | }); 17 | 18 | const textSlice = createSlice({ 19 | name: 'text', 20 | value: 'Hello', 21 | actions: { 22 | updateText: (newText: string) => () => newText, 23 | reset: () => () => 'Hello', 24 | }, 25 | }); 26 | 27 | const useCountStore = create(withSlices(countSlice, textSlice)); 28 | ``` 29 | 30 | `withSlices` extracts and incorporates the actions defined within each individual slice, enabling access and utilization of all slice-specific actions from the combined store. Additionally, it provides the ability to simultaneously update multiple slices using a single action. As presented in the code snippet above, the `reset` action can reset both `count` and `text` slices. Finally, the `useCountStore` hook can be utilized in any of your components for accessing the store: 31 | 32 | ```jsx 33 | const Counter = () => { 34 | const count = useCountStore((state) => state.count); 35 | const text = useCountStore((state) => state.text); 36 | const { inc, updateText, reset } = useCountStore.getState(); 37 | return ( 38 | <> 39 |

40 | Count: {count} 41 | 44 |

45 |

46 | updateText(e.target.value)} /> 47 |

48 |

49 | 52 |

53 | 54 | ); 55 | }; 56 | ``` 57 | 58 | Store-level actions can also be attached, in addition to slice-level actions using the `withActions` util. A detailed guide can be found [here](../guides/03_attaching-store-level-actions.md). 59 | 60 | You can also try this example in a codesandbox.io [demo](https://codesandbox.io/s/github/zustandjs/zustand-slices/tree/main/examples/01_counter). 61 | -------------------------------------------------------------------------------- /docs/guides/03_attaching-store-level-actions.md: -------------------------------------------------------------------------------- 1 | ## Attaching store-level actions 2 | 3 | `withActions` provides the ability to attach store-level actions, in addition to slice-level actions. Furthermore, these actions can utilize individual slice actions. 4 | 5 | Once you've defined your slices, simply integrate `withSlices` with `withActions` to merge your additional store-level actions. 6 | 7 | ```jsx 8 | import { create } from 'zustand'; 9 | import { createSlice, withSlices, withActions } from 'zustand-slices'; 10 | 11 | const countSlice = createSlice({ 12 | name: 'count', 13 | value: 0, 14 | actions: { 15 | 'count/inc': () => (prev) => prev + 1, 16 | 'count/set': (newCount: number) => () => newCount, 17 | reset: () => () => 0, 18 | }, 19 | }); 20 | 21 | const textSlice = createSlice({ 22 | name: 'text', 23 | value: 'Hello', 24 | actions: { 25 | 'text/set': (newText: string) => () => newText, 26 | reset: () => () => 'Hello', 27 | }, 28 | }); 29 | 30 | const useCountStore = create( 31 | withActions(withSlices(countSlice, textSlice), { 32 | setCountWithTextLength: () => (state) => { 33 | state['count/set'](state.text.length); 34 | }, 35 | }), 36 | ); 37 | ``` 38 | 39 | `withActions` combines the extracted actions defined within each individual slice with your additional store-level actions. The `useCountStore` hook can then be utilized in any of your components for accessing the store: 40 | 41 | ```jsx 42 | const Counter = () => { 43 | const count = useCountStore((state) => state.count); 44 | const text = useCountStore((state) => state.text); 45 | const { 46 | 'count/inc': inc, 47 | 'text/set': updateText, 48 | reset, 49 | setCountWithTextLength, 50 | } = useCountStore.getState(); 51 | return ( 52 | <> 53 |

54 | Count: {count} 55 | 58 |

59 |

60 | updateText(e.target.value)} /> 61 |

62 |

63 | 66 |

67 |

68 | 71 |

72 | 73 | ); 74 | }; 75 | ``` 76 | 77 | Feel free to experiment with this example in a codesandbox.io [demo](https://codesandbox.io/s/github/zustandjs/zustand-slices/tree/main/examples/03_actions). 78 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zustand-slices", 3 | "description": "A slice utility for Zustand", 4 | "version": "0.4.0", 5 | "type": "module", 6 | "author": "Daishi Kato", 7 | "repository": { 8 | "type": "git", 9 | "url": "https://github.com/zustandjs/zustand-slices.git" 10 | }, 11 | "source": "./src/index.ts", 12 | "main": "./dist/index.js", 13 | "types": "./dist/index.d.ts", 14 | "exports": { 15 | "./package.json": "./package.json", 16 | ".": { 17 | "require": { 18 | "types": "./dist/cjs/index.d.ts", 19 | "default": "./dist/cjs/index.js" 20 | }, 21 | "default": { 22 | "types": "./dist/index.d.ts", 23 | "default": "./dist/index.js" 24 | } 25 | }, 26 | "./immer": { 27 | "require": { 28 | "types": "./dist/cjs/immer/index.d.ts", 29 | "default": "./dist/cjs/immer/index.js" 30 | }, 31 | "default": { 32 | "types": "./dist/immer/index.d.ts", 33 | "default": "./dist/immer/index.js" 34 | } 35 | } 36 | }, 37 | "sideEffects": false, 38 | "files": [ 39 | "src", 40 | "dist" 41 | ], 42 | "packageManager": "pnpm@9.4.0", 43 | "scripts": { 44 | "compile": "rm -rf dist && pnpm run '/^compile:.*/'", 45 | "compile:esm": "tsc -p tsconfig.esm.json", 46 | "compile:cjs": "tsc -p tsconfig.cjs.json && echo '{\"type\":\"commonjs\"}' > dist/cjs/package.json", 47 | "test": "pnpm run '/^test:.*/'", 48 | "test:format": "prettier -c .", 49 | "test:lint": "eslint .", 50 | "test:types": "tsc -p . --noEmit", 51 | "test:types:examples": "tsc -p examples --noEmit", 52 | "test:spec": "vitest run", 53 | "examples:01_counter": "DIR=01_counter vite", 54 | "examples:02_async": "DIR=02_async vite", 55 | "examples:03_actions": "DIR=03_actions vite", 56 | "examples:04_immer": "DIR=04_immer vite" 57 | }, 58 | "keywords": [ 59 | "react", 60 | "zustand", 61 | "slices" 62 | ], 63 | "license": "MIT", 64 | "prettier": { 65 | "singleQuote": true 66 | }, 67 | "devDependencies": { 68 | "@eslint/js": "^9.19.0", 69 | "@testing-library/jest-dom": "^6.6.3", 70 | "@testing-library/react": "^16.2.0", 71 | "@testing-library/user-event": "^14.6.1", 72 | "@types/node": "^22.10.10", 73 | "@types/react": "^19.0.8", 74 | "@types/react-dom": "^19.0.3", 75 | "eslint": "9.19.0", 76 | "eslint-import-resolver-typescript": "^3.7.0", 77 | "eslint-plugin-import": "^2.31.0", 78 | "eslint-plugin-jsx-a11y": "^6.10.2", 79 | "eslint-plugin-react": "^7.37.4", 80 | "eslint-plugin-react-hooks": "6.0.0-rc.1", 81 | "happy-dom": "^16.7.2", 82 | "prettier": "^3.4.2", 83 | "react": "19.0.0", 84 | "react-dom": "19.0.0", 85 | "ts-expect": "^1.3.0", 86 | "typescript": "^5.7.3", 87 | "typescript-eslint": "^8.21.0", 88 | "vite": "^6.0.11", 89 | "vite-tsconfig-paths": "^5.1.4", 90 | "vitest": "^3.0.4", 91 | "zustand": "^5.0.3", 92 | "zustand-slices": "link:" 93 | }, 94 | "peerDependencies": { 95 | "immer": ">=9.0.6", 96 | "react": ">=18.0.0", 97 | "zustand": ">=4.0.0" 98 | }, 99 | "peerDependenciesMeta": { 100 | "immer": { 101 | "optional": true 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /tests/04_componentWithActions.spec.tsx: -------------------------------------------------------------------------------- 1 | import { afterEach, expect, test } from 'vitest'; 2 | import type { ReactNode } from 'react'; 3 | import { create } from 'zustand'; 4 | import { cleanup, render, screen } from '@testing-library/react'; 5 | import { userEvent } from '@testing-library/user-event'; 6 | import { createSlice, withSlices, withActions } from 'zustand-slices'; 7 | import createZustandContext from './utils/createZustandContext.js'; 8 | 9 | const countSlice = createSlice({ 10 | name: 'count', 11 | value: 0, 12 | actions: { 13 | incCount: () => (state) => state + 1, 14 | setCount: (newCount: number) => () => newCount, 15 | }, 16 | }); 17 | 18 | const textSlice = createSlice({ 19 | name: 'text', 20 | value: 'Hello', 21 | actions: { 22 | updateText: (text: string) => () => text, 23 | }, 24 | }); 25 | 26 | const { StoreProvider, useStoreApi, useSelector } = createZustandContext(() => 27 | create( 28 | withActions(withSlices(countSlice, textSlice), { 29 | setCountWithTextLength: () => (state) => { 30 | state.setCount(state.text.length); 31 | }, 32 | }), 33 | ), 34 | ); 35 | 36 | const renderWithStoreProvider = (app: ReactNode) => 37 | render(app, { wrapper: StoreProvider }); 38 | 39 | const Counter = () => { 40 | const count = useSelector((state) => state.count); 41 | const { incCount } = useStoreApi().getState(); 42 | return ( 43 |
44 |

{count}

45 | 48 |
49 | ); 50 | }; 51 | 52 | const Text = () => { 53 | const text = useSelector((state) => state.text); 54 | const { updateText } = useStoreApi().getState(); 55 | return ( 56 |
57 | updateText(e.target.value)} /> 58 |
59 | ); 60 | }; 61 | 62 | const App = () => { 63 | const { setCountWithTextLength } = useStoreApi().getState(); 64 | return ( 65 |
66 | 67 | 68 |

69 | 72 |

73 |
74 | ); 75 | }; 76 | 77 | afterEach(cleanup); 78 | 79 | test('should render the app', () => { 80 | renderWithStoreProvider(); 81 | expect(screen.getByTestId('count')).toHaveTextContent('0'); 82 | expect(screen.getByRole('textbox')).toBeInTheDocument(); 83 | expect(screen.getByTestId('set-text-length-to-count')).toBeInTheDocument(); 84 | }); 85 | 86 | test('should set text length to count', async () => { 87 | const user = userEvent.setup(); 88 | renderWithStoreProvider(); 89 | 90 | // Increment count 91 | await user.click(screen.getByRole('button', { name: 'Increment' })); 92 | expect(screen.getByTestId('count')).toHaveTextContent('1'); 93 | 94 | // Change text 95 | await user.type(screen.getByRole('textbox'), ' World'); 96 | expect(screen.getByRole('textbox')).toHaveValue('Hello World'); 97 | 98 | // Set text length to count 99 | await user.click( 100 | screen.getByRole('button', { name: 'Set Text Length to Count' }), 101 | ); 102 | expect(screen.getByTestId('count')).toHaveTextContent('11'); 103 | }); 104 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # zustand-slices 2 | 3 | [![CI](https://img.shields.io/github/actions/workflow/status/zustandjs/zustand-slices/ci.yml?branch=main)](https://github.com/zustandjs/zustand-slices/actions?query=workflow%3ACI) 4 | [![npm](https://img.shields.io/npm/v/zustand-slices)](https://www.npmjs.com/package/zustand-slices) 5 | [![size](https://img.shields.io/bundlephobia/minzip/zustand-slices)](https://bundlephobia.com/result?p=zustand-slices) 6 | [![discord](https://img.shields.io/discord/627656437971288081)](https://discord.gg/MrQdmzd) 7 | 8 | A slice utility for Zustand 9 | 10 | ## Motivation 11 | 12 | Zustand is a very minimal global state library. 13 | It's not designed with slice patterns. 14 | But as it's flexible and unopinionated, users invented some slice patterns. 15 | One of which is described in the official Zustand documentation. 16 | However, it's very tricky if you were to use it with TypeScript. 17 | 18 | This library provides an opinionated way for a slice pattern. 19 | It's designed to be TypeScript friendly. 20 | 21 | ## Install 22 | 23 | ```bash 24 | npm install zustand zustand-slices 25 | ``` 26 | 27 | ## Usage 28 | 29 | ```jsx 30 | import { create } from 'zustand'; 31 | import { createSlice, withSlices } from 'zustand-slices'; 32 | 33 | const countSlice = createSlice({ 34 | name: 'count', 35 | value: 0, 36 | actions: { 37 | incCount: () => (prev) => prev + 1, 38 | resetCount: () => () => 0, 39 | }, 40 | }); 41 | 42 | const textSlice = createSlice({ 43 | name: 'text', 44 | value: 'Hello', 45 | actions: { 46 | updateText: (newText: string) => () => newText, 47 | resetText: () => () => 'Hello', 48 | }, 49 | }); 50 | 51 | const useCountStore = create(withSlices(countSlice, textSlice)); 52 | 53 | const Counter = () => { 54 | const count = useCountStore((state) => state.count); 55 | const text = useCountStore((state) => state.text); 56 | const { incCount, resetCount, updateText, resetText } = useCountStore.getState(); 57 | const reset = () => { 58 | resetCount(); 59 | resetText(); 60 | }; 61 | return ( 62 | <> 63 |

64 | Count: {count} 65 | 68 |

69 |

70 | updateText(e.target.value)} /> 71 |

72 |

73 | 76 |

77 | 78 | ); 79 | }; 80 | ``` 81 | 82 | ## Examples 83 | 84 | The [examples](examples) folder contains working examples. 85 | You can run one of them with 86 | 87 | ```bash 88 | PORT=8080 pnpm run examples:01_counter 89 | ``` 90 | 91 | and open in your web browser. 92 | 93 | You can also try them directly: 94 | [01](https://stackblitz.com/github/zustandjs/zustand-slices/tree/main/examples/01_counter) 95 | [02](https://stackblitz.com/edit/vitejs-vite-kxigsw) 96 | [03](https://stackblitz.com/github/zustandjs/zustand-slices/tree/main/examples/03_actions) 97 | [04](https://stackblitz.com/github/zustandjs/zustand-slices/tree/main/examples/04_immer) 98 | 99 | 102 | 103 | ## Tweets 104 | 105 | - https://twitter.com/dai_shi/status/1780623600766320785 106 | - https://twitter.com/dai_shi/status/1780804319761268820 107 | - https://twitter.com/dai_shi/status/1780955525292982285 108 | - https://twitter.com/dai_shi/status/1781106942724993372 109 | - https://twitter.com/dai_shi/status/1785504766254297436 110 | - https://twitter.com/dai_shi/status/1786568001044750693 111 | - https://x.com/dai_shi/status/1811204918512067047 112 | -------------------------------------------------------------------------------- /docs/getting-started/01_introduction.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | As your Zustand store grows with time and new features, it can become challenging to manage. Within this context, the [slices pattern](https://docs.pmnd.rs/zustand/guides/slices-pattern) proves beneficial for enhancing modularity and facilitating maintenance. By dividing your main store into smaller individual slices you can easily group similar values and actions together without losing the ability to eventually combine them into a unified store interface. 4 | 5 | Despite its benefits, implementing the slices pattern can often be challenging for users. 6 | 7 | zustand-slices addresses this issue by providing a utility that aims to simplify the creation and use of slices, promoting better code organization and maintainability. Moreover, it offers straightforward type definitions for a more robust development experience. 8 | 9 | You can explore a live codesandbox.io demo [here](https://codesandbox.io/s/github/zustandjs/zustand-slices/tree/main/examples/01_counter). 10 | 11 | ## Installation 12 | 13 | zustand-slices is available as a package on NPM for use: 14 | 15 | ```bash 16 | npm install zustand zustand-slices 17 | ``` 18 | 19 | ## Usage 20 | 21 | The following concepts consist the core functionality of zustand-slices: 22 | 23 | - [createSlice](../guides/01_create-slice.md): Create slices to organize your state 24 | - [withSlices](../guides/02_combine-slices-into-single-store.md): Combine slices into a unified store 25 | - [withActions](../guides/03_attaching-store-level-actions.md): Attach store-level actions, in addition to slice-level actions 26 | 27 | ### First, create your slices 28 | 29 | To begin, create individual slices to group related data and actions. 30 | 31 | ```jsx 32 | import { create } from 'zustand'; 33 | import { createSlice, withSlices } from 'zustand-slices'; 34 | 35 | const countSlice = createSlice({ 36 | name: 'count', 37 | value: 0, 38 | actions: { 39 | inc: () => (prev) => prev + 1, 40 | reset: () => () => 0, 41 | }, 42 | }); 43 | 44 | const textSlice = createSlice({ 45 | name: 'text', 46 | value: 'Hello', 47 | actions: { 48 | updateText: (newText: string) => () => newText, 49 | reset: () => () => 'Hello', 50 | }, 51 | }); 52 | ``` 53 | 54 | ### Combine them into a single store 55 | 56 | By utilizing `create` from Zustand, you can combine these slices into a single store. 57 | 58 | ```jsx 59 | const useCountStore = create(withSlices(countSlice, textSlice)); 60 | ``` 61 | 62 | ### Easily utilize it in your components 63 | 64 | Finally, you can seamlessly integrate and access your store directly into your component logic utilizing the `useCountStore` hook. 65 | 66 | ```jsx 67 | const Counter = () => { 68 | const count = useCountStore((state) => state.count); 69 | const text = useCountStore((state) => state.text); 70 | const { inc, updateText, reset } = useCountStore.getState(); 71 | return ( 72 | <> 73 |

74 | Count: {count} 75 | 78 |

79 |

80 | updateText(e.target.value)} /> 81 |

82 |

83 | 86 |

87 | 88 | ); 89 | }; 90 | ``` 91 | 92 | ## TypeScript ready 93 | 94 | With zustand-slices, you get straightforward type definitions out of the box, seamlessly integrating them into your TypeScript projects. By using the outlined example slices provided above, your store type will be inferred as follows: 95 | 96 | ```ts 97 | type CountTextState = { 98 | count: number; 99 | inc: () => void; 100 | text: string; 101 | updateText: (newText: string) => void; 102 | reset: () => void; 103 | }; 104 | ``` 105 | -------------------------------------------------------------------------------- /tests/03_component.spec.tsx: -------------------------------------------------------------------------------- 1 | import { afterEach, expect, test } from 'vitest'; 2 | import type { ReactNode } from 'react'; 3 | import { create } from 'zustand'; 4 | import { cleanup, render, screen } from '@testing-library/react'; 5 | import { userEvent } from '@testing-library/user-event'; 6 | import { createSlice, withSlices } from 'zustand-slices'; 7 | import createZustandContext from './utils/createZustandContext.js'; 8 | 9 | const countSlice = createSlice({ 10 | name: 'count', 11 | value: 0, 12 | actions: { 13 | incCount: () => (state) => state + 1, 14 | resetCount: () => () => 0, 15 | }, 16 | }); 17 | 18 | const textSlice = createSlice({ 19 | name: 'text', 20 | value: 'Hello', 21 | actions: { 22 | updateText: (text: string) => () => text, 23 | resetText: () => () => 'Hello', 24 | }, 25 | }); 26 | 27 | const { StoreProvider, useStoreApi, useSelector } = createZustandContext(() => 28 | create(withSlices(countSlice, textSlice)), 29 | ); 30 | 31 | const renderWithStoreProvider = (app: ReactNode) => 32 | render(app, { wrapper: StoreProvider }); 33 | 34 | const Counter = () => { 35 | const count = useSelector((state) => state.count); 36 | const { incCount } = useStoreApi().getState(); 37 | return ( 38 |
39 |

{count}

40 | 43 |
44 | ); 45 | }; 46 | 47 | const Text = () => { 48 | const text = useSelector((state) => state.text); 49 | const { updateText } = useStoreApi().getState(); 50 | return ( 51 |
52 | updateText(e.target.value)} /> 53 |
54 | ); 55 | }; 56 | 57 | const App = () => { 58 | const { resetCount, resetText } = useStoreApi().getState(); 59 | const reset = () => { 60 | resetCount(); 61 | resetText(); 62 | }; 63 | return ( 64 |
65 | 66 | 67 | 70 |
71 | ); 72 | }; 73 | 74 | afterEach(cleanup); 75 | 76 | test('should render the app', () => { 77 | renderWithStoreProvider(); 78 | expect(screen.getByTestId('count')).toHaveTextContent('0'); 79 | expect(screen.getByRole('textbox')).toBeInTheDocument(); 80 | }); 81 | 82 | test('should increment the count when the button is pressed', async () => { 83 | const user = userEvent.setup(); 84 | renderWithStoreProvider(); 85 | expect(screen.getByTestId('count')).toHaveTextContent('0'); 86 | await user.click(screen.getByRole('button', { name: 'Increment' })); 87 | expect(screen.getByTestId('count')).toHaveTextContent('1'); 88 | }); 89 | 90 | test('should update the text when the input is changed', async () => { 91 | const user = userEvent.setup(); 92 | renderWithStoreProvider(); 93 | expect(screen.getByRole('textbox')).toHaveValue('Hello'); 94 | await user.type(screen.getByRole('textbox'), ' World'); 95 | expect(screen.getByRole('textbox')).toHaveValue('Hello World'); 96 | }); 97 | 98 | test('should reset the state when the reset button is pressed', async () => { 99 | const user = userEvent.setup(); 100 | renderWithStoreProvider(); 101 | expect(screen.getByTestId('count')).toHaveTextContent('0'); 102 | await user.click(screen.getByRole('button', { name: 'Increment' })); 103 | expect(screen.getByTestId('count')).toHaveTextContent('1'); 104 | await user.type(screen.getByRole('textbox'), ' World'); 105 | expect(screen.getByRole('textbox')).toHaveValue('Hello World'); 106 | await user.click(screen.getByRole('button', { name: 'Reset' })); 107 | // both slices reset because the action name is the same 108 | expect(screen.getByTestId('count')).toHaveTextContent('0'); 109 | expect(screen.getByRole('textbox')).toHaveValue('Hello'); 110 | }); 111 | -------------------------------------------------------------------------------- /docs/guides/04_collision-handling.md: -------------------------------------------------------------------------------- 1 | ## Collision handling 2 | 3 | Implementing the slices pattern can introduce the risk of name or action collisions, which can lead to confusion and potential errors in your code. For this purpose, efforts have been made to effectively address this issue, both on names and action level. 4 | 5 | While zustand-slices currently doesn't throw errors for name collisions, using TypeScript is highly recommended. This allows for robust type-level detection of potential conflicts. The following sections present in detail the way collisions are handled in `withSlices` and `withActions` utilities. 6 | 7 | ## withSlices 8 | 9 | ### Slice names 10 | 11 | Collisions on slice names occur if they are shared within multiple slices. This includes avoiding conflicts with other slice and action names. As presented in the example below, `countSlice` and `anotherCountSlice` share the same name `count`, which results in the parameters of `withSlices` being marked as invalid due to a type error: 12 | 13 | ```ts 14 | const countSlice = createSlice({ 15 | name: 'count', 16 | value: 0, 17 | actions: { 18 | inc: () => (prev) => prev + 1, 19 | }, 20 | }); 21 | 22 | const anotherCountSlice = createSlice({ 23 | name: 'count', 24 | value: 0, 25 | actions: { 26 | inc: () => (prev) => prev + 1, 27 | }, 28 | }); 29 | 30 | // ^? TypeScript error, indicating invalid parameters 31 | const useCountStore = create(withSlices(countSlice, anotherCountSlice)); 32 | ``` 33 | 34 | Using a slice name as an action name would result to the same outcome: 35 | 36 | ```ts 37 | const countSlice = createSlice({ 38 | name: 'count', 39 | value: 0, 40 | actions: { 41 | inc: () => (prev) => prev + 1, 42 | }, 43 | }); 44 | 45 | const anotherCountSlice = createSlice({ 46 | name: 'anotherCount', 47 | value: 0, 48 | actions: { 49 | count: () => (prev) => prev + 1, 50 | }, 51 | }); 52 | 53 | // ^? TypeScript error, indicating invalid parameters 54 | const useCountStore = create(withSlices(countSlice, anotherCountSlice);); 55 | ``` 56 | 57 | ### Actions 58 | 59 | An action name can be shared across different slices as long as the action parameters remain consistent. However, when the same action name, like `inc` in the following example, is defined with different arguments in different slices, it leads to a collision. 60 | 61 | ```ts 62 | const countSlice = createSlice({ 63 | name: 'count', 64 | value: 0, 65 | actions: { 66 | inc: (s: string) => (prev) => prev + (s ? 2 : 1), 67 | }, 68 | }); 69 | 70 | const anotherCountSlice = createSlice({ 71 | name: 'anotherCount', 72 | value: 0, 73 | actions: { 74 | inc: (n: number) => (prev) => prev + n, 75 | }, 76 | }); 77 | 78 | // ^? TypeScript error, indicating invalid parameters 79 | const useCountStore = create(withSlices(countSlice, anotherCountSlice)); 80 | ``` 81 | 82 | ## withActions 83 | 84 | When using `withActions`, the provided action names are checked compared to store names to prevent conflicts. This means that the additional store-level action names must be unique – they can't be the same as existing store-level slice or action names. 85 | 86 | ```ts 87 | const countSlice = createSlice({ 88 | name: 'count', 89 | value: 0, 90 | actions: { 91 | inc: () => (state) => state + 1, 92 | set: (newCount: number) => () => newCount, 93 | }, 94 | }); 95 | 96 | const textSlice = createSlice({ 97 | name: 'text', 98 | value: 'Hello', 99 | actions: { 100 | updateText: (text: string) => () => text, 101 | }, 102 | }); 103 | 104 | const useCountStore = create( 105 | withActions( 106 | withSlices(countSlice, textSlice), 107 | // ^? TypeScript error, indicating invalid object 108 | { 109 | inc: () => (state) => { 110 | state.set(state.count + 1); 111 | }, 112 | count: () => (state) => { 113 | state.set(state.text.length); 114 | }, 115 | }, 116 | ), 117 | ); 118 | ``` 119 | -------------------------------------------------------------------------------- /tests/02_type.spec.tsx: -------------------------------------------------------------------------------- 1 | import { expect, test, describe } from 'vitest'; 2 | import { expectType } from 'ts-expect'; 3 | import type { TypeEqual } from 'ts-expect'; 4 | 5 | import { createSlice, withSlices, withActions } from 'zustand-slices'; 6 | import { create } from 'zustand'; 7 | 8 | describe('createSlice', () => { 9 | test('slice type: single slice', () => { 10 | const countSlice = createSlice({ 11 | name: 'count', 12 | value: 0, 13 | actions: { 14 | inc: () => (prev) => prev + 1, 15 | }, 16 | }); 17 | expect(countSlice).toBeDefined(); 18 | expectType< 19 | TypeEqual< 20 | { 21 | name: 'count'; 22 | value: number; 23 | actions: { 24 | inc: () => (prev: number) => number; 25 | }; 26 | }, 27 | typeof countSlice 28 | > 29 | >(true); 30 | }); 31 | }); 32 | 33 | describe('withSlices', () => { 34 | test('slice type, no collisions', () => { 35 | const countSlice = createSlice({ 36 | name: 'count', 37 | value: 0, 38 | actions: { 39 | incCount: () => (prev) => prev + 1, 40 | resetCount: () => () => 0, 41 | }, 42 | }); 43 | 44 | const textSlice = createSlice({ 45 | name: 'text', 46 | value: 'Hello', 47 | actions: { 48 | updateText: (newText: string) => () => newText, 49 | resetText: () => () => 'Hello', 50 | }, 51 | }); 52 | 53 | type CountTextState = { 54 | count: number; 55 | incCount: () => void; 56 | resetCount: () => void; 57 | text: string; 58 | updateText: (newText: string) => void; 59 | resetText: () => void; 60 | }; 61 | 62 | const slices = withSlices(countSlice, textSlice); 63 | 64 | expectType< 65 | ( 66 | set: ( 67 | fn: (prevState: CountTextState) => Partial, 68 | ) => void, 69 | get: () => CountTextState, 70 | ) => CountTextState 71 | >(slices); 72 | 73 | expectType>(false); 74 | }); 75 | 76 | test('name collisions: same slice names', () => { 77 | const countSlice = createSlice({ 78 | name: 'count', 79 | value: 0, 80 | actions: { 81 | inc: () => (prev) => prev + 1, 82 | }, 83 | }); 84 | const anotherCountSlice = createSlice({ 85 | name: 'count', 86 | value: 0, 87 | actions: { 88 | inc: () => (prev) => prev + 1, 89 | }, 90 | }); 91 | // @ts-expect-error invalid configs 92 | withSlices(countSlice, anotherCountSlice); 93 | }); 94 | 95 | test('name collisions: slice name and action name', () => { 96 | const countSlice = createSlice({ 97 | name: 'count', 98 | value: 0, 99 | actions: { 100 | inc: () => (prev) => prev + 1, 101 | }, 102 | }); 103 | const anotherCountSlice = createSlice({ 104 | name: 'anotherCount', 105 | value: 0, 106 | actions: { 107 | count: () => (prev) => prev + 1, 108 | }, 109 | }); 110 | // @ts-expect-error invalid configs 111 | withSlices(countSlice, anotherCountSlice); 112 | }); 113 | 114 | test('name collisions: slice name and action name (overlapping case)', () => { 115 | const countSlice = createSlice({ 116 | name: 'count', 117 | value: 0, 118 | actions: { 119 | inc: () => (prev) => prev + 1, 120 | }, 121 | }); 122 | const anotherCountSlice = createSlice({ 123 | name: 'anotherCount', 124 | value: 0, 125 | actions: { 126 | count: () => (prev) => prev + 1, 127 | dec: () => (prev) => prev - 1, 128 | }, 129 | }); 130 | // @ts-expect-error invalid configs 131 | withSlices(countSlice, anotherCountSlice); 132 | }); 133 | 134 | test('args collisions: different args', () => { 135 | const countSlice = createSlice({ 136 | name: 'count', 137 | value: 0, 138 | actions: { 139 | inc: (s: string) => (prev) => prev + (s ? 2 : 1), 140 | }, 141 | }); 142 | const anotherCountSlice = createSlice({ 143 | name: 'anotherCount', 144 | value: 0, 145 | actions: { 146 | inc: (n: number) => (prev) => prev + n, 147 | }, 148 | }); 149 | // @ts-expect-error invalid configs 150 | withSlices(countSlice, anotherCountSlice); 151 | // @ts-expect-error invalid configs 152 | withSlices(anotherCountSlice, countSlice); 153 | }); 154 | 155 | test('args collisions: same args', () => { 156 | const countSlice = createSlice({ 157 | name: 'count', 158 | value: 0, 159 | actions: { 160 | inc: () => (prev) => prev + 1, 161 | }, 162 | }); 163 | const anotherCountSlice = createSlice({ 164 | name: 'anotherCount', 165 | value: 0, 166 | actions: { 167 | anotherInc: (n: number) => (prev) => prev + n, 168 | }, 169 | }); 170 | expectType<(...args: never[]) => unknown>( 171 | withSlices(countSlice, anotherCountSlice), 172 | ); 173 | expectType<(...args: never[]) => unknown>( 174 | withSlices(anotherCountSlice, countSlice), 175 | ); 176 | }); 177 | 178 | test('args collisions: overload case', () => { 179 | const countSlice = createSlice({ 180 | name: 'count', 181 | value: 0, 182 | actions: { 183 | inc: () => (prev) => prev + 1, 184 | }, 185 | }); 186 | const anotherCountSlice = createSlice({ 187 | name: 'anotherCount', 188 | value: 0, 189 | actions: { 190 | inc: (n: number) => (prev) => prev + n, 191 | }, 192 | }); 193 | // @ts-expect-error invalid configs 194 | withSlices(countSlice, anotherCountSlice); 195 | // @ts-expect-error invalid configs 196 | withSlices(anotherCountSlice, countSlice); 197 | }); 198 | }); 199 | 200 | describe('withActions', () => { 201 | test('slice type, no collisions', () => { 202 | const countSlice = createSlice({ 203 | name: 'count', 204 | value: 0, 205 | actions: { 206 | inc: () => (state) => state + 1, 207 | set: (newCount: number) => () => newCount, 208 | }, 209 | }); 210 | 211 | const textSlice = createSlice({ 212 | name: 'text', 213 | value: 'Hello', 214 | actions: { 215 | updateText: (text: string) => () => text, 216 | }, 217 | }); 218 | 219 | type CountTextState = { 220 | count: number; 221 | inc: () => void; 222 | set: (newCount: number) => void; 223 | text: string; 224 | updateText: (newText: string) => void; 225 | anotherInc: () => void; 226 | }; 227 | 228 | expectType< 229 | ( 230 | set: ( 231 | fn: (prevState: CountTextState) => Partial, 232 | ) => void, 233 | get: () => CountTextState, 234 | ) => CountTextState 235 | >( 236 | withActions(withSlices(countSlice, textSlice), { 237 | anotherInc: () => (state) => { 238 | state.set(state.count + 1); 239 | }, 240 | }), 241 | ); 242 | }); 243 | 244 | test('name collisions: slice names', () => { 245 | const countSlice = createSlice({ 246 | name: 'count', 247 | value: 0, 248 | actions: { 249 | inc: () => (state) => state + 1, 250 | set: (newCount: number) => () => newCount, 251 | }, 252 | }); 253 | 254 | const textSlice = createSlice({ 255 | name: 'text', 256 | value: 'Hello', 257 | actions: { 258 | updateText: (text: string) => () => text, 259 | }, 260 | }); 261 | 262 | // @ts-expect-error invalid actions 263 | withActions(withSlices(countSlice, textSlice), { 264 | count: () => (state) => { 265 | state.set(state.text.length); 266 | }, 267 | }); 268 | 269 | // @ts-expect-error invalid actions 270 | withActions(withSlices(countSlice, textSlice), { 271 | count: () => (state) => { 272 | state.set(state.text.length); 273 | }, 274 | text: () => (state) => { 275 | state.updateText('Hello world'); 276 | }, 277 | }); 278 | }); 279 | 280 | test('name collisions: action names', () => { 281 | const countSlice = createSlice({ 282 | name: 'count', 283 | value: 0, 284 | actions: { 285 | inc: () => (state) => state + 1, 286 | set: (newCount: number) => () => newCount, 287 | }, 288 | }); 289 | 290 | const textSlice = createSlice({ 291 | name: 'text', 292 | value: 'Hello', 293 | actions: { 294 | updateText: (text: string) => () => text, 295 | }, 296 | }); 297 | 298 | // @ts-expect-error invalid actions 299 | withActions(withSlices(countSlice, textSlice), { 300 | inc: () => (state) => { 301 | state.set(state.count + 1); 302 | }, 303 | }); 304 | 305 | // @ts-expect-error invalid actions 306 | withActions(withSlices(countSlice, textSlice), { 307 | inc: () => (state) => { 308 | state.set(state.count + 1); 309 | }, 310 | updateText: () => (state) => { 311 | state.updateText('Hello World'); 312 | }, 313 | }); 314 | }); 315 | 316 | test('name collisions: action and slice names', () => { 317 | const countSlice = createSlice({ 318 | name: 'count', 319 | value: 0, 320 | actions: { 321 | inc: () => (state) => state + 1, 322 | set: (newCount: number) => () => newCount, 323 | }, 324 | }); 325 | 326 | const textSlice = createSlice({ 327 | name: 'text', 328 | value: 'Hello', 329 | actions: { 330 | updateText: (text: string) => () => text, 331 | }, 332 | }); 333 | 334 | // @ts-expect-error invalid actions 335 | withActions(withSlices(countSlice, textSlice), { 336 | inc: () => (state) => { 337 | state.set(state.count + 1); 338 | }, 339 | updateText: () => (state) => { 340 | state.updateText('Hello World'); 341 | }, 342 | count: () => (state) => { 343 | state.set(state.text.length); 344 | }, 345 | text: () => (state) => { 346 | state.updateText('Hello world'); 347 | }, 348 | }); 349 | }); 350 | }); 351 | 352 | describe('create', () => { 353 | test('name collisions', () => { 354 | const countSlice = createSlice({ 355 | name: 'count', 356 | value: 0, 357 | actions: {}, 358 | }); 359 | const anotherCountSlice = createSlice({ 360 | name: 'count', 361 | value: 0, 362 | actions: {}, 363 | }); 364 | // @ts-expect-error invalid configs 365 | create(withSlices(countSlice, anotherCountSlice)); 366 | 367 | create( 368 | // @ts-expect-error invalid configs 369 | withActions(withSlices(countSlice, anotherCountSlice), { 370 | anotherCount: () => () => {}, 371 | }), 372 | ); 373 | 374 | create( 375 | withActions( 376 | // @ts-expect-error invalid configs 377 | withSlices(countSlice, anotherCountSlice), 378 | // @ts-expect-error invalid actions 379 | { 380 | count: () => (state) => state.count, 381 | }, 382 | ), 383 | ); 384 | }); 385 | }); 386 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | immer: 12 | specifier: '>=9.0.6' 13 | version: 10.1.1 14 | devDependencies: 15 | '@eslint/js': 16 | specifier: ^9.19.0 17 | version: 9.19.0 18 | '@testing-library/jest-dom': 19 | specifier: ^6.6.3 20 | version: 6.6.3 21 | '@testing-library/react': 22 | specifier: ^16.2.0 23 | version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) 24 | '@testing-library/user-event': 25 | specifier: ^14.6.1 26 | version: 14.6.1(@testing-library/dom@10.4.0) 27 | '@types/node': 28 | specifier: ^22.10.10 29 | version: 22.10.10 30 | '@types/react': 31 | specifier: ^19.0.8 32 | version: 19.0.8 33 | '@types/react-dom': 34 | specifier: ^19.0.3 35 | version: 19.0.3(@types/react@19.0.8) 36 | eslint: 37 | specifier: 9.19.0 38 | version: 9.19.0 39 | eslint-import-resolver-typescript: 40 | specifier: ^3.7.0 41 | version: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.19.0) 42 | eslint-plugin-import: 43 | specifier: ^2.31.0 44 | version: 2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.19.0) 45 | eslint-plugin-jsx-a11y: 46 | specifier: ^6.10.2 47 | version: 6.10.2(eslint@9.19.0) 48 | eslint-plugin-react: 49 | specifier: ^7.37.4 50 | version: 7.37.4(eslint@9.19.0) 51 | eslint-plugin-react-hooks: 52 | specifier: 6.0.0-rc.1 53 | version: 6.0.0-rc.1(eslint@9.19.0) 54 | happy-dom: 55 | specifier: ^16.7.2 56 | version: 16.7.2 57 | prettier: 58 | specifier: ^3.4.2 59 | version: 3.4.2 60 | react: 61 | specifier: 19.0.0 62 | version: 19.0.0 63 | react-dom: 64 | specifier: 19.0.0 65 | version: 19.0.0(react@19.0.0) 66 | ts-expect: 67 | specifier: ^1.3.0 68 | version: 1.3.0 69 | typescript: 70 | specifier: ^5.7.3 71 | version: 5.7.3 72 | typescript-eslint: 73 | specifier: ^8.21.0 74 | version: 8.21.0(eslint@9.19.0)(typescript@5.7.3) 75 | vite: 76 | specifier: ^6.0.11 77 | version: 6.0.11(@types/node@22.10.10) 78 | vite-tsconfig-paths: 79 | specifier: ^5.1.4 80 | version: 5.1.4(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)) 81 | vitest: 82 | specifier: ^3.0.4 83 | version: 3.0.4(@types/node@22.10.10)(happy-dom@16.7.2) 84 | zustand: 85 | specifier: ^5.0.3 86 | version: 5.0.3(@types/react@19.0.8)(immer@10.1.1)(react@19.0.0) 87 | zustand-slices: 88 | specifier: 'link:' 89 | version: 'link:' 90 | 91 | packages: 92 | 93 | '@adobe/css-tools@4.4.1': 94 | resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} 95 | 96 | '@ampproject/remapping@2.3.0': 97 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 98 | engines: {node: '>=6.0.0'} 99 | 100 | '@babel/code-frame@7.26.2': 101 | resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 102 | engines: {node: '>=6.9.0'} 103 | 104 | '@babel/code-frame@7.27.1': 105 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 106 | engines: {node: '>=6.9.0'} 107 | 108 | '@babel/compat-data@7.27.2': 109 | resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} 110 | engines: {node: '>=6.9.0'} 111 | 112 | '@babel/core@7.27.1': 113 | resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} 114 | engines: {node: '>=6.9.0'} 115 | 116 | '@babel/generator@7.27.1': 117 | resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} 118 | engines: {node: '>=6.9.0'} 119 | 120 | '@babel/helper-annotate-as-pure@7.27.1': 121 | resolution: {integrity: sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==} 122 | engines: {node: '>=6.9.0'} 123 | 124 | '@babel/helper-compilation-targets@7.27.2': 125 | resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 126 | engines: {node: '>=6.9.0'} 127 | 128 | '@babel/helper-create-class-features-plugin@7.27.1': 129 | resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} 130 | engines: {node: '>=6.9.0'} 131 | peerDependencies: 132 | '@babel/core': ^7.0.0 133 | 134 | '@babel/helper-member-expression-to-functions@7.27.1': 135 | resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} 136 | engines: {node: '>=6.9.0'} 137 | 138 | '@babel/helper-module-imports@7.27.1': 139 | resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 140 | engines: {node: '>=6.9.0'} 141 | 142 | '@babel/helper-module-transforms@7.27.1': 143 | resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} 144 | engines: {node: '>=6.9.0'} 145 | peerDependencies: 146 | '@babel/core': ^7.0.0 147 | 148 | '@babel/helper-optimise-call-expression@7.27.1': 149 | resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} 150 | engines: {node: '>=6.9.0'} 151 | 152 | '@babel/helper-plugin-utils@7.27.1': 153 | resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} 154 | engines: {node: '>=6.9.0'} 155 | 156 | '@babel/helper-replace-supers@7.27.1': 157 | resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} 158 | engines: {node: '>=6.9.0'} 159 | peerDependencies: 160 | '@babel/core': ^7.0.0 161 | 162 | '@babel/helper-skip-transparent-expression-wrappers@7.27.1': 163 | resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} 164 | engines: {node: '>=6.9.0'} 165 | 166 | '@babel/helper-string-parser@7.27.1': 167 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 168 | engines: {node: '>=6.9.0'} 169 | 170 | '@babel/helper-validator-identifier@7.25.9': 171 | resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 172 | engines: {node: '>=6.9.0'} 173 | 174 | '@babel/helper-validator-identifier@7.27.1': 175 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 176 | engines: {node: '>=6.9.0'} 177 | 178 | '@babel/helper-validator-option@7.27.1': 179 | resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 180 | engines: {node: '>=6.9.0'} 181 | 182 | '@babel/helpers@7.27.1': 183 | resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} 184 | engines: {node: '>=6.9.0'} 185 | 186 | '@babel/parser@7.27.2': 187 | resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} 188 | engines: {node: '>=6.0.0'} 189 | hasBin: true 190 | 191 | '@babel/plugin-transform-private-methods@7.27.1': 192 | resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} 193 | engines: {node: '>=6.9.0'} 194 | peerDependencies: 195 | '@babel/core': ^7.0.0-0 196 | 197 | '@babel/runtime@7.26.7': 198 | resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} 199 | engines: {node: '>=6.9.0'} 200 | 201 | '@babel/template@7.27.2': 202 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 203 | engines: {node: '>=6.9.0'} 204 | 205 | '@babel/traverse@7.27.1': 206 | resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} 207 | engines: {node: '>=6.9.0'} 208 | 209 | '@babel/types@7.27.1': 210 | resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} 211 | engines: {node: '>=6.9.0'} 212 | 213 | '@esbuild/aix-ppc64@0.24.2': 214 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 215 | engines: {node: '>=18'} 216 | cpu: [ppc64] 217 | os: [aix] 218 | 219 | '@esbuild/android-arm64@0.24.2': 220 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 221 | engines: {node: '>=18'} 222 | cpu: [arm64] 223 | os: [android] 224 | 225 | '@esbuild/android-arm@0.24.2': 226 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 227 | engines: {node: '>=18'} 228 | cpu: [arm] 229 | os: [android] 230 | 231 | '@esbuild/android-x64@0.24.2': 232 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 233 | engines: {node: '>=18'} 234 | cpu: [x64] 235 | os: [android] 236 | 237 | '@esbuild/darwin-arm64@0.24.2': 238 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 239 | engines: {node: '>=18'} 240 | cpu: [arm64] 241 | os: [darwin] 242 | 243 | '@esbuild/darwin-x64@0.24.2': 244 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 245 | engines: {node: '>=18'} 246 | cpu: [x64] 247 | os: [darwin] 248 | 249 | '@esbuild/freebsd-arm64@0.24.2': 250 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 251 | engines: {node: '>=18'} 252 | cpu: [arm64] 253 | os: [freebsd] 254 | 255 | '@esbuild/freebsd-x64@0.24.2': 256 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 257 | engines: {node: '>=18'} 258 | cpu: [x64] 259 | os: [freebsd] 260 | 261 | '@esbuild/linux-arm64@0.24.2': 262 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 263 | engines: {node: '>=18'} 264 | cpu: [arm64] 265 | os: [linux] 266 | 267 | '@esbuild/linux-arm@0.24.2': 268 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 269 | engines: {node: '>=18'} 270 | cpu: [arm] 271 | os: [linux] 272 | 273 | '@esbuild/linux-ia32@0.24.2': 274 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 275 | engines: {node: '>=18'} 276 | cpu: [ia32] 277 | os: [linux] 278 | 279 | '@esbuild/linux-loong64@0.24.2': 280 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 281 | engines: {node: '>=18'} 282 | cpu: [loong64] 283 | os: [linux] 284 | 285 | '@esbuild/linux-mips64el@0.24.2': 286 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 287 | engines: {node: '>=18'} 288 | cpu: [mips64el] 289 | os: [linux] 290 | 291 | '@esbuild/linux-ppc64@0.24.2': 292 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 293 | engines: {node: '>=18'} 294 | cpu: [ppc64] 295 | os: [linux] 296 | 297 | '@esbuild/linux-riscv64@0.24.2': 298 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 299 | engines: {node: '>=18'} 300 | cpu: [riscv64] 301 | os: [linux] 302 | 303 | '@esbuild/linux-s390x@0.24.2': 304 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 305 | engines: {node: '>=18'} 306 | cpu: [s390x] 307 | os: [linux] 308 | 309 | '@esbuild/linux-x64@0.24.2': 310 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 311 | engines: {node: '>=18'} 312 | cpu: [x64] 313 | os: [linux] 314 | 315 | '@esbuild/netbsd-arm64@0.24.2': 316 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 317 | engines: {node: '>=18'} 318 | cpu: [arm64] 319 | os: [netbsd] 320 | 321 | '@esbuild/netbsd-x64@0.24.2': 322 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 323 | engines: {node: '>=18'} 324 | cpu: [x64] 325 | os: [netbsd] 326 | 327 | '@esbuild/openbsd-arm64@0.24.2': 328 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 329 | engines: {node: '>=18'} 330 | cpu: [arm64] 331 | os: [openbsd] 332 | 333 | '@esbuild/openbsd-x64@0.24.2': 334 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 335 | engines: {node: '>=18'} 336 | cpu: [x64] 337 | os: [openbsd] 338 | 339 | '@esbuild/sunos-x64@0.24.2': 340 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 341 | engines: {node: '>=18'} 342 | cpu: [x64] 343 | os: [sunos] 344 | 345 | '@esbuild/win32-arm64@0.24.2': 346 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 347 | engines: {node: '>=18'} 348 | cpu: [arm64] 349 | os: [win32] 350 | 351 | '@esbuild/win32-ia32@0.24.2': 352 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 353 | engines: {node: '>=18'} 354 | cpu: [ia32] 355 | os: [win32] 356 | 357 | '@esbuild/win32-x64@0.24.2': 358 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 359 | engines: {node: '>=18'} 360 | cpu: [x64] 361 | os: [win32] 362 | 363 | '@eslint-community/eslint-utils@4.4.1': 364 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 365 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 366 | peerDependencies: 367 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 368 | 369 | '@eslint-community/regexpp@4.12.1': 370 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 371 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 372 | 373 | '@eslint/config-array@0.19.1': 374 | resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} 375 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 376 | 377 | '@eslint/core@0.10.0': 378 | resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} 379 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 380 | 381 | '@eslint/eslintrc@3.2.0': 382 | resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} 383 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 384 | 385 | '@eslint/js@9.19.0': 386 | resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} 387 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 388 | 389 | '@eslint/object-schema@2.1.5': 390 | resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} 391 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 392 | 393 | '@eslint/plugin-kit@0.2.5': 394 | resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} 395 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 396 | 397 | '@humanfs/core@0.19.1': 398 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 399 | engines: {node: '>=18.18.0'} 400 | 401 | '@humanfs/node@0.16.6': 402 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 403 | engines: {node: '>=18.18.0'} 404 | 405 | '@humanwhocodes/module-importer@1.0.1': 406 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 407 | engines: {node: '>=12.22'} 408 | 409 | '@humanwhocodes/retry@0.3.1': 410 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 411 | engines: {node: '>=18.18'} 412 | 413 | '@humanwhocodes/retry@0.4.1': 414 | resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} 415 | engines: {node: '>=18.18'} 416 | 417 | '@jridgewell/gen-mapping@0.3.8': 418 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 419 | engines: {node: '>=6.0.0'} 420 | 421 | '@jridgewell/resolve-uri@3.1.2': 422 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 423 | engines: {node: '>=6.0.0'} 424 | 425 | '@jridgewell/set-array@1.2.1': 426 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 427 | engines: {node: '>=6.0.0'} 428 | 429 | '@jridgewell/sourcemap-codec@1.5.0': 430 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 431 | 432 | '@jridgewell/trace-mapping@0.3.25': 433 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 434 | 435 | '@nodelib/fs.scandir@2.1.5': 436 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 437 | engines: {node: '>= 8'} 438 | 439 | '@nodelib/fs.stat@2.0.5': 440 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 441 | engines: {node: '>= 8'} 442 | 443 | '@nodelib/fs.walk@1.2.8': 444 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 445 | engines: {node: '>= 8'} 446 | 447 | '@nolyfill/is-core-module@1.0.39': 448 | resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} 449 | engines: {node: '>=12.4.0'} 450 | 451 | '@rollup/rollup-android-arm-eabi@4.32.0': 452 | resolution: {integrity: sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==} 453 | cpu: [arm] 454 | os: [android] 455 | 456 | '@rollup/rollup-android-arm64@4.32.0': 457 | resolution: {integrity: sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==} 458 | cpu: [arm64] 459 | os: [android] 460 | 461 | '@rollup/rollup-darwin-arm64@4.32.0': 462 | resolution: {integrity: sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==} 463 | cpu: [arm64] 464 | os: [darwin] 465 | 466 | '@rollup/rollup-darwin-x64@4.32.0': 467 | resolution: {integrity: sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==} 468 | cpu: [x64] 469 | os: [darwin] 470 | 471 | '@rollup/rollup-freebsd-arm64@4.32.0': 472 | resolution: {integrity: sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==} 473 | cpu: [arm64] 474 | os: [freebsd] 475 | 476 | '@rollup/rollup-freebsd-x64@4.32.0': 477 | resolution: {integrity: sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==} 478 | cpu: [x64] 479 | os: [freebsd] 480 | 481 | '@rollup/rollup-linux-arm-gnueabihf@4.32.0': 482 | resolution: {integrity: sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==} 483 | cpu: [arm] 484 | os: [linux] 485 | 486 | '@rollup/rollup-linux-arm-musleabihf@4.32.0': 487 | resolution: {integrity: sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==} 488 | cpu: [arm] 489 | os: [linux] 490 | 491 | '@rollup/rollup-linux-arm64-gnu@4.32.0': 492 | resolution: {integrity: sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==} 493 | cpu: [arm64] 494 | os: [linux] 495 | 496 | '@rollup/rollup-linux-arm64-musl@4.32.0': 497 | resolution: {integrity: sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==} 498 | cpu: [arm64] 499 | os: [linux] 500 | 501 | '@rollup/rollup-linux-loongarch64-gnu@4.32.0': 502 | resolution: {integrity: sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==} 503 | cpu: [loong64] 504 | os: [linux] 505 | 506 | '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': 507 | resolution: {integrity: sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==} 508 | cpu: [ppc64] 509 | os: [linux] 510 | 511 | '@rollup/rollup-linux-riscv64-gnu@4.32.0': 512 | resolution: {integrity: sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==} 513 | cpu: [riscv64] 514 | os: [linux] 515 | 516 | '@rollup/rollup-linux-s390x-gnu@4.32.0': 517 | resolution: {integrity: sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==} 518 | cpu: [s390x] 519 | os: [linux] 520 | 521 | '@rollup/rollup-linux-x64-gnu@4.32.0': 522 | resolution: {integrity: sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==} 523 | cpu: [x64] 524 | os: [linux] 525 | 526 | '@rollup/rollup-linux-x64-musl@4.32.0': 527 | resolution: {integrity: sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==} 528 | cpu: [x64] 529 | os: [linux] 530 | 531 | '@rollup/rollup-win32-arm64-msvc@4.32.0': 532 | resolution: {integrity: sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==} 533 | cpu: [arm64] 534 | os: [win32] 535 | 536 | '@rollup/rollup-win32-ia32-msvc@4.32.0': 537 | resolution: {integrity: sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==} 538 | cpu: [ia32] 539 | os: [win32] 540 | 541 | '@rollup/rollup-win32-x64-msvc@4.32.0': 542 | resolution: {integrity: sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==} 543 | cpu: [x64] 544 | os: [win32] 545 | 546 | '@rtsao/scc@1.1.0': 547 | resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} 548 | 549 | '@testing-library/dom@10.4.0': 550 | resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} 551 | engines: {node: '>=18'} 552 | 553 | '@testing-library/jest-dom@6.6.3': 554 | resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} 555 | engines: {node: '>=14', npm: '>=6', yarn: '>=1'} 556 | 557 | '@testing-library/react@16.2.0': 558 | resolution: {integrity: sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==} 559 | engines: {node: '>=18'} 560 | peerDependencies: 561 | '@testing-library/dom': ^10.0.0 562 | '@types/react': ^18.0.0 || ^19.0.0 563 | '@types/react-dom': ^18.0.0 || ^19.0.0 564 | react: ^18.0.0 || ^19.0.0 565 | react-dom: ^18.0.0 || ^19.0.0 566 | peerDependenciesMeta: 567 | '@types/react': 568 | optional: true 569 | '@types/react-dom': 570 | optional: true 571 | 572 | '@testing-library/user-event@14.6.1': 573 | resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} 574 | engines: {node: '>=12', npm: '>=6'} 575 | peerDependencies: 576 | '@testing-library/dom': '>=7.21.4' 577 | 578 | '@types/aria-query@5.0.4': 579 | resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} 580 | 581 | '@types/estree@1.0.6': 582 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 583 | 584 | '@types/json-schema@7.0.15': 585 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 586 | 587 | '@types/json5@0.0.29': 588 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 589 | 590 | '@types/node@22.10.10': 591 | resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==} 592 | 593 | '@types/react-dom@19.0.3': 594 | resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==} 595 | peerDependencies: 596 | '@types/react': ^19.0.0 597 | 598 | '@types/react@19.0.8': 599 | resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} 600 | 601 | '@typescript-eslint/eslint-plugin@8.21.0': 602 | resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} 603 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 604 | peerDependencies: 605 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 606 | eslint: ^8.57.0 || ^9.0.0 607 | typescript: '>=4.8.4 <5.8.0' 608 | 609 | '@typescript-eslint/parser@8.21.0': 610 | resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} 611 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 612 | peerDependencies: 613 | eslint: ^8.57.0 || ^9.0.0 614 | typescript: '>=4.8.4 <5.8.0' 615 | 616 | '@typescript-eslint/scope-manager@8.21.0': 617 | resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} 618 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 619 | 620 | '@typescript-eslint/type-utils@8.21.0': 621 | resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} 622 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 623 | peerDependencies: 624 | eslint: ^8.57.0 || ^9.0.0 625 | typescript: '>=4.8.4 <5.8.0' 626 | 627 | '@typescript-eslint/types@8.21.0': 628 | resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} 629 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 630 | 631 | '@typescript-eslint/typescript-estree@8.21.0': 632 | resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} 633 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 634 | peerDependencies: 635 | typescript: '>=4.8.4 <5.8.0' 636 | 637 | '@typescript-eslint/utils@8.21.0': 638 | resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} 639 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 640 | peerDependencies: 641 | eslint: ^8.57.0 || ^9.0.0 642 | typescript: '>=4.8.4 <5.8.0' 643 | 644 | '@typescript-eslint/visitor-keys@8.21.0': 645 | resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} 646 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 647 | 648 | '@vitest/expect@3.0.4': 649 | resolution: {integrity: sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==} 650 | 651 | '@vitest/mocker@3.0.4': 652 | resolution: {integrity: sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==} 653 | peerDependencies: 654 | msw: ^2.4.9 655 | vite: ^5.0.0 || ^6.0.0 656 | peerDependenciesMeta: 657 | msw: 658 | optional: true 659 | vite: 660 | optional: true 661 | 662 | '@vitest/pretty-format@3.0.4': 663 | resolution: {integrity: sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==} 664 | 665 | '@vitest/runner@3.0.4': 666 | resolution: {integrity: sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==} 667 | 668 | '@vitest/snapshot@3.0.4': 669 | resolution: {integrity: sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==} 670 | 671 | '@vitest/spy@3.0.4': 672 | resolution: {integrity: sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==} 673 | 674 | '@vitest/utils@3.0.4': 675 | resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==} 676 | 677 | acorn-jsx@5.3.2: 678 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 679 | peerDependencies: 680 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 681 | 682 | acorn@8.14.0: 683 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 684 | engines: {node: '>=0.4.0'} 685 | hasBin: true 686 | 687 | ajv@6.12.6: 688 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 689 | 690 | ansi-regex@5.0.1: 691 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 692 | engines: {node: '>=8'} 693 | 694 | ansi-styles@4.3.0: 695 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 696 | engines: {node: '>=8'} 697 | 698 | ansi-styles@5.2.0: 699 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 700 | engines: {node: '>=10'} 701 | 702 | argparse@2.0.1: 703 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 704 | 705 | aria-query@5.3.0: 706 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 707 | 708 | aria-query@5.3.2: 709 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 710 | engines: {node: '>= 0.4'} 711 | 712 | array-buffer-byte-length@1.0.2: 713 | resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 714 | engines: {node: '>= 0.4'} 715 | 716 | array-includes@3.1.8: 717 | resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} 718 | engines: {node: '>= 0.4'} 719 | 720 | array.prototype.findlast@1.2.5: 721 | resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} 722 | engines: {node: '>= 0.4'} 723 | 724 | array.prototype.findlastindex@1.2.5: 725 | resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} 726 | engines: {node: '>= 0.4'} 727 | 728 | array.prototype.flat@1.3.3: 729 | resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} 730 | engines: {node: '>= 0.4'} 731 | 732 | array.prototype.flatmap@1.3.3: 733 | resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} 734 | engines: {node: '>= 0.4'} 735 | 736 | array.prototype.tosorted@1.1.4: 737 | resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} 738 | engines: {node: '>= 0.4'} 739 | 740 | arraybuffer.prototype.slice@1.0.4: 741 | resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 742 | engines: {node: '>= 0.4'} 743 | 744 | assertion-error@2.0.1: 745 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 746 | engines: {node: '>=12'} 747 | 748 | ast-types-flow@0.0.8: 749 | resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} 750 | 751 | async-function@1.0.0: 752 | resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 753 | engines: {node: '>= 0.4'} 754 | 755 | available-typed-arrays@1.0.7: 756 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 757 | engines: {node: '>= 0.4'} 758 | 759 | axe-core@4.10.2: 760 | resolution: {integrity: sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==} 761 | engines: {node: '>=4'} 762 | 763 | axobject-query@4.1.0: 764 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 765 | engines: {node: '>= 0.4'} 766 | 767 | balanced-match@1.0.2: 768 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 769 | 770 | brace-expansion@1.1.11: 771 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 772 | 773 | brace-expansion@2.0.1: 774 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 775 | 776 | braces@3.0.3: 777 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 778 | engines: {node: '>=8'} 779 | 780 | browserslist@4.24.5: 781 | resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} 782 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 783 | hasBin: true 784 | 785 | cac@6.7.14: 786 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 787 | engines: {node: '>=8'} 788 | 789 | call-bind-apply-helpers@1.0.1: 790 | resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} 791 | engines: {node: '>= 0.4'} 792 | 793 | call-bind@1.0.8: 794 | resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 795 | engines: {node: '>= 0.4'} 796 | 797 | call-bound@1.0.3: 798 | resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} 799 | engines: {node: '>= 0.4'} 800 | 801 | callsites@3.1.0: 802 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 803 | engines: {node: '>=6'} 804 | 805 | caniuse-lite@1.0.30001718: 806 | resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} 807 | 808 | chai@5.1.2: 809 | resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} 810 | engines: {node: '>=12'} 811 | 812 | chalk@3.0.0: 813 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 814 | engines: {node: '>=8'} 815 | 816 | chalk@4.1.2: 817 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 818 | engines: {node: '>=10'} 819 | 820 | check-error@2.1.1: 821 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 822 | engines: {node: '>= 16'} 823 | 824 | color-convert@2.0.1: 825 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 826 | engines: {node: '>=7.0.0'} 827 | 828 | color-name@1.1.4: 829 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 830 | 831 | concat-map@0.0.1: 832 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 833 | 834 | convert-source-map@2.0.0: 835 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 836 | 837 | cross-spawn@7.0.6: 838 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 839 | engines: {node: '>= 8'} 840 | 841 | css.escape@1.5.1: 842 | resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} 843 | 844 | csstype@3.1.3: 845 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 846 | 847 | damerau-levenshtein@1.0.8: 848 | resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} 849 | 850 | data-view-buffer@1.0.2: 851 | resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 852 | engines: {node: '>= 0.4'} 853 | 854 | data-view-byte-length@1.0.2: 855 | resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 856 | engines: {node: '>= 0.4'} 857 | 858 | data-view-byte-offset@1.0.1: 859 | resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 860 | engines: {node: '>= 0.4'} 861 | 862 | debug@3.2.7: 863 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 864 | peerDependencies: 865 | supports-color: '*' 866 | peerDependenciesMeta: 867 | supports-color: 868 | optional: true 869 | 870 | debug@4.4.0: 871 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 872 | engines: {node: '>=6.0'} 873 | peerDependencies: 874 | supports-color: '*' 875 | peerDependenciesMeta: 876 | supports-color: 877 | optional: true 878 | 879 | deep-eql@5.0.2: 880 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 881 | engines: {node: '>=6'} 882 | 883 | deep-is@0.1.4: 884 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 885 | 886 | define-data-property@1.1.4: 887 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 888 | engines: {node: '>= 0.4'} 889 | 890 | define-properties@1.2.1: 891 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 892 | engines: {node: '>= 0.4'} 893 | 894 | dequal@2.0.3: 895 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 896 | engines: {node: '>=6'} 897 | 898 | doctrine@2.1.0: 899 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 900 | engines: {node: '>=0.10.0'} 901 | 902 | dom-accessibility-api@0.5.16: 903 | resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} 904 | 905 | dom-accessibility-api@0.6.3: 906 | resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} 907 | 908 | dunder-proto@1.0.1: 909 | resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 910 | engines: {node: '>= 0.4'} 911 | 912 | electron-to-chromium@1.5.157: 913 | resolution: {integrity: sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==} 914 | 915 | emoji-regex@9.2.2: 916 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 917 | 918 | enhanced-resolve@5.18.0: 919 | resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} 920 | engines: {node: '>=10.13.0'} 921 | 922 | es-abstract@1.23.9: 923 | resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} 924 | engines: {node: '>= 0.4'} 925 | 926 | es-define-property@1.0.1: 927 | resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 928 | engines: {node: '>= 0.4'} 929 | 930 | es-errors@1.3.0: 931 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 932 | engines: {node: '>= 0.4'} 933 | 934 | es-iterator-helpers@1.2.1: 935 | resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} 936 | engines: {node: '>= 0.4'} 937 | 938 | es-module-lexer@1.6.0: 939 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 940 | 941 | es-object-atoms@1.1.1: 942 | resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 943 | engines: {node: '>= 0.4'} 944 | 945 | es-set-tostringtag@2.1.0: 946 | resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 947 | engines: {node: '>= 0.4'} 948 | 949 | es-shim-unscopables@1.0.2: 950 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 951 | 952 | es-to-primitive@1.3.0: 953 | resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 954 | engines: {node: '>= 0.4'} 955 | 956 | esbuild@0.24.2: 957 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 958 | engines: {node: '>=18'} 959 | hasBin: true 960 | 961 | escalade@3.2.0: 962 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 963 | engines: {node: '>=6'} 964 | 965 | escape-string-regexp@4.0.0: 966 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 967 | engines: {node: '>=10'} 968 | 969 | eslint-import-resolver-node@0.3.9: 970 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 971 | 972 | eslint-import-resolver-typescript@3.7.0: 973 | resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} 974 | engines: {node: ^14.18.0 || >=16.0.0} 975 | peerDependencies: 976 | eslint: '*' 977 | eslint-plugin-import: '*' 978 | eslint-plugin-import-x: '*' 979 | peerDependenciesMeta: 980 | eslint-plugin-import: 981 | optional: true 982 | eslint-plugin-import-x: 983 | optional: true 984 | 985 | eslint-module-utils@2.12.0: 986 | resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} 987 | engines: {node: '>=4'} 988 | peerDependencies: 989 | '@typescript-eslint/parser': '*' 990 | eslint: '*' 991 | eslint-import-resolver-node: '*' 992 | eslint-import-resolver-typescript: '*' 993 | eslint-import-resolver-webpack: '*' 994 | peerDependenciesMeta: 995 | '@typescript-eslint/parser': 996 | optional: true 997 | eslint: 998 | optional: true 999 | eslint-import-resolver-node: 1000 | optional: true 1001 | eslint-import-resolver-typescript: 1002 | optional: true 1003 | eslint-import-resolver-webpack: 1004 | optional: true 1005 | 1006 | eslint-plugin-import@2.31.0: 1007 | resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} 1008 | engines: {node: '>=4'} 1009 | peerDependencies: 1010 | '@typescript-eslint/parser': '*' 1011 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 1012 | peerDependenciesMeta: 1013 | '@typescript-eslint/parser': 1014 | optional: true 1015 | 1016 | eslint-plugin-jsx-a11y@6.10.2: 1017 | resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} 1018 | engines: {node: '>=4.0'} 1019 | peerDependencies: 1020 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 1021 | 1022 | eslint-plugin-react-hooks@6.0.0-rc.1: 1023 | resolution: {integrity: sha512-7C4c7bdtd/B7Q+HruZxYhGjwZVvJawvQpilEYlRG1Jncuk1ZNqrFy9bO8SJNieyj3iDh8WPQA7BzzPO7sNAyEA==} 1024 | engines: {node: '>=18'} 1025 | peerDependencies: 1026 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 1027 | 1028 | eslint-plugin-react@7.37.4: 1029 | resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} 1030 | engines: {node: '>=4'} 1031 | peerDependencies: 1032 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 1033 | 1034 | eslint-scope@8.2.0: 1035 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} 1036 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1037 | 1038 | eslint-visitor-keys@3.4.3: 1039 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1040 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1041 | 1042 | eslint-visitor-keys@4.2.0: 1043 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 1044 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1045 | 1046 | eslint@9.19.0: 1047 | resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} 1048 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1049 | hasBin: true 1050 | peerDependencies: 1051 | jiti: '*' 1052 | peerDependenciesMeta: 1053 | jiti: 1054 | optional: true 1055 | 1056 | espree@10.3.0: 1057 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 1058 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1059 | 1060 | esquery@1.6.0: 1061 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 1062 | engines: {node: '>=0.10'} 1063 | 1064 | esrecurse@4.3.0: 1065 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1066 | engines: {node: '>=4.0'} 1067 | 1068 | estraverse@5.3.0: 1069 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1070 | engines: {node: '>=4.0'} 1071 | 1072 | estree-walker@3.0.3: 1073 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1074 | 1075 | esutils@2.0.3: 1076 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1077 | engines: {node: '>=0.10.0'} 1078 | 1079 | expect-type@1.1.0: 1080 | resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} 1081 | engines: {node: '>=12.0.0'} 1082 | 1083 | fast-deep-equal@3.1.3: 1084 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1085 | 1086 | fast-glob@3.3.3: 1087 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 1088 | engines: {node: '>=8.6.0'} 1089 | 1090 | fast-json-stable-stringify@2.1.0: 1091 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1092 | 1093 | fast-levenshtein@2.0.6: 1094 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1095 | 1096 | fastq@1.18.0: 1097 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} 1098 | 1099 | file-entry-cache@8.0.0: 1100 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 1101 | engines: {node: '>=16.0.0'} 1102 | 1103 | fill-range@7.1.1: 1104 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1105 | engines: {node: '>=8'} 1106 | 1107 | find-up@5.0.0: 1108 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1109 | engines: {node: '>=10'} 1110 | 1111 | flat-cache@4.0.1: 1112 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 1113 | engines: {node: '>=16'} 1114 | 1115 | flatted@3.3.2: 1116 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} 1117 | 1118 | for-each@0.3.4: 1119 | resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} 1120 | engines: {node: '>= 0.4'} 1121 | 1122 | fsevents@2.3.3: 1123 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1124 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1125 | os: [darwin] 1126 | 1127 | function-bind@1.1.2: 1128 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1129 | 1130 | function.prototype.name@1.1.8: 1131 | resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 1132 | engines: {node: '>= 0.4'} 1133 | 1134 | functions-have-names@1.2.3: 1135 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1136 | 1137 | gensync@1.0.0-beta.2: 1138 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1139 | engines: {node: '>=6.9.0'} 1140 | 1141 | get-intrinsic@1.2.7: 1142 | resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} 1143 | engines: {node: '>= 0.4'} 1144 | 1145 | get-proto@1.0.1: 1146 | resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 1147 | engines: {node: '>= 0.4'} 1148 | 1149 | get-symbol-description@1.1.0: 1150 | resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 1151 | engines: {node: '>= 0.4'} 1152 | 1153 | get-tsconfig@4.10.0: 1154 | resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} 1155 | 1156 | glob-parent@5.1.2: 1157 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1158 | engines: {node: '>= 6'} 1159 | 1160 | glob-parent@6.0.2: 1161 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1162 | engines: {node: '>=10.13.0'} 1163 | 1164 | globals@11.12.0: 1165 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1166 | engines: {node: '>=4'} 1167 | 1168 | globals@14.0.0: 1169 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 1170 | engines: {node: '>=18'} 1171 | 1172 | globalthis@1.0.4: 1173 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 1174 | engines: {node: '>= 0.4'} 1175 | 1176 | globrex@0.1.2: 1177 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1178 | 1179 | gopd@1.2.0: 1180 | resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 1181 | engines: {node: '>= 0.4'} 1182 | 1183 | graceful-fs@4.2.11: 1184 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1185 | 1186 | graphemer@1.4.0: 1187 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1188 | 1189 | happy-dom@16.7.2: 1190 | resolution: {integrity: sha512-zOzw0xyYlDaF/ylwbAsduYZZVRTd5u7IwlFkGbEathIeJMLp3vrN3cHm3RS7PZpD9gr/IO16bHEswcgNyWTsqw==} 1191 | engines: {node: '>=18.0.0'} 1192 | 1193 | has-bigints@1.1.0: 1194 | resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 1195 | engines: {node: '>= 0.4'} 1196 | 1197 | has-flag@4.0.0: 1198 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1199 | engines: {node: '>=8'} 1200 | 1201 | has-property-descriptors@1.0.2: 1202 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 1203 | 1204 | has-proto@1.2.0: 1205 | resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 1206 | engines: {node: '>= 0.4'} 1207 | 1208 | has-symbols@1.1.0: 1209 | resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 1210 | engines: {node: '>= 0.4'} 1211 | 1212 | has-tostringtag@1.0.2: 1213 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1214 | engines: {node: '>= 0.4'} 1215 | 1216 | hasown@2.0.2: 1217 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1218 | engines: {node: '>= 0.4'} 1219 | 1220 | hermes-estree@0.25.1: 1221 | resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} 1222 | 1223 | hermes-parser@0.25.1: 1224 | resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} 1225 | 1226 | ignore@5.3.2: 1227 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1228 | engines: {node: '>= 4'} 1229 | 1230 | immer@10.1.1: 1231 | resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} 1232 | 1233 | import-fresh@3.3.0: 1234 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1235 | engines: {node: '>=6'} 1236 | 1237 | imurmurhash@0.1.4: 1238 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1239 | engines: {node: '>=0.8.19'} 1240 | 1241 | indent-string@4.0.0: 1242 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1243 | engines: {node: '>=8'} 1244 | 1245 | internal-slot@1.1.0: 1246 | resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1247 | engines: {node: '>= 0.4'} 1248 | 1249 | is-array-buffer@3.0.5: 1250 | resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 1251 | engines: {node: '>= 0.4'} 1252 | 1253 | is-async-function@2.1.1: 1254 | resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} 1255 | engines: {node: '>= 0.4'} 1256 | 1257 | is-bigint@1.1.0: 1258 | resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 1259 | engines: {node: '>= 0.4'} 1260 | 1261 | is-boolean-object@1.2.1: 1262 | resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} 1263 | engines: {node: '>= 0.4'} 1264 | 1265 | is-bun-module@1.3.0: 1266 | resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} 1267 | 1268 | is-callable@1.2.7: 1269 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1270 | engines: {node: '>= 0.4'} 1271 | 1272 | is-core-module@2.16.1: 1273 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1274 | engines: {node: '>= 0.4'} 1275 | 1276 | is-data-view@1.0.2: 1277 | resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 1278 | engines: {node: '>= 0.4'} 1279 | 1280 | is-date-object@1.1.0: 1281 | resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 1282 | engines: {node: '>= 0.4'} 1283 | 1284 | is-extglob@2.1.1: 1285 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1286 | engines: {node: '>=0.10.0'} 1287 | 1288 | is-finalizationregistry@1.1.1: 1289 | resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 1290 | engines: {node: '>= 0.4'} 1291 | 1292 | is-generator-function@1.1.0: 1293 | resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 1294 | engines: {node: '>= 0.4'} 1295 | 1296 | is-glob@4.0.3: 1297 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1298 | engines: {node: '>=0.10.0'} 1299 | 1300 | is-map@2.0.3: 1301 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 1302 | engines: {node: '>= 0.4'} 1303 | 1304 | is-number-object@1.1.1: 1305 | resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 1306 | engines: {node: '>= 0.4'} 1307 | 1308 | is-number@7.0.0: 1309 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1310 | engines: {node: '>=0.12.0'} 1311 | 1312 | is-regex@1.2.1: 1313 | resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1314 | engines: {node: '>= 0.4'} 1315 | 1316 | is-set@2.0.3: 1317 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 1318 | engines: {node: '>= 0.4'} 1319 | 1320 | is-shared-array-buffer@1.0.4: 1321 | resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 1322 | engines: {node: '>= 0.4'} 1323 | 1324 | is-string@1.1.1: 1325 | resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 1326 | engines: {node: '>= 0.4'} 1327 | 1328 | is-symbol@1.1.1: 1329 | resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 1330 | engines: {node: '>= 0.4'} 1331 | 1332 | is-typed-array@1.1.15: 1333 | resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 1334 | engines: {node: '>= 0.4'} 1335 | 1336 | is-weakmap@2.0.2: 1337 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 1338 | engines: {node: '>= 0.4'} 1339 | 1340 | is-weakref@1.1.0: 1341 | resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} 1342 | engines: {node: '>= 0.4'} 1343 | 1344 | is-weakset@2.0.4: 1345 | resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 1346 | engines: {node: '>= 0.4'} 1347 | 1348 | isarray@2.0.5: 1349 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1350 | 1351 | isexe@2.0.0: 1352 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1353 | 1354 | iterator.prototype@1.1.5: 1355 | resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} 1356 | engines: {node: '>= 0.4'} 1357 | 1358 | js-tokens@4.0.0: 1359 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1360 | 1361 | js-yaml@4.1.0: 1362 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1363 | hasBin: true 1364 | 1365 | jsesc@3.1.0: 1366 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1367 | engines: {node: '>=6'} 1368 | hasBin: true 1369 | 1370 | json-buffer@3.0.1: 1371 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1372 | 1373 | json-schema-traverse@0.4.1: 1374 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1375 | 1376 | json-stable-stringify-without-jsonify@1.0.1: 1377 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1378 | 1379 | json5@1.0.2: 1380 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1381 | hasBin: true 1382 | 1383 | json5@2.2.3: 1384 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1385 | engines: {node: '>=6'} 1386 | hasBin: true 1387 | 1388 | jsx-ast-utils@3.3.5: 1389 | resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} 1390 | engines: {node: '>=4.0'} 1391 | 1392 | keyv@4.5.4: 1393 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1394 | 1395 | language-subtag-registry@0.3.23: 1396 | resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} 1397 | 1398 | language-tags@1.0.9: 1399 | resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} 1400 | engines: {node: '>=0.10'} 1401 | 1402 | levn@0.4.1: 1403 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1404 | engines: {node: '>= 0.8.0'} 1405 | 1406 | locate-path@6.0.0: 1407 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1408 | engines: {node: '>=10'} 1409 | 1410 | lodash.merge@4.6.2: 1411 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1412 | 1413 | lodash@4.17.21: 1414 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1415 | 1416 | loose-envify@1.4.0: 1417 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1418 | hasBin: true 1419 | 1420 | loupe@3.1.2: 1421 | resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} 1422 | 1423 | lru-cache@5.1.1: 1424 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1425 | 1426 | lz-string@1.5.0: 1427 | resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} 1428 | hasBin: true 1429 | 1430 | magic-string@0.30.17: 1431 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1432 | 1433 | math-intrinsics@1.1.0: 1434 | resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1435 | engines: {node: '>= 0.4'} 1436 | 1437 | merge2@1.4.1: 1438 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1439 | engines: {node: '>= 8'} 1440 | 1441 | micromatch@4.0.8: 1442 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1443 | engines: {node: '>=8.6'} 1444 | 1445 | min-indent@1.0.1: 1446 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1447 | engines: {node: '>=4'} 1448 | 1449 | minimatch@3.1.2: 1450 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1451 | 1452 | minimatch@9.0.5: 1453 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1454 | engines: {node: '>=16 || 14 >=14.17'} 1455 | 1456 | minimist@1.2.8: 1457 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1458 | 1459 | ms@2.1.3: 1460 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1461 | 1462 | nanoid@3.3.8: 1463 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 1464 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1465 | hasBin: true 1466 | 1467 | natural-compare@1.4.0: 1468 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1469 | 1470 | node-releases@2.0.19: 1471 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1472 | 1473 | object-assign@4.1.1: 1474 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1475 | engines: {node: '>=0.10.0'} 1476 | 1477 | object-inspect@1.13.3: 1478 | resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} 1479 | engines: {node: '>= 0.4'} 1480 | 1481 | object-keys@1.1.1: 1482 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1483 | engines: {node: '>= 0.4'} 1484 | 1485 | object.assign@4.1.7: 1486 | resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1487 | engines: {node: '>= 0.4'} 1488 | 1489 | object.entries@1.1.8: 1490 | resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} 1491 | engines: {node: '>= 0.4'} 1492 | 1493 | object.fromentries@2.0.8: 1494 | resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} 1495 | engines: {node: '>= 0.4'} 1496 | 1497 | object.groupby@1.0.3: 1498 | resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} 1499 | engines: {node: '>= 0.4'} 1500 | 1501 | object.values@1.2.1: 1502 | resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} 1503 | engines: {node: '>= 0.4'} 1504 | 1505 | optionator@0.9.4: 1506 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1507 | engines: {node: '>= 0.8.0'} 1508 | 1509 | own-keys@1.0.1: 1510 | resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1511 | engines: {node: '>= 0.4'} 1512 | 1513 | p-limit@3.1.0: 1514 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1515 | engines: {node: '>=10'} 1516 | 1517 | p-locate@5.0.0: 1518 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1519 | engines: {node: '>=10'} 1520 | 1521 | parent-module@1.0.1: 1522 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1523 | engines: {node: '>=6'} 1524 | 1525 | path-exists@4.0.0: 1526 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1527 | engines: {node: '>=8'} 1528 | 1529 | path-key@3.1.1: 1530 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1531 | engines: {node: '>=8'} 1532 | 1533 | path-parse@1.0.7: 1534 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1535 | 1536 | pathe@2.0.2: 1537 | resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} 1538 | 1539 | pathval@2.0.0: 1540 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1541 | engines: {node: '>= 14.16'} 1542 | 1543 | picocolors@1.1.1: 1544 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1545 | 1546 | picomatch@2.3.1: 1547 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1548 | engines: {node: '>=8.6'} 1549 | 1550 | possible-typed-array-names@1.0.0: 1551 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 1552 | engines: {node: '>= 0.4'} 1553 | 1554 | postcss@8.5.1: 1555 | resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} 1556 | engines: {node: ^10 || ^12 || >=14} 1557 | 1558 | prelude-ls@1.2.1: 1559 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1560 | engines: {node: '>= 0.8.0'} 1561 | 1562 | prettier@3.4.2: 1563 | resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} 1564 | engines: {node: '>=14'} 1565 | hasBin: true 1566 | 1567 | pretty-format@27.5.1: 1568 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} 1569 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1570 | 1571 | prop-types@15.8.1: 1572 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1573 | 1574 | punycode@2.3.1: 1575 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1576 | engines: {node: '>=6'} 1577 | 1578 | queue-microtask@1.2.3: 1579 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1580 | 1581 | react-dom@19.0.0: 1582 | resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} 1583 | peerDependencies: 1584 | react: ^19.0.0 1585 | 1586 | react-is@16.13.1: 1587 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1588 | 1589 | react-is@17.0.2: 1590 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 1591 | 1592 | react@19.0.0: 1593 | resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} 1594 | engines: {node: '>=0.10.0'} 1595 | 1596 | redent@3.0.0: 1597 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 1598 | engines: {node: '>=8'} 1599 | 1600 | reflect.getprototypeof@1.0.10: 1601 | resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1602 | engines: {node: '>= 0.4'} 1603 | 1604 | regenerator-runtime@0.14.1: 1605 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1606 | 1607 | regexp.prototype.flags@1.5.4: 1608 | resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1609 | engines: {node: '>= 0.4'} 1610 | 1611 | resolve-from@4.0.0: 1612 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1613 | engines: {node: '>=4'} 1614 | 1615 | resolve-pkg-maps@1.0.0: 1616 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1617 | 1618 | resolve@1.22.10: 1619 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1620 | engines: {node: '>= 0.4'} 1621 | hasBin: true 1622 | 1623 | resolve@2.0.0-next.5: 1624 | resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} 1625 | hasBin: true 1626 | 1627 | reusify@1.0.4: 1628 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1629 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1630 | 1631 | rollup@4.32.0: 1632 | resolution: {integrity: sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==} 1633 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1634 | hasBin: true 1635 | 1636 | run-parallel@1.2.0: 1637 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1638 | 1639 | safe-array-concat@1.1.3: 1640 | resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1641 | engines: {node: '>=0.4'} 1642 | 1643 | safe-push-apply@1.0.0: 1644 | resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1645 | engines: {node: '>= 0.4'} 1646 | 1647 | safe-regex-test@1.1.0: 1648 | resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1649 | engines: {node: '>= 0.4'} 1650 | 1651 | scheduler@0.25.0: 1652 | resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} 1653 | 1654 | semver@6.3.1: 1655 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1656 | hasBin: true 1657 | 1658 | semver@7.6.3: 1659 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1660 | engines: {node: '>=10'} 1661 | hasBin: true 1662 | 1663 | set-function-length@1.2.2: 1664 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1665 | engines: {node: '>= 0.4'} 1666 | 1667 | set-function-name@2.0.2: 1668 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1669 | engines: {node: '>= 0.4'} 1670 | 1671 | set-proto@1.0.0: 1672 | resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1673 | engines: {node: '>= 0.4'} 1674 | 1675 | shebang-command@2.0.0: 1676 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1677 | engines: {node: '>=8'} 1678 | 1679 | shebang-regex@3.0.0: 1680 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1681 | engines: {node: '>=8'} 1682 | 1683 | side-channel-list@1.0.0: 1684 | resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1685 | engines: {node: '>= 0.4'} 1686 | 1687 | side-channel-map@1.0.1: 1688 | resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1689 | engines: {node: '>= 0.4'} 1690 | 1691 | side-channel-weakmap@1.0.2: 1692 | resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1693 | engines: {node: '>= 0.4'} 1694 | 1695 | side-channel@1.1.0: 1696 | resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1697 | engines: {node: '>= 0.4'} 1698 | 1699 | siginfo@2.0.0: 1700 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1701 | 1702 | source-map-js@1.2.1: 1703 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1704 | engines: {node: '>=0.10.0'} 1705 | 1706 | stable-hash@0.0.4: 1707 | resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} 1708 | 1709 | stackback@0.0.2: 1710 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1711 | 1712 | std-env@3.8.0: 1713 | resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 1714 | 1715 | string.prototype.includes@2.0.1: 1716 | resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} 1717 | engines: {node: '>= 0.4'} 1718 | 1719 | string.prototype.matchall@4.0.12: 1720 | resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} 1721 | engines: {node: '>= 0.4'} 1722 | 1723 | string.prototype.repeat@1.0.0: 1724 | resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} 1725 | 1726 | string.prototype.trim@1.2.10: 1727 | resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1728 | engines: {node: '>= 0.4'} 1729 | 1730 | string.prototype.trimend@1.0.9: 1731 | resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1732 | engines: {node: '>= 0.4'} 1733 | 1734 | string.prototype.trimstart@1.0.8: 1735 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1736 | engines: {node: '>= 0.4'} 1737 | 1738 | strip-bom@3.0.0: 1739 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1740 | engines: {node: '>=4'} 1741 | 1742 | strip-indent@3.0.0: 1743 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1744 | engines: {node: '>=8'} 1745 | 1746 | strip-json-comments@3.1.1: 1747 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1748 | engines: {node: '>=8'} 1749 | 1750 | supports-color@7.2.0: 1751 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1752 | engines: {node: '>=8'} 1753 | 1754 | supports-preserve-symlinks-flag@1.0.0: 1755 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1756 | engines: {node: '>= 0.4'} 1757 | 1758 | tapable@2.2.1: 1759 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1760 | engines: {node: '>=6'} 1761 | 1762 | tinybench@2.9.0: 1763 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1764 | 1765 | tinyexec@0.3.2: 1766 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1767 | 1768 | tinypool@1.0.2: 1769 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1770 | engines: {node: ^18.0.0 || >=20.0.0} 1771 | 1772 | tinyrainbow@2.0.0: 1773 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 1774 | engines: {node: '>=14.0.0'} 1775 | 1776 | tinyspy@3.0.2: 1777 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1778 | engines: {node: '>=14.0.0'} 1779 | 1780 | to-regex-range@5.0.1: 1781 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1782 | engines: {node: '>=8.0'} 1783 | 1784 | ts-api-utils@2.0.0: 1785 | resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} 1786 | engines: {node: '>=18.12'} 1787 | peerDependencies: 1788 | typescript: '>=4.8.4' 1789 | 1790 | ts-expect@1.3.0: 1791 | resolution: {integrity: sha512-e4g0EJtAjk64xgnFPD6kTBUtpnMVzDrMb12N1YZV0VvSlhnVT3SGxiYTLdGy8Q5cYHOIC/FAHmZ10eGrAguicQ==} 1792 | 1793 | tsconfck@3.1.4: 1794 | resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==} 1795 | engines: {node: ^18 || >=20} 1796 | hasBin: true 1797 | peerDependencies: 1798 | typescript: ^5.0.0 1799 | peerDependenciesMeta: 1800 | typescript: 1801 | optional: true 1802 | 1803 | tsconfig-paths@3.15.0: 1804 | resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 1805 | 1806 | type-check@0.4.0: 1807 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1808 | engines: {node: '>= 0.8.0'} 1809 | 1810 | typed-array-buffer@1.0.3: 1811 | resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1812 | engines: {node: '>= 0.4'} 1813 | 1814 | typed-array-byte-length@1.0.3: 1815 | resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1816 | engines: {node: '>= 0.4'} 1817 | 1818 | typed-array-byte-offset@1.0.4: 1819 | resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1820 | engines: {node: '>= 0.4'} 1821 | 1822 | typed-array-length@1.0.7: 1823 | resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1824 | engines: {node: '>= 0.4'} 1825 | 1826 | typescript-eslint@8.21.0: 1827 | resolution: {integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==} 1828 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1829 | peerDependencies: 1830 | eslint: ^8.57.0 || ^9.0.0 1831 | typescript: '>=4.8.4 <5.8.0' 1832 | 1833 | typescript@5.7.3: 1834 | resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 1835 | engines: {node: '>=14.17'} 1836 | hasBin: true 1837 | 1838 | unbox-primitive@1.1.0: 1839 | resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1840 | engines: {node: '>= 0.4'} 1841 | 1842 | undici-types@6.20.0: 1843 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1844 | 1845 | update-browserslist-db@1.1.3: 1846 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1847 | hasBin: true 1848 | peerDependencies: 1849 | browserslist: '>= 4.21.0' 1850 | 1851 | uri-js@4.4.1: 1852 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1853 | 1854 | vite-node@3.0.4: 1855 | resolution: {integrity: sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==} 1856 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1857 | hasBin: true 1858 | 1859 | vite-tsconfig-paths@5.1.4: 1860 | resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} 1861 | peerDependencies: 1862 | vite: '*' 1863 | peerDependenciesMeta: 1864 | vite: 1865 | optional: true 1866 | 1867 | vite@6.0.11: 1868 | resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} 1869 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1870 | hasBin: true 1871 | peerDependencies: 1872 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1873 | jiti: '>=1.21.0' 1874 | less: '*' 1875 | lightningcss: ^1.21.0 1876 | sass: '*' 1877 | sass-embedded: '*' 1878 | stylus: '*' 1879 | sugarss: '*' 1880 | terser: ^5.16.0 1881 | tsx: ^4.8.1 1882 | yaml: ^2.4.2 1883 | peerDependenciesMeta: 1884 | '@types/node': 1885 | optional: true 1886 | jiti: 1887 | optional: true 1888 | less: 1889 | optional: true 1890 | lightningcss: 1891 | optional: true 1892 | sass: 1893 | optional: true 1894 | sass-embedded: 1895 | optional: true 1896 | stylus: 1897 | optional: true 1898 | sugarss: 1899 | optional: true 1900 | terser: 1901 | optional: true 1902 | tsx: 1903 | optional: true 1904 | yaml: 1905 | optional: true 1906 | 1907 | vitest@3.0.4: 1908 | resolution: {integrity: sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==} 1909 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1910 | hasBin: true 1911 | peerDependencies: 1912 | '@edge-runtime/vm': '*' 1913 | '@types/debug': ^4.1.12 1914 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1915 | '@vitest/browser': 3.0.4 1916 | '@vitest/ui': 3.0.4 1917 | happy-dom: '*' 1918 | jsdom: '*' 1919 | peerDependenciesMeta: 1920 | '@edge-runtime/vm': 1921 | optional: true 1922 | '@types/debug': 1923 | optional: true 1924 | '@types/node': 1925 | optional: true 1926 | '@vitest/browser': 1927 | optional: true 1928 | '@vitest/ui': 1929 | optional: true 1930 | happy-dom: 1931 | optional: true 1932 | jsdom: 1933 | optional: true 1934 | 1935 | webidl-conversions@7.0.0: 1936 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 1937 | engines: {node: '>=12'} 1938 | 1939 | whatwg-mimetype@3.0.0: 1940 | resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} 1941 | engines: {node: '>=12'} 1942 | 1943 | which-boxed-primitive@1.1.1: 1944 | resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 1945 | engines: {node: '>= 0.4'} 1946 | 1947 | which-builtin-type@1.2.1: 1948 | resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 1949 | engines: {node: '>= 0.4'} 1950 | 1951 | which-collection@1.0.2: 1952 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 1953 | engines: {node: '>= 0.4'} 1954 | 1955 | which-typed-array@1.1.18: 1956 | resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} 1957 | engines: {node: '>= 0.4'} 1958 | 1959 | which@2.0.2: 1960 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1961 | engines: {node: '>= 8'} 1962 | hasBin: true 1963 | 1964 | why-is-node-running@2.3.0: 1965 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1966 | engines: {node: '>=8'} 1967 | hasBin: true 1968 | 1969 | word-wrap@1.2.5: 1970 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1971 | engines: {node: '>=0.10.0'} 1972 | 1973 | yallist@3.1.1: 1974 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1975 | 1976 | yocto-queue@0.1.0: 1977 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1978 | engines: {node: '>=10'} 1979 | 1980 | zod-validation-error@3.4.1: 1981 | resolution: {integrity: sha512-1KP64yqDPQ3rupxNv7oXhf7KdhHHgaqbKuspVoiN93TT0xrBjql+Svjkdjq/Qh/7GSMmgQs3AfvBT0heE35thw==} 1982 | engines: {node: '>=18.0.0'} 1983 | peerDependencies: 1984 | zod: ^3.24.4 1985 | 1986 | zod@3.25.23: 1987 | resolution: {integrity: sha512-Od2bdMosahjSrSgJtakrwjMDb1zM1A3VIHCPGveZt/3/wlrTWBya2lmEh2OYe4OIu8mPTmmr0gnLHIWQXdtWBg==} 1988 | 1989 | zustand@5.0.3: 1990 | resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} 1991 | engines: {node: '>=12.20.0'} 1992 | peerDependencies: 1993 | '@types/react': '>=18.0.0' 1994 | immer: '>=9.0.6' 1995 | react: '>=18.0.0' 1996 | use-sync-external-store: '>=1.2.0' 1997 | peerDependenciesMeta: 1998 | '@types/react': 1999 | optional: true 2000 | immer: 2001 | optional: true 2002 | react: 2003 | optional: true 2004 | use-sync-external-store: 2005 | optional: true 2006 | 2007 | snapshots: 2008 | 2009 | '@adobe/css-tools@4.4.1': {} 2010 | 2011 | '@ampproject/remapping@2.3.0': 2012 | dependencies: 2013 | '@jridgewell/gen-mapping': 0.3.8 2014 | '@jridgewell/trace-mapping': 0.3.25 2015 | 2016 | '@babel/code-frame@7.26.2': 2017 | dependencies: 2018 | '@babel/helper-validator-identifier': 7.25.9 2019 | js-tokens: 4.0.0 2020 | picocolors: 1.1.1 2021 | 2022 | '@babel/code-frame@7.27.1': 2023 | dependencies: 2024 | '@babel/helper-validator-identifier': 7.27.1 2025 | js-tokens: 4.0.0 2026 | picocolors: 1.1.1 2027 | 2028 | '@babel/compat-data@7.27.2': {} 2029 | 2030 | '@babel/core@7.27.1': 2031 | dependencies: 2032 | '@ampproject/remapping': 2.3.0 2033 | '@babel/code-frame': 7.27.1 2034 | '@babel/generator': 7.27.1 2035 | '@babel/helper-compilation-targets': 7.27.2 2036 | '@babel/helper-module-transforms': 7.27.1(@babel/core@7.27.1) 2037 | '@babel/helpers': 7.27.1 2038 | '@babel/parser': 7.27.2 2039 | '@babel/template': 7.27.2 2040 | '@babel/traverse': 7.27.1 2041 | '@babel/types': 7.27.1 2042 | convert-source-map: 2.0.0 2043 | debug: 4.4.0 2044 | gensync: 1.0.0-beta.2 2045 | json5: 2.2.3 2046 | semver: 6.3.1 2047 | transitivePeerDependencies: 2048 | - supports-color 2049 | 2050 | '@babel/generator@7.27.1': 2051 | dependencies: 2052 | '@babel/parser': 7.27.2 2053 | '@babel/types': 7.27.1 2054 | '@jridgewell/gen-mapping': 0.3.8 2055 | '@jridgewell/trace-mapping': 0.3.25 2056 | jsesc: 3.1.0 2057 | 2058 | '@babel/helper-annotate-as-pure@7.27.1': 2059 | dependencies: 2060 | '@babel/types': 7.27.1 2061 | 2062 | '@babel/helper-compilation-targets@7.27.2': 2063 | dependencies: 2064 | '@babel/compat-data': 7.27.2 2065 | '@babel/helper-validator-option': 7.27.1 2066 | browserslist: 4.24.5 2067 | lru-cache: 5.1.1 2068 | semver: 6.3.1 2069 | 2070 | '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.1)': 2071 | dependencies: 2072 | '@babel/core': 7.27.1 2073 | '@babel/helper-annotate-as-pure': 7.27.1 2074 | '@babel/helper-member-expression-to-functions': 7.27.1 2075 | '@babel/helper-optimise-call-expression': 7.27.1 2076 | '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.1) 2077 | '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 2078 | '@babel/traverse': 7.27.1 2079 | semver: 6.3.1 2080 | transitivePeerDependencies: 2081 | - supports-color 2082 | 2083 | '@babel/helper-member-expression-to-functions@7.27.1': 2084 | dependencies: 2085 | '@babel/traverse': 7.27.1 2086 | '@babel/types': 7.27.1 2087 | transitivePeerDependencies: 2088 | - supports-color 2089 | 2090 | '@babel/helper-module-imports@7.27.1': 2091 | dependencies: 2092 | '@babel/traverse': 7.27.1 2093 | '@babel/types': 7.27.1 2094 | transitivePeerDependencies: 2095 | - supports-color 2096 | 2097 | '@babel/helper-module-transforms@7.27.1(@babel/core@7.27.1)': 2098 | dependencies: 2099 | '@babel/core': 7.27.1 2100 | '@babel/helper-module-imports': 7.27.1 2101 | '@babel/helper-validator-identifier': 7.27.1 2102 | '@babel/traverse': 7.27.1 2103 | transitivePeerDependencies: 2104 | - supports-color 2105 | 2106 | '@babel/helper-optimise-call-expression@7.27.1': 2107 | dependencies: 2108 | '@babel/types': 7.27.1 2109 | 2110 | '@babel/helper-plugin-utils@7.27.1': {} 2111 | 2112 | '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.1)': 2113 | dependencies: 2114 | '@babel/core': 7.27.1 2115 | '@babel/helper-member-expression-to-functions': 7.27.1 2116 | '@babel/helper-optimise-call-expression': 7.27.1 2117 | '@babel/traverse': 7.27.1 2118 | transitivePeerDependencies: 2119 | - supports-color 2120 | 2121 | '@babel/helper-skip-transparent-expression-wrappers@7.27.1': 2122 | dependencies: 2123 | '@babel/traverse': 7.27.1 2124 | '@babel/types': 7.27.1 2125 | transitivePeerDependencies: 2126 | - supports-color 2127 | 2128 | '@babel/helper-string-parser@7.27.1': {} 2129 | 2130 | '@babel/helper-validator-identifier@7.25.9': {} 2131 | 2132 | '@babel/helper-validator-identifier@7.27.1': {} 2133 | 2134 | '@babel/helper-validator-option@7.27.1': {} 2135 | 2136 | '@babel/helpers@7.27.1': 2137 | dependencies: 2138 | '@babel/template': 7.27.2 2139 | '@babel/types': 7.27.1 2140 | 2141 | '@babel/parser@7.27.2': 2142 | dependencies: 2143 | '@babel/types': 7.27.1 2144 | 2145 | '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.1)': 2146 | dependencies: 2147 | '@babel/core': 7.27.1 2148 | '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.1) 2149 | '@babel/helper-plugin-utils': 7.27.1 2150 | transitivePeerDependencies: 2151 | - supports-color 2152 | 2153 | '@babel/runtime@7.26.7': 2154 | dependencies: 2155 | regenerator-runtime: 0.14.1 2156 | 2157 | '@babel/template@7.27.2': 2158 | dependencies: 2159 | '@babel/code-frame': 7.27.1 2160 | '@babel/parser': 7.27.2 2161 | '@babel/types': 7.27.1 2162 | 2163 | '@babel/traverse@7.27.1': 2164 | dependencies: 2165 | '@babel/code-frame': 7.27.1 2166 | '@babel/generator': 7.27.1 2167 | '@babel/parser': 7.27.2 2168 | '@babel/template': 7.27.2 2169 | '@babel/types': 7.27.1 2170 | debug: 4.4.0 2171 | globals: 11.12.0 2172 | transitivePeerDependencies: 2173 | - supports-color 2174 | 2175 | '@babel/types@7.27.1': 2176 | dependencies: 2177 | '@babel/helper-string-parser': 7.27.1 2178 | '@babel/helper-validator-identifier': 7.27.1 2179 | 2180 | '@esbuild/aix-ppc64@0.24.2': 2181 | optional: true 2182 | 2183 | '@esbuild/android-arm64@0.24.2': 2184 | optional: true 2185 | 2186 | '@esbuild/android-arm@0.24.2': 2187 | optional: true 2188 | 2189 | '@esbuild/android-x64@0.24.2': 2190 | optional: true 2191 | 2192 | '@esbuild/darwin-arm64@0.24.2': 2193 | optional: true 2194 | 2195 | '@esbuild/darwin-x64@0.24.2': 2196 | optional: true 2197 | 2198 | '@esbuild/freebsd-arm64@0.24.2': 2199 | optional: true 2200 | 2201 | '@esbuild/freebsd-x64@0.24.2': 2202 | optional: true 2203 | 2204 | '@esbuild/linux-arm64@0.24.2': 2205 | optional: true 2206 | 2207 | '@esbuild/linux-arm@0.24.2': 2208 | optional: true 2209 | 2210 | '@esbuild/linux-ia32@0.24.2': 2211 | optional: true 2212 | 2213 | '@esbuild/linux-loong64@0.24.2': 2214 | optional: true 2215 | 2216 | '@esbuild/linux-mips64el@0.24.2': 2217 | optional: true 2218 | 2219 | '@esbuild/linux-ppc64@0.24.2': 2220 | optional: true 2221 | 2222 | '@esbuild/linux-riscv64@0.24.2': 2223 | optional: true 2224 | 2225 | '@esbuild/linux-s390x@0.24.2': 2226 | optional: true 2227 | 2228 | '@esbuild/linux-x64@0.24.2': 2229 | optional: true 2230 | 2231 | '@esbuild/netbsd-arm64@0.24.2': 2232 | optional: true 2233 | 2234 | '@esbuild/netbsd-x64@0.24.2': 2235 | optional: true 2236 | 2237 | '@esbuild/openbsd-arm64@0.24.2': 2238 | optional: true 2239 | 2240 | '@esbuild/openbsd-x64@0.24.2': 2241 | optional: true 2242 | 2243 | '@esbuild/sunos-x64@0.24.2': 2244 | optional: true 2245 | 2246 | '@esbuild/win32-arm64@0.24.2': 2247 | optional: true 2248 | 2249 | '@esbuild/win32-ia32@0.24.2': 2250 | optional: true 2251 | 2252 | '@esbuild/win32-x64@0.24.2': 2253 | optional: true 2254 | 2255 | '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0)': 2256 | dependencies: 2257 | eslint: 9.19.0 2258 | eslint-visitor-keys: 3.4.3 2259 | 2260 | '@eslint-community/regexpp@4.12.1': {} 2261 | 2262 | '@eslint/config-array@0.19.1': 2263 | dependencies: 2264 | '@eslint/object-schema': 2.1.5 2265 | debug: 4.4.0 2266 | minimatch: 3.1.2 2267 | transitivePeerDependencies: 2268 | - supports-color 2269 | 2270 | '@eslint/core@0.10.0': 2271 | dependencies: 2272 | '@types/json-schema': 7.0.15 2273 | 2274 | '@eslint/eslintrc@3.2.0': 2275 | dependencies: 2276 | ajv: 6.12.6 2277 | debug: 4.4.0 2278 | espree: 10.3.0 2279 | globals: 14.0.0 2280 | ignore: 5.3.2 2281 | import-fresh: 3.3.0 2282 | js-yaml: 4.1.0 2283 | minimatch: 3.1.2 2284 | strip-json-comments: 3.1.1 2285 | transitivePeerDependencies: 2286 | - supports-color 2287 | 2288 | '@eslint/js@9.19.0': {} 2289 | 2290 | '@eslint/object-schema@2.1.5': {} 2291 | 2292 | '@eslint/plugin-kit@0.2.5': 2293 | dependencies: 2294 | '@eslint/core': 0.10.0 2295 | levn: 0.4.1 2296 | 2297 | '@humanfs/core@0.19.1': {} 2298 | 2299 | '@humanfs/node@0.16.6': 2300 | dependencies: 2301 | '@humanfs/core': 0.19.1 2302 | '@humanwhocodes/retry': 0.3.1 2303 | 2304 | '@humanwhocodes/module-importer@1.0.1': {} 2305 | 2306 | '@humanwhocodes/retry@0.3.1': {} 2307 | 2308 | '@humanwhocodes/retry@0.4.1': {} 2309 | 2310 | '@jridgewell/gen-mapping@0.3.8': 2311 | dependencies: 2312 | '@jridgewell/set-array': 1.2.1 2313 | '@jridgewell/sourcemap-codec': 1.5.0 2314 | '@jridgewell/trace-mapping': 0.3.25 2315 | 2316 | '@jridgewell/resolve-uri@3.1.2': {} 2317 | 2318 | '@jridgewell/set-array@1.2.1': {} 2319 | 2320 | '@jridgewell/sourcemap-codec@1.5.0': {} 2321 | 2322 | '@jridgewell/trace-mapping@0.3.25': 2323 | dependencies: 2324 | '@jridgewell/resolve-uri': 3.1.2 2325 | '@jridgewell/sourcemap-codec': 1.5.0 2326 | 2327 | '@nodelib/fs.scandir@2.1.5': 2328 | dependencies: 2329 | '@nodelib/fs.stat': 2.0.5 2330 | run-parallel: 1.2.0 2331 | 2332 | '@nodelib/fs.stat@2.0.5': {} 2333 | 2334 | '@nodelib/fs.walk@1.2.8': 2335 | dependencies: 2336 | '@nodelib/fs.scandir': 2.1.5 2337 | fastq: 1.18.0 2338 | 2339 | '@nolyfill/is-core-module@1.0.39': {} 2340 | 2341 | '@rollup/rollup-android-arm-eabi@4.32.0': 2342 | optional: true 2343 | 2344 | '@rollup/rollup-android-arm64@4.32.0': 2345 | optional: true 2346 | 2347 | '@rollup/rollup-darwin-arm64@4.32.0': 2348 | optional: true 2349 | 2350 | '@rollup/rollup-darwin-x64@4.32.0': 2351 | optional: true 2352 | 2353 | '@rollup/rollup-freebsd-arm64@4.32.0': 2354 | optional: true 2355 | 2356 | '@rollup/rollup-freebsd-x64@4.32.0': 2357 | optional: true 2358 | 2359 | '@rollup/rollup-linux-arm-gnueabihf@4.32.0': 2360 | optional: true 2361 | 2362 | '@rollup/rollup-linux-arm-musleabihf@4.32.0': 2363 | optional: true 2364 | 2365 | '@rollup/rollup-linux-arm64-gnu@4.32.0': 2366 | optional: true 2367 | 2368 | '@rollup/rollup-linux-arm64-musl@4.32.0': 2369 | optional: true 2370 | 2371 | '@rollup/rollup-linux-loongarch64-gnu@4.32.0': 2372 | optional: true 2373 | 2374 | '@rollup/rollup-linux-powerpc64le-gnu@4.32.0': 2375 | optional: true 2376 | 2377 | '@rollup/rollup-linux-riscv64-gnu@4.32.0': 2378 | optional: true 2379 | 2380 | '@rollup/rollup-linux-s390x-gnu@4.32.0': 2381 | optional: true 2382 | 2383 | '@rollup/rollup-linux-x64-gnu@4.32.0': 2384 | optional: true 2385 | 2386 | '@rollup/rollup-linux-x64-musl@4.32.0': 2387 | optional: true 2388 | 2389 | '@rollup/rollup-win32-arm64-msvc@4.32.0': 2390 | optional: true 2391 | 2392 | '@rollup/rollup-win32-ia32-msvc@4.32.0': 2393 | optional: true 2394 | 2395 | '@rollup/rollup-win32-x64-msvc@4.32.0': 2396 | optional: true 2397 | 2398 | '@rtsao/scc@1.1.0': {} 2399 | 2400 | '@testing-library/dom@10.4.0': 2401 | dependencies: 2402 | '@babel/code-frame': 7.26.2 2403 | '@babel/runtime': 7.26.7 2404 | '@types/aria-query': 5.0.4 2405 | aria-query: 5.3.0 2406 | chalk: 4.1.2 2407 | dom-accessibility-api: 0.5.16 2408 | lz-string: 1.5.0 2409 | pretty-format: 27.5.1 2410 | 2411 | '@testing-library/jest-dom@6.6.3': 2412 | dependencies: 2413 | '@adobe/css-tools': 4.4.1 2414 | aria-query: 5.3.2 2415 | chalk: 3.0.0 2416 | css.escape: 1.5.1 2417 | dom-accessibility-api: 0.6.3 2418 | lodash: 4.17.21 2419 | redent: 3.0.0 2420 | 2421 | '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': 2422 | dependencies: 2423 | '@babel/runtime': 7.26.7 2424 | '@testing-library/dom': 10.4.0 2425 | react: 19.0.0 2426 | react-dom: 19.0.0(react@19.0.0) 2427 | optionalDependencies: 2428 | '@types/react': 19.0.8 2429 | '@types/react-dom': 19.0.3(@types/react@19.0.8) 2430 | 2431 | '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': 2432 | dependencies: 2433 | '@testing-library/dom': 10.4.0 2434 | 2435 | '@types/aria-query@5.0.4': {} 2436 | 2437 | '@types/estree@1.0.6': {} 2438 | 2439 | '@types/json-schema@7.0.15': {} 2440 | 2441 | '@types/json5@0.0.29': {} 2442 | 2443 | '@types/node@22.10.10': 2444 | dependencies: 2445 | undici-types: 6.20.0 2446 | 2447 | '@types/react-dom@19.0.3(@types/react@19.0.8)': 2448 | dependencies: 2449 | '@types/react': 19.0.8 2450 | 2451 | '@types/react@19.0.8': 2452 | dependencies: 2453 | csstype: 3.1.3 2454 | 2455 | '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3)': 2456 | dependencies: 2457 | '@eslint-community/regexpp': 4.12.1 2458 | '@typescript-eslint/parser': 8.21.0(eslint@9.19.0)(typescript@5.7.3) 2459 | '@typescript-eslint/scope-manager': 8.21.0 2460 | '@typescript-eslint/type-utils': 8.21.0(eslint@9.19.0)(typescript@5.7.3) 2461 | '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.7.3) 2462 | '@typescript-eslint/visitor-keys': 8.21.0 2463 | eslint: 9.19.0 2464 | graphemer: 1.4.0 2465 | ignore: 5.3.2 2466 | natural-compare: 1.4.0 2467 | ts-api-utils: 2.0.0(typescript@5.7.3) 2468 | typescript: 5.7.3 2469 | transitivePeerDependencies: 2470 | - supports-color 2471 | 2472 | '@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.7.3)': 2473 | dependencies: 2474 | '@typescript-eslint/scope-manager': 8.21.0 2475 | '@typescript-eslint/types': 8.21.0 2476 | '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) 2477 | '@typescript-eslint/visitor-keys': 8.21.0 2478 | debug: 4.4.0 2479 | eslint: 9.19.0 2480 | typescript: 5.7.3 2481 | transitivePeerDependencies: 2482 | - supports-color 2483 | 2484 | '@typescript-eslint/scope-manager@8.21.0': 2485 | dependencies: 2486 | '@typescript-eslint/types': 8.21.0 2487 | '@typescript-eslint/visitor-keys': 8.21.0 2488 | 2489 | '@typescript-eslint/type-utils@8.21.0(eslint@9.19.0)(typescript@5.7.3)': 2490 | dependencies: 2491 | '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) 2492 | '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.7.3) 2493 | debug: 4.4.0 2494 | eslint: 9.19.0 2495 | ts-api-utils: 2.0.0(typescript@5.7.3) 2496 | typescript: 5.7.3 2497 | transitivePeerDependencies: 2498 | - supports-color 2499 | 2500 | '@typescript-eslint/types@8.21.0': {} 2501 | 2502 | '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': 2503 | dependencies: 2504 | '@typescript-eslint/types': 8.21.0 2505 | '@typescript-eslint/visitor-keys': 8.21.0 2506 | debug: 4.4.0 2507 | fast-glob: 3.3.3 2508 | is-glob: 4.0.3 2509 | minimatch: 9.0.5 2510 | semver: 7.6.3 2511 | ts-api-utils: 2.0.0(typescript@5.7.3) 2512 | typescript: 5.7.3 2513 | transitivePeerDependencies: 2514 | - supports-color 2515 | 2516 | '@typescript-eslint/utils@8.21.0(eslint@9.19.0)(typescript@5.7.3)': 2517 | dependencies: 2518 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) 2519 | '@typescript-eslint/scope-manager': 8.21.0 2520 | '@typescript-eslint/types': 8.21.0 2521 | '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) 2522 | eslint: 9.19.0 2523 | typescript: 5.7.3 2524 | transitivePeerDependencies: 2525 | - supports-color 2526 | 2527 | '@typescript-eslint/visitor-keys@8.21.0': 2528 | dependencies: 2529 | '@typescript-eslint/types': 8.21.0 2530 | eslint-visitor-keys: 4.2.0 2531 | 2532 | '@vitest/expect@3.0.4': 2533 | dependencies: 2534 | '@vitest/spy': 3.0.4 2535 | '@vitest/utils': 3.0.4 2536 | chai: 5.1.2 2537 | tinyrainbow: 2.0.0 2538 | 2539 | '@vitest/mocker@3.0.4(vite@6.0.11(@types/node@22.10.10))': 2540 | dependencies: 2541 | '@vitest/spy': 3.0.4 2542 | estree-walker: 3.0.3 2543 | magic-string: 0.30.17 2544 | optionalDependencies: 2545 | vite: 6.0.11(@types/node@22.10.10) 2546 | 2547 | '@vitest/pretty-format@3.0.4': 2548 | dependencies: 2549 | tinyrainbow: 2.0.0 2550 | 2551 | '@vitest/runner@3.0.4': 2552 | dependencies: 2553 | '@vitest/utils': 3.0.4 2554 | pathe: 2.0.2 2555 | 2556 | '@vitest/snapshot@3.0.4': 2557 | dependencies: 2558 | '@vitest/pretty-format': 3.0.4 2559 | magic-string: 0.30.17 2560 | pathe: 2.0.2 2561 | 2562 | '@vitest/spy@3.0.4': 2563 | dependencies: 2564 | tinyspy: 3.0.2 2565 | 2566 | '@vitest/utils@3.0.4': 2567 | dependencies: 2568 | '@vitest/pretty-format': 3.0.4 2569 | loupe: 3.1.2 2570 | tinyrainbow: 2.0.0 2571 | 2572 | acorn-jsx@5.3.2(acorn@8.14.0): 2573 | dependencies: 2574 | acorn: 8.14.0 2575 | 2576 | acorn@8.14.0: {} 2577 | 2578 | ajv@6.12.6: 2579 | dependencies: 2580 | fast-deep-equal: 3.1.3 2581 | fast-json-stable-stringify: 2.1.0 2582 | json-schema-traverse: 0.4.1 2583 | uri-js: 4.4.1 2584 | 2585 | ansi-regex@5.0.1: {} 2586 | 2587 | ansi-styles@4.3.0: 2588 | dependencies: 2589 | color-convert: 2.0.1 2590 | 2591 | ansi-styles@5.2.0: {} 2592 | 2593 | argparse@2.0.1: {} 2594 | 2595 | aria-query@5.3.0: 2596 | dependencies: 2597 | dequal: 2.0.3 2598 | 2599 | aria-query@5.3.2: {} 2600 | 2601 | array-buffer-byte-length@1.0.2: 2602 | dependencies: 2603 | call-bound: 1.0.3 2604 | is-array-buffer: 3.0.5 2605 | 2606 | array-includes@3.1.8: 2607 | dependencies: 2608 | call-bind: 1.0.8 2609 | define-properties: 1.2.1 2610 | es-abstract: 1.23.9 2611 | es-object-atoms: 1.1.1 2612 | get-intrinsic: 1.2.7 2613 | is-string: 1.1.1 2614 | 2615 | array.prototype.findlast@1.2.5: 2616 | dependencies: 2617 | call-bind: 1.0.8 2618 | define-properties: 1.2.1 2619 | es-abstract: 1.23.9 2620 | es-errors: 1.3.0 2621 | es-object-atoms: 1.1.1 2622 | es-shim-unscopables: 1.0.2 2623 | 2624 | array.prototype.findlastindex@1.2.5: 2625 | dependencies: 2626 | call-bind: 1.0.8 2627 | define-properties: 1.2.1 2628 | es-abstract: 1.23.9 2629 | es-errors: 1.3.0 2630 | es-object-atoms: 1.1.1 2631 | es-shim-unscopables: 1.0.2 2632 | 2633 | array.prototype.flat@1.3.3: 2634 | dependencies: 2635 | call-bind: 1.0.8 2636 | define-properties: 1.2.1 2637 | es-abstract: 1.23.9 2638 | es-shim-unscopables: 1.0.2 2639 | 2640 | array.prototype.flatmap@1.3.3: 2641 | dependencies: 2642 | call-bind: 1.0.8 2643 | define-properties: 1.2.1 2644 | es-abstract: 1.23.9 2645 | es-shim-unscopables: 1.0.2 2646 | 2647 | array.prototype.tosorted@1.1.4: 2648 | dependencies: 2649 | call-bind: 1.0.8 2650 | define-properties: 1.2.1 2651 | es-abstract: 1.23.9 2652 | es-errors: 1.3.0 2653 | es-shim-unscopables: 1.0.2 2654 | 2655 | arraybuffer.prototype.slice@1.0.4: 2656 | dependencies: 2657 | array-buffer-byte-length: 1.0.2 2658 | call-bind: 1.0.8 2659 | define-properties: 1.2.1 2660 | es-abstract: 1.23.9 2661 | es-errors: 1.3.0 2662 | get-intrinsic: 1.2.7 2663 | is-array-buffer: 3.0.5 2664 | 2665 | assertion-error@2.0.1: {} 2666 | 2667 | ast-types-flow@0.0.8: {} 2668 | 2669 | async-function@1.0.0: {} 2670 | 2671 | available-typed-arrays@1.0.7: 2672 | dependencies: 2673 | possible-typed-array-names: 1.0.0 2674 | 2675 | axe-core@4.10.2: {} 2676 | 2677 | axobject-query@4.1.0: {} 2678 | 2679 | balanced-match@1.0.2: {} 2680 | 2681 | brace-expansion@1.1.11: 2682 | dependencies: 2683 | balanced-match: 1.0.2 2684 | concat-map: 0.0.1 2685 | 2686 | brace-expansion@2.0.1: 2687 | dependencies: 2688 | balanced-match: 1.0.2 2689 | 2690 | braces@3.0.3: 2691 | dependencies: 2692 | fill-range: 7.1.1 2693 | 2694 | browserslist@4.24.5: 2695 | dependencies: 2696 | caniuse-lite: 1.0.30001718 2697 | electron-to-chromium: 1.5.157 2698 | node-releases: 2.0.19 2699 | update-browserslist-db: 1.1.3(browserslist@4.24.5) 2700 | 2701 | cac@6.7.14: {} 2702 | 2703 | call-bind-apply-helpers@1.0.1: 2704 | dependencies: 2705 | es-errors: 1.3.0 2706 | function-bind: 1.1.2 2707 | 2708 | call-bind@1.0.8: 2709 | dependencies: 2710 | call-bind-apply-helpers: 1.0.1 2711 | es-define-property: 1.0.1 2712 | get-intrinsic: 1.2.7 2713 | set-function-length: 1.2.2 2714 | 2715 | call-bound@1.0.3: 2716 | dependencies: 2717 | call-bind-apply-helpers: 1.0.1 2718 | get-intrinsic: 1.2.7 2719 | 2720 | callsites@3.1.0: {} 2721 | 2722 | caniuse-lite@1.0.30001718: {} 2723 | 2724 | chai@5.1.2: 2725 | dependencies: 2726 | assertion-error: 2.0.1 2727 | check-error: 2.1.1 2728 | deep-eql: 5.0.2 2729 | loupe: 3.1.2 2730 | pathval: 2.0.0 2731 | 2732 | chalk@3.0.0: 2733 | dependencies: 2734 | ansi-styles: 4.3.0 2735 | supports-color: 7.2.0 2736 | 2737 | chalk@4.1.2: 2738 | dependencies: 2739 | ansi-styles: 4.3.0 2740 | supports-color: 7.2.0 2741 | 2742 | check-error@2.1.1: {} 2743 | 2744 | color-convert@2.0.1: 2745 | dependencies: 2746 | color-name: 1.1.4 2747 | 2748 | color-name@1.1.4: {} 2749 | 2750 | concat-map@0.0.1: {} 2751 | 2752 | convert-source-map@2.0.0: {} 2753 | 2754 | cross-spawn@7.0.6: 2755 | dependencies: 2756 | path-key: 3.1.1 2757 | shebang-command: 2.0.0 2758 | which: 2.0.2 2759 | 2760 | css.escape@1.5.1: {} 2761 | 2762 | csstype@3.1.3: {} 2763 | 2764 | damerau-levenshtein@1.0.8: {} 2765 | 2766 | data-view-buffer@1.0.2: 2767 | dependencies: 2768 | call-bound: 1.0.3 2769 | es-errors: 1.3.0 2770 | is-data-view: 1.0.2 2771 | 2772 | data-view-byte-length@1.0.2: 2773 | dependencies: 2774 | call-bound: 1.0.3 2775 | es-errors: 1.3.0 2776 | is-data-view: 1.0.2 2777 | 2778 | data-view-byte-offset@1.0.1: 2779 | dependencies: 2780 | call-bound: 1.0.3 2781 | es-errors: 1.3.0 2782 | is-data-view: 1.0.2 2783 | 2784 | debug@3.2.7: 2785 | dependencies: 2786 | ms: 2.1.3 2787 | 2788 | debug@4.4.0: 2789 | dependencies: 2790 | ms: 2.1.3 2791 | 2792 | deep-eql@5.0.2: {} 2793 | 2794 | deep-is@0.1.4: {} 2795 | 2796 | define-data-property@1.1.4: 2797 | dependencies: 2798 | es-define-property: 1.0.1 2799 | es-errors: 1.3.0 2800 | gopd: 1.2.0 2801 | 2802 | define-properties@1.2.1: 2803 | dependencies: 2804 | define-data-property: 1.1.4 2805 | has-property-descriptors: 1.0.2 2806 | object-keys: 1.1.1 2807 | 2808 | dequal@2.0.3: {} 2809 | 2810 | doctrine@2.1.0: 2811 | dependencies: 2812 | esutils: 2.0.3 2813 | 2814 | dom-accessibility-api@0.5.16: {} 2815 | 2816 | dom-accessibility-api@0.6.3: {} 2817 | 2818 | dunder-proto@1.0.1: 2819 | dependencies: 2820 | call-bind-apply-helpers: 1.0.1 2821 | es-errors: 1.3.0 2822 | gopd: 1.2.0 2823 | 2824 | electron-to-chromium@1.5.157: {} 2825 | 2826 | emoji-regex@9.2.2: {} 2827 | 2828 | enhanced-resolve@5.18.0: 2829 | dependencies: 2830 | graceful-fs: 4.2.11 2831 | tapable: 2.2.1 2832 | 2833 | es-abstract@1.23.9: 2834 | dependencies: 2835 | array-buffer-byte-length: 1.0.2 2836 | arraybuffer.prototype.slice: 1.0.4 2837 | available-typed-arrays: 1.0.7 2838 | call-bind: 1.0.8 2839 | call-bound: 1.0.3 2840 | data-view-buffer: 1.0.2 2841 | data-view-byte-length: 1.0.2 2842 | data-view-byte-offset: 1.0.1 2843 | es-define-property: 1.0.1 2844 | es-errors: 1.3.0 2845 | es-object-atoms: 1.1.1 2846 | es-set-tostringtag: 2.1.0 2847 | es-to-primitive: 1.3.0 2848 | function.prototype.name: 1.1.8 2849 | get-intrinsic: 1.2.7 2850 | get-proto: 1.0.1 2851 | get-symbol-description: 1.1.0 2852 | globalthis: 1.0.4 2853 | gopd: 1.2.0 2854 | has-property-descriptors: 1.0.2 2855 | has-proto: 1.2.0 2856 | has-symbols: 1.1.0 2857 | hasown: 2.0.2 2858 | internal-slot: 1.1.0 2859 | is-array-buffer: 3.0.5 2860 | is-callable: 1.2.7 2861 | is-data-view: 1.0.2 2862 | is-regex: 1.2.1 2863 | is-shared-array-buffer: 1.0.4 2864 | is-string: 1.1.1 2865 | is-typed-array: 1.1.15 2866 | is-weakref: 1.1.0 2867 | math-intrinsics: 1.1.0 2868 | object-inspect: 1.13.3 2869 | object-keys: 1.1.1 2870 | object.assign: 4.1.7 2871 | own-keys: 1.0.1 2872 | regexp.prototype.flags: 1.5.4 2873 | safe-array-concat: 1.1.3 2874 | safe-push-apply: 1.0.0 2875 | safe-regex-test: 1.1.0 2876 | set-proto: 1.0.0 2877 | string.prototype.trim: 1.2.10 2878 | string.prototype.trimend: 1.0.9 2879 | string.prototype.trimstart: 1.0.8 2880 | typed-array-buffer: 1.0.3 2881 | typed-array-byte-length: 1.0.3 2882 | typed-array-byte-offset: 1.0.4 2883 | typed-array-length: 1.0.7 2884 | unbox-primitive: 1.1.0 2885 | which-typed-array: 1.1.18 2886 | 2887 | es-define-property@1.0.1: {} 2888 | 2889 | es-errors@1.3.0: {} 2890 | 2891 | es-iterator-helpers@1.2.1: 2892 | dependencies: 2893 | call-bind: 1.0.8 2894 | call-bound: 1.0.3 2895 | define-properties: 1.2.1 2896 | es-abstract: 1.23.9 2897 | es-errors: 1.3.0 2898 | es-set-tostringtag: 2.1.0 2899 | function-bind: 1.1.2 2900 | get-intrinsic: 1.2.7 2901 | globalthis: 1.0.4 2902 | gopd: 1.2.0 2903 | has-property-descriptors: 1.0.2 2904 | has-proto: 1.2.0 2905 | has-symbols: 1.1.0 2906 | internal-slot: 1.1.0 2907 | iterator.prototype: 1.1.5 2908 | safe-array-concat: 1.1.3 2909 | 2910 | es-module-lexer@1.6.0: {} 2911 | 2912 | es-object-atoms@1.1.1: 2913 | dependencies: 2914 | es-errors: 1.3.0 2915 | 2916 | es-set-tostringtag@2.1.0: 2917 | dependencies: 2918 | es-errors: 1.3.0 2919 | get-intrinsic: 1.2.7 2920 | has-tostringtag: 1.0.2 2921 | hasown: 2.0.2 2922 | 2923 | es-shim-unscopables@1.0.2: 2924 | dependencies: 2925 | hasown: 2.0.2 2926 | 2927 | es-to-primitive@1.3.0: 2928 | dependencies: 2929 | is-callable: 1.2.7 2930 | is-date-object: 1.1.0 2931 | is-symbol: 1.1.1 2932 | 2933 | esbuild@0.24.2: 2934 | optionalDependencies: 2935 | '@esbuild/aix-ppc64': 0.24.2 2936 | '@esbuild/android-arm': 0.24.2 2937 | '@esbuild/android-arm64': 0.24.2 2938 | '@esbuild/android-x64': 0.24.2 2939 | '@esbuild/darwin-arm64': 0.24.2 2940 | '@esbuild/darwin-x64': 0.24.2 2941 | '@esbuild/freebsd-arm64': 0.24.2 2942 | '@esbuild/freebsd-x64': 0.24.2 2943 | '@esbuild/linux-arm': 0.24.2 2944 | '@esbuild/linux-arm64': 0.24.2 2945 | '@esbuild/linux-ia32': 0.24.2 2946 | '@esbuild/linux-loong64': 0.24.2 2947 | '@esbuild/linux-mips64el': 0.24.2 2948 | '@esbuild/linux-ppc64': 0.24.2 2949 | '@esbuild/linux-riscv64': 0.24.2 2950 | '@esbuild/linux-s390x': 0.24.2 2951 | '@esbuild/linux-x64': 0.24.2 2952 | '@esbuild/netbsd-arm64': 0.24.2 2953 | '@esbuild/netbsd-x64': 0.24.2 2954 | '@esbuild/openbsd-arm64': 0.24.2 2955 | '@esbuild/openbsd-x64': 0.24.2 2956 | '@esbuild/sunos-x64': 0.24.2 2957 | '@esbuild/win32-arm64': 0.24.2 2958 | '@esbuild/win32-ia32': 0.24.2 2959 | '@esbuild/win32-x64': 0.24.2 2960 | 2961 | escalade@3.2.0: {} 2962 | 2963 | escape-string-regexp@4.0.0: {} 2964 | 2965 | eslint-import-resolver-node@0.3.9: 2966 | dependencies: 2967 | debug: 3.2.7 2968 | is-core-module: 2.16.1 2969 | resolve: 1.22.10 2970 | transitivePeerDependencies: 2971 | - supports-color 2972 | 2973 | eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.19.0): 2974 | dependencies: 2975 | '@nolyfill/is-core-module': 1.0.39 2976 | debug: 4.4.0 2977 | enhanced-resolve: 5.18.0 2978 | eslint: 9.19.0 2979 | fast-glob: 3.3.3 2980 | get-tsconfig: 4.10.0 2981 | is-bun-module: 1.3.0 2982 | is-glob: 4.0.3 2983 | stable-hash: 0.0.4 2984 | optionalDependencies: 2985 | eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.19.0) 2986 | transitivePeerDependencies: 2987 | - supports-color 2988 | 2989 | eslint-module-utils@2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@9.19.0): 2990 | dependencies: 2991 | debug: 3.2.7 2992 | optionalDependencies: 2993 | '@typescript-eslint/parser': 8.21.0(eslint@9.19.0)(typescript@5.7.3) 2994 | eslint: 9.19.0 2995 | eslint-import-resolver-node: 0.3.9 2996 | eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@9.19.0) 2997 | transitivePeerDependencies: 2998 | - supports-color 2999 | 3000 | eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@9.19.0): 3001 | dependencies: 3002 | '@rtsao/scc': 1.1.0 3003 | array-includes: 3.1.8 3004 | array.prototype.findlastindex: 1.2.5 3005 | array.prototype.flat: 1.3.3 3006 | array.prototype.flatmap: 1.3.3 3007 | debug: 3.2.7 3008 | doctrine: 2.1.0 3009 | eslint: 9.19.0 3010 | eslint-import-resolver-node: 0.3.9 3011 | eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@9.19.0) 3012 | hasown: 2.0.2 3013 | is-core-module: 2.16.1 3014 | is-glob: 4.0.3 3015 | minimatch: 3.1.2 3016 | object.fromentries: 2.0.8 3017 | object.groupby: 1.0.3 3018 | object.values: 1.2.1 3019 | semver: 6.3.1 3020 | string.prototype.trimend: 1.0.9 3021 | tsconfig-paths: 3.15.0 3022 | optionalDependencies: 3023 | '@typescript-eslint/parser': 8.21.0(eslint@9.19.0)(typescript@5.7.3) 3024 | transitivePeerDependencies: 3025 | - eslint-import-resolver-typescript 3026 | - eslint-import-resolver-webpack 3027 | - supports-color 3028 | 3029 | eslint-plugin-jsx-a11y@6.10.2(eslint@9.19.0): 3030 | dependencies: 3031 | aria-query: 5.3.2 3032 | array-includes: 3.1.8 3033 | array.prototype.flatmap: 1.3.3 3034 | ast-types-flow: 0.0.8 3035 | axe-core: 4.10.2 3036 | axobject-query: 4.1.0 3037 | damerau-levenshtein: 1.0.8 3038 | emoji-regex: 9.2.2 3039 | eslint: 9.19.0 3040 | hasown: 2.0.2 3041 | jsx-ast-utils: 3.3.5 3042 | language-tags: 1.0.9 3043 | minimatch: 3.1.2 3044 | object.fromentries: 2.0.8 3045 | safe-regex-test: 1.1.0 3046 | string.prototype.includes: 2.0.1 3047 | 3048 | eslint-plugin-react-hooks@6.0.0-rc.1(eslint@9.19.0): 3049 | dependencies: 3050 | '@babel/core': 7.27.1 3051 | '@babel/parser': 7.27.2 3052 | '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.1) 3053 | eslint: 9.19.0 3054 | hermes-parser: 0.25.1 3055 | zod: 3.25.23 3056 | zod-validation-error: 3.4.1(zod@3.25.23) 3057 | transitivePeerDependencies: 3058 | - supports-color 3059 | 3060 | eslint-plugin-react@7.37.4(eslint@9.19.0): 3061 | dependencies: 3062 | array-includes: 3.1.8 3063 | array.prototype.findlast: 1.2.5 3064 | array.prototype.flatmap: 1.3.3 3065 | array.prototype.tosorted: 1.1.4 3066 | doctrine: 2.1.0 3067 | es-iterator-helpers: 1.2.1 3068 | eslint: 9.19.0 3069 | estraverse: 5.3.0 3070 | hasown: 2.0.2 3071 | jsx-ast-utils: 3.3.5 3072 | minimatch: 3.1.2 3073 | object.entries: 1.1.8 3074 | object.fromentries: 2.0.8 3075 | object.values: 1.2.1 3076 | prop-types: 15.8.1 3077 | resolve: 2.0.0-next.5 3078 | semver: 6.3.1 3079 | string.prototype.matchall: 4.0.12 3080 | string.prototype.repeat: 1.0.0 3081 | 3082 | eslint-scope@8.2.0: 3083 | dependencies: 3084 | esrecurse: 4.3.0 3085 | estraverse: 5.3.0 3086 | 3087 | eslint-visitor-keys@3.4.3: {} 3088 | 3089 | eslint-visitor-keys@4.2.0: {} 3090 | 3091 | eslint@9.19.0: 3092 | dependencies: 3093 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0) 3094 | '@eslint-community/regexpp': 4.12.1 3095 | '@eslint/config-array': 0.19.1 3096 | '@eslint/core': 0.10.0 3097 | '@eslint/eslintrc': 3.2.0 3098 | '@eslint/js': 9.19.0 3099 | '@eslint/plugin-kit': 0.2.5 3100 | '@humanfs/node': 0.16.6 3101 | '@humanwhocodes/module-importer': 1.0.1 3102 | '@humanwhocodes/retry': 0.4.1 3103 | '@types/estree': 1.0.6 3104 | '@types/json-schema': 7.0.15 3105 | ajv: 6.12.6 3106 | chalk: 4.1.2 3107 | cross-spawn: 7.0.6 3108 | debug: 4.4.0 3109 | escape-string-regexp: 4.0.0 3110 | eslint-scope: 8.2.0 3111 | eslint-visitor-keys: 4.2.0 3112 | espree: 10.3.0 3113 | esquery: 1.6.0 3114 | esutils: 2.0.3 3115 | fast-deep-equal: 3.1.3 3116 | file-entry-cache: 8.0.0 3117 | find-up: 5.0.0 3118 | glob-parent: 6.0.2 3119 | ignore: 5.3.2 3120 | imurmurhash: 0.1.4 3121 | is-glob: 4.0.3 3122 | json-stable-stringify-without-jsonify: 1.0.1 3123 | lodash.merge: 4.6.2 3124 | minimatch: 3.1.2 3125 | natural-compare: 1.4.0 3126 | optionator: 0.9.4 3127 | transitivePeerDependencies: 3128 | - supports-color 3129 | 3130 | espree@10.3.0: 3131 | dependencies: 3132 | acorn: 8.14.0 3133 | acorn-jsx: 5.3.2(acorn@8.14.0) 3134 | eslint-visitor-keys: 4.2.0 3135 | 3136 | esquery@1.6.0: 3137 | dependencies: 3138 | estraverse: 5.3.0 3139 | 3140 | esrecurse@4.3.0: 3141 | dependencies: 3142 | estraverse: 5.3.0 3143 | 3144 | estraverse@5.3.0: {} 3145 | 3146 | estree-walker@3.0.3: 3147 | dependencies: 3148 | '@types/estree': 1.0.6 3149 | 3150 | esutils@2.0.3: {} 3151 | 3152 | expect-type@1.1.0: {} 3153 | 3154 | fast-deep-equal@3.1.3: {} 3155 | 3156 | fast-glob@3.3.3: 3157 | dependencies: 3158 | '@nodelib/fs.stat': 2.0.5 3159 | '@nodelib/fs.walk': 1.2.8 3160 | glob-parent: 5.1.2 3161 | merge2: 1.4.1 3162 | micromatch: 4.0.8 3163 | 3164 | fast-json-stable-stringify@2.1.0: {} 3165 | 3166 | fast-levenshtein@2.0.6: {} 3167 | 3168 | fastq@1.18.0: 3169 | dependencies: 3170 | reusify: 1.0.4 3171 | 3172 | file-entry-cache@8.0.0: 3173 | dependencies: 3174 | flat-cache: 4.0.1 3175 | 3176 | fill-range@7.1.1: 3177 | dependencies: 3178 | to-regex-range: 5.0.1 3179 | 3180 | find-up@5.0.0: 3181 | dependencies: 3182 | locate-path: 6.0.0 3183 | path-exists: 4.0.0 3184 | 3185 | flat-cache@4.0.1: 3186 | dependencies: 3187 | flatted: 3.3.2 3188 | keyv: 4.5.4 3189 | 3190 | flatted@3.3.2: {} 3191 | 3192 | for-each@0.3.4: 3193 | dependencies: 3194 | is-callable: 1.2.7 3195 | 3196 | fsevents@2.3.3: 3197 | optional: true 3198 | 3199 | function-bind@1.1.2: {} 3200 | 3201 | function.prototype.name@1.1.8: 3202 | dependencies: 3203 | call-bind: 1.0.8 3204 | call-bound: 1.0.3 3205 | define-properties: 1.2.1 3206 | functions-have-names: 1.2.3 3207 | hasown: 2.0.2 3208 | is-callable: 1.2.7 3209 | 3210 | functions-have-names@1.2.3: {} 3211 | 3212 | gensync@1.0.0-beta.2: {} 3213 | 3214 | get-intrinsic@1.2.7: 3215 | dependencies: 3216 | call-bind-apply-helpers: 1.0.1 3217 | es-define-property: 1.0.1 3218 | es-errors: 1.3.0 3219 | es-object-atoms: 1.1.1 3220 | function-bind: 1.1.2 3221 | get-proto: 1.0.1 3222 | gopd: 1.2.0 3223 | has-symbols: 1.1.0 3224 | hasown: 2.0.2 3225 | math-intrinsics: 1.1.0 3226 | 3227 | get-proto@1.0.1: 3228 | dependencies: 3229 | dunder-proto: 1.0.1 3230 | es-object-atoms: 1.1.1 3231 | 3232 | get-symbol-description@1.1.0: 3233 | dependencies: 3234 | call-bound: 1.0.3 3235 | es-errors: 1.3.0 3236 | get-intrinsic: 1.2.7 3237 | 3238 | get-tsconfig@4.10.0: 3239 | dependencies: 3240 | resolve-pkg-maps: 1.0.0 3241 | 3242 | glob-parent@5.1.2: 3243 | dependencies: 3244 | is-glob: 4.0.3 3245 | 3246 | glob-parent@6.0.2: 3247 | dependencies: 3248 | is-glob: 4.0.3 3249 | 3250 | globals@11.12.0: {} 3251 | 3252 | globals@14.0.0: {} 3253 | 3254 | globalthis@1.0.4: 3255 | dependencies: 3256 | define-properties: 1.2.1 3257 | gopd: 1.2.0 3258 | 3259 | globrex@0.1.2: {} 3260 | 3261 | gopd@1.2.0: {} 3262 | 3263 | graceful-fs@4.2.11: {} 3264 | 3265 | graphemer@1.4.0: {} 3266 | 3267 | happy-dom@16.7.2: 3268 | dependencies: 3269 | webidl-conversions: 7.0.0 3270 | whatwg-mimetype: 3.0.0 3271 | 3272 | has-bigints@1.1.0: {} 3273 | 3274 | has-flag@4.0.0: {} 3275 | 3276 | has-property-descriptors@1.0.2: 3277 | dependencies: 3278 | es-define-property: 1.0.1 3279 | 3280 | has-proto@1.2.0: 3281 | dependencies: 3282 | dunder-proto: 1.0.1 3283 | 3284 | has-symbols@1.1.0: {} 3285 | 3286 | has-tostringtag@1.0.2: 3287 | dependencies: 3288 | has-symbols: 1.1.0 3289 | 3290 | hasown@2.0.2: 3291 | dependencies: 3292 | function-bind: 1.1.2 3293 | 3294 | hermes-estree@0.25.1: {} 3295 | 3296 | hermes-parser@0.25.1: 3297 | dependencies: 3298 | hermes-estree: 0.25.1 3299 | 3300 | ignore@5.3.2: {} 3301 | 3302 | immer@10.1.1: {} 3303 | 3304 | import-fresh@3.3.0: 3305 | dependencies: 3306 | parent-module: 1.0.1 3307 | resolve-from: 4.0.0 3308 | 3309 | imurmurhash@0.1.4: {} 3310 | 3311 | indent-string@4.0.0: {} 3312 | 3313 | internal-slot@1.1.0: 3314 | dependencies: 3315 | es-errors: 1.3.0 3316 | hasown: 2.0.2 3317 | side-channel: 1.1.0 3318 | 3319 | is-array-buffer@3.0.5: 3320 | dependencies: 3321 | call-bind: 1.0.8 3322 | call-bound: 1.0.3 3323 | get-intrinsic: 1.2.7 3324 | 3325 | is-async-function@2.1.1: 3326 | dependencies: 3327 | async-function: 1.0.0 3328 | call-bound: 1.0.3 3329 | get-proto: 1.0.1 3330 | has-tostringtag: 1.0.2 3331 | safe-regex-test: 1.1.0 3332 | 3333 | is-bigint@1.1.0: 3334 | dependencies: 3335 | has-bigints: 1.1.0 3336 | 3337 | is-boolean-object@1.2.1: 3338 | dependencies: 3339 | call-bound: 1.0.3 3340 | has-tostringtag: 1.0.2 3341 | 3342 | is-bun-module@1.3.0: 3343 | dependencies: 3344 | semver: 7.6.3 3345 | 3346 | is-callable@1.2.7: {} 3347 | 3348 | is-core-module@2.16.1: 3349 | dependencies: 3350 | hasown: 2.0.2 3351 | 3352 | is-data-view@1.0.2: 3353 | dependencies: 3354 | call-bound: 1.0.3 3355 | get-intrinsic: 1.2.7 3356 | is-typed-array: 1.1.15 3357 | 3358 | is-date-object@1.1.0: 3359 | dependencies: 3360 | call-bound: 1.0.3 3361 | has-tostringtag: 1.0.2 3362 | 3363 | is-extglob@2.1.1: {} 3364 | 3365 | is-finalizationregistry@1.1.1: 3366 | dependencies: 3367 | call-bound: 1.0.3 3368 | 3369 | is-generator-function@1.1.0: 3370 | dependencies: 3371 | call-bound: 1.0.3 3372 | get-proto: 1.0.1 3373 | has-tostringtag: 1.0.2 3374 | safe-regex-test: 1.1.0 3375 | 3376 | is-glob@4.0.3: 3377 | dependencies: 3378 | is-extglob: 2.1.1 3379 | 3380 | is-map@2.0.3: {} 3381 | 3382 | is-number-object@1.1.1: 3383 | dependencies: 3384 | call-bound: 1.0.3 3385 | has-tostringtag: 1.0.2 3386 | 3387 | is-number@7.0.0: {} 3388 | 3389 | is-regex@1.2.1: 3390 | dependencies: 3391 | call-bound: 1.0.3 3392 | gopd: 1.2.0 3393 | has-tostringtag: 1.0.2 3394 | hasown: 2.0.2 3395 | 3396 | is-set@2.0.3: {} 3397 | 3398 | is-shared-array-buffer@1.0.4: 3399 | dependencies: 3400 | call-bound: 1.0.3 3401 | 3402 | is-string@1.1.1: 3403 | dependencies: 3404 | call-bound: 1.0.3 3405 | has-tostringtag: 1.0.2 3406 | 3407 | is-symbol@1.1.1: 3408 | dependencies: 3409 | call-bound: 1.0.3 3410 | has-symbols: 1.1.0 3411 | safe-regex-test: 1.1.0 3412 | 3413 | is-typed-array@1.1.15: 3414 | dependencies: 3415 | which-typed-array: 1.1.18 3416 | 3417 | is-weakmap@2.0.2: {} 3418 | 3419 | is-weakref@1.1.0: 3420 | dependencies: 3421 | call-bound: 1.0.3 3422 | 3423 | is-weakset@2.0.4: 3424 | dependencies: 3425 | call-bound: 1.0.3 3426 | get-intrinsic: 1.2.7 3427 | 3428 | isarray@2.0.5: {} 3429 | 3430 | isexe@2.0.0: {} 3431 | 3432 | iterator.prototype@1.1.5: 3433 | dependencies: 3434 | define-data-property: 1.1.4 3435 | es-object-atoms: 1.1.1 3436 | get-intrinsic: 1.2.7 3437 | get-proto: 1.0.1 3438 | has-symbols: 1.1.0 3439 | set-function-name: 2.0.2 3440 | 3441 | js-tokens@4.0.0: {} 3442 | 3443 | js-yaml@4.1.0: 3444 | dependencies: 3445 | argparse: 2.0.1 3446 | 3447 | jsesc@3.1.0: {} 3448 | 3449 | json-buffer@3.0.1: {} 3450 | 3451 | json-schema-traverse@0.4.1: {} 3452 | 3453 | json-stable-stringify-without-jsonify@1.0.1: {} 3454 | 3455 | json5@1.0.2: 3456 | dependencies: 3457 | minimist: 1.2.8 3458 | 3459 | json5@2.2.3: {} 3460 | 3461 | jsx-ast-utils@3.3.5: 3462 | dependencies: 3463 | array-includes: 3.1.8 3464 | array.prototype.flat: 1.3.3 3465 | object.assign: 4.1.7 3466 | object.values: 1.2.1 3467 | 3468 | keyv@4.5.4: 3469 | dependencies: 3470 | json-buffer: 3.0.1 3471 | 3472 | language-subtag-registry@0.3.23: {} 3473 | 3474 | language-tags@1.0.9: 3475 | dependencies: 3476 | language-subtag-registry: 0.3.23 3477 | 3478 | levn@0.4.1: 3479 | dependencies: 3480 | prelude-ls: 1.2.1 3481 | type-check: 0.4.0 3482 | 3483 | locate-path@6.0.0: 3484 | dependencies: 3485 | p-locate: 5.0.0 3486 | 3487 | lodash.merge@4.6.2: {} 3488 | 3489 | lodash@4.17.21: {} 3490 | 3491 | loose-envify@1.4.0: 3492 | dependencies: 3493 | js-tokens: 4.0.0 3494 | 3495 | loupe@3.1.2: {} 3496 | 3497 | lru-cache@5.1.1: 3498 | dependencies: 3499 | yallist: 3.1.1 3500 | 3501 | lz-string@1.5.0: {} 3502 | 3503 | magic-string@0.30.17: 3504 | dependencies: 3505 | '@jridgewell/sourcemap-codec': 1.5.0 3506 | 3507 | math-intrinsics@1.1.0: {} 3508 | 3509 | merge2@1.4.1: {} 3510 | 3511 | micromatch@4.0.8: 3512 | dependencies: 3513 | braces: 3.0.3 3514 | picomatch: 2.3.1 3515 | 3516 | min-indent@1.0.1: {} 3517 | 3518 | minimatch@3.1.2: 3519 | dependencies: 3520 | brace-expansion: 1.1.11 3521 | 3522 | minimatch@9.0.5: 3523 | dependencies: 3524 | brace-expansion: 2.0.1 3525 | 3526 | minimist@1.2.8: {} 3527 | 3528 | ms@2.1.3: {} 3529 | 3530 | nanoid@3.3.8: {} 3531 | 3532 | natural-compare@1.4.0: {} 3533 | 3534 | node-releases@2.0.19: {} 3535 | 3536 | object-assign@4.1.1: {} 3537 | 3538 | object-inspect@1.13.3: {} 3539 | 3540 | object-keys@1.1.1: {} 3541 | 3542 | object.assign@4.1.7: 3543 | dependencies: 3544 | call-bind: 1.0.8 3545 | call-bound: 1.0.3 3546 | define-properties: 1.2.1 3547 | es-object-atoms: 1.1.1 3548 | has-symbols: 1.1.0 3549 | object-keys: 1.1.1 3550 | 3551 | object.entries@1.1.8: 3552 | dependencies: 3553 | call-bind: 1.0.8 3554 | define-properties: 1.2.1 3555 | es-object-atoms: 1.1.1 3556 | 3557 | object.fromentries@2.0.8: 3558 | dependencies: 3559 | call-bind: 1.0.8 3560 | define-properties: 1.2.1 3561 | es-abstract: 1.23.9 3562 | es-object-atoms: 1.1.1 3563 | 3564 | object.groupby@1.0.3: 3565 | dependencies: 3566 | call-bind: 1.0.8 3567 | define-properties: 1.2.1 3568 | es-abstract: 1.23.9 3569 | 3570 | object.values@1.2.1: 3571 | dependencies: 3572 | call-bind: 1.0.8 3573 | call-bound: 1.0.3 3574 | define-properties: 1.2.1 3575 | es-object-atoms: 1.1.1 3576 | 3577 | optionator@0.9.4: 3578 | dependencies: 3579 | deep-is: 0.1.4 3580 | fast-levenshtein: 2.0.6 3581 | levn: 0.4.1 3582 | prelude-ls: 1.2.1 3583 | type-check: 0.4.0 3584 | word-wrap: 1.2.5 3585 | 3586 | own-keys@1.0.1: 3587 | dependencies: 3588 | get-intrinsic: 1.2.7 3589 | object-keys: 1.1.1 3590 | safe-push-apply: 1.0.0 3591 | 3592 | p-limit@3.1.0: 3593 | dependencies: 3594 | yocto-queue: 0.1.0 3595 | 3596 | p-locate@5.0.0: 3597 | dependencies: 3598 | p-limit: 3.1.0 3599 | 3600 | parent-module@1.0.1: 3601 | dependencies: 3602 | callsites: 3.1.0 3603 | 3604 | path-exists@4.0.0: {} 3605 | 3606 | path-key@3.1.1: {} 3607 | 3608 | path-parse@1.0.7: {} 3609 | 3610 | pathe@2.0.2: {} 3611 | 3612 | pathval@2.0.0: {} 3613 | 3614 | picocolors@1.1.1: {} 3615 | 3616 | picomatch@2.3.1: {} 3617 | 3618 | possible-typed-array-names@1.0.0: {} 3619 | 3620 | postcss@8.5.1: 3621 | dependencies: 3622 | nanoid: 3.3.8 3623 | picocolors: 1.1.1 3624 | source-map-js: 1.2.1 3625 | 3626 | prelude-ls@1.2.1: {} 3627 | 3628 | prettier@3.4.2: {} 3629 | 3630 | pretty-format@27.5.1: 3631 | dependencies: 3632 | ansi-regex: 5.0.1 3633 | ansi-styles: 5.2.0 3634 | react-is: 17.0.2 3635 | 3636 | prop-types@15.8.1: 3637 | dependencies: 3638 | loose-envify: 1.4.0 3639 | object-assign: 4.1.1 3640 | react-is: 16.13.1 3641 | 3642 | punycode@2.3.1: {} 3643 | 3644 | queue-microtask@1.2.3: {} 3645 | 3646 | react-dom@19.0.0(react@19.0.0): 3647 | dependencies: 3648 | react: 19.0.0 3649 | scheduler: 0.25.0 3650 | 3651 | react-is@16.13.1: {} 3652 | 3653 | react-is@17.0.2: {} 3654 | 3655 | react@19.0.0: {} 3656 | 3657 | redent@3.0.0: 3658 | dependencies: 3659 | indent-string: 4.0.0 3660 | strip-indent: 3.0.0 3661 | 3662 | reflect.getprototypeof@1.0.10: 3663 | dependencies: 3664 | call-bind: 1.0.8 3665 | define-properties: 1.2.1 3666 | es-abstract: 1.23.9 3667 | es-errors: 1.3.0 3668 | es-object-atoms: 1.1.1 3669 | get-intrinsic: 1.2.7 3670 | get-proto: 1.0.1 3671 | which-builtin-type: 1.2.1 3672 | 3673 | regenerator-runtime@0.14.1: {} 3674 | 3675 | regexp.prototype.flags@1.5.4: 3676 | dependencies: 3677 | call-bind: 1.0.8 3678 | define-properties: 1.2.1 3679 | es-errors: 1.3.0 3680 | get-proto: 1.0.1 3681 | gopd: 1.2.0 3682 | set-function-name: 2.0.2 3683 | 3684 | resolve-from@4.0.0: {} 3685 | 3686 | resolve-pkg-maps@1.0.0: {} 3687 | 3688 | resolve@1.22.10: 3689 | dependencies: 3690 | is-core-module: 2.16.1 3691 | path-parse: 1.0.7 3692 | supports-preserve-symlinks-flag: 1.0.0 3693 | 3694 | resolve@2.0.0-next.5: 3695 | dependencies: 3696 | is-core-module: 2.16.1 3697 | path-parse: 1.0.7 3698 | supports-preserve-symlinks-flag: 1.0.0 3699 | 3700 | reusify@1.0.4: {} 3701 | 3702 | rollup@4.32.0: 3703 | dependencies: 3704 | '@types/estree': 1.0.6 3705 | optionalDependencies: 3706 | '@rollup/rollup-android-arm-eabi': 4.32.0 3707 | '@rollup/rollup-android-arm64': 4.32.0 3708 | '@rollup/rollup-darwin-arm64': 4.32.0 3709 | '@rollup/rollup-darwin-x64': 4.32.0 3710 | '@rollup/rollup-freebsd-arm64': 4.32.0 3711 | '@rollup/rollup-freebsd-x64': 4.32.0 3712 | '@rollup/rollup-linux-arm-gnueabihf': 4.32.0 3713 | '@rollup/rollup-linux-arm-musleabihf': 4.32.0 3714 | '@rollup/rollup-linux-arm64-gnu': 4.32.0 3715 | '@rollup/rollup-linux-arm64-musl': 4.32.0 3716 | '@rollup/rollup-linux-loongarch64-gnu': 4.32.0 3717 | '@rollup/rollup-linux-powerpc64le-gnu': 4.32.0 3718 | '@rollup/rollup-linux-riscv64-gnu': 4.32.0 3719 | '@rollup/rollup-linux-s390x-gnu': 4.32.0 3720 | '@rollup/rollup-linux-x64-gnu': 4.32.0 3721 | '@rollup/rollup-linux-x64-musl': 4.32.0 3722 | '@rollup/rollup-win32-arm64-msvc': 4.32.0 3723 | '@rollup/rollup-win32-ia32-msvc': 4.32.0 3724 | '@rollup/rollup-win32-x64-msvc': 4.32.0 3725 | fsevents: 2.3.3 3726 | 3727 | run-parallel@1.2.0: 3728 | dependencies: 3729 | queue-microtask: 1.2.3 3730 | 3731 | safe-array-concat@1.1.3: 3732 | dependencies: 3733 | call-bind: 1.0.8 3734 | call-bound: 1.0.3 3735 | get-intrinsic: 1.2.7 3736 | has-symbols: 1.1.0 3737 | isarray: 2.0.5 3738 | 3739 | safe-push-apply@1.0.0: 3740 | dependencies: 3741 | es-errors: 1.3.0 3742 | isarray: 2.0.5 3743 | 3744 | safe-regex-test@1.1.0: 3745 | dependencies: 3746 | call-bound: 1.0.3 3747 | es-errors: 1.3.0 3748 | is-regex: 1.2.1 3749 | 3750 | scheduler@0.25.0: {} 3751 | 3752 | semver@6.3.1: {} 3753 | 3754 | semver@7.6.3: {} 3755 | 3756 | set-function-length@1.2.2: 3757 | dependencies: 3758 | define-data-property: 1.1.4 3759 | es-errors: 1.3.0 3760 | function-bind: 1.1.2 3761 | get-intrinsic: 1.2.7 3762 | gopd: 1.2.0 3763 | has-property-descriptors: 1.0.2 3764 | 3765 | set-function-name@2.0.2: 3766 | dependencies: 3767 | define-data-property: 1.1.4 3768 | es-errors: 1.3.0 3769 | functions-have-names: 1.2.3 3770 | has-property-descriptors: 1.0.2 3771 | 3772 | set-proto@1.0.0: 3773 | dependencies: 3774 | dunder-proto: 1.0.1 3775 | es-errors: 1.3.0 3776 | es-object-atoms: 1.1.1 3777 | 3778 | shebang-command@2.0.0: 3779 | dependencies: 3780 | shebang-regex: 3.0.0 3781 | 3782 | shebang-regex@3.0.0: {} 3783 | 3784 | side-channel-list@1.0.0: 3785 | dependencies: 3786 | es-errors: 1.3.0 3787 | object-inspect: 1.13.3 3788 | 3789 | side-channel-map@1.0.1: 3790 | dependencies: 3791 | call-bound: 1.0.3 3792 | es-errors: 1.3.0 3793 | get-intrinsic: 1.2.7 3794 | object-inspect: 1.13.3 3795 | 3796 | side-channel-weakmap@1.0.2: 3797 | dependencies: 3798 | call-bound: 1.0.3 3799 | es-errors: 1.3.0 3800 | get-intrinsic: 1.2.7 3801 | object-inspect: 1.13.3 3802 | side-channel-map: 1.0.1 3803 | 3804 | side-channel@1.1.0: 3805 | dependencies: 3806 | es-errors: 1.3.0 3807 | object-inspect: 1.13.3 3808 | side-channel-list: 1.0.0 3809 | side-channel-map: 1.0.1 3810 | side-channel-weakmap: 1.0.2 3811 | 3812 | siginfo@2.0.0: {} 3813 | 3814 | source-map-js@1.2.1: {} 3815 | 3816 | stable-hash@0.0.4: {} 3817 | 3818 | stackback@0.0.2: {} 3819 | 3820 | std-env@3.8.0: {} 3821 | 3822 | string.prototype.includes@2.0.1: 3823 | dependencies: 3824 | call-bind: 1.0.8 3825 | define-properties: 1.2.1 3826 | es-abstract: 1.23.9 3827 | 3828 | string.prototype.matchall@4.0.12: 3829 | dependencies: 3830 | call-bind: 1.0.8 3831 | call-bound: 1.0.3 3832 | define-properties: 1.2.1 3833 | es-abstract: 1.23.9 3834 | es-errors: 1.3.0 3835 | es-object-atoms: 1.1.1 3836 | get-intrinsic: 1.2.7 3837 | gopd: 1.2.0 3838 | has-symbols: 1.1.0 3839 | internal-slot: 1.1.0 3840 | regexp.prototype.flags: 1.5.4 3841 | set-function-name: 2.0.2 3842 | side-channel: 1.1.0 3843 | 3844 | string.prototype.repeat@1.0.0: 3845 | dependencies: 3846 | define-properties: 1.2.1 3847 | es-abstract: 1.23.9 3848 | 3849 | string.prototype.trim@1.2.10: 3850 | dependencies: 3851 | call-bind: 1.0.8 3852 | call-bound: 1.0.3 3853 | define-data-property: 1.1.4 3854 | define-properties: 1.2.1 3855 | es-abstract: 1.23.9 3856 | es-object-atoms: 1.1.1 3857 | has-property-descriptors: 1.0.2 3858 | 3859 | string.prototype.trimend@1.0.9: 3860 | dependencies: 3861 | call-bind: 1.0.8 3862 | call-bound: 1.0.3 3863 | define-properties: 1.2.1 3864 | es-object-atoms: 1.1.1 3865 | 3866 | string.prototype.trimstart@1.0.8: 3867 | dependencies: 3868 | call-bind: 1.0.8 3869 | define-properties: 1.2.1 3870 | es-object-atoms: 1.1.1 3871 | 3872 | strip-bom@3.0.0: {} 3873 | 3874 | strip-indent@3.0.0: 3875 | dependencies: 3876 | min-indent: 1.0.1 3877 | 3878 | strip-json-comments@3.1.1: {} 3879 | 3880 | supports-color@7.2.0: 3881 | dependencies: 3882 | has-flag: 4.0.0 3883 | 3884 | supports-preserve-symlinks-flag@1.0.0: {} 3885 | 3886 | tapable@2.2.1: {} 3887 | 3888 | tinybench@2.9.0: {} 3889 | 3890 | tinyexec@0.3.2: {} 3891 | 3892 | tinypool@1.0.2: {} 3893 | 3894 | tinyrainbow@2.0.0: {} 3895 | 3896 | tinyspy@3.0.2: {} 3897 | 3898 | to-regex-range@5.0.1: 3899 | dependencies: 3900 | is-number: 7.0.0 3901 | 3902 | ts-api-utils@2.0.0(typescript@5.7.3): 3903 | dependencies: 3904 | typescript: 5.7.3 3905 | 3906 | ts-expect@1.3.0: {} 3907 | 3908 | tsconfck@3.1.4(typescript@5.7.3): 3909 | optionalDependencies: 3910 | typescript: 5.7.3 3911 | 3912 | tsconfig-paths@3.15.0: 3913 | dependencies: 3914 | '@types/json5': 0.0.29 3915 | json5: 1.0.2 3916 | minimist: 1.2.8 3917 | strip-bom: 3.0.0 3918 | 3919 | type-check@0.4.0: 3920 | dependencies: 3921 | prelude-ls: 1.2.1 3922 | 3923 | typed-array-buffer@1.0.3: 3924 | dependencies: 3925 | call-bound: 1.0.3 3926 | es-errors: 1.3.0 3927 | is-typed-array: 1.1.15 3928 | 3929 | typed-array-byte-length@1.0.3: 3930 | dependencies: 3931 | call-bind: 1.0.8 3932 | for-each: 0.3.4 3933 | gopd: 1.2.0 3934 | has-proto: 1.2.0 3935 | is-typed-array: 1.1.15 3936 | 3937 | typed-array-byte-offset@1.0.4: 3938 | dependencies: 3939 | available-typed-arrays: 1.0.7 3940 | call-bind: 1.0.8 3941 | for-each: 0.3.4 3942 | gopd: 1.2.0 3943 | has-proto: 1.2.0 3944 | is-typed-array: 1.1.15 3945 | reflect.getprototypeof: 1.0.10 3946 | 3947 | typed-array-length@1.0.7: 3948 | dependencies: 3949 | call-bind: 1.0.8 3950 | for-each: 0.3.4 3951 | gopd: 1.2.0 3952 | is-typed-array: 1.1.15 3953 | possible-typed-array-names: 1.0.0 3954 | reflect.getprototypeof: 1.0.10 3955 | 3956 | typescript-eslint@8.21.0(eslint@9.19.0)(typescript@5.7.3): 3957 | dependencies: 3958 | '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3) 3959 | '@typescript-eslint/parser': 8.21.0(eslint@9.19.0)(typescript@5.7.3) 3960 | '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.7.3) 3961 | eslint: 9.19.0 3962 | typescript: 5.7.3 3963 | transitivePeerDependencies: 3964 | - supports-color 3965 | 3966 | typescript@5.7.3: {} 3967 | 3968 | unbox-primitive@1.1.0: 3969 | dependencies: 3970 | call-bound: 1.0.3 3971 | has-bigints: 1.1.0 3972 | has-symbols: 1.1.0 3973 | which-boxed-primitive: 1.1.1 3974 | 3975 | undici-types@6.20.0: {} 3976 | 3977 | update-browserslist-db@1.1.3(browserslist@4.24.5): 3978 | dependencies: 3979 | browserslist: 4.24.5 3980 | escalade: 3.2.0 3981 | picocolors: 1.1.1 3982 | 3983 | uri-js@4.4.1: 3984 | dependencies: 3985 | punycode: 2.3.1 3986 | 3987 | vite-node@3.0.4(@types/node@22.10.10): 3988 | dependencies: 3989 | cac: 6.7.14 3990 | debug: 4.4.0 3991 | es-module-lexer: 1.6.0 3992 | pathe: 2.0.2 3993 | vite: 6.0.11(@types/node@22.10.10) 3994 | transitivePeerDependencies: 3995 | - '@types/node' 3996 | - jiti 3997 | - less 3998 | - lightningcss 3999 | - sass 4000 | - sass-embedded 4001 | - stylus 4002 | - sugarss 4003 | - supports-color 4004 | - terser 4005 | - tsx 4006 | - yaml 4007 | 4008 | vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.10)): 4009 | dependencies: 4010 | debug: 4.4.0 4011 | globrex: 0.1.2 4012 | tsconfck: 3.1.4(typescript@5.7.3) 4013 | optionalDependencies: 4014 | vite: 6.0.11(@types/node@22.10.10) 4015 | transitivePeerDependencies: 4016 | - supports-color 4017 | - typescript 4018 | 4019 | vite@6.0.11(@types/node@22.10.10): 4020 | dependencies: 4021 | esbuild: 0.24.2 4022 | postcss: 8.5.1 4023 | rollup: 4.32.0 4024 | optionalDependencies: 4025 | '@types/node': 22.10.10 4026 | fsevents: 2.3.3 4027 | 4028 | vitest@3.0.4(@types/node@22.10.10)(happy-dom@16.7.2): 4029 | dependencies: 4030 | '@vitest/expect': 3.0.4 4031 | '@vitest/mocker': 3.0.4(vite@6.0.11(@types/node@22.10.10)) 4032 | '@vitest/pretty-format': 3.0.4 4033 | '@vitest/runner': 3.0.4 4034 | '@vitest/snapshot': 3.0.4 4035 | '@vitest/spy': 3.0.4 4036 | '@vitest/utils': 3.0.4 4037 | chai: 5.1.2 4038 | debug: 4.4.0 4039 | expect-type: 1.1.0 4040 | magic-string: 0.30.17 4041 | pathe: 2.0.2 4042 | std-env: 3.8.0 4043 | tinybench: 2.9.0 4044 | tinyexec: 0.3.2 4045 | tinypool: 1.0.2 4046 | tinyrainbow: 2.0.0 4047 | vite: 6.0.11(@types/node@22.10.10) 4048 | vite-node: 3.0.4(@types/node@22.10.10) 4049 | why-is-node-running: 2.3.0 4050 | optionalDependencies: 4051 | '@types/node': 22.10.10 4052 | happy-dom: 16.7.2 4053 | transitivePeerDependencies: 4054 | - jiti 4055 | - less 4056 | - lightningcss 4057 | - msw 4058 | - sass 4059 | - sass-embedded 4060 | - stylus 4061 | - sugarss 4062 | - supports-color 4063 | - terser 4064 | - tsx 4065 | - yaml 4066 | 4067 | webidl-conversions@7.0.0: {} 4068 | 4069 | whatwg-mimetype@3.0.0: {} 4070 | 4071 | which-boxed-primitive@1.1.1: 4072 | dependencies: 4073 | is-bigint: 1.1.0 4074 | is-boolean-object: 1.2.1 4075 | is-number-object: 1.1.1 4076 | is-string: 1.1.1 4077 | is-symbol: 1.1.1 4078 | 4079 | which-builtin-type@1.2.1: 4080 | dependencies: 4081 | call-bound: 1.0.3 4082 | function.prototype.name: 1.1.8 4083 | has-tostringtag: 1.0.2 4084 | is-async-function: 2.1.1 4085 | is-date-object: 1.1.0 4086 | is-finalizationregistry: 1.1.1 4087 | is-generator-function: 1.1.0 4088 | is-regex: 1.2.1 4089 | is-weakref: 1.1.0 4090 | isarray: 2.0.5 4091 | which-boxed-primitive: 1.1.1 4092 | which-collection: 1.0.2 4093 | which-typed-array: 1.1.18 4094 | 4095 | which-collection@1.0.2: 4096 | dependencies: 4097 | is-map: 2.0.3 4098 | is-set: 2.0.3 4099 | is-weakmap: 2.0.2 4100 | is-weakset: 2.0.4 4101 | 4102 | which-typed-array@1.1.18: 4103 | dependencies: 4104 | available-typed-arrays: 1.0.7 4105 | call-bind: 1.0.8 4106 | call-bound: 1.0.3 4107 | for-each: 0.3.4 4108 | gopd: 1.2.0 4109 | has-tostringtag: 1.0.2 4110 | 4111 | which@2.0.2: 4112 | dependencies: 4113 | isexe: 2.0.0 4114 | 4115 | why-is-node-running@2.3.0: 4116 | dependencies: 4117 | siginfo: 2.0.0 4118 | stackback: 0.0.2 4119 | 4120 | word-wrap@1.2.5: {} 4121 | 4122 | yallist@3.1.1: {} 4123 | 4124 | yocto-queue@0.1.0: {} 4125 | 4126 | zod-validation-error@3.4.1(zod@3.25.23): 4127 | dependencies: 4128 | zod: 3.25.23 4129 | 4130 | zod@3.25.23: {} 4131 | 4132 | zustand@5.0.3(@types/react@19.0.8)(immer@10.1.1)(react@19.0.0): 4133 | optionalDependencies: 4134 | '@types/react': 19.0.8 4135 | immer: 10.1.1 4136 | react: 19.0.0 4137 | --------------------------------------------------------------------------------