├── .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 |
--------------------------------------------------------------------------------