├── .github ├── FUNDING.yml └── workflows │ ├── release.yml │ └── test.yml ├── .gitignore ├── .npmignore ├── test ├── demo │ ├── index.css │ ├── dist │ │ ├── assets │ │ │ ├── index-Dz_Xe-Cg.css │ │ │ ├── bfcachetest-DN65M-3B.js │ │ │ └── index-BlEfZBFA.js │ │ ├── index.html │ │ └── bfcachetest.html │ ├── vite.config.js │ ├── index.html │ ├── index.ts │ ├── bfcachetest.html │ └── bfcachetest.ts ├── utils.ts ├── setup.ts ├── errors.ts ├── types.ts ├── atom.test.ts └── map.test.ts ├── .editorconfig ├── tsconfig.json ├── eslint.config.js ├── LICENSE ├── CHANGELOG.md ├── package.json ├── index.js ├── index.d.ts ├── README.md └── pnpm-lock.yaml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: ai 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | test/demo/dist/ 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | **/types.ts 2 | **/errors.ts 3 | **/*.test.* 4 | tsconfig.json 5 | test/ 6 | -------------------------------------------------------------------------------- /test/demo/index.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-family: sans-serif; 3 | line-height: 2; 4 | color-scheme: light dark; 5 | } 6 | 7 | html, 8 | select, 9 | button { 10 | font-size: 16px; 11 | } 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /test/demo/dist/assets/index-Dz_Xe-Cg.css: -------------------------------------------------------------------------------- 1 | html { 2 | font-family: sans-serif; 3 | line-height: 2; 4 | color-scheme: light dark; 5 | } 6 | 7 | html, 8 | select, 9 | button { 10 | font-size: 16px; 11 | } 12 | -------------------------------------------------------------------------------- /test/utils.ts: -------------------------------------------------------------------------------- 1 | export function emitLocalStorage(key: string, newValue: null | string): void { 2 | if (newValue === null) { 3 | delete localStorage[key] 4 | } else { 5 | localStorage[key] = newValue 6 | } 7 | global.window.dispatchEvent( 8 | new global.StorageEvent('storage', { key, newValue }) 9 | ) 10 | } 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowImportingTsExtensions": true, 4 | "target": "es2018", 5 | "module": "esnext", 6 | "moduleResolution": "node", 7 | "esModuleInterop": true, 8 | "skipLibCheck": true, 9 | "allowJs": true, 10 | "strict": true, 11 | "noEmit": true, 12 | "jsx": "react" 13 | }, 14 | "exclude": ["**/errors.ts"] 15 | } 16 | -------------------------------------------------------------------------------- /test/demo/vite.config.js: -------------------------------------------------------------------------------- 1 | // vite.config.js 2 | import { resolve } from 'node:path' 3 | import { defineConfig } from 'vite' 4 | 5 | export default defineConfig({ 6 | build: { 7 | minify: false, 8 | rollupOptions: { 9 | input: { 10 | bfcachetest: resolve(__dirname, 'bfcachetest.html'), 11 | main: resolve(__dirname, 'index.html') 12 | } 13 | } 14 | } 15 | }) 16 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | import loguxTsConfig from '@logux/eslint-config/ts' 2 | import globals from 'globals' 3 | 4 | /** @type {import('eslint').Linter.FlatConfig[]} */ 5 | export default [ 6 | { ignores: ['**/errors.ts', 'test/demo/dist'] }, 7 | ...loguxTsConfig, 8 | { 9 | languageOptions: { 10 | globals: globals.browser 11 | }, 12 | rules: { 13 | '@typescript-eslint/no-explicit-any': 'off', 14 | 'n/no-unsupported-features/node-builtins': 'off' 15 | } 16 | }, 17 | { 18 | files: ['test/demo/*.ts'], 19 | rules: { 20 | 'no-console': 'off' 21 | } 22 | } 23 | ] 24 | -------------------------------------------------------------------------------- /test/demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Nano Stores Persistent Demo 6 | 11 | 12 | 13 | 14 | 15 |

You need to build this project to debug bfcache

16 |

Read atom

17 |

18 |     

Read map

19 |

20 |     Visit another page
21 |     
22 |   
23 | 
24 | 


--------------------------------------------------------------------------------
/test/demo/dist/index.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 |   
 4 |     
 5 |     Nano Stores Persistent Demo
 6 |     
11 |     
12 |     
13 |   
14 | 
15 |   
16 |     

You need to build this project to debug bfcache

17 |

Read atom

18 |

19 |     

Read map

20 |

21 |     Visit another page
22 |   
23 | 
24 | 


--------------------------------------------------------------------------------
/test/demo/index.ts:
--------------------------------------------------------------------------------
 1 | import { persistentAtom, persistentMap } from '../../index.js'
 2 | 
 3 | export let $atom = persistentAtom('test', [], {
 4 |   decode: JSON.parse,
 5 |   encode: JSON.stringify
 6 | })
 7 | 
 8 | export let $map = persistentMap('testMap', {})
 9 | 
10 | let preAtom = document.querySelector('#atom')!
11 | let preMap = document.querySelector('#map')!
12 | 
13 | $atom.subscribe(val => {
14 |   preAtom.textContent = JSON.stringify(val, null, 2)
15 | })
16 | 
17 | $map.subscribe(val => {
18 |   preMap.textContent = JSON.stringify(val, null, 2)
19 | })
20 | 
21 | window.addEventListener('pageshow', event => {
22 |   if (event.persisted) {
23 |     console.log('The page was restored from the bfcache')
24 |   } else {
25 |     console.log('The page was loaded normally')
26 |   }
27 | })
28 | 


--------------------------------------------------------------------------------
/test/setup.ts:
--------------------------------------------------------------------------------
 1 | import { Window } from 'happy-dom'
 2 | 
 3 | let window = new Window()
 4 | global.window = window as any
 5 | global.StorageEvent = window.StorageEvent as any
 6 | 
 7 | global.localStorage = {} as any
 8 | Object.defineProperty(localStorage, 'getItem', {
 9 |   enumerable: false,
10 |   value(key: string) {
11 |     return localStorage[key] || null
12 |   }
13 | })
14 | Object.defineProperty(global.localStorage, 'setItem', {
15 |   enumerable: false,
16 |   value(key: string, value: null | string) {
17 |     localStorage[key] = `${value}`
18 |   }
19 | })
20 | Object.defineProperty(localStorage, 'clear', {
21 |   enumerable: false,
22 |   value() {
23 |     Object.keys(localStorage).map(key => delete localStorage[key])
24 |   }
25 | })
26 | 
27 | Object.defineProperty(global, '_localStorage', {
28 |   value: global.localStorage,
29 |   writable: false
30 | })
31 | 


--------------------------------------------------------------------------------
/test/demo/bfcachetest.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 |   
 4 |     
 5 |     Nano Stores Persistent Bfcache test
 6 |     
11 |     
12 |   
13 | 
14 |   
15 |     

Set Atom:

16 |

17 |     
18 |     
19 |     

Set Map:

20 |

21 |     
22 |     
23 |     Back
24 |     
25 |   
26 | 
27 | 


--------------------------------------------------------------------------------
/test/demo/dist/bfcachetest.html:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 |   
 4 |     
 5 |     Nano Stores Persistent Bfcache test
 6 |     
11 |     
12 |     
13 |     
14 |   
15 | 
16 |   
17 |     

Set Atom:

18 |

19 |     
20 |     
21 |     

Set Map:

22 |

23 |     
24 |     
25 |     Back
26 |   
27 | 
28 | 


--------------------------------------------------------------------------------
/test/demo/dist/assets/bfcachetest-DN65M-3B.js:
--------------------------------------------------------------------------------
 1 | import { $ as $atom, a as $map } from "./index-BlEfZBFA.js";
 2 | let preAtom = document.querySelector("#atom");
 3 | let preMap = document.querySelector("#map");
 4 | let buttonAtom = document.querySelector("#buttonAtom");
 5 | let clearButtonAtom = document.querySelector("#clearAtom");
 6 | let buttonMap = document.querySelector("#buttonMap");
 7 | let clearButtonMap = document.querySelector("#clearMap");
 8 | buttonAtom.addEventListener("click", () => {
 9 |   $atom.set([...$atom.get(), Math.random() * Date.now()]);
10 | });
11 | clearButtonAtom.addEventListener("click", () => {
12 |   $atom.set([]);
13 | });
14 | $atom.subscribe((val) => {
15 |   preAtom.textContent = JSON.stringify(val, null, 2);
16 | });
17 | buttonMap.addEventListener("click", () => {
18 |   $map.set({ ...$map.get(), a: String(Math.random() * Date.now()) });
19 | });
20 | clearButtonMap.addEventListener("click", () => {
21 |   $map.set({});
22 | });
23 | $map.subscribe((val) => {
24 |   preMap.textContent = JSON.stringify(val, null, 2);
25 | });
26 | 


--------------------------------------------------------------------------------
/test/errors.ts:
--------------------------------------------------------------------------------
 1 | import { setPersistentEngine, persistentAtom, persistentMap } from '../index.js'
 2 | 
 3 | // THROWS '{ code: string; }' does not satisfy the constraint 'string'
 4 | let lang = persistentAtom<{ code: string }>('locale', { code: 'ru' })
 5 | 
 6 | let settings = persistentMap<{
 7 |   favorite?: string
 8 |   theme: 'light' | 'dark'
 9 | }>('settings:', {
10 |   theme: 'light'
11 | })
12 | 
13 | settings.subscribe(value => {
14 |   // THROWS 'light' does not exist on type
15 |   console.log(value.light)
16 | })
17 | 
18 | // THROWS "1"' is not assignable to parameter of type '"dark" | "light"'
19 | settings.setKey('theme', '1')
20 | // THROWS '"option"' is not assignable to parameter of type
21 | settings.setKey('option', '1')
22 | // THROWS 'undefined' is not assignable to parameter of type '"dark" | "light"'
23 | settings.setKey('theme', undefined)
24 | 
25 | let count = persistentAtom('count', 0, {
26 |   encode(origin) {
27 |     return `${origin}`
28 |   },
29 |   // THROWS => string' is not assignable to type '(encoded: string) => number
30 |   decode(encoded) {
31 |     return encoded
32 |   }
33 | })
34 | 
35 | count.set(1)
36 | 


--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
 1 | The MIT License (MIT)
 2 | 
 3 | Copyright 2020 Andrey Sitnik 
 4 | 
 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
 6 | this software and associated documentation files (the "Software"), to deal in
 7 | the Software without restriction, including without limitation the rights to
 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 9 | the Software, and to permit persons to whom the Software is furnished to do so,
10 | subject to the following conditions:
11 | 
12 | The above copyright notice and this permission notice shall be included in all
13 | 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, FITNESS
17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 | 


--------------------------------------------------------------------------------
/test/demo/bfcachetest.ts:
--------------------------------------------------------------------------------
 1 | import { $atom, $map } from './index.js'
 2 | 
 3 | let preAtom = document.querySelector('#atom')!
 4 | let preMap = document.querySelector('#map')!
 5 | 
 6 | let buttonAtom = document.querySelector('#buttonAtom')!
 7 | let clearButtonAtom = document.querySelector('#clearAtom')!
 8 | 
 9 | let buttonMap = document.querySelector('#buttonMap')!
10 | let clearButtonMap = document.querySelector('#clearMap')!
11 | 
12 | buttonAtom.addEventListener('click', () => {
13 |   // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
14 |   $atom.set([...$atom.get(), Math.random() * Date.now()])
15 | })
16 | 
17 | clearButtonAtom.addEventListener('click', () => {
18 |   $atom.set([])
19 | })
20 | 
21 | $atom.subscribe(val => {
22 |   preAtom.textContent = JSON.stringify(val, null, 2)
23 | })
24 | 
25 | buttonMap.addEventListener('click', () => {
26 |   $map.set({ ...$map.get(), a: String(Math.random() * Date.now()) })
27 | })
28 | 
29 | clearButtonMap.addEventListener('click', () => {
30 |   $map.set({})
31 | })
32 | 
33 | $map.subscribe(val => {
34 |   preMap.textContent = JSON.stringify(val, null, 2)
35 | })
36 | 


--------------------------------------------------------------------------------
/test/types.ts:
--------------------------------------------------------------------------------
 1 | import {
 2 |   persistentAtom,
 3 |   type PersistentListener,
 4 |   persistentMap,
 5 |   setPersistentEngine
 6 | } from '../index.js'
 7 | 
 8 | const windowPersistentEvents = {
 9 |   addEventListener(key: string, listener: PersistentListener) {
10 |     window.addEventListener('storage', listener as unknown as EventListener)
11 |   },
12 |   removeEventListener(key: string, listener: PersistentListener) {
13 |     window.removeEventListener('storage', listener as unknown as EventListener)
14 |   }
15 | }
16 | 
17 | setPersistentEngine(localStorage, windowPersistentEvents)
18 | 
19 | let settings = persistentMap<{
20 |   favorite?: string
21 |   theme: 'dark' | 'light'
22 | }>('settings:', {
23 |   theme: 'light'
24 | })
25 | 
26 | settings.subscribe(value => {
27 |   console.log(value.theme)
28 | })
29 | 
30 | settings.setKey('theme', 'dark')
31 | settings.setKey('favorite', '1')
32 | settings.setKey('favorite', undefined)
33 | 
34 | let count = persistentAtom('count', 0, {
35 |   decode(encoded) {
36 |     return parseInt(encoded, 10)
37 |   },
38 |   encode(origin) {
39 |     if (origin === 0) {
40 |       return undefined
41 |     } else {
42 |       return `${origin}`
43 |     }
44 |   }
45 | })
46 | 
47 | count.set(1)
48 | 


--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
 1 | name: Release
 2 | on:
 3 |   push:
 4 |     tags:
 5 |       - '*'
 6 | permissions:
 7 |   contents: write
 8 | jobs:
 9 |   release:
10 |     name: Release On Tag
11 |     if: startsWith(github.ref, 'refs/tags/')
12 |     runs-on: ubuntu-latest
13 |     steps:
14 |       - name: Checkout the repository
15 |         uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
16 |       - name: Extract the changelog
17 |         id: changelog
18 |         run: |
19 |           TAG_NAME=${GITHUB_REF/refs\/tags\//}
20 |           READ_SECTION=false
21 |           CHANGELOG=""
22 |           while IFS= read -r line; do
23 |             if [[ "$line" =~ ^#+\ +(.*) ]]; then
24 |               if [[ "${BASH_REMATCH[1]}" == "$TAG_NAME" ]]; then
25 |                 READ_SECTION=true
26 |               elif [[ "$READ_SECTION" == true ]]; then
27 |                 break
28 |               fi
29 |             elif [[ "$READ_SECTION" == true ]]; then
30 |               CHANGELOG+="$line"$'\n'
31 |             fi
32 |           done < "CHANGELOG.md"
33 |           CHANGELOG=$(echo "$CHANGELOG" | awk '/./ {$1=$1;print}')
34 |           echo "changelog_content<> $GITHUB_OUTPUT
35 |           echo "$CHANGELOG" >> $GITHUB_OUTPUT
36 |           echo "EOF" >> $GITHUB_OUTPUT
37 |       - name: Create the release
38 |         if: steps.changelog.outputs.changelog_content != ''
39 |         uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1
40 |         with:
41 |           name: ${{ github.ref_name }}
42 |           body: '${{ steps.changelog.outputs.changelog_content }}'
43 |           draft: false
44 |           prerelease: false
45 | 


--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
 1 | name: Test
 2 | on:
 3 |   push:
 4 |     branches:
 5 |       - main
 6 |       - next
 7 |   pull_request:
 8 | permissions:
 9 |   contents: read
10 | jobs:
11 |   full:
12 |     name: Node.js Latest Full
13 |     runs-on: ubuntu-latest
14 |     steps:
15 |       - name: Checkout the repository
16 |         uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
17 |       - name: Install pnpm
18 |         uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
19 |         with:
20 |           version: 10
21 |       - name: Install Node.js
22 |         uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
23 |         with:
24 |           node-version: 25
25 |           cache: pnpm
26 |       - name: Install dependencies
27 |         run: pnpm install --ignore-scripts
28 |       - name: Run tests
29 |         run: pnpm test
30 |   short:
31 |     runs-on: ubuntu-latest
32 |     strategy:
33 |       matrix:
34 |         node-version:
35 |           - 24
36 |           - 22
37 |           - 20
38 |     name: Node.js ${{ matrix.node-version }} Quick
39 |     steps:
40 |       - name: Checkout the repository
41 |         uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
42 |       - name: Install pnpm
43 |         uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0
44 |         with:
45 |           version: 10
46 |       - name: Install Node.js ${{ matrix.node-version }}
47 |         uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
48 |         with:
49 |           node-version: ${{ matrix.node-version }}
50 |           cache: pnpm
51 |       - name: Install dependencies
52 |         run: pnpm install --ignore-scripts
53 |       - name: Run unit tests
54 |         run: pnpm bnt
55 | 


--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
 1 | # Change Log
 2 | This project adheres to [Semantic Versioning](http://semver.org/).
 3 | 
 4 | ## 1.2.0
 5 | * Added `persistentBoolean()` helper.
 6 | 
 7 | ## 1.1.0
 8 | * Added ability to delete key from storage in `encode`.
 9 | * Fixed reaction on atom’s key removal.
10 | 
11 | ## 1.0.0
12 | * Added Nano Stores 1.0 support.
13 | * Removed Node.js 18 support.
14 | 
15 | ## 0.10.2
16 | * Added Nano Stores 0.11 support.
17 | 
18 | ## 0.10.1
19 | * Fixed multiple update events on single `persistentMap.set` call (by @kaytwo).
20 | 
21 | ## 0.10.0
22 | * Moved to Nano Stores 0.10.
23 | * Removed Node.js 16 support.
24 | 
25 | ## 0.9.1
26 | * Fixed bfcache support (by @GoldStrikeArch).
27 | 
28 | ## 0.9
29 | * Moved to Nano Stores 0.9.
30 | 
31 | ## 0.8
32 | * Moved to Nano Stores 0.8.
33 | * Removed Node.js 14 support.
34 | 
35 | ## 0.7
36 | * Moved to Nano Stores 0.7.
37 | 
38 | ## 0.6.2
39 | * Fixed `Block all cookies` mode support (by @Mitsunee).
40 | 
41 | ## 0.6.1
42 | * Fixed `store.set` changes support (by Vance Tan).
43 | 
44 | ## 0.6
45 | * Moved to Nano Stores 0.6.
46 | * Dropped Node.js 12 support.
47 | * Added `PersistentEncoder` type export.
48 | 
49 | ## 0.5.3
50 | * Fixed `encode`/`decode` types for `persistentMap()`.
51 | 
52 | ## 0.5.2
53 | * Fixed data deletion on opening new tab (by Mohammad Babazadeh).
54 | 
55 | ## 0.5.1
56 | * Fixed going to `undefined` in another tab after loading.
57 | 
58 | ## 0.5
59 | * Rename `createPersistentStore()` to `persistentAtom()`.
60 | * Rename `createPersistentMap()` to `persistentMap()`.
61 | * Moved to Nano Stores 0.5.
62 | 
63 | ## 0.4.1
64 | * Fixed `localStorage.removeItem()` support (by Nikolay Govorov).
65 | * Fixed `localStorage.clear()` support.
66 | 
67 | ## 0.4
68 | * Added support for per-key listeners in custom engine (by Michael Brunner).
69 | 
70 | ## 0.3.3
71 | * Fixed types (by @davidmz).
72 | 
73 | ## 0.3.2
74 | * Fixed custom encoding.
75 | 
76 | ## 0.3.1
77 | * Fixed `encode` and `decode` option types.
78 | 
79 | ## 0.3
80 | * Added `encode` and `decode` options (by Ivan Vasilyev).
81 | 
82 | ## 0.2.1
83 | * Fixed test storage cleaning.
84 | 
85 | ## 0.2
86 | * Added test API.
87 | 
88 | ## 0.1.2
89 | * Fixed non-string types error for `createPersistentStore`.
90 | 
91 | ## 0.1.1
92 | * Fixed server-side rendering support.
93 | 
94 | ## 0.1
95 | * Initial release.
96 | 


--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "@nanostores/persistent",
 3 |   "version": "1.2.0",
 4 |   "description": "A store for Nano Stores state manager to keep data in localStorage",
 5 |   "keywords": [
 6 |     "nano",
 7 |     "persistent",
 8 |     "react",
 9 |     "preact",
10 |     "vue",
11 |     "svelte",
12 |     "store",
13 |     "localStorage",
14 |     "cross-tab"
15 |   ],
16 |   "scripts": {
17 |     "test:lint": "eslint .",
18 |     "test:coverage": "pnpm bnt --coverage 100 --coverage-exclude 'test/*'",
19 |     "test:types": "check-dts",
20 |     "test:size": "size-limit",
21 |     "test": "pnpm run /^test:/",
22 |     "start": "vite ./test/demo"
23 |   },
24 |   "author": "Andrey Sitnik ",
25 |   "license": "MIT",
26 |   "repository": "nanostores/persistent",
27 |   "sideEffects": false,
28 |   "type": "module",
29 |   "types": "./index.d.ts",
30 |   "exports": {
31 |     ".": "./index.js",
32 |     "./package.json": "./package.json"
33 |   },
34 |   "engines": {
35 |     "node": "^20.0.0 || >=22.0.0"
36 |   },
37 |   "funding": [
38 |     {
39 |       "type": "github",
40 |       "url": "https://github.com/sponsors/ai"
41 |     }
42 |   ],
43 |   "peerDependencies": {
44 |     "nanostores": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0"
45 |   },
46 |   "devDependencies": {
47 |     "@logux/eslint-config": "^56.1.0",
48 |     "@size-limit/preset-small-lib": "^11.2.0",
49 |     "@types/node": "^24.8.1",
50 |     "actions-up": "^1.4.2",
51 |     "better-node-test": "^0.8.3",
52 |     "check-dts": "^0.9.0",
53 |     "clean-publish": "^5.2.2",
54 |     "eslint": "^9.38.0",
55 |     "globals": "^16.4.0",
56 |     "happy-dom": "^20.0.5",
57 |     "multiocular": "^0.8.1",
58 |     "nanodelay": "^2.0.2",
59 |     "nanostores": "^1.0.1",
60 |     "size-limit": "^11.2.0",
61 |     "typescript": "^5.9.3",
62 |     "vite": "^7.1.10"
63 |   },
64 |   "prettier": {
65 |     "arrowParens": "avoid",
66 |     "jsxSingleQuote": false,
67 |     "quoteProps": "consistent",
68 |     "semi": false,
69 |     "singleQuote": true,
70 |     "trailingComma": "none"
71 |   },
72 |   "size-limit": [
73 |     {
74 |       "name": "Atom",
75 |       "import": {
76 |         "./index.js": "{ persistentAtom }"
77 |       },
78 |       "limit": "280 B"
79 |     },
80 |     {
81 |       "name": "Map",
82 |       "import": {
83 |         "./index.js": "{ persistentMap }"
84 |       },
85 |       "limit": "411 B"
86 |     }
87 |   ],
88 |   "clean-publish": {
89 |     "cleanDocs": true
90 |   }
91 | }
92 | 


--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
  1 | import { atom, map, onMount } from 'nanostores'
  2 | 
  3 | let identity = a => a
  4 | let storageEngine = {}
  5 | let eventsEngine = { addEventListener() {}, removeEventListener() {} }
  6 | 
  7 | function testSupport() {
  8 |   try {
  9 |     return typeof localStorage !== 'undefined'
 10 |     /* node:coverage ignore next 4 */
 11 |   } catch {
 12 |     // In Privacy Mode access to localStorage will return error
 13 |     return false
 14 |   }
 15 | }
 16 | if (testSupport()) {
 17 |   storageEngine = localStorage
 18 | }
 19 | 
 20 | export let windowPersistentEvents = {
 21 |   addEventListener(key, listener, restore) {
 22 |     window.addEventListener('storage', listener)
 23 |     window.addEventListener('pageshow', restore)
 24 |   },
 25 |   removeEventListener(key, listener, restore) {
 26 |     window.removeEventListener('storage', listener)
 27 |     window.removeEventListener('pageshow', restore)
 28 |   }
 29 | }
 30 | 
 31 | if (typeof window !== 'undefined') {
 32 |   eventsEngine = windowPersistentEvents
 33 | }
 34 | 
 35 | export function setPersistentEngine(storage, events) {
 36 |   storageEngine = storage
 37 |   eventsEngine = events
 38 | }
 39 | 
 40 | export function persistentAtom(name, initial = undefined, opts = {}) {
 41 |   let encode = opts.encode || identity
 42 |   let decode = opts.decode || identity
 43 | 
 44 |   let store = atom(initial)
 45 | 
 46 |   let set = store.set
 47 |   store.set = newValue => {
 48 |     let converted = encode(newValue)
 49 |     if (typeof converted === 'undefined') {
 50 |       delete storageEngine[name]
 51 |     } else {
 52 |       storageEngine[name] = converted
 53 |     }
 54 |     set(newValue)
 55 |   }
 56 | 
 57 |   function listener(e) {
 58 |     if (e.key === name) {
 59 |       if (e.newValue === null) {
 60 |         set(initial)
 61 |       } else {
 62 |         set(decode(e.newValue))
 63 |       }
 64 |     } else if (!storageEngine[name]) {
 65 |       set(initial)
 66 |     }
 67 |   }
 68 | 
 69 |   function restore() {
 70 |     store.set(storageEngine[name] ? decode(storageEngine[name]) : initial)
 71 |   }
 72 | 
 73 |   onMount(store, () => {
 74 |     restore()
 75 |     if (opts.listen !== false) {
 76 |       eventsEngine.addEventListener(name, listener, restore)
 77 |       return () => {
 78 |         eventsEngine.removeEventListener(name, listener, restore)
 79 |       }
 80 |     }
 81 |   })
 82 | 
 83 |   return store
 84 | }
 85 | 
 86 | export function persistentBoolean(key, initial = false, opts = {}) {
 87 |   return persistentAtom(key, initial, {
 88 |     ...opts,
 89 |     decode(str) {
 90 |       return str === 'yes'
 91 |     },
 92 |     encode(value) {
 93 |       return value ? 'yes' : undefined
 94 |     }
 95 |   })
 96 | }
 97 | 
 98 | export function persistentMap(prefix, initial = {}, opts = {}) {
 99 |   let encode = opts.encode || identity
100 |   let decode = opts.decode || identity
101 | 
102 |   let store = map()
103 | 
104 |   let setKey = store.setKey
105 |   let storeKey = (key, newValue) => {
106 |     if (typeof newValue === 'undefined') {
107 |       if (opts.listen !== false && eventsEngine.perKey) {
108 |         eventsEngine.removeEventListener(prefix + key, listener, restore)
109 |       }
110 |       delete storageEngine[prefix + key]
111 |     } else {
112 |       if (
113 |         opts.listen !== false &&
114 |         eventsEngine.perKey &&
115 |         !(key in store.value)
116 |       ) {
117 |         eventsEngine.addEventListener(prefix + key, listener, restore)
118 |       }
119 |       storageEngine[prefix + key] = encode(newValue)
120 |     }
121 |   }
122 | 
123 |   store.setKey = (key, newValue) => {
124 |     storeKey(key, newValue)
125 |     setKey(key, newValue)
126 |   }
127 | 
128 |   let set = store.set
129 |   store.set = function (newObject) {
130 |     for (let key in newObject) {
131 |       storeKey(key, newObject[key])
132 |     }
133 |     for (let key in store.value) {
134 |       if (!(key in newObject)) {
135 |         storeKey(key, undefined)
136 |       }
137 |     }
138 |     set(newObject)
139 |   }
140 | 
141 |   function listener(e) {
142 |     if (!e.key) {
143 |       set({})
144 |     } else if (e.key.startsWith(prefix)) {
145 |       if (e.newValue === null) {
146 |         setKey(e.key.slice(prefix.length), undefined)
147 |       } else {
148 |         setKey(e.key.slice(prefix.length), decode(e.newValue))
149 |       }
150 |     }
151 |   }
152 | 
153 |   function restore() {
154 |     let data = { ...initial }
155 |     for (let key in storageEngine) {
156 |       if (key.startsWith(prefix)) {
157 |         data[key.slice(prefix.length)] = decode(storageEngine[key])
158 |       }
159 |     }
160 |     for (let key in data) {
161 |       store.setKey(key, data[key])
162 |     }
163 |   }
164 | 
165 |   onMount(store, () => {
166 |     restore()
167 |     if (opts.listen !== false) {
168 |       eventsEngine.addEventListener(prefix, listener, restore)
169 |       return () => {
170 |         eventsEngine.removeEventListener(prefix, listener, restore)
171 |         for (let key in store.value) {
172 |           eventsEngine.removeEventListener(prefix + key, listener, restore)
173 |         }
174 |       }
175 |     }
176 |   })
177 | 
178 |   return store
179 | }
180 | 
181 | let testStorage = {}
182 | let testListeners = []
183 | 
184 | export function useTestStorageEngine() {
185 |   setPersistentEngine(testStorage, {
186 |     addEventListener(key, cb) {
187 |       testListeners.push(cb)
188 |     },
189 |     removeEventListener(key, cb) {
190 |       testListeners = testListeners.filter(i => i !== cb)
191 |     }
192 |   })
193 | }
194 | 
195 | export function setTestStorageKey(key, newValue) {
196 |   if (typeof newValue === 'undefined') {
197 |     delete testStorage[key]
198 |   } else {
199 |     testStorage[key] = newValue
200 |   }
201 |   let event = { key, newValue }
202 |   for (let listener of testListeners) {
203 |     listener(event)
204 |   }
205 | }
206 | 
207 | export function getTestStorage() {
208 |   return testStorage
209 | }
210 | 
211 | export function cleanTestStorage() {
212 |   for (let i in testStorage) {
213 |     setTestStorageKey(i, undefined)
214 |   }
215 | }
216 | 


--------------------------------------------------------------------------------
/test/atom.test.ts:
--------------------------------------------------------------------------------
  1 | import './setup.ts'
  2 | 
  3 | import { delay } from 'nanodelay'
  4 | import { cleanStores } from 'nanostores'
  5 | import type { WritableAtom } from 'nanostores'
  6 | import { deepStrictEqual, equal } from 'node:assert'
  7 | import { afterEach, test } from 'node:test'
  8 | 
  9 | import {
 10 |   persistentAtom,
 11 |   type PersistentListener,
 12 |   setPersistentEngine,
 13 |   windowPersistentEvents
 14 | } from '../index.js'
 15 | import { emitLocalStorage } from './utils.ts'
 16 | import { persistentBoolean } from '../index.js'
 17 | 
 18 | let atom: WritableAtom
 19 | 
 20 | afterEach(() => {
 21 |   localStorage.clear()
 22 |   cleanStores(atom)
 23 |   setPersistentEngine(localStorage, windowPersistentEvents)
 24 | })
 25 | 
 26 | test('loads data from localStorage', () => {
 27 |   localStorage.a = '1'
 28 |   atom = persistentAtom('a', '2')
 29 |   equal(atom.get(), '1')
 30 | })
 31 | 
 32 | test('saves to localStorage', () => {
 33 |   atom = persistentAtom('b')
 34 | 
 35 |   let events: (string | undefined)[] = []
 36 |   atom.listen(value => {
 37 |     events.push(value)
 38 |   })
 39 |   equal(atom.get(), undefined)
 40 | 
 41 |   atom.set('1')
 42 |   deepStrictEqual(localStorage, { b: '1' })
 43 |   deepStrictEqual(events, ['1'])
 44 | 
 45 |   atom.set(undefined)
 46 |   deepStrictEqual(localStorage, {})
 47 |   deepStrictEqual(events, ['1', undefined])
 48 | })
 49 | 
 50 | test('listens for other tabs', () => {
 51 |   atom = persistentAtom('c')
 52 | 
 53 |   let events: (string | undefined)[] = []
 54 |   atom.listen(value => {
 55 |     events.push(value)
 56 |   })
 57 | 
 58 |   emitLocalStorage('c', '1')
 59 | 
 60 |   deepStrictEqual(events, ['1'])
 61 |   equal(atom.get(), '1')
 62 | 
 63 |   emitLocalStorage('c', null)
 64 |   equal(atom.get(), undefined)
 65 | })
 66 | 
 67 | test('listens for key cleaning', () => {
 68 |   atom = persistentAtom('c')
 69 | 
 70 |   let events: (string | undefined)[] = []
 71 |   atom.listen(value => {
 72 |     events.push(value)
 73 |   })
 74 |   atom.set('init')
 75 | 
 76 |   localStorage.clear()
 77 |   window.dispatchEvent(new StorageEvent('storage', {}))
 78 | 
 79 |   deepStrictEqual(events, ['init', undefined])
 80 |   equal(atom.get(), undefined)
 81 | })
 82 | 
 83 | test('ignores other tabs on request', () => {
 84 |   atom = persistentAtom('c2', undefined, { listen: false })
 85 | 
 86 |   let events: (string | undefined)[] = []
 87 |   atom.listen(value => {
 88 |     events.push(value)
 89 |   })
 90 | 
 91 |   emitLocalStorage('c2', '1')
 92 | 
 93 |   deepStrictEqual(events, [])
 94 |   equal(atom.get(), undefined)
 95 | })
 96 | 
 97 | test('saves to localStorage in disabled state', () => {
 98 |   atom = persistentAtom('d')
 99 | 
100 |   atom.set('1')
101 |   equal(localStorage.d, '1')
102 | 
103 |   atom.set(undefined)
104 |   equal(localStorage.d, undefined)
105 | })
106 | 
107 | test('allows to change encoding', () => {
108 |   let locale = persistentAtom('locale', ['en', 'US'], {
109 |     decode: JSON.parse,
110 |     encode: JSON.stringify
111 |   })
112 | 
113 |   locale.listen(() => {})
114 |   locale.set(['ru', 'RU'])
115 | 
116 |   deepStrictEqual(localStorage.getItem('locale'), '["ru","RU"]')
117 | 
118 |   emitLocalStorage('locale', '["fr","CA"]')
119 | 
120 |   deepStrictEqual(locale.get(), ['fr', 'CA'])
121 |   deepStrictEqual(localStorage.getItem('locale'), '["fr","CA"]')
122 | })
123 | 
124 | test('changes engine', () => {
125 |   let storage: Record = {}
126 |   let listeners: PersistentListener[] = []
127 |   let events = {
128 |     addEventListener(key: string, callback: PersistentListener) {
129 |       listeners.push(callback)
130 |     },
131 |     removeEventListener(key: string, callback: PersistentListener) {
132 |       listeners = listeners.filter(i => i !== callback)
133 |     }
134 |   }
135 |   setPersistentEngine(storage, events)
136 | 
137 |   atom = persistentAtom('z')
138 |   atom.listen(() => {})
139 |   atom.set('1')
140 | 
141 |   equal(listeners.length, 1)
142 |   deepStrictEqual(storage, { z: '1' })
143 | 
144 |   storage.z = '1a'
145 |   for (let i of listeners) i({ key: 'z', newValue: '1a' })
146 | 
147 |   equal(atom.get(), '1a')
148 | 
149 |   atom.set(undefined)
150 |   deepStrictEqual(storage, {})
151 | })
152 | 
153 | test('supports per key engine', async () => {
154 |   let storage: Record = {}
155 |   let listeners: Record = {}
156 |   setPersistentEngine(storage, {
157 |     addEventListener(key, listener) {
158 |       listeners[key] = listener
159 |     },
160 |     perKey: true,
161 |     removeEventListener(key) {
162 |       delete listeners[key]
163 |     }
164 |   })
165 | 
166 |   atom = persistentAtom('lang')
167 |   let unbind = atom.listen(() => {})
168 |   deepStrictEqual(Object.keys(listeners), ['lang'])
169 | 
170 |   atom.set('fr')
171 |   deepStrictEqual(Object.keys(listeners), ['lang'])
172 | 
173 |   storage.lang = 'es'
174 |   listeners.lang({ key: 'lang', newValue: 'es' })
175 |   equal(atom.get(), 'es')
176 | 
177 |   unbind()
178 |   await delay(1010)
179 |   deepStrictEqual(Object.keys(listeners), [])
180 | })
181 | 
182 | test('goes back to initial on key removal', () => {
183 |   atom = persistentAtom('key', 'initial')
184 |   atom.set('1')
185 | 
186 |   let events: (string | undefined)[] = []
187 |   atom.listen(value => {
188 |     events.push(value)
189 |   })
190 | 
191 |   emitLocalStorage('key', null)
192 |   deepStrictEqual(events, ['initial'])
193 |   equal(atom.get(), 'initial')
194 | })
195 | 
196 | test('stores boolean', () => {
197 |   let store1 = persistentBoolean('false')
198 |   equal(store1.get(), false)
199 | 
200 |   store1.set(true)
201 |   equal(store1.get(), true)
202 |   equal(localStorage.false, 'yes')
203 | 
204 |   store1.set(false)
205 |   equal(store1.get(), false)
206 |   equal(typeof localStorage.false, 'undefined')
207 | 
208 |   emitLocalStorage('false', 'yes')
209 |   equal(store1.get(), true)
210 | 
211 |   emitLocalStorage('false', null)
212 |   equal(store1.get(), false)
213 | 
214 |   let store2 = persistentBoolean('true', true)
215 |   equal(store2.get(), true)
216 | 
217 |   store2.set(false)
218 |   equal(store2.get(), false)
219 | 
220 |   store2.set(true)
221 |   equal(store2.get(), true)
222 | })
223 | 


--------------------------------------------------------------------------------
/index.d.ts:
--------------------------------------------------------------------------------
  1 | import type { MapStore, WritableAtom } from 'nanostores'
  2 | 
  3 | export type PersistentStore = Record
  4 | 
  5 | export interface PersistentEvent {
  6 |   key: string
  7 |   newValue: string
  8 | }
  9 | 
 10 | export interface PersistentListener {
 11 |   (e: PersistentEvent): void
 12 | }
 13 | 
 14 | export interface PersistentEvents {
 15 |   addEventListener(
 16 |     key: string,
 17 |     callback: PersistentListener,
 18 |     restore: () => void
 19 |   ): void
 20 |   perKey?: boolean
 21 |   removeEventListener(
 22 |     key: string,
 23 |     callback: PersistentListener,
 24 |     restore: () => void
 25 |   ): void
 26 | }
 27 | 
 28 | /**
 29 |  * Replace localStorage to keep persistent data.
 30 |  *
 31 |  * @param storage An object with localStorage API.
 32 |  * @param events An object with `addEventListener` and `removeEventListener`.
 33 |  */
 34 | export function setPersistentEngine(
 35 |   storage: PersistentStore,
 36 |   events: PersistentEvents
 37 | ): void
 38 | 
 39 | /**
 40 |  * `window` events to be used in `setPersistentEngine`.
 41 |  */
 42 | export const windowPersistentEvents: PersistentEvents
 43 | 
 44 | export interface PersistentEncoder {
 45 |   /**
 46 |    * Decoder to convert value from string.
 47 |    */
 48 |   decode: (encoded: string) => Origin
 49 |   /**
 50 |    * Encoder to convert value to string.
 51 |    */
 52 |   encode: (value: Origin) => string | undefined
 53 | }
 54 | 
 55 | interface PersistentSimpleOptions {
 56 |   /**
 57 |    * Does not synchronize changes from other browser tabs
 58 |    */
 59 |   listen?: boolean
 60 | }
 61 | 
 62 | export type PersistentOptions =
 63 |   | (PersistentEncoder & PersistentSimpleOptions)
 64 |   | PersistentSimpleOptions
 65 | 
 66 | interface PersistentMapFactory {
 67 |   /**
 68 |    * Keep key-value data in localStorage.
 69 |    *
 70 |    * ```ts
 71 |    * import { persistentMap } from '@nanostores/persistent'
 72 |    *
 73 |    * export const settings = persistentMap<{
 74 |    *   theme: 'dark' | 'light'
 75 |    *   favorite: string
 76 |    * }>('settings:', { theme: 'light' })
 77 |    * ```
 78 |    *
 79 |    * @param prefix Key prefix in localStorage.
 80 |    * @param initial Initial value on missed data in localStorage.
 81 |    * @param opts Store options.
 82 |    * @return The store.
 83 |    */
 84 |   >(
 85 |     name: string,
 86 |     initial?: Value,
 87 |     opts?: PersistentSimpleOptions
 88 |   ): MapStore
 89 |   (
 90 |     name: string,
 91 |     initial: Value,
 92 |     opts: PersistentEncoder & PersistentSimpleOptions
 93 |   ): MapStore
 94 | }
 95 | 
 96 | export const persistentMap: PersistentMapFactory
 97 | 
 98 | interface PersistentAtomFactory {
 99 |   /**
100 |    * Store a value in localStorage.
101 |    *
102 |    * For key-value objects use {@link persistentMap}.
103 |    *
104 |    * ```ts
105 |    * import { persistentAtom } from '@nanostores/persistent'
106 |    *
107 |    * export const locale = persistentAtom('locale', 'en')
108 |    * ```
109 |    *
110 |    * @param name Key name in localStorage.
111 |    * @param initial Initial value on missed data in localStorage.
112 |    * @param opts Store options.
113 |    * @return The store.
114 |    */
115 |   (
116 |     name: string,
117 |     initial?: Value,
118 |     opts?: PersistentSimpleOptions
119 |   ): WritableAtom
120 |   (
121 |     name: string,
122 |     initial: Value,
123 |     opts: PersistentEncoder & PersistentSimpleOptions
124 |   ): WritableAtom
125 | }
126 | 
127 | export const persistentAtom: PersistentAtomFactory
128 | 
129 | /**
130 |  * Store a boolean in localStorage.
131 |  *
132 |  * ```ts
133 |  * import { persistentBoolean } from '@nanostores/persistent'
134 |  *
135 |  * export const reduceMotion = persistentBoolean('reduce-motion')
136 |  * ```
137 |  *
138 |  * @param name Key name in localStorage.
139 |  * @param initial Value on missed data in localStorage. `false` by default.
140 |  * @param opts Store options.
141 |  * @return The store.
142 |  */
143 | export function persistentBoolean(
144 |   key: string,
145 |   initial?: boolean,
146 |   opts?: PersistentSimpleOptions
147 | ): WritableAtom
148 | 
149 | /**
150 |  * Enable fake storage to test persistent stores.
151 |  *
152 |  * ```js
153 |  * import { useTestStorageEngine } from '@nanostores/persistent'
154 |  *
155 |  * beforeAll(() => {
156 |  *   useTestStorageEngine()
157 |  * })
158 |  * ```
159 |  */
160 | export function useTestStorageEngine(): void
161 | 
162 | /**
163 |  * Set fake storage key to test persistent store.
164 |  *
165 |  * ```js
166 |  * import {
167 |  *   useTestStorageEngine,
168 |  *   setTestStorageKey,
169 |  *   cleanTestStorage
170 |  * } from '@nanostores/persistent'
171 |  *
172 |  * beforeAll(() => {
173 |  *   useTestStorageEngine()
174 |  * })
175 |  *
176 |  * beforeEach(() => {
177 |  *   cleanTestStorage()
178 |  * })
179 |  *
180 |  * it('listens for changes', () => {
181 |  *   setTestStorageKey('settings:locale', 'ru')
182 |  *   expect(settings.get()).toEqual({ locale: 'ru' })
183 |  * })
184 |  * ```
185 |  *
186 |  * @param key Full name of key in localStorage.
187 |  * @param newValue New value of the key.
188 |  */
189 | export function setTestStorageKey(
190 |   key: string,
191 |   newValue: string | undefined
192 | ): void
193 | 
194 | /**
195 |  * Get full content of fake storage to test persistent stores.
196 |  *
197 |  * ```js
198 |  * import {
199 |  *   useTestStorageEngine,
200 |  *   cleanTestStorage,
201 |  *   getTestStorage,
202 |  * } from '@nanostores/persistent'
203 |  *
204 |  * beforeAll(() => {
205 |  *   useTestStorageEngine()
206 |  * })
207 |  *
208 |  * beforeEach(() => {
209 |  *   cleanTestStorage()
210 |  * })
211 |  *
212 |  * it('changes storage', () => {
213 |  *   settings.setKey('locale')
214 |  *   expect(getTestStorage()).toEqual({ 'settings:locale': 'ru' })
215 |  * })
216 |  * ```
217 |  */
218 | export function getTestStorage(): Record
219 | 
220 | /**
221 |  * Clean test storage used to test persistent stores.
222 |  *
223 |  * ```js
224 |  * import { cleanTestStorage } from '@nanostores/persistent'
225 |  *
226 |  * afterEach(() => {
227 |  *   cleanTestStorage()
228 |  * })
229 |  * ```
230 |  */
231 | export function cleanTestStorage(): void
232 | 


--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
  1 | # Nano Stores Persistent
  2 | 
  3 | 
  5 | 
  6 | A smart store for [Nano Stores] state manager to keep data in `localStorage`
  7 | and synchronize changes between browser tabs.
  8 | 
  9 | * **Small.** from 280 bytes (minified and brotlied).
 10 |   Zero dependencies. It uses [Size Limit] to control size.
 11 | * It has good **TypeScript**.
 12 | * Framework agnostic. It supports SSR.
 13 |   `localStorage` can be switched to another storage.
 14 | 
 15 | ```ts
 16 | import { persistentAtom } from '@nanostores/persistent'
 17 | 
 18 | export const $locale = persistentAtom('locale', 'en')
 19 | ```
 20 | 
 21 | [Nano Stores]: https://github.com/nanostores/nanostores
 22 | [Size Limit]: https://github.com/ai/size-limit
 23 | 
 24 | ---
 25 | 
 26 |   Made at Evil Martians, product consulting for developer tools.
 27 | 
 28 | ---
 29 | 
 30 | 
 31 | ## Install
 32 | 
 33 | ```sh
 34 | npm install nanostores @nanostores/persistent
 35 | ```
 36 | 
 37 | 
 38 | ## Usage
 39 | 
 40 | See [Nano Stores docs](https://github.com/nanostores/nanostores#guide)
 41 | about using the store and subscribing to store’s changes in UI frameworks.
 42 | 
 43 | 
 44 | ### Primitive Store
 45 | 
 46 | The store with primitive value keeps the whole data in the single `localStorage`
 47 | key.
 48 | 
 49 | ```ts
 50 | import { persistentAtom } from '@nanostores/persistent'
 51 | 
 52 | export const $shoppingCart = persistentAtom('cart', [], {
 53 |   encode: JSON.stringify,
 54 |   decode: JSON.parse,
 55 | })
 56 | ```
 57 | 
 58 | This store will keep its value in `cart` key of`localStorage`.
 59 | An empty array `[]` will be initial value on missed key in `localStorage`.
 60 | 
 61 | You can change store value by `set` method.
 62 | 
 63 | ```ts
 64 | $shoppingCart.set([...$shoppingCart.get(), newProduct])
 65 | ```
 66 | 
 67 | You can store the object in a primitive store too. But Persistent Map store
 68 | is better, because map store will update value if you add a new key to
 69 | the initial value.
 70 | 
 71 | There is simple wrapper to store boolean:
 72 | 
 73 | ```ts
 74 | import { persistentBoolean } from '@nanostores/persistent'
 75 | 
 76 | export const $reduceMotion = persistentBoolean('reduce-motion')
 77 | ```
 78 | 
 79 | 
 80 | ### Map Store
 81 | 
 82 | There is a special key-value map store. It will keep each key
 83 | in separated `localStorage` key.
 84 | 
 85 | ```ts
 86 | import { persistentMap } from '@nanostores/persistent'
 87 | 
 88 | export type SettingsValue = {
 89 |   sidebar: 'show' | 'hide',
 90 |   theme: 'dark' | 'light' | 'auto'
 91 | }
 92 | 
 93 | export const $settings = persistentMap('settings:', {
 94 |   sidebar: 'show',
 95 |   theme: 'auto'
 96 | })
 97 | ```
 98 | 
 99 | This store will keep value in `settings:sidebar` and `settings:theme` keys.
100 | 
101 | You can change the key by `setKey` method:
102 | 
103 | ```ts
104 | $settings.setKey('sidebar', 'hide')
105 | ```
106 | 
107 | 
108 | ### Sync between Browser Tabs
109 | 
110 | By default, the store changes will be synchronized between browser tabs.
111 | 
112 | There is a `listen` option to disable synchronization.
113 | 
114 | ```ts
115 | import { persistentAtom } from '@nanostores/persistent'
116 | 
117 | export const $draft = persistentAtom('draft', '', { listen: false })
118 | ```
119 | 
120 | 
121 | ### Value Encoding
122 | 
123 | `encode` and `decode` options can be set to process a value before setting
124 | or after getting it from the persistent storage.
125 | 
126 | ```ts
127 | import { persistentAtom } from '@nanostores/persistent'
128 | 
129 | export const $draft = persistentAtom('draft', [], {
130 |   encode (value) {
131 |     return JSON.stringify(value)
132 |   },
133 |   decode (value ) {
134 |     try {
135 |       return JSON.parse(value)
136 |     } catch() {
137 |       return value
138 |     }
139 |   }
140 | })
141 | ```
142 | 
143 | ### Server-Side Rendering
144 | 
145 | The store has built-in SSR support. On the server, they will use
146 | empty objects instead of `localStorage`.
147 | 
148 | You can manually initialize stores with specific data:
149 | 
150 | ```js
151 | if (isServer) {
152 |   $locale.set(user.locale)
153 | }
154 | ```
155 | 
156 | 
157 | ### Persistent Engines
158 | 
159 | You can switch `localStorage` to any other storage for all used stores.
160 | 
161 | ```ts
162 | import { setPersistentEngine } from '@nanostores/persistent'
163 | 
164 | let listeners = []
165 | function onChange (key, newValue) {
166 |   const event = { key, newValue }
167 |   for (const i of listeners) i(event)
168 | }
169 | 
170 | // Must implement storage[key] = value, storage[key], and delete storage[key]
171 | const storage = new Proxy({}, {
172 |   set(target, name, value) {
173 |     target[name] = value
174 |     onChange(name, value)
175 |   },
176 |   get(target, name) {
177 |     return target[name]
178 |   },
179 |   deleteProperty(target, name) {
180 |     delete target[name]
181 |     onChange(name, undefined)
182 |   }
183 | })
184 | 
185 | // Must implement addEventListener and removeEventListener
186 | const events = {
187 |   addEventListener (key, callback) {
188 |     listeners.push(callback)
189 |   },
190 |   removeEventListener (key, callback) {
191 |     listeners = listeners.filter(i => i !== callback)
192 |   },
193 |   // window dispatches "storage" events for any key change
194 |   // => One listener for all map keys is enough
195 |   perKey: false
196 | }
197 | 
198 | setPersistentEngine(storage, events)
199 | ```
200 | 
201 | You do not need to do anything for server-side rendering. We have build-in
202 | support.
203 | 
204 | You need to specify bodies of `events.addEventListener`
205 | and `events.removeEventListener` only for environments with browser tabs
206 | or another reasons for storage synchronization.
207 | 
208 | `perKey` makes `PersistentMap` add one listener for each of its keys
209 | in addition to the one for all keys. This is relevant when events for key
210 | changes are only dispatched for keys that were specifically subscribed too.
211 | 
212 | For TypeScript, we have `PersistentListener` and `PersistentEvent` types
213 | for events object.
214 | 
215 | ```ts
216 | import { PersistentListener, PersistentEvent } from '@nanostores/persistent'
217 | 
218 | const events = {
219 |   addEventListener (key: string, callback: PersistentListener) {
220 |     …
221 |   },
222 |   removeEventListener (key: string, callback: PersistentListener) {
223 |     …
224 |   }
225 | }
226 | 
227 | function onChange () {
228 |   const event: PersistentEvent = {
229 |     key: 'locale' // Changed storage key
230 |     newValue: 'ru'
231 |   }
232 |   …
233 | }
234 | ```
235 | 
236 | 
237 | ### Tests
238 | 
239 | There is a special API to replace `localStorage` to a fake storage engine
240 | with helpers to change key and get all values.
241 | 
242 | ```js
243 | import {
244 |   useTestStorageEngine,
245 |   setTestStorageKey,
246 |   cleanTestStorage,
247 |   getTestStorage,
248 | } from '@nanostores/persistent'
249 | 
250 | import { $settings } from './storage.js'
251 | 
252 | beforeAll(() => {
253 |   useTestStorageEngine()
254 | })
255 | 
256 | afterEach(() => {
257 |   cleanTestStorage()
258 | })
259 | 
260 | it('listens for changes', () => {
261 |   setTestStorageKey('settings:locale', 'ru')
262 |   expect($settings.get()).toEqual({ locale: 'ru' })
263 | })
264 | 
265 | it('changes storage', () => {
266 |   $settings.setKey('locale')
267 |   expect(getTestStorage()).toEqual({ 'settings:locale': 'ru' })
268 | })
269 | ```
270 | 


--------------------------------------------------------------------------------
/test/map.test.ts:
--------------------------------------------------------------------------------
  1 | import './setup.ts'
  2 | 
  3 | import { delay } from 'nanodelay'
  4 | import { cleanStores, type MapStore, map as nanoMap } from 'nanostores'
  5 | import { deepStrictEqual, equal } from 'node:assert'
  6 | import { afterEach, test } from 'node:test'
  7 | 
  8 | import {
  9 |   cleanTestStorage,
 10 |   getTestStorage,
 11 |   type PersistentListener,
 12 |   persistentMap,
 13 |   setPersistentEngine,
 14 |   setTestStorageKey,
 15 |   useTestStorageEngine,
 16 |   windowPersistentEvents
 17 | } from '../index.js'
 18 | import { emitLocalStorage } from './utils.ts'
 19 | 
 20 | function clone(data: object): object {
 21 |   return JSON.parse(JSON.stringify(data))
 22 | }
 23 | 
 24 | let map: MapStore<{ one?: string; two?: string }>
 25 | 
 26 | afterEach(() => {
 27 |   localStorage.clear()
 28 |   cleanStores(map)
 29 |   setPersistentEngine(localStorage, windowPersistentEvents)
 30 | })
 31 | 
 32 | test('loads data from localStorage', () => {
 33 |   localStorage.setItem('a:one', '1')
 34 |   map = persistentMap<{ one?: string; two?: string }>('a:', {
 35 |     two: '2'
 36 |   })
 37 |   deepStrictEqual(map.get(), { one: '1', two: '2' })
 38 | })
 39 | 
 40 | test('saves to localStorage', () => {
 41 |   map = persistentMap('b:', {})
 42 | 
 43 |   let events: object[] = []
 44 |   map.listen(value => {
 45 |     events.push(clone(value))
 46 |   })
 47 | 
 48 |   map.setKey('one', '1')
 49 |   map.setKey('two', '2')
 50 |   deepStrictEqual(localStorage, { 'b:one': '1', 'b:two': '2' })
 51 |   deepStrictEqual(events, [{ one: '1' }, { one: '1', two: '2' }])
 52 | 
 53 |   map.set({ one: '11' })
 54 |   deepStrictEqual(localStorage, { 'b:one': '11' })
 55 |   deepStrictEqual(events, [{ one: '1' }, { one: '1', two: '2' }, { one: '11' }])
 56 | 
 57 |   map.setKey('one', undefined)
 58 |   deepStrictEqual(localStorage, {})
 59 |   deepStrictEqual(events, [
 60 |     { one: '1' },
 61 |     { one: '1', two: '2' },
 62 |     { one: '11' },
 63 |     {}
 64 |   ])
 65 | })
 66 | 
 67 | test('listens for other tabs', () => {
 68 |   map = persistentMap('c:', {})
 69 | 
 70 |   let events: object[] = []
 71 |   map.listen(value => {
 72 |     events.push(clone(value))
 73 |   })
 74 | 
 75 |   emitLocalStorage('c:one', '1')
 76 | 
 77 |   deepStrictEqual(events, [{ one: '1' }])
 78 |   deepStrictEqual(map.get(), { one: '1' })
 79 | 
 80 |   emitLocalStorage('c:one', null)
 81 |   deepStrictEqual(map.get(), {})
 82 | })
 83 | 
 84 | test('listens for local storage cleaning', () => {
 85 |   map = persistentMap('c:', {})
 86 | 
 87 |   let events: object[] = []
 88 |   map.listen(value => {
 89 |     events.push(clone(value))
 90 |   })
 91 |   map.setKey('one', '1')
 92 |   map.setKey('two', '2')
 93 | 
 94 |   localStorage.clear()
 95 |   window.dispatchEvent(new StorageEvent('storage', {}))
 96 | 
 97 |   deepStrictEqual(events, [{ one: '1' }, { one: '1', two: '2' }, {}])
 98 |   deepStrictEqual(map.get(), {})
 99 | })
100 | 
101 | test('ignores other tabs on request', () => {
102 |   map = persistentMap('c2:', {}, { listen: false })
103 | 
104 |   let events: object[] = []
105 |   map.listen(value => {
106 |     events.push(clone(value))
107 |   })
108 | 
109 |   emitLocalStorage('c2:one', '1')
110 | 
111 |   deepStrictEqual(events, [])
112 |   deepStrictEqual(map.get(), {})
113 | })
114 | 
115 | test('saves to localStorage in disabled state', () => {
116 |   map = persistentMap('d:', {})
117 | 
118 |   map.setKey('one', '1')
119 |   equal(localStorage['d:one'], '1')
120 | 
121 |   map.setKey('one', undefined)
122 |   equal(localStorage['d:one'], undefined)
123 | })
124 | 
125 | test('allows to change encoding', () => {
126 |   let settings = persistentMap<{ locale: string[] }>(
127 |     'settings:',
128 |     { locale: ['en', 'US'] },
129 |     {
130 |       decode(str) {
131 |         return str.split(',')
132 |       },
133 |       encode(list) {
134 |         return list.join(',')
135 |       }
136 |     }
137 |   )
138 | 
139 |   settings.listen(() => {})
140 |   settings.setKey('locale', ['ru', 'RU'])
141 | 
142 |   equal(localStorage.getItem('settings:locale'), 'ru,RU')
143 | 
144 |   emitLocalStorage('settings:locale', 'fr,CA')
145 | 
146 |   deepStrictEqual(settings.get().locale, ['fr', 'CA'])
147 |   equal(localStorage.getItem('settings:locale'), 'fr,CA')
148 | })
149 | 
150 | test('has test API', async () => {
151 |   let settings = persistentMap<{ lang: string }>('settings:', {
152 |     lang: 'en'
153 |   })
154 |   useTestStorageEngine()
155 | 
156 |   let events: string[] = []
157 |   let unbind = settings.listen(value => {
158 |     events.push(value.lang)
159 |   })
160 | 
161 |   settings.setKey('lang', 'ru')
162 |   deepStrictEqual(getTestStorage(), { 'settings:lang': 'ru' })
163 | 
164 |   setTestStorageKey('settings:lang', undefined)
165 |   deepStrictEqual(Object.keys(getTestStorage()), [])
166 | 
167 |   setTestStorageKey('settings:lang', 'uk')
168 |   deepStrictEqual(getTestStorage(), { 'settings:lang': 'uk' })
169 |   deepStrictEqual(settings.get(), { lang: 'uk' })
170 | 
171 |   cleanTestStorage()
172 |   deepStrictEqual(Object.keys(getTestStorage()), [])
173 |   deepStrictEqual(settings.get(), {})
174 | 
175 |   unbind()
176 |   await delay(1001)
177 |   deepStrictEqual(Object.keys(getTestStorage()), [])
178 | })
179 | 
180 | test('changes engine', () => {
181 |   let storage: Record = {}
182 |   let listeners: PersistentListener[] = []
183 |   let events = {
184 |     addEventListener(key: string, callback: PersistentListener) {
185 |       listeners.push(callback)
186 |     },
187 |     removeEventListener(key: string, callback: PersistentListener) {
188 |       listeners = listeners.filter(i => i !== callback)
189 |     }
190 |   }
191 |   setPersistentEngine(storage, events)
192 | 
193 |   map = persistentMap('z:')
194 |   map.listen(() => {})
195 |   map.setKey('one', '2')
196 | 
197 |   equal(listeners.length, 1)
198 |   deepStrictEqual(storage, { 'z:one': '2' })
199 | 
200 |   storage['z:one'] = '2b'
201 |   for (let i of listeners) i({ key: 'z:one', newValue: '2b' })
202 | 
203 |   deepStrictEqual(map.get(), { one: '2b' })
204 | 
205 |   map.set({})
206 |   deepStrictEqual(storage, {})
207 | })
208 | 
209 | test('supports per key engine', async () => {
210 |   let storage: Record = {}
211 |   let listeners: Record = {}
212 |   setPersistentEngine(storage, {
213 |     addEventListener(key, listener) {
214 |       listeners[key] = listener
215 |     },
216 |     perKey: true,
217 |     removeEventListener(key) {
218 |       delete listeners[key]
219 |     }
220 |   })
221 | 
222 |   map = persistentMap<{ one?: string; two?: string }>('a:', {
223 |     one: '1'
224 |   })
225 |   let unbind = map.listen(() => {})
226 |   deepStrictEqual(Object.keys(listeners), ['a:one', 'a:'])
227 | 
228 |   map.setKey('one', undefined)
229 |   map.setKey('two', '2')
230 |   deepStrictEqual(Object.keys(listeners), ['a:', 'a:two'])
231 | 
232 |   map.set({ one: '1a' })
233 |   deepStrictEqual(Object.keys(listeners), ['a:', 'a:one'])
234 | 
235 |   storage['a:one'] = '1b'
236 |   listeners['a:one']({ key: 'a:one', newValue: '1b' })
237 |   deepStrictEqual(map.get(), { one: '1b' })
238 | 
239 |   storage['a:new'] = '1b'
240 |   deepStrictEqual(map.get(), { one: '1b' })
241 | 
242 |   unbind()
243 |   await delay(1010)
244 |   deepStrictEqual(Object.keys(listeners), [])
245 | })
246 | 
247 | test('emits one event per update', () => {
248 |   map = persistentMap<{ one?: string; two?: string }>('1:', {
249 |     one: '1',
250 |     two: '2'
251 |   })
252 | 
253 |   let events: object[] = []
254 |   map.listen(value => {
255 |     events.push(clone(value))
256 |   })
257 |   map.set({ one: '2', two: '3' })
258 | 
259 |   equal(events.length, 1)
260 |   deepStrictEqual(map.get(), { one: '2', two: '3' })
261 | })
262 | 
263 | test('emits equally many events per update compared to non-persistent map', () => {
264 |   map = persistentMap<{ one?: string; two?: string }>('1:', {
265 |     one: '1',
266 |     two: '2'
267 |   })
268 |   let nano = nanoMap({ one: '1', two: '2' })
269 | 
270 |   let events: object[] = []
271 |   let nanoEvents: object[] = []
272 |   map.listen(value => {
273 |     events.push(clone(value))
274 |   })
275 |   nano.listen(value => {
276 |     nanoEvents.push(clone(value))
277 |   })
278 |   map.set({ one: '2', two: '3' })
279 |   nano.set({ one: '2', two: '3' })
280 | 
281 |   deepStrictEqual(map.get(), nano.get())
282 |   equal(events.length, nanoEvents.length)
283 | })
284 | 


--------------------------------------------------------------------------------
/test/demo/dist/assets/index-BlEfZBFA.js:
--------------------------------------------------------------------------------
  1 | (function polyfill() {
  2 |   const relList = document.createElement("link").relList;
  3 |   if (relList && relList.supports && relList.supports("modulepreload")) {
  4 |     return;
  5 |   }
  6 |   for (const link of document.querySelectorAll('link[rel="modulepreload"]')) {
  7 |     processPreload(link);
  8 |   }
  9 |   new MutationObserver((mutations) => {
 10 |     for (const mutation of mutations) {
 11 |       if (mutation.type !== "childList") {
 12 |         continue;
 13 |       }
 14 |       for (const node of mutation.addedNodes) {
 15 |         if (node.tagName === "LINK" && node.rel === "modulepreload")
 16 |           processPreload(node);
 17 |       }
 18 |     }
 19 |   }).observe(document, { childList: true, subtree: true });
 20 |   function getFetchOpts(link) {
 21 |     const fetchOpts = {};
 22 |     if (link.integrity)
 23 |       fetchOpts.integrity = link.integrity;
 24 |     if (link.referrerPolicy)
 25 |       fetchOpts.referrerPolicy = link.referrerPolicy;
 26 |     if (link.crossOrigin === "use-credentials")
 27 |       fetchOpts.credentials = "include";
 28 |     else if (link.crossOrigin === "anonymous")
 29 |       fetchOpts.credentials = "omit";
 30 |     else
 31 |       fetchOpts.credentials = "same-origin";
 32 |     return fetchOpts;
 33 |   }
 34 |   function processPreload(link) {
 35 |     if (link.ep)
 36 |       return;
 37 |     link.ep = true;
 38 |     const fetchOpts = getFetchOpts(link);
 39 |     fetch(link.href, fetchOpts);
 40 |   }
 41 | })();
 42 | let listenerQueue = [];
 43 | let atom = (initialValue, level) => {
 44 |   let listeners = [];
 45 |   let $atom2 = {
 46 |     get() {
 47 |       if (!$atom2.lc) {
 48 |         $atom2.listen(() => {
 49 |         })();
 50 |       }
 51 |       return $atom2.value;
 52 |     },
 53 |     l: level || 0,
 54 |     lc: 0,
 55 |     listen(listener, listenerLevel) {
 56 |       $atom2.lc = listeners.push(listener, listenerLevel || $atom2.l) / 2;
 57 |       return () => {
 58 |         let index = listeners.indexOf(listener);
 59 |         if (~index) {
 60 |           listeners.splice(index, 2);
 61 |           if (!--$atom2.lc)
 62 |             $atom2.off();
 63 |         }
 64 |       };
 65 |     },
 66 |     notify(oldValue, changedKey) {
 67 |       let runListenerQueue = !listenerQueue.length;
 68 |       for (let i = 0; i < listeners.length; i += 2) {
 69 |         listenerQueue.push(
 70 |           listeners[i],
 71 |           listeners[i + 1],
 72 |           $atom2.value,
 73 |           oldValue,
 74 |           changedKey
 75 |         );
 76 |       }
 77 |       if (runListenerQueue) {
 78 |         for (let i = 0; i < listenerQueue.length; i += 5) {
 79 |           let skip;
 80 |           for (let j = i + 1; !skip && (j += 5) < listenerQueue.length; ) {
 81 |             if (listenerQueue[j] < listenerQueue[i + 1]) {
 82 |               skip = listenerQueue.push(
 83 |                 listenerQueue[i],
 84 |                 listenerQueue[i + 1],
 85 |                 listenerQueue[i + 2],
 86 |                 listenerQueue[i + 3],
 87 |                 listenerQueue[i + 4]
 88 |               );
 89 |             }
 90 |           }
 91 |           if (!skip) {
 92 |             listenerQueue[i](
 93 |               listenerQueue[i + 2],
 94 |               listenerQueue[i + 3],
 95 |               listenerQueue[i + 4]
 96 |             );
 97 |           }
 98 |         }
 99 |         listenerQueue.length = 0;
100 |       }
101 |     },
102 |     /* It will be called on last listener unsubscribing.
103 |        We will redefine it in onMount and onStop. */
104 |     off() {
105 |     },
106 |     set(newValue) {
107 |       let oldValue = $atom2.value;
108 |       if (oldValue !== newValue) {
109 |         $atom2.value = newValue;
110 |         $atom2.notify(oldValue);
111 |       }
112 |     },
113 |     subscribe(listener, listenerLevel) {
114 |       let unbind = $atom2.listen(listener, listenerLevel);
115 |       listener($atom2.value);
116 |       return unbind;
117 |     },
118 |     value: initialValue
119 |   };
120 |   return $atom2;
121 | };
122 | const MOUNT = 5;
123 | const UNMOUNT = 6;
124 | const REVERT_MUTATION = 10;
125 | let on = (object, listener, eventKey, mutateStore) => {
126 |   object.events = object.events || {};
127 |   if (!object.events[eventKey + REVERT_MUTATION]) {
128 |     object.events[eventKey + REVERT_MUTATION] = mutateStore((eventProps) => {
129 |       object.events[eventKey].reduceRight((event, l) => (l(event), event), {
130 |         shared: {},
131 |         ...eventProps
132 |       });
133 |     });
134 |   }
135 |   object.events[eventKey] = object.events[eventKey] || [];
136 |   object.events[eventKey].push(listener);
137 |   return () => {
138 |     let currentListeners = object.events[eventKey];
139 |     let index = currentListeners.indexOf(listener);
140 |     currentListeners.splice(index, 1);
141 |     if (!currentListeners.length) {
142 |       delete object.events[eventKey];
143 |       object.events[eventKey + REVERT_MUTATION]();
144 |       delete object.events[eventKey + REVERT_MUTATION];
145 |     }
146 |   };
147 | };
148 | let STORE_UNMOUNT_DELAY = 1e3;
149 | let onMount = ($store, initialize) => {
150 |   let listener = (payload) => {
151 |     let destroy = initialize(payload);
152 |     if (destroy)
153 |       $store.events[UNMOUNT].push(destroy);
154 |   };
155 |   return on($store, listener, MOUNT, (runListeners) => {
156 |     let originListen = $store.listen;
157 |     $store.listen = (...args) => {
158 |       if (!$store.lc && !$store.active) {
159 |         $store.active = true;
160 |         runListeners();
161 |       }
162 |       return originListen(...args);
163 |     };
164 |     let originOff = $store.off;
165 |     $store.events[UNMOUNT] = [];
166 |     $store.off = () => {
167 |       originOff();
168 |       setTimeout(() => {
169 |         if ($store.active && !$store.lc) {
170 |           $store.active = false;
171 |           for (let destroy of $store.events[UNMOUNT])
172 |             destroy();
173 |           $store.events[UNMOUNT] = [];
174 |         }
175 |       }, STORE_UNMOUNT_DELAY);
176 |     };
177 |     return () => {
178 |       $store.listen = originListen;
179 |       $store.off = originOff;
180 |     };
181 |   });
182 | };
183 | let map = (initial = {}) => {
184 |   let $map2 = atom(initial);
185 |   $map2.setKey = function(key, value) {
186 |     let oldMap = $map2.value;
187 |     if (typeof value === "undefined" && key in $map2.value) {
188 |       $map2.value = { ...$map2.value };
189 |       delete $map2.value[key];
190 |       $map2.notify(oldMap, key);
191 |     } else if ($map2.value[key] !== value) {
192 |       $map2.value = {
193 |         ...$map2.value,
194 |         [key]: value
195 |       };
196 |       $map2.notify(oldMap, key);
197 |     }
198 |   };
199 |   return $map2;
200 | };
201 | let identity = (a) => a;
202 | let storageEngine = {};
203 | let eventsEngine = { addEventListener() {
204 | }, removeEventListener() {
205 | } };
206 | function testSupport() {
207 |   try {
208 |     return typeof localStorage !== "undefined";
209 |   } catch {
210 |     return false;
211 |   }
212 | }
213 | if (testSupport()) {
214 |   storageEngine = localStorage;
215 | }
216 | let windowPersistentEvents = {
217 |   addEventListener(key, listener, restore) {
218 |     window.addEventListener("storage", listener);
219 |     window.addEventListener("pageshow", restore);
220 |   },
221 |   removeEventListener(key, listener, restore) {
222 |     window.removeEventListener("storage", listener);
223 |     window.removeEventListener("pageshow", restore);
224 |   }
225 | };
226 | if (typeof window !== "undefined") {
227 |   eventsEngine = windowPersistentEvents;
228 | }
229 | function persistentAtom(name, initial = void 0, opts = {}) {
230 |   let encode = opts.encode || identity;
231 |   let decode = opts.decode || identity;
232 |   let store = atom(initial);
233 |   let set = store.set;
234 |   store.set = (newValue) => {
235 |     if (typeof newValue === "undefined") {
236 |       delete storageEngine[name];
237 |     } else {
238 |       storageEngine[name] = encode(newValue);
239 |     }
240 |     set(newValue);
241 |   };
242 |   function listener(e) {
243 |     if (e.key === name) {
244 |       if (e.newValue === null) {
245 |         set(void 0);
246 |       } else {
247 |         set(decode(e.newValue));
248 |       }
249 |     } else if (!storageEngine[name]) {
250 |       set(void 0);
251 |     }
252 |   }
253 |   function restore() {
254 |     store.set(storageEngine[name] ? decode(storageEngine[name]) : initial);
255 |   }
256 |   onMount(store, () => {
257 |     restore();
258 |     if (opts.listen !== false) {
259 |       eventsEngine.addEventListener(name, listener, restore);
260 |       return () => {
261 |         eventsEngine.removeEventListener(name, listener, restore);
262 |       };
263 |     }
264 |   });
265 |   return store;
266 | }
267 | function persistentMap(prefix, initial = {}, opts = {}) {
268 |   let encode = opts.encode || identity;
269 |   let decode = opts.decode || identity;
270 |   let store = map();
271 |   let setKey = store.setKey;
272 |   store.setKey = (key, newValue) => {
273 |     if (typeof newValue === "undefined") {
274 |       if (opts.listen !== false && eventsEngine.perKey) {
275 |         eventsEngine.removeEventListener(prefix + key, listener, restore);
276 |       }
277 |       delete storageEngine[prefix + key];
278 |     } else {
279 |       if (opts.listen !== false && eventsEngine.perKey && !(key in store.value)) {
280 |         eventsEngine.addEventListener(prefix + key, listener, restore);
281 |       }
282 |       storageEngine[prefix + key] = encode(newValue);
283 |     }
284 |     setKey(key, newValue);
285 |   };
286 |   let set = store.set;
287 |   store.set = function(newObject) {
288 |     for (let key in newObject) {
289 |       store.setKey(key, newObject[key]);
290 |     }
291 |     for (let key in store.value) {
292 |       if (!(key in newObject)) {
293 |         store.setKey(key);
294 |       }
295 |     }
296 |   };
297 |   function listener(e) {
298 |     if (!e.key) {
299 |       set({});
300 |     } else if (e.key.startsWith(prefix)) {
301 |       if (e.newValue === null) {
302 |         setKey(e.key.slice(prefix.length), void 0);
303 |       } else {
304 |         setKey(e.key.slice(prefix.length), decode(e.newValue));
305 |       }
306 |     }
307 |   }
308 |   function restore() {
309 |     let data = { ...initial };
310 |     for (let key in storageEngine) {
311 |       if (key.startsWith(prefix)) {
312 |         data[key.slice(prefix.length)] = decode(storageEngine[key]);
313 |       }
314 |     }
315 |     store.set(data);
316 |   }
317 |   onMount(store, () => {
318 |     restore();
319 |     if (opts.listen !== false) {
320 |       eventsEngine.addEventListener(prefix, listener, restore);
321 |       return () => {
322 |         eventsEngine.removeEventListener(prefix, listener, restore);
323 |         for (let key in store.value) {
324 |           eventsEngine.removeEventListener(prefix + key, listener, restore);
325 |         }
326 |       };
327 |     }
328 |   });
329 |   return store;
330 | }
331 | let $atom = persistentAtom("test", [], {
332 |   decode: JSON.parse,
333 |   encode: JSON.stringify
334 | });
335 | let $map = persistentMap("testMap", {});
336 | let preAtom = document.querySelector("#atom");
337 | let preMap = document.querySelector("#map");
338 | $atom.subscribe((val) => {
339 |   preAtom.textContent = JSON.stringify(val, null, 2);
340 | });
341 | $map.subscribe((val) => {
342 |   preMap.textContent = JSON.stringify(val, null, 2);
343 | });
344 | window.addEventListener("pageshow", (event) => {
345 |   if (event.persisted) {
346 |     console.log("The page was restored from the bfcache");
347 |   } else {
348 |     console.log("The page was loaded normally");
349 |   }
350 | });
351 | export {
352 |   $atom as $,
353 |   $map as a
354 | };
355 | 


--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
   1 | lockfileVersion: '9.0'
   2 | 
   3 | settings:
   4 |   autoInstallPeers: true
   5 |   excludeLinksFromLockfile: false
   6 | 
   7 | importers:
   8 | 
   9 |   .:
  10 |     devDependencies:
  11 |       '@logux/eslint-config':
  12 |         specifier: ^56.1.0
  13 |         version: 56.1.0(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
  14 |       '@size-limit/preset-small-lib':
  15 |         specifier: ^11.2.0
  16 |         version: 11.2.0(size-limit@11.2.0)
  17 |       '@types/node':
  18 |         specifier: ^24.8.1
  19 |         version: 24.8.1
  20 |       actions-up:
  21 |         specifier: ^1.4.2
  22 |         version: 1.4.2
  23 |       better-node-test:
  24 |         specifier: ^0.8.3
  25 |         version: 0.8.3
  26 |       check-dts:
  27 |         specifier: ^0.9.0
  28 |         version: 0.9.0(typescript@5.9.3)
  29 |       clean-publish:
  30 |         specifier: ^5.2.2
  31 |         version: 5.2.2
  32 |       eslint:
  33 |         specifier: ^9.38.0
  34 |         version: 9.38.0(jiti@2.4.2)
  35 |       globals:
  36 |         specifier: ^16.4.0
  37 |         version: 16.4.0
  38 |       happy-dom:
  39 |         specifier: ^20.0.5
  40 |         version: 20.0.5
  41 |       multiocular:
  42 |         specifier: ^0.8.1
  43 |         version: 0.8.1
  44 |       nanodelay:
  45 |         specifier: ^2.0.2
  46 |         version: 2.0.2
  47 |       nanostores:
  48 |         specifier: ^1.0.1
  49 |         version: 1.0.1
  50 |       size-limit:
  51 |         specifier: ^11.2.0
  52 |         version: 11.2.0
  53 |       typescript:
  54 |         specifier: ^5.9.3
  55 |         version: 5.9.3
  56 |       vite:
  57 |         specifier: ^7.1.10
  58 |         version: 7.1.10(@types/node@24.8.1)(jiti@2.4.2)(tsx@4.20.6)(yaml@2.8.1)
  59 | 
  60 | packages:
  61 | 
  62 |   '@emnapi/core@1.5.0':
  63 |     resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==}
  64 | 
  65 |   '@emnapi/runtime@1.5.0':
  66 |     resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
  67 | 
  68 |   '@emnapi/wasi-threads@1.1.0':
  69 |     resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
  70 | 
  71 |   '@esbuild/aix-ppc64@0.25.11':
  72 |     resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
  73 |     engines: {node: '>=18'}
  74 |     cpu: [ppc64]
  75 |     os: [aix]
  76 | 
  77 |   '@esbuild/aix-ppc64@0.25.5':
  78 |     resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==}
  79 |     engines: {node: '>=18'}
  80 |     cpu: [ppc64]
  81 |     os: [aix]
  82 | 
  83 |   '@esbuild/android-arm64@0.25.11':
  84 |     resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
  85 |     engines: {node: '>=18'}
  86 |     cpu: [arm64]
  87 |     os: [android]
  88 | 
  89 |   '@esbuild/android-arm64@0.25.5':
  90 |     resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==}
  91 |     engines: {node: '>=18'}
  92 |     cpu: [arm64]
  93 |     os: [android]
  94 | 
  95 |   '@esbuild/android-arm@0.25.11':
  96 |     resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
  97 |     engines: {node: '>=18'}
  98 |     cpu: [arm]
  99 |     os: [android]
 100 | 
 101 |   '@esbuild/android-arm@0.25.5':
 102 |     resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==}
 103 |     engines: {node: '>=18'}
 104 |     cpu: [arm]
 105 |     os: [android]
 106 | 
 107 |   '@esbuild/android-x64@0.25.11':
 108 |     resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
 109 |     engines: {node: '>=18'}
 110 |     cpu: [x64]
 111 |     os: [android]
 112 | 
 113 |   '@esbuild/android-x64@0.25.5':
 114 |     resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==}
 115 |     engines: {node: '>=18'}
 116 |     cpu: [x64]
 117 |     os: [android]
 118 | 
 119 |   '@esbuild/darwin-arm64@0.25.11':
 120 |     resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
 121 |     engines: {node: '>=18'}
 122 |     cpu: [arm64]
 123 |     os: [darwin]
 124 | 
 125 |   '@esbuild/darwin-arm64@0.25.5':
 126 |     resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==}
 127 |     engines: {node: '>=18'}
 128 |     cpu: [arm64]
 129 |     os: [darwin]
 130 | 
 131 |   '@esbuild/darwin-x64@0.25.11':
 132 |     resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
 133 |     engines: {node: '>=18'}
 134 |     cpu: [x64]
 135 |     os: [darwin]
 136 | 
 137 |   '@esbuild/darwin-x64@0.25.5':
 138 |     resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==}
 139 |     engines: {node: '>=18'}
 140 |     cpu: [x64]
 141 |     os: [darwin]
 142 | 
 143 |   '@esbuild/freebsd-arm64@0.25.11':
 144 |     resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
 145 |     engines: {node: '>=18'}
 146 |     cpu: [arm64]
 147 |     os: [freebsd]
 148 | 
 149 |   '@esbuild/freebsd-arm64@0.25.5':
 150 |     resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==}
 151 |     engines: {node: '>=18'}
 152 |     cpu: [arm64]
 153 |     os: [freebsd]
 154 | 
 155 |   '@esbuild/freebsd-x64@0.25.11':
 156 |     resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
 157 |     engines: {node: '>=18'}
 158 |     cpu: [x64]
 159 |     os: [freebsd]
 160 | 
 161 |   '@esbuild/freebsd-x64@0.25.5':
 162 |     resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==}
 163 |     engines: {node: '>=18'}
 164 |     cpu: [x64]
 165 |     os: [freebsd]
 166 | 
 167 |   '@esbuild/linux-arm64@0.25.11':
 168 |     resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
 169 |     engines: {node: '>=18'}
 170 |     cpu: [arm64]
 171 |     os: [linux]
 172 | 
 173 |   '@esbuild/linux-arm64@0.25.5':
 174 |     resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==}
 175 |     engines: {node: '>=18'}
 176 |     cpu: [arm64]
 177 |     os: [linux]
 178 | 
 179 |   '@esbuild/linux-arm@0.25.11':
 180 |     resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
 181 |     engines: {node: '>=18'}
 182 |     cpu: [arm]
 183 |     os: [linux]
 184 | 
 185 |   '@esbuild/linux-arm@0.25.5':
 186 |     resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==}
 187 |     engines: {node: '>=18'}
 188 |     cpu: [arm]
 189 |     os: [linux]
 190 | 
 191 |   '@esbuild/linux-ia32@0.25.11':
 192 |     resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
 193 |     engines: {node: '>=18'}
 194 |     cpu: [ia32]
 195 |     os: [linux]
 196 | 
 197 |   '@esbuild/linux-ia32@0.25.5':
 198 |     resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==}
 199 |     engines: {node: '>=18'}
 200 |     cpu: [ia32]
 201 |     os: [linux]
 202 | 
 203 |   '@esbuild/linux-loong64@0.25.11':
 204 |     resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
 205 |     engines: {node: '>=18'}
 206 |     cpu: [loong64]
 207 |     os: [linux]
 208 | 
 209 |   '@esbuild/linux-loong64@0.25.5':
 210 |     resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==}
 211 |     engines: {node: '>=18'}
 212 |     cpu: [loong64]
 213 |     os: [linux]
 214 | 
 215 |   '@esbuild/linux-mips64el@0.25.11':
 216 |     resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
 217 |     engines: {node: '>=18'}
 218 |     cpu: [mips64el]
 219 |     os: [linux]
 220 | 
 221 |   '@esbuild/linux-mips64el@0.25.5':
 222 |     resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==}
 223 |     engines: {node: '>=18'}
 224 |     cpu: [mips64el]
 225 |     os: [linux]
 226 | 
 227 |   '@esbuild/linux-ppc64@0.25.11':
 228 |     resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
 229 |     engines: {node: '>=18'}
 230 |     cpu: [ppc64]
 231 |     os: [linux]
 232 | 
 233 |   '@esbuild/linux-ppc64@0.25.5':
 234 |     resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==}
 235 |     engines: {node: '>=18'}
 236 |     cpu: [ppc64]
 237 |     os: [linux]
 238 | 
 239 |   '@esbuild/linux-riscv64@0.25.11':
 240 |     resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
 241 |     engines: {node: '>=18'}
 242 |     cpu: [riscv64]
 243 |     os: [linux]
 244 | 
 245 |   '@esbuild/linux-riscv64@0.25.5':
 246 |     resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==}
 247 |     engines: {node: '>=18'}
 248 |     cpu: [riscv64]
 249 |     os: [linux]
 250 | 
 251 |   '@esbuild/linux-s390x@0.25.11':
 252 |     resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
 253 |     engines: {node: '>=18'}
 254 |     cpu: [s390x]
 255 |     os: [linux]
 256 | 
 257 |   '@esbuild/linux-s390x@0.25.5':
 258 |     resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==}
 259 |     engines: {node: '>=18'}
 260 |     cpu: [s390x]
 261 |     os: [linux]
 262 | 
 263 |   '@esbuild/linux-x64@0.25.11':
 264 |     resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
 265 |     engines: {node: '>=18'}
 266 |     cpu: [x64]
 267 |     os: [linux]
 268 | 
 269 |   '@esbuild/linux-x64@0.25.5':
 270 |     resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==}
 271 |     engines: {node: '>=18'}
 272 |     cpu: [x64]
 273 |     os: [linux]
 274 | 
 275 |   '@esbuild/netbsd-arm64@0.25.11':
 276 |     resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
 277 |     engines: {node: '>=18'}
 278 |     cpu: [arm64]
 279 |     os: [netbsd]
 280 | 
 281 |   '@esbuild/netbsd-arm64@0.25.5':
 282 |     resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==}
 283 |     engines: {node: '>=18'}
 284 |     cpu: [arm64]
 285 |     os: [netbsd]
 286 | 
 287 |   '@esbuild/netbsd-x64@0.25.11':
 288 |     resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
 289 |     engines: {node: '>=18'}
 290 |     cpu: [x64]
 291 |     os: [netbsd]
 292 | 
 293 |   '@esbuild/netbsd-x64@0.25.5':
 294 |     resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==}
 295 |     engines: {node: '>=18'}
 296 |     cpu: [x64]
 297 |     os: [netbsd]
 298 | 
 299 |   '@esbuild/openbsd-arm64@0.25.11':
 300 |     resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
 301 |     engines: {node: '>=18'}
 302 |     cpu: [arm64]
 303 |     os: [openbsd]
 304 | 
 305 |   '@esbuild/openbsd-arm64@0.25.5':
 306 |     resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==}
 307 |     engines: {node: '>=18'}
 308 |     cpu: [arm64]
 309 |     os: [openbsd]
 310 | 
 311 |   '@esbuild/openbsd-x64@0.25.11':
 312 |     resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
 313 |     engines: {node: '>=18'}
 314 |     cpu: [x64]
 315 |     os: [openbsd]
 316 | 
 317 |   '@esbuild/openbsd-x64@0.25.5':
 318 |     resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==}
 319 |     engines: {node: '>=18'}
 320 |     cpu: [x64]
 321 |     os: [openbsd]
 322 | 
 323 |   '@esbuild/openharmony-arm64@0.25.11':
 324 |     resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
 325 |     engines: {node: '>=18'}
 326 |     cpu: [arm64]
 327 |     os: [openharmony]
 328 | 
 329 |   '@esbuild/sunos-x64@0.25.11':
 330 |     resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
 331 |     engines: {node: '>=18'}
 332 |     cpu: [x64]
 333 |     os: [sunos]
 334 | 
 335 |   '@esbuild/sunos-x64@0.25.5':
 336 |     resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==}
 337 |     engines: {node: '>=18'}
 338 |     cpu: [x64]
 339 |     os: [sunos]
 340 | 
 341 |   '@esbuild/win32-arm64@0.25.11':
 342 |     resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
 343 |     engines: {node: '>=18'}
 344 |     cpu: [arm64]
 345 |     os: [win32]
 346 | 
 347 |   '@esbuild/win32-arm64@0.25.5':
 348 |     resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==}
 349 |     engines: {node: '>=18'}
 350 |     cpu: [arm64]
 351 |     os: [win32]
 352 | 
 353 |   '@esbuild/win32-ia32@0.25.11':
 354 |     resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
 355 |     engines: {node: '>=18'}
 356 |     cpu: [ia32]
 357 |     os: [win32]
 358 | 
 359 |   '@esbuild/win32-ia32@0.25.5':
 360 |     resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==}
 361 |     engines: {node: '>=18'}
 362 |     cpu: [ia32]
 363 |     os: [win32]
 364 | 
 365 |   '@esbuild/win32-x64@0.25.11':
 366 |     resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
 367 |     engines: {node: '>=18'}
 368 |     cpu: [x64]
 369 |     os: [win32]
 370 | 
 371 |   '@esbuild/win32-x64@0.25.5':
 372 |     resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==}
 373 |     engines: {node: '>=18'}
 374 |     cpu: [x64]
 375 |     os: [win32]
 376 | 
 377 |   '@eslint-community/eslint-utils@4.9.0':
 378 |     resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
 379 |     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
 380 |     peerDependencies:
 381 |       eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
 382 | 
 383 |   '@eslint-community/regexpp@4.12.1':
 384 |     resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
 385 |     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
 386 | 
 387 |   '@eslint/config-array@0.21.1':
 388 |     resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
 389 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 390 | 
 391 |   '@eslint/config-helpers@0.4.1':
 392 |     resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==}
 393 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 394 | 
 395 |   '@eslint/core@0.16.0':
 396 |     resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==}
 397 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 398 | 
 399 |   '@eslint/eslintrc@3.3.1':
 400 |     resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
 401 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 402 | 
 403 |   '@eslint/js@9.38.0':
 404 |     resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==}
 405 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 406 | 
 407 |   '@eslint/object-schema@2.1.7':
 408 |     resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
 409 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 410 | 
 411 |   '@eslint/plugin-kit@0.4.0':
 412 |     resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==}
 413 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 414 | 
 415 |   '@humanfs/core@0.19.1':
 416 |     resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
 417 |     engines: {node: '>=18.18.0'}
 418 | 
 419 |   '@humanfs/node@0.16.7':
 420 |     resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==}
 421 |     engines: {node: '>=18.18.0'}
 422 | 
 423 |   '@humanwhocodes/module-importer@1.0.1':
 424 |     resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
 425 |     engines: {node: '>=12.22'}
 426 | 
 427 |   '@humanwhocodes/retry@0.4.3':
 428 |     resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
 429 |     engines: {node: '>=18.18'}
 430 | 
 431 |   '@isaacs/balanced-match@4.0.1':
 432 |     resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
 433 |     engines: {node: 20 || >=22}
 434 | 
 435 |   '@isaacs/brace-expansion@5.0.0':
 436 |     resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==}
 437 |     engines: {node: 20 || >=22}
 438 | 
 439 |   '@logux/actions@0.5.0':
 440 |     resolution: {integrity: sha512-65sgfkuFUzxHqDWSBn2CfNwHrijkoMbFS/LBMeRNtcdMxGRJ4X4mwwwDDdQ/Tci+TNQnfJTAiKCKBIsdiS3VCg==}
 441 |     engines: {node: ^20.0.0 || >=22.0.0}
 442 |     peerDependencies:
 443 |       '@logux/core': ^0.10.0
 444 | 
 445 |   '@logux/core@0.10.0':
 446 |     resolution: {integrity: sha512-VbgVkEloAe2ym5w0cjyRI16Eeyk2R0BgJa9pMYT1FcJEhFnzrB23E0ExIEhrok0iD48bFh7goledwmDLmgWaiw==}
 447 |     engines: {node: ^20.0.0 || >=22.0.0}
 448 | 
 449 |   '@logux/eslint-config@56.1.0':
 450 |     resolution: {integrity: sha512-o0fsiWHpj0T+ZgnHg2T/wBjLTztYkhQnk6cckZ8zmGA9hz+wX2Y+s34u2VB/AaxOxFOrOF+bQIUGacOzPCledA==}
 451 |     engines: {node: '>=18.0.0'}
 452 |     peerDependencies:
 453 |       eslint: ^8.57.0 || ^9.0.0
 454 |       eslint-plugin-svelte: ^3.0.0
 455 |       svelte: ^4.2.12 || ^5.0.0
 456 |       svelte-eslint-parser: ^1.0.0
 457 |     peerDependenciesMeta:
 458 |       eslint-plugin-svelte:
 459 |         optional: true
 460 |       svelte:
 461 |         optional: true
 462 |       svelte-eslint-parser:
 463 |         optional: true
 464 | 
 465 |   '@logux/server@0.14.0':
 466 |     resolution: {integrity: sha512-a7KRD30U252cfIekBGktEIRuwFRT7vOPZXkEsD05DwApsPi70iRnFaHEgMde8tZu+jJUuTDN/xMgabtjzHzXaQ==}
 467 |     engines: {node: ^20.0.0 || >=22.0.0}
 468 | 
 469 |   '@napi-rs/wasm-runtime@0.2.12':
 470 |     resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==}
 471 | 
 472 |   '@nodelib/fs.scandir@2.1.5':
 473 |     resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
 474 |     engines: {node: '>= 8'}
 475 | 
 476 |   '@nodelib/fs.stat@2.0.5':
 477 |     resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
 478 |     engines: {node: '>= 8'}
 479 | 
 480 |   '@nodelib/fs.walk@1.2.8':
 481 |     resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
 482 |     engines: {node: '>= 8'}
 483 | 
 484 |   '@rollup/rollup-android-arm-eabi@4.52.5':
 485 |     resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
 486 |     cpu: [arm]
 487 |     os: [android]
 488 | 
 489 |   '@rollup/rollup-android-arm64@4.52.5':
 490 |     resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==}
 491 |     cpu: [arm64]
 492 |     os: [android]
 493 | 
 494 |   '@rollup/rollup-darwin-arm64@4.52.5':
 495 |     resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==}
 496 |     cpu: [arm64]
 497 |     os: [darwin]
 498 | 
 499 |   '@rollup/rollup-darwin-x64@4.52.5':
 500 |     resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==}
 501 |     cpu: [x64]
 502 |     os: [darwin]
 503 | 
 504 |   '@rollup/rollup-freebsd-arm64@4.52.5':
 505 |     resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==}
 506 |     cpu: [arm64]
 507 |     os: [freebsd]
 508 | 
 509 |   '@rollup/rollup-freebsd-x64@4.52.5':
 510 |     resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==}
 511 |     cpu: [x64]
 512 |     os: [freebsd]
 513 | 
 514 |   '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
 515 |     resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
 516 |     cpu: [arm]
 517 |     os: [linux]
 518 |     libc: [glibc]
 519 | 
 520 |   '@rollup/rollup-linux-arm-musleabihf@4.52.5':
 521 |     resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
 522 |     cpu: [arm]
 523 |     os: [linux]
 524 |     libc: [musl]
 525 | 
 526 |   '@rollup/rollup-linux-arm64-gnu@4.52.5':
 527 |     resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
 528 |     cpu: [arm64]
 529 |     os: [linux]
 530 |     libc: [glibc]
 531 | 
 532 |   '@rollup/rollup-linux-arm64-musl@4.52.5':
 533 |     resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
 534 |     cpu: [arm64]
 535 |     os: [linux]
 536 |     libc: [musl]
 537 | 
 538 |   '@rollup/rollup-linux-loong64-gnu@4.52.5':
 539 |     resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==}
 540 |     cpu: [loong64]
 541 |     os: [linux]
 542 |     libc: [glibc]
 543 | 
 544 |   '@rollup/rollup-linux-ppc64-gnu@4.52.5':
 545 |     resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
 546 |     cpu: [ppc64]
 547 |     os: [linux]
 548 |     libc: [glibc]
 549 | 
 550 |   '@rollup/rollup-linux-riscv64-gnu@4.52.5':
 551 |     resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
 552 |     cpu: [riscv64]
 553 |     os: [linux]
 554 |     libc: [glibc]
 555 | 
 556 |   '@rollup/rollup-linux-riscv64-musl@4.52.5':
 557 |     resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==}
 558 |     cpu: [riscv64]
 559 |     os: [linux]
 560 |     libc: [musl]
 561 | 
 562 |   '@rollup/rollup-linux-s390x-gnu@4.52.5':
 563 |     resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==}
 564 |     cpu: [s390x]
 565 |     os: [linux]
 566 |     libc: [glibc]
 567 | 
 568 |   '@rollup/rollup-linux-x64-gnu@4.52.5':
 569 |     resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
 570 |     cpu: [x64]
 571 |     os: [linux]
 572 |     libc: [glibc]
 573 | 
 574 |   '@rollup/rollup-linux-x64-musl@4.52.5':
 575 |     resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
 576 |     cpu: [x64]
 577 |     os: [linux]
 578 |     libc: [musl]
 579 | 
 580 |   '@rollup/rollup-openharmony-arm64@4.52.5':
 581 |     resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==}
 582 |     cpu: [arm64]
 583 |     os: [openharmony]
 584 | 
 585 |   '@rollup/rollup-win32-arm64-msvc@4.52.5':
 586 |     resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==}
 587 |     cpu: [arm64]
 588 |     os: [win32]
 589 | 
 590 |   '@rollup/rollup-win32-ia32-msvc@4.52.5':
 591 |     resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==}
 592 |     cpu: [ia32]
 593 |     os: [win32]
 594 | 
 595 |   '@rollup/rollup-win32-x64-gnu@4.52.5':
 596 |     resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==}
 597 |     cpu: [x64]
 598 |     os: [win32]
 599 | 
 600 |   '@rollup/rollup-win32-x64-msvc@4.52.5':
 601 |     resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==}
 602 |     cpu: [x64]
 603 |     os: [win32]
 604 | 
 605 |   '@size-limit/esbuild@11.2.0':
 606 |     resolution: {integrity: sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==}
 607 |     engines: {node: ^18.0.0 || >=20.0.0}
 608 |     peerDependencies:
 609 |       size-limit: 11.2.0
 610 | 
 611 |   '@size-limit/file@11.2.0':
 612 |     resolution: {integrity: sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==}
 613 |     engines: {node: ^18.0.0 || >=20.0.0}
 614 |     peerDependencies:
 615 |       size-limit: 11.2.0
 616 | 
 617 |   '@size-limit/preset-small-lib@11.2.0':
 618 |     resolution: {integrity: sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==}
 619 |     peerDependencies:
 620 |       size-limit: 11.2.0
 621 | 
 622 |   '@tybys/wasm-util@0.10.1':
 623 |     resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
 624 | 
 625 |   '@types/estree@1.0.8':
 626 |     resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
 627 | 
 628 |   '@types/json-schema@7.0.15':
 629 |     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
 630 | 
 631 |   '@types/node@20.19.22':
 632 |     resolution: {integrity: sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==}
 633 | 
 634 |   '@types/node@24.8.1':
 635 |     resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==}
 636 | 
 637 |   '@types/trusted-types@2.0.7':
 638 |     resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
 639 | 
 640 |   '@types/unist@3.0.3':
 641 |     resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
 642 | 
 643 |   '@types/whatwg-mimetype@3.0.2':
 644 |     resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
 645 | 
 646 |   '@typescript-eslint/eslint-plugin@8.46.1':
 647 |     resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==}
 648 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 649 |     peerDependencies:
 650 |       '@typescript-eslint/parser': ^8.46.1
 651 |       eslint: ^8.57.0 || ^9.0.0
 652 |       typescript: '>=4.8.4 <6.0.0'
 653 | 
 654 |   '@typescript-eslint/parser@8.46.1':
 655 |     resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==}
 656 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 657 |     peerDependencies:
 658 |       eslint: ^8.57.0 || ^9.0.0
 659 |       typescript: '>=4.8.4 <6.0.0'
 660 | 
 661 |   '@typescript-eslint/project-service@8.46.1':
 662 |     resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==}
 663 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 664 |     peerDependencies:
 665 |       typescript: '>=4.8.4 <6.0.0'
 666 | 
 667 |   '@typescript-eslint/scope-manager@8.46.1':
 668 |     resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==}
 669 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 670 | 
 671 |   '@typescript-eslint/tsconfig-utils@8.46.1':
 672 |     resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==}
 673 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 674 |     peerDependencies:
 675 |       typescript: '>=4.8.4 <6.0.0'
 676 | 
 677 |   '@typescript-eslint/type-utils@8.46.1':
 678 |     resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==}
 679 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 680 |     peerDependencies:
 681 |       eslint: ^8.57.0 || ^9.0.0
 682 |       typescript: '>=4.8.4 <6.0.0'
 683 | 
 684 |   '@typescript-eslint/types@8.46.1':
 685 |     resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==}
 686 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 687 | 
 688 |   '@typescript-eslint/typescript-estree@8.46.1':
 689 |     resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==}
 690 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 691 |     peerDependencies:
 692 |       typescript: '>=4.8.4 <6.0.0'
 693 | 
 694 |   '@typescript-eslint/utils@8.46.1':
 695 |     resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==}
 696 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 697 |     peerDependencies:
 698 |       eslint: ^8.57.0 || ^9.0.0
 699 |       typescript: '>=4.8.4 <6.0.0'
 700 | 
 701 |   '@typescript-eslint/visitor-keys@8.46.1':
 702 |     resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==}
 703 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 704 | 
 705 |   '@unrs/resolver-binding-android-arm-eabi@1.11.1':
 706 |     resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==}
 707 |     cpu: [arm]
 708 |     os: [android]
 709 | 
 710 |   '@unrs/resolver-binding-android-arm64@1.11.1':
 711 |     resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==}
 712 |     cpu: [arm64]
 713 |     os: [android]
 714 | 
 715 |   '@unrs/resolver-binding-darwin-arm64@1.11.1':
 716 |     resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==}
 717 |     cpu: [arm64]
 718 |     os: [darwin]
 719 | 
 720 |   '@unrs/resolver-binding-darwin-x64@1.11.1':
 721 |     resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==}
 722 |     cpu: [x64]
 723 |     os: [darwin]
 724 | 
 725 |   '@unrs/resolver-binding-freebsd-x64@1.11.1':
 726 |     resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==}
 727 |     cpu: [x64]
 728 |     os: [freebsd]
 729 | 
 730 |   '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
 731 |     resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==}
 732 |     cpu: [arm]
 733 |     os: [linux]
 734 | 
 735 |   '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
 736 |     resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==}
 737 |     cpu: [arm]
 738 |     os: [linux]
 739 | 
 740 |   '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
 741 |     resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
 742 |     cpu: [arm64]
 743 |     os: [linux]
 744 |     libc: [glibc]
 745 | 
 746 |   '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
 747 |     resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
 748 |     cpu: [arm64]
 749 |     os: [linux]
 750 |     libc: [musl]
 751 | 
 752 |   '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
 753 |     resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
 754 |     cpu: [ppc64]
 755 |     os: [linux]
 756 |     libc: [glibc]
 757 | 
 758 |   '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
 759 |     resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
 760 |     cpu: [riscv64]
 761 |     os: [linux]
 762 |     libc: [glibc]
 763 | 
 764 |   '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
 765 |     resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
 766 |     cpu: [riscv64]
 767 |     os: [linux]
 768 |     libc: [musl]
 769 | 
 770 |   '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
 771 |     resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
 772 |     cpu: [s390x]
 773 |     os: [linux]
 774 |     libc: [glibc]
 775 | 
 776 |   '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
 777 |     resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
 778 |     cpu: [x64]
 779 |     os: [linux]
 780 |     libc: [glibc]
 781 | 
 782 |   '@unrs/resolver-binding-linux-x64-musl@1.11.1':
 783 |     resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
 784 |     cpu: [x64]
 785 |     os: [linux]
 786 |     libc: [musl]
 787 | 
 788 |   '@unrs/resolver-binding-wasm32-wasi@1.11.1':
 789 |     resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
 790 |     engines: {node: '>=14.0.0'}
 791 |     cpu: [wasm32]
 792 | 
 793 |   '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
 794 |     resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==}
 795 |     cpu: [arm64]
 796 |     os: [win32]
 797 | 
 798 |   '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
 799 |     resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==}
 800 |     cpu: [ia32]
 801 |     os: [win32]
 802 | 
 803 |   '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
 804 |     resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==}
 805 |     cpu: [x64]
 806 |     os: [win32]
 807 | 
 808 |   abbrev@1.1.1:
 809 |     resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
 810 | 
 811 |   acorn-jsx@5.3.2:
 812 |     resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
 813 |     peerDependencies:
 814 |       acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
 815 | 
 816 |   acorn@8.15.0:
 817 |     resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
 818 |     engines: {node: '>=0.4.0'}
 819 |     hasBin: true
 820 | 
 821 |   actions-up@1.4.2:
 822 |     resolution: {integrity: sha512-u2xU3YDRm5sTJyleR/QIph68F7PpCC1m9kvwm24xXt8PXlH1Ge9gm750iIkzqx22Eq7saFZ8mHFjRC1eFkNvFg==}
 823 |     engines: {node: ^18.0.0 || >=20.0.0}
 824 |     hasBin: true
 825 | 
 826 |   ajv@6.12.6:
 827 |     resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
 828 | 
 829 |   ansi-colors@4.1.3:
 830 |     resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
 831 |     engines: {node: '>=6'}
 832 | 
 833 |   ansi-regex@5.0.1:
 834 |     resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
 835 |     engines: {node: '>=8'}
 836 | 
 837 |   ansi-styles@4.3.0:
 838 |     resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
 839 |     engines: {node: '>=8'}
 840 | 
 841 |   argparse@2.0.1:
 842 |     resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
 843 | 
 844 |   balanced-match@1.0.2:
 845 |     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
 846 | 
 847 |   better-node-test@0.8.3:
 848 |     resolution: {integrity: sha512-TIdJGUec4lLbk3UssJobKnP8ym5/H+t58CTQX1cKDBdQG0z9eR5syI09RJLQM/164BrzshMFyftg29LDAjFWQQ==}
 849 |     engines: {node: ^18.19.0 || ^20.0.0 || ^22.0.0 || >=24.0.0}
 850 |     hasBin: true
 851 | 
 852 |   brace-expansion@1.1.12:
 853 |     resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
 854 | 
 855 |   brace-expansion@2.0.2:
 856 |     resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
 857 | 
 858 |   braces@3.0.3:
 859 |     resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
 860 |     engines: {node: '>=8'}
 861 | 
 862 |   bytes-iec@3.1.1:
 863 |     resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==}
 864 |     engines: {node: '>= 0.8'}
 865 | 
 866 |   cac@6.7.14:
 867 |     resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
 868 |     engines: {node: '>=8'}
 869 | 
 870 |   callsites@3.1.0:
 871 |     resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
 872 |     engines: {node: '>=6'}
 873 | 
 874 |   chalk@4.1.2:
 875 |     resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
 876 |     engines: {node: '>=10'}
 877 | 
 878 |   check-dts@0.9.0:
 879 |     resolution: {integrity: sha512-xAs/RKFiB1dHEFPK3+ACk0f2WdngQywmghiPsKJF2JmrsOHCQAfcqkD7C52V3FjwPtU5s8sdTJwX4pLP/66+Bw==}
 880 |     engines: {node: '>=18.0.0'}
 881 |     hasBin: true
 882 |     peerDependencies:
 883 |       typescript: '>=4.0.0'
 884 | 
 885 |   chokidar@4.0.3:
 886 |     resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
 887 |     engines: {node: '>= 14.16.0'}
 888 | 
 889 |   clean-publish@5.2.2:
 890 |     resolution: {integrity: sha512-sqM9uAXG+K7QzEn0Ur00otEHfbQTsyle4enj/388ZZQhG6daXMJ15dfD/ALsFCQCJvMZPxYwDx/QrdcdzWVPyg==}
 891 |     engines: {node: '>= 18.0.0'}
 892 |     hasBin: true
 893 | 
 894 |   color-convert@2.0.1:
 895 |     resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
 896 |     engines: {node: '>=7.0.0'}
 897 | 
 898 |   color-name@1.1.4:
 899 |     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
 900 | 
 901 |   comment-parser@1.4.1:
 902 |     resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==}
 903 |     engines: {node: '>= 12.0.0'}
 904 | 
 905 |   concat-map@0.0.1:
 906 |     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
 907 | 
 908 |   cookie@1.0.2:
 909 |     resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
 910 |     engines: {node: '>=18'}
 911 | 
 912 |   cross-spawn@7.0.6:
 913 |     resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
 914 |     engines: {node: '>= 8'}
 915 | 
 916 |   debug@3.2.7:
 917 |     resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
 918 |     peerDependencies:
 919 |       supports-color: '*'
 920 |     peerDependenciesMeta:
 921 |       supports-color:
 922 |         optional: true
 923 | 
 924 |   debug@4.4.3:
 925 |     resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
 926 |     engines: {node: '>=6.0'}
 927 |     peerDependencies:
 928 |       supports-color: '*'
 929 |     peerDependenciesMeta:
 930 |       supports-color:
 931 |         optional: true
 932 | 
 933 |   deep-is@0.1.4:
 934 |     resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
 935 | 
 936 |   diff2html@3.4.52:
 937 |     resolution: {integrity: sha512-qhMg8/I3sZ4zm/6R/Kh0xd6qG6Vm86w6M+C9W+DuH1V8ACz+1cgEC8/k0ucjv6AGqZWzHm/8G1gh7IlrUqCMhg==}
 938 |     engines: {node: '>=12'}
 939 | 
 940 |   diff@7.0.0:
 941 |     resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==}
 942 |     engines: {node: '>=0.3.1'}
 943 | 
 944 |   dompurify@3.3.0:
 945 |     resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==}
 946 | 
 947 |   enhanced-resolve@5.18.3:
 948 |     resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
 949 |     engines: {node: '>=10.13.0'}
 950 | 
 951 |   enquirer@2.4.1:
 952 |     resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
 953 |     engines: {node: '>=8.6'}
 954 | 
 955 |   esbuild@0.25.11:
 956 |     resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
 957 |     engines: {node: '>=18'}
 958 |     hasBin: true
 959 | 
 960 |   esbuild@0.25.5:
 961 |     resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==}
 962 |     engines: {node: '>=18'}
 963 |     hasBin: true
 964 | 
 965 |   escape-string-regexp@4.0.0:
 966 |     resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
 967 |     engines: {node: '>=10'}
 968 | 
 969 |   eslint-compat-utils@0.5.1:
 970 |     resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==}
 971 |     engines: {node: '>=12'}
 972 |     peerDependencies:
 973 |       eslint: '>=6.0.0'
 974 | 
 975 |   eslint-import-context@0.1.9:
 976 |     resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==}
 977 |     engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
 978 |     peerDependencies:
 979 |       unrs-resolver: ^1.0.0
 980 |     peerDependenciesMeta:
 981 |       unrs-resolver:
 982 |         optional: true
 983 | 
 984 |   eslint-import-resolver-node@0.3.9:
 985 |     resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
 986 | 
 987 |   eslint-plugin-es-x@7.8.0:
 988 |     resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==}
 989 |     engines: {node: ^14.18.0 || >=16.0.0}
 990 |     peerDependencies:
 991 |       eslint: '>=8'
 992 | 
 993 |   eslint-plugin-import-x@4.16.1:
 994 |     resolution: {integrity: sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ==}
 995 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
 996 |     peerDependencies:
 997 |       '@typescript-eslint/utils': ^8.0.0
 998 |       eslint: ^8.57.0 || ^9.0.0
 999 |       eslint-import-resolver-node: '*'
1000 |     peerDependenciesMeta:
1001 |       '@typescript-eslint/utils':
1002 |         optional: true
1003 |       eslint-import-resolver-node:
1004 |         optional: true
1005 | 
1006 |   eslint-plugin-n@17.23.1:
1007 |     resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==}
1008 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1009 |     peerDependencies:
1010 |       eslint: '>=8.23.0'
1011 | 
1012 |   eslint-plugin-perfectionist@4.15.1:
1013 |     resolution: {integrity: sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==}
1014 |     engines: {node: ^18.0.0 || >=20.0.0}
1015 |     peerDependencies:
1016 |       eslint: '>=8.45.0'
1017 | 
1018 |   eslint-plugin-prefer-let@4.0.0:
1019 |     resolution: {integrity: sha512-X4ep5PMO1320HKaNC9DM5+p6XvOhwv+RcqGjhv3aiw9iAtHhiFtdIUB5l0Zya0iM22ys2BGKzrNI9Xpw/ZHooQ==}
1020 |     engines: {node: '>=0.10.0'}
1021 | 
1022 |   eslint-plugin-promise@7.2.1:
1023 |     resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==}
1024 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1025 |     peerDependencies:
1026 |       eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
1027 | 
1028 |   eslint-scope@8.4.0:
1029 |     resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==}
1030 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1031 | 
1032 |   eslint-visitor-keys@3.4.3:
1033 |     resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
1034 |     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
1035 | 
1036 |   eslint-visitor-keys@4.2.1:
1037 |     resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
1038 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1039 | 
1040 |   eslint@9.38.0:
1041 |     resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==}
1042 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1043 |     hasBin: true
1044 |     peerDependencies:
1045 |       jiti: '*'
1046 |     peerDependenciesMeta:
1047 |       jiti:
1048 |         optional: true
1049 | 
1050 |   espree@10.4.0:
1051 |     resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==}
1052 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1053 | 
1054 |   esquery@1.6.0:
1055 |     resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
1056 |     engines: {node: '>=0.10'}
1057 | 
1058 |   esrecurse@4.3.0:
1059 |     resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
1060 |     engines: {node: '>=4.0'}
1061 | 
1062 |   estraverse@5.3.0:
1063 |     resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
1064 |     engines: {node: '>=4.0'}
1065 | 
1066 |   esutils@2.0.3:
1067 |     resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
1068 |     engines: {node: '>=0.10.0'}
1069 | 
1070 |   fast-deep-equal@3.1.3:
1071 |     resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
1072 | 
1073 |   fast-glob@3.3.3:
1074 |     resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
1075 |     engines: {node: '>=8.6.0'}
1076 | 
1077 |   fast-json-stable-stringify@2.1.0:
1078 |     resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
1079 | 
1080 |   fast-levenshtein@2.0.6:
1081 |     resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
1082 | 
1083 |   fastq@1.19.1:
1084 |     resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
1085 | 
1086 |   fdir@6.4.6:
1087 |     resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==}
1088 |     peerDependencies:
1089 |       picomatch: ^3 || ^4
1090 |     peerDependenciesMeta:
1091 |       picomatch:
1092 |         optional: true
1093 | 
1094 |   fdir@6.5.0:
1095 |     resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
1096 |     engines: {node: '>=12.0.0'}
1097 |     peerDependencies:
1098 |       picomatch: ^3 || ^4
1099 |     peerDependenciesMeta:
1100 |       picomatch:
1101 |         optional: true
1102 | 
1103 |   file-entry-cache@8.0.0:
1104 |     resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
1105 |     engines: {node: '>=16.0.0'}
1106 | 
1107 |   fill-range@7.1.1:
1108 |     resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
1109 |     engines: {node: '>=8'}
1110 | 
1111 |   find-up@5.0.0:
1112 |     resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
1113 |     engines: {node: '>=10'}
1114 | 
1115 |   flat-cache@4.0.1:
1116 |     resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
1117 |     engines: {node: '>=16'}
1118 | 
1119 |   flatted@3.3.3:
1120 |     resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
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 |   get-tsconfig@4.12.0:
1131 |     resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==}
1132 | 
1133 |   glob-parent@5.1.2:
1134 |     resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
1135 |     engines: {node: '>= 6'}
1136 | 
1137 |   glob-parent@6.0.2:
1138 |     resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
1139 |     engines: {node: '>=10.13.0'}
1140 | 
1141 |   globals@14.0.0:
1142 |     resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
1143 |     engines: {node: '>=18'}
1144 | 
1145 |   globals@15.15.0:
1146 |     resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
1147 |     engines: {node: '>=18'}
1148 | 
1149 |   globals@16.4.0:
1150 |     resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==}
1151 |     engines: {node: '>=18'}
1152 | 
1153 |   globrex@0.1.2:
1154 |     resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
1155 | 
1156 |   graceful-fs@4.2.11:
1157 |     resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
1158 | 
1159 |   graphemer@1.4.0:
1160 |     resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
1161 | 
1162 |   happy-dom@20.0.5:
1163 |     resolution: {integrity: sha512-AiqA0rfS7WR1kihXt9W9aA5LFLaOKzwiL+QoI7BkOQ0r21C7VHTOf4k8QNlnWYaHLhpI2tZzJPLV1lY1obDTmw==}
1164 |     engines: {node: '>=20.0.0'}
1165 | 
1166 |   has-flag@4.0.0:
1167 |     resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
1168 |     engines: {node: '>=8'}
1169 | 
1170 |   hasown@2.0.2:
1171 |     resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
1172 |     engines: {node: '>= 0.4'}
1173 | 
1174 |   highlight.js@11.11.1:
1175 |     resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==}
1176 |     engines: {node: '>=12.0.0'}
1177 | 
1178 |   highlight.js@11.9.0:
1179 |     resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==}
1180 |     engines: {node: '>=12.0.0'}
1181 | 
1182 |   hogan.js@3.0.2:
1183 |     resolution: {integrity: sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==}
1184 |     hasBin: true
1185 | 
1186 |   ignore@5.3.2:
1187 |     resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
1188 |     engines: {node: '>= 4'}
1189 | 
1190 |   ignore@7.0.5:
1191 |     resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
1192 |     engines: {node: '>= 4'}
1193 | 
1194 |   import-fresh@3.3.1:
1195 |     resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
1196 |     engines: {node: '>=6'}
1197 | 
1198 |   imurmurhash@0.1.4:
1199 |     resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1200 |     engines: {node: '>=0.8.19'}
1201 | 
1202 |   is-core-module@2.16.1:
1203 |     resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
1204 |     engines: {node: '>= 0.4'}
1205 | 
1206 |   is-extglob@2.1.1:
1207 |     resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
1208 |     engines: {node: '>=0.10.0'}
1209 | 
1210 |   is-glob@4.0.3:
1211 |     resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
1212 |     engines: {node: '>=0.10.0'}
1213 | 
1214 |   is-number@7.0.0:
1215 |     resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
1216 |     engines: {node: '>=0.12.0'}
1217 | 
1218 |   isexe@2.0.0:
1219 |     resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
1220 | 
1221 |   jiti@2.4.2:
1222 |     resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
1223 |     hasBin: true
1224 | 
1225 |   js-yaml@4.1.0:
1226 |     resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
1227 |     hasBin: true
1228 | 
1229 |   json-buffer@3.0.1:
1230 |     resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
1231 | 
1232 |   json-schema-traverse@0.4.1:
1233 |     resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
1234 | 
1235 |   json-stable-stringify-without-jsonify@1.0.1:
1236 |     resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
1237 | 
1238 |   keyv@4.5.4:
1239 |     resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
1240 | 
1241 |   levn@0.4.1:
1242 |     resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
1243 |     engines: {node: '>= 0.8.0'}
1244 | 
1245 |   lilconfig@3.1.3:
1246 |     resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
1247 |     engines: {node: '>=14'}
1248 | 
1249 |   locate-path@6.0.0:
1250 |     resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
1251 |     engines: {node: '>=10'}
1252 | 
1253 |   lodash.merge@4.6.2:
1254 |     resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
1255 | 
1256 |   marked@16.4.1:
1257 |     resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==}
1258 |     engines: {node: '>= 20'}
1259 |     hasBin: true
1260 | 
1261 |   merge2@1.4.1:
1262 |     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
1263 |     engines: {node: '>= 8'}
1264 | 
1265 |   micromatch@4.0.8:
1266 |     resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
1267 |     engines: {node: '>=8.6'}
1268 | 
1269 |   minimatch@10.0.3:
1270 |     resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==}
1271 |     engines: {node: 20 || >=22}
1272 | 
1273 |   minimatch@3.1.2:
1274 |     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1275 | 
1276 |   minimatch@9.0.5:
1277 |     resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
1278 |     engines: {node: '>=16 || 14 >=14.17'}
1279 | 
1280 |   mkdirp@0.3.0:
1281 |     resolution: {integrity: sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==}
1282 |     deprecated: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)
1283 | 
1284 |   ms@2.1.3:
1285 |     resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
1286 | 
1287 |   multiocular@0.8.1:
1288 |     resolution: {integrity: sha512-gMSP/kBS/rEZwoHpREN9eOLQeePt/t4mkotP5GeWuzH7FkIDTf49Xr60+VvChF8tS0eD3rilq+JaVxtj6pdKfw==}
1289 |     engines: {node: ^22.16.0 || >=24.0.0}
1290 |     hasBin: true
1291 | 
1292 |   nanodelay@2.0.2:
1293 |     resolution: {integrity: sha512-6AS5aCSXsjoxq2Jr9CdaAeT60yoYDOTp6po9ziqeOeY6vf6uTEHYSqWql6EFILrM3fEfXgkZ4KqE9L0rTm/wlA==}
1294 |     engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
1295 | 
1296 |   nanoevents@9.1.0:
1297 |     resolution: {integrity: sha512-Jd0fILWG44a9luj8v5kED4WI+zfkkgwKyRQKItTtlPfEsh7Lznfi1kr8/iZ+XAIss4Qq5GqRB0qtWbaz9ceO/A==}
1298 |     engines: {node: ^18.0.0 || >=20.0.0}
1299 | 
1300 |   nanoid@3.3.11:
1301 |     resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
1302 |     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
1303 |     hasBin: true
1304 | 
1305 |   nanoid@5.1.5:
1306 |     resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==}
1307 |     engines: {node: ^18 || >=20}
1308 |     hasBin: true
1309 | 
1310 |   nanospinner@1.2.2:
1311 |     resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==}
1312 | 
1313 |   nanostores@1.0.1:
1314 |     resolution: {integrity: sha512-kNZ9xnoJYKg/AfxjrVL4SS0fKX++4awQReGqWnwTRHxeHGZ1FJFVgTqr/eMrNQdp0Tz7M7tG/TDaX8QfHDwVCw==}
1315 |     engines: {node: ^20.0.0 || >=22.0.0}
1316 | 
1317 |   napi-postinstall@0.3.4:
1318 |     resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==}
1319 |     engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
1320 |     hasBin: true
1321 | 
1322 |   natural-compare@1.4.0:
1323 |     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
1324 | 
1325 |   natural-orderby@5.0.0:
1326 |     resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==}
1327 |     engines: {node: '>=18'}
1328 | 
1329 |   nopt@1.0.10:
1330 |     resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==}
1331 |     hasBin: true
1332 | 
1333 |   optionator@0.9.4:
1334 |     resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
1335 |     engines: {node: '>= 0.8.0'}
1336 | 
1337 |   p-limit@3.1.0:
1338 |     resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
1339 |     engines: {node: '>=10'}
1340 | 
1341 |   p-locate@5.0.0:
1342 |     resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
1343 |     engines: {node: '>=10'}
1344 | 
1345 |   parent-module@1.0.1:
1346 |     resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1347 |     engines: {node: '>=6'}
1348 | 
1349 |   path-exists@4.0.0:
1350 |     resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1351 |     engines: {node: '>=8'}
1352 | 
1353 |   path-key@3.1.1:
1354 |     resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1355 |     engines: {node: '>=8'}
1356 | 
1357 |   path-parse@1.0.7:
1358 |     resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1359 | 
1360 |   picocolors@1.1.1:
1361 |     resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
1362 | 
1363 |   picomatch@2.3.1:
1364 |     resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1365 |     engines: {node: '>=8.6'}
1366 | 
1367 |   picomatch@4.0.2:
1368 |     resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
1369 |     engines: {node: '>=12'}
1370 | 
1371 |   picomatch@4.0.3:
1372 |     resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
1373 |     engines: {node: '>=12'}
1374 | 
1375 |   postcss@8.5.6:
1376 |     resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
1377 |     engines: {node: ^10 || ^12 || >=14}
1378 | 
1379 |   prelude-ls@1.2.1:
1380 |     resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1381 |     engines: {node: '>= 0.8.0'}
1382 | 
1383 |   punycode@2.3.1:
1384 |     resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1385 |     engines: {node: '>=6'}
1386 | 
1387 |   queue-microtask@1.2.3:
1388 |     resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1389 | 
1390 |   readdirp@4.1.2:
1391 |     resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
1392 |     engines: {node: '>= 14.18.0'}
1393 | 
1394 |   requireindex@1.2.0:
1395 |     resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==}
1396 |     engines: {node: '>=0.10.5'}
1397 | 
1398 |   resolve-from@4.0.0:
1399 |     resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1400 |     engines: {node: '>=4'}
1401 | 
1402 |   resolve-pkg-maps@1.0.0:
1403 |     resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
1404 | 
1405 |   resolve@1.22.10:
1406 |     resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
1407 |     engines: {node: '>= 0.4'}
1408 |     hasBin: true
1409 | 
1410 |   reusify@1.1.0:
1411 |     resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
1412 |     engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1413 | 
1414 |   rollup@4.52.5:
1415 |     resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
1416 |     engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1417 |     hasBin: true
1418 | 
1419 |   run-parallel@1.2.0:
1420 |     resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1421 | 
1422 |   semver@7.7.3:
1423 |     resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
1424 |     engines: {node: '>=10'}
1425 |     hasBin: true
1426 | 
1427 |   shebang-command@2.0.0:
1428 |     resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1429 |     engines: {node: '>=8'}
1430 | 
1431 |   shebang-regex@3.0.0:
1432 |     resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1433 |     engines: {node: '>=8'}
1434 | 
1435 |   size-limit@11.2.0:
1436 |     resolution: {integrity: sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==}
1437 |     engines: {node: ^18.0.0 || >=20.0.0}
1438 |     hasBin: true
1439 | 
1440 |   source-map-js@1.2.1:
1441 |     resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1442 |     engines: {node: '>=0.10.0'}
1443 | 
1444 |   stable-hash-x@0.2.0:
1445 |     resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==}
1446 |     engines: {node: '>=12.0.0'}
1447 | 
1448 |   strip-ansi@6.0.1:
1449 |     resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1450 |     engines: {node: '>=8'}
1451 | 
1452 |   strip-json-comments@3.1.1:
1453 |     resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1454 |     engines: {node: '>=8'}
1455 | 
1456 |   supports-color@7.2.0:
1457 |     resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1458 |     engines: {node: '>=8'}
1459 | 
1460 |   supports-preserve-symlinks-flag@1.0.0:
1461 |     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1462 |     engines: {node: '>= 0.4'}
1463 | 
1464 |   tapable@2.3.0:
1465 |     resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
1466 |     engines: {node: '>=6'}
1467 | 
1468 |   tinyglobby@0.2.14:
1469 |     resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==}
1470 |     engines: {node: '>=12.0.0'}
1471 | 
1472 |   tinyglobby@0.2.15:
1473 |     resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
1474 |     engines: {node: '>=12.0.0'}
1475 | 
1476 |   to-regex-range@5.0.1:
1477 |     resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1478 |     engines: {node: '>=8.0'}
1479 | 
1480 |   ts-api-utils@2.1.0:
1481 |     resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
1482 |     engines: {node: '>=18.12'}
1483 |     peerDependencies:
1484 |       typescript: '>=4.8.4'
1485 | 
1486 |   ts-declaration-location@1.0.7:
1487 |     resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==}
1488 |     peerDependencies:
1489 |       typescript: '>=4.0.0'
1490 | 
1491 |   tslib@2.8.1:
1492 |     resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
1493 | 
1494 |   tsx@4.20.6:
1495 |     resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==}
1496 |     engines: {node: '>=18.0.0'}
1497 |     hasBin: true
1498 | 
1499 |   type-check@0.4.0:
1500 |     resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1501 |     engines: {node: '>= 0.8.0'}
1502 | 
1503 |   typescript-eslint@8.46.1:
1504 |     resolution: {integrity: sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==}
1505 |     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
1506 |     peerDependencies:
1507 |       eslint: ^8.57.0 || ^9.0.0
1508 |       typescript: '>=4.8.4 <6.0.0'
1509 | 
1510 |   typescript@5.9.3:
1511 |     resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
1512 |     engines: {node: '>=14.17'}
1513 |     hasBin: true
1514 | 
1515 |   undici-types@6.21.0:
1516 |     resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
1517 | 
1518 |   undici-types@7.14.0:
1519 |     resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==}
1520 | 
1521 |   unist-util-stringify-position@4.0.0:
1522 |     resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
1523 | 
1524 |   unrs-resolver@1.11.1:
1525 |     resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==}
1526 | 
1527 |   uri-js@4.4.1:
1528 |     resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1529 | 
1530 |   url-pattern@1.0.3:
1531 |     resolution: {integrity: sha512-uQcEj/2puA4aq1R3A2+VNVBgaWYR24FdWjl7VNW83rnWftlhyzOZ/tBjezRiC2UkIzuxC8Top3IekN3vUf1WxA==}
1532 |     engines: {node: '>=0.12.0'}
1533 | 
1534 |   vfile-location@5.0.3:
1535 |     resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
1536 | 
1537 |   vfile-message@4.0.2:
1538 |     resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
1539 | 
1540 |   vfile@6.0.3:
1541 |     resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
1542 | 
1543 |   vite@7.1.10:
1544 |     resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==}
1545 |     engines: {node: ^20.19.0 || >=22.12.0}
1546 |     hasBin: true
1547 |     peerDependencies:
1548 |       '@types/node': ^20.19.0 || >=22.12.0
1549 |       jiti: '>=1.21.0'
1550 |       less: ^4.0.0
1551 |       lightningcss: ^1.21.0
1552 |       sass: ^1.70.0
1553 |       sass-embedded: ^1.70.0
1554 |       stylus: '>=0.54.8'
1555 |       sugarss: ^5.0.0
1556 |       terser: ^5.16.0
1557 |       tsx: ^4.8.1
1558 |       yaml: ^2.4.2
1559 |     peerDependenciesMeta:
1560 |       '@types/node':
1561 |         optional: true
1562 |       jiti:
1563 |         optional: true
1564 |       less:
1565 |         optional: true
1566 |       lightningcss:
1567 |         optional: true
1568 |       sass:
1569 |         optional: true
1570 |       sass-embedded:
1571 |         optional: true
1572 |       stylus:
1573 |         optional: true
1574 |       sugarss:
1575 |         optional: true
1576 |       terser:
1577 |         optional: true
1578 |       tsx:
1579 |         optional: true
1580 |       yaml:
1581 |         optional: true
1582 | 
1583 |   whatwg-mimetype@3.0.0:
1584 |     resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
1585 |     engines: {node: '>=12'}
1586 | 
1587 |   which@2.0.2:
1588 |     resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1589 |     engines: {node: '>= 8'}
1590 |     hasBin: true
1591 | 
1592 |   word-wrap@1.2.5:
1593 |     resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1594 |     engines: {node: '>=0.10.0'}
1595 | 
1596 |   ws@8.18.3:
1597 |     resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
1598 |     engines: {node: '>=10.0.0'}
1599 |     peerDependencies:
1600 |       bufferutil: ^4.0.1
1601 |       utf-8-validate: '>=5.0.2'
1602 |     peerDependenciesMeta:
1603 |       bufferutil:
1604 |         optional: true
1605 |       utf-8-validate:
1606 |         optional: true
1607 | 
1608 |   yaml@2.8.1:
1609 |     resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
1610 |     engines: {node: '>= 14.6'}
1611 |     hasBin: true
1612 | 
1613 |   yocto-queue@0.1.0:
1614 |     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
1615 |     engines: {node: '>=10'}
1616 | 
1617 | snapshots:
1618 | 
1619 |   '@emnapi/core@1.5.0':
1620 |     dependencies:
1621 |       '@emnapi/wasi-threads': 1.1.0
1622 |       tslib: 2.8.1
1623 |     optional: true
1624 | 
1625 |   '@emnapi/runtime@1.5.0':
1626 |     dependencies:
1627 |       tslib: 2.8.1
1628 |     optional: true
1629 | 
1630 |   '@emnapi/wasi-threads@1.1.0':
1631 |     dependencies:
1632 |       tslib: 2.8.1
1633 |     optional: true
1634 | 
1635 |   '@esbuild/aix-ppc64@0.25.11':
1636 |     optional: true
1637 | 
1638 |   '@esbuild/aix-ppc64@0.25.5':
1639 |     optional: true
1640 | 
1641 |   '@esbuild/android-arm64@0.25.11':
1642 |     optional: true
1643 | 
1644 |   '@esbuild/android-arm64@0.25.5':
1645 |     optional: true
1646 | 
1647 |   '@esbuild/android-arm@0.25.11':
1648 |     optional: true
1649 | 
1650 |   '@esbuild/android-arm@0.25.5':
1651 |     optional: true
1652 | 
1653 |   '@esbuild/android-x64@0.25.11':
1654 |     optional: true
1655 | 
1656 |   '@esbuild/android-x64@0.25.5':
1657 |     optional: true
1658 | 
1659 |   '@esbuild/darwin-arm64@0.25.11':
1660 |     optional: true
1661 | 
1662 |   '@esbuild/darwin-arm64@0.25.5':
1663 |     optional: true
1664 | 
1665 |   '@esbuild/darwin-x64@0.25.11':
1666 |     optional: true
1667 | 
1668 |   '@esbuild/darwin-x64@0.25.5':
1669 |     optional: true
1670 | 
1671 |   '@esbuild/freebsd-arm64@0.25.11':
1672 |     optional: true
1673 | 
1674 |   '@esbuild/freebsd-arm64@0.25.5':
1675 |     optional: true
1676 | 
1677 |   '@esbuild/freebsd-x64@0.25.11':
1678 |     optional: true
1679 | 
1680 |   '@esbuild/freebsd-x64@0.25.5':
1681 |     optional: true
1682 | 
1683 |   '@esbuild/linux-arm64@0.25.11':
1684 |     optional: true
1685 | 
1686 |   '@esbuild/linux-arm64@0.25.5':
1687 |     optional: true
1688 | 
1689 |   '@esbuild/linux-arm@0.25.11':
1690 |     optional: true
1691 | 
1692 |   '@esbuild/linux-arm@0.25.5':
1693 |     optional: true
1694 | 
1695 |   '@esbuild/linux-ia32@0.25.11':
1696 |     optional: true
1697 | 
1698 |   '@esbuild/linux-ia32@0.25.5':
1699 |     optional: true
1700 | 
1701 |   '@esbuild/linux-loong64@0.25.11':
1702 |     optional: true
1703 | 
1704 |   '@esbuild/linux-loong64@0.25.5':
1705 |     optional: true
1706 | 
1707 |   '@esbuild/linux-mips64el@0.25.11':
1708 |     optional: true
1709 | 
1710 |   '@esbuild/linux-mips64el@0.25.5':
1711 |     optional: true
1712 | 
1713 |   '@esbuild/linux-ppc64@0.25.11':
1714 |     optional: true
1715 | 
1716 |   '@esbuild/linux-ppc64@0.25.5':
1717 |     optional: true
1718 | 
1719 |   '@esbuild/linux-riscv64@0.25.11':
1720 |     optional: true
1721 | 
1722 |   '@esbuild/linux-riscv64@0.25.5':
1723 |     optional: true
1724 | 
1725 |   '@esbuild/linux-s390x@0.25.11':
1726 |     optional: true
1727 | 
1728 |   '@esbuild/linux-s390x@0.25.5':
1729 |     optional: true
1730 | 
1731 |   '@esbuild/linux-x64@0.25.11':
1732 |     optional: true
1733 | 
1734 |   '@esbuild/linux-x64@0.25.5':
1735 |     optional: true
1736 | 
1737 |   '@esbuild/netbsd-arm64@0.25.11':
1738 |     optional: true
1739 | 
1740 |   '@esbuild/netbsd-arm64@0.25.5':
1741 |     optional: true
1742 | 
1743 |   '@esbuild/netbsd-x64@0.25.11':
1744 |     optional: true
1745 | 
1746 |   '@esbuild/netbsd-x64@0.25.5':
1747 |     optional: true
1748 | 
1749 |   '@esbuild/openbsd-arm64@0.25.11':
1750 |     optional: true
1751 | 
1752 |   '@esbuild/openbsd-arm64@0.25.5':
1753 |     optional: true
1754 | 
1755 |   '@esbuild/openbsd-x64@0.25.11':
1756 |     optional: true
1757 | 
1758 |   '@esbuild/openbsd-x64@0.25.5':
1759 |     optional: true
1760 | 
1761 |   '@esbuild/openharmony-arm64@0.25.11':
1762 |     optional: true
1763 | 
1764 |   '@esbuild/sunos-x64@0.25.11':
1765 |     optional: true
1766 | 
1767 |   '@esbuild/sunos-x64@0.25.5':
1768 |     optional: true
1769 | 
1770 |   '@esbuild/win32-arm64@0.25.11':
1771 |     optional: true
1772 | 
1773 |   '@esbuild/win32-arm64@0.25.5':
1774 |     optional: true
1775 | 
1776 |   '@esbuild/win32-ia32@0.25.11':
1777 |     optional: true
1778 | 
1779 |   '@esbuild/win32-ia32@0.25.5':
1780 |     optional: true
1781 | 
1782 |   '@esbuild/win32-x64@0.25.11':
1783 |     optional: true
1784 | 
1785 |   '@esbuild/win32-x64@0.25.5':
1786 |     optional: true
1787 | 
1788 |   '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.4.2))':
1789 |     dependencies:
1790 |       eslint: 9.38.0(jiti@2.4.2)
1791 |       eslint-visitor-keys: 3.4.3
1792 | 
1793 |   '@eslint-community/regexpp@4.12.1': {}
1794 | 
1795 |   '@eslint/config-array@0.21.1':
1796 |     dependencies:
1797 |       '@eslint/object-schema': 2.1.7
1798 |       debug: 4.4.3
1799 |       minimatch: 3.1.2
1800 |     transitivePeerDependencies:
1801 |       - supports-color
1802 | 
1803 |   '@eslint/config-helpers@0.4.1':
1804 |     dependencies:
1805 |       '@eslint/core': 0.16.0
1806 | 
1807 |   '@eslint/core@0.16.0':
1808 |     dependencies:
1809 |       '@types/json-schema': 7.0.15
1810 | 
1811 |   '@eslint/eslintrc@3.3.1':
1812 |     dependencies:
1813 |       ajv: 6.12.6
1814 |       debug: 4.4.3
1815 |       espree: 10.4.0
1816 |       globals: 14.0.0
1817 |       ignore: 5.3.2
1818 |       import-fresh: 3.3.1
1819 |       js-yaml: 4.1.0
1820 |       minimatch: 3.1.2
1821 |       strip-json-comments: 3.1.1
1822 |     transitivePeerDependencies:
1823 |       - supports-color
1824 | 
1825 |   '@eslint/js@9.38.0': {}
1826 | 
1827 |   '@eslint/object-schema@2.1.7': {}
1828 | 
1829 |   '@eslint/plugin-kit@0.4.0':
1830 |     dependencies:
1831 |       '@eslint/core': 0.16.0
1832 |       levn: 0.4.1
1833 | 
1834 |   '@humanfs/core@0.19.1': {}
1835 | 
1836 |   '@humanfs/node@0.16.7':
1837 |     dependencies:
1838 |       '@humanfs/core': 0.19.1
1839 |       '@humanwhocodes/retry': 0.4.3
1840 | 
1841 |   '@humanwhocodes/module-importer@1.0.1': {}
1842 | 
1843 |   '@humanwhocodes/retry@0.4.3': {}
1844 | 
1845 |   '@isaacs/balanced-match@4.0.1': {}
1846 | 
1847 |   '@isaacs/brace-expansion@5.0.0':
1848 |     dependencies:
1849 |       '@isaacs/balanced-match': 4.0.1
1850 | 
1851 |   '@logux/actions@0.5.0(@logux/core@0.10.0)':
1852 |     dependencies:
1853 |       '@logux/core': 0.10.0
1854 | 
1855 |   '@logux/core@0.10.0':
1856 |     dependencies:
1857 |       nanoevents: 9.1.0
1858 | 
1859 |   '@logux/eslint-config@56.1.0(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)':
1860 |     dependencies:
1861 |       '@eslint/eslintrc': 3.3.1
1862 |       eslint: 9.38.0(jiti@2.4.2)
1863 |       eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.4.2))
1864 |       eslint-plugin-n: 17.23.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
1865 |       eslint-plugin-perfectionist: 4.15.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
1866 |       eslint-plugin-prefer-let: 4.0.0
1867 |       eslint-plugin-promise: 7.2.1(eslint@9.38.0(jiti@2.4.2))
1868 |       globals: 16.4.0
1869 |       typescript-eslint: 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
1870 |     transitivePeerDependencies:
1871 |       - '@typescript-eslint/utils'
1872 |       - eslint-import-resolver-node
1873 |       - supports-color
1874 |       - typescript
1875 | 
1876 |   '@logux/server@0.14.0':
1877 |     dependencies:
1878 |       '@logux/actions': 0.5.0(@logux/core@0.10.0)
1879 |       '@logux/core': 0.10.0
1880 |       cookie: 1.0.2
1881 |       fastq: 1.19.1
1882 |       nanoevents: 9.1.0
1883 |       nanoid: 5.1.5
1884 |       tinyglobby: 0.2.14
1885 |       url-pattern: 1.0.3
1886 |       ws: 8.18.3
1887 |     transitivePeerDependencies:
1888 |       - bufferutil
1889 |       - utf-8-validate
1890 | 
1891 |   '@napi-rs/wasm-runtime@0.2.12':
1892 |     dependencies:
1893 |       '@emnapi/core': 1.5.0
1894 |       '@emnapi/runtime': 1.5.0
1895 |       '@tybys/wasm-util': 0.10.1
1896 |     optional: true
1897 | 
1898 |   '@nodelib/fs.scandir@2.1.5':
1899 |     dependencies:
1900 |       '@nodelib/fs.stat': 2.0.5
1901 |       run-parallel: 1.2.0
1902 | 
1903 |   '@nodelib/fs.stat@2.0.5': {}
1904 | 
1905 |   '@nodelib/fs.walk@1.2.8':
1906 |     dependencies:
1907 |       '@nodelib/fs.scandir': 2.1.5
1908 |       fastq: 1.19.1
1909 | 
1910 |   '@rollup/rollup-android-arm-eabi@4.52.5':
1911 |     optional: true
1912 | 
1913 |   '@rollup/rollup-android-arm64@4.52.5':
1914 |     optional: true
1915 | 
1916 |   '@rollup/rollup-darwin-arm64@4.52.5':
1917 |     optional: true
1918 | 
1919 |   '@rollup/rollup-darwin-x64@4.52.5':
1920 |     optional: true
1921 | 
1922 |   '@rollup/rollup-freebsd-arm64@4.52.5':
1923 |     optional: true
1924 | 
1925 |   '@rollup/rollup-freebsd-x64@4.52.5':
1926 |     optional: true
1927 | 
1928 |   '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
1929 |     optional: true
1930 | 
1931 |   '@rollup/rollup-linux-arm-musleabihf@4.52.5':
1932 |     optional: true
1933 | 
1934 |   '@rollup/rollup-linux-arm64-gnu@4.52.5':
1935 |     optional: true
1936 | 
1937 |   '@rollup/rollup-linux-arm64-musl@4.52.5':
1938 |     optional: true
1939 | 
1940 |   '@rollup/rollup-linux-loong64-gnu@4.52.5':
1941 |     optional: true
1942 | 
1943 |   '@rollup/rollup-linux-ppc64-gnu@4.52.5':
1944 |     optional: true
1945 | 
1946 |   '@rollup/rollup-linux-riscv64-gnu@4.52.5':
1947 |     optional: true
1948 | 
1949 |   '@rollup/rollup-linux-riscv64-musl@4.52.5':
1950 |     optional: true
1951 | 
1952 |   '@rollup/rollup-linux-s390x-gnu@4.52.5':
1953 |     optional: true
1954 | 
1955 |   '@rollup/rollup-linux-x64-gnu@4.52.5':
1956 |     optional: true
1957 | 
1958 |   '@rollup/rollup-linux-x64-musl@4.52.5':
1959 |     optional: true
1960 | 
1961 |   '@rollup/rollup-openharmony-arm64@4.52.5':
1962 |     optional: true
1963 | 
1964 |   '@rollup/rollup-win32-arm64-msvc@4.52.5':
1965 |     optional: true
1966 | 
1967 |   '@rollup/rollup-win32-ia32-msvc@4.52.5':
1968 |     optional: true
1969 | 
1970 |   '@rollup/rollup-win32-x64-gnu@4.52.5':
1971 |     optional: true
1972 | 
1973 |   '@rollup/rollup-win32-x64-msvc@4.52.5':
1974 |     optional: true
1975 | 
1976 |   '@size-limit/esbuild@11.2.0(size-limit@11.2.0)':
1977 |     dependencies:
1978 |       esbuild: 0.25.5
1979 |       nanoid: 5.1.5
1980 |       size-limit: 11.2.0
1981 | 
1982 |   '@size-limit/file@11.2.0(size-limit@11.2.0)':
1983 |     dependencies:
1984 |       size-limit: 11.2.0
1985 | 
1986 |   '@size-limit/preset-small-lib@11.2.0(size-limit@11.2.0)':
1987 |     dependencies:
1988 |       '@size-limit/esbuild': 11.2.0(size-limit@11.2.0)
1989 |       '@size-limit/file': 11.2.0(size-limit@11.2.0)
1990 |       size-limit: 11.2.0
1991 | 
1992 |   '@tybys/wasm-util@0.10.1':
1993 |     dependencies:
1994 |       tslib: 2.8.1
1995 |     optional: true
1996 | 
1997 |   '@types/estree@1.0.8': {}
1998 | 
1999 |   '@types/json-schema@7.0.15': {}
2000 | 
2001 |   '@types/node@20.19.22':
2002 |     dependencies:
2003 |       undici-types: 6.21.0
2004 | 
2005 |   '@types/node@24.8.1':
2006 |     dependencies:
2007 |       undici-types: 7.14.0
2008 | 
2009 |   '@types/trusted-types@2.0.7':
2010 |     optional: true
2011 | 
2012 |   '@types/unist@3.0.3': {}
2013 | 
2014 |   '@types/whatwg-mimetype@3.0.2': {}
2015 | 
2016 |   '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)':
2017 |     dependencies:
2018 |       '@eslint-community/regexpp': 4.12.1
2019 |       '@typescript-eslint/parser': 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2020 |       '@typescript-eslint/scope-manager': 8.46.1
2021 |       '@typescript-eslint/type-utils': 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2022 |       '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2023 |       '@typescript-eslint/visitor-keys': 8.46.1
2024 |       eslint: 9.38.0(jiti@2.4.2)
2025 |       graphemer: 1.4.0
2026 |       ignore: 7.0.5
2027 |       natural-compare: 1.4.0
2028 |       ts-api-utils: 2.1.0(typescript@5.9.3)
2029 |       typescript: 5.9.3
2030 |     transitivePeerDependencies:
2031 |       - supports-color
2032 | 
2033 |   '@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)':
2034 |     dependencies:
2035 |       '@typescript-eslint/scope-manager': 8.46.1
2036 |       '@typescript-eslint/types': 8.46.1
2037 |       '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3)
2038 |       '@typescript-eslint/visitor-keys': 8.46.1
2039 |       debug: 4.4.3
2040 |       eslint: 9.38.0(jiti@2.4.2)
2041 |       typescript: 5.9.3
2042 |     transitivePeerDependencies:
2043 |       - supports-color
2044 | 
2045 |   '@typescript-eslint/project-service@8.46.1(typescript@5.9.3)':
2046 |     dependencies:
2047 |       '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3)
2048 |       '@typescript-eslint/types': 8.46.1
2049 |       debug: 4.4.3
2050 |       typescript: 5.9.3
2051 |     transitivePeerDependencies:
2052 |       - supports-color
2053 | 
2054 |   '@typescript-eslint/scope-manager@8.46.1':
2055 |     dependencies:
2056 |       '@typescript-eslint/types': 8.46.1
2057 |       '@typescript-eslint/visitor-keys': 8.46.1
2058 | 
2059 |   '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3)':
2060 |     dependencies:
2061 |       typescript: 5.9.3
2062 | 
2063 |   '@typescript-eslint/type-utils@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)':
2064 |     dependencies:
2065 |       '@typescript-eslint/types': 8.46.1
2066 |       '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3)
2067 |       '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2068 |       debug: 4.4.3
2069 |       eslint: 9.38.0(jiti@2.4.2)
2070 |       ts-api-utils: 2.1.0(typescript@5.9.3)
2071 |       typescript: 5.9.3
2072 |     transitivePeerDependencies:
2073 |       - supports-color
2074 | 
2075 |   '@typescript-eslint/types@8.46.1': {}
2076 | 
2077 |   '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3)':
2078 |     dependencies:
2079 |       '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3)
2080 |       '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3)
2081 |       '@typescript-eslint/types': 8.46.1
2082 |       '@typescript-eslint/visitor-keys': 8.46.1
2083 |       debug: 4.4.3
2084 |       fast-glob: 3.3.3
2085 |       is-glob: 4.0.3
2086 |       minimatch: 9.0.5
2087 |       semver: 7.7.3
2088 |       ts-api-utils: 2.1.0(typescript@5.9.3)
2089 |       typescript: 5.9.3
2090 |     transitivePeerDependencies:
2091 |       - supports-color
2092 | 
2093 |   '@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)':
2094 |     dependencies:
2095 |       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.4.2))
2096 |       '@typescript-eslint/scope-manager': 8.46.1
2097 |       '@typescript-eslint/types': 8.46.1
2098 |       '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3)
2099 |       eslint: 9.38.0(jiti@2.4.2)
2100 |       typescript: 5.9.3
2101 |     transitivePeerDependencies:
2102 |       - supports-color
2103 | 
2104 |   '@typescript-eslint/visitor-keys@8.46.1':
2105 |     dependencies:
2106 |       '@typescript-eslint/types': 8.46.1
2107 |       eslint-visitor-keys: 4.2.1
2108 | 
2109 |   '@unrs/resolver-binding-android-arm-eabi@1.11.1':
2110 |     optional: true
2111 | 
2112 |   '@unrs/resolver-binding-android-arm64@1.11.1':
2113 |     optional: true
2114 | 
2115 |   '@unrs/resolver-binding-darwin-arm64@1.11.1':
2116 |     optional: true
2117 | 
2118 |   '@unrs/resolver-binding-darwin-x64@1.11.1':
2119 |     optional: true
2120 | 
2121 |   '@unrs/resolver-binding-freebsd-x64@1.11.1':
2122 |     optional: true
2123 | 
2124 |   '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1':
2125 |     optional: true
2126 | 
2127 |   '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1':
2128 |     optional: true
2129 | 
2130 |   '@unrs/resolver-binding-linux-arm64-gnu@1.11.1':
2131 |     optional: true
2132 | 
2133 |   '@unrs/resolver-binding-linux-arm64-musl@1.11.1':
2134 |     optional: true
2135 | 
2136 |   '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
2137 |     optional: true
2138 | 
2139 |   '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
2140 |     optional: true
2141 | 
2142 |   '@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
2143 |     optional: true
2144 | 
2145 |   '@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
2146 |     optional: true
2147 | 
2148 |   '@unrs/resolver-binding-linux-x64-gnu@1.11.1':
2149 |     optional: true
2150 | 
2151 |   '@unrs/resolver-binding-linux-x64-musl@1.11.1':
2152 |     optional: true
2153 | 
2154 |   '@unrs/resolver-binding-wasm32-wasi@1.11.1':
2155 |     dependencies:
2156 |       '@napi-rs/wasm-runtime': 0.2.12
2157 |     optional: true
2158 | 
2159 |   '@unrs/resolver-binding-win32-arm64-msvc@1.11.1':
2160 |     optional: true
2161 | 
2162 |   '@unrs/resolver-binding-win32-ia32-msvc@1.11.1':
2163 |     optional: true
2164 | 
2165 |   '@unrs/resolver-binding-win32-x64-msvc@1.11.1':
2166 |     optional: true
2167 | 
2168 |   abbrev@1.1.1: {}
2169 | 
2170 |   acorn-jsx@5.3.2(acorn@8.15.0):
2171 |     dependencies:
2172 |       acorn: 8.15.0
2173 | 
2174 |   acorn@8.15.0: {}
2175 | 
2176 |   actions-up@1.4.2:
2177 |     dependencies:
2178 |       cac: 6.7.14
2179 |       enquirer: 2.4.1
2180 |       nanospinner: 1.2.2
2181 |       picocolors: 1.1.1
2182 |       semver: 7.7.3
2183 |       yaml: 2.8.1
2184 | 
2185 |   ajv@6.12.6:
2186 |     dependencies:
2187 |       fast-deep-equal: 3.1.3
2188 |       fast-json-stable-stringify: 2.1.0
2189 |       json-schema-traverse: 0.4.1
2190 |       uri-js: 4.4.1
2191 | 
2192 |   ansi-colors@4.1.3: {}
2193 | 
2194 |   ansi-regex@5.0.1: {}
2195 | 
2196 |   ansi-styles@4.3.0:
2197 |     dependencies:
2198 |       color-convert: 2.0.1
2199 | 
2200 |   argparse@2.0.1: {}
2201 | 
2202 |   balanced-match@1.0.2: {}
2203 | 
2204 |   better-node-test@0.8.3: {}
2205 | 
2206 |   brace-expansion@1.1.12:
2207 |     dependencies:
2208 |       balanced-match: 1.0.2
2209 |       concat-map: 0.0.1
2210 | 
2211 |   brace-expansion@2.0.2:
2212 |     dependencies:
2213 |       balanced-match: 1.0.2
2214 | 
2215 |   braces@3.0.3:
2216 |     dependencies:
2217 |       fill-range: 7.1.1
2218 | 
2219 |   bytes-iec@3.1.1: {}
2220 | 
2221 |   cac@6.7.14: {}
2222 | 
2223 |   callsites@3.1.0: {}
2224 | 
2225 |   chalk@4.1.2:
2226 |     dependencies:
2227 |       ansi-styles: 4.3.0
2228 |       supports-color: 7.2.0
2229 | 
2230 |   check-dts@0.9.0(typescript@5.9.3):
2231 |     dependencies:
2232 |       fast-glob: 3.3.3
2233 |       nanospinner: 1.2.2
2234 |       picocolors: 1.1.1
2235 |       typescript: 5.9.3
2236 |       vfile-location: 5.0.3
2237 | 
2238 |   chokidar@4.0.3:
2239 |     dependencies:
2240 |       readdirp: 4.1.2
2241 | 
2242 |   clean-publish@5.2.2:
2243 |     dependencies:
2244 |       cross-spawn: 7.0.6
2245 |       fast-glob: 3.3.3
2246 |       lilconfig: 3.1.3
2247 |       micromatch: 4.0.8
2248 | 
2249 |   color-convert@2.0.1:
2250 |     dependencies:
2251 |       color-name: 1.1.4
2252 | 
2253 |   color-name@1.1.4: {}
2254 | 
2255 |   comment-parser@1.4.1: {}
2256 | 
2257 |   concat-map@0.0.1: {}
2258 | 
2259 |   cookie@1.0.2: {}
2260 | 
2261 |   cross-spawn@7.0.6:
2262 |     dependencies:
2263 |       path-key: 3.1.1
2264 |       shebang-command: 2.0.0
2265 |       which: 2.0.2
2266 | 
2267 |   debug@3.2.7:
2268 |     dependencies:
2269 |       ms: 2.1.3
2270 |     optional: true
2271 | 
2272 |   debug@4.4.3:
2273 |     dependencies:
2274 |       ms: 2.1.3
2275 | 
2276 |   deep-is@0.1.4: {}
2277 | 
2278 |   diff2html@3.4.52:
2279 |     dependencies:
2280 |       diff: 7.0.0
2281 |       hogan.js: 3.0.2
2282 |     optionalDependencies:
2283 |       highlight.js: 11.9.0
2284 | 
2285 |   diff@7.0.0: {}
2286 | 
2287 |   dompurify@3.3.0:
2288 |     optionalDependencies:
2289 |       '@types/trusted-types': 2.0.7
2290 | 
2291 |   enhanced-resolve@5.18.3:
2292 |     dependencies:
2293 |       graceful-fs: 4.2.11
2294 |       tapable: 2.3.0
2295 | 
2296 |   enquirer@2.4.1:
2297 |     dependencies:
2298 |       ansi-colors: 4.1.3
2299 |       strip-ansi: 6.0.1
2300 | 
2301 |   esbuild@0.25.11:
2302 |     optionalDependencies:
2303 |       '@esbuild/aix-ppc64': 0.25.11
2304 |       '@esbuild/android-arm': 0.25.11
2305 |       '@esbuild/android-arm64': 0.25.11
2306 |       '@esbuild/android-x64': 0.25.11
2307 |       '@esbuild/darwin-arm64': 0.25.11
2308 |       '@esbuild/darwin-x64': 0.25.11
2309 |       '@esbuild/freebsd-arm64': 0.25.11
2310 |       '@esbuild/freebsd-x64': 0.25.11
2311 |       '@esbuild/linux-arm': 0.25.11
2312 |       '@esbuild/linux-arm64': 0.25.11
2313 |       '@esbuild/linux-ia32': 0.25.11
2314 |       '@esbuild/linux-loong64': 0.25.11
2315 |       '@esbuild/linux-mips64el': 0.25.11
2316 |       '@esbuild/linux-ppc64': 0.25.11
2317 |       '@esbuild/linux-riscv64': 0.25.11
2318 |       '@esbuild/linux-s390x': 0.25.11
2319 |       '@esbuild/linux-x64': 0.25.11
2320 |       '@esbuild/netbsd-arm64': 0.25.11
2321 |       '@esbuild/netbsd-x64': 0.25.11
2322 |       '@esbuild/openbsd-arm64': 0.25.11
2323 |       '@esbuild/openbsd-x64': 0.25.11
2324 |       '@esbuild/openharmony-arm64': 0.25.11
2325 |       '@esbuild/sunos-x64': 0.25.11
2326 |       '@esbuild/win32-arm64': 0.25.11
2327 |       '@esbuild/win32-ia32': 0.25.11
2328 |       '@esbuild/win32-x64': 0.25.11
2329 | 
2330 |   esbuild@0.25.5:
2331 |     optionalDependencies:
2332 |       '@esbuild/aix-ppc64': 0.25.5
2333 |       '@esbuild/android-arm': 0.25.5
2334 |       '@esbuild/android-arm64': 0.25.5
2335 |       '@esbuild/android-x64': 0.25.5
2336 |       '@esbuild/darwin-arm64': 0.25.5
2337 |       '@esbuild/darwin-x64': 0.25.5
2338 |       '@esbuild/freebsd-arm64': 0.25.5
2339 |       '@esbuild/freebsd-x64': 0.25.5
2340 |       '@esbuild/linux-arm': 0.25.5
2341 |       '@esbuild/linux-arm64': 0.25.5
2342 |       '@esbuild/linux-ia32': 0.25.5
2343 |       '@esbuild/linux-loong64': 0.25.5
2344 |       '@esbuild/linux-mips64el': 0.25.5
2345 |       '@esbuild/linux-ppc64': 0.25.5
2346 |       '@esbuild/linux-riscv64': 0.25.5
2347 |       '@esbuild/linux-s390x': 0.25.5
2348 |       '@esbuild/linux-x64': 0.25.5
2349 |       '@esbuild/netbsd-arm64': 0.25.5
2350 |       '@esbuild/netbsd-x64': 0.25.5
2351 |       '@esbuild/openbsd-arm64': 0.25.5
2352 |       '@esbuild/openbsd-x64': 0.25.5
2353 |       '@esbuild/sunos-x64': 0.25.5
2354 |       '@esbuild/win32-arm64': 0.25.5
2355 |       '@esbuild/win32-ia32': 0.25.5
2356 |       '@esbuild/win32-x64': 0.25.5
2357 | 
2358 |   escape-string-regexp@4.0.0: {}
2359 | 
2360 |   eslint-compat-utils@0.5.1(eslint@9.38.0(jiti@2.4.2)):
2361 |     dependencies:
2362 |       eslint: 9.38.0(jiti@2.4.2)
2363 |       semver: 7.7.3
2364 | 
2365 |   eslint-import-context@0.1.9(unrs-resolver@1.11.1):
2366 |     dependencies:
2367 |       get-tsconfig: 4.12.0
2368 |       stable-hash-x: 0.2.0
2369 |     optionalDependencies:
2370 |       unrs-resolver: 1.11.1
2371 | 
2372 |   eslint-import-resolver-node@0.3.9:
2373 |     dependencies:
2374 |       debug: 3.2.7
2375 |       is-core-module: 2.16.1
2376 |       resolve: 1.22.10
2377 |     transitivePeerDependencies:
2378 |       - supports-color
2379 |     optional: true
2380 | 
2381 |   eslint-plugin-es-x@7.8.0(eslint@9.38.0(jiti@2.4.2)):
2382 |     dependencies:
2383 |       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.4.2))
2384 |       '@eslint-community/regexpp': 4.12.1
2385 |       eslint: 9.38.0(jiti@2.4.2)
2386 |       eslint-compat-utils: 0.5.1(eslint@9.38.0(jiti@2.4.2))
2387 | 
2388 |   eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0(jiti@2.4.2)):
2389 |     dependencies:
2390 |       '@typescript-eslint/types': 8.46.1
2391 |       comment-parser: 1.4.1
2392 |       debug: 4.4.3
2393 |       eslint: 9.38.0(jiti@2.4.2)
2394 |       eslint-import-context: 0.1.9(unrs-resolver@1.11.1)
2395 |       is-glob: 4.0.3
2396 |       minimatch: 10.0.3
2397 |       semver: 7.7.3
2398 |       stable-hash-x: 0.2.0
2399 |       unrs-resolver: 1.11.1
2400 |     optionalDependencies:
2401 |       '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2402 |       eslint-import-resolver-node: 0.3.9
2403 |     transitivePeerDependencies:
2404 |       - supports-color
2405 | 
2406 |   eslint-plugin-n@17.23.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3):
2407 |     dependencies:
2408 |       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.4.2))
2409 |       enhanced-resolve: 5.18.3
2410 |       eslint: 9.38.0(jiti@2.4.2)
2411 |       eslint-plugin-es-x: 7.8.0(eslint@9.38.0(jiti@2.4.2))
2412 |       get-tsconfig: 4.12.0
2413 |       globals: 15.15.0
2414 |       globrex: 0.1.2
2415 |       ignore: 5.3.2
2416 |       semver: 7.7.3
2417 |       ts-declaration-location: 1.0.7(typescript@5.9.3)
2418 |     transitivePeerDependencies:
2419 |       - typescript
2420 | 
2421 |   eslint-plugin-perfectionist@4.15.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3):
2422 |     dependencies:
2423 |       '@typescript-eslint/types': 8.46.1
2424 |       '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2425 |       eslint: 9.38.0(jiti@2.4.2)
2426 |       natural-orderby: 5.0.0
2427 |     transitivePeerDependencies:
2428 |       - supports-color
2429 |       - typescript
2430 | 
2431 |   eslint-plugin-prefer-let@4.0.0:
2432 |     dependencies:
2433 |       requireindex: 1.2.0
2434 | 
2435 |   eslint-plugin-promise@7.2.1(eslint@9.38.0(jiti@2.4.2)):
2436 |     dependencies:
2437 |       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.4.2))
2438 |       eslint: 9.38.0(jiti@2.4.2)
2439 | 
2440 |   eslint-scope@8.4.0:
2441 |     dependencies:
2442 |       esrecurse: 4.3.0
2443 |       estraverse: 5.3.0
2444 | 
2445 |   eslint-visitor-keys@3.4.3: {}
2446 | 
2447 |   eslint-visitor-keys@4.2.1: {}
2448 | 
2449 |   eslint@9.38.0(jiti@2.4.2):
2450 |     dependencies:
2451 |       '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.4.2))
2452 |       '@eslint-community/regexpp': 4.12.1
2453 |       '@eslint/config-array': 0.21.1
2454 |       '@eslint/config-helpers': 0.4.1
2455 |       '@eslint/core': 0.16.0
2456 |       '@eslint/eslintrc': 3.3.1
2457 |       '@eslint/js': 9.38.0
2458 |       '@eslint/plugin-kit': 0.4.0
2459 |       '@humanfs/node': 0.16.7
2460 |       '@humanwhocodes/module-importer': 1.0.1
2461 |       '@humanwhocodes/retry': 0.4.3
2462 |       '@types/estree': 1.0.8
2463 |       ajv: 6.12.6
2464 |       chalk: 4.1.2
2465 |       cross-spawn: 7.0.6
2466 |       debug: 4.4.3
2467 |       escape-string-regexp: 4.0.0
2468 |       eslint-scope: 8.4.0
2469 |       eslint-visitor-keys: 4.2.1
2470 |       espree: 10.4.0
2471 |       esquery: 1.6.0
2472 |       esutils: 2.0.3
2473 |       fast-deep-equal: 3.1.3
2474 |       file-entry-cache: 8.0.0
2475 |       find-up: 5.0.0
2476 |       glob-parent: 6.0.2
2477 |       ignore: 5.3.2
2478 |       imurmurhash: 0.1.4
2479 |       is-glob: 4.0.3
2480 |       json-stable-stringify-without-jsonify: 1.0.1
2481 |       lodash.merge: 4.6.2
2482 |       minimatch: 3.1.2
2483 |       natural-compare: 1.4.0
2484 |       optionator: 0.9.4
2485 |     optionalDependencies:
2486 |       jiti: 2.4.2
2487 |     transitivePeerDependencies:
2488 |       - supports-color
2489 | 
2490 |   espree@10.4.0:
2491 |     dependencies:
2492 |       acorn: 8.15.0
2493 |       acorn-jsx: 5.3.2(acorn@8.15.0)
2494 |       eslint-visitor-keys: 4.2.1
2495 | 
2496 |   esquery@1.6.0:
2497 |     dependencies:
2498 |       estraverse: 5.3.0
2499 | 
2500 |   esrecurse@4.3.0:
2501 |     dependencies:
2502 |       estraverse: 5.3.0
2503 | 
2504 |   estraverse@5.3.0: {}
2505 | 
2506 |   esutils@2.0.3: {}
2507 | 
2508 |   fast-deep-equal@3.1.3: {}
2509 | 
2510 |   fast-glob@3.3.3:
2511 |     dependencies:
2512 |       '@nodelib/fs.stat': 2.0.5
2513 |       '@nodelib/fs.walk': 1.2.8
2514 |       glob-parent: 5.1.2
2515 |       merge2: 1.4.1
2516 |       micromatch: 4.0.8
2517 | 
2518 |   fast-json-stable-stringify@2.1.0: {}
2519 | 
2520 |   fast-levenshtein@2.0.6: {}
2521 | 
2522 |   fastq@1.19.1:
2523 |     dependencies:
2524 |       reusify: 1.1.0
2525 | 
2526 |   fdir@6.4.6(picomatch@4.0.2):
2527 |     optionalDependencies:
2528 |       picomatch: 4.0.2
2529 | 
2530 |   fdir@6.5.0(picomatch@4.0.3):
2531 |     optionalDependencies:
2532 |       picomatch: 4.0.3
2533 | 
2534 |   file-entry-cache@8.0.0:
2535 |     dependencies:
2536 |       flat-cache: 4.0.1
2537 | 
2538 |   fill-range@7.1.1:
2539 |     dependencies:
2540 |       to-regex-range: 5.0.1
2541 | 
2542 |   find-up@5.0.0:
2543 |     dependencies:
2544 |       locate-path: 6.0.0
2545 |       path-exists: 4.0.0
2546 | 
2547 |   flat-cache@4.0.1:
2548 |     dependencies:
2549 |       flatted: 3.3.3
2550 |       keyv: 4.5.4
2551 | 
2552 |   flatted@3.3.3: {}
2553 | 
2554 |   fsevents@2.3.3:
2555 |     optional: true
2556 | 
2557 |   function-bind@1.1.2:
2558 |     optional: true
2559 | 
2560 |   get-tsconfig@4.12.0:
2561 |     dependencies:
2562 |       resolve-pkg-maps: 1.0.0
2563 | 
2564 |   glob-parent@5.1.2:
2565 |     dependencies:
2566 |       is-glob: 4.0.3
2567 | 
2568 |   glob-parent@6.0.2:
2569 |     dependencies:
2570 |       is-glob: 4.0.3
2571 | 
2572 |   globals@14.0.0: {}
2573 | 
2574 |   globals@15.15.0: {}
2575 | 
2576 |   globals@16.4.0: {}
2577 | 
2578 |   globrex@0.1.2: {}
2579 | 
2580 |   graceful-fs@4.2.11: {}
2581 | 
2582 |   graphemer@1.4.0: {}
2583 | 
2584 |   happy-dom@20.0.5:
2585 |     dependencies:
2586 |       '@types/node': 20.19.22
2587 |       '@types/whatwg-mimetype': 3.0.2
2588 |       whatwg-mimetype: 3.0.0
2589 | 
2590 |   has-flag@4.0.0: {}
2591 | 
2592 |   hasown@2.0.2:
2593 |     dependencies:
2594 |       function-bind: 1.1.2
2595 |     optional: true
2596 | 
2597 |   highlight.js@11.11.1: {}
2598 | 
2599 |   highlight.js@11.9.0:
2600 |     optional: true
2601 | 
2602 |   hogan.js@3.0.2:
2603 |     dependencies:
2604 |       mkdirp: 0.3.0
2605 |       nopt: 1.0.10
2606 | 
2607 |   ignore@5.3.2: {}
2608 | 
2609 |   ignore@7.0.5: {}
2610 | 
2611 |   import-fresh@3.3.1:
2612 |     dependencies:
2613 |       parent-module: 1.0.1
2614 |       resolve-from: 4.0.0
2615 | 
2616 |   imurmurhash@0.1.4: {}
2617 | 
2618 |   is-core-module@2.16.1:
2619 |     dependencies:
2620 |       hasown: 2.0.2
2621 |     optional: true
2622 | 
2623 |   is-extglob@2.1.1: {}
2624 | 
2625 |   is-glob@4.0.3:
2626 |     dependencies:
2627 |       is-extglob: 2.1.1
2628 | 
2629 |   is-number@7.0.0: {}
2630 | 
2631 |   isexe@2.0.0: {}
2632 | 
2633 |   jiti@2.4.2: {}
2634 | 
2635 |   js-yaml@4.1.0:
2636 |     dependencies:
2637 |       argparse: 2.0.1
2638 | 
2639 |   json-buffer@3.0.1: {}
2640 | 
2641 |   json-schema-traverse@0.4.1: {}
2642 | 
2643 |   json-stable-stringify-without-jsonify@1.0.1: {}
2644 | 
2645 |   keyv@4.5.4:
2646 |     dependencies:
2647 |       json-buffer: 3.0.1
2648 | 
2649 |   levn@0.4.1:
2650 |     dependencies:
2651 |       prelude-ls: 1.2.1
2652 |       type-check: 0.4.0
2653 | 
2654 |   lilconfig@3.1.3: {}
2655 | 
2656 |   locate-path@6.0.0:
2657 |     dependencies:
2658 |       p-locate: 5.0.0
2659 | 
2660 |   lodash.merge@4.6.2: {}
2661 | 
2662 |   marked@16.4.1: {}
2663 | 
2664 |   merge2@1.4.1: {}
2665 | 
2666 |   micromatch@4.0.8:
2667 |     dependencies:
2668 |       braces: 3.0.3
2669 |       picomatch: 2.3.1
2670 | 
2671 |   minimatch@10.0.3:
2672 |     dependencies:
2673 |       '@isaacs/brace-expansion': 5.0.0
2674 | 
2675 |   minimatch@3.1.2:
2676 |     dependencies:
2677 |       brace-expansion: 1.1.12
2678 | 
2679 |   minimatch@9.0.5:
2680 |     dependencies:
2681 |       brace-expansion: 2.0.2
2682 | 
2683 |   mkdirp@0.3.0: {}
2684 | 
2685 |   ms@2.1.3: {}
2686 | 
2687 |   multiocular@0.8.1:
2688 |     dependencies:
2689 |       '@logux/server': 0.14.0
2690 |       diff2html: 3.4.52
2691 |       dompurify: 3.3.0
2692 |       highlight.js: 11.11.1
2693 |       marked: 16.4.1
2694 |       nanostores: 1.0.1
2695 |       yaml: 2.8.1
2696 |     transitivePeerDependencies:
2697 |       - bufferutil
2698 |       - utf-8-validate
2699 | 
2700 |   nanodelay@2.0.2: {}
2701 | 
2702 |   nanoevents@9.1.0: {}
2703 | 
2704 |   nanoid@3.3.11: {}
2705 | 
2706 |   nanoid@5.1.5: {}
2707 | 
2708 |   nanospinner@1.2.2:
2709 |     dependencies:
2710 |       picocolors: 1.1.1
2711 | 
2712 |   nanostores@1.0.1: {}
2713 | 
2714 |   napi-postinstall@0.3.4: {}
2715 | 
2716 |   natural-compare@1.4.0: {}
2717 | 
2718 |   natural-orderby@5.0.0: {}
2719 | 
2720 |   nopt@1.0.10:
2721 |     dependencies:
2722 |       abbrev: 1.1.1
2723 | 
2724 |   optionator@0.9.4:
2725 |     dependencies:
2726 |       deep-is: 0.1.4
2727 |       fast-levenshtein: 2.0.6
2728 |       levn: 0.4.1
2729 |       prelude-ls: 1.2.1
2730 |       type-check: 0.4.0
2731 |       word-wrap: 1.2.5
2732 | 
2733 |   p-limit@3.1.0:
2734 |     dependencies:
2735 |       yocto-queue: 0.1.0
2736 | 
2737 |   p-locate@5.0.0:
2738 |     dependencies:
2739 |       p-limit: 3.1.0
2740 | 
2741 |   parent-module@1.0.1:
2742 |     dependencies:
2743 |       callsites: 3.1.0
2744 | 
2745 |   path-exists@4.0.0: {}
2746 | 
2747 |   path-key@3.1.1: {}
2748 | 
2749 |   path-parse@1.0.7:
2750 |     optional: true
2751 | 
2752 |   picocolors@1.1.1: {}
2753 | 
2754 |   picomatch@2.3.1: {}
2755 | 
2756 |   picomatch@4.0.2: {}
2757 | 
2758 |   picomatch@4.0.3: {}
2759 | 
2760 |   postcss@8.5.6:
2761 |     dependencies:
2762 |       nanoid: 3.3.11
2763 |       picocolors: 1.1.1
2764 |       source-map-js: 1.2.1
2765 | 
2766 |   prelude-ls@1.2.1: {}
2767 | 
2768 |   punycode@2.3.1: {}
2769 | 
2770 |   queue-microtask@1.2.3: {}
2771 | 
2772 |   readdirp@4.1.2: {}
2773 | 
2774 |   requireindex@1.2.0: {}
2775 | 
2776 |   resolve-from@4.0.0: {}
2777 | 
2778 |   resolve-pkg-maps@1.0.0: {}
2779 | 
2780 |   resolve@1.22.10:
2781 |     dependencies:
2782 |       is-core-module: 2.16.1
2783 |       path-parse: 1.0.7
2784 |       supports-preserve-symlinks-flag: 1.0.0
2785 |     optional: true
2786 | 
2787 |   reusify@1.1.0: {}
2788 | 
2789 |   rollup@4.52.5:
2790 |     dependencies:
2791 |       '@types/estree': 1.0.8
2792 |     optionalDependencies:
2793 |       '@rollup/rollup-android-arm-eabi': 4.52.5
2794 |       '@rollup/rollup-android-arm64': 4.52.5
2795 |       '@rollup/rollup-darwin-arm64': 4.52.5
2796 |       '@rollup/rollup-darwin-x64': 4.52.5
2797 |       '@rollup/rollup-freebsd-arm64': 4.52.5
2798 |       '@rollup/rollup-freebsd-x64': 4.52.5
2799 |       '@rollup/rollup-linux-arm-gnueabihf': 4.52.5
2800 |       '@rollup/rollup-linux-arm-musleabihf': 4.52.5
2801 |       '@rollup/rollup-linux-arm64-gnu': 4.52.5
2802 |       '@rollup/rollup-linux-arm64-musl': 4.52.5
2803 |       '@rollup/rollup-linux-loong64-gnu': 4.52.5
2804 |       '@rollup/rollup-linux-ppc64-gnu': 4.52.5
2805 |       '@rollup/rollup-linux-riscv64-gnu': 4.52.5
2806 |       '@rollup/rollup-linux-riscv64-musl': 4.52.5
2807 |       '@rollup/rollup-linux-s390x-gnu': 4.52.5
2808 |       '@rollup/rollup-linux-x64-gnu': 4.52.5
2809 |       '@rollup/rollup-linux-x64-musl': 4.52.5
2810 |       '@rollup/rollup-openharmony-arm64': 4.52.5
2811 |       '@rollup/rollup-win32-arm64-msvc': 4.52.5
2812 |       '@rollup/rollup-win32-ia32-msvc': 4.52.5
2813 |       '@rollup/rollup-win32-x64-gnu': 4.52.5
2814 |       '@rollup/rollup-win32-x64-msvc': 4.52.5
2815 |       fsevents: 2.3.3
2816 | 
2817 |   run-parallel@1.2.0:
2818 |     dependencies:
2819 |       queue-microtask: 1.2.3
2820 | 
2821 |   semver@7.7.3: {}
2822 | 
2823 |   shebang-command@2.0.0:
2824 |     dependencies:
2825 |       shebang-regex: 3.0.0
2826 | 
2827 |   shebang-regex@3.0.0: {}
2828 | 
2829 |   size-limit@11.2.0:
2830 |     dependencies:
2831 |       bytes-iec: 3.1.1
2832 |       chokidar: 4.0.3
2833 |       jiti: 2.4.2
2834 |       lilconfig: 3.1.3
2835 |       nanospinner: 1.2.2
2836 |       picocolors: 1.1.1
2837 |       tinyglobby: 0.2.14
2838 | 
2839 |   source-map-js@1.2.1: {}
2840 | 
2841 |   stable-hash-x@0.2.0: {}
2842 | 
2843 |   strip-ansi@6.0.1:
2844 |     dependencies:
2845 |       ansi-regex: 5.0.1
2846 | 
2847 |   strip-json-comments@3.1.1: {}
2848 | 
2849 |   supports-color@7.2.0:
2850 |     dependencies:
2851 |       has-flag: 4.0.0
2852 | 
2853 |   supports-preserve-symlinks-flag@1.0.0:
2854 |     optional: true
2855 | 
2856 |   tapable@2.3.0: {}
2857 | 
2858 |   tinyglobby@0.2.14:
2859 |     dependencies:
2860 |       fdir: 6.4.6(picomatch@4.0.2)
2861 |       picomatch: 4.0.2
2862 | 
2863 |   tinyglobby@0.2.15:
2864 |     dependencies:
2865 |       fdir: 6.5.0(picomatch@4.0.3)
2866 |       picomatch: 4.0.3
2867 | 
2868 |   to-regex-range@5.0.1:
2869 |     dependencies:
2870 |       is-number: 7.0.0
2871 | 
2872 |   ts-api-utils@2.1.0(typescript@5.9.3):
2873 |     dependencies:
2874 |       typescript: 5.9.3
2875 | 
2876 |   ts-declaration-location@1.0.7(typescript@5.9.3):
2877 |     dependencies:
2878 |       picomatch: 4.0.3
2879 |       typescript: 5.9.3
2880 | 
2881 |   tslib@2.8.1:
2882 |     optional: true
2883 | 
2884 |   tsx@4.20.6:
2885 |     dependencies:
2886 |       esbuild: 0.25.11
2887 |       get-tsconfig: 4.12.0
2888 |     optionalDependencies:
2889 |       fsevents: 2.3.3
2890 |     optional: true
2891 | 
2892 |   type-check@0.4.0:
2893 |     dependencies:
2894 |       prelude-ls: 1.2.1
2895 | 
2896 |   typescript-eslint@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3):
2897 |     dependencies:
2898 |       '@typescript-eslint/eslint-plugin': 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2899 |       '@typescript-eslint/parser': 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2900 |       '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3)
2901 |       '@typescript-eslint/utils': 8.46.1(eslint@9.38.0(jiti@2.4.2))(typescript@5.9.3)
2902 |       eslint: 9.38.0(jiti@2.4.2)
2903 |       typescript: 5.9.3
2904 |     transitivePeerDependencies:
2905 |       - supports-color
2906 | 
2907 |   typescript@5.9.3: {}
2908 | 
2909 |   undici-types@6.21.0: {}
2910 | 
2911 |   undici-types@7.14.0: {}
2912 | 
2913 |   unist-util-stringify-position@4.0.0:
2914 |     dependencies:
2915 |       '@types/unist': 3.0.3
2916 | 
2917 |   unrs-resolver@1.11.1:
2918 |     dependencies:
2919 |       napi-postinstall: 0.3.4
2920 |     optionalDependencies:
2921 |       '@unrs/resolver-binding-android-arm-eabi': 1.11.1
2922 |       '@unrs/resolver-binding-android-arm64': 1.11.1
2923 |       '@unrs/resolver-binding-darwin-arm64': 1.11.1
2924 |       '@unrs/resolver-binding-darwin-x64': 1.11.1
2925 |       '@unrs/resolver-binding-freebsd-x64': 1.11.1
2926 |       '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1
2927 |       '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1
2928 |       '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1
2929 |       '@unrs/resolver-binding-linux-arm64-musl': 1.11.1
2930 |       '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1
2931 |       '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1
2932 |       '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1
2933 |       '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1
2934 |       '@unrs/resolver-binding-linux-x64-gnu': 1.11.1
2935 |       '@unrs/resolver-binding-linux-x64-musl': 1.11.1
2936 |       '@unrs/resolver-binding-wasm32-wasi': 1.11.1
2937 |       '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1
2938 |       '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1
2939 |       '@unrs/resolver-binding-win32-x64-msvc': 1.11.1
2940 | 
2941 |   uri-js@4.4.1:
2942 |     dependencies:
2943 |       punycode: 2.3.1
2944 | 
2945 |   url-pattern@1.0.3: {}
2946 | 
2947 |   vfile-location@5.0.3:
2948 |     dependencies:
2949 |       '@types/unist': 3.0.3
2950 |       vfile: 6.0.3
2951 | 
2952 |   vfile-message@4.0.2:
2953 |     dependencies:
2954 |       '@types/unist': 3.0.3
2955 |       unist-util-stringify-position: 4.0.0
2956 | 
2957 |   vfile@6.0.3:
2958 |     dependencies:
2959 |       '@types/unist': 3.0.3
2960 |       vfile-message: 4.0.2
2961 | 
2962 |   vite@7.1.10(@types/node@24.8.1)(jiti@2.4.2)(tsx@4.20.6)(yaml@2.8.1):
2963 |     dependencies:
2964 |       esbuild: 0.25.11
2965 |       fdir: 6.5.0(picomatch@4.0.3)
2966 |       picomatch: 4.0.3
2967 |       postcss: 8.5.6
2968 |       rollup: 4.52.5
2969 |       tinyglobby: 0.2.15
2970 |     optionalDependencies:
2971 |       '@types/node': 24.8.1
2972 |       fsevents: 2.3.3
2973 |       jiti: 2.4.2
2974 |       tsx: 4.20.6
2975 |       yaml: 2.8.1
2976 | 
2977 |   whatwg-mimetype@3.0.0: {}
2978 | 
2979 |   which@2.0.2:
2980 |     dependencies:
2981 |       isexe: 2.0.0
2982 | 
2983 |   word-wrap@1.2.5: {}
2984 | 
2985 |   ws@8.18.3: {}
2986 | 
2987 |   yaml@2.8.1: {}
2988 | 
2989 |   yocto-queue@0.1.0: {}
2990 | 


--------------------------------------------------------------------------------