├── .npmrc ├── tsup.config.ts ├── .prettierignore ├── tsconfig.json ├── vitest.config.ts ├── .github ├── dependabot.yml └── workflows │ ├── ci.yml │ └── release.yml ├── eslint.config.mjs ├── LICENSE ├── src ├── typings.ts ├── index.bench.ts ├── index.test.ts └── index.ts ├── package.json ├── .gitignore ├── README.md └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | hoist=true 2 | shamefully-hoist=true 3 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | clean: true, 5 | dts: true, 6 | entry: ['src/index.ts'], 7 | format: ['cjs', 'esm'], 8 | target: 'esnext', 9 | outDir: 'dist', 10 | }); 11 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .changeset 3 | node_modules 4 | build 5 | dist 6 | 7 | .gitignore 8 | .prettierignore 9 | 10 | .env 11 | .env.* 12 | !.env.example 13 | 14 | # Ignore files for PNPM, NPM and YARN 15 | package-lock.json 16 | yarn.lock 17 | pnpm-lock.yaml 18 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@shahrad/tsconfig", 4 | "compilerOptions": { 5 | "noUncheckedIndexedAccess": false 6 | }, 7 | "include": ["**/*.ts"], 8 | "exclude": ["node_modules", "dist", "examples-DONT_REMOVE"] 9 | } 10 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | environment: 'node', 6 | testTimeout: 20000, 7 | globals: true, 8 | exclude: ['**/node_modules/**', '**/dist/**', '**/examples-DONT_REMOVE/**'], 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: '/' 5 | schedule: 6 | interval: 'daily' 7 | groups: 8 | all-dependencies: 9 | patterns: 10 | - '*' 11 | update-types: 12 | - 'minor' 13 | - 'patch' 14 | - package-ecosystem: 'github-actions' 15 | directory: '/' 16 | schedule: 17 | interval: 'daily' 18 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from '@shahrad/eslint-config'; 2 | import globals from 'globals'; 3 | 4 | export default defineConfig( 5 | { 6 | ignores: ['dist/**', 'examples-DONT_REMOVE/**'], 7 | }, 8 | 9 | { 10 | languageOptions: { 11 | ecmaVersion: 'latest', 12 | sourceType: 'module', 13 | globals: { 14 | ...globals.node, 15 | ...globals.browser, 16 | }, 17 | }, 18 | rules: { 19 | 'no-console': 'error', 20 | }, 21 | } 22 | ); 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Shahrad Elahi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | 8 | jobs: 9 | format: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: pnpm/action-setup@v4 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version: 22 17 | cache: 'pnpm' 18 | 19 | - run: pnpm install --frozen-lockfile 20 | - run: pnpm format:check 21 | 22 | lint: 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v4 26 | - uses: pnpm/action-setup@v4 27 | - uses: actions/setup-node@v4 28 | with: 29 | node-version: 22 30 | cache: 'pnpm' 31 | 32 | - run: pnpm install --frozen-lockfile 33 | - run: pnpm lint 34 | 35 | test: 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: actions/checkout@v4 39 | - uses: pnpm/action-setup@v4 40 | - uses: actions/setup-node@v4 41 | with: 42 | node-version: 22 43 | cache: 'pnpm' 44 | 45 | - run: pnpm install --frozen-lockfile 46 | - run: pnpm test 47 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Package 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | create-github-release: 10 | permissions: 11 | contents: write 12 | runs-on: ubuntu-latest 13 | if: startsWith(github.ref, 'refs/tags/v') 14 | steps: 15 | - name: Calculate release name 16 | run: | 17 | GITHUB_REF=${{ github.ref }} 18 | RELEASE_NAME=${GITHUB_REF#"refs/tags/"} 19 | echo "RELEASE_NAME=${RELEASE_NAME}" >> $GITHUB_ENV 20 | 21 | - name: Publish release 22 | uses: actions/create-release@v1 23 | env: 24 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 25 | with: 26 | tag_name: ${{ github.ref }} 27 | release_name: ${{ env.RELEASE_NAME }} 28 | draft: false 29 | prerelease: false 30 | 31 | publish-npm-release: 32 | runs-on: ubuntu-latest 33 | permissions: 34 | contents: read 35 | id-token: write 36 | steps: 37 | - uses: actions/checkout@v4 38 | - uses: pnpm/action-setup@v4 39 | - uses: actions/setup-node@v4 40 | with: 41 | node-version: 22 42 | cache: 'pnpm' 43 | registry-url: 'https://registry.npmjs.org' 44 | 45 | - run: pnpm install --frozen-lockfile 46 | - run: npm publish --provenance --access public 47 | env: 48 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 49 | -------------------------------------------------------------------------------- /src/typings.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Options for configuring the LRU cache. 3 | * @template K The type of the key. 4 | * @template V The type of the value. 5 | */ 6 | export interface LRUCacheOptions { 7 | /** The maximum number of items to store in the cache. */ 8 | max: number; 9 | /** The time-to-live for items in milliseconds. */ 10 | ttl?: number; 11 | /** The maximum size of the cache. */ 12 | maxSize?: number; 13 | /** A function to calculate the size of each item. */ 14 | sizeCalculation?: (value: V, key: K) => number; 15 | /** A function called when an item is removed from the cache. */ 16 | dispose?: (key: K, value: V, reason: DisposeReason) => void; 17 | /** An asynchronous function to fetch a value when it's not in the cache. */ 18 | fetchMethod?: Fetcher; 19 | /** The interval in milliseconds to periodically check for and remove expired items. */ 20 | reapInterval?: number; 21 | } 22 | 23 | /** 24 | * An asynchronous function to fetch a value. 25 | * @template K The type of the key. 26 | * @template V The type of the value. 27 | */ 28 | export type Fetcher = (key: K) => Promise; 29 | 30 | /** The reason for disposing an item from the cache. */ 31 | export type DisposeReason = 'evict' | 'set' | 'delete' | 'expire'; 32 | 33 | /** 34 | * Represents a node in the doubly linked list. 35 | * @internal 36 | * @template K The type of the key. 37 | * @template V The type of the value. 38 | */ 39 | export interface Node { 40 | /** The key of the item. */ 41 | key: K; 42 | /** The value of the item. */ 43 | value: V; 44 | /** The previous node in the list. */ 45 | prev?: Node; 46 | /** The next node in the list. */ 47 | next?: Node; 48 | /** The expiry timestamp of the item. */ 49 | expiry?: number; 50 | /** The size of the item. */ 51 | size: number; 52 | } 53 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@se-oss/lru", 3 | "version": "1.0.0", 4 | "description": "A feature-rich LRU cache engineered for high performance, offering excellent throughput on par with industry-standard libraries.", 5 | "keywords": [ 6 | "lru", 7 | "cache", 8 | "caching", 9 | "performance", 10 | "ttl", 11 | "fetch", 12 | "max-size", 13 | "typescript" 14 | ], 15 | "homepage": "https://github.com/shahradelahi/lru", 16 | "repository": "github:shahradelahi/lru", 17 | "license": "MIT", 18 | "author": "Shahrad Elahi (https://github.com/shahradelahi)", 19 | "type": "module", 20 | "exports": { 21 | ".": { 22 | "import": "./dist/index.js", 23 | "default": "./dist/index.cjs" 24 | } 25 | }, 26 | "main": "dist/index.js", 27 | "types": "dist/index.d.ts", 28 | "files": [ 29 | "dist/**", 30 | "!**/*.d.cts" 31 | ], 32 | "scripts": { 33 | "bench": "vitest bench --run", 34 | "build": "pnpm typecheck && tsup", 35 | "clean": "git clean -dfx node_modules dist .tsbuildinfo", 36 | "dev": "tsup --watch", 37 | "format": "prettier --write .", 38 | "format:check": "prettier --check .", 39 | "lint": "pnpm typecheck && eslint .", 40 | "lint:fix": "eslint --fix .", 41 | "prepublishOnly": "pnpm build && pnpm lint && pnpm format:check && pnpm test", 42 | "test": "vitest --run", 43 | "typecheck": "tsc --noEmit" 44 | }, 45 | "prettier": "@shahrad/prettier-config", 46 | "devDependencies": { 47 | "@shahrad/eslint-config": "^1.0.1", 48 | "@shahrad/prettier-config": "^1.2.2", 49 | "@shahrad/tsconfig": "^1.2.0", 50 | "@types/node": "^24.7.1", 51 | "eslint": "^9.37.0", 52 | "globals": "^16.4.0", 53 | "lru-cache": "^11.2.2", 54 | "prettier": "^3.6.2", 55 | "quick-lru": "^7.3.0", 56 | "tiny-lru": "^11.4.5", 57 | "tsup": "^8.5.0", 58 | "typescript": "^5.9.3", 59 | "vitest": "^3.2.4" 60 | }, 61 | "packageManager": "pnpm@10.18.2+sha512.9fb969fa749b3ade6035e0f109f0b8a60b5d08a1a87fdf72e337da90dcc93336e2280ca4e44f2358a649b83c17959e9993e777c2080879f3801e6f0d999ad3dd" 62 | } 63 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # Snowpack dependency directory (https://snowpack.dev/) 45 | web_modules/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Optional stylelint cache 57 | .stylelintcache 58 | 59 | # Optional REPL history 60 | .node_repl_history 61 | 62 | # Output of 'npm pack' 63 | *.tgz 64 | 65 | # Yarn Integrity file 66 | .yarn-integrity 67 | 68 | # dotenv environment variable files 69 | .env 70 | .env.* 71 | !.env.example 72 | 73 | # parcel-bundler cache (https://parceljs.org/) 74 | .cache 75 | .parcel-cache 76 | 77 | # Next.js build output 78 | .next 79 | out 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and not Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # vuepress v2.x temp and cache directory 95 | .temp 96 | .cache 97 | 98 | # Sveltekit cache directory 99 | .svelte-kit/ 100 | 101 | # vitepress build output 102 | **/.vitepress/dist 103 | 104 | # vitepress cache directory 105 | **/.vitepress/cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # Firebase cache directory 120 | .firebase/ 121 | 122 | # TernJS port file 123 | .tern-port 124 | 125 | # Stores VSCode versions used for testing VSCode extensions 126 | .vscode-test 127 | 128 | # yarn v3 129 | .pnp.* 130 | .yarn/* 131 | !.yarn/patches 132 | !.yarn/plugins 133 | !.yarn/releases 134 | !.yarn/sdks 135 | !.yarn/versions 136 | 137 | # Vite logs files 138 | vite.config.js.timestamp-* 139 | vite.config.ts.timestamp-* 140 | -------------------------------------------------------------------------------- /src/index.bench.ts: -------------------------------------------------------------------------------- 1 | import { LRUCache as LruCache } from 'lru-cache'; 2 | import QuickLRU from 'quick-lru'; 3 | import { lru as TinyLRU } from 'tiny-lru'; 4 | import { bench, describe } from 'vitest'; 5 | 6 | import { LRUCache as OurLRUCache } from './index'; 7 | 8 | const max = 1000; 9 | 10 | describe('set', () => { 11 | let i = 0; 12 | const ourCache = new OurLRUCache({ max }); 13 | const lruCache = new LruCache({ max }); 14 | const quickLru = new QuickLRU({ maxSize: max }); 15 | const tinyLru = TinyLRU(max); 16 | 17 | bench('@se-oss/lru', () => { 18 | ourCache.set(i++, i); 19 | }); 20 | 21 | bench('lru-cache', () => { 22 | lruCache.set(i++, i); 23 | }); 24 | 25 | bench('quick-lru', () => { 26 | quickLru.set(i++, i); 27 | }); 28 | 29 | bench('tiny-lru', () => { 30 | tinyLru.set(i++, i); 31 | }); 32 | }); 33 | 34 | describe('get', () => { 35 | let i = 0; 36 | const ourCache = new OurLRUCache({ max }); 37 | const lruCache = new LruCache({ max }); 38 | const quickLru = new QuickLRU({ maxSize: max }); 39 | const tinyLru = TinyLRU(max); 40 | 41 | for (let j = 0; j < max; j++) { 42 | ourCache.set(j, j); 43 | lruCache.set(j, j); 44 | quickLru.set(j, j); 45 | tinyLru.set(j, j); 46 | } 47 | 48 | bench('@se-oss/lru', () => { 49 | ourCache.get(i++ % max); 50 | }); 51 | 52 | bench('lru-cache', () => { 53 | lruCache.get(i++ % max); 54 | }); 55 | 56 | bench('quick-lru', () => { 57 | quickLru.get(i++ % max); 58 | }); 59 | 60 | bench('tiny-lru', () => { 61 | tinyLru.get(i++ % max); 62 | }); 63 | }); 64 | 65 | describe('update', () => { 66 | let i = 0; 67 | const ourCache = new OurLRUCache({ max }); 68 | const lruCache = new LruCache({ max }); 69 | const quickLru = new QuickLRU({ maxSize: max }); 70 | const tinyLru = TinyLRU(max); 71 | 72 | for (let j = 0; j < max; j++) { 73 | ourCache.set(j, j); 74 | lruCache.set(j, j); 75 | quickLru.set(j, j); 76 | tinyLru.set(j, j); 77 | } 78 | 79 | bench('@se-oss/lru', () => { 80 | const key = i++ % max; 81 | ourCache.set(key, key + 1); 82 | }); 83 | 84 | bench('lru-cache', () => { 85 | const key = i++ % max; 86 | lruCache.set(key, key + 1); 87 | }); 88 | 89 | bench('quick-lru', () => { 90 | const key = i++ % max; 91 | quickLru.set(key, key + 1); 92 | }); 93 | 94 | bench('tiny-lru', () => { 95 | const key = i++ % max; 96 | tinyLru.set(key, key + 1); 97 | }); 98 | }); 99 | 100 | describe('delete', () => { 101 | let i = 0; 102 | const ourCache = new OurLRUCache({ max }); 103 | const lruCache = new LruCache({ max }); 104 | const quickLru = new QuickLRU({ maxSize: max }); 105 | const tinyLru = TinyLRU(max); 106 | 107 | for (let j = 0; j < max; j++) { 108 | ourCache.set(j, j); 109 | lruCache.set(j, j); 110 | quickLru.set(j, j); 111 | tinyLru.set(j, j); 112 | } 113 | 114 | bench('@se-oss/lru', () => { 115 | ourCache.delete(i++ % max); 116 | }); 117 | 118 | bench('lru-cache', () => { 119 | lruCache.delete(i++ % max); 120 | }); 121 | 122 | bench('quick-lru', () => { 123 | quickLru.delete(i++ % max); 124 | }); 125 | 126 | bench('tiny-lru', () => { 127 | tinyLru.delete(i++ % max); 128 | }); 129 | }); 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @se-oss/lru 2 | 3 | [![CI](https://github.com/shahradelahi/lru/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/shahradelahi/lru/actions/workflows/ci.yml) 4 | [![NPM Version](https://img.shields.io/npm/v/@se-oss/lru.svg)](https://www.npmjs.com/package/@se-oss/lru) 5 | [![MIT License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat)](/LICENSE) 6 | ![npm bundle size](https://img.shields.io/bundlephobia/minzip/@se-oss/lru) 7 | [![Install Size](https://packagephobia.com/badge?p=@se-oss/lru)](https://packagephobia.com/result?p=@se-oss/lru) 8 | 9 | _@se-oss/lru_ is a feature-rich LRU cache engineered for high performance, offering excellent throughput on par with industry-standard libraries. It is designed for modern applications that require efficient caching with advanced features like TTL, size-based eviction, and asynchronous fetching. 10 | 11 | --- 12 | 13 | - [Installation](#-installation) 14 | - [Usage](#-usage) 15 | - [Documentation](#-documentation) 16 | - [Performance](#-performance) 17 | - [Contributing](#-contributing) 18 | - [License](#license) 19 | 20 | ## 📦 Installation 21 | 22 | ```bash 23 | npm install @se-oss/lru 24 | ``` 25 | 26 |
27 | Install using your favorite package manager 28 | 29 | **pnpm** 30 | 31 | ```bash 32 | pnpm install @se-oss/lru 33 | ``` 34 | 35 | **yarn** 36 | 37 | ```bash 38 | yarn add @se-oss/lru 39 | ``` 40 | 41 |
42 | 43 | ## 📖 Usage 44 | 45 | ### Quick Example 46 | 47 | _@se-oss/lru_ is a powerful and easy-to-use LRU cache for Node.js and the browser. Here’s a quick example to get you started: 48 | 49 | ```typescript 50 | import { LRUCache } from '@se-oss/lru'; 51 | 52 | // Create a cache with a max of 100 items and a 5-minute TTL 53 | const cache = new LRUCache({ 54 | max: 100, 55 | ttl: 1000 * 60 * 5, // 5 minutes 56 | }); 57 | 58 | // Set some values 59 | cache.set('key1', 123); 60 | cache.set('key2', 456); 61 | 62 | // Get a value 63 | console.log(cache.get('key1')); // 123 64 | 65 | // Check if a key exists 66 | console.log(cache.has('key2')); // true 67 | 68 | // Delete a key 69 | cache.delete('key1'); 70 | console.log(cache.has('key1')); // false 71 | 72 | // The cache will automatically evict the least recently used items 73 | // and expire items based on the TTL. 74 | ``` 75 | 76 | ### With TTL (Time-To-Live) 77 | 78 | ```typescript 79 | import { LRUCache } from '@se-oss/lru'; 80 | 81 | const cache = new LRUCache({ 82 | max: 100, 83 | ttl: 1000 * 60 * 5, // 5 minutes 84 | }); 85 | 86 | cache.set('session', 'user-session-data'); 87 | 88 | // The item will automatically expire after 5 minutes 89 | ``` 90 | 91 | ### Asynchronous Fetching 92 | 93 | The `fetch` method allows you to transparently handle cache misses by fetching data from an external source. 94 | 95 | ```typescript 96 | import { LRUCache } from '@se-oss/lru'; 97 | 98 | const cache = new LRUCache({ 99 | max: 100, 100 | fetchMethod: async (key) => { 101 | console.log(`Fetching ${key} from API...`); 102 | const response = await fetch(`https://api.example.com/data/${key}`); 103 | return response.json(); 104 | }, 105 | }); 106 | 107 | async function getData(key: string) { 108 | const data = await cache.fetch(key); 109 | console.log(data); 110 | } 111 | 112 | getData('user-profile'); // Fetches from API 113 | getData('user-profile'); // Returns from cache 114 | ``` 115 | 116 | ## 📚 Documentation 117 | 118 | For all configuration options, please see [the API docs](https://www.jsdocs.io/package/@se-oss/lru). 119 | 120 | ## 🚀 Performance 121 | 122 | | Library | SET ops/sec | GET ops/sec | UPDATE ops/sec | DELETE ops/sec | 123 | | --------------- | ------------ | ------------ | -------------- | -------------- | 124 | | **@se-oss/lru** | 8,283,012 | 17,011,923 | 15,848,670 | _31,051,192_ | 125 | | tiny-lru | 3,804,727 | _27,954,423_ | _26,658,547_ | 18,273,447 | 126 | | lru-cache | 9,466,302 | 17,964,613 | 17,062,288 | 30,668,986 | 127 | | quick-lru | _14,928,443_ | 10,391,375 | 15,257,320 | 26,669,894 | 128 | 129 | _Benchmark script: [`src/index.bench.ts`](src/index.bench.ts)_ 130 | 131 | **Note on `tiny-lru`**: The impressive `GET` and `UPDATE` performance of `tiny-lru` is largely due to its minimalist design. It is a raw LRU implementation and lacks many of the advanced features (like `fetch`, size-based eviction, and detailed callbacks) found in `@se-oss/lru` and `lru-cache`. This results in lower overhead for basic operations. 132 | 133 | ## 🤝 Contributing 134 | 135 | Want to contribute? Awesome! To show your support is to star the project, or to raise issues on [GitHub](https://github.com/shahradelahi/lru) 136 | 137 | Thanks again for your support, it is much appreciated! 🙏 138 | 139 | ## License 140 | 141 | [MIT](/LICENSE) © [Shahrad Elahi](https://github.com/shahradelahi) and [contributors](https://github.com/shahradelahi/lru/graphs/contributors). 142 | -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it, vi } from 'vitest'; 2 | 3 | import { LRUCache } from './index'; 4 | 5 | describe('LRUCache', () => { 6 | it('should set and get values', () => { 7 | const cache = new LRUCache({ max: 3 }); 8 | cache.set('key1', 'value1'); 9 | expect(cache.get('key1')).toBe('value1'); 10 | expect(cache.size).toBe(1); 11 | }); 12 | 13 | it('should return undefined for non-existent keys', () => { 14 | const cache = new LRUCache({ max: 3 }); 15 | expect(cache.get('nonexistent')).toBeUndefined(); 16 | }); 17 | 18 | it('should evict least recently used item when max is reached', () => { 19 | const cache = new LRUCache({ max: 3 }); 20 | cache.set('key1', 'value1'); 21 | cache.set('key2', 'value2'); 22 | cache.set('key3', 'value3'); 23 | cache.set('key4', 'value4'); 24 | 25 | expect(cache.size).toBe(3); 26 | expect(cache.has('key1')).toBe(false); 27 | expect(cache.has('key2')).toBe(true); 28 | expect(cache.has('key3')).toBe(true); 29 | expect(cache.has('key4')).toBe(true); 30 | }); 31 | 32 | it('should update position when accessing existing item', () => { 33 | const cache = new LRUCache({ max: 3 }); 34 | cache.set('key1', 'value1'); 35 | cache.set('key2', 'value2'); 36 | cache.set('key3', 'value3'); 37 | 38 | cache.get('key1'); 39 | 40 | cache.set('key4', 'value4'); 41 | 42 | expect(cache.has('key1')).toBe(true); 43 | expect(cache.has('key2')).toBe(false); 44 | expect(cache.has('key3')).toBe(true); 45 | expect(cache.has('key4')).toBe(true); 46 | }); 47 | 48 | it('should delete items', () => { 49 | const cache = new LRUCache({ max: 3 }); 50 | cache.set('key1', 'value1'); 51 | cache.set('key2', 'value2'); 52 | expect(cache.size).toBe(2); 53 | 54 | cache.delete('key1'); 55 | expect(cache.size).toBe(1); 56 | expect(cache.has('key1')).toBe(false); 57 | expect(cache.get('key1')).toBeUndefined(); 58 | expect(cache.get('key2')).toBe('value2'); 59 | }); 60 | 61 | it('should return false when deleting non-existent key', () => { 62 | const cache = new LRUCache({ max: 3 }); 63 | expect(cache.delete('nonexistent')).toBe(false); 64 | }); 65 | 66 | it('should clear all items', () => { 67 | const cache = new LRUCache({ max: 3 }); 68 | cache.set('key1', 'value1'); 69 | cache.set('key2', 'value2'); 70 | expect(cache.size).toBe(2); 71 | 72 | cache.clear(); 73 | expect(cache.size).toBe(0); 74 | expect(cache.has('key1')).toBe(false); 75 | expect(cache.has('key2')).toBe(false); 76 | }); 77 | 78 | it('should check if key exists with has()', () => { 79 | const cache = new LRUCache({ max: 3 }); 80 | cache.set('key1', 'value1'); 81 | expect(cache.has('key1')).toBe(true); 82 | expect(cache.has('nonexistent')).toBe(false); 83 | }); 84 | 85 | describe('TTL', () => { 86 | it('should expire items after ttl', async () => { 87 | const cache = new LRUCache({ max: 3, ttl: 50 }); 88 | cache.set('key1', 'value1'); 89 | expect(cache.get('key1')).toBe('value1'); 90 | await new Promise((r) => setTimeout(r, 100)); 91 | expect(cache.get('key1')).toBeUndefined(); 92 | }); 93 | 94 | it('should not expire items if ttl is not set', async () => { 95 | const cache = new LRUCache({ max: 3 }); 96 | cache.set('key1', 'value1'); 97 | await new Promise((r) => setTimeout(r, 100)); 98 | expect(cache.get('key1')).toBe('value1'); 99 | }); 100 | 101 | it('should get remaining ttl', async () => { 102 | const cache = new LRUCache({ max: 3, ttl: 100 }); 103 | cache.set('key1', 'value1'); 104 | expect(cache.getRemainingTTL('key1')).toBeGreaterThan(50); 105 | expect(cache.getRemainingTTL('key1')).toBeLessThanOrEqual(100); 106 | await new Promise((r) => setTimeout(r, 50)); 107 | expect(cache.getRemainingTTL('key1')).toBeGreaterThan(0); 108 | expect(cache.getRemainingTTL('key1')).toBeLessThanOrEqual(50); 109 | }); 110 | }); 111 | 112 | describe('maxSize', () => { 113 | it('should evict items to stay under maxSize', () => { 114 | const cache = new LRUCache({ 115 | max: 10, 116 | maxSize: 10, 117 | sizeCalculation: (value) => value.length, 118 | }); 119 | cache.set('key1', '12345'); 120 | cache.set('key2', '12345'); 121 | expect(cache.size).toBe(2); 122 | cache.set('key3', '1'); 123 | expect(cache.size).toBe(2); 124 | expect(cache.has('key1')).toBe(false); 125 | }); 126 | }); 127 | 128 | describe('dispose', () => { 129 | it('should call dispose on eviction', () => { 130 | const dispose = vi.fn(); 131 | const cache = new LRUCache({ max: 2, dispose }); 132 | cache.set('key1', 'value1'); 133 | cache.set('key2', 'value2'); 134 | cache.set('key3', 'value3'); 135 | expect(dispose).toHaveBeenCalledWith('key1', 'value1', 'evict'); 136 | }); 137 | 138 | it('should call dispose on set', () => { 139 | const dispose = vi.fn(); 140 | const cache = new LRUCache({ max: 2, dispose }); 141 | cache.set('key1', 'value1'); 142 | cache.set('key1', 'value2'); 143 | expect(dispose).toHaveBeenCalledWith('key1', 'value2', 'set'); 144 | }); 145 | 146 | it('should call dispose on delete', () => { 147 | const dispose = vi.fn(); 148 | const cache = new LRUCache({ max: 2, dispose }); 149 | cache.set('key1', 'value1'); 150 | cache.delete('key1'); 151 | expect(dispose).toHaveBeenCalledWith('key1', 'value1', 'delete'); 152 | }); 153 | }); 154 | 155 | describe('fetch', () => { 156 | it('should return cached value on hit', async () => { 157 | const fetcher = vi.fn(); 158 | const cache = new LRUCache({ max: 3, fetchMethod: fetcher }); 159 | cache.set('key1', 'value1'); 160 | const value = await cache.fetch('key1'); 161 | expect(value).toBe('value1'); 162 | expect(fetcher).not.toHaveBeenCalled(); 163 | }); 164 | 165 | it('should fetch value on miss', async () => { 166 | const fetcher = vi.fn().mockResolvedValue('fetched-value'); 167 | const cache = new LRUCache({ max: 3, fetchMethod: fetcher }); 168 | const value = await cache.fetch('key1'); 169 | expect(value).toBe('fetched-value'); 170 | expect(fetcher).toHaveBeenCalledWith('key1'); 171 | expect(cache.get('key1')).toBe('fetched-value'); 172 | }); 173 | 174 | it('should handle concurrent fetches for the same key', async () => { 175 | const fetcher = vi.fn().mockResolvedValue('fetched-value'); 176 | const cache = new LRUCache({ max: 3, fetchMethod: fetcher }); 177 | const [v1, v2] = await Promise.all([cache.fetch('key1'), cache.fetch('key1')]); 178 | expect(v1).toBe('fetched-value'); 179 | expect(v2).toBe('fetched-value'); 180 | expect(fetcher).toHaveBeenCalledTimes(1); 181 | }); 182 | 183 | it('should not cache undefined fetched value', async () => { 184 | const fetcher = vi.fn().mockResolvedValue(undefined); 185 | const cache = new LRUCache({ max: 3, fetchMethod: fetcher }); 186 | const value = await cache.fetch('key1'); 187 | expect(value).toBeUndefined(); 188 | expect(cache.has('key1')).toBe(false); 189 | }); 190 | 191 | it('should handle fetch rejection', async () => { 192 | const fetcher = vi.fn().mockRejectedValue(new Error('fetch error')); 193 | const cache = new LRUCache({ max: 3, fetchMethod: fetcher }); 194 | await expect(cache.fetch('key1')).rejects.toThrow('fetch error'); 195 | expect(cache.has('key1')).toBe(false); 196 | }); 197 | 198 | it('should return stale value and revalidate in background', async () => { 199 | const fetcher = vi.fn().mockResolvedValue('new-value'); 200 | const cache = new LRUCache({ 201 | max: 3, 202 | ttl: 50, 203 | fetchMethod: fetcher, 204 | }); 205 | 206 | cache.set('key1', 'stale-value'); 207 | await new Promise((r) => setTimeout(r, 100)); // Wait for item to become stale 208 | 209 | const value = await cache.fetch('key1', { allowStale: true }); 210 | expect(value).toBe('stale-value'); // Returns stale value immediately 211 | expect(fetcher).toHaveBeenCalledWith('key1'); // Triggers fetch in background 212 | 213 | await new Promise((r) => setTimeout(r, 50)); // Wait for fetch to complete 214 | 215 | expect(cache.get('key1', { allowStale: true })).toBe('new-value'); // Cache is updated with new value 216 | }); 217 | 218 | it('should return stale value if allowStale is true', async () => { 219 | const cache = new LRUCache({ max: 3, ttl: 50 }); 220 | cache.set('key1', 'value1'); 221 | await new Promise((r) => setTimeout(r, 100)); 222 | const value = cache.get('key1', { allowStale: true }); 223 | expect(value).toBe('value1'); 224 | }); 225 | }); 226 | 227 | describe('iterators', () => { 228 | it('should iterate over keys in LRU order', () => { 229 | const cache = new LRUCache({ max: 3 }); 230 | cache.set('key1', 'value1'); 231 | cache.set('key2', 'value2'); 232 | cache.set('key3', 'value3'); 233 | cache.get('key1'); 234 | expect([...cache.keys()]).toEqual(['key1', 'key3', 'key2']); 235 | }); 236 | 237 | it('should iterate over values in LRU order', () => { 238 | const cache = new LRUCache({ max: 3 }); 239 | cache.set('key1', 'value1'); 240 | cache.set('key2', 'value2'); 241 | cache.set('key3', 'value3'); 242 | cache.get('key1'); 243 | expect([...cache.values()]).toEqual(['value1', 'value3', 'value2']); 244 | }); 245 | 246 | it('should iterate over entries in LRU order', () => { 247 | const cache = new LRUCache({ max: 3 }); 248 | cache.set('key1', 'value1'); 249 | cache.set('key2', 'value2'); 250 | cache.set('key3', 'value3'); 251 | cache.get('key1'); 252 | const expected = [ 253 | ['key1', 'value1'], 254 | ['key3', 'value3'], 255 | ['key2', 'value2'], 256 | ]; 257 | expect([...cache.entries()]).toEqual(expected); 258 | expect([...cache]).toEqual(expected); 259 | }); 260 | }); 261 | 262 | describe('reap', () => { 263 | it('should manually reap expired items', async () => { 264 | const cache = new LRUCache({ max: 3, ttl: 50 }); 265 | cache.set('key1', 'value1'); 266 | cache.set('key2', 'value2'); 267 | await new Promise((r) => setTimeout(r, 100)); 268 | cache.reap(); 269 | expect(cache.size).toBe(0); 270 | expect(cache.has('key1')).toBe(false); 271 | expect(cache.has('key2')).toBe(false); 272 | }); 273 | 274 | it('should automatically reap expired items with reapInterval', async () => { 275 | const cache = new LRUCache({ 276 | max: 3, 277 | ttl: 50, 278 | reapInterval: 50, 279 | }); 280 | cache.set('key1', 'value1'); 281 | cache.set('key2', 'value2'); 282 | await new Promise((r) => setTimeout(r, 150)); 283 | expect(cache.size).toBe(0); 284 | expect(cache.has('key1')).toBe(false); 285 | expect(cache.has('key2')).toBe(false); 286 | cache.stopReaping(); 287 | }); 288 | }); 289 | }); 290 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { DisposeReason, Fetcher, LRUCacheOptions, Node } from './typings'; 2 | 3 | /** 4 | * A feature-rich LRU cache engineered for high performance, offering excellent throughput on par with industry-standard libraries. 5 | * It is designed for modern applications that require efficient caching with advanced features like TTL, 6 | * size-based eviction, and asynchronous fetching. 7 | * @template K The type of the key. 8 | * @template V The type of the value. 9 | */ 10 | export class LRUCache { 11 | #max: number; 12 | #size: number = 0; 13 | #cache: Map> = new Map(); 14 | #head?: Node; 15 | #tail?: Node; 16 | 17 | #ttl?: number; 18 | #maxSize?: number; 19 | #sizeCalculation: (value: V, key: K) => number = () => 1; 20 | #calculatedSize: number = 0; 21 | 22 | #dispose?: (key: K, value: V, reason: DisposeReason) => void; 23 | #fetchMethod?: Fetcher; 24 | #inflight: Map> = new Map(); 25 | #reapTimer?: NodeJS.Timeout; 26 | 27 | /** 28 | * Creates a new LRUCache instance. 29 | * @param {LRUCacheOptions} options The options for the cache. 30 | * @example 31 | * const cache = new LRUCache({ max: 100 }); 32 | */ 33 | constructor(options: LRUCacheOptions) { 34 | this.#max = options.max; 35 | this.#ttl = options.ttl; 36 | this.#maxSize = options.maxSize; 37 | if (options.sizeCalculation) { 38 | this.#sizeCalculation = options.sizeCalculation; 39 | } 40 | this.#dispose = options.dispose; 41 | this.#fetchMethod = options.fetchMethod; 42 | 43 | if (options.reapInterval && options.reapInterval > 0) { 44 | this.#reapTimer = setInterval(() => this.reap(), options.reapInterval); 45 | } 46 | } 47 | 48 | /** 49 | * The number of items currently in the cache. 50 | * @returns {number} The number of items. 51 | */ 52 | get size(): number { 53 | return this.#size; 54 | } 55 | 56 | /** 57 | * Manually scans the cache and removes all expired items. 58 | */ 59 | reap(): void { 60 | for (let node = this.#tail; node; node = node.prev) { 61 | if (this.#isStale(node)) { 62 | this.#deleteInternal(node, 'expire'); 63 | } 64 | } 65 | } 66 | 67 | /** 68 | * Stops the automatic reaping of expired items. 69 | */ 70 | stopReaping(): void { 71 | if (this.#reapTimer) { 72 | clearInterval(this.#reapTimer); 73 | this.#reapTimer = undefined; 74 | } 75 | } 76 | 77 | /** 78 | * Adds or updates an item in the cache. 79 | * @param {K} key The key of the item. 80 | * @param {V} value The value of the item. 81 | * @param {{ ttl?: number }} [options] Options for setting the item. 82 | * @returns {this} The cache instance. 83 | * @example 84 | * cache.set('key1', 'value1'); 85 | * cache.set('key2', 'value2', { ttl: 1000 }); // 1 second TTL 86 | */ 87 | set(key: K, value: V, options?: { ttl?: number }): this { 88 | let node = this.#cache.get(key); 89 | const size = this.#sizeCalculation(value, key); 90 | 91 | if (node) { 92 | const oldSize = node.size; 93 | node.value = value; 94 | node.size = size; 95 | this.#calculatedSize += size - oldSize; 96 | this.#moveToHead(node); 97 | this.#setTTL(node, options?.ttl); 98 | if (this.#dispose) { 99 | this.#dispose(key, node.value, 'set'); 100 | } 101 | } else { 102 | node = { key, value, size }; 103 | this.#cache.set(key, node); 104 | this.#size++; 105 | this.#calculatedSize += size; 106 | if (this.#size === 1) { 107 | this.#head = this.#tail = node; 108 | } else { 109 | this.#head!.prev = node; 110 | node.next = this.#head; 111 | this.#head = node; 112 | } 113 | this.#setTTL(node, options?.ttl); 114 | } 115 | 116 | if (this.#max > 0 && this.#size > this.#max) { 117 | this.#evict(); 118 | } 119 | this.#evictToSize(); 120 | return this; 121 | } 122 | 123 | /** 124 | * Retrieves an item from the cache. 125 | * @param {K} key The key of the item to retrieve. 126 | * @param {{ allowStale?: boolean }} [options] Options for getting the item. 127 | * @returns {V | undefined} The value of the item, or undefined if not found. 128 | * @example 129 | * const value = cache.get('key1'); 130 | */ 131 | get(key: K, options?: { allowStale?: boolean }): V | undefined { 132 | const node = this.#cache.get(key); 133 | 134 | if (!node) { 135 | return undefined; 136 | } 137 | 138 | if (this.#isStale(node)) { 139 | if (options?.allowStale) { 140 | return node.value; 141 | } 142 | this.#deleteInternal(node, 'expire'); 143 | return undefined; 144 | } 145 | 146 | this.#moveToHead(node); 147 | return node.value; 148 | } 149 | 150 | /** 151 | * Retrieves an item, fetching it if it's not in the cache. 152 | * @param {K} key The key of the item to fetch. 153 | * @param {{ allowStale?: boolean }} [options] Options for fetching the item. 154 | * @returns {Promise} A promise that resolves to the value of the item. 155 | * @example 156 | * const value = await cache.fetch('key1'); 157 | */ 158 | async fetch(key: K, options?: { allowStale?: boolean }): Promise { 159 | const node = this.#cache.get(key); 160 | 161 | if (node && !this.#isStale(node)) { 162 | this.#moveToHead(node); 163 | return node.value; 164 | } 165 | 166 | if (this.#inflight.has(key)) { 167 | return this.#inflight.get(key); 168 | } 169 | 170 | if (node && this.#isStale(node) && options?.allowStale) { 171 | // Non-blocking revalidation 172 | this.#fetchAndSet(key).catch(() => { 173 | // Background fetch failed, ignore 174 | }); 175 | return node.value; 176 | } 177 | 178 | if (!this.#fetchMethod) { 179 | if (node) { 180 | this.#deleteInternal(node, 'expire'); 181 | } 182 | return undefined; 183 | } 184 | 185 | return this.#fetchAndSet(key); 186 | } 187 | 188 | async #fetchAndSet(key: K): Promise { 189 | if (!this.#fetchMethod) { 190 | return undefined; 191 | } 192 | 193 | const promise = this.#fetchMethod(key); 194 | this.#inflight.set(key, promise); 195 | 196 | try { 197 | const value = await promise; 198 | if (value !== undefined) { 199 | this.set(key, value); 200 | } 201 | return value; 202 | } finally { 203 | this.#inflight.delete(key); 204 | } 205 | } 206 | 207 | /** 208 | * Checks if an item exists in the cache. 209 | * @param {K} key The key of the item to check. 210 | * @returns {boolean} True if the item exists, false otherwise. 211 | * @example 212 | * if (cache.has('key1')) { 213 | * // ... 214 | * } 215 | */ 216 | has(key: K): boolean { 217 | const node = this.#cache.get(key); 218 | if (!node) { 219 | return false; 220 | } 221 | if (this.#isStale(node)) { 222 | return false; 223 | } 224 | return true; 225 | } 226 | 227 | /** 228 | * Removes an item from the cache. 229 | * @param {K} key The key of the item to remove. 230 | * @returns {boolean} True if the item was removed, false otherwise. 231 | * @example 232 | * cache.delete('key1'); 233 | */ 234 | delete(key: K): boolean { 235 | const node = this.#cache.get(key); 236 | 237 | if (!node) { 238 | return false; 239 | } 240 | 241 | this.#deleteInternal(node, 'delete'); 242 | return true; 243 | } 244 | 245 | /** 246 | * Clears the entire cache. 247 | * @example 248 | * cache.clear(); 249 | */ 250 | clear(): void { 251 | this.stopReaping(); 252 | if (this.#dispose) { 253 | for (const [key, node] of this.#cache) { 254 | this.#dispose(key, node.value, 'delete'); 255 | } 256 | } 257 | this.#cache.clear(); 258 | this.#head = this.#tail = undefined; 259 | this.#size = 0; 260 | this.#calculatedSize = 0; 261 | } 262 | 263 | /** 264 | * Returns the remaining time-to-live for an item in milliseconds. 265 | * @param {K} key The key of the item. 266 | * @returns {number} The remaining time-to-live in milliseconds. 267 | * @example 268 | * const ttl = cache.getRemainingTTL('key1'); 269 | */ 270 | getRemainingTTL(key: K): number { 271 | const node = this.#cache.get(key); 272 | if (!node || !node.expiry) { 273 | return 0; 274 | } 275 | const remaining = node.expiry - Date.now(); 276 | return remaining < 0 ? 0 : remaining; 277 | } 278 | 279 | /** 280 | * Returns an iterator for the keys in the cache. 281 | * @returns {Generator} An iterator for the keys. 282 | * @example 283 | * for (const key of cache.keys()) { 284 | * // ... 285 | * } 286 | */ 287 | *keys(): Generator { 288 | for (let node = this.#head; node; node = node.next) { 289 | if (!this.#isStale(node)) { 290 | yield node.key; 291 | } 292 | } 293 | } 294 | 295 | /** 296 | * Returns an iterator for the values in the cache. 297 | * @returns {Generator} An iterator for the values. 298 | * @example 299 | * for (const value of cache.values()) { 300 | * // ... 301 | * } 302 | */ 303 | *values(): Generator { 304 | for (let node = this.#head; node; node = node.next) { 305 | if (!this.#isStale(node)) { 306 | yield node.value; 307 | } 308 | } 309 | } 310 | 311 | /** 312 | * Returns an iterator for the entries in the cache. 313 | * @returns {Generator<[K, V]>} An iterator for the entries. 314 | * @example 315 | * for (const [key, value] of cache.entries()) { 316 | * // ... 317 | * } 318 | */ 319 | *entries(): Generator<[K, V]> { 320 | for (let node = this.#head; node; node = node.next) { 321 | if (!this.#isStale(node)) { 322 | yield [node.key, node.value]; 323 | } 324 | } 325 | } 326 | 327 | /** 328 | * Returns an iterator for the entries in the cache. 329 | * @returns {Generator<[K, V]>} An iterator for the entries. 330 | * @example 331 | * for (const [key, value] of cache) { 332 | * // ... 333 | * } 334 | */ 335 | [Symbol.iterator](): Generator<[K, V]> { 336 | return this.entries(); 337 | } 338 | 339 | #setTTL(node: Node, ttl?: number): void { 340 | const newTtl = ttl ?? this.#ttl; 341 | if (newTtl) { 342 | node.expiry = Date.now() + newTtl; 343 | } 344 | } 345 | 346 | #isStale(node: Node): boolean { 347 | return !!node.expiry && node.expiry < Date.now(); 348 | } 349 | 350 | #moveToHead(node: Node): void { 351 | if (node === this.#head) { 352 | return; 353 | } 354 | 355 | const { prev, next } = node; 356 | 357 | if (prev) { 358 | prev.next = next; 359 | } else { 360 | this.#head = next; 361 | } 362 | 363 | if (next) { 364 | next.prev = prev; 365 | } else { 366 | this.#tail = prev; 367 | } 368 | 369 | this.#head!.prev = node; 370 | node.next = this.#head; 371 | node.prev = undefined; 372 | this.#head = node; 373 | } 374 | 375 | #evict(): void { 376 | const tail = this.#tail!; 377 | if (this.#dispose) { 378 | this.#dispose(tail.key, tail.value, 'evict'); 379 | } 380 | this.#calculatedSize -= tail.size; 381 | this.#cache.delete(tail.key); 382 | this.#deleteNode(tail); 383 | this.#size--; 384 | } 385 | 386 | #evictToSize(): void { 387 | if (!this.#maxSize) return; 388 | while (this.#calculatedSize > this.#maxSize && this.#tail) { 389 | this.#evict(); 390 | } 391 | } 392 | 393 | #deleteNode(node: Node): void { 394 | const { prev, next } = node; 395 | if (prev) { 396 | prev.next = next; 397 | } else { 398 | this.#head = next; 399 | } 400 | if (next) { 401 | next.prev = prev; 402 | } else { 403 | this.#tail = prev; 404 | } 405 | } 406 | 407 | #deleteInternal(node: Node, reason: DisposeReason): void { 408 | if (this.#dispose) { 409 | this.#dispose(node.key, node.value, reason); 410 | } 411 | this.#calculatedSize -= node.size; 412 | this.#cache.delete(node.key); 413 | this.#deleteNode(node); 414 | this.#size--; 415 | } 416 | } 417 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@shahrad/eslint-config': 12 | specifier: ^1.0.1 13 | version: 1.0.1(jiti@2.5.1)(typescript@5.9.3) 14 | '@shahrad/prettier-config': 15 | specifier: ^1.2.2 16 | version: 1.2.2(@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.6.2))(prettier-plugin-packagejson@2.5.18(prettier@3.6.2))(prettier-plugin-sh@0.15.0(prettier@3.6.2))(prettier@3.6.2) 17 | '@shahrad/tsconfig': 18 | specifier: ^1.2.0 19 | version: 1.2.0 20 | '@types/node': 21 | specifier: ^24.7.1 22 | version: 24.7.1 23 | eslint: 24 | specifier: ^9.37.0 25 | version: 9.37.0(jiti@2.5.1) 26 | globals: 27 | specifier: ^16.4.0 28 | version: 16.4.0 29 | lru-cache: 30 | specifier: ^11.2.2 31 | version: 11.2.2 32 | prettier: 33 | specifier: ^3.6.2 34 | version: 3.6.2 35 | quick-lru: 36 | specifier: ^7.3.0 37 | version: 7.3.0 38 | tiny-lru: 39 | specifier: ^11.4.5 40 | version: 11.4.5 41 | tsup: 42 | specifier: ^8.5.0 43 | version: 8.5.0(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3) 44 | typescript: 45 | specifier: ^5.9.3 46 | version: 5.9.3 47 | vitest: 48 | specifier: ^3.2.4 49 | version: 3.2.4(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6) 50 | 51 | packages: 52 | 53 | '@babel/code-frame@7.27.1': 54 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 55 | engines: {node: '>=6.9.0'} 56 | 57 | '@babel/generator@7.28.3': 58 | resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} 59 | engines: {node: '>=6.9.0'} 60 | 61 | '@babel/helper-globals@7.28.0': 62 | resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 63 | engines: {node: '>=6.9.0'} 64 | 65 | '@babel/helper-string-parser@7.27.1': 66 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 67 | engines: {node: '>=6.9.0'} 68 | 69 | '@babel/helper-validator-identifier@7.27.1': 70 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 71 | engines: {node: '>=6.9.0'} 72 | 73 | '@babel/parser@7.28.4': 74 | resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} 75 | engines: {node: '>=6.0.0'} 76 | hasBin: true 77 | 78 | '@babel/template@7.27.2': 79 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 80 | engines: {node: '>=6.9.0'} 81 | 82 | '@babel/traverse@7.28.4': 83 | resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} 84 | engines: {node: '>=6.9.0'} 85 | 86 | '@babel/types@7.28.4': 87 | resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} 88 | engines: {node: '>=6.9.0'} 89 | 90 | '@esbuild/aix-ppc64@0.25.9': 91 | resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} 92 | engines: {node: '>=18'} 93 | cpu: [ppc64] 94 | os: [aix] 95 | 96 | '@esbuild/android-arm64@0.25.9': 97 | resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} 98 | engines: {node: '>=18'} 99 | cpu: [arm64] 100 | os: [android] 101 | 102 | '@esbuild/android-arm@0.25.9': 103 | resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} 104 | engines: {node: '>=18'} 105 | cpu: [arm] 106 | os: [android] 107 | 108 | '@esbuild/android-x64@0.25.9': 109 | resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} 110 | engines: {node: '>=18'} 111 | cpu: [x64] 112 | os: [android] 113 | 114 | '@esbuild/darwin-arm64@0.25.9': 115 | resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} 116 | engines: {node: '>=18'} 117 | cpu: [arm64] 118 | os: [darwin] 119 | 120 | '@esbuild/darwin-x64@0.25.9': 121 | resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} 122 | engines: {node: '>=18'} 123 | cpu: [x64] 124 | os: [darwin] 125 | 126 | '@esbuild/freebsd-arm64@0.25.9': 127 | resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} 128 | engines: {node: '>=18'} 129 | cpu: [arm64] 130 | os: [freebsd] 131 | 132 | '@esbuild/freebsd-x64@0.25.9': 133 | resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} 134 | engines: {node: '>=18'} 135 | cpu: [x64] 136 | os: [freebsd] 137 | 138 | '@esbuild/linux-arm64@0.25.9': 139 | resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} 140 | engines: {node: '>=18'} 141 | cpu: [arm64] 142 | os: [linux] 143 | 144 | '@esbuild/linux-arm@0.25.9': 145 | resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} 146 | engines: {node: '>=18'} 147 | cpu: [arm] 148 | os: [linux] 149 | 150 | '@esbuild/linux-ia32@0.25.9': 151 | resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} 152 | engines: {node: '>=18'} 153 | cpu: [ia32] 154 | os: [linux] 155 | 156 | '@esbuild/linux-loong64@0.25.9': 157 | resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} 158 | engines: {node: '>=18'} 159 | cpu: [loong64] 160 | os: [linux] 161 | 162 | '@esbuild/linux-mips64el@0.25.9': 163 | resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} 164 | engines: {node: '>=18'} 165 | cpu: [mips64el] 166 | os: [linux] 167 | 168 | '@esbuild/linux-ppc64@0.25.9': 169 | resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} 170 | engines: {node: '>=18'} 171 | cpu: [ppc64] 172 | os: [linux] 173 | 174 | '@esbuild/linux-riscv64@0.25.9': 175 | resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} 176 | engines: {node: '>=18'} 177 | cpu: [riscv64] 178 | os: [linux] 179 | 180 | '@esbuild/linux-s390x@0.25.9': 181 | resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} 182 | engines: {node: '>=18'} 183 | cpu: [s390x] 184 | os: [linux] 185 | 186 | '@esbuild/linux-x64@0.25.9': 187 | resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} 188 | engines: {node: '>=18'} 189 | cpu: [x64] 190 | os: [linux] 191 | 192 | '@esbuild/netbsd-arm64@0.25.9': 193 | resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} 194 | engines: {node: '>=18'} 195 | cpu: [arm64] 196 | os: [netbsd] 197 | 198 | '@esbuild/netbsd-x64@0.25.9': 199 | resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} 200 | engines: {node: '>=18'} 201 | cpu: [x64] 202 | os: [netbsd] 203 | 204 | '@esbuild/openbsd-arm64@0.25.9': 205 | resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} 206 | engines: {node: '>=18'} 207 | cpu: [arm64] 208 | os: [openbsd] 209 | 210 | '@esbuild/openbsd-x64@0.25.9': 211 | resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} 212 | engines: {node: '>=18'} 213 | cpu: [x64] 214 | os: [openbsd] 215 | 216 | '@esbuild/openharmony-arm64@0.25.9': 217 | resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} 218 | engines: {node: '>=18'} 219 | cpu: [arm64] 220 | os: [openharmony] 221 | 222 | '@esbuild/sunos-x64@0.25.9': 223 | resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} 224 | engines: {node: '>=18'} 225 | cpu: [x64] 226 | os: [sunos] 227 | 228 | '@esbuild/win32-arm64@0.25.9': 229 | resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} 230 | engines: {node: '>=18'} 231 | cpu: [arm64] 232 | os: [win32] 233 | 234 | '@esbuild/win32-ia32@0.25.9': 235 | resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} 236 | engines: {node: '>=18'} 237 | cpu: [ia32] 238 | os: [win32] 239 | 240 | '@esbuild/win32-x64@0.25.9': 241 | resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} 242 | engines: {node: '>=18'} 243 | cpu: [x64] 244 | os: [win32] 245 | 246 | '@eslint-community/eslint-utils@4.9.0': 247 | resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 248 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 249 | peerDependencies: 250 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 251 | 252 | '@eslint-community/regexpp@4.12.1': 253 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 254 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 255 | 256 | '@eslint/config-array@0.21.0': 257 | resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} 258 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 259 | 260 | '@eslint/config-helpers@0.4.0': 261 | resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} 262 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 263 | 264 | '@eslint/core@0.16.0': 265 | resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} 266 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 267 | 268 | '@eslint/eslintrc@3.3.1': 269 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 270 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 271 | 272 | '@eslint/js@9.37.0': 273 | resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} 274 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 275 | 276 | '@eslint/object-schema@2.1.6': 277 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 278 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 279 | 280 | '@eslint/plugin-kit@0.4.0': 281 | resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} 282 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 283 | 284 | '@humanfs/core@0.19.1': 285 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 286 | engines: {node: '>=18.18.0'} 287 | 288 | '@humanfs/node@0.16.6': 289 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 290 | engines: {node: '>=18.18.0'} 291 | 292 | '@humanwhocodes/module-importer@1.0.1': 293 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 294 | engines: {node: '>=12.22'} 295 | 296 | '@humanwhocodes/retry@0.3.1': 297 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 298 | engines: {node: '>=18.18'} 299 | 300 | '@humanwhocodes/retry@0.4.3': 301 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 302 | engines: {node: '>=18.18'} 303 | 304 | '@ianvs/prettier-plugin-sort-imports@4.5.1': 305 | resolution: {integrity: sha512-vOQwIyQHnHz0ikvHEQDzwUkNfX74o/7qNEpm9LiPtyBvCg/AU/DOkhwe1o92chPS1QzS6G7HeiO+OwIt8a358A==} 306 | peerDependencies: 307 | '@prettier/plugin-oxc': ^0.0.4 308 | '@vue/compiler-sfc': 2.7.x || 3.x 309 | prettier: 2 || 3 || ^4.0.0-0 310 | peerDependenciesMeta: 311 | '@prettier/plugin-oxc': 312 | optional: true 313 | '@vue/compiler-sfc': 314 | optional: true 315 | 316 | '@isaacs/cliui@8.0.2': 317 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 318 | engines: {node: '>=12'} 319 | 320 | '@jridgewell/gen-mapping@0.3.12': 321 | resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} 322 | 323 | '@jridgewell/resolve-uri@3.1.2': 324 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 325 | engines: {node: '>=6.0.0'} 326 | 327 | '@jridgewell/sourcemap-codec@1.5.5': 328 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 329 | 330 | '@jridgewell/trace-mapping@0.3.29': 331 | resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} 332 | 333 | '@nodelib/fs.scandir@2.1.5': 334 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 335 | engines: {node: '>= 8'} 336 | 337 | '@nodelib/fs.stat@2.0.5': 338 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 339 | engines: {node: '>= 8'} 340 | 341 | '@nodelib/fs.walk@1.2.8': 342 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 343 | engines: {node: '>= 8'} 344 | 345 | '@pkgjs/parseargs@0.11.0': 346 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 347 | engines: {node: '>=14'} 348 | 349 | '@pkgr/core@0.2.7': 350 | resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} 351 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 352 | 353 | '@rollup/rollup-android-arm-eabi@4.52.4': 354 | resolution: {integrity: sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==} 355 | cpu: [arm] 356 | os: [android] 357 | 358 | '@rollup/rollup-android-arm64@4.52.4': 359 | resolution: {integrity: sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==} 360 | cpu: [arm64] 361 | os: [android] 362 | 363 | '@rollup/rollup-darwin-arm64@4.52.4': 364 | resolution: {integrity: sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==} 365 | cpu: [arm64] 366 | os: [darwin] 367 | 368 | '@rollup/rollup-darwin-x64@4.52.4': 369 | resolution: {integrity: sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==} 370 | cpu: [x64] 371 | os: [darwin] 372 | 373 | '@rollup/rollup-freebsd-arm64@4.52.4': 374 | resolution: {integrity: sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==} 375 | cpu: [arm64] 376 | os: [freebsd] 377 | 378 | '@rollup/rollup-freebsd-x64@4.52.4': 379 | resolution: {integrity: sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==} 380 | cpu: [x64] 381 | os: [freebsd] 382 | 383 | '@rollup/rollup-linux-arm-gnueabihf@4.52.4': 384 | resolution: {integrity: sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==} 385 | cpu: [arm] 386 | os: [linux] 387 | 388 | '@rollup/rollup-linux-arm-musleabihf@4.52.4': 389 | resolution: {integrity: sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==} 390 | cpu: [arm] 391 | os: [linux] 392 | 393 | '@rollup/rollup-linux-arm64-gnu@4.52.4': 394 | resolution: {integrity: sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==} 395 | cpu: [arm64] 396 | os: [linux] 397 | 398 | '@rollup/rollup-linux-arm64-musl@4.52.4': 399 | resolution: {integrity: sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==} 400 | cpu: [arm64] 401 | os: [linux] 402 | 403 | '@rollup/rollup-linux-loong64-gnu@4.52.4': 404 | resolution: {integrity: sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==} 405 | cpu: [loong64] 406 | os: [linux] 407 | 408 | '@rollup/rollup-linux-ppc64-gnu@4.52.4': 409 | resolution: {integrity: sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==} 410 | cpu: [ppc64] 411 | os: [linux] 412 | 413 | '@rollup/rollup-linux-riscv64-gnu@4.52.4': 414 | resolution: {integrity: sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==} 415 | cpu: [riscv64] 416 | os: [linux] 417 | 418 | '@rollup/rollup-linux-riscv64-musl@4.52.4': 419 | resolution: {integrity: sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==} 420 | cpu: [riscv64] 421 | os: [linux] 422 | 423 | '@rollup/rollup-linux-s390x-gnu@4.52.4': 424 | resolution: {integrity: sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==} 425 | cpu: [s390x] 426 | os: [linux] 427 | 428 | '@rollup/rollup-linux-x64-gnu@4.52.4': 429 | resolution: {integrity: sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==} 430 | cpu: [x64] 431 | os: [linux] 432 | 433 | '@rollup/rollup-linux-x64-musl@4.52.4': 434 | resolution: {integrity: sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==} 435 | cpu: [x64] 436 | os: [linux] 437 | 438 | '@rollup/rollup-openharmony-arm64@4.52.4': 439 | resolution: {integrity: sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==} 440 | cpu: [arm64] 441 | os: [openharmony] 442 | 443 | '@rollup/rollup-win32-arm64-msvc@4.52.4': 444 | resolution: {integrity: sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==} 445 | cpu: [arm64] 446 | os: [win32] 447 | 448 | '@rollup/rollup-win32-ia32-msvc@4.52.4': 449 | resolution: {integrity: sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==} 450 | cpu: [ia32] 451 | os: [win32] 452 | 453 | '@rollup/rollup-win32-x64-gnu@4.52.4': 454 | resolution: {integrity: sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==} 455 | cpu: [x64] 456 | os: [win32] 457 | 458 | '@rollup/rollup-win32-x64-msvc@4.52.4': 459 | resolution: {integrity: sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==} 460 | cpu: [x64] 461 | os: [win32] 462 | 463 | '@shahrad/eslint-config@1.0.1': 464 | resolution: {integrity: sha512-Gfjh8cdcptBjL14dWACJZ0tZy8KJdcVsOVWmyKa82v5PoLPZ4avMrT1hJyEWg0APhS1054M/udaBrlCAuHJ9XQ==} 465 | 466 | '@shahrad/prettier-config@1.2.2': 467 | resolution: {integrity: sha512-D6yRqGjD9mhdC5cWQkdoatybNmp6eZJZQ1IerFaANQL1pgtNyEasE2yFy3JdDxJRbHcL2GeaI/03tEPchU+Ddw==} 468 | peerDependencies: 469 | '@ianvs/prettier-plugin-sort-imports': ^4.4 470 | prettier: '>=3.0.0' 471 | prettier-plugin-packagejson: ^2.5 472 | prettier-plugin-sh: ^0.15 473 | 474 | '@shahrad/tsconfig@1.2.0': 475 | resolution: {integrity: sha512-5NM7tPrvUGF+VPqNgsjgWJ5aLJBcNiM/7aAsXw3PEZVek4Mfxq4vd7BLbjUsYd9HizgaNeCmfK5kIsxtCXp7/Q==} 476 | engines: {node: '>=18'} 477 | 478 | '@types/chai@5.2.2': 479 | resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} 480 | 481 | '@types/deep-eql@4.0.2': 482 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 483 | 484 | '@types/estree@1.0.8': 485 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 486 | 487 | '@types/json-schema@7.0.15': 488 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 489 | 490 | '@types/node@24.7.1': 491 | resolution: {integrity: sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==} 492 | 493 | '@typescript-eslint/eslint-plugin@8.46.0': 494 | resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} 495 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 496 | peerDependencies: 497 | '@typescript-eslint/parser': ^8.46.0 498 | eslint: ^8.57.0 || ^9.0.0 499 | typescript: '>=4.8.4 <6.0.0' 500 | 501 | '@typescript-eslint/parser@8.46.0': 502 | resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} 503 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 504 | peerDependencies: 505 | eslint: ^8.57.0 || ^9.0.0 506 | typescript: '>=4.8.4 <6.0.0' 507 | 508 | '@typescript-eslint/project-service@8.46.0': 509 | resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} 510 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 511 | peerDependencies: 512 | typescript: '>=4.8.4 <6.0.0' 513 | 514 | '@typescript-eslint/scope-manager@8.46.0': 515 | resolution: {integrity: sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==} 516 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 517 | 518 | '@typescript-eslint/tsconfig-utils@8.46.0': 519 | resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} 520 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 521 | peerDependencies: 522 | typescript: '>=4.8.4 <6.0.0' 523 | 524 | '@typescript-eslint/type-utils@8.46.0': 525 | resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} 526 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 527 | peerDependencies: 528 | eslint: ^8.57.0 || ^9.0.0 529 | typescript: '>=4.8.4 <6.0.0' 530 | 531 | '@typescript-eslint/types@8.46.0': 532 | resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} 533 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 534 | 535 | '@typescript-eslint/typescript-estree@8.46.0': 536 | resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} 537 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 538 | peerDependencies: 539 | typescript: '>=4.8.4 <6.0.0' 540 | 541 | '@typescript-eslint/utils@8.46.0': 542 | resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} 543 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 544 | peerDependencies: 545 | eslint: ^8.57.0 || ^9.0.0 546 | typescript: '>=4.8.4 <6.0.0' 547 | 548 | '@typescript-eslint/visitor-keys@8.46.0': 549 | resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} 550 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 551 | 552 | '@vitest/expect@3.2.4': 553 | resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} 554 | 555 | '@vitest/mocker@3.2.4': 556 | resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} 557 | peerDependencies: 558 | msw: ^2.4.9 559 | vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 560 | peerDependenciesMeta: 561 | msw: 562 | optional: true 563 | vite: 564 | optional: true 565 | 566 | '@vitest/pretty-format@3.2.4': 567 | resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} 568 | 569 | '@vitest/runner@3.2.4': 570 | resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} 571 | 572 | '@vitest/snapshot@3.2.4': 573 | resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} 574 | 575 | '@vitest/spy@3.2.4': 576 | resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} 577 | 578 | '@vitest/utils@3.2.4': 579 | resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} 580 | 581 | acorn-jsx@5.3.2: 582 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 583 | peerDependencies: 584 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 585 | 586 | acorn@8.15.0: 587 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 588 | engines: {node: '>=0.4.0'} 589 | hasBin: true 590 | 591 | ajv@6.12.6: 592 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 593 | 594 | ansi-regex@5.0.1: 595 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 596 | engines: {node: '>=8'} 597 | 598 | ansi-regex@6.1.0: 599 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 600 | engines: {node: '>=12'} 601 | 602 | ansi-styles@4.3.0: 603 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 604 | engines: {node: '>=8'} 605 | 606 | ansi-styles@6.2.1: 607 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 608 | engines: {node: '>=12'} 609 | 610 | any-promise@1.3.0: 611 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 612 | 613 | argparse@2.0.1: 614 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 615 | 616 | assertion-error@2.0.1: 617 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 618 | engines: {node: '>=12'} 619 | 620 | balanced-match@1.0.2: 621 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 622 | 623 | brace-expansion@1.1.12: 624 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 625 | 626 | brace-expansion@2.0.2: 627 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 628 | 629 | braces@3.0.3: 630 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 631 | engines: {node: '>=8'} 632 | 633 | bundle-require@5.1.0: 634 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 635 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 636 | peerDependencies: 637 | esbuild: '>=0.18' 638 | 639 | cac@6.7.14: 640 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 641 | engines: {node: '>=8'} 642 | 643 | callsites@3.1.0: 644 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 645 | engines: {node: '>=6'} 646 | 647 | chai@5.2.1: 648 | resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} 649 | engines: {node: '>=18'} 650 | 651 | chalk@4.1.2: 652 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 653 | engines: {node: '>=10'} 654 | 655 | check-error@2.1.1: 656 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 657 | engines: {node: '>= 16'} 658 | 659 | chokidar@4.0.3: 660 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 661 | engines: {node: '>= 14.16.0'} 662 | 663 | color-convert@2.0.1: 664 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 665 | engines: {node: '>=7.0.0'} 666 | 667 | color-name@1.1.4: 668 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 669 | 670 | commander@4.1.1: 671 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 672 | engines: {node: '>= 6'} 673 | 674 | concat-map@0.0.1: 675 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 676 | 677 | confbox@0.1.8: 678 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 679 | 680 | consola@3.4.2: 681 | resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 682 | engines: {node: ^14.18.0 || >=16.10.0} 683 | 684 | cross-spawn@7.0.6: 685 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 686 | engines: {node: '>= 8'} 687 | 688 | debug@4.4.1: 689 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 690 | engines: {node: '>=6.0'} 691 | peerDependencies: 692 | supports-color: '*' 693 | peerDependenciesMeta: 694 | supports-color: 695 | optional: true 696 | 697 | deep-eql@5.0.2: 698 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 699 | engines: {node: '>=6'} 700 | 701 | deep-is@0.1.4: 702 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 703 | 704 | detect-indent@7.0.1: 705 | resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} 706 | engines: {node: '>=12.20'} 707 | 708 | detect-newline@4.0.1: 709 | resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} 710 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 711 | 712 | eastasianwidth@0.2.0: 713 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 714 | 715 | emoji-regex@8.0.0: 716 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 717 | 718 | emoji-regex@9.2.2: 719 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 720 | 721 | es-module-lexer@1.7.0: 722 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 723 | 724 | esbuild@0.25.9: 725 | resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} 726 | engines: {node: '>=18'} 727 | hasBin: true 728 | 729 | escape-string-regexp@4.0.0: 730 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 731 | engines: {node: '>=10'} 732 | 733 | eslint-scope@8.4.0: 734 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 735 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 736 | 737 | eslint-visitor-keys@3.4.3: 738 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 739 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 740 | 741 | eslint-visitor-keys@4.2.1: 742 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 743 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 744 | 745 | eslint@9.37.0: 746 | resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} 747 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 748 | hasBin: true 749 | peerDependencies: 750 | jiti: '*' 751 | peerDependenciesMeta: 752 | jiti: 753 | optional: true 754 | 755 | espree@10.4.0: 756 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 757 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 758 | 759 | esquery@1.6.0: 760 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 761 | engines: {node: '>=0.10'} 762 | 763 | esrecurse@4.3.0: 764 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 765 | engines: {node: '>=4.0'} 766 | 767 | estraverse@5.3.0: 768 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 769 | engines: {node: '>=4.0'} 770 | 771 | estree-walker@3.0.3: 772 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 773 | 774 | esutils@2.0.3: 775 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 776 | engines: {node: '>=0.10.0'} 777 | 778 | expect-type@1.2.1: 779 | resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} 780 | engines: {node: '>=12.0.0'} 781 | 782 | fast-deep-equal@3.1.3: 783 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 784 | 785 | fast-glob@3.3.3: 786 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 787 | engines: {node: '>=8.6.0'} 788 | 789 | fast-json-stable-stringify@2.1.0: 790 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 791 | 792 | fast-levenshtein@2.0.6: 793 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 794 | 795 | fastq@1.19.1: 796 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 797 | 798 | fdir@6.5.0: 799 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 800 | engines: {node: '>=12.0.0'} 801 | peerDependencies: 802 | picomatch: ^3 || ^4 803 | peerDependenciesMeta: 804 | picomatch: 805 | optional: true 806 | 807 | file-entry-cache@8.0.0: 808 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 809 | engines: {node: '>=16.0.0'} 810 | 811 | fill-range@7.1.1: 812 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 813 | engines: {node: '>=8'} 814 | 815 | find-up@5.0.0: 816 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 817 | engines: {node: '>=10'} 818 | 819 | fix-dts-default-cjs-exports@1.0.1: 820 | resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} 821 | 822 | flat-cache@4.0.1: 823 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 824 | engines: {node: '>=16'} 825 | 826 | flatted@3.3.3: 827 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 828 | 829 | foreground-child@3.3.1: 830 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 831 | engines: {node: '>=14'} 832 | 833 | fsevents@2.3.3: 834 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 835 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 836 | os: [darwin] 837 | 838 | get-tsconfig@4.10.1: 839 | resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} 840 | 841 | git-hooks-list@4.1.1: 842 | resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} 843 | 844 | glob-parent@5.1.2: 845 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 846 | engines: {node: '>= 6'} 847 | 848 | glob-parent@6.0.2: 849 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 850 | engines: {node: '>=10.13.0'} 851 | 852 | glob@10.4.5: 853 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 854 | hasBin: true 855 | 856 | globals@14.0.0: 857 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 858 | engines: {node: '>=18'} 859 | 860 | globals@16.4.0: 861 | resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} 862 | engines: {node: '>=18'} 863 | 864 | graphemer@1.4.0: 865 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 866 | 867 | has-flag@4.0.0: 868 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 869 | engines: {node: '>=8'} 870 | 871 | ignore@5.3.2: 872 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 873 | engines: {node: '>= 4'} 874 | 875 | ignore@7.0.5: 876 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 877 | engines: {node: '>= 4'} 878 | 879 | import-fresh@3.3.1: 880 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 881 | engines: {node: '>=6'} 882 | 883 | imurmurhash@0.1.4: 884 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 885 | engines: {node: '>=0.8.19'} 886 | 887 | is-extglob@2.1.1: 888 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 889 | engines: {node: '>=0.10.0'} 890 | 891 | is-fullwidth-code-point@3.0.0: 892 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 893 | engines: {node: '>=8'} 894 | 895 | is-glob@4.0.3: 896 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 897 | engines: {node: '>=0.10.0'} 898 | 899 | is-number@7.0.0: 900 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 901 | engines: {node: '>=0.12.0'} 902 | 903 | is-plain-obj@4.1.0: 904 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 905 | engines: {node: '>=12'} 906 | 907 | isexe@2.0.0: 908 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 909 | 910 | jackspeak@3.4.3: 911 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 912 | 913 | jiti@2.5.1: 914 | resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} 915 | hasBin: true 916 | 917 | joycon@3.1.1: 918 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 919 | engines: {node: '>=10'} 920 | 921 | js-tokens@4.0.0: 922 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 923 | 924 | js-tokens@9.0.1: 925 | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} 926 | 927 | js-yaml@4.1.0: 928 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 929 | hasBin: true 930 | 931 | jsesc@3.1.0: 932 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 933 | engines: {node: '>=6'} 934 | hasBin: true 935 | 936 | json-buffer@3.0.1: 937 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 938 | 939 | json-schema-traverse@0.4.1: 940 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 941 | 942 | json-stable-stringify-without-jsonify@1.0.1: 943 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 944 | 945 | keyv@4.5.4: 946 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 947 | 948 | levn@0.4.1: 949 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 950 | engines: {node: '>= 0.8.0'} 951 | 952 | lilconfig@3.1.3: 953 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 954 | engines: {node: '>=14'} 955 | 956 | lines-and-columns@1.2.4: 957 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 958 | 959 | load-tsconfig@0.2.5: 960 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 961 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 962 | 963 | locate-path@6.0.0: 964 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 965 | engines: {node: '>=10'} 966 | 967 | lodash.merge@4.6.2: 968 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 969 | 970 | lodash.sortby@4.7.0: 971 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 972 | 973 | loupe@3.1.4: 974 | resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} 975 | 976 | lru-cache@10.4.3: 977 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 978 | 979 | lru-cache@11.2.2: 980 | resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} 981 | engines: {node: 20 || >=22} 982 | 983 | magic-string@0.30.19: 984 | resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} 985 | 986 | merge2@1.4.1: 987 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 988 | engines: {node: '>= 8'} 989 | 990 | micromatch@4.0.8: 991 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 992 | engines: {node: '>=8.6'} 993 | 994 | minimatch@3.1.2: 995 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 996 | 997 | minimatch@9.0.5: 998 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 999 | engines: {node: '>=16 || 14 >=14.17'} 1000 | 1001 | minipass@7.1.2: 1002 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1003 | engines: {node: '>=16 || 14 >=14.17'} 1004 | 1005 | mlly@1.7.4: 1006 | resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} 1007 | 1008 | ms@2.1.3: 1009 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1010 | 1011 | mvdan-sh@0.10.1: 1012 | resolution: {integrity: sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==} 1013 | deprecated: See https://github.com/mvdan/sh/issues/1145 1014 | 1015 | mz@2.7.0: 1016 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1017 | 1018 | nanoid@3.3.11: 1019 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1020 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1021 | hasBin: true 1022 | 1023 | natural-compare@1.4.0: 1024 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1025 | 1026 | object-assign@4.1.1: 1027 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1028 | engines: {node: '>=0.10.0'} 1029 | 1030 | optionator@0.9.4: 1031 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1032 | engines: {node: '>= 0.8.0'} 1033 | 1034 | p-limit@3.1.0: 1035 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1036 | engines: {node: '>=10'} 1037 | 1038 | p-locate@5.0.0: 1039 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1040 | engines: {node: '>=10'} 1041 | 1042 | package-json-from-dist@1.0.1: 1043 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1044 | 1045 | parent-module@1.0.1: 1046 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1047 | engines: {node: '>=6'} 1048 | 1049 | path-exists@4.0.0: 1050 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1051 | engines: {node: '>=8'} 1052 | 1053 | path-key@3.1.1: 1054 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1055 | engines: {node: '>=8'} 1056 | 1057 | path-scurry@1.11.1: 1058 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1059 | engines: {node: '>=16 || 14 >=14.18'} 1060 | 1061 | pathe@2.0.3: 1062 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1063 | 1064 | pathval@2.0.1: 1065 | resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} 1066 | engines: {node: '>= 14.16'} 1067 | 1068 | picocolors@1.1.1: 1069 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1070 | 1071 | picomatch@2.3.1: 1072 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1073 | engines: {node: '>=8.6'} 1074 | 1075 | picomatch@4.0.3: 1076 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1077 | engines: {node: '>=12'} 1078 | 1079 | pirates@4.0.7: 1080 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 1081 | engines: {node: '>= 6'} 1082 | 1083 | pkg-types@1.3.1: 1084 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1085 | 1086 | postcss-load-config@6.0.1: 1087 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1088 | engines: {node: '>= 18'} 1089 | peerDependencies: 1090 | jiti: '>=1.21.0' 1091 | postcss: '>=8.0.9' 1092 | tsx: ^4.8.1 1093 | yaml: ^2.4.2 1094 | peerDependenciesMeta: 1095 | jiti: 1096 | optional: true 1097 | postcss: 1098 | optional: true 1099 | tsx: 1100 | optional: true 1101 | yaml: 1102 | optional: true 1103 | 1104 | postcss@8.5.6: 1105 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1106 | engines: {node: ^10 || ^12 || >=14} 1107 | 1108 | prelude-ls@1.2.1: 1109 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1110 | engines: {node: '>= 0.8.0'} 1111 | 1112 | prettier-plugin-packagejson@2.5.18: 1113 | resolution: {integrity: sha512-NKznPGcGrcj4NPGxnh+w78JXPyfB6I4RQSCM0v+CAXwpDG7OEpJQ5zMyfC5NBgKH1k7Skwcj5ak5by2mrHvC5g==} 1114 | peerDependencies: 1115 | prettier: '>= 1.16.0' 1116 | peerDependenciesMeta: 1117 | prettier: 1118 | optional: true 1119 | 1120 | prettier-plugin-sh@0.15.0: 1121 | resolution: {integrity: sha512-U0PikJr/yr2bzzARl43qI0mApBj0C1xdAfA04AZa6LnvIKawXHhuy2fFo6LNA7weRzGlAiNbaEFfKMFo0nZr/A==} 1122 | engines: {node: '>=16.0.0'} 1123 | peerDependencies: 1124 | prettier: ^3.0.3 1125 | 1126 | prettier@3.6.2: 1127 | resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 1128 | engines: {node: '>=14'} 1129 | hasBin: true 1130 | 1131 | punycode@2.3.1: 1132 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1133 | engines: {node: '>=6'} 1134 | 1135 | queue-microtask@1.2.3: 1136 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1137 | 1138 | quick-lru@7.3.0: 1139 | resolution: {integrity: sha512-k9lSsjl36EJdK7I06v7APZCbyGT2vMTsYSRX1Q2nbYmnkBqgUhRkAuzH08Ciotteu/PLJmIF2+tti7o3C/ts2g==} 1140 | engines: {node: '>=18'} 1141 | 1142 | readdirp@4.1.2: 1143 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1144 | engines: {node: '>= 14.18.0'} 1145 | 1146 | resolve-from@4.0.0: 1147 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1148 | engines: {node: '>=4'} 1149 | 1150 | resolve-from@5.0.0: 1151 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1152 | engines: {node: '>=8'} 1153 | 1154 | resolve-pkg-maps@1.0.0: 1155 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1156 | 1157 | reusify@1.1.0: 1158 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1159 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1160 | 1161 | rollup@4.52.4: 1162 | resolution: {integrity: sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==} 1163 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1164 | hasBin: true 1165 | 1166 | run-parallel@1.2.0: 1167 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1168 | 1169 | semver@7.7.2: 1170 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1171 | engines: {node: '>=10'} 1172 | hasBin: true 1173 | 1174 | sh-syntax@0.4.2: 1175 | resolution: {integrity: sha512-/l2UZ5fhGZLVZa16XQM9/Vq/hezGGbdHeVEA01uWjOL1+7Ek/gt6FquW0iKKws4a9AYPYvlz6RyVvjh3JxOteg==} 1176 | engines: {node: '>=16.0.0'} 1177 | 1178 | shebang-command@2.0.0: 1179 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1180 | engines: {node: '>=8'} 1181 | 1182 | shebang-regex@3.0.0: 1183 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1184 | engines: {node: '>=8'} 1185 | 1186 | siginfo@2.0.0: 1187 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1188 | 1189 | signal-exit@4.1.0: 1190 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1191 | engines: {node: '>=14'} 1192 | 1193 | sort-object-keys@1.1.3: 1194 | resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} 1195 | 1196 | sort-package-json@3.4.0: 1197 | resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==} 1198 | engines: {node: '>=20'} 1199 | hasBin: true 1200 | 1201 | source-map-js@1.2.1: 1202 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1203 | engines: {node: '>=0.10.0'} 1204 | 1205 | source-map@0.8.0-beta.0: 1206 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1207 | engines: {node: '>= 8'} 1208 | deprecated: The work that was done in this beta branch won't be included in future versions 1209 | 1210 | stackback@0.0.2: 1211 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1212 | 1213 | std-env@3.9.0: 1214 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} 1215 | 1216 | string-width@4.2.3: 1217 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1218 | engines: {node: '>=8'} 1219 | 1220 | string-width@5.1.2: 1221 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1222 | engines: {node: '>=12'} 1223 | 1224 | strip-ansi@6.0.1: 1225 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1226 | engines: {node: '>=8'} 1227 | 1228 | strip-ansi@7.1.0: 1229 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1230 | engines: {node: '>=12'} 1231 | 1232 | strip-json-comments@3.1.1: 1233 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1234 | engines: {node: '>=8'} 1235 | 1236 | strip-literal@3.0.0: 1237 | resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} 1238 | 1239 | sucrase@3.35.0: 1240 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1241 | engines: {node: '>=16 || 14 >=14.17'} 1242 | hasBin: true 1243 | 1244 | supports-color@7.2.0: 1245 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1246 | engines: {node: '>=8'} 1247 | 1248 | synckit@0.11.8: 1249 | resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 1250 | engines: {node: ^14.18.0 || >=16.0.0} 1251 | 1252 | thenify-all@1.6.0: 1253 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1254 | engines: {node: '>=0.8'} 1255 | 1256 | thenify@3.3.1: 1257 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1258 | 1259 | tiny-lru@11.4.5: 1260 | resolution: {integrity: sha512-hkcz3FjNJfKXjV4mjQ1OrXSLAehg8Hw+cEZclOVT+5c/cWQWImQ9wolzTjth+dmmDe++p3bme3fTxz6Q4Etsqw==} 1261 | engines: {node: '>=12'} 1262 | 1263 | tinybench@2.9.0: 1264 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1265 | 1266 | tinyexec@0.3.2: 1267 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1268 | 1269 | tinyglobby@0.2.15: 1270 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1271 | engines: {node: '>=12.0.0'} 1272 | 1273 | tinypool@1.1.1: 1274 | resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} 1275 | engines: {node: ^18.0.0 || >=20.0.0} 1276 | 1277 | tinyrainbow@2.0.0: 1278 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 1279 | engines: {node: '>=14.0.0'} 1280 | 1281 | tinyspy@4.0.3: 1282 | resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} 1283 | engines: {node: '>=14.0.0'} 1284 | 1285 | to-regex-range@5.0.1: 1286 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1287 | engines: {node: '>=8.0'} 1288 | 1289 | tr46@1.0.1: 1290 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1291 | 1292 | tree-kill@1.2.2: 1293 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1294 | hasBin: true 1295 | 1296 | ts-api-utils@2.1.0: 1297 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1298 | engines: {node: '>=18.12'} 1299 | peerDependencies: 1300 | typescript: '>=4.8.4' 1301 | 1302 | ts-interface-checker@0.1.13: 1303 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1304 | 1305 | tslib@2.8.1: 1306 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1307 | 1308 | tsup@8.5.0: 1309 | resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} 1310 | engines: {node: '>=18'} 1311 | hasBin: true 1312 | peerDependencies: 1313 | '@microsoft/api-extractor': ^7.36.0 1314 | '@swc/core': ^1 1315 | postcss: ^8.4.12 1316 | typescript: '>=4.5.0' 1317 | peerDependenciesMeta: 1318 | '@microsoft/api-extractor': 1319 | optional: true 1320 | '@swc/core': 1321 | optional: true 1322 | postcss: 1323 | optional: true 1324 | typescript: 1325 | optional: true 1326 | 1327 | tsx@4.20.6: 1328 | resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} 1329 | engines: {node: '>=18.0.0'} 1330 | hasBin: true 1331 | 1332 | type-check@0.4.0: 1333 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1334 | engines: {node: '>= 0.8.0'} 1335 | 1336 | typescript-eslint@8.46.0: 1337 | resolution: {integrity: sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==} 1338 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1339 | peerDependencies: 1340 | eslint: ^8.57.0 || ^9.0.0 1341 | typescript: '>=4.8.4 <6.0.0' 1342 | 1343 | typescript@5.9.3: 1344 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1345 | engines: {node: '>=14.17'} 1346 | hasBin: true 1347 | 1348 | ufo@1.6.1: 1349 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1350 | 1351 | undici-types@7.14.0: 1352 | resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} 1353 | 1354 | uri-js@4.4.1: 1355 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1356 | 1357 | vite-node@3.2.4: 1358 | resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} 1359 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1360 | hasBin: true 1361 | 1362 | vite@7.1.7: 1363 | resolution: {integrity: sha512-VbA8ScMvAISJNJVbRDTJdCwqQoAareR/wutevKanhR2/1EkoXVZVkkORaYm/tNVCjP/UDTKtcw3bAkwOUdedmA==} 1364 | engines: {node: ^20.19.0 || >=22.12.0} 1365 | hasBin: true 1366 | peerDependencies: 1367 | '@types/node': ^20.19.0 || >=22.12.0 1368 | jiti: '>=1.21.0' 1369 | less: ^4.0.0 1370 | lightningcss: ^1.21.0 1371 | sass: ^1.70.0 1372 | sass-embedded: ^1.70.0 1373 | stylus: '>=0.54.8' 1374 | sugarss: ^5.0.0 1375 | terser: ^5.16.0 1376 | tsx: ^4.8.1 1377 | yaml: ^2.4.2 1378 | peerDependenciesMeta: 1379 | '@types/node': 1380 | optional: true 1381 | jiti: 1382 | optional: true 1383 | less: 1384 | optional: true 1385 | lightningcss: 1386 | optional: true 1387 | sass: 1388 | optional: true 1389 | sass-embedded: 1390 | optional: true 1391 | stylus: 1392 | optional: true 1393 | sugarss: 1394 | optional: true 1395 | terser: 1396 | optional: true 1397 | tsx: 1398 | optional: true 1399 | yaml: 1400 | optional: true 1401 | 1402 | vitest@3.2.4: 1403 | resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} 1404 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1405 | hasBin: true 1406 | peerDependencies: 1407 | '@edge-runtime/vm': '*' 1408 | '@types/debug': ^4.1.12 1409 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1410 | '@vitest/browser': 3.2.4 1411 | '@vitest/ui': 3.2.4 1412 | happy-dom: '*' 1413 | jsdom: '*' 1414 | peerDependenciesMeta: 1415 | '@edge-runtime/vm': 1416 | optional: true 1417 | '@types/debug': 1418 | optional: true 1419 | '@types/node': 1420 | optional: true 1421 | '@vitest/browser': 1422 | optional: true 1423 | '@vitest/ui': 1424 | optional: true 1425 | happy-dom: 1426 | optional: true 1427 | jsdom: 1428 | optional: true 1429 | 1430 | webidl-conversions@4.0.2: 1431 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1432 | 1433 | whatwg-url@7.1.0: 1434 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1435 | 1436 | which@2.0.2: 1437 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1438 | engines: {node: '>= 8'} 1439 | hasBin: true 1440 | 1441 | why-is-node-running@2.3.0: 1442 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1443 | engines: {node: '>=8'} 1444 | hasBin: true 1445 | 1446 | word-wrap@1.2.5: 1447 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1448 | engines: {node: '>=0.10.0'} 1449 | 1450 | wrap-ansi@7.0.0: 1451 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1452 | engines: {node: '>=10'} 1453 | 1454 | wrap-ansi@8.1.0: 1455 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1456 | engines: {node: '>=12'} 1457 | 1458 | yocto-queue@0.1.0: 1459 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1460 | engines: {node: '>=10'} 1461 | 1462 | snapshots: 1463 | 1464 | '@babel/code-frame@7.27.1': 1465 | dependencies: 1466 | '@babel/helper-validator-identifier': 7.27.1 1467 | js-tokens: 4.0.0 1468 | picocolors: 1.1.1 1469 | 1470 | '@babel/generator@7.28.3': 1471 | dependencies: 1472 | '@babel/parser': 7.28.4 1473 | '@babel/types': 7.28.4 1474 | '@jridgewell/gen-mapping': 0.3.12 1475 | '@jridgewell/trace-mapping': 0.3.29 1476 | jsesc: 3.1.0 1477 | 1478 | '@babel/helper-globals@7.28.0': {} 1479 | 1480 | '@babel/helper-string-parser@7.27.1': {} 1481 | 1482 | '@babel/helper-validator-identifier@7.27.1': {} 1483 | 1484 | '@babel/parser@7.28.4': 1485 | dependencies: 1486 | '@babel/types': 7.28.4 1487 | 1488 | '@babel/template@7.27.2': 1489 | dependencies: 1490 | '@babel/code-frame': 7.27.1 1491 | '@babel/parser': 7.28.4 1492 | '@babel/types': 7.28.4 1493 | 1494 | '@babel/traverse@7.28.4': 1495 | dependencies: 1496 | '@babel/code-frame': 7.27.1 1497 | '@babel/generator': 7.28.3 1498 | '@babel/helper-globals': 7.28.0 1499 | '@babel/parser': 7.28.4 1500 | '@babel/template': 7.27.2 1501 | '@babel/types': 7.28.4 1502 | debug: 4.4.1 1503 | transitivePeerDependencies: 1504 | - supports-color 1505 | 1506 | '@babel/types@7.28.4': 1507 | dependencies: 1508 | '@babel/helper-string-parser': 7.27.1 1509 | '@babel/helper-validator-identifier': 7.27.1 1510 | 1511 | '@esbuild/aix-ppc64@0.25.9': 1512 | optional: true 1513 | 1514 | '@esbuild/android-arm64@0.25.9': 1515 | optional: true 1516 | 1517 | '@esbuild/android-arm@0.25.9': 1518 | optional: true 1519 | 1520 | '@esbuild/android-x64@0.25.9': 1521 | optional: true 1522 | 1523 | '@esbuild/darwin-arm64@0.25.9': 1524 | optional: true 1525 | 1526 | '@esbuild/darwin-x64@0.25.9': 1527 | optional: true 1528 | 1529 | '@esbuild/freebsd-arm64@0.25.9': 1530 | optional: true 1531 | 1532 | '@esbuild/freebsd-x64@0.25.9': 1533 | optional: true 1534 | 1535 | '@esbuild/linux-arm64@0.25.9': 1536 | optional: true 1537 | 1538 | '@esbuild/linux-arm@0.25.9': 1539 | optional: true 1540 | 1541 | '@esbuild/linux-ia32@0.25.9': 1542 | optional: true 1543 | 1544 | '@esbuild/linux-loong64@0.25.9': 1545 | optional: true 1546 | 1547 | '@esbuild/linux-mips64el@0.25.9': 1548 | optional: true 1549 | 1550 | '@esbuild/linux-ppc64@0.25.9': 1551 | optional: true 1552 | 1553 | '@esbuild/linux-riscv64@0.25.9': 1554 | optional: true 1555 | 1556 | '@esbuild/linux-s390x@0.25.9': 1557 | optional: true 1558 | 1559 | '@esbuild/linux-x64@0.25.9': 1560 | optional: true 1561 | 1562 | '@esbuild/netbsd-arm64@0.25.9': 1563 | optional: true 1564 | 1565 | '@esbuild/netbsd-x64@0.25.9': 1566 | optional: true 1567 | 1568 | '@esbuild/openbsd-arm64@0.25.9': 1569 | optional: true 1570 | 1571 | '@esbuild/openbsd-x64@0.25.9': 1572 | optional: true 1573 | 1574 | '@esbuild/openharmony-arm64@0.25.9': 1575 | optional: true 1576 | 1577 | '@esbuild/sunos-x64@0.25.9': 1578 | optional: true 1579 | 1580 | '@esbuild/win32-arm64@0.25.9': 1581 | optional: true 1582 | 1583 | '@esbuild/win32-ia32@0.25.9': 1584 | optional: true 1585 | 1586 | '@esbuild/win32-x64@0.25.9': 1587 | optional: true 1588 | 1589 | '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.5.1))': 1590 | dependencies: 1591 | eslint: 9.37.0(jiti@2.5.1) 1592 | eslint-visitor-keys: 3.4.3 1593 | 1594 | '@eslint-community/regexpp@4.12.1': {} 1595 | 1596 | '@eslint/config-array@0.21.0': 1597 | dependencies: 1598 | '@eslint/object-schema': 2.1.6 1599 | debug: 4.4.1 1600 | minimatch: 3.1.2 1601 | transitivePeerDependencies: 1602 | - supports-color 1603 | 1604 | '@eslint/config-helpers@0.4.0': 1605 | dependencies: 1606 | '@eslint/core': 0.16.0 1607 | 1608 | '@eslint/core@0.16.0': 1609 | dependencies: 1610 | '@types/json-schema': 7.0.15 1611 | 1612 | '@eslint/eslintrc@3.3.1': 1613 | dependencies: 1614 | ajv: 6.12.6 1615 | debug: 4.4.1 1616 | espree: 10.4.0 1617 | globals: 14.0.0 1618 | ignore: 5.3.2 1619 | import-fresh: 3.3.1 1620 | js-yaml: 4.1.0 1621 | minimatch: 3.1.2 1622 | strip-json-comments: 3.1.1 1623 | transitivePeerDependencies: 1624 | - supports-color 1625 | 1626 | '@eslint/js@9.37.0': {} 1627 | 1628 | '@eslint/object-schema@2.1.6': {} 1629 | 1630 | '@eslint/plugin-kit@0.4.0': 1631 | dependencies: 1632 | '@eslint/core': 0.16.0 1633 | levn: 0.4.1 1634 | 1635 | '@humanfs/core@0.19.1': {} 1636 | 1637 | '@humanfs/node@0.16.6': 1638 | dependencies: 1639 | '@humanfs/core': 0.19.1 1640 | '@humanwhocodes/retry': 0.3.1 1641 | 1642 | '@humanwhocodes/module-importer@1.0.1': {} 1643 | 1644 | '@humanwhocodes/retry@0.3.1': {} 1645 | 1646 | '@humanwhocodes/retry@0.4.3': {} 1647 | 1648 | '@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.6.2)': 1649 | dependencies: 1650 | '@babel/generator': 7.28.3 1651 | '@babel/parser': 7.28.4 1652 | '@babel/traverse': 7.28.4 1653 | '@babel/types': 7.28.4 1654 | prettier: 3.6.2 1655 | semver: 7.7.2 1656 | transitivePeerDependencies: 1657 | - supports-color 1658 | 1659 | '@isaacs/cliui@8.0.2': 1660 | dependencies: 1661 | string-width: 5.1.2 1662 | string-width-cjs: string-width@4.2.3 1663 | strip-ansi: 7.1.0 1664 | strip-ansi-cjs: strip-ansi@6.0.1 1665 | wrap-ansi: 8.1.0 1666 | wrap-ansi-cjs: wrap-ansi@7.0.0 1667 | 1668 | '@jridgewell/gen-mapping@0.3.12': 1669 | dependencies: 1670 | '@jridgewell/sourcemap-codec': 1.5.5 1671 | '@jridgewell/trace-mapping': 0.3.29 1672 | 1673 | '@jridgewell/resolve-uri@3.1.2': {} 1674 | 1675 | '@jridgewell/sourcemap-codec@1.5.5': {} 1676 | 1677 | '@jridgewell/trace-mapping@0.3.29': 1678 | dependencies: 1679 | '@jridgewell/resolve-uri': 3.1.2 1680 | '@jridgewell/sourcemap-codec': 1.5.5 1681 | 1682 | '@nodelib/fs.scandir@2.1.5': 1683 | dependencies: 1684 | '@nodelib/fs.stat': 2.0.5 1685 | run-parallel: 1.2.0 1686 | 1687 | '@nodelib/fs.stat@2.0.5': {} 1688 | 1689 | '@nodelib/fs.walk@1.2.8': 1690 | dependencies: 1691 | '@nodelib/fs.scandir': 2.1.5 1692 | fastq: 1.19.1 1693 | 1694 | '@pkgjs/parseargs@0.11.0': 1695 | optional: true 1696 | 1697 | '@pkgr/core@0.2.7': {} 1698 | 1699 | '@rollup/rollup-android-arm-eabi@4.52.4': 1700 | optional: true 1701 | 1702 | '@rollup/rollup-android-arm64@4.52.4': 1703 | optional: true 1704 | 1705 | '@rollup/rollup-darwin-arm64@4.52.4': 1706 | optional: true 1707 | 1708 | '@rollup/rollup-darwin-x64@4.52.4': 1709 | optional: true 1710 | 1711 | '@rollup/rollup-freebsd-arm64@4.52.4': 1712 | optional: true 1713 | 1714 | '@rollup/rollup-freebsd-x64@4.52.4': 1715 | optional: true 1716 | 1717 | '@rollup/rollup-linux-arm-gnueabihf@4.52.4': 1718 | optional: true 1719 | 1720 | '@rollup/rollup-linux-arm-musleabihf@4.52.4': 1721 | optional: true 1722 | 1723 | '@rollup/rollup-linux-arm64-gnu@4.52.4': 1724 | optional: true 1725 | 1726 | '@rollup/rollup-linux-arm64-musl@4.52.4': 1727 | optional: true 1728 | 1729 | '@rollup/rollup-linux-loong64-gnu@4.52.4': 1730 | optional: true 1731 | 1732 | '@rollup/rollup-linux-ppc64-gnu@4.52.4': 1733 | optional: true 1734 | 1735 | '@rollup/rollup-linux-riscv64-gnu@4.52.4': 1736 | optional: true 1737 | 1738 | '@rollup/rollup-linux-riscv64-musl@4.52.4': 1739 | optional: true 1740 | 1741 | '@rollup/rollup-linux-s390x-gnu@4.52.4': 1742 | optional: true 1743 | 1744 | '@rollup/rollup-linux-x64-gnu@4.52.4': 1745 | optional: true 1746 | 1747 | '@rollup/rollup-linux-x64-musl@4.52.4': 1748 | optional: true 1749 | 1750 | '@rollup/rollup-openharmony-arm64@4.52.4': 1751 | optional: true 1752 | 1753 | '@rollup/rollup-win32-arm64-msvc@4.52.4': 1754 | optional: true 1755 | 1756 | '@rollup/rollup-win32-ia32-msvc@4.52.4': 1757 | optional: true 1758 | 1759 | '@rollup/rollup-win32-x64-gnu@4.52.4': 1760 | optional: true 1761 | 1762 | '@rollup/rollup-win32-x64-msvc@4.52.4': 1763 | optional: true 1764 | 1765 | '@shahrad/eslint-config@1.0.1(jiti@2.5.1)(typescript@5.9.3)': 1766 | dependencies: 1767 | '@eslint/js': 9.37.0 1768 | eslint: 9.37.0(jiti@2.5.1) 1769 | typescript-eslint: 8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3) 1770 | transitivePeerDependencies: 1771 | - jiti 1772 | - supports-color 1773 | - typescript 1774 | 1775 | '@shahrad/prettier-config@1.2.2(@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.6.2))(prettier-plugin-packagejson@2.5.18(prettier@3.6.2))(prettier-plugin-sh@0.15.0(prettier@3.6.2))(prettier@3.6.2)': 1776 | dependencies: 1777 | '@ianvs/prettier-plugin-sort-imports': 4.5.1(prettier@3.6.2) 1778 | prettier: 3.6.2 1779 | prettier-plugin-packagejson: 2.5.18(prettier@3.6.2) 1780 | prettier-plugin-sh: 0.15.0(prettier@3.6.2) 1781 | 1782 | '@shahrad/tsconfig@1.2.0': {} 1783 | 1784 | '@types/chai@5.2.2': 1785 | dependencies: 1786 | '@types/deep-eql': 4.0.2 1787 | 1788 | '@types/deep-eql@4.0.2': {} 1789 | 1790 | '@types/estree@1.0.8': {} 1791 | 1792 | '@types/json-schema@7.0.15': {} 1793 | 1794 | '@types/node@24.7.1': 1795 | dependencies: 1796 | undici-types: 7.14.0 1797 | 1798 | '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3)': 1799 | dependencies: 1800 | '@eslint-community/regexpp': 4.12.1 1801 | '@typescript-eslint/parser': 8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3) 1802 | '@typescript-eslint/scope-manager': 8.46.0 1803 | '@typescript-eslint/type-utils': 8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3) 1804 | '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3) 1805 | '@typescript-eslint/visitor-keys': 8.46.0 1806 | eslint: 9.37.0(jiti@2.5.1) 1807 | graphemer: 1.4.0 1808 | ignore: 7.0.5 1809 | natural-compare: 1.4.0 1810 | ts-api-utils: 2.1.0(typescript@5.9.3) 1811 | typescript: 5.9.3 1812 | transitivePeerDependencies: 1813 | - supports-color 1814 | 1815 | '@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3)': 1816 | dependencies: 1817 | '@typescript-eslint/scope-manager': 8.46.0 1818 | '@typescript-eslint/types': 8.46.0 1819 | '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) 1820 | '@typescript-eslint/visitor-keys': 8.46.0 1821 | debug: 4.4.1 1822 | eslint: 9.37.0(jiti@2.5.1) 1823 | typescript: 5.9.3 1824 | transitivePeerDependencies: 1825 | - supports-color 1826 | 1827 | '@typescript-eslint/project-service@8.46.0(typescript@5.9.3)': 1828 | dependencies: 1829 | '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) 1830 | '@typescript-eslint/types': 8.46.0 1831 | debug: 4.4.1 1832 | typescript: 5.9.3 1833 | transitivePeerDependencies: 1834 | - supports-color 1835 | 1836 | '@typescript-eslint/scope-manager@8.46.0': 1837 | dependencies: 1838 | '@typescript-eslint/types': 8.46.0 1839 | '@typescript-eslint/visitor-keys': 8.46.0 1840 | 1841 | '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3)': 1842 | dependencies: 1843 | typescript: 5.9.3 1844 | 1845 | '@typescript-eslint/type-utils@8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3)': 1846 | dependencies: 1847 | '@typescript-eslint/types': 8.46.0 1848 | '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) 1849 | '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3) 1850 | debug: 4.4.1 1851 | eslint: 9.37.0(jiti@2.5.1) 1852 | ts-api-utils: 2.1.0(typescript@5.9.3) 1853 | typescript: 5.9.3 1854 | transitivePeerDependencies: 1855 | - supports-color 1856 | 1857 | '@typescript-eslint/types@8.46.0': {} 1858 | 1859 | '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3)': 1860 | dependencies: 1861 | '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) 1862 | '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) 1863 | '@typescript-eslint/types': 8.46.0 1864 | '@typescript-eslint/visitor-keys': 8.46.0 1865 | debug: 4.4.1 1866 | fast-glob: 3.3.3 1867 | is-glob: 4.0.3 1868 | minimatch: 9.0.5 1869 | semver: 7.7.2 1870 | ts-api-utils: 2.1.0(typescript@5.9.3) 1871 | typescript: 5.9.3 1872 | transitivePeerDependencies: 1873 | - supports-color 1874 | 1875 | '@typescript-eslint/utils@8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3)': 1876 | dependencies: 1877 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.5.1)) 1878 | '@typescript-eslint/scope-manager': 8.46.0 1879 | '@typescript-eslint/types': 8.46.0 1880 | '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) 1881 | eslint: 9.37.0(jiti@2.5.1) 1882 | typescript: 5.9.3 1883 | transitivePeerDependencies: 1884 | - supports-color 1885 | 1886 | '@typescript-eslint/visitor-keys@8.46.0': 1887 | dependencies: 1888 | '@typescript-eslint/types': 8.46.0 1889 | eslint-visitor-keys: 4.2.1 1890 | 1891 | '@vitest/expect@3.2.4': 1892 | dependencies: 1893 | '@types/chai': 5.2.2 1894 | '@vitest/spy': 3.2.4 1895 | '@vitest/utils': 3.2.4 1896 | chai: 5.2.1 1897 | tinyrainbow: 2.0.0 1898 | 1899 | '@vitest/mocker@3.2.4(vite@7.1.7(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6))': 1900 | dependencies: 1901 | '@vitest/spy': 3.2.4 1902 | estree-walker: 3.0.3 1903 | magic-string: 0.30.19 1904 | optionalDependencies: 1905 | vite: 7.1.7(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6) 1906 | 1907 | '@vitest/pretty-format@3.2.4': 1908 | dependencies: 1909 | tinyrainbow: 2.0.0 1910 | 1911 | '@vitest/runner@3.2.4': 1912 | dependencies: 1913 | '@vitest/utils': 3.2.4 1914 | pathe: 2.0.3 1915 | strip-literal: 3.0.0 1916 | 1917 | '@vitest/snapshot@3.2.4': 1918 | dependencies: 1919 | '@vitest/pretty-format': 3.2.4 1920 | magic-string: 0.30.19 1921 | pathe: 2.0.3 1922 | 1923 | '@vitest/spy@3.2.4': 1924 | dependencies: 1925 | tinyspy: 4.0.3 1926 | 1927 | '@vitest/utils@3.2.4': 1928 | dependencies: 1929 | '@vitest/pretty-format': 3.2.4 1930 | loupe: 3.1.4 1931 | tinyrainbow: 2.0.0 1932 | 1933 | acorn-jsx@5.3.2(acorn@8.15.0): 1934 | dependencies: 1935 | acorn: 8.15.0 1936 | 1937 | acorn@8.15.0: {} 1938 | 1939 | ajv@6.12.6: 1940 | dependencies: 1941 | fast-deep-equal: 3.1.3 1942 | fast-json-stable-stringify: 2.1.0 1943 | json-schema-traverse: 0.4.1 1944 | uri-js: 4.4.1 1945 | 1946 | ansi-regex@5.0.1: {} 1947 | 1948 | ansi-regex@6.1.0: {} 1949 | 1950 | ansi-styles@4.3.0: 1951 | dependencies: 1952 | color-convert: 2.0.1 1953 | 1954 | ansi-styles@6.2.1: {} 1955 | 1956 | any-promise@1.3.0: {} 1957 | 1958 | argparse@2.0.1: {} 1959 | 1960 | assertion-error@2.0.1: {} 1961 | 1962 | balanced-match@1.0.2: {} 1963 | 1964 | brace-expansion@1.1.12: 1965 | dependencies: 1966 | balanced-match: 1.0.2 1967 | concat-map: 0.0.1 1968 | 1969 | brace-expansion@2.0.2: 1970 | dependencies: 1971 | balanced-match: 1.0.2 1972 | 1973 | braces@3.0.3: 1974 | dependencies: 1975 | fill-range: 7.1.1 1976 | 1977 | bundle-require@5.1.0(esbuild@0.25.9): 1978 | dependencies: 1979 | esbuild: 0.25.9 1980 | load-tsconfig: 0.2.5 1981 | 1982 | cac@6.7.14: {} 1983 | 1984 | callsites@3.1.0: {} 1985 | 1986 | chai@5.2.1: 1987 | dependencies: 1988 | assertion-error: 2.0.1 1989 | check-error: 2.1.1 1990 | deep-eql: 5.0.2 1991 | loupe: 3.1.4 1992 | pathval: 2.0.1 1993 | 1994 | chalk@4.1.2: 1995 | dependencies: 1996 | ansi-styles: 4.3.0 1997 | supports-color: 7.2.0 1998 | 1999 | check-error@2.1.1: {} 2000 | 2001 | chokidar@4.0.3: 2002 | dependencies: 2003 | readdirp: 4.1.2 2004 | 2005 | color-convert@2.0.1: 2006 | dependencies: 2007 | color-name: 1.1.4 2008 | 2009 | color-name@1.1.4: {} 2010 | 2011 | commander@4.1.1: {} 2012 | 2013 | concat-map@0.0.1: {} 2014 | 2015 | confbox@0.1.8: {} 2016 | 2017 | consola@3.4.2: {} 2018 | 2019 | cross-spawn@7.0.6: 2020 | dependencies: 2021 | path-key: 3.1.1 2022 | shebang-command: 2.0.0 2023 | which: 2.0.2 2024 | 2025 | debug@4.4.1: 2026 | dependencies: 2027 | ms: 2.1.3 2028 | 2029 | deep-eql@5.0.2: {} 2030 | 2031 | deep-is@0.1.4: {} 2032 | 2033 | detect-indent@7.0.1: {} 2034 | 2035 | detect-newline@4.0.1: {} 2036 | 2037 | eastasianwidth@0.2.0: {} 2038 | 2039 | emoji-regex@8.0.0: {} 2040 | 2041 | emoji-regex@9.2.2: {} 2042 | 2043 | es-module-lexer@1.7.0: {} 2044 | 2045 | esbuild@0.25.9: 2046 | optionalDependencies: 2047 | '@esbuild/aix-ppc64': 0.25.9 2048 | '@esbuild/android-arm': 0.25.9 2049 | '@esbuild/android-arm64': 0.25.9 2050 | '@esbuild/android-x64': 0.25.9 2051 | '@esbuild/darwin-arm64': 0.25.9 2052 | '@esbuild/darwin-x64': 0.25.9 2053 | '@esbuild/freebsd-arm64': 0.25.9 2054 | '@esbuild/freebsd-x64': 0.25.9 2055 | '@esbuild/linux-arm': 0.25.9 2056 | '@esbuild/linux-arm64': 0.25.9 2057 | '@esbuild/linux-ia32': 0.25.9 2058 | '@esbuild/linux-loong64': 0.25.9 2059 | '@esbuild/linux-mips64el': 0.25.9 2060 | '@esbuild/linux-ppc64': 0.25.9 2061 | '@esbuild/linux-riscv64': 0.25.9 2062 | '@esbuild/linux-s390x': 0.25.9 2063 | '@esbuild/linux-x64': 0.25.9 2064 | '@esbuild/netbsd-arm64': 0.25.9 2065 | '@esbuild/netbsd-x64': 0.25.9 2066 | '@esbuild/openbsd-arm64': 0.25.9 2067 | '@esbuild/openbsd-x64': 0.25.9 2068 | '@esbuild/openharmony-arm64': 0.25.9 2069 | '@esbuild/sunos-x64': 0.25.9 2070 | '@esbuild/win32-arm64': 0.25.9 2071 | '@esbuild/win32-ia32': 0.25.9 2072 | '@esbuild/win32-x64': 0.25.9 2073 | 2074 | escape-string-regexp@4.0.0: {} 2075 | 2076 | eslint-scope@8.4.0: 2077 | dependencies: 2078 | esrecurse: 4.3.0 2079 | estraverse: 5.3.0 2080 | 2081 | eslint-visitor-keys@3.4.3: {} 2082 | 2083 | eslint-visitor-keys@4.2.1: {} 2084 | 2085 | eslint@9.37.0(jiti@2.5.1): 2086 | dependencies: 2087 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0(jiti@2.5.1)) 2088 | '@eslint-community/regexpp': 4.12.1 2089 | '@eslint/config-array': 0.21.0 2090 | '@eslint/config-helpers': 0.4.0 2091 | '@eslint/core': 0.16.0 2092 | '@eslint/eslintrc': 3.3.1 2093 | '@eslint/js': 9.37.0 2094 | '@eslint/plugin-kit': 0.4.0 2095 | '@humanfs/node': 0.16.6 2096 | '@humanwhocodes/module-importer': 1.0.1 2097 | '@humanwhocodes/retry': 0.4.3 2098 | '@types/estree': 1.0.8 2099 | '@types/json-schema': 7.0.15 2100 | ajv: 6.12.6 2101 | chalk: 4.1.2 2102 | cross-spawn: 7.0.6 2103 | debug: 4.4.1 2104 | escape-string-regexp: 4.0.0 2105 | eslint-scope: 8.4.0 2106 | eslint-visitor-keys: 4.2.1 2107 | espree: 10.4.0 2108 | esquery: 1.6.0 2109 | esutils: 2.0.3 2110 | fast-deep-equal: 3.1.3 2111 | file-entry-cache: 8.0.0 2112 | find-up: 5.0.0 2113 | glob-parent: 6.0.2 2114 | ignore: 5.3.2 2115 | imurmurhash: 0.1.4 2116 | is-glob: 4.0.3 2117 | json-stable-stringify-without-jsonify: 1.0.1 2118 | lodash.merge: 4.6.2 2119 | minimatch: 3.1.2 2120 | natural-compare: 1.4.0 2121 | optionator: 0.9.4 2122 | optionalDependencies: 2123 | jiti: 2.5.1 2124 | transitivePeerDependencies: 2125 | - supports-color 2126 | 2127 | espree@10.4.0: 2128 | dependencies: 2129 | acorn: 8.15.0 2130 | acorn-jsx: 5.3.2(acorn@8.15.0) 2131 | eslint-visitor-keys: 4.2.1 2132 | 2133 | esquery@1.6.0: 2134 | dependencies: 2135 | estraverse: 5.3.0 2136 | 2137 | esrecurse@4.3.0: 2138 | dependencies: 2139 | estraverse: 5.3.0 2140 | 2141 | estraverse@5.3.0: {} 2142 | 2143 | estree-walker@3.0.3: 2144 | dependencies: 2145 | '@types/estree': 1.0.8 2146 | 2147 | esutils@2.0.3: {} 2148 | 2149 | expect-type@1.2.1: {} 2150 | 2151 | fast-deep-equal@3.1.3: {} 2152 | 2153 | fast-glob@3.3.3: 2154 | dependencies: 2155 | '@nodelib/fs.stat': 2.0.5 2156 | '@nodelib/fs.walk': 1.2.8 2157 | glob-parent: 5.1.2 2158 | merge2: 1.4.1 2159 | micromatch: 4.0.8 2160 | 2161 | fast-json-stable-stringify@2.1.0: {} 2162 | 2163 | fast-levenshtein@2.0.6: {} 2164 | 2165 | fastq@1.19.1: 2166 | dependencies: 2167 | reusify: 1.1.0 2168 | 2169 | fdir@6.5.0(picomatch@4.0.3): 2170 | optionalDependencies: 2171 | picomatch: 4.0.3 2172 | 2173 | file-entry-cache@8.0.0: 2174 | dependencies: 2175 | flat-cache: 4.0.1 2176 | 2177 | fill-range@7.1.1: 2178 | dependencies: 2179 | to-regex-range: 5.0.1 2180 | 2181 | find-up@5.0.0: 2182 | dependencies: 2183 | locate-path: 6.0.0 2184 | path-exists: 4.0.0 2185 | 2186 | fix-dts-default-cjs-exports@1.0.1: 2187 | dependencies: 2188 | magic-string: 0.30.19 2189 | mlly: 1.7.4 2190 | rollup: 4.52.4 2191 | 2192 | flat-cache@4.0.1: 2193 | dependencies: 2194 | flatted: 3.3.3 2195 | keyv: 4.5.4 2196 | 2197 | flatted@3.3.3: {} 2198 | 2199 | foreground-child@3.3.1: 2200 | dependencies: 2201 | cross-spawn: 7.0.6 2202 | signal-exit: 4.1.0 2203 | 2204 | fsevents@2.3.3: 2205 | optional: true 2206 | 2207 | get-tsconfig@4.10.1: 2208 | dependencies: 2209 | resolve-pkg-maps: 1.0.0 2210 | optional: true 2211 | 2212 | git-hooks-list@4.1.1: {} 2213 | 2214 | glob-parent@5.1.2: 2215 | dependencies: 2216 | is-glob: 4.0.3 2217 | 2218 | glob-parent@6.0.2: 2219 | dependencies: 2220 | is-glob: 4.0.3 2221 | 2222 | glob@10.4.5: 2223 | dependencies: 2224 | foreground-child: 3.3.1 2225 | jackspeak: 3.4.3 2226 | minimatch: 9.0.5 2227 | minipass: 7.1.2 2228 | package-json-from-dist: 1.0.1 2229 | path-scurry: 1.11.1 2230 | 2231 | globals@14.0.0: {} 2232 | 2233 | globals@16.4.0: {} 2234 | 2235 | graphemer@1.4.0: {} 2236 | 2237 | has-flag@4.0.0: {} 2238 | 2239 | ignore@5.3.2: {} 2240 | 2241 | ignore@7.0.5: {} 2242 | 2243 | import-fresh@3.3.1: 2244 | dependencies: 2245 | parent-module: 1.0.1 2246 | resolve-from: 4.0.0 2247 | 2248 | imurmurhash@0.1.4: {} 2249 | 2250 | is-extglob@2.1.1: {} 2251 | 2252 | is-fullwidth-code-point@3.0.0: {} 2253 | 2254 | is-glob@4.0.3: 2255 | dependencies: 2256 | is-extglob: 2.1.1 2257 | 2258 | is-number@7.0.0: {} 2259 | 2260 | is-plain-obj@4.1.0: {} 2261 | 2262 | isexe@2.0.0: {} 2263 | 2264 | jackspeak@3.4.3: 2265 | dependencies: 2266 | '@isaacs/cliui': 8.0.2 2267 | optionalDependencies: 2268 | '@pkgjs/parseargs': 0.11.0 2269 | 2270 | jiti@2.5.1: 2271 | optional: true 2272 | 2273 | joycon@3.1.1: {} 2274 | 2275 | js-tokens@4.0.0: {} 2276 | 2277 | js-tokens@9.0.1: {} 2278 | 2279 | js-yaml@4.1.0: 2280 | dependencies: 2281 | argparse: 2.0.1 2282 | 2283 | jsesc@3.1.0: {} 2284 | 2285 | json-buffer@3.0.1: {} 2286 | 2287 | json-schema-traverse@0.4.1: {} 2288 | 2289 | json-stable-stringify-without-jsonify@1.0.1: {} 2290 | 2291 | keyv@4.5.4: 2292 | dependencies: 2293 | json-buffer: 3.0.1 2294 | 2295 | levn@0.4.1: 2296 | dependencies: 2297 | prelude-ls: 1.2.1 2298 | type-check: 0.4.0 2299 | 2300 | lilconfig@3.1.3: {} 2301 | 2302 | lines-and-columns@1.2.4: {} 2303 | 2304 | load-tsconfig@0.2.5: {} 2305 | 2306 | locate-path@6.0.0: 2307 | dependencies: 2308 | p-locate: 5.0.0 2309 | 2310 | lodash.merge@4.6.2: {} 2311 | 2312 | lodash.sortby@4.7.0: {} 2313 | 2314 | loupe@3.1.4: {} 2315 | 2316 | lru-cache@10.4.3: {} 2317 | 2318 | lru-cache@11.2.2: {} 2319 | 2320 | magic-string@0.30.19: 2321 | dependencies: 2322 | '@jridgewell/sourcemap-codec': 1.5.5 2323 | 2324 | merge2@1.4.1: {} 2325 | 2326 | micromatch@4.0.8: 2327 | dependencies: 2328 | braces: 3.0.3 2329 | picomatch: 2.3.1 2330 | 2331 | minimatch@3.1.2: 2332 | dependencies: 2333 | brace-expansion: 1.1.12 2334 | 2335 | minimatch@9.0.5: 2336 | dependencies: 2337 | brace-expansion: 2.0.2 2338 | 2339 | minipass@7.1.2: {} 2340 | 2341 | mlly@1.7.4: 2342 | dependencies: 2343 | acorn: 8.15.0 2344 | pathe: 2.0.3 2345 | pkg-types: 1.3.1 2346 | ufo: 1.6.1 2347 | 2348 | ms@2.1.3: {} 2349 | 2350 | mvdan-sh@0.10.1: {} 2351 | 2352 | mz@2.7.0: 2353 | dependencies: 2354 | any-promise: 1.3.0 2355 | object-assign: 4.1.1 2356 | thenify-all: 1.6.0 2357 | 2358 | nanoid@3.3.11: {} 2359 | 2360 | natural-compare@1.4.0: {} 2361 | 2362 | object-assign@4.1.1: {} 2363 | 2364 | optionator@0.9.4: 2365 | dependencies: 2366 | deep-is: 0.1.4 2367 | fast-levenshtein: 2.0.6 2368 | levn: 0.4.1 2369 | prelude-ls: 1.2.1 2370 | type-check: 0.4.0 2371 | word-wrap: 1.2.5 2372 | 2373 | p-limit@3.1.0: 2374 | dependencies: 2375 | yocto-queue: 0.1.0 2376 | 2377 | p-locate@5.0.0: 2378 | dependencies: 2379 | p-limit: 3.1.0 2380 | 2381 | package-json-from-dist@1.0.1: {} 2382 | 2383 | parent-module@1.0.1: 2384 | dependencies: 2385 | callsites: 3.1.0 2386 | 2387 | path-exists@4.0.0: {} 2388 | 2389 | path-key@3.1.1: {} 2390 | 2391 | path-scurry@1.11.1: 2392 | dependencies: 2393 | lru-cache: 10.4.3 2394 | minipass: 7.1.2 2395 | 2396 | pathe@2.0.3: {} 2397 | 2398 | pathval@2.0.1: {} 2399 | 2400 | picocolors@1.1.1: {} 2401 | 2402 | picomatch@2.3.1: {} 2403 | 2404 | picomatch@4.0.3: {} 2405 | 2406 | pirates@4.0.7: {} 2407 | 2408 | pkg-types@1.3.1: 2409 | dependencies: 2410 | confbox: 0.1.8 2411 | mlly: 1.7.4 2412 | pathe: 2.0.3 2413 | 2414 | postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6): 2415 | dependencies: 2416 | lilconfig: 3.1.3 2417 | optionalDependencies: 2418 | jiti: 2.5.1 2419 | postcss: 8.5.6 2420 | tsx: 4.20.6 2421 | 2422 | postcss@8.5.6: 2423 | dependencies: 2424 | nanoid: 3.3.11 2425 | picocolors: 1.1.1 2426 | source-map-js: 1.2.1 2427 | 2428 | prelude-ls@1.2.1: {} 2429 | 2430 | prettier-plugin-packagejson@2.5.18(prettier@3.6.2): 2431 | dependencies: 2432 | sort-package-json: 3.4.0 2433 | synckit: 0.11.8 2434 | optionalDependencies: 2435 | prettier: 3.6.2 2436 | 2437 | prettier-plugin-sh@0.15.0(prettier@3.6.2): 2438 | dependencies: 2439 | mvdan-sh: 0.10.1 2440 | prettier: 3.6.2 2441 | sh-syntax: 0.4.2 2442 | 2443 | prettier@3.6.2: {} 2444 | 2445 | punycode@2.3.1: {} 2446 | 2447 | queue-microtask@1.2.3: {} 2448 | 2449 | quick-lru@7.3.0: {} 2450 | 2451 | readdirp@4.1.2: {} 2452 | 2453 | resolve-from@4.0.0: {} 2454 | 2455 | resolve-from@5.0.0: {} 2456 | 2457 | resolve-pkg-maps@1.0.0: 2458 | optional: true 2459 | 2460 | reusify@1.1.0: {} 2461 | 2462 | rollup@4.52.4: 2463 | dependencies: 2464 | '@types/estree': 1.0.8 2465 | optionalDependencies: 2466 | '@rollup/rollup-android-arm-eabi': 4.52.4 2467 | '@rollup/rollup-android-arm64': 4.52.4 2468 | '@rollup/rollup-darwin-arm64': 4.52.4 2469 | '@rollup/rollup-darwin-x64': 4.52.4 2470 | '@rollup/rollup-freebsd-arm64': 4.52.4 2471 | '@rollup/rollup-freebsd-x64': 4.52.4 2472 | '@rollup/rollup-linux-arm-gnueabihf': 4.52.4 2473 | '@rollup/rollup-linux-arm-musleabihf': 4.52.4 2474 | '@rollup/rollup-linux-arm64-gnu': 4.52.4 2475 | '@rollup/rollup-linux-arm64-musl': 4.52.4 2476 | '@rollup/rollup-linux-loong64-gnu': 4.52.4 2477 | '@rollup/rollup-linux-ppc64-gnu': 4.52.4 2478 | '@rollup/rollup-linux-riscv64-gnu': 4.52.4 2479 | '@rollup/rollup-linux-riscv64-musl': 4.52.4 2480 | '@rollup/rollup-linux-s390x-gnu': 4.52.4 2481 | '@rollup/rollup-linux-x64-gnu': 4.52.4 2482 | '@rollup/rollup-linux-x64-musl': 4.52.4 2483 | '@rollup/rollup-openharmony-arm64': 4.52.4 2484 | '@rollup/rollup-win32-arm64-msvc': 4.52.4 2485 | '@rollup/rollup-win32-ia32-msvc': 4.52.4 2486 | '@rollup/rollup-win32-x64-gnu': 4.52.4 2487 | '@rollup/rollup-win32-x64-msvc': 4.52.4 2488 | fsevents: 2.3.3 2489 | 2490 | run-parallel@1.2.0: 2491 | dependencies: 2492 | queue-microtask: 1.2.3 2493 | 2494 | semver@7.7.2: {} 2495 | 2496 | sh-syntax@0.4.2: 2497 | dependencies: 2498 | tslib: 2.8.1 2499 | 2500 | shebang-command@2.0.0: 2501 | dependencies: 2502 | shebang-regex: 3.0.0 2503 | 2504 | shebang-regex@3.0.0: {} 2505 | 2506 | siginfo@2.0.0: {} 2507 | 2508 | signal-exit@4.1.0: {} 2509 | 2510 | sort-object-keys@1.1.3: {} 2511 | 2512 | sort-package-json@3.4.0: 2513 | dependencies: 2514 | detect-indent: 7.0.1 2515 | detect-newline: 4.0.1 2516 | git-hooks-list: 4.1.1 2517 | is-plain-obj: 4.1.0 2518 | semver: 7.7.2 2519 | sort-object-keys: 1.1.3 2520 | tinyglobby: 0.2.15 2521 | 2522 | source-map-js@1.2.1: {} 2523 | 2524 | source-map@0.8.0-beta.0: 2525 | dependencies: 2526 | whatwg-url: 7.1.0 2527 | 2528 | stackback@0.0.2: {} 2529 | 2530 | std-env@3.9.0: {} 2531 | 2532 | string-width@4.2.3: 2533 | dependencies: 2534 | emoji-regex: 8.0.0 2535 | is-fullwidth-code-point: 3.0.0 2536 | strip-ansi: 6.0.1 2537 | 2538 | string-width@5.1.2: 2539 | dependencies: 2540 | eastasianwidth: 0.2.0 2541 | emoji-regex: 9.2.2 2542 | strip-ansi: 7.1.0 2543 | 2544 | strip-ansi@6.0.1: 2545 | dependencies: 2546 | ansi-regex: 5.0.1 2547 | 2548 | strip-ansi@7.1.0: 2549 | dependencies: 2550 | ansi-regex: 6.1.0 2551 | 2552 | strip-json-comments@3.1.1: {} 2553 | 2554 | strip-literal@3.0.0: 2555 | dependencies: 2556 | js-tokens: 9.0.1 2557 | 2558 | sucrase@3.35.0: 2559 | dependencies: 2560 | '@jridgewell/gen-mapping': 0.3.12 2561 | commander: 4.1.1 2562 | glob: 10.4.5 2563 | lines-and-columns: 1.2.4 2564 | mz: 2.7.0 2565 | pirates: 4.0.7 2566 | ts-interface-checker: 0.1.13 2567 | 2568 | supports-color@7.2.0: 2569 | dependencies: 2570 | has-flag: 4.0.0 2571 | 2572 | synckit@0.11.8: 2573 | dependencies: 2574 | '@pkgr/core': 0.2.7 2575 | 2576 | thenify-all@1.6.0: 2577 | dependencies: 2578 | thenify: 3.3.1 2579 | 2580 | thenify@3.3.1: 2581 | dependencies: 2582 | any-promise: 1.3.0 2583 | 2584 | tiny-lru@11.4.5: {} 2585 | 2586 | tinybench@2.9.0: {} 2587 | 2588 | tinyexec@0.3.2: {} 2589 | 2590 | tinyglobby@0.2.15: 2591 | dependencies: 2592 | fdir: 6.5.0(picomatch@4.0.3) 2593 | picomatch: 4.0.3 2594 | 2595 | tinypool@1.1.1: {} 2596 | 2597 | tinyrainbow@2.0.0: {} 2598 | 2599 | tinyspy@4.0.3: {} 2600 | 2601 | to-regex-range@5.0.1: 2602 | dependencies: 2603 | is-number: 7.0.0 2604 | 2605 | tr46@1.0.1: 2606 | dependencies: 2607 | punycode: 2.3.1 2608 | 2609 | tree-kill@1.2.2: {} 2610 | 2611 | ts-api-utils@2.1.0(typescript@5.9.3): 2612 | dependencies: 2613 | typescript: 5.9.3 2614 | 2615 | ts-interface-checker@0.1.13: {} 2616 | 2617 | tslib@2.8.1: {} 2618 | 2619 | tsup@8.5.0(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3): 2620 | dependencies: 2621 | bundle-require: 5.1.0(esbuild@0.25.9) 2622 | cac: 6.7.14 2623 | chokidar: 4.0.3 2624 | consola: 3.4.2 2625 | debug: 4.4.1 2626 | esbuild: 0.25.9 2627 | fix-dts-default-cjs-exports: 1.0.1 2628 | joycon: 3.1.1 2629 | picocolors: 1.1.1 2630 | postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6) 2631 | resolve-from: 5.0.0 2632 | rollup: 4.52.4 2633 | source-map: 0.8.0-beta.0 2634 | sucrase: 3.35.0 2635 | tinyexec: 0.3.2 2636 | tinyglobby: 0.2.15 2637 | tree-kill: 1.2.2 2638 | optionalDependencies: 2639 | postcss: 8.5.6 2640 | typescript: 5.9.3 2641 | transitivePeerDependencies: 2642 | - jiti 2643 | - supports-color 2644 | - tsx 2645 | - yaml 2646 | 2647 | tsx@4.20.6: 2648 | dependencies: 2649 | esbuild: 0.25.9 2650 | get-tsconfig: 4.10.1 2651 | optionalDependencies: 2652 | fsevents: 2.3.3 2653 | optional: true 2654 | 2655 | type-check@0.4.0: 2656 | dependencies: 2657 | prelude-ls: 1.2.1 2658 | 2659 | typescript-eslint@8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3): 2660 | dependencies: 2661 | '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3) 2662 | '@typescript-eslint/parser': 8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3) 2663 | '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) 2664 | '@typescript-eslint/utils': 8.46.0(eslint@9.37.0(jiti@2.5.1))(typescript@5.9.3) 2665 | eslint: 9.37.0(jiti@2.5.1) 2666 | typescript: 5.9.3 2667 | transitivePeerDependencies: 2668 | - supports-color 2669 | 2670 | typescript@5.9.3: {} 2671 | 2672 | ufo@1.6.1: {} 2673 | 2674 | undici-types@7.14.0: {} 2675 | 2676 | uri-js@4.4.1: 2677 | dependencies: 2678 | punycode: 2.3.1 2679 | 2680 | vite-node@3.2.4(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6): 2681 | dependencies: 2682 | cac: 6.7.14 2683 | debug: 4.4.1 2684 | es-module-lexer: 1.7.0 2685 | pathe: 2.0.3 2686 | vite: 7.1.7(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6) 2687 | transitivePeerDependencies: 2688 | - '@types/node' 2689 | - jiti 2690 | - less 2691 | - lightningcss 2692 | - sass 2693 | - sass-embedded 2694 | - stylus 2695 | - sugarss 2696 | - supports-color 2697 | - terser 2698 | - tsx 2699 | - yaml 2700 | 2701 | vite@7.1.7(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6): 2702 | dependencies: 2703 | esbuild: 0.25.9 2704 | fdir: 6.5.0(picomatch@4.0.3) 2705 | picomatch: 4.0.3 2706 | postcss: 8.5.6 2707 | rollup: 4.52.4 2708 | tinyglobby: 0.2.15 2709 | optionalDependencies: 2710 | '@types/node': 24.7.1 2711 | fsevents: 2.3.3 2712 | jiti: 2.5.1 2713 | tsx: 4.20.6 2714 | 2715 | vitest@3.2.4(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6): 2716 | dependencies: 2717 | '@types/chai': 5.2.2 2718 | '@vitest/expect': 3.2.4 2719 | '@vitest/mocker': 3.2.4(vite@7.1.7(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6)) 2720 | '@vitest/pretty-format': 3.2.4 2721 | '@vitest/runner': 3.2.4 2722 | '@vitest/snapshot': 3.2.4 2723 | '@vitest/spy': 3.2.4 2724 | '@vitest/utils': 3.2.4 2725 | chai: 5.2.1 2726 | debug: 4.4.1 2727 | expect-type: 1.2.1 2728 | magic-string: 0.30.19 2729 | pathe: 2.0.3 2730 | picomatch: 4.0.3 2731 | std-env: 3.9.0 2732 | tinybench: 2.9.0 2733 | tinyexec: 0.3.2 2734 | tinyglobby: 0.2.15 2735 | tinypool: 1.1.1 2736 | tinyrainbow: 2.0.0 2737 | vite: 7.1.7(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6) 2738 | vite-node: 3.2.4(@types/node@24.7.1)(jiti@2.5.1)(tsx@4.20.6) 2739 | why-is-node-running: 2.3.0 2740 | optionalDependencies: 2741 | '@types/node': 24.7.1 2742 | transitivePeerDependencies: 2743 | - jiti 2744 | - less 2745 | - lightningcss 2746 | - msw 2747 | - sass 2748 | - sass-embedded 2749 | - stylus 2750 | - sugarss 2751 | - supports-color 2752 | - terser 2753 | - tsx 2754 | - yaml 2755 | 2756 | webidl-conversions@4.0.2: {} 2757 | 2758 | whatwg-url@7.1.0: 2759 | dependencies: 2760 | lodash.sortby: 4.7.0 2761 | tr46: 1.0.1 2762 | webidl-conversions: 4.0.2 2763 | 2764 | which@2.0.2: 2765 | dependencies: 2766 | isexe: 2.0.0 2767 | 2768 | why-is-node-running@2.3.0: 2769 | dependencies: 2770 | siginfo: 2.0.0 2771 | stackback: 0.0.2 2772 | 2773 | word-wrap@1.2.5: {} 2774 | 2775 | wrap-ansi@7.0.0: 2776 | dependencies: 2777 | ansi-styles: 4.3.0 2778 | string-width: 4.2.3 2779 | strip-ansi: 6.0.1 2780 | 2781 | wrap-ansi@8.1.0: 2782 | dependencies: 2783 | ansi-styles: 6.2.1 2784 | string-width: 5.1.2 2785 | strip-ansi: 7.1.0 2786 | 2787 | yocto-queue@0.1.0: {} 2788 | --------------------------------------------------------------------------------