├── .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 |
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 | [](https://github.com/roberthgnz/lsdb/actions/workflows/main.yml)
4 | [](https://github.com/roberthgnz/lsdb/issues)
5 | [](https://github.com/roberthgnz/lsdb)
6 | [](https://github.com/roberthgnz/lsdb)
7 | [](#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 |
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 |
--------------------------------------------------------------------------------