├── .gitignore ├── .prettierrc ├── playground ├── public │ ├── db.js │ ├── utils.js │ ├── index.html │ └── main.js └── server.js ├── .npmignore ├── CONTRIBUTING.md ├── eslint.config.mjs ├── tsconfig.json ├── .github ├── workflows │ └── main.yml └── config.yml ├── LICENSE ├── package.json ├── .all-contributorsrc ├── README.md ├── src └── index.ts ├── tests └── lsdb.test.ts └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "trailingComma": "all", 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /playground/public/db.js: -------------------------------------------------------------------------------- 1 | import Lsdb from './lib/index.js'; 2 | 3 | export function setupDb() { 4 | return new Lsdb('playground'); 5 | } -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .github 2 | tests 3 | src 4 | .all-contributorsrc 5 | .eslintignore 6 | .eslintrc.js 7 | .prettierrc 8 | jestconfig.json 9 | tsconfig.json 10 | package-lock.json 11 | playground -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Thanks for contributing! 2 | 3 | Please use pull request semantic. 4 | 5 | Make sure all tests pass in local development. 6 | 7 | If you add a new feature you must add tests associated with it. 8 | -------------------------------------------------------------------------------- /playground/public/utils.js: -------------------------------------------------------------------------------- 1 | export function log(...args) { 2 | const output = document.getElementById('output'); 3 | output.textContent = args 4 | .map(arg => typeof arg === 'object' ? JSON.stringify(arg, null, 2) : arg) 5 | .join('\n') + '\n\n' + output.textContent; 6 | } -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import eslint from '@eslint/js'; 2 | import tseslint from 'typescript-eslint'; 3 | 4 | export default tseslint.config({ 5 | files: ['**/*.ts'], 6 | extends: [ 7 | eslint.configs.recommended, 8 | ...tseslint.configs.recommended, 9 | ], 10 | rules: { 11 | '@typescript-eslint/array-type': 'error', 12 | '@typescript-eslint/consistent-type-imports': 'error', 13 | }, 14 | }) -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "target": "ESNext", 5 | "lib": ["ESNext", "DOM"], 6 | "strictNullChecks": true, 7 | "moduleResolution": "node", 8 | "esModuleInterop": true, 9 | "skipLibCheck": true, 10 | "declaration": true, 11 | "outDir": "./lib", 12 | "strict": true 13 | }, 14 | "include": ["src"], 15 | "exclude": ["node_modules", "tests"] 16 | } 17 | -------------------------------------------------------------------------------- /playground/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | LSDB Playground 8 | 9 | 10 | 11 |
12 |

LSDB Playground

13 | 14 |
15 | 16 | 17 | 18 | 19 |
20 | 21 |
22 |

Output:

23 |

24 |         
25 |
26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | # Controls when the workflow will run 4 | on: 5 | # Triggers the workflow on push or pull request events but only for the master branch 6 | push: 7 | branches: [ master ] 8 | pull_request: 9 | branches: [ master ] 10 | 11 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 12 | jobs: 13 | # This workflow contains a single job called "build" 14 | build: 15 | # The type of runner that the job will run on 16 | runs-on: ubuntu-latest 17 | 18 | # Steps represent a sequence of tasks that will be executed as part of the job 19 | steps: 20 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 21 | - uses: actions/checkout@v2 22 | 23 | # Runs a single command using the runners shell 24 | - run: npm install 25 | - name: Run tests 26 | run: npm run test 27 | -------------------------------------------------------------------------------- /.github/config.yml: -------------------------------------------------------------------------------- 1 | # Configuration for welcome - https://github.com/behaviorbot/welcome 2 | 3 | # Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome 4 | 5 | # Comment to be posted to on first time issues 6 | newIssueWelcomeComment: > 7 | Thanks for opening your first issue here! Be sure to follow the issue template! 😊 8 | 9 | # Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome 10 | 11 | # Comment to be posted to on PRs from first time contributors in your repository 12 | newPRWelcomeComment: > 13 | Thanks for opening this pull request! Please check out our contributing guidelines. 🚀 14 | 15 | # Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge 16 | 17 | # Comment to be posted to on pull requests merged by a first time user 18 | firstPRMergeComment: > 19 | Congrats on merging your first pull request! We here at behaviorbot are proud of you! 🥳🥳 20 | -------------------------------------------------------------------------------- /playground/public/main.js: -------------------------------------------------------------------------------- 1 | import { setupDb } from './db.js'; 2 | import { log } from './utils.js'; 3 | 4 | window.db = setupDb(); 5 | 6 | // Expose functions to window for button clicks 7 | window.createCollections = () => { 8 | db.collection(['categories', 'articles']); 9 | log('Collections created: categories, articles'); 10 | }; 11 | 12 | window.insertData = () => { 13 | db.insert('categories', { title: 'Drinks' }); 14 | db.insert('categories', { title: 'Dinner' }); 15 | db.insert('articles', { title: 'Coffee Guide', category: 'Drinks' }); 16 | 17 | log('Sample data inserted'); 18 | log('Current data:', db.all()); 19 | }; 20 | 21 | window.queryData = () => { 22 | const drinks = db.find('articles', { 23 | where: { 24 | category: { $eq: 'Drinks' } 25 | } 26 | }); 27 | 28 | log('Articles in Drinks category:', drinks); 29 | }; 30 | 31 | window.clearData = () => { 32 | localStorage.clear(); 33 | log('Database cleared'); 34 | }; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Roberth González 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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@reliutg/lsdb", 3 | "version": "4.10.0", 4 | "description": "Database powered by localStorage with JSON definition", 5 | "main": "./lib/index.js", 6 | "types": "./lib/index.d.ts", 7 | "module": "./lib/index.js", 8 | "files": [ 9 | "lib/**/*" 10 | ], 11 | "scripts": { 12 | "start:playground": "node playground/server.js", 13 | "dev": "esbuild --watch src/index.ts --format=esm --outdir=lib --sourcemap", 14 | "build": "esbuild src/index.ts --format=esm --outdir=lib --minify && npm run types", 15 | "types": "tsc --declaration --emitDeclarationOnly", 16 | "test": "vitest", 17 | "format": "prettier --write \"src/**/*.ts\"", 18 | "lint": "npx eslint --fix", 19 | "prepare": "npm run build", 20 | "prepublishOnly": "npm run test && npm run lint", 21 | "preversion": "npm run lint", 22 | "version": "npm run format && git add -A src", 23 | "postversion": "git push && git push --tags" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "git+https://github.com/roberthgnz/lsdb.git" 28 | }, 29 | "keywords": [ 30 | "database", 31 | "localstorage" 32 | ], 33 | "author": "Roberth González (https://github.com/roberthgnz)", 34 | "license": "MIT", 35 | "bugs": { 36 | "url": "https://github.com/roberthgnz/lsdb/issues" 37 | }, 38 | "homepage": "https://github.com/roberthgnz/lsdb#readme", 39 | "devDependencies": { 40 | "@eslint/js": "^9.17.0", 41 | "@typescript-eslint/eslint-plugin": "8.19.0", 42 | "@typescript-eslint/parser": "8.19.0", 43 | "esbuild": "0.24.2", 44 | "eslint": "9.17.0", 45 | "eslint-config-prettier": "9.1.0", 46 | "prettier": "3.4.2", 47 | "typescript": "5.7.2", 48 | "typescript-eslint": "^8.19.0", 49 | "vitest": "^2.1.8" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /playground/server.js: -------------------------------------------------------------------------------- 1 | const http = require('http'); 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | 5 | const port = process.argv[2] || 1802; 6 | const staticFolder = process.argv[3] || 'public'; 7 | 8 | // MIME types for common file extensions 9 | const mimeTypes = { 10 | '.html': 'text/html', 11 | '.css': 'text/css', 12 | '.js': 'text/javascript', 13 | '.jpg': 'image/jpeg', 14 | '.png': 'image/png', 15 | '.ico': 'image/x-icon', 16 | '.svg': 'image/svg+xml', 17 | '.json': 'application/json' 18 | }; 19 | 20 | fs.copyFile(path.resolve('lib', 'index.js'), path.resolve(__dirname, staticFolder, 'lib', 'index.js'), (err) => { 21 | if (err) { 22 | console.error(err); 23 | } 24 | }); 25 | 26 | const server = http.createServer((req, res) => { 27 | // Convert URL to file path, using index.html for root path 28 | let filePath = path.join(__dirname, staticFolder, req.url === '/' ? 'index.html' : req.url); 29 | 30 | // Get file extension 31 | const ext = path.extname(filePath); 32 | 33 | // Set content type based on file extension 34 | const contentType = mimeTypes[ext] || 'text/plain'; 35 | 36 | fs.readFile(filePath, (err, content) => { 37 | if (err) { 38 | if (err.code === 'ENOENT') { 39 | // File not found 40 | res.writeHead(404); 41 | res.end(`File ${filePath} not found`); 42 | } else { 43 | // Server error 44 | res.writeHead(500); 45 | res.end(`Server error: ${err.code}`); 46 | } 47 | } else { 48 | // Success 49 | res.writeHead(200, { 'Content-Type': contentType }); 50 | res.end(content); 51 | } 52 | }); 53 | }); 54 | 55 | server.listen(port, () => { 56 | console.log(`Server running at http://localhost:${port}/`); 57 | }); -------------------------------------------------------------------------------- /.all-contributorsrc: -------------------------------------------------------------------------------- 1 | { 2 | "files": [ 3 | "README.md" 4 | ], 5 | "imageSize": 100, 6 | "commit": false, 7 | "contributors": [ 8 | { 9 | "login": "aneeshrelan", 10 | "name": "Aneesh Relan", 11 | "avatar_url": "https://avatars2.githubusercontent.com/u/17068083?v=4", 12 | "profile": "https://github.com/aneeshrelan", 13 | "contributions": [ 14 | "test", 15 | "code" 16 | ] 17 | }, 18 | { 19 | "login": "fr0stylo", 20 | "name": "Zymantas Maumevicius", 21 | "avatar_url": "https://avatars0.githubusercontent.com/u/13507123?v=4", 22 | "profile": "https://github.com/fr0stylo", 23 | "contributions": [ 24 | "infra", 25 | "code" 26 | ] 27 | }, 28 | { 29 | "login": "dekpient", 30 | "name": "Nitkalya Wiriyanuparb", 31 | "avatar_url": "https://avatars1.githubusercontent.com/u/717270?v=4", 32 | "profile": "https://github.com/dekpient", 33 | "contributions": [ 34 | "test", 35 | "code" 36 | ] 37 | }, 38 | { 39 | "login": "rugglcon", 40 | "name": "Connor Ruggles", 41 | "avatar_url": "https://avatars0.githubusercontent.com/u/14317362?v=4", 42 | "profile": "https://connorruggles.dev", 43 | "contributions": [ 44 | "infra", 45 | "code" 46 | ] 47 | }, 48 | { 49 | "login": "SMAKSS", 50 | "name": "MAKSS", 51 | "avatar_url": "https://avatars0.githubusercontent.com/u/32557358?v=4", 52 | "profile": "https://smakss.github.io/", 53 | "contributions": [ 54 | "doc" 55 | ] 56 | }, 57 | { 58 | "login": "vvscode", 59 | "name": "Vasiliy Vanchuk", 60 | "avatar_url": "https://avatars.githubusercontent.com/u/6904368?v=4", 61 | "profile": "http://bit.ly/vvscodeli", 62 | "contributions": [ 63 | "code" 64 | ] 65 | }, 66 | { 67 | "login": "marce1994", 68 | "name": "Pablo", 69 | "avatar_url": "https://avatars.githubusercontent.com/u/358126?v=4", 70 | "profile": "https://www.linkedin.com/in/pablo-marcelo-bianco/", 71 | "contributions": [ 72 | "code" 73 | ] 74 | } 75 | ], 76 | "contributorsPerLine": 7, 77 | "projectName": "lsdb", 78 | "projectOwner": "roberthgnz", 79 | "repoType": "github", 80 | "repoHost": "https://github.com", 81 | "skipCi": true 82 | } 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # lsdb 2 | 3 | [![CI](https://github.com/roberthgnz/lsdb/actions/workflows/main.yml/badge.svg)](https://github.com/roberthgnz/lsdb/actions/workflows/main.yml) 4 | [![Issues](https://img.shields.io/github/issues/roberthgnz/lsdb)](https://github.com/roberthgnz/lsdb/issues) 5 | [![Forks](https://img.shields.io/github/forks/roberthgnz/lsdb)](https://github.com/roberthgnz/lsdb) 6 | [![Stars](https://img.shields.io/github/stars/roberthgnz/lsdb)](https://github.com/roberthgnz/lsdb) 7 | [![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg)](#contributors-) 8 | 9 | Typed localStorage database powered by with JSON definition 10 | 11 | ## Features 12 | 13 | - 📦 Tree-shakeable 14 | - ⚡ Fast 15 | - ✨ Lightweight 16 | - ❤️ Strongly typed 17 | 18 | ## Installation 19 | 20 | ```bash 21 | npm i @reliutg/lsdb 22 | ``` 23 | 24 | ## With Skypack 25 | 26 | no npm install needed! 27 | 28 | ```html 29 | 32 | ``` 33 | 34 | ## We’ll start by setting up a database: 35 | 36 | ```js 37 | const lsdb = new Lsdb('dbname'); 38 | ``` 39 | 40 | ## Creating list of collections 41 | 42 | ```js 43 | // Create multiple collections 44 | lsdb.collection(['categories', 'articles']); 45 | // Create single collection 46 | lsdb.collection('categories'); 47 | ``` 48 | 49 | ## Inserting 50 | 51 | ```js 52 | lsdb.insert('categories', { title: 'Drinks' }); 53 | lsdb.insert('categories', { title: 'Dinner' }); 54 | lsdb.insert('categories', { title: 'Breakfast' }); 55 | lsdb.insert('articles', { title: 'Coffee', category: 'Drinks' }); 56 | ``` 57 | 58 | ```js 59 | lsdb.insertMany('categories', [{ title: 'Drinks' }, { title: 'Dinner' }, { title: 'Breakfast' }]); 60 | ``` 61 | 62 | ## Getting data 63 | 64 | Get single collection or all collection entries 65 | 66 | ```js 67 | lsdb.all(); 68 | // {categories: Array(2), articles: Array(0)} 69 | 70 | lsdb.all('categories'); 71 | // [{title: 'Drinks'}, {title: 'Dinner'}, {title: 'Breakfast'}] 72 | ``` 73 | 74 | Get a list of documents 75 | 76 | ```js 77 | lsdb.find('categories', { 78 | where: { 79 | category: { $in: ['Drinks'] }, 80 | }, 81 | }); 82 | 83 | lsdb.find('articles', { 84 | where: { 85 | category: { $eq: 'Drinks' }, 86 | }, 87 | }); 88 | 89 | lsdb.find('articles', { 90 | sort: { 91 | field: 'title', 92 | order: 'asc' 93 | }, 94 | limit: 2, 95 | skip: 1, 96 | }); 97 | ``` 98 | 99 | ### Find Options 100 | 101 | | Field | Type | Description | Default | Required | 102 | | ------- | -------- | ----------------------- | ----------- | -------- | 103 | | `where` | `Object` | Filter by object | `undefined` | `false` | 104 | | `sort` | `Object` | Sort by field name | `undefined` | `false` | 105 | | `limit` | `number` | Limit number of results | `undefined` | `false` | 106 | | `skip` | `number` | Skip number of results | `0` | `false` | 107 | 108 | ### Available operators for where 109 | 110 | Based on [MongoDB](https://docs.mongodb.com/manual/reference/operator/query/#query-selectors) query selectors 111 | 112 | - `$eq` - Equal 113 | - `$in` - In 114 | - `$nin` - Not in 115 | - `$ne` - Not equal 116 | - `$gt` - Greater than 117 | - `$gte` - Greater than or equal 118 | - `$lt` - Less than 119 | - `$lte` - Less than or equal 120 | 121 | Get a single document matching the query 122 | 123 | ```js 124 | lsdb.findOne('categories', { 125 | where: { 126 | _id: { $eq: id }, 127 | }, 128 | }); 129 | ``` 130 | 131 | ## Updating 132 | 133 | Update a single document matching the query 134 | 135 | ```js 136 | lsdb.update('categories', { 137 | where: { 138 | _id: { $eq: id }, 139 | }, 140 | }); 141 | ``` 142 | 143 | ## Removing 144 | 145 | Remove a single document matching the query 146 | 147 | ```js 148 | lsdb.delete('categories', { 149 | where: { 150 | _id: { $eq: id }, 151 | }, 152 | }); 153 | ``` 154 | 155 | ## Contributors ✨ 156 | 157 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 |

Aneesh Relan

⚠️ 💻

Zymantas Maumevicius

🚇 💻

Nitkalya Wiriyanuparb

⚠️ 💻

Connor Ruggles

🚇 💻

MAKSS

📖

Vasiliy Vanchuk

💻

Pablo

💻
173 | 174 | 175 | 176 | 177 | 178 | 179 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! 180 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | type Element = T & { 2 | _id: string; 3 | [key: string]: unknown; 4 | }; 5 | 6 | type Collection = Element[]; 7 | 8 | enum Operator { 9 | Equals = '$eq', 10 | NotEquals = '$ne', 11 | In = '$in', 12 | NotIn = '$nin', 13 | GreaterThen = '$gt', 14 | GreaterThenOrEqual = '$gte', 15 | LessThen = '$lt', 16 | LessThenOrEqual = '$lte', 17 | } 18 | 19 | type EqualsOperation = (a: T, b: T) => boolean; 20 | type InOperation = (a: T, b: T[]) => boolean; 21 | type ComparisonOperation = (a: number, b: number) => boolean; 22 | 23 | interface OperatorMap { 24 | [Operator.Equals]: EqualsOperation; 25 | [Operator.NotEquals]: EqualsOperation; 26 | [Operator.In]: InOperation; 27 | [Operator.NotIn]: InOperation; 28 | [Operator.GreaterThen]: ComparisonOperation; 29 | [Operator.GreaterThenOrEqual]: ComparisonOperation; 30 | [Operator.LessThen]: ComparisonOperation; 31 | [Operator.LessThenOrEqual]: ComparisonOperation; 32 | } 33 | 34 | type WhereQuery = { 35 | [K in keyof T]?: { 36 | [key in Operator]?: T[K] | T[K][]; 37 | }; 38 | }; 39 | 40 | type FindOptions = { 41 | where?: WhereQuery; 42 | limit?: number; 43 | skip?: number; 44 | sort?: { 45 | field: keyof T; 46 | order: 'asc' | 'desc'; 47 | }; 48 | }; 49 | 50 | type WhereOut = { 51 | valueToFilterBy: unknown; 52 | field: string; 53 | operator: string; 54 | }; 55 | 56 | const makeArray = (a: unknown): unknown[] => { 57 | if (!a) { 58 | return []; 59 | } 60 | const value = Array.isArray(a) ? a : [a]; 61 | 62 | return value; 63 | }; 64 | 65 | const sortByField = (field: keyof T, order = 'asc') => { 66 | return (a: T, b: T) => { 67 | const aValue = a[field]; 68 | const bValue = b[field]; 69 | if (aValue < bValue) { 70 | return order === 'asc' ? -1 : 1; 71 | } else if (aValue > bValue) { 72 | return order === 'asc' ? 1 : -1; 73 | } else { 74 | return 0; 75 | } 76 | }; 77 | }; 78 | 79 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 80 | const OperatorOperations: OperatorMap = { 81 | [Operator.Equals]: (a, b) => a === b, 82 | [Operator.NotEquals]: (a, b) => a !== b, 83 | [Operator.In]: (a, b) => { 84 | const aArray = makeArray(a); 85 | const bArray = makeArray(b); 86 | return bArray.some((value) => aArray.includes(value)); 87 | }, 88 | [Operator.NotIn]: (a, b) => { 89 | const aArray = makeArray(a); 90 | const bArray = makeArray(b); 91 | return bArray.some((value) => !aArray.includes(value)); 92 | }, 93 | [Operator.GreaterThen]: (a, b) => a > b, 94 | [Operator.GreaterThenOrEqual]: (a, b) => a >= b, 95 | [Operator.LessThen]: (a, b) => a < b, 96 | [Operator.LessThenOrEqual]: (a, b) => a <= b, 97 | }; 98 | 99 | class Lsdb { 100 | private database: string; 101 | private collections: { [key: string]: Collection }; 102 | 103 | constructor(database: string) { 104 | this.database = database; 105 | 106 | if (localStorage.getItem(this.database) === null) { 107 | localStorage.setItem(database, JSON.stringify({})); 108 | } 109 | 110 | this.collections = JSON.parse(localStorage.getItem(database) || '{}'); 111 | } 112 | 113 | private handleWhere(where: WhereQuery | undefined): WhereOut { 114 | if (!where) return { valueToFilterBy: undefined, field: '', operator: '' }; 115 | 116 | for (const field in where) { 117 | if (!where[field]) continue; 118 | 119 | const filters = where[field]; 120 | 121 | for (const op in filters) { 122 | const operator = op as Operator; 123 | 124 | if (!OperatorOperations[operator]) { 125 | throw new Error(`Operator ${operator} is not supported`); 126 | } 127 | 128 | return { valueToFilterBy: filters[operator], field, operator }; 129 | } 130 | } 131 | 132 | return { valueToFilterBy: undefined, field: '', operator: '' }; 133 | } 134 | 135 | private insertElement(data: T): Element { 136 | const _id = Math.random().toString(36).slice(2, 9); 137 | 138 | const Element = { 139 | ...data, 140 | _id, 141 | }; 142 | 143 | return Element; 144 | } 145 | 146 | /** 147 | * Count the number of entries in the collection 148 | */ 149 | count(entity: string): number { 150 | return Object.keys(this.collections[entity]).length; 151 | } 152 | 153 | /** 154 | * Get multiple entries 155 | */ 156 | find(entity: string, { where, limit, skip = 0, sort }: FindOptions): Element[] | undefined { 157 | const dataset = this.collections[entity] as Element[]; 158 | 159 | let result = sort ? dataset : dataset.slice(skip, limit); 160 | 161 | if (where) { 162 | const { field, operator, valueToFilterBy } = this.handleWhere(where); 163 | result = result.filter((x) => OperatorOperations[operator as Operator](x[field], valueToFilterBy)); 164 | } 165 | 166 | if (sort) { 167 | const { field, order } = sort; 168 | 169 | result = result.sort(sortByField(field, order)); 170 | } 171 | 172 | return result.slice(skip, limit); 173 | } 174 | 175 | /** 176 | * Get single Element 177 | */ 178 | findOne(entity: string, { where }: { where: WhereQuery }): Element | undefined { 179 | const dataset = this.collections[entity] as Element[]; 180 | 181 | const { valueToFilterBy, field, operator } = this.handleWhere(where); 182 | 183 | if (!operator) return undefined; 184 | 185 | return dataset.find((x) => OperatorOperations[operator as Operator](x[field], valueToFilterBy)); 186 | } 187 | 188 | /** 189 | * Creating list of collections 190 | */ 191 | collection(data: string | string[], replace = false): unknown { 192 | try { 193 | if (Array.isArray(data)) { 194 | data.forEach((x) => { 195 | if (typeof x !== 'string') { 196 | throw new Error('All values must be strings'); 197 | } 198 | }); 199 | } else { 200 | if (typeof data !== 'string') { 201 | throw new Error('Value must be string'); 202 | } 203 | } 204 | 205 | if (Array.isArray(data)) { 206 | data.forEach((collection) => { 207 | this.collections[collection] = replace ? [] : this.collections[collection] || []; 208 | }); 209 | } else { 210 | this.collections[data] = replace ? [] : this.collections[data] || []; 211 | } 212 | 213 | localStorage.setItem(this.database, JSON.stringify(this.collections)); 214 | 215 | return { 216 | status: 'success', 217 | }; 218 | } catch (e) { 219 | return e; 220 | } 221 | } 222 | 223 | /** 224 | * Creating collection Element 225 | */ 226 | insert(entity: string, data: T): Element { 227 | const collection = this.collections[entity] as Element[]; 228 | 229 | const Element = this.insertElement(data); 230 | 231 | const dataset = [...collection, Element]; 232 | 233 | this.collections[entity] = dataset; 234 | 235 | localStorage.setItem(this.database, JSON.stringify(this.collections)); 236 | 237 | return Element; 238 | } 239 | 240 | /** 241 | * Creating many collection entries 242 | */ 243 | insertMany(entity: string, data: T[]): Element[] { 244 | const collection = this.collections[entity] as Element[]; 245 | 246 | const entries = data.map((data) => this.insertElement(data)); 247 | 248 | const dataset = [...collection, ...entries]; 249 | 250 | this.collections[entity] = dataset; 251 | 252 | localStorage.setItem(this.database, JSON.stringify(this.collections)); 253 | 254 | return entries; 255 | } 256 | 257 | /** 258 | * Get single collection or all collection entries 259 | */ 260 | all(entity?: string): Element[] | { [key: string]: Element[] } { 261 | if (entity) { 262 | return this.collections[entity] as Element[]; 263 | } 264 | return this.collections as { [key: string]: Element[] }; 265 | } 266 | 267 | /** 268 | * Update collection Element 269 | */ 270 | update( 271 | entity: string, 272 | params: { 273 | [key: string]: unknown; 274 | }, 275 | data: T, 276 | ): Element { 277 | const key = Object.keys(params)[0]; 278 | 279 | const index = (this.collections[entity] as Element[]).findIndex((i) => { 280 | return i[key] === params[key]; 281 | }); 282 | 283 | const doc = (this.collections[entity] as Element[])[index]; 284 | 285 | this.collections[entity][index] = { ...doc, ...data }; 286 | 287 | localStorage.setItem(this.database, JSON.stringify(this.collections)); 288 | 289 | return doc; 290 | } 291 | 292 | /** 293 | * Delete Element from collection 294 | */ 295 | delete(entity: string, { where }: { where: WhereQuery }): Element[] { 296 | const dataset = this.collections[entity] as Element[]; 297 | 298 | const { valueToFilterBy, field, operator } = this.handleWhere(where); 299 | 300 | const filtered = dataset.filter((x) => !OperatorOperations[operator as Operator](x[field], valueToFilterBy)); 301 | 302 | this.collections[entity] = filtered; 303 | 304 | localStorage.setItem(this.database, JSON.stringify(this.collections)); 305 | 306 | return filtered; 307 | } 308 | } 309 | 310 | export default Lsdb; 311 | -------------------------------------------------------------------------------- /tests/lsdb.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, test, beforeEach } from 'vitest'; 2 | 3 | import Lsdb from '../src/index'; 4 | 5 | let lsdb: Lsdb; 6 | 7 | class LocalStorageMock { 8 | private store: { [key: string]: string }; 9 | 10 | get length(): number { 11 | return Object.keys(this.store).length; 12 | } 13 | 14 | constructor() { 15 | this.store = {}; 16 | } 17 | 18 | clear() { 19 | this.store = {}; 20 | } 21 | 22 | getItem(key: string) { 23 | return this.store[key] || null; 24 | } 25 | 26 | setItem(key: string, value: string) { 27 | this.store[key] = String(value); 28 | } 29 | 30 | removeItem(key: string) { 31 | delete this.store[key]; 32 | } 33 | 34 | // When passed a number n, this method will return the name of the nth key in the storage. 35 | key(n: number): string | null { 36 | const keys = Object.keys(this.store); 37 | return keys[n] || null; 38 | } 39 | } 40 | 41 | globalThis.localStorage = new LocalStorageMock(); 42 | 43 | describe('lsdb', () => { 44 | beforeEach(() => { 45 | localStorage.clear(); 46 | lsdb = new Lsdb('test-1'); 47 | lsdb.collection(['test-1']); 48 | }); 49 | 50 | test('insert-count', () => { 51 | expect(lsdb.count('test-1')).toEqual(0); 52 | 53 | lsdb.insert('test-1', { foo: 'bar' }); 54 | 55 | expect(lsdb.count('test-1')).toEqual(1); 56 | 57 | lsdb.insert('test-1', { hello: 'world' }); 58 | 59 | expect(lsdb.count('test-1')).toEqual(2); 60 | }); 61 | 62 | test('insert-all', () => { 63 | const hello = lsdb.insert('test-1', { hello: 'world' }); 64 | const foo = lsdb.insert('test-1', { foo: 'bar' }); 65 | 66 | lsdb.collection(['test-2', 'test-3']); 67 | 68 | const dummy = lsdb.insert('test-2', { dummy: 'test' }); 69 | 70 | expect(lsdb.all()).toEqual({ 71 | 'test-1': [ 72 | { 73 | _id: hello._id, 74 | hello: 'world', 75 | }, 76 | { 77 | _id: foo._id, 78 | foo: 'bar', 79 | }, 80 | ], 81 | 'test-2': [ 82 | { 83 | _id: dummy._id, 84 | dummy: 'test', 85 | }, 86 | ], 87 | 'test-3': [], 88 | }); 89 | }); 90 | 91 | test('insert-delete', () => { 92 | const foo = lsdb.insert('test-1', { foo: 'bar' }); 93 | 94 | const hello = lsdb.insert('test-1', { hello: 'world' }); 95 | 96 | lsdb.delete('test-1', { 97 | where: { 98 | _id: { $eq: foo._id }, 99 | }, 100 | }); 101 | 102 | expect(lsdb.all('test-1')).toEqual([ 103 | { 104 | _id: hello._id, 105 | hello: 'world', 106 | }, 107 | ]); 108 | }); 109 | 110 | test('insert-find', () => { 111 | const foobar = lsdb.insert('test-1', { foo: 'bar' }); 112 | const num = lsdb.insert('test-1', { number: 50 }); 113 | const foodinner = lsdb.insert('test-1', { foo: 'Dinner' }); 114 | const foodrink = lsdb.insert('test-1', { foo: 'Drink' }); 115 | const arr = lsdb.insert('test-1', { 116 | food: ['Pizza', 'Cheese'], 117 | need: 'Drink', 118 | }); 119 | 120 | expect(lsdb.find('test-1', { where: { foo: { $eq: 'dummy' } } })).toEqual([]); 121 | 122 | expect(lsdb.find('test-1', { where: { foo: { $eq: 'bar' } } })).toEqual([ 123 | { 124 | _id: foobar._id, 125 | foo: 'bar', 126 | }, 127 | ]); 128 | 129 | expect(lsdb.find('test-1', { where: { food: { $in: ['Pizza'] } } })).toEqual([ 130 | { 131 | _id: arr._id, 132 | food: ['Pizza', 'Cheese'], 133 | need: 'Drink', 134 | }, 135 | ]); 136 | 137 | expect(lsdb.find('test-1', { where: { food: { $in: ['Pizza'] } } })).toEqual([ 138 | { 139 | _id: arr._id, 140 | food: ['Pizza', 'Cheese'], 141 | need: 'Drink', 142 | }, 143 | ]); 144 | 145 | expect(lsdb.find('test-1', { where: { food: { $nin: ['Cheese'] } } })).toEqual([ 146 | { _id: foobar._id, foo: 'bar' }, 147 | { _id: num._id, number: 50 }, 148 | { _id: foodinner._id, foo: 'Dinner' }, 149 | { _id: foodrink._id, foo: 'Drink' }, 150 | ]); 151 | 152 | expect(lsdb.find('test-1', { where: { food: { $nin: ['Cheese'] } }, limit: 10 })).toEqual([ 153 | { _id: foobar._id, foo: 'bar' }, 154 | { _id: num._id, number: 50 }, 155 | { _id: foodinner._id, foo: 'Dinner' }, 156 | { _id: foodrink._id, foo: 'Drink' }, 157 | ]); 158 | 159 | expect(lsdb.find('test-1', { where: { food: { $nin: ['Ch'] } }, limit: 3 })).toEqual([ 160 | { _id: foobar._id, foo: 'bar' }, 161 | { _id: num._id, number: 50 }, 162 | { _id: foodinner._id, foo: 'Dinner' }, 163 | ]); 164 | 165 | expect(lsdb.find('test-1', { where: { food: { $nin: ['Cheese'] } } })).toEqual([ 166 | { _id: foobar._id, foo: 'bar' }, 167 | { _id: num._id, number: 50 }, 168 | { _id: foodinner._id, foo: 'Dinner' }, 169 | { _id: foodrink._id, foo: 'Drink' }, 170 | ]); 171 | 172 | // expect(lsdb.find('test-1', { where: { food: { $nin: ['Drink', 'Pizza'] } } })).toEqual([ 173 | // { _id: foobar._id, foo: 'bar' }, 174 | // { _id: num._id, number: 50 }, 175 | // { _id: foodinner._id, foo: 'Dinner' }, 176 | // ]); 177 | 178 | expect(lsdb.find('test-1', { where: { number: { $nin: [50] } } })).toEqual([ 179 | { _id: foobar._id, foo: 'bar' }, 180 | { _id: foodinner._id, foo: 'Dinner' }, 181 | { _id: foodrink._id, foo: 'Drink' }, 182 | { 183 | _id: arr._id, 184 | food: ['Pizza', 'Cheese'], 185 | need: 'Drink', 186 | }, 187 | ]); 188 | 189 | expect(lsdb.find('test-1', { where: { uknown_field: { $nin: ['any_value'] } } })).toEqual([ 190 | { _id: foobar._id, foo: 'bar' }, 191 | { _id: num._id, number: 50 }, 192 | { _id: foodinner._id, foo: 'Dinner' }, 193 | { _id: foodrink._id, foo: 'Drink' }, 194 | { 195 | _id: arr._id, 196 | food: ['Pizza', 'Cheese'], 197 | need: 'Drink', 198 | }, 199 | ]); 200 | 201 | expect(lsdb.find('test-1', { where: { foo: { $in: ['Dinner', 'Drink'] } } })?.length).toEqual(2); 202 | 203 | expect( 204 | lsdb.find('test-1', { 205 | where: { foo: { $in: ['ri', 'er'] } }, 206 | }), 207 | ).toEqual([]); 208 | 209 | expect( 210 | lsdb.find('test-1', { 211 | where: { number: { $eq: 50 } }, 212 | }), 213 | ).toEqual([ 214 | { 215 | _id: num._id, 216 | number: 50, 217 | }, 218 | ]); 219 | 220 | expect( 221 | lsdb.find('test-1', { 222 | where: { number: { $gt: 20 } }, 223 | }), 224 | ).toEqual([ 225 | { 226 | _id: num._id, 227 | number: 50, 228 | }, 229 | ]); 230 | 231 | expect( 232 | lsdb.find('test-1', { 233 | where: { number: { $gte: 30 } }, 234 | }), 235 | ).toEqual([ 236 | { 237 | _id: num._id, 238 | number: 50, 239 | }, 240 | ]); 241 | 242 | expect( 243 | lsdb.find('test-1', { 244 | where: { number: { $lt: 100 } }, 245 | }), 246 | ).toEqual([ 247 | { 248 | _id: num._id, 249 | number: 50, 250 | }, 251 | ]); 252 | 253 | expect( 254 | lsdb.find('test-1', { 255 | where: { number: { $ne: 20 } }, 256 | }), 257 | ).toEqual([ 258 | { _id: foobar._id, foo: 'bar' }, 259 | { 260 | _id: num._id, 261 | number: 50, 262 | }, 263 | { 264 | _id: foodinner._id, 265 | foo: 'Dinner', 266 | }, 267 | { 268 | _id: foodrink._id, 269 | foo: 'Drink', 270 | }, 271 | { 272 | _id: arr._id, 273 | food: ['Pizza', 'Cheese'], 274 | need: 'Drink', 275 | }, 276 | ]); 277 | 278 | expect( 279 | lsdb.find('test-1', { 280 | where: { number: { $ne: 20 } }, 281 | limit: 2, 282 | }), 283 | ).toEqual([ 284 | { _id: foobar._id, foo: 'bar' }, 285 | { 286 | _id: num._id, 287 | number: 50, 288 | }, 289 | ]); 290 | }); 291 | 292 | test('insert-findOne', () => { 293 | const n1 = lsdb.insert('test-1', { number: 20 }); 294 | const n2 = lsdb.insert('test-1', { number: 50 }); 295 | 296 | expect( 297 | lsdb.findOne('test-1', { 298 | where: { number: { $lte: 100 } }, 299 | }), 300 | ).toEqual({ 301 | _id: n1._id, 302 | number: 20, 303 | }); 304 | 305 | expect( 306 | lsdb.findOne('test-1', { 307 | where: {}, 308 | }), 309 | ).toEqual(undefined); 310 | 311 | expect( 312 | lsdb.findOne('test-1', { 313 | where: { number: { $eq: 50 } }, 314 | }), 315 | ).toEqual({ 316 | _id: n2._id, 317 | number: 50, 318 | }); 319 | }); 320 | 321 | test('insert-update', () => { 322 | lsdb.insert('test-1', { foo: 'bar' }); 323 | const fooUp = lsdb.update('test-1', { foo: 'bar' }, { foo: 'newBar' }); 324 | 325 | expect(lsdb.all()).toEqual({ 326 | 'test-1': [{ _id: fooUp._id, foo: 'newBar' }], 327 | }); 328 | }); 329 | 330 | test('collection', () => { 331 | let res = lsdb.collection('hello'); 332 | 333 | expect(res).toEqual({ 334 | status: 'success', 335 | }); 336 | 337 | res = lsdb.collection(['hello', true] as unknown as string[]); 338 | 339 | expect(res).toEqual(Error('All values must be strings')); 340 | }); 341 | 342 | test('insert-many', () => { 343 | lsdb.collection(['test-2']); 344 | 345 | const hello = lsdb.insertMany('test-2', [{ hello: 'hello' }, { foo: 'foo' }]); 346 | 347 | expect(lsdb.all()).toEqual({ 348 | 'test-1': [], 349 | 'test-2': [ 350 | { 351 | _id: hello[0]._id, 352 | hello: 'hello', 353 | }, 354 | { 355 | _id: hello[1]._id, 356 | foo: 'foo', 357 | }, 358 | ], 359 | }); 360 | }); 361 | 362 | test('inser-many-sort', () => { 363 | lsdb.collection(['test-2'], true); 364 | 365 | lsdb.insertMany('test-2', [ 366 | { item: { category: 'cake', type: 'chiffon' }, amount: 10 }, 367 | { item: { category: 'cookies', type: 'chocolate chip' }, amount: 50 }, 368 | { item: { category: 'cookies', type: 'chocolate chip' }, amount: 15 }, 369 | { item: { category: 'cake', type: 'lemon' }, amount: 30 }, 370 | { item: { category: 'cake', type: 'carrot' }, amount: 20 }, 371 | { item: { category: 'brownies', type: 'blondie' }, amount: 10 }, 372 | { name: "Jane's Deli", borough: 'Brooklyn' }, 373 | ]); 374 | 375 | expect(lsdb.find('test-2', { limit: 3, sort: { field: 'amount', order: 'desc' } })?.length).toEqual(3); 376 | expect(lsdb.find('test-2', { limit: 3, sort: { field: 'amount', order: 'asc' } })?.map((i) => i.amount)).toEqual([ 377 | 10, 10, 15, 378 | ]); 379 | }); 380 | 381 | test('inser-many-limit', () => { 382 | lsdb.collection(['test-2']); 383 | 384 | lsdb.insertMany('test-2', [ 385 | { item: { category: 'cake', type: 'chiffon' }, amount: 10 }, 386 | { item: { category: 'cookies', type: 'chocolate chip' }, amount: 50 }, 387 | { item: { category: 'cookies', type: 'chocolate chip' }, amount: 15 }, 388 | { item: { category: 'cake', type: 'lemon' }, amount: 30 }, 389 | { item: { category: 'cake', type: 'carrot' }, amount: 20 }, 390 | { item: { category: 'brownies', type: 'blondie' }, amount: 10 }, 391 | { name: "Jane's Deli", borough: 'Brooklyn' }, 392 | ]); 393 | 394 | expect(lsdb.find('test-2', { limit: 3 })?.length).toEqual(3); 395 | expect(lsdb.find<{ amount: number }>('test-2', { limit: 3 })?.map((i) => i.amount)).toEqual([10, 50, 15]); 396 | }); 397 | }); 398 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@eslint/js': 12 | specifier: ^9.17.0 13 | version: 9.17.0 14 | '@typescript-eslint/eslint-plugin': 15 | specifier: 8.19.0 16 | version: 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) 17 | '@typescript-eslint/parser': 18 | specifier: 8.19.0 19 | version: 8.19.0(eslint@9.17.0)(typescript@5.7.2) 20 | esbuild: 21 | specifier: 0.24.2 22 | version: 0.24.2 23 | eslint: 24 | specifier: 9.17.0 25 | version: 9.17.0 26 | eslint-config-prettier: 27 | specifier: 9.1.0 28 | version: 9.1.0(eslint@9.17.0) 29 | prettier: 30 | specifier: 3.4.2 31 | version: 3.4.2 32 | typescript: 33 | specifier: 5.7.2 34 | version: 5.7.2 35 | typescript-eslint: 36 | specifier: ^8.19.0 37 | version: 8.19.0(eslint@9.17.0)(typescript@5.7.2) 38 | vitest: 39 | specifier: ^2.1.8 40 | version: 2.1.8(@types/node@22.10.3) 41 | 42 | packages: 43 | 44 | '@esbuild/aix-ppc64@0.21.5': 45 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} 46 | engines: {node: '>=12'} 47 | cpu: [ppc64] 48 | os: [aix] 49 | 50 | '@esbuild/aix-ppc64@0.24.2': 51 | resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 52 | engines: {node: '>=18'} 53 | cpu: [ppc64] 54 | os: [aix] 55 | 56 | '@esbuild/android-arm64@0.21.5': 57 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} 58 | engines: {node: '>=12'} 59 | cpu: [arm64] 60 | os: [android] 61 | 62 | '@esbuild/android-arm64@0.24.2': 63 | resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 64 | engines: {node: '>=18'} 65 | cpu: [arm64] 66 | os: [android] 67 | 68 | '@esbuild/android-arm@0.21.5': 69 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} 70 | engines: {node: '>=12'} 71 | cpu: [arm] 72 | os: [android] 73 | 74 | '@esbuild/android-arm@0.24.2': 75 | resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 76 | engines: {node: '>=18'} 77 | cpu: [arm] 78 | os: [android] 79 | 80 | '@esbuild/android-x64@0.21.5': 81 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} 82 | engines: {node: '>=12'} 83 | cpu: [x64] 84 | os: [android] 85 | 86 | '@esbuild/android-x64@0.24.2': 87 | resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 88 | engines: {node: '>=18'} 89 | cpu: [x64] 90 | os: [android] 91 | 92 | '@esbuild/darwin-arm64@0.21.5': 93 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} 94 | engines: {node: '>=12'} 95 | cpu: [arm64] 96 | os: [darwin] 97 | 98 | '@esbuild/darwin-arm64@0.24.2': 99 | resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 100 | engines: {node: '>=18'} 101 | cpu: [arm64] 102 | os: [darwin] 103 | 104 | '@esbuild/darwin-x64@0.21.5': 105 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} 106 | engines: {node: '>=12'} 107 | cpu: [x64] 108 | os: [darwin] 109 | 110 | '@esbuild/darwin-x64@0.24.2': 111 | resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 112 | engines: {node: '>=18'} 113 | cpu: [x64] 114 | os: [darwin] 115 | 116 | '@esbuild/freebsd-arm64@0.21.5': 117 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} 118 | engines: {node: '>=12'} 119 | cpu: [arm64] 120 | os: [freebsd] 121 | 122 | '@esbuild/freebsd-arm64@0.24.2': 123 | resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 124 | engines: {node: '>=18'} 125 | cpu: [arm64] 126 | os: [freebsd] 127 | 128 | '@esbuild/freebsd-x64@0.21.5': 129 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} 130 | engines: {node: '>=12'} 131 | cpu: [x64] 132 | os: [freebsd] 133 | 134 | '@esbuild/freebsd-x64@0.24.2': 135 | resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 136 | engines: {node: '>=18'} 137 | cpu: [x64] 138 | os: [freebsd] 139 | 140 | '@esbuild/linux-arm64@0.21.5': 141 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} 142 | engines: {node: '>=12'} 143 | cpu: [arm64] 144 | os: [linux] 145 | 146 | '@esbuild/linux-arm64@0.24.2': 147 | resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 148 | engines: {node: '>=18'} 149 | cpu: [arm64] 150 | os: [linux] 151 | 152 | '@esbuild/linux-arm@0.21.5': 153 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} 154 | engines: {node: '>=12'} 155 | cpu: [arm] 156 | os: [linux] 157 | 158 | '@esbuild/linux-arm@0.24.2': 159 | resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 160 | engines: {node: '>=18'} 161 | cpu: [arm] 162 | os: [linux] 163 | 164 | '@esbuild/linux-ia32@0.21.5': 165 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} 166 | engines: {node: '>=12'} 167 | cpu: [ia32] 168 | os: [linux] 169 | 170 | '@esbuild/linux-ia32@0.24.2': 171 | resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 172 | engines: {node: '>=18'} 173 | cpu: [ia32] 174 | os: [linux] 175 | 176 | '@esbuild/linux-loong64@0.21.5': 177 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} 178 | engines: {node: '>=12'} 179 | cpu: [loong64] 180 | os: [linux] 181 | 182 | '@esbuild/linux-loong64@0.24.2': 183 | resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 184 | engines: {node: '>=18'} 185 | cpu: [loong64] 186 | os: [linux] 187 | 188 | '@esbuild/linux-mips64el@0.21.5': 189 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} 190 | engines: {node: '>=12'} 191 | cpu: [mips64el] 192 | os: [linux] 193 | 194 | '@esbuild/linux-mips64el@0.24.2': 195 | resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 196 | engines: {node: '>=18'} 197 | cpu: [mips64el] 198 | os: [linux] 199 | 200 | '@esbuild/linux-ppc64@0.21.5': 201 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} 202 | engines: {node: '>=12'} 203 | cpu: [ppc64] 204 | os: [linux] 205 | 206 | '@esbuild/linux-ppc64@0.24.2': 207 | resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 208 | engines: {node: '>=18'} 209 | cpu: [ppc64] 210 | os: [linux] 211 | 212 | '@esbuild/linux-riscv64@0.21.5': 213 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} 214 | engines: {node: '>=12'} 215 | cpu: [riscv64] 216 | os: [linux] 217 | 218 | '@esbuild/linux-riscv64@0.24.2': 219 | resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 220 | engines: {node: '>=18'} 221 | cpu: [riscv64] 222 | os: [linux] 223 | 224 | '@esbuild/linux-s390x@0.21.5': 225 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} 226 | engines: {node: '>=12'} 227 | cpu: [s390x] 228 | os: [linux] 229 | 230 | '@esbuild/linux-s390x@0.24.2': 231 | resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 232 | engines: {node: '>=18'} 233 | cpu: [s390x] 234 | os: [linux] 235 | 236 | '@esbuild/linux-x64@0.21.5': 237 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} 238 | engines: {node: '>=12'} 239 | cpu: [x64] 240 | os: [linux] 241 | 242 | '@esbuild/linux-x64@0.24.2': 243 | resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 244 | engines: {node: '>=18'} 245 | cpu: [x64] 246 | os: [linux] 247 | 248 | '@esbuild/netbsd-arm64@0.24.2': 249 | resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 250 | engines: {node: '>=18'} 251 | cpu: [arm64] 252 | os: [netbsd] 253 | 254 | '@esbuild/netbsd-x64@0.21.5': 255 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} 256 | engines: {node: '>=12'} 257 | cpu: [x64] 258 | os: [netbsd] 259 | 260 | '@esbuild/netbsd-x64@0.24.2': 261 | resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 262 | engines: {node: '>=18'} 263 | cpu: [x64] 264 | os: [netbsd] 265 | 266 | '@esbuild/openbsd-arm64@0.24.2': 267 | resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 268 | engines: {node: '>=18'} 269 | cpu: [arm64] 270 | os: [openbsd] 271 | 272 | '@esbuild/openbsd-x64@0.21.5': 273 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} 274 | engines: {node: '>=12'} 275 | cpu: [x64] 276 | os: [openbsd] 277 | 278 | '@esbuild/openbsd-x64@0.24.2': 279 | resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 280 | engines: {node: '>=18'} 281 | cpu: [x64] 282 | os: [openbsd] 283 | 284 | '@esbuild/sunos-x64@0.21.5': 285 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} 286 | engines: {node: '>=12'} 287 | cpu: [x64] 288 | os: [sunos] 289 | 290 | '@esbuild/sunos-x64@0.24.2': 291 | resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 292 | engines: {node: '>=18'} 293 | cpu: [x64] 294 | os: [sunos] 295 | 296 | '@esbuild/win32-arm64@0.21.5': 297 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} 298 | engines: {node: '>=12'} 299 | cpu: [arm64] 300 | os: [win32] 301 | 302 | '@esbuild/win32-arm64@0.24.2': 303 | resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 304 | engines: {node: '>=18'} 305 | cpu: [arm64] 306 | os: [win32] 307 | 308 | '@esbuild/win32-ia32@0.21.5': 309 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} 310 | engines: {node: '>=12'} 311 | cpu: [ia32] 312 | os: [win32] 313 | 314 | '@esbuild/win32-ia32@0.24.2': 315 | resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 316 | engines: {node: '>=18'} 317 | cpu: [ia32] 318 | os: [win32] 319 | 320 | '@esbuild/win32-x64@0.21.5': 321 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} 322 | engines: {node: '>=12'} 323 | cpu: [x64] 324 | os: [win32] 325 | 326 | '@esbuild/win32-x64@0.24.2': 327 | resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 328 | engines: {node: '>=18'} 329 | cpu: [x64] 330 | os: [win32] 331 | 332 | '@eslint-community/eslint-utils@4.4.1': 333 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 334 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 335 | peerDependencies: 336 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 337 | 338 | '@eslint-community/regexpp@4.12.1': 339 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 340 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 341 | 342 | '@eslint/config-array@0.19.1': 343 | resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} 344 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 345 | 346 | '@eslint/core@0.9.1': 347 | resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} 348 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 349 | 350 | '@eslint/eslintrc@3.2.0': 351 | resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} 352 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 353 | 354 | '@eslint/js@9.17.0': 355 | resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} 356 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 357 | 358 | '@eslint/object-schema@2.1.5': 359 | resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} 360 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 361 | 362 | '@eslint/plugin-kit@0.2.4': 363 | resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} 364 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 365 | 366 | '@humanfs/core@0.19.1': 367 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 368 | engines: {node: '>=18.18.0'} 369 | 370 | '@humanfs/node@0.16.6': 371 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 372 | engines: {node: '>=18.18.0'} 373 | 374 | '@humanwhocodes/module-importer@1.0.1': 375 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 376 | engines: {node: '>=12.22'} 377 | 378 | '@humanwhocodes/retry@0.3.1': 379 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 380 | engines: {node: '>=18.18'} 381 | 382 | '@humanwhocodes/retry@0.4.1': 383 | resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} 384 | engines: {node: '>=18.18'} 385 | 386 | '@jridgewell/sourcemap-codec@1.5.0': 387 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 388 | 389 | '@nodelib/fs.scandir@2.1.5': 390 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 391 | engines: {node: '>= 8'} 392 | 393 | '@nodelib/fs.stat@2.0.5': 394 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 395 | engines: {node: '>= 8'} 396 | 397 | '@nodelib/fs.walk@1.2.8': 398 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 399 | engines: {node: '>= 8'} 400 | 401 | '@rollup/rollup-android-arm-eabi@4.29.2': 402 | resolution: {integrity: sha512-s/8RiF4bdmGnc/J0N7lHAr5ZFJj+NdJqJ/Hj29K+c4lEdoVlukzvWXB9XpWZCdakVT0YAw8iyIqUP2iFRz5/jA==} 403 | cpu: [arm] 404 | os: [android] 405 | 406 | '@rollup/rollup-android-arm64@4.29.2': 407 | resolution: {integrity: sha512-mKRlVj1KsKWyEOwR6nwpmzakq6SgZXW4NUHNWlYSiyncJpuXk7wdLzuKdWsRoR1WLbWsZBKvsUCdCTIAqRn9cA==} 408 | cpu: [arm64] 409 | os: [android] 410 | 411 | '@rollup/rollup-darwin-arm64@4.29.2': 412 | resolution: {integrity: sha512-vJX+vennGwygmutk7N333lvQ/yKVAHnGoBS2xMRQgXWW8tvn46YWuTDOpKroSPR9BEW0Gqdga2DHqz8Pwk6X5w==} 413 | cpu: [arm64] 414 | os: [darwin] 415 | 416 | '@rollup/rollup-darwin-x64@4.29.2': 417 | resolution: {integrity: sha512-e2rW9ng5O6+Mt3ht8fH0ljfjgSCC6ffmOipiLUgAnlK86CHIaiCdHCzHzmTkMj6vEkqAiRJ7ss6Ibn56B+RE5w==} 418 | cpu: [x64] 419 | os: [darwin] 420 | 421 | '@rollup/rollup-freebsd-arm64@4.29.2': 422 | resolution: {integrity: sha512-/xdNwZe+KesG6XJCK043EjEDZTacCtL4yurMZRLESIgHQdvtNyul3iz2Ab03ZJG0pQKbFTu681i+4ETMF9uE/Q==} 423 | cpu: [arm64] 424 | os: [freebsd] 425 | 426 | '@rollup/rollup-freebsd-x64@4.29.2': 427 | resolution: {integrity: sha512-eXKvpThGzREuAbc6qxnArHh8l8W4AyTcL8IfEnmx+bcnmaSGgjyAHbzZvHZI2csJ+e0MYddl7DX0X7g3sAuXDQ==} 428 | cpu: [x64] 429 | os: [freebsd] 430 | 431 | '@rollup/rollup-linux-arm-gnueabihf@4.29.2': 432 | resolution: {integrity: sha512-h4VgxxmzmtXLLYNDaUcQevCmPYX6zSj4SwKuzY7SR5YlnCBYsmvfYORXgiU8axhkFCDtQF3RW5LIXT8B14Qykg==} 433 | cpu: [arm] 434 | os: [linux] 435 | 436 | '@rollup/rollup-linux-arm-musleabihf@4.29.2': 437 | resolution: {integrity: sha512-EObwZ45eMmWZQ1w4N7qy4+G1lKHm6mcOwDa+P2+61qxWu1PtQJ/lz2CNJ7W3CkfgN0FQ7cBUy2tk6D5yR4KeXw==} 438 | cpu: [arm] 439 | os: [linux] 440 | 441 | '@rollup/rollup-linux-arm64-gnu@4.29.2': 442 | resolution: {integrity: sha512-Z7zXVHEXg1elbbYiP/29pPwlJtLeXzjrj4241/kCcECds8Zg9fDfURWbZHRIKrEriAPS8wnVtdl4ZJBvZr325w==} 443 | cpu: [arm64] 444 | os: [linux] 445 | 446 | '@rollup/rollup-linux-arm64-musl@4.29.2': 447 | resolution: {integrity: sha512-TF4kxkPq+SudS/r4zGPf0G08Bl7+NZcFrUSR3484WwsHgGgJyPQRLCNrQ/R5J6VzxfEeQR9XRpc8m2t7lD6SEQ==} 448 | cpu: [arm64] 449 | os: [linux] 450 | 451 | '@rollup/rollup-linux-loongarch64-gnu@4.29.2': 452 | resolution: {integrity: sha512-kO9Fv5zZuyj2zB2af4KA29QF6t7YSxKrY7sxZXfw8koDQj9bx5Tk5RjH+kWKFKok0wLGTi4bG117h31N+TIBEg==} 453 | cpu: [loong64] 454 | os: [linux] 455 | 456 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.2': 457 | resolution: {integrity: sha512-gIh776X7UCBaetVJGdjXPFurGsdWwHHinwRnC5JlLADU8Yk0EdS/Y+dMO264OjJFo7MXQ5PX4xVFbxrwK8zLqA==} 458 | cpu: [ppc64] 459 | os: [linux] 460 | 461 | '@rollup/rollup-linux-riscv64-gnu@4.29.2': 462 | resolution: {integrity: sha512-YgikssQ5UNq1GoFKZydMEkhKbjlUq7G3h8j6yWXLBF24KyoA5BcMtaOUAXq5sydPmOPEqB6kCyJpyifSpCfQ0w==} 463 | cpu: [riscv64] 464 | os: [linux] 465 | 466 | '@rollup/rollup-linux-s390x-gnu@4.29.2': 467 | resolution: {integrity: sha512-9ouIR2vFWCyL0Z50dfnon5nOrpDdkTG9lNDs7MRaienQKlTyHcDxplmk3IbhFlutpifBSBr2H4rVILwmMLcaMA==} 468 | cpu: [s390x] 469 | os: [linux] 470 | 471 | '@rollup/rollup-linux-x64-gnu@4.29.2': 472 | resolution: {integrity: sha512-ckBBNRN/F+NoSUDENDIJ2U9UWmIODgwDB/vEXCPOMcsco1niTkxTXa6D2Y/pvCnpzaidvY2qVxGzLilNs9BSzw==} 473 | cpu: [x64] 474 | os: [linux] 475 | 476 | '@rollup/rollup-linux-x64-musl@4.29.2': 477 | resolution: {integrity: sha512-jycl1wL4AgM2aBFJFlpll/kGvAjhK8GSbEmFT5v3KC3rP/b5xZ1KQmv0vQQ8Bzb2ieFQ0kZFPRMbre/l3Bu9JA==} 478 | cpu: [x64] 479 | os: [linux] 480 | 481 | '@rollup/rollup-win32-arm64-msvc@4.29.2': 482 | resolution: {integrity: sha512-S2V0LlcOiYkNGlRAWZwwUdNgdZBfvsDHW0wYosYFV3c7aKgEVcbonetZXsHv7jRTTX+oY5nDYT4W6B1oUpMNOg==} 483 | cpu: [arm64] 484 | os: [win32] 485 | 486 | '@rollup/rollup-win32-ia32-msvc@4.29.2': 487 | resolution: {integrity: sha512-pW8kioj9H5f/UujdoX2atFlXNQ9aCfAxFRaa+mhczwcsusm6gGrSo4z0SLvqLF5LwFqFTjiLCCzGkNK/LE0utQ==} 488 | cpu: [ia32] 489 | os: [win32] 490 | 491 | '@rollup/rollup-win32-x64-msvc@4.29.2': 492 | resolution: {integrity: sha512-p6fTArexECPf6KnOHvJXRpAEq0ON1CBtzG/EY4zw08kCHk/kivBc5vUEtnCFNCHOpJZ2ne77fxwRLIKD4wuW2Q==} 493 | cpu: [x64] 494 | os: [win32] 495 | 496 | '@types/estree@1.0.6': 497 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 498 | 499 | '@types/json-schema@7.0.15': 500 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 501 | 502 | '@types/node@22.10.3': 503 | resolution: {integrity: sha512-DifAyw4BkrufCILvD3ucnuN8eydUfc/C1GlyrnI+LK6543w5/L3VeVgf05o3B4fqSXP1dKYLOZsKfutpxPzZrw==} 504 | 505 | '@typescript-eslint/eslint-plugin@8.19.0': 506 | resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} 507 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 508 | peerDependencies: 509 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 510 | eslint: ^8.57.0 || ^9.0.0 511 | typescript: '>=4.8.4 <5.8.0' 512 | 513 | '@typescript-eslint/parser@8.19.0': 514 | resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} 515 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 516 | peerDependencies: 517 | eslint: ^8.57.0 || ^9.0.0 518 | typescript: '>=4.8.4 <5.8.0' 519 | 520 | '@typescript-eslint/scope-manager@8.19.0': 521 | resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} 522 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 523 | 524 | '@typescript-eslint/type-utils@8.19.0': 525 | resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} 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 <5.8.0' 530 | 531 | '@typescript-eslint/types@8.19.0': 532 | resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} 533 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 534 | 535 | '@typescript-eslint/typescript-estree@8.19.0': 536 | resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} 537 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 538 | peerDependencies: 539 | typescript: '>=4.8.4 <5.8.0' 540 | 541 | '@typescript-eslint/utils@8.19.0': 542 | resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} 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 <5.8.0' 547 | 548 | '@typescript-eslint/visitor-keys@8.19.0': 549 | resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} 550 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 551 | 552 | '@vitest/expect@2.1.8': 553 | resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==} 554 | 555 | '@vitest/mocker@2.1.8': 556 | resolution: {integrity: sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA==} 557 | peerDependencies: 558 | msw: ^2.4.9 559 | vite: ^5.0.0 560 | peerDependenciesMeta: 561 | msw: 562 | optional: true 563 | vite: 564 | optional: true 565 | 566 | '@vitest/pretty-format@2.1.8': 567 | resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==} 568 | 569 | '@vitest/runner@2.1.8': 570 | resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==} 571 | 572 | '@vitest/snapshot@2.1.8': 573 | resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==} 574 | 575 | '@vitest/spy@2.1.8': 576 | resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==} 577 | 578 | '@vitest/utils@2.1.8': 579 | resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} 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.14.0: 587 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 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-styles@4.3.0: 595 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 596 | engines: {node: '>=8'} 597 | 598 | argparse@2.0.1: 599 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 600 | 601 | assertion-error@2.0.1: 602 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 603 | engines: {node: '>=12'} 604 | 605 | balanced-match@1.0.2: 606 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 607 | 608 | brace-expansion@1.1.11: 609 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 610 | 611 | brace-expansion@2.0.1: 612 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 613 | 614 | braces@3.0.3: 615 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 616 | engines: {node: '>=8'} 617 | 618 | cac@6.7.14: 619 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 620 | engines: {node: '>=8'} 621 | 622 | callsites@3.1.0: 623 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 624 | engines: {node: '>=6'} 625 | 626 | chai@5.1.2: 627 | resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} 628 | engines: {node: '>=12'} 629 | 630 | chalk@4.1.2: 631 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 632 | engines: {node: '>=10'} 633 | 634 | check-error@2.1.1: 635 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 636 | engines: {node: '>= 16'} 637 | 638 | color-convert@2.0.1: 639 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 640 | engines: {node: '>=7.0.0'} 641 | 642 | color-name@1.1.4: 643 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 644 | 645 | concat-map@0.0.1: 646 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 647 | 648 | cross-spawn@7.0.6: 649 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 650 | engines: {node: '>= 8'} 651 | 652 | debug@4.4.0: 653 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 654 | engines: {node: '>=6.0'} 655 | peerDependencies: 656 | supports-color: '*' 657 | peerDependenciesMeta: 658 | supports-color: 659 | optional: true 660 | 661 | deep-eql@5.0.2: 662 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 663 | engines: {node: '>=6'} 664 | 665 | deep-is@0.1.4: 666 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 667 | 668 | es-module-lexer@1.6.0: 669 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 670 | 671 | esbuild@0.21.5: 672 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} 673 | engines: {node: '>=12'} 674 | hasBin: true 675 | 676 | esbuild@0.24.2: 677 | resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 678 | engines: {node: '>=18'} 679 | hasBin: true 680 | 681 | escape-string-regexp@4.0.0: 682 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 683 | engines: {node: '>=10'} 684 | 685 | eslint-config-prettier@9.1.0: 686 | resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} 687 | hasBin: true 688 | peerDependencies: 689 | eslint: '>=7.0.0' 690 | 691 | eslint-scope@8.2.0: 692 | resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} 693 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 694 | 695 | eslint-visitor-keys@3.4.3: 696 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 697 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 698 | 699 | eslint-visitor-keys@4.2.0: 700 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 701 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 702 | 703 | eslint@9.17.0: 704 | resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} 705 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 706 | hasBin: true 707 | peerDependencies: 708 | jiti: '*' 709 | peerDependenciesMeta: 710 | jiti: 711 | optional: true 712 | 713 | espree@10.3.0: 714 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 715 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 716 | 717 | esquery@1.6.0: 718 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 719 | engines: {node: '>=0.10'} 720 | 721 | esrecurse@4.3.0: 722 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 723 | engines: {node: '>=4.0'} 724 | 725 | estraverse@5.3.0: 726 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 727 | engines: {node: '>=4.0'} 728 | 729 | estree-walker@3.0.3: 730 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 731 | 732 | esutils@2.0.3: 733 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 734 | engines: {node: '>=0.10.0'} 735 | 736 | expect-type@1.1.0: 737 | resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} 738 | engines: {node: '>=12.0.0'} 739 | 740 | fast-deep-equal@3.1.3: 741 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 742 | 743 | fast-glob@3.3.2: 744 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 745 | engines: {node: '>=8.6.0'} 746 | 747 | fast-json-stable-stringify@2.1.0: 748 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 749 | 750 | fast-levenshtein@2.0.6: 751 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 752 | 753 | fastq@1.18.0: 754 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} 755 | 756 | file-entry-cache@8.0.0: 757 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 758 | engines: {node: '>=16.0.0'} 759 | 760 | fill-range@7.1.1: 761 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 762 | engines: {node: '>=8'} 763 | 764 | find-up@5.0.0: 765 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 766 | engines: {node: '>=10'} 767 | 768 | flat-cache@4.0.1: 769 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 770 | engines: {node: '>=16'} 771 | 772 | flatted@3.3.2: 773 | resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} 774 | 775 | fsevents@2.3.3: 776 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 777 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 778 | os: [darwin] 779 | 780 | glob-parent@5.1.2: 781 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 782 | engines: {node: '>= 6'} 783 | 784 | glob-parent@6.0.2: 785 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 786 | engines: {node: '>=10.13.0'} 787 | 788 | globals@14.0.0: 789 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 790 | engines: {node: '>=18'} 791 | 792 | graphemer@1.4.0: 793 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 794 | 795 | has-flag@4.0.0: 796 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 797 | engines: {node: '>=8'} 798 | 799 | ignore@5.3.2: 800 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 801 | engines: {node: '>= 4'} 802 | 803 | import-fresh@3.3.0: 804 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 805 | engines: {node: '>=6'} 806 | 807 | imurmurhash@0.1.4: 808 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 809 | engines: {node: '>=0.8.19'} 810 | 811 | is-extglob@2.1.1: 812 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 813 | engines: {node: '>=0.10.0'} 814 | 815 | is-glob@4.0.3: 816 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 817 | engines: {node: '>=0.10.0'} 818 | 819 | is-number@7.0.0: 820 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 821 | engines: {node: '>=0.12.0'} 822 | 823 | isexe@2.0.0: 824 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 825 | 826 | js-yaml@4.1.0: 827 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 828 | hasBin: true 829 | 830 | json-buffer@3.0.1: 831 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 832 | 833 | json-schema-traverse@0.4.1: 834 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 835 | 836 | json-stable-stringify-without-jsonify@1.0.1: 837 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 838 | 839 | keyv@4.5.4: 840 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 841 | 842 | levn@0.4.1: 843 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 844 | engines: {node: '>= 0.8.0'} 845 | 846 | locate-path@6.0.0: 847 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 848 | engines: {node: '>=10'} 849 | 850 | lodash.merge@4.6.2: 851 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 852 | 853 | loupe@3.1.2: 854 | resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} 855 | 856 | magic-string@0.30.17: 857 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 858 | 859 | merge2@1.4.1: 860 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 861 | engines: {node: '>= 8'} 862 | 863 | micromatch@4.0.8: 864 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 865 | engines: {node: '>=8.6'} 866 | 867 | minimatch@3.1.2: 868 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 869 | 870 | minimatch@9.0.5: 871 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 872 | engines: {node: '>=16 || 14 >=14.17'} 873 | 874 | ms@2.1.3: 875 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 876 | 877 | nanoid@3.3.8: 878 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 879 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 880 | hasBin: true 881 | 882 | natural-compare@1.4.0: 883 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 884 | 885 | optionator@0.9.4: 886 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 887 | engines: {node: '>= 0.8.0'} 888 | 889 | p-limit@3.1.0: 890 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 891 | engines: {node: '>=10'} 892 | 893 | p-locate@5.0.0: 894 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 895 | engines: {node: '>=10'} 896 | 897 | parent-module@1.0.1: 898 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 899 | engines: {node: '>=6'} 900 | 901 | path-exists@4.0.0: 902 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 903 | engines: {node: '>=8'} 904 | 905 | path-key@3.1.1: 906 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 907 | engines: {node: '>=8'} 908 | 909 | pathe@1.1.2: 910 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 911 | 912 | pathval@2.0.0: 913 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 914 | engines: {node: '>= 14.16'} 915 | 916 | picocolors@1.1.1: 917 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 918 | 919 | picomatch@2.3.1: 920 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 921 | engines: {node: '>=8.6'} 922 | 923 | postcss@8.4.49: 924 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 925 | engines: {node: ^10 || ^12 || >=14} 926 | 927 | prelude-ls@1.2.1: 928 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 929 | engines: {node: '>= 0.8.0'} 930 | 931 | prettier@3.4.2: 932 | resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} 933 | engines: {node: '>=14'} 934 | hasBin: true 935 | 936 | punycode@2.3.1: 937 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 938 | engines: {node: '>=6'} 939 | 940 | queue-microtask@1.2.3: 941 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 942 | 943 | resolve-from@4.0.0: 944 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 945 | engines: {node: '>=4'} 946 | 947 | reusify@1.0.4: 948 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 949 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 950 | 951 | rollup@4.29.2: 952 | resolution: {integrity: sha512-tJXpsEkzsEzyAKIaB3qv3IuvTVcTN7qBw1jL4SPPXM3vzDrJgiLGFY6+HodgFaUHAJ2RYJ94zV5MKRJCoQzQeA==} 953 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 954 | hasBin: true 955 | 956 | run-parallel@1.2.0: 957 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 958 | 959 | semver@7.6.3: 960 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 961 | engines: {node: '>=10'} 962 | hasBin: true 963 | 964 | shebang-command@2.0.0: 965 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 966 | engines: {node: '>=8'} 967 | 968 | shebang-regex@3.0.0: 969 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 970 | engines: {node: '>=8'} 971 | 972 | siginfo@2.0.0: 973 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 974 | 975 | source-map-js@1.2.1: 976 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 977 | engines: {node: '>=0.10.0'} 978 | 979 | stackback@0.0.2: 980 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 981 | 982 | std-env@3.8.0: 983 | resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 984 | 985 | strip-json-comments@3.1.1: 986 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 987 | engines: {node: '>=8'} 988 | 989 | supports-color@7.2.0: 990 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 991 | engines: {node: '>=8'} 992 | 993 | tinybench@2.9.0: 994 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 995 | 996 | tinyexec@0.3.2: 997 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 998 | 999 | tinypool@1.0.2: 1000 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1001 | engines: {node: ^18.0.0 || >=20.0.0} 1002 | 1003 | tinyrainbow@1.2.0: 1004 | resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} 1005 | engines: {node: '>=14.0.0'} 1006 | 1007 | tinyspy@3.0.2: 1008 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1009 | engines: {node: '>=14.0.0'} 1010 | 1011 | to-regex-range@5.0.1: 1012 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1013 | engines: {node: '>=8.0'} 1014 | 1015 | ts-api-utils@1.4.3: 1016 | resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} 1017 | engines: {node: '>=16'} 1018 | peerDependencies: 1019 | typescript: '>=4.2.0' 1020 | 1021 | type-check@0.4.0: 1022 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1023 | engines: {node: '>= 0.8.0'} 1024 | 1025 | typescript-eslint@8.19.0: 1026 | resolution: {integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==} 1027 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1028 | peerDependencies: 1029 | eslint: ^8.57.0 || ^9.0.0 1030 | typescript: '>=4.8.4 <5.8.0' 1031 | 1032 | typescript@5.7.2: 1033 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 1034 | engines: {node: '>=14.17'} 1035 | hasBin: true 1036 | 1037 | undici-types@6.20.0: 1038 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1039 | 1040 | uri-js@4.4.1: 1041 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1042 | 1043 | vite-node@2.1.8: 1044 | resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==} 1045 | engines: {node: ^18.0.0 || >=20.0.0} 1046 | hasBin: true 1047 | 1048 | vite@5.4.11: 1049 | resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} 1050 | engines: {node: ^18.0.0 || >=20.0.0} 1051 | hasBin: true 1052 | peerDependencies: 1053 | '@types/node': ^18.0.0 || >=20.0.0 1054 | less: '*' 1055 | lightningcss: ^1.21.0 1056 | sass: '*' 1057 | sass-embedded: '*' 1058 | stylus: '*' 1059 | sugarss: '*' 1060 | terser: ^5.4.0 1061 | peerDependenciesMeta: 1062 | '@types/node': 1063 | optional: true 1064 | less: 1065 | optional: true 1066 | lightningcss: 1067 | optional: true 1068 | sass: 1069 | optional: true 1070 | sass-embedded: 1071 | optional: true 1072 | stylus: 1073 | optional: true 1074 | sugarss: 1075 | optional: true 1076 | terser: 1077 | optional: true 1078 | 1079 | vitest@2.1.8: 1080 | resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==} 1081 | engines: {node: ^18.0.0 || >=20.0.0} 1082 | hasBin: true 1083 | peerDependencies: 1084 | '@edge-runtime/vm': '*' 1085 | '@types/node': ^18.0.0 || >=20.0.0 1086 | '@vitest/browser': 2.1.8 1087 | '@vitest/ui': 2.1.8 1088 | happy-dom: '*' 1089 | jsdom: '*' 1090 | peerDependenciesMeta: 1091 | '@edge-runtime/vm': 1092 | optional: true 1093 | '@types/node': 1094 | optional: true 1095 | '@vitest/browser': 1096 | optional: true 1097 | '@vitest/ui': 1098 | optional: true 1099 | happy-dom: 1100 | optional: true 1101 | jsdom: 1102 | optional: true 1103 | 1104 | which@2.0.2: 1105 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1106 | engines: {node: '>= 8'} 1107 | hasBin: true 1108 | 1109 | why-is-node-running@2.3.0: 1110 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1111 | engines: {node: '>=8'} 1112 | hasBin: true 1113 | 1114 | word-wrap@1.2.5: 1115 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1116 | engines: {node: '>=0.10.0'} 1117 | 1118 | yocto-queue@0.1.0: 1119 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1120 | engines: {node: '>=10'} 1121 | 1122 | snapshots: 1123 | 1124 | '@esbuild/aix-ppc64@0.21.5': 1125 | optional: true 1126 | 1127 | '@esbuild/aix-ppc64@0.24.2': 1128 | optional: true 1129 | 1130 | '@esbuild/android-arm64@0.21.5': 1131 | optional: true 1132 | 1133 | '@esbuild/android-arm64@0.24.2': 1134 | optional: true 1135 | 1136 | '@esbuild/android-arm@0.21.5': 1137 | optional: true 1138 | 1139 | '@esbuild/android-arm@0.24.2': 1140 | optional: true 1141 | 1142 | '@esbuild/android-x64@0.21.5': 1143 | optional: true 1144 | 1145 | '@esbuild/android-x64@0.24.2': 1146 | optional: true 1147 | 1148 | '@esbuild/darwin-arm64@0.21.5': 1149 | optional: true 1150 | 1151 | '@esbuild/darwin-arm64@0.24.2': 1152 | optional: true 1153 | 1154 | '@esbuild/darwin-x64@0.21.5': 1155 | optional: true 1156 | 1157 | '@esbuild/darwin-x64@0.24.2': 1158 | optional: true 1159 | 1160 | '@esbuild/freebsd-arm64@0.21.5': 1161 | optional: true 1162 | 1163 | '@esbuild/freebsd-arm64@0.24.2': 1164 | optional: true 1165 | 1166 | '@esbuild/freebsd-x64@0.21.5': 1167 | optional: true 1168 | 1169 | '@esbuild/freebsd-x64@0.24.2': 1170 | optional: true 1171 | 1172 | '@esbuild/linux-arm64@0.21.5': 1173 | optional: true 1174 | 1175 | '@esbuild/linux-arm64@0.24.2': 1176 | optional: true 1177 | 1178 | '@esbuild/linux-arm@0.21.5': 1179 | optional: true 1180 | 1181 | '@esbuild/linux-arm@0.24.2': 1182 | optional: true 1183 | 1184 | '@esbuild/linux-ia32@0.21.5': 1185 | optional: true 1186 | 1187 | '@esbuild/linux-ia32@0.24.2': 1188 | optional: true 1189 | 1190 | '@esbuild/linux-loong64@0.21.5': 1191 | optional: true 1192 | 1193 | '@esbuild/linux-loong64@0.24.2': 1194 | optional: true 1195 | 1196 | '@esbuild/linux-mips64el@0.21.5': 1197 | optional: true 1198 | 1199 | '@esbuild/linux-mips64el@0.24.2': 1200 | optional: true 1201 | 1202 | '@esbuild/linux-ppc64@0.21.5': 1203 | optional: true 1204 | 1205 | '@esbuild/linux-ppc64@0.24.2': 1206 | optional: true 1207 | 1208 | '@esbuild/linux-riscv64@0.21.5': 1209 | optional: true 1210 | 1211 | '@esbuild/linux-riscv64@0.24.2': 1212 | optional: true 1213 | 1214 | '@esbuild/linux-s390x@0.21.5': 1215 | optional: true 1216 | 1217 | '@esbuild/linux-s390x@0.24.2': 1218 | optional: true 1219 | 1220 | '@esbuild/linux-x64@0.21.5': 1221 | optional: true 1222 | 1223 | '@esbuild/linux-x64@0.24.2': 1224 | optional: true 1225 | 1226 | '@esbuild/netbsd-arm64@0.24.2': 1227 | optional: true 1228 | 1229 | '@esbuild/netbsd-x64@0.21.5': 1230 | optional: true 1231 | 1232 | '@esbuild/netbsd-x64@0.24.2': 1233 | optional: true 1234 | 1235 | '@esbuild/openbsd-arm64@0.24.2': 1236 | optional: true 1237 | 1238 | '@esbuild/openbsd-x64@0.21.5': 1239 | optional: true 1240 | 1241 | '@esbuild/openbsd-x64@0.24.2': 1242 | optional: true 1243 | 1244 | '@esbuild/sunos-x64@0.21.5': 1245 | optional: true 1246 | 1247 | '@esbuild/sunos-x64@0.24.2': 1248 | optional: true 1249 | 1250 | '@esbuild/win32-arm64@0.21.5': 1251 | optional: true 1252 | 1253 | '@esbuild/win32-arm64@0.24.2': 1254 | optional: true 1255 | 1256 | '@esbuild/win32-ia32@0.21.5': 1257 | optional: true 1258 | 1259 | '@esbuild/win32-ia32@0.24.2': 1260 | optional: true 1261 | 1262 | '@esbuild/win32-x64@0.21.5': 1263 | optional: true 1264 | 1265 | '@esbuild/win32-x64@0.24.2': 1266 | optional: true 1267 | 1268 | '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': 1269 | dependencies: 1270 | eslint: 9.17.0 1271 | eslint-visitor-keys: 3.4.3 1272 | 1273 | '@eslint-community/regexpp@4.12.1': {} 1274 | 1275 | '@eslint/config-array@0.19.1': 1276 | dependencies: 1277 | '@eslint/object-schema': 2.1.5 1278 | debug: 4.4.0 1279 | minimatch: 3.1.2 1280 | transitivePeerDependencies: 1281 | - supports-color 1282 | 1283 | '@eslint/core@0.9.1': 1284 | dependencies: 1285 | '@types/json-schema': 7.0.15 1286 | 1287 | '@eslint/eslintrc@3.2.0': 1288 | dependencies: 1289 | ajv: 6.12.6 1290 | debug: 4.4.0 1291 | espree: 10.3.0 1292 | globals: 14.0.0 1293 | ignore: 5.3.2 1294 | import-fresh: 3.3.0 1295 | js-yaml: 4.1.0 1296 | minimatch: 3.1.2 1297 | strip-json-comments: 3.1.1 1298 | transitivePeerDependencies: 1299 | - supports-color 1300 | 1301 | '@eslint/js@9.17.0': {} 1302 | 1303 | '@eslint/object-schema@2.1.5': {} 1304 | 1305 | '@eslint/plugin-kit@0.2.4': 1306 | dependencies: 1307 | levn: 0.4.1 1308 | 1309 | '@humanfs/core@0.19.1': {} 1310 | 1311 | '@humanfs/node@0.16.6': 1312 | dependencies: 1313 | '@humanfs/core': 0.19.1 1314 | '@humanwhocodes/retry': 0.3.1 1315 | 1316 | '@humanwhocodes/module-importer@1.0.1': {} 1317 | 1318 | '@humanwhocodes/retry@0.3.1': {} 1319 | 1320 | '@humanwhocodes/retry@0.4.1': {} 1321 | 1322 | '@jridgewell/sourcemap-codec@1.5.0': {} 1323 | 1324 | '@nodelib/fs.scandir@2.1.5': 1325 | dependencies: 1326 | '@nodelib/fs.stat': 2.0.5 1327 | run-parallel: 1.2.0 1328 | 1329 | '@nodelib/fs.stat@2.0.5': {} 1330 | 1331 | '@nodelib/fs.walk@1.2.8': 1332 | dependencies: 1333 | '@nodelib/fs.scandir': 2.1.5 1334 | fastq: 1.18.0 1335 | 1336 | '@rollup/rollup-android-arm-eabi@4.29.2': 1337 | optional: true 1338 | 1339 | '@rollup/rollup-android-arm64@4.29.2': 1340 | optional: true 1341 | 1342 | '@rollup/rollup-darwin-arm64@4.29.2': 1343 | optional: true 1344 | 1345 | '@rollup/rollup-darwin-x64@4.29.2': 1346 | optional: true 1347 | 1348 | '@rollup/rollup-freebsd-arm64@4.29.2': 1349 | optional: true 1350 | 1351 | '@rollup/rollup-freebsd-x64@4.29.2': 1352 | optional: true 1353 | 1354 | '@rollup/rollup-linux-arm-gnueabihf@4.29.2': 1355 | optional: true 1356 | 1357 | '@rollup/rollup-linux-arm-musleabihf@4.29.2': 1358 | optional: true 1359 | 1360 | '@rollup/rollup-linux-arm64-gnu@4.29.2': 1361 | optional: true 1362 | 1363 | '@rollup/rollup-linux-arm64-musl@4.29.2': 1364 | optional: true 1365 | 1366 | '@rollup/rollup-linux-loongarch64-gnu@4.29.2': 1367 | optional: true 1368 | 1369 | '@rollup/rollup-linux-powerpc64le-gnu@4.29.2': 1370 | optional: true 1371 | 1372 | '@rollup/rollup-linux-riscv64-gnu@4.29.2': 1373 | optional: true 1374 | 1375 | '@rollup/rollup-linux-s390x-gnu@4.29.2': 1376 | optional: true 1377 | 1378 | '@rollup/rollup-linux-x64-gnu@4.29.2': 1379 | optional: true 1380 | 1381 | '@rollup/rollup-linux-x64-musl@4.29.2': 1382 | optional: true 1383 | 1384 | '@rollup/rollup-win32-arm64-msvc@4.29.2': 1385 | optional: true 1386 | 1387 | '@rollup/rollup-win32-ia32-msvc@4.29.2': 1388 | optional: true 1389 | 1390 | '@rollup/rollup-win32-x64-msvc@4.29.2': 1391 | optional: true 1392 | 1393 | '@types/estree@1.0.6': {} 1394 | 1395 | '@types/json-schema@7.0.15': {} 1396 | 1397 | '@types/node@22.10.3': 1398 | dependencies: 1399 | undici-types: 6.20.0 1400 | optional: true 1401 | 1402 | '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2)': 1403 | dependencies: 1404 | '@eslint-community/regexpp': 4.12.1 1405 | '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1406 | '@typescript-eslint/scope-manager': 8.19.0 1407 | '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1408 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1409 | '@typescript-eslint/visitor-keys': 8.19.0 1410 | eslint: 9.17.0 1411 | graphemer: 1.4.0 1412 | ignore: 5.3.2 1413 | natural-compare: 1.4.0 1414 | ts-api-utils: 1.4.3(typescript@5.7.2) 1415 | typescript: 5.7.2 1416 | transitivePeerDependencies: 1417 | - supports-color 1418 | 1419 | '@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2)': 1420 | dependencies: 1421 | '@typescript-eslint/scope-manager': 8.19.0 1422 | '@typescript-eslint/types': 8.19.0 1423 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) 1424 | '@typescript-eslint/visitor-keys': 8.19.0 1425 | debug: 4.4.0 1426 | eslint: 9.17.0 1427 | typescript: 5.7.2 1428 | transitivePeerDependencies: 1429 | - supports-color 1430 | 1431 | '@typescript-eslint/scope-manager@8.19.0': 1432 | dependencies: 1433 | '@typescript-eslint/types': 8.19.0 1434 | '@typescript-eslint/visitor-keys': 8.19.0 1435 | 1436 | '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': 1437 | dependencies: 1438 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) 1439 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1440 | debug: 4.4.0 1441 | eslint: 9.17.0 1442 | ts-api-utils: 1.4.3(typescript@5.7.2) 1443 | typescript: 5.7.2 1444 | transitivePeerDependencies: 1445 | - supports-color 1446 | 1447 | '@typescript-eslint/types@8.19.0': {} 1448 | 1449 | '@typescript-eslint/typescript-estree@8.19.0(typescript@5.7.2)': 1450 | dependencies: 1451 | '@typescript-eslint/types': 8.19.0 1452 | '@typescript-eslint/visitor-keys': 8.19.0 1453 | debug: 4.4.0 1454 | fast-glob: 3.3.2 1455 | is-glob: 4.0.3 1456 | minimatch: 9.0.5 1457 | semver: 7.6.3 1458 | ts-api-utils: 1.4.3(typescript@5.7.2) 1459 | typescript: 5.7.2 1460 | transitivePeerDependencies: 1461 | - supports-color 1462 | 1463 | '@typescript-eslint/utils@8.19.0(eslint@9.17.0)(typescript@5.7.2)': 1464 | dependencies: 1465 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) 1466 | '@typescript-eslint/scope-manager': 8.19.0 1467 | '@typescript-eslint/types': 8.19.0 1468 | '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.7.2) 1469 | eslint: 9.17.0 1470 | typescript: 5.7.2 1471 | transitivePeerDependencies: 1472 | - supports-color 1473 | 1474 | '@typescript-eslint/visitor-keys@8.19.0': 1475 | dependencies: 1476 | '@typescript-eslint/types': 8.19.0 1477 | eslint-visitor-keys: 4.2.0 1478 | 1479 | '@vitest/expect@2.1.8': 1480 | dependencies: 1481 | '@vitest/spy': 2.1.8 1482 | '@vitest/utils': 2.1.8 1483 | chai: 5.1.2 1484 | tinyrainbow: 1.2.0 1485 | 1486 | '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.3))': 1487 | dependencies: 1488 | '@vitest/spy': 2.1.8 1489 | estree-walker: 3.0.3 1490 | magic-string: 0.30.17 1491 | optionalDependencies: 1492 | vite: 5.4.11(@types/node@22.10.3) 1493 | 1494 | '@vitest/pretty-format@2.1.8': 1495 | dependencies: 1496 | tinyrainbow: 1.2.0 1497 | 1498 | '@vitest/runner@2.1.8': 1499 | dependencies: 1500 | '@vitest/utils': 2.1.8 1501 | pathe: 1.1.2 1502 | 1503 | '@vitest/snapshot@2.1.8': 1504 | dependencies: 1505 | '@vitest/pretty-format': 2.1.8 1506 | magic-string: 0.30.17 1507 | pathe: 1.1.2 1508 | 1509 | '@vitest/spy@2.1.8': 1510 | dependencies: 1511 | tinyspy: 3.0.2 1512 | 1513 | '@vitest/utils@2.1.8': 1514 | dependencies: 1515 | '@vitest/pretty-format': 2.1.8 1516 | loupe: 3.1.2 1517 | tinyrainbow: 1.2.0 1518 | 1519 | acorn-jsx@5.3.2(acorn@8.14.0): 1520 | dependencies: 1521 | acorn: 8.14.0 1522 | 1523 | acorn@8.14.0: {} 1524 | 1525 | ajv@6.12.6: 1526 | dependencies: 1527 | fast-deep-equal: 3.1.3 1528 | fast-json-stable-stringify: 2.1.0 1529 | json-schema-traverse: 0.4.1 1530 | uri-js: 4.4.1 1531 | 1532 | ansi-styles@4.3.0: 1533 | dependencies: 1534 | color-convert: 2.0.1 1535 | 1536 | argparse@2.0.1: {} 1537 | 1538 | assertion-error@2.0.1: {} 1539 | 1540 | balanced-match@1.0.2: {} 1541 | 1542 | brace-expansion@1.1.11: 1543 | dependencies: 1544 | balanced-match: 1.0.2 1545 | concat-map: 0.0.1 1546 | 1547 | brace-expansion@2.0.1: 1548 | dependencies: 1549 | balanced-match: 1.0.2 1550 | 1551 | braces@3.0.3: 1552 | dependencies: 1553 | fill-range: 7.1.1 1554 | 1555 | cac@6.7.14: {} 1556 | 1557 | callsites@3.1.0: {} 1558 | 1559 | chai@5.1.2: 1560 | dependencies: 1561 | assertion-error: 2.0.1 1562 | check-error: 2.1.1 1563 | deep-eql: 5.0.2 1564 | loupe: 3.1.2 1565 | pathval: 2.0.0 1566 | 1567 | chalk@4.1.2: 1568 | dependencies: 1569 | ansi-styles: 4.3.0 1570 | supports-color: 7.2.0 1571 | 1572 | check-error@2.1.1: {} 1573 | 1574 | color-convert@2.0.1: 1575 | dependencies: 1576 | color-name: 1.1.4 1577 | 1578 | color-name@1.1.4: {} 1579 | 1580 | concat-map@0.0.1: {} 1581 | 1582 | cross-spawn@7.0.6: 1583 | dependencies: 1584 | path-key: 3.1.1 1585 | shebang-command: 2.0.0 1586 | which: 2.0.2 1587 | 1588 | debug@4.4.0: 1589 | dependencies: 1590 | ms: 2.1.3 1591 | 1592 | deep-eql@5.0.2: {} 1593 | 1594 | deep-is@0.1.4: {} 1595 | 1596 | es-module-lexer@1.6.0: {} 1597 | 1598 | esbuild@0.21.5: 1599 | optionalDependencies: 1600 | '@esbuild/aix-ppc64': 0.21.5 1601 | '@esbuild/android-arm': 0.21.5 1602 | '@esbuild/android-arm64': 0.21.5 1603 | '@esbuild/android-x64': 0.21.5 1604 | '@esbuild/darwin-arm64': 0.21.5 1605 | '@esbuild/darwin-x64': 0.21.5 1606 | '@esbuild/freebsd-arm64': 0.21.5 1607 | '@esbuild/freebsd-x64': 0.21.5 1608 | '@esbuild/linux-arm': 0.21.5 1609 | '@esbuild/linux-arm64': 0.21.5 1610 | '@esbuild/linux-ia32': 0.21.5 1611 | '@esbuild/linux-loong64': 0.21.5 1612 | '@esbuild/linux-mips64el': 0.21.5 1613 | '@esbuild/linux-ppc64': 0.21.5 1614 | '@esbuild/linux-riscv64': 0.21.5 1615 | '@esbuild/linux-s390x': 0.21.5 1616 | '@esbuild/linux-x64': 0.21.5 1617 | '@esbuild/netbsd-x64': 0.21.5 1618 | '@esbuild/openbsd-x64': 0.21.5 1619 | '@esbuild/sunos-x64': 0.21.5 1620 | '@esbuild/win32-arm64': 0.21.5 1621 | '@esbuild/win32-ia32': 0.21.5 1622 | '@esbuild/win32-x64': 0.21.5 1623 | 1624 | esbuild@0.24.2: 1625 | optionalDependencies: 1626 | '@esbuild/aix-ppc64': 0.24.2 1627 | '@esbuild/android-arm': 0.24.2 1628 | '@esbuild/android-arm64': 0.24.2 1629 | '@esbuild/android-x64': 0.24.2 1630 | '@esbuild/darwin-arm64': 0.24.2 1631 | '@esbuild/darwin-x64': 0.24.2 1632 | '@esbuild/freebsd-arm64': 0.24.2 1633 | '@esbuild/freebsd-x64': 0.24.2 1634 | '@esbuild/linux-arm': 0.24.2 1635 | '@esbuild/linux-arm64': 0.24.2 1636 | '@esbuild/linux-ia32': 0.24.2 1637 | '@esbuild/linux-loong64': 0.24.2 1638 | '@esbuild/linux-mips64el': 0.24.2 1639 | '@esbuild/linux-ppc64': 0.24.2 1640 | '@esbuild/linux-riscv64': 0.24.2 1641 | '@esbuild/linux-s390x': 0.24.2 1642 | '@esbuild/linux-x64': 0.24.2 1643 | '@esbuild/netbsd-arm64': 0.24.2 1644 | '@esbuild/netbsd-x64': 0.24.2 1645 | '@esbuild/openbsd-arm64': 0.24.2 1646 | '@esbuild/openbsd-x64': 0.24.2 1647 | '@esbuild/sunos-x64': 0.24.2 1648 | '@esbuild/win32-arm64': 0.24.2 1649 | '@esbuild/win32-ia32': 0.24.2 1650 | '@esbuild/win32-x64': 0.24.2 1651 | 1652 | escape-string-regexp@4.0.0: {} 1653 | 1654 | eslint-config-prettier@9.1.0(eslint@9.17.0): 1655 | dependencies: 1656 | eslint: 9.17.0 1657 | 1658 | eslint-scope@8.2.0: 1659 | dependencies: 1660 | esrecurse: 4.3.0 1661 | estraverse: 5.3.0 1662 | 1663 | eslint-visitor-keys@3.4.3: {} 1664 | 1665 | eslint-visitor-keys@4.2.0: {} 1666 | 1667 | eslint@9.17.0: 1668 | dependencies: 1669 | '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) 1670 | '@eslint-community/regexpp': 4.12.1 1671 | '@eslint/config-array': 0.19.1 1672 | '@eslint/core': 0.9.1 1673 | '@eslint/eslintrc': 3.2.0 1674 | '@eslint/js': 9.17.0 1675 | '@eslint/plugin-kit': 0.2.4 1676 | '@humanfs/node': 0.16.6 1677 | '@humanwhocodes/module-importer': 1.0.1 1678 | '@humanwhocodes/retry': 0.4.1 1679 | '@types/estree': 1.0.6 1680 | '@types/json-schema': 7.0.15 1681 | ajv: 6.12.6 1682 | chalk: 4.1.2 1683 | cross-spawn: 7.0.6 1684 | debug: 4.4.0 1685 | escape-string-regexp: 4.0.0 1686 | eslint-scope: 8.2.0 1687 | eslint-visitor-keys: 4.2.0 1688 | espree: 10.3.0 1689 | esquery: 1.6.0 1690 | esutils: 2.0.3 1691 | fast-deep-equal: 3.1.3 1692 | file-entry-cache: 8.0.0 1693 | find-up: 5.0.0 1694 | glob-parent: 6.0.2 1695 | ignore: 5.3.2 1696 | imurmurhash: 0.1.4 1697 | is-glob: 4.0.3 1698 | json-stable-stringify-without-jsonify: 1.0.1 1699 | lodash.merge: 4.6.2 1700 | minimatch: 3.1.2 1701 | natural-compare: 1.4.0 1702 | optionator: 0.9.4 1703 | transitivePeerDependencies: 1704 | - supports-color 1705 | 1706 | espree@10.3.0: 1707 | dependencies: 1708 | acorn: 8.14.0 1709 | acorn-jsx: 5.3.2(acorn@8.14.0) 1710 | eslint-visitor-keys: 4.2.0 1711 | 1712 | esquery@1.6.0: 1713 | dependencies: 1714 | estraverse: 5.3.0 1715 | 1716 | esrecurse@4.3.0: 1717 | dependencies: 1718 | estraverse: 5.3.0 1719 | 1720 | estraverse@5.3.0: {} 1721 | 1722 | estree-walker@3.0.3: 1723 | dependencies: 1724 | '@types/estree': 1.0.6 1725 | 1726 | esutils@2.0.3: {} 1727 | 1728 | expect-type@1.1.0: {} 1729 | 1730 | fast-deep-equal@3.1.3: {} 1731 | 1732 | fast-glob@3.3.2: 1733 | dependencies: 1734 | '@nodelib/fs.stat': 2.0.5 1735 | '@nodelib/fs.walk': 1.2.8 1736 | glob-parent: 5.1.2 1737 | merge2: 1.4.1 1738 | micromatch: 4.0.8 1739 | 1740 | fast-json-stable-stringify@2.1.0: {} 1741 | 1742 | fast-levenshtein@2.0.6: {} 1743 | 1744 | fastq@1.18.0: 1745 | dependencies: 1746 | reusify: 1.0.4 1747 | 1748 | file-entry-cache@8.0.0: 1749 | dependencies: 1750 | flat-cache: 4.0.1 1751 | 1752 | fill-range@7.1.1: 1753 | dependencies: 1754 | to-regex-range: 5.0.1 1755 | 1756 | find-up@5.0.0: 1757 | dependencies: 1758 | locate-path: 6.0.0 1759 | path-exists: 4.0.0 1760 | 1761 | flat-cache@4.0.1: 1762 | dependencies: 1763 | flatted: 3.3.2 1764 | keyv: 4.5.4 1765 | 1766 | flatted@3.3.2: {} 1767 | 1768 | fsevents@2.3.3: 1769 | optional: true 1770 | 1771 | glob-parent@5.1.2: 1772 | dependencies: 1773 | is-glob: 4.0.3 1774 | 1775 | glob-parent@6.0.2: 1776 | dependencies: 1777 | is-glob: 4.0.3 1778 | 1779 | globals@14.0.0: {} 1780 | 1781 | graphemer@1.4.0: {} 1782 | 1783 | has-flag@4.0.0: {} 1784 | 1785 | ignore@5.3.2: {} 1786 | 1787 | import-fresh@3.3.0: 1788 | dependencies: 1789 | parent-module: 1.0.1 1790 | resolve-from: 4.0.0 1791 | 1792 | imurmurhash@0.1.4: {} 1793 | 1794 | is-extglob@2.1.1: {} 1795 | 1796 | is-glob@4.0.3: 1797 | dependencies: 1798 | is-extglob: 2.1.1 1799 | 1800 | is-number@7.0.0: {} 1801 | 1802 | isexe@2.0.0: {} 1803 | 1804 | js-yaml@4.1.0: 1805 | dependencies: 1806 | argparse: 2.0.1 1807 | 1808 | json-buffer@3.0.1: {} 1809 | 1810 | json-schema-traverse@0.4.1: {} 1811 | 1812 | json-stable-stringify-without-jsonify@1.0.1: {} 1813 | 1814 | keyv@4.5.4: 1815 | dependencies: 1816 | json-buffer: 3.0.1 1817 | 1818 | levn@0.4.1: 1819 | dependencies: 1820 | prelude-ls: 1.2.1 1821 | type-check: 0.4.0 1822 | 1823 | locate-path@6.0.0: 1824 | dependencies: 1825 | p-locate: 5.0.0 1826 | 1827 | lodash.merge@4.6.2: {} 1828 | 1829 | loupe@3.1.2: {} 1830 | 1831 | magic-string@0.30.17: 1832 | dependencies: 1833 | '@jridgewell/sourcemap-codec': 1.5.0 1834 | 1835 | merge2@1.4.1: {} 1836 | 1837 | micromatch@4.0.8: 1838 | dependencies: 1839 | braces: 3.0.3 1840 | picomatch: 2.3.1 1841 | 1842 | minimatch@3.1.2: 1843 | dependencies: 1844 | brace-expansion: 1.1.11 1845 | 1846 | minimatch@9.0.5: 1847 | dependencies: 1848 | brace-expansion: 2.0.1 1849 | 1850 | ms@2.1.3: {} 1851 | 1852 | nanoid@3.3.8: {} 1853 | 1854 | natural-compare@1.4.0: {} 1855 | 1856 | optionator@0.9.4: 1857 | dependencies: 1858 | deep-is: 0.1.4 1859 | fast-levenshtein: 2.0.6 1860 | levn: 0.4.1 1861 | prelude-ls: 1.2.1 1862 | type-check: 0.4.0 1863 | word-wrap: 1.2.5 1864 | 1865 | p-limit@3.1.0: 1866 | dependencies: 1867 | yocto-queue: 0.1.0 1868 | 1869 | p-locate@5.0.0: 1870 | dependencies: 1871 | p-limit: 3.1.0 1872 | 1873 | parent-module@1.0.1: 1874 | dependencies: 1875 | callsites: 3.1.0 1876 | 1877 | path-exists@4.0.0: {} 1878 | 1879 | path-key@3.1.1: {} 1880 | 1881 | pathe@1.1.2: {} 1882 | 1883 | pathval@2.0.0: {} 1884 | 1885 | picocolors@1.1.1: {} 1886 | 1887 | picomatch@2.3.1: {} 1888 | 1889 | postcss@8.4.49: 1890 | dependencies: 1891 | nanoid: 3.3.8 1892 | picocolors: 1.1.1 1893 | source-map-js: 1.2.1 1894 | 1895 | prelude-ls@1.2.1: {} 1896 | 1897 | prettier@3.4.2: {} 1898 | 1899 | punycode@2.3.1: {} 1900 | 1901 | queue-microtask@1.2.3: {} 1902 | 1903 | resolve-from@4.0.0: {} 1904 | 1905 | reusify@1.0.4: {} 1906 | 1907 | rollup@4.29.2: 1908 | dependencies: 1909 | '@types/estree': 1.0.6 1910 | optionalDependencies: 1911 | '@rollup/rollup-android-arm-eabi': 4.29.2 1912 | '@rollup/rollup-android-arm64': 4.29.2 1913 | '@rollup/rollup-darwin-arm64': 4.29.2 1914 | '@rollup/rollup-darwin-x64': 4.29.2 1915 | '@rollup/rollup-freebsd-arm64': 4.29.2 1916 | '@rollup/rollup-freebsd-x64': 4.29.2 1917 | '@rollup/rollup-linux-arm-gnueabihf': 4.29.2 1918 | '@rollup/rollup-linux-arm-musleabihf': 4.29.2 1919 | '@rollup/rollup-linux-arm64-gnu': 4.29.2 1920 | '@rollup/rollup-linux-arm64-musl': 4.29.2 1921 | '@rollup/rollup-linux-loongarch64-gnu': 4.29.2 1922 | '@rollup/rollup-linux-powerpc64le-gnu': 4.29.2 1923 | '@rollup/rollup-linux-riscv64-gnu': 4.29.2 1924 | '@rollup/rollup-linux-s390x-gnu': 4.29.2 1925 | '@rollup/rollup-linux-x64-gnu': 4.29.2 1926 | '@rollup/rollup-linux-x64-musl': 4.29.2 1927 | '@rollup/rollup-win32-arm64-msvc': 4.29.2 1928 | '@rollup/rollup-win32-ia32-msvc': 4.29.2 1929 | '@rollup/rollup-win32-x64-msvc': 4.29.2 1930 | fsevents: 2.3.3 1931 | 1932 | run-parallel@1.2.0: 1933 | dependencies: 1934 | queue-microtask: 1.2.3 1935 | 1936 | semver@7.6.3: {} 1937 | 1938 | shebang-command@2.0.0: 1939 | dependencies: 1940 | shebang-regex: 3.0.0 1941 | 1942 | shebang-regex@3.0.0: {} 1943 | 1944 | siginfo@2.0.0: {} 1945 | 1946 | source-map-js@1.2.1: {} 1947 | 1948 | stackback@0.0.2: {} 1949 | 1950 | std-env@3.8.0: {} 1951 | 1952 | strip-json-comments@3.1.1: {} 1953 | 1954 | supports-color@7.2.0: 1955 | dependencies: 1956 | has-flag: 4.0.0 1957 | 1958 | tinybench@2.9.0: {} 1959 | 1960 | tinyexec@0.3.2: {} 1961 | 1962 | tinypool@1.0.2: {} 1963 | 1964 | tinyrainbow@1.2.0: {} 1965 | 1966 | tinyspy@3.0.2: {} 1967 | 1968 | to-regex-range@5.0.1: 1969 | dependencies: 1970 | is-number: 7.0.0 1971 | 1972 | ts-api-utils@1.4.3(typescript@5.7.2): 1973 | dependencies: 1974 | typescript: 5.7.2 1975 | 1976 | type-check@0.4.0: 1977 | dependencies: 1978 | prelude-ls: 1.2.1 1979 | 1980 | typescript-eslint@8.19.0(eslint@9.17.0)(typescript@5.7.2): 1981 | dependencies: 1982 | '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@5.7.2))(eslint@9.17.0)(typescript@5.7.2) 1983 | '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1984 | '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@5.7.2) 1985 | eslint: 9.17.0 1986 | typescript: 5.7.2 1987 | transitivePeerDependencies: 1988 | - supports-color 1989 | 1990 | typescript@5.7.2: {} 1991 | 1992 | undici-types@6.20.0: 1993 | optional: true 1994 | 1995 | uri-js@4.4.1: 1996 | dependencies: 1997 | punycode: 2.3.1 1998 | 1999 | vite-node@2.1.8(@types/node@22.10.3): 2000 | dependencies: 2001 | cac: 6.7.14 2002 | debug: 4.4.0 2003 | es-module-lexer: 1.6.0 2004 | pathe: 1.1.2 2005 | vite: 5.4.11(@types/node@22.10.3) 2006 | transitivePeerDependencies: 2007 | - '@types/node' 2008 | - less 2009 | - lightningcss 2010 | - sass 2011 | - sass-embedded 2012 | - stylus 2013 | - sugarss 2014 | - supports-color 2015 | - terser 2016 | 2017 | vite@5.4.11(@types/node@22.10.3): 2018 | dependencies: 2019 | esbuild: 0.21.5 2020 | postcss: 8.4.49 2021 | rollup: 4.29.2 2022 | optionalDependencies: 2023 | '@types/node': 22.10.3 2024 | fsevents: 2.3.3 2025 | 2026 | vitest@2.1.8(@types/node@22.10.3): 2027 | dependencies: 2028 | '@vitest/expect': 2.1.8 2029 | '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.3)) 2030 | '@vitest/pretty-format': 2.1.8 2031 | '@vitest/runner': 2.1.8 2032 | '@vitest/snapshot': 2.1.8 2033 | '@vitest/spy': 2.1.8 2034 | '@vitest/utils': 2.1.8 2035 | chai: 5.1.2 2036 | debug: 4.4.0 2037 | expect-type: 1.1.0 2038 | magic-string: 0.30.17 2039 | pathe: 1.1.2 2040 | std-env: 3.8.0 2041 | tinybench: 2.9.0 2042 | tinyexec: 0.3.2 2043 | tinypool: 1.0.2 2044 | tinyrainbow: 1.2.0 2045 | vite: 5.4.11(@types/node@22.10.3) 2046 | vite-node: 2.1.8(@types/node@22.10.3) 2047 | why-is-node-running: 2.3.0 2048 | optionalDependencies: 2049 | '@types/node': 22.10.3 2050 | transitivePeerDependencies: 2051 | - less 2052 | - lightningcss 2053 | - msw 2054 | - sass 2055 | - sass-embedded 2056 | - stylus 2057 | - sugarss 2058 | - supports-color 2059 | - terser 2060 | 2061 | which@2.0.2: 2062 | dependencies: 2063 | isexe: 2.0.0 2064 | 2065 | why-is-node-running@2.3.0: 2066 | dependencies: 2067 | siginfo: 2.0.0 2068 | stackback: 0.0.2 2069 | 2070 | word-wrap@1.2.5: {} 2071 | 2072 | yocto-queue@0.1.0: {} 2073 | --------------------------------------------------------------------------------