├── src ├── constants.ts ├── browser.ts ├── node.ts ├── utils │ ├── fs-extra.ts │ ├── object.ts │ ├── util.test.ts │ └── file-writer.ts ├── ttl.ts ├── parser │ ├── msg-pack.ts │ ├── json-map.ts │ └── parser.test.ts ├── index.ts ├── hash-map.test.ts ├── hash-map.ts ├── driver │ ├── memory.ts │ ├── browser.ts │ ├── fs.test.ts │ ├── fs.ts │ └── memory.test.ts ├── list.test.ts ├── list.ts ├── client.test.ts ├── typings.ts └── client.ts ├── tests └── utils.ts ├── renovate.json ├── .prettierignore ├── tsup.config.ts ├── .changeset ├── config.json └── README.md ├── vitest.config.ts ├── tsconfig.json ├── .eslintrc.json ├── docs ├── driver-browser.md ├── driver-fs.md └── driver-memory.md ├── .prettierrc ├── LICENSE ├── .github └── workflows │ ├── release.yml │ └── ci.yml ├── CHANGELOG.md ├── README.md ├── package.json ├── .gitignore └── pnpm-lock.yaml /src/constants.ts: -------------------------------------------------------------------------------- 1 | export const TTL_LIST_KEY = '__TTL_LIST-DONT_USE__'; 2 | -------------------------------------------------------------------------------- /src/browser.ts: -------------------------------------------------------------------------------- 1 | export { default as BrowserDriver } from './driver/browser'; 2 | -------------------------------------------------------------------------------- /src/node.ts: -------------------------------------------------------------------------------- 1 | export { default as FsDriver } from './driver/fs'; 2 | export type { FsOptions } from './driver/fs'; 3 | -------------------------------------------------------------------------------- /tests/utils.ts: -------------------------------------------------------------------------------- 1 | export async function sleep(ms: number) { 2 | return new Promise((resolve) => setTimeout(resolve, ms)); 3 | } 4 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["config:recommended"] 4 | } 5 | -------------------------------------------------------------------------------- /src/utils/fs-extra.ts: -------------------------------------------------------------------------------- 1 | import { accessSync, type PathLike } from 'node:fs'; 2 | 3 | export function access(path: PathLike) { 4 | try { 5 | accessSync(path); 6 | return true; 7 | } catch { 8 | return false; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | dist 5 | tests/output 6 | /.svelte-kit 7 | /package 8 | .env 9 | .env.* 10 | !.env.example 11 | 12 | # Ignore files for PNPM, NPM and YARN 13 | pnpm-lock.yaml 14 | /.changeset 15 | package-lock.json 16 | yarn.lock 17 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig([ 4 | { 5 | clean: true, 6 | dts: true, 7 | minify: true, 8 | entry: ['src/index.ts', 'src/node.ts', 'src/browser.ts'], 9 | format: ['cjs', 'esm'], 10 | target: 'esnext', 11 | outDir: 'dist', 12 | }, 13 | ]); 14 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "canary", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { resolve } from 'node:path'; 2 | import { defineConfig } from 'vitest/config'; 3 | 4 | export default defineConfig({ 5 | test: { 6 | environment: 'node', 7 | testTimeout: 20000, 8 | globals: true, 9 | }, 10 | resolve: { 11 | alias: { 12 | '@/tests': resolve(__dirname, 'tests'), 13 | '@': resolve(__dirname, 'src'), 14 | }, 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /src/ttl.ts: -------------------------------------------------------------------------------- 1 | import type { HashField } from '@/typings'; 2 | 3 | export type TTL = { 4 | type: 'key' | 'list' | 'hash'; 5 | dat: number; 6 | } & ( 7 | | { 8 | type: 'key'; 9 | } 10 | | { 11 | type: 'list'; 12 | index: number; 13 | } 14 | | { 15 | type: 'hash'; 16 | field: HashField; 17 | } 18 | ); 19 | 20 | export type SerializedTTL = { key: HashField } & TTL; 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@sindresorhus/tsconfig", 4 | "compilerOptions": { 5 | "moduleResolution": "node", 6 | "module": "ESNext", 7 | "allowSyntheticDefaultImports": true, 8 | "baseUrl": ".", 9 | "paths": { 10 | "@/*": ["./src/*"], 11 | "@/tests/*": ["./tests/*"] 12 | }, 13 | "outDir": "dist" 14 | }, 15 | "include": ["**/*.ts"], 16 | "exclude": ["node_modules", "dist", "docs"] 17 | } 18 | -------------------------------------------------------------------------------- /src/parser/msg-pack.ts: -------------------------------------------------------------------------------- 1 | import { default as _MSGPack } from '@se-oss/msgpack'; 2 | 3 | import type { Serializable } from '@/typings'; 4 | import { toMap, toPlainObject } from '@/utils/object'; 5 | 6 | export class MSGPack { 7 | public static parse(data: any): Map { 8 | const decoded = _MSGPack.parse(data) as object; 9 | return toMap(decoded); 10 | } 11 | 12 | public static stringify(data: any): string { 13 | return _MSGPack.stringify(toPlainObject(data)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/eslintrc.json", 3 | "env": { 4 | "es2021": true, 5 | "node": true 6 | }, 7 | "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended"], 8 | "parserOptions": { 9 | "ecmaVersion": "latest", 10 | "sourceType": "module" 11 | }, 12 | "rules": { 13 | "no-console": "error", 14 | "@typescript-eslint/semi": "off", 15 | "@typescript-eslint/no-explicit-any": "off" 16 | }, 17 | "ignorePatterns": ["dist"] 18 | } 19 | -------------------------------------------------------------------------------- /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /docs/driver-browser.md: -------------------------------------------------------------------------------- 1 | # Browser Storage 2 | 3 | On this page, you can find details of using the browser-based storages. 4 | 5 | ## 1. Store a value with expiration time on the local storage 6 | 7 | ```typescript 8 | import { Client } from 'storage-box'; 9 | import { BrowserDriver } from 'storage-box/browser'; 10 | 11 | const driver = new BrowserDriver('local'); 12 | const client = new Client(driver); 13 | 14 | client.setex('key', 'value', 5); 15 | 16 | const value = client.get('key'); 17 | 18 | console.log(value); 19 | setTimeout(() => { 20 | console.log(client.get('key')); // undefined 21 | }, 5000); 22 | ``` 23 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/prettierrc", 3 | "useTabs": false, 4 | "semi": true, 5 | "singleQuote": true, 6 | "trailingComma": "es5", 7 | "endOfLine": "lf", 8 | "printWidth": 100, 9 | "overrides": [ 10 | { 11 | "files": "*.md", 12 | "options": { 13 | "tabWidth": 2, 14 | "useTabs": false, 15 | "printWidth": 79 16 | } 17 | } 18 | ], 19 | "importOrder": [ 20 | "", 21 | "", 22 | "^types$", 23 | "^@/(.*)$", 24 | "^@/tests/(.*)$", 25 | "", 26 | "^[./]" 27 | ], 28 | "plugins": ["@ianvs/prettier-plugin-sort-imports"] 29 | } 30 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Client } from './client'; 2 | export { HashMap } from './hash-map'; 3 | export { List } from './list'; 4 | 5 | // ----------- 6 | 7 | export { default as MemoryDriver } from './driver/memory'; 8 | export { default as BrowserDriver } from './driver/browser'; 9 | 10 | // ----------- 11 | 12 | export { JsonMap } from '@/parser/json-map'; 13 | export { MSGPack } from '@/parser/msg-pack'; 14 | 15 | // ----------- 16 | 17 | export function isBase64(data: any): boolean { 18 | return ( 19 | typeof data === 'string' && 20 | /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/i.test(data) 21 | ); 22 | } 23 | 24 | export * as ObjectUtil from '@/utils/object'; 25 | 26 | // ----------- 27 | 28 | export type * from '@/typings'; 29 | -------------------------------------------------------------------------------- /src/parser/json-map.ts: -------------------------------------------------------------------------------- 1 | import type { Serializable } from '@/typings'; 2 | import { toMap, toPlainObject } from '@/utils/object'; 3 | 4 | export class JsonMap { 5 | public static parse(data: any): Map { 6 | if (data instanceof Map) { 7 | return data; 8 | } 9 | if (['object', 'string'].indexOf(typeof data) === -1) { 10 | throw new TypeError('data must be an object or a string'); 11 | } 12 | const parsed = typeof data === 'string' ? JSON.parse(data) : data; 13 | return toMap(parsed); 14 | } 15 | 16 | public static stringify(data: any): string { 17 | if (typeof data !== 'object') { 18 | throw new TypeError('data must be an object'); 19 | } 20 | return JSON.stringify(toPlainObject(data)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Shahrad Elahi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Package 2 | 3 | on: 4 | push: 5 | branches: 6 | - canary 7 | 8 | jobs: 9 | release: 10 | if: github.repository == 'shahradelahi/storage-box' 11 | name: Build & Publish Release 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout Repo 15 | uses: actions/checkout@v4 16 | with: 17 | fetch-depth: 0 18 | 19 | - name: Use PNPM v8 20 | uses: pnpm/action-setup@v2 21 | with: 22 | version: 8 23 | 24 | - name: Use Node v18 25 | uses: actions/setup-node@v4 26 | with: 27 | node-version: 18 28 | cache: pnpm 29 | 30 | - name: Install dependencies 31 | run: pnpm install 32 | 33 | - name: Create Release Pull Request or Publish 34 | id: changesets 35 | uses: changesets/action@v1 36 | with: 37 | commit: 'chore(release): version package' 38 | title: 'chore(release): version package' 39 | publish: pnpm ci:publish 40 | env: 41 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 42 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 43 | -------------------------------------------------------------------------------- /src/utils/object.ts: -------------------------------------------------------------------------------- 1 | export function toMap( 2 | object: Record | object 3 | ): Map { 4 | const map = new Map(); 5 | Object.entries(object).forEach(([key, value]) => { 6 | map.set(key, value); 7 | }); 8 | return map; 9 | } 10 | 11 | export function fromMap(map: Map): Record { 12 | const record = {} as Record; 13 | map.forEach((value, key) => { 14 | record[key] = value; 15 | }); 16 | return record; 17 | } 18 | 19 | export function removeUndefined(obj: T): T { 20 | const result = {} as T; 21 | for (const key in obj) { 22 | const value = obj[key]; 23 | if (value !== undefined) { 24 | result[key] = value; 25 | } 26 | } 27 | return result; 28 | } 29 | 30 | export function toPlainObject(obj: T): T { 31 | const newObj = {} as T; 32 | if (typeof obj !== 'object') { 33 | throw new TypeError('Cannot convert ' + typeof obj + ' to object'); 34 | } 35 | 36 | if (obj instanceof Map) { 37 | return fromMap(obj); 38 | } 39 | 40 | for (const [key, value] of Object.entries(obj)) { 41 | Object.defineProperty(newObj, key, { 42 | value, 43 | enumerable: true, 44 | configurable: true, 45 | }); 46 | } 47 | 48 | return newObj; 49 | } 50 | -------------------------------------------------------------------------------- /src/hash-map.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { Client } from '@/client'; 4 | import { HashMap } from '@/hash-map'; 5 | import { JsonObject } from '@/typings'; 6 | 7 | interface CuteUser extends JsonObject { 8 | first: string; 9 | last: string; 10 | } 11 | 12 | class CuteMap extends HashMap { 13 | addUser(user: CuteUser) { 14 | const randId = Math.random().toString(36).slice(2); 15 | this.set(randId, user); 16 | } 17 | 18 | initials(): string[] { 19 | const all = this.getall(); 20 | return Object.values(all).map((u) => `${u.first[0]}${u.last[0]}`); 21 | } 22 | } 23 | 24 | const c = new Client(); 25 | 26 | describe('HashMap', () => { 27 | it('Baseless', () => { 28 | interface Vertex extends JsonObject { 29 | x: number; 30 | y: number; 31 | } 32 | 33 | const hash = c.createHashMap(); 34 | 35 | expect(hash).to.be.instanceOf(HashMap); 36 | }); 37 | 38 | describe('CuteMap', () => { 39 | it('get initials', () => { 40 | const cuties = c.createHashMap('CuteHub', CuteMap); 41 | 42 | cuties.addUser({ first: 'Mary', last: 'Jane' }); 43 | cuties.addUser({ first: 'Peter', last: 'Parker' }); 44 | 45 | const initials = cuties.initials(); 46 | 47 | expect(initials).to.have.members(['MJ', 'PP']); 48 | }); 49 | }); 50 | }); 51 | -------------------------------------------------------------------------------- /src/hash-map.ts: -------------------------------------------------------------------------------- 1 | import { Client } from '@/client'; 2 | import type { HashField, HashRecord, HashValue, KVOperations } from '@/typings'; 3 | 4 | export class HashMap 5 | implements KVOperations 6 | { 7 | constructor( 8 | private readonly _client: Client, 9 | private readonly _key: string 10 | ) {} 11 | 12 | get(key: Key): Value | null { 13 | return this._client.hget(this._key, key) as any; 14 | } 15 | 16 | set(key: Key, value: Value): void { 17 | return this._client.hset(this._key, key, value); 18 | } 19 | 20 | setex(key: Key, value: Value, seconds: number): void { 21 | return this._client.hsetex(this._key, key, value, seconds); 22 | } 23 | 24 | del(key: Key): void { 25 | return this._client.hdel(this._key, key); 26 | } 27 | 28 | exists(key: Key): boolean { 29 | return this._client.hexists(this._key, key); 30 | } 31 | 32 | has(key: Key): boolean { 33 | return this._client.hexists(this._key, key); 34 | } 35 | 36 | keys(): Key[] { 37 | return this._client.hkeys(this._key) as Key[]; 38 | } 39 | 40 | values(): Value[] { 41 | return this._client.hvalues(this._key) as Value[]; 42 | } 43 | 44 | clear(): void { 45 | return this._client.hclear(this._key); 46 | } 47 | 48 | getall(): HashRecord { 49 | return this._client.hgetall(this._key); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/driver/memory.ts: -------------------------------------------------------------------------------- 1 | import { HashField, HashRecord, HashValue, StorageDriver } from '@/index'; 2 | 3 | export interface MemoryDriverOptions { 4 | initialValue?: HashRecord; 5 | } 6 | 7 | export default class MemoryDriver< 8 | Key extends HashField = HashField, 9 | Value extends HashValue = HashValue, 10 | > implements StorageDriver 11 | { 12 | protected _storage: HashRecord = {} as HashRecord; 13 | 14 | constructor(options: MemoryDriverOptions = {}) { 15 | if (options.initialValue) { 16 | Object.assign(this._storage, options.initialValue); 17 | } 18 | } 19 | 20 | get(key: Key): Value | null { 21 | const hasKey = this.exists(key); 22 | if (!hasKey) { 23 | return null; 24 | } 25 | return this._storage[key]; 26 | } 27 | 28 | set(key: Key, value: Value) { 29 | this._storage[key] = value; 30 | } 31 | 32 | del(key: Key) { 33 | const hasKey = this.exists(key); 34 | if (hasKey) { 35 | delete this._storage[key]; 36 | } 37 | } 38 | 39 | exists(key: Key) { 40 | return key in this._storage; 41 | } 42 | 43 | keys(): Key[] { 44 | return Object.keys(this._storage) as Key[]; 45 | } 46 | 47 | values(): Value[] { 48 | return Object.values(this._storage); 49 | } 50 | 51 | clear() { 52 | this._storage = {} as HashRecord; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /docs/driver-fs.md: -------------------------------------------------------------------------------- 1 | # File-based Storage (fs) 2 | 3 | On this page, you can find a detailed description of how to use file-based driver. 4 | 5 | ### Usage 6 | 7 | ```typescript 8 | import { resovle } from 'node:path'; 9 | import { Client } from 'storage-box'; 10 | import { FsDriver } from 'storage-box/node'; 11 | 12 | const filePath = resovle(process.cwd(), 'data.json'); 13 | const driver = new FsDriver(filePath); 14 | 15 | const client = new Client(driver); 16 | ``` 17 | 18 | ### Serializer / Parser 19 | 20 | ##### JSON 21 | 22 | By default, the `fs` driver uses the `JSON` serializer. So you don't need to pass any option to the `FsDriver` 23 | constructor. 24 | 25 | ##### MessagePack 26 | 27 | One of the benefits of using the `msgpack` serializer is that it is faster and more efficient than the `JSON` 28 | serializer. 29 | 30 | You can check out more info about it [here](https://msgpack.org/). 31 | 32 | ```typescript 33 | import { FsDriver, MSGPack } from 'storage-box'; 34 | 35 | const filePath = resovle(process.cwd(), 'data.b64'); 36 | const driver = new FsDriver(filePath, { parser: MSGPack }); 37 | ``` 38 | 39 | ### Limitations 40 | 41 | The `fs` driver only supports `Node.js` and `Bun` environments. 42 | 43 | If you have large JavaScript objects (`<=6MB`) you may hit some performance issues. This is because whenever make changes 44 | it will write the whole objects to the file. 45 | 46 | If you plan to scale, it's highly recommended to use databases like `PostgreSQL` or `MongoDB` instead. 47 | -------------------------------------------------------------------------------- /src/utils/util.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { isBase64, ObjectUtil } from '@/index'; 4 | 5 | describe('Base64', () => { 6 | it('isBase64', () => { 7 | expect(isBase64('foo')).to.be.false; 8 | expect(isBase64('Zm9v')).to.be.true; 9 | }); 10 | }); 11 | 12 | describe('Object', () => { 13 | it('removeUndefined', () => { 14 | const obj = { 15 | foo: 'bar', 16 | bar: 'baz', 17 | baz: undefined, 18 | }; 19 | const result = ObjectUtil.removeUndefined(obj); 20 | expect(result).to.deep.equal({ 21 | foo: 'bar', 22 | bar: 'baz', 23 | }); 24 | }); 25 | 26 | it('toMap', () => { 27 | const obj = { 28 | foo: 'bar', 29 | bar: 'baz', 30 | baz: undefined, 31 | }; 32 | const result = ObjectUtil.toMap(obj); 33 | expect(result).to.deep.equal(new Map(Object.entries(obj))); 34 | }); 35 | 36 | it('fromMap', () => { 37 | const obj = { 38 | foo: 'bar', 39 | bar: 'baz', 40 | baz: undefined, 41 | }; 42 | const result = ObjectUtil.fromMap(ObjectUtil.toMap(obj)); 43 | expect(result).to.deep.equal(obj); 44 | }); 45 | 46 | it('toPlainObject', () => { 47 | const obj = { 48 | foo: 'bar', 49 | bar: 'baz', 50 | baz: undefined, 51 | }; 52 | const result = ObjectUtil.toPlainObject(obj); 53 | expect(result).to.deep.equal(obj); 54 | 55 | const map = ObjectUtil.toMap(obj); 56 | const result2 = ObjectUtil.toPlainObject(map); 57 | expect(result2).to.deep.equal(obj); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - canary 7 | pull_request: 8 | 9 | concurrency: 10 | group: '${{ github.workflow }}-${{ github.event.number || github.sha }}' 11 | cancel-in-progress: true 12 | 13 | jobs: 14 | format: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | - uses: pnpm/action-setup@v2 19 | with: 20 | version: 8 21 | - uses: actions/setup-node@v4 22 | with: 23 | node-version: 18 24 | cache: 'pnpm' 25 | 26 | - run: pnpm install --frozen-lockfile 27 | - run: pnpm format:check 28 | 29 | lint: 30 | runs-on: ubuntu-latest 31 | steps: 32 | - uses: actions/checkout@v4 33 | - uses: pnpm/action-setup@v2 34 | with: 35 | version: 8 36 | - uses: actions/setup-node@v4 37 | with: 38 | node-version: 18 39 | cache: 'pnpm' 40 | 41 | - run: pnpm install --frozen-lockfile 42 | - run: pnpm lint 43 | 44 | tests: 45 | runs-on: ubuntu-latest 46 | strategy: 47 | matrix: 48 | node-version: [18, 20, 22] 49 | name: node ${{ matrix.node-version }} 50 | steps: 51 | - uses: actions/checkout@v4 52 | - uses: pnpm/action-setup@v2 53 | with: 54 | version: 8 55 | - uses: actions/setup-node@v4 56 | with: 57 | node-version: ${{ matrix.node-version }} 58 | cache: 'pnpm' 59 | 60 | - run: pnpm install --frozen-lockfile 61 | - run: pnpm build 62 | - run: pnpm test 63 | -------------------------------------------------------------------------------- /src/parser/parser.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { JsonMap } from '@/parser/json-map'; 4 | import { MSGPack } from '@/parser/msg-pack'; 5 | 6 | const data = { 7 | foo: 'bar', 8 | bar: 'baz', 9 | }; 10 | 11 | describe('JSON-MAP', () => { 12 | it('stringify', () => { 13 | const hashMap = new Map(); 14 | hashMap.set('foo', 'bar'); 15 | hashMap.set('bar', 'baz'); 16 | const json = JsonMap.stringify(hashMap); 17 | expect(json).to.equal(JSON.stringify(data)); 18 | }); 19 | 20 | it('parse', () => { 21 | const hashMap = JsonMap.parse(JSON.stringify(data)); 22 | expect(hashMap.get('foo')).to.equal('bar'); 23 | }); 24 | }); 25 | 26 | describe('MSGPack-MAP', () => { 27 | function isBase64(str: string): boolean { 28 | // Regular expression to check if a string is base64 encoded 29 | const base64Regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; 30 | 31 | return base64Regex.test(str); 32 | } 33 | 34 | it('stringify', () => { 35 | const hashMap = new Map(); 36 | hashMap.set('foo', 'bar'); 37 | hashMap.set('bar', 'baz'); 38 | const b64 = MSGPack.stringify(hashMap); 39 | expect(isBase64(b64)).to.be.true; 40 | expect(b64.length, b64).to.be.greaterThan(6); 41 | }); 42 | 43 | it('parse', () => { 44 | const b64 = MSGPack.stringify(new Map(Object.entries(data))); 45 | expect(b64.length, b64).to.be.greaterThan(6); 46 | 47 | const hashMap = MSGPack.parse(b64); 48 | expect(hashMap.get('foo')).to.equal('bar'); 49 | expect(hashMap.get('bar')).to.equal('baz'); 50 | }); 51 | }); 52 | -------------------------------------------------------------------------------- /src/list.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { Client } from '@/client'; 4 | import { List } from '@/list'; 5 | import { sleep } from '@/tests/utils'; 6 | 7 | const c = new Client(); 8 | 9 | class LuckyNumberList extends List { 10 | median(): number { 11 | const numbers = this.toArray(); 12 | 13 | numbers.sort((a, b) => a - b); 14 | 15 | return numbers[Math.floor(numbers.length / 2)] || 0; 16 | } 17 | } 18 | 19 | describe('List', () => { 20 | it('Baseless', () => { 21 | const list = c.createList(); 22 | expect(list).to.be.instanceOf(List); 23 | 24 | list.push(1); 25 | list.push(2); 26 | list.push(3); 27 | 28 | expect(list.toArray()).to.have.members([1, 2, 3]); 29 | }); 30 | 31 | it('Iteration', () => { 32 | const list = c.createList(); 33 | list.push(1); 34 | list.push(2); 35 | list.push(3); 36 | 37 | for (const item of list) { 38 | expect(item).to.be.oneOf([1, 2, 3]); 39 | } 40 | }); 41 | 42 | describe('Lucky Numbers', () => { 43 | const list = c.createList(LuckyNumberList); 44 | 45 | it('get median', () => { 46 | list.push(1); 47 | list.push(2); 48 | list.push(3); 49 | 50 | const median = list.median(); 51 | expect(median).to.equal(2); 52 | }); 53 | }); 54 | 55 | describe('Time-based', () => { 56 | it('pushex', async () => { 57 | const list = c.createList(); 58 | list.pushex(1, 1); 59 | list.pushex(2, 1); 60 | list.pushex(3, 1); 61 | 62 | expect(list.toArray()).to.have.length(3); 63 | expect(list.toArray()).to.have.members([1, 2, 3]); 64 | 65 | await sleep(1000); 66 | 67 | expect(list.toArray()).to.have.length(3); 68 | expect(list.toArray()).to.have.members([null, null, null]); 69 | }); 70 | }); 71 | }); 72 | -------------------------------------------------------------------------------- /src/list.ts: -------------------------------------------------------------------------------- 1 | import { Client } from '@/client'; 2 | import type { HashKey, HashValue } from '@/typings'; 3 | 4 | export class List { 5 | constructor( 6 | private readonly _client: Client, 7 | private readonly _key: HashKey 8 | ) {} 9 | 10 | [Symbol.iterator]() { 11 | const list = this.toArray(); 12 | return (function* (): Generator { 13 | for (const item of list) { 14 | yield item; 15 | } 16 | })(); 17 | } 18 | 19 | set(index: number, value: Value | null): void { 20 | return this._client.lset(this._key, index, value); 21 | } 22 | 23 | setex(index: number, value: Value, seconds: number): void { 24 | return this._client.lsetex(this._key, index, value, seconds); 25 | } 26 | 27 | get(index: number): Value | null { 28 | return this._client.lget(this._key, index) as Value | null; 29 | } 30 | 31 | del(index: number): void { 32 | return this._client.ldel(this._key, index); 33 | } 34 | 35 | push(value: Value): void { 36 | return this._client.lpush(this._key, value); 37 | } 38 | 39 | pushex(value: Value, seconds: number): void { 40 | return this._client.lpushex(this._key, value, seconds); 41 | } 42 | 43 | exists(value: Value): boolean { 44 | return this._client.lexists(this._key, value); 45 | } 46 | 47 | pop(): Value | null { 48 | return this._client.lpop(this._key) as Value | null; 49 | } 50 | 51 | size(): number { 52 | return this._client.lsize(this._key); 53 | } 54 | 55 | clear(): void { 56 | return this._client.lclear(this._key); 57 | } 58 | 59 | range(start: number, stop: number): Value[] { 60 | return this._client.lrange(this._key, start, stop) as Value[]; 61 | } 62 | 63 | list(): Value[] { 64 | return this._client.lgetall(this._key) as Value[]; 65 | } 66 | 67 | toArray(): Value[] { 68 | return this.list(); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/driver/browser.ts: -------------------------------------------------------------------------------- 1 | import { HashRecord, StorageDriver } from '@/typings'; 2 | 3 | type StorageType = 'local' | 'session'; 4 | 5 | export interface BrowserDriverOptions { 6 | initialValue?: HashRecord; 7 | } 8 | 9 | export default class BrowserDriver 10 | implements StorageDriver 11 | { 12 | protected readonly _storage: Storage; 13 | 14 | constructor(type: StorageType, opts: BrowserDriverOptions = {}) { 15 | const { initialValue } = opts; 16 | 17 | if (typeof window === 'undefined') { 18 | throw new Error('Browser storage not available'); 19 | } 20 | 21 | const storage = type === 'local' ? localStorage : sessionStorage; 22 | if (!storage) { 23 | throw new Error('Storage not available'); 24 | } 25 | 26 | this._storage = storage; 27 | 28 | if (initialValue) { 29 | Object.entries(initialValue).forEach(([key, value]) => { 30 | this._storage.setItem(key, value.toString()); 31 | }); 32 | } 33 | } 34 | 35 | get(key: Key): Value | null { 36 | return this._storage.getItem(key) as Value | null; 37 | } 38 | 39 | set(key: Key, value: Value): void { 40 | // If value was undefined or null we should remove the key 41 | if (value === undefined || value === null) { 42 | return this.del(key); 43 | } 44 | 45 | this._storage.setItem(key, String(value).toString()); 46 | } 47 | 48 | del(key: Key): void { 49 | this._storage.removeItem(key); 50 | } 51 | 52 | exists(key: Key): boolean { 53 | return this._storage.getItem(key) !== null; 54 | } 55 | 56 | keys(): Key[] { 57 | return Object.keys(this._storage) as Key[]; 58 | } 59 | 60 | values(): Value[] { 61 | return Object.values(this._storage) as Value[]; 62 | } 63 | 64 | /** 65 | * Clears the storage. Please be careful with this method. 66 | */ 67 | clear(): void { 68 | this._storage.clear(); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # storage-box 2 | 3 | ## 1.0.3 4 | 5 | ### Patch Changes 6 | 7 | - 6b8a2d4: refactor: Using `@se-oss/msgpack` package in `MSGPack` parser 8 | - 1be7dc7: refactor: `FsDriver` to synchronously initialize storage 9 | 10 | ## 1.0.2 11 | 12 | ### Patch Changes 13 | 14 | - b478417: fix: Trapping the exit signal in `FsDriver` 15 | 16 | ## 1.0.1 17 | 18 | ### Patch Changes 19 | 20 | - 7f2a681: chore: Update dependencies 21 | - fa5ee22: fix: Type incompatibility with json/serializable types 22 | 23 | Use `Jsonify` if you need to transform a type to a JSON-compatible type 24 | 25 | ## 1.0.0 26 | 27 | ### Major Changes 28 | 29 | - 789d49a: BREAKING: The exported paths of the package have changed for both `BrowserDriver` and `FsDriver`. 30 | 31 | ```diff 32 | - import { BrowserDriver, FsDriver } from 'storage-box'; 33 | + import { BrowserDriver } from 'storage-box/browser'; 34 | + import { FsDriver } from 'storage-box/node'; 35 | ``` 36 | 37 | - 789d49a: BREAKING: the `list` method has been renamed to `lgetall` 38 | - ce4fd52: fix: Operation methods are now synchronous. The keyword `await` is no longer needed. 39 | 40 | ### Minor Changes 41 | 42 | - 789d49a: feat: `createList` method to create an instance of a list 43 | 44 | ```typescript 45 | import { Client } from 'storage-box'; 46 | 47 | const c = new Client(); 48 | 49 | const nl = c.createList(); 50 | for (let i = 0; i < 10; i++) { 51 | nl.push(i); 52 | } 53 | console.log(nl.range(0, 3)); 54 | ``` 55 | 56 | - 789d49a: feat: Added `createHashMap` method to create an instance of a HashMap. 57 | 58 | ```typescript 59 | import { Client } from 'storage-box'; 60 | 61 | const c = new Client(); 62 | 63 | interface Vertex { 64 | x: number; 65 | y: number; 66 | } 67 | 68 | const vhm = c.createHashMap(); 69 | vhm.set('a', { x: 1, y: 2 }); 70 | ``` 71 | 72 | ### Patch Changes 73 | 74 | - 789d49a: fix: added `getall` to extract entry storage as a record/key-value object 75 | - f4ede69: feat: added `pushex` and `exists` operations for list 76 | 77 | ## 0.3.1 78 | 79 | ### Patch Changes 80 | 81 | - d9324db: fix: optimize typings and remove unnecessary dependencies (#28) 82 | - 44643f4: chore(driver/fs): slightly improve `bouncy-write` feature (#26) 83 | -------------------------------------------------------------------------------- /src/driver/fs.test.ts: -------------------------------------------------------------------------------- 1 | import { promises } from 'node:fs'; 2 | import { resolve } from 'node:path'; 3 | import { afterEach, beforeEach, describe, expect, it } from 'vitest'; 4 | 5 | import { Client } from '@/client'; 6 | import { FsDriver } from '@/node'; 7 | import { MSGPack } from '@/parser/msg-pack'; 8 | import { sleep } from '@/tests/utils'; 9 | 10 | describe('Fs-based storage', () => { 11 | const filePath = resolve('tests', 'output', 'test.json'); 12 | 13 | const drive = new FsDriver(filePath); 14 | const client = new Client(drive); 15 | 16 | beforeEach(() => { 17 | client.clear(); 18 | }); 19 | 20 | afterEach(async () => { 21 | await promises.unlink(filePath).catch(() => {}); 22 | }); 23 | 24 | it('Set and get', () => { 25 | client.set('foo', 'bar'); 26 | client.set('bar', 'baz'); 27 | expect(client.get('foo')).to.equal('bar'); 28 | }); 29 | 30 | it('Delete', () => { 31 | client.set('foo', 'bar'); 32 | client.del('foo'); 33 | expect(client.get('foo')).to.be.null; 34 | }); 35 | 36 | it('create a key with expiration and reload again', async () => { 37 | { 38 | const drive = new FsDriver(filePath); 39 | const client = new Client(drive); 40 | 41 | client.setex('foo', 'bar', 2); 42 | } 43 | await sleep(2001); 44 | { 45 | const drive = new FsDriver(filePath); 46 | const client = new Client(drive); 47 | 48 | expect(client.exists('foo')).to.false; 49 | } 50 | }); 51 | }); 52 | 53 | describe('Fs-storage with MSGPack Parser', () => { 54 | const filePath = resolve('tests', 'output', 'test.b64'); 55 | 56 | const drive = new FsDriver(filePath, { parser: MSGPack }); 57 | const client = new Client(drive); 58 | 59 | beforeEach(() => { 60 | client.clear(); 61 | }); 62 | 63 | afterEach(async () => { 64 | await promises.unlink(filePath).catch(() => {}); 65 | }); 66 | 67 | it('Set and get', () => { 68 | client.set('foo', 'bar'); 69 | client.set('bar', 'baz'); 70 | expect(client.get('foo')).to.equal('bar'); 71 | }); 72 | 73 | it('Delete', () => { 74 | client.setex('foo', 'bar', 1); 75 | client.setex('bar', 'baz', 1); 76 | client.set('foo', 'bar'); 77 | 78 | client.del('foo'); 79 | 80 | expect(client.get('foo')).to.be.null; 81 | }); 82 | }); 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | StorageBox 3 |
4 | CI 5 | npm 6 | npm bundle size 7 | MIT 8 |

9 | 10 | _storage-box_ is a JavaScript library designed for the purpose of storing data in various structures across multiple 11 | storage systems. The primary goal of this library is to offer a straightforward and effective method for data storage. 12 | 13 | ## 👀 Features 14 | 15 | - Simple API 16 | - Support for **Node.js**, **Bun** and the **browser** 17 | - Support for multiple storage types (Memory, File, Browser-storage, etc.) 18 | - Multiple data structures (Literals, Hashes, Lists, etc.) 19 | - Time-based key expiration 20 | 21 | ## ⚙️ Installation 22 | 23 | ```bash 24 | npm i storage-box 25 | ``` 26 | 27 | ## 📖 Usage 28 | 29 | ```typescript 30 | import { Client } from 'storage-box'; 31 | 32 | const client = new Client(); 33 | 34 | client.setex('key', 'value', 2); 35 | 36 | console.log(client.get('key')); // value 37 | 38 | // time to live in milliseconds 39 | console.log(client.ttl('key', true)); // 2000 40 | 41 | // after 3 seconds 42 | setTimeout(() => { 43 | console.log(client.get('key')); // undefined 44 | }, 3e3); 45 | ``` 46 | 47 | ## 📦 Storage Types 48 | 49 | - Memory ([Docs](docs/driver-memory.md)) (default) 50 | - File-based (Fs) ([Docs](docs/driver-fs.md)) 51 | - Local/Session Storage ([Docs](docs/driver-browser.md)) 52 | 53 | ## 📚 Documentation 54 | 55 | For all configuration options, please see [the API docs](https://paka.dev/npm/storage-box/api). 56 | 57 | ## 🤝 Contributing 58 | 59 | You can contribute to this project by opening an issue or a pull request 60 | on [GitHub](https://github.com/shahradelahi/storage-box). Feel free to contribute, we care about your ideas and 61 | suggestions. 62 | 63 | ## Project Stats 64 | 65 | ![Alt](https://repobeats.axiom.co/api/embed/e1a9aca6e883cd81bba207c4edb9713c24796edd.svg 'Repobeats analytics image') 66 | 67 | ## License 68 | 69 | [MIT](/LICENSE) © [Shahrad Elahi](https://github.com/shahradelahi) 70 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "storage-box", 3 | "version": "1.0.3", 4 | "description": "A memory-based key–value storage for javascript.", 5 | "type": "module", 6 | "main": "dist/index.cjs", 7 | "module": "dist/index.js", 8 | "files": [ 9 | "dist/**" 10 | ], 11 | "exports": { 12 | ".": { 13 | "import": "./dist/index.js", 14 | "require": "./dist/index.cjs" 15 | }, 16 | "./node": { 17 | "import": "./dist/node.js", 18 | "require": "./dist/node.cjs" 19 | }, 20 | "./browser": { 21 | "import": "./dist/browser.js", 22 | "require": "./dist/browser.cjs" 23 | } 24 | }, 25 | "types": "./dist", 26 | "typesVersions": { 27 | "*": { 28 | "node": [ 29 | "dist/node.d.cts", 30 | "dist/node.d.ts" 31 | ], 32 | "browser": [ 33 | "dist/browser.d.cts", 34 | "dist/browser.d.ts" 35 | ] 36 | } 37 | }, 38 | "scripts": { 39 | "dev": "tsup --watch", 40 | "build": "tsup", 41 | "test": "vitest --run", 42 | "type-check": "tsc --noEmit", 43 | "lint": "pnpm type-check && eslint .", 44 | "lint:fix": "eslint --fix .", 45 | "format:check": "prettier --check .", 46 | "format": "prettier --write .", 47 | "ci:publish": "changeset publish", 48 | "prepublishOnly": "pnpm test && pnpm lint && pnpm format:check && pnpm build" 49 | }, 50 | "packageManager": "pnpm@8.15.9", 51 | "dependencies": { 52 | "@se-oss/msgpack": "^1.0.0", 53 | "debounce": "^2.1.0", 54 | "exit-hook": "^4.0.0", 55 | "type-fest": "^4.26.0" 56 | }, 57 | "devDependencies": { 58 | "@changesets/cli": "^2.27.7", 59 | "@ianvs/prettier-plugin-sort-imports": "^4.3.1", 60 | "@sindresorhus/tsconfig": "^6.0.0", 61 | "@types/node": "^22.5.2", 62 | "@typescript-eslint/eslint-plugin": "^7.18.0", 63 | "eslint": "^8.57.0", 64 | "prettier": "^3.3.3", 65 | "tsup": "^8.2.4", 66 | "typescript": "^5.5.4", 67 | "vitest": "^3.0.7" 68 | }, 69 | "license": "MIT", 70 | "author": "Shahrad Elahi (https://github.com/shahradelahi)", 71 | "contributors": [ 72 | "Seven Du (https://github.com/medz)" 73 | ], 74 | "repository": { 75 | "type": "git", 76 | "url": "https://github.com/shahradelahi/storage-box.git" 77 | }, 78 | "publishConfig": { 79 | "access": "public" 80 | }, 81 | "keywords": [ 82 | "storage", 83 | "key-value", 84 | "memory", 85 | "browser", 86 | "nodejs", 87 | "litehex" 88 | ] 89 | } 90 | -------------------------------------------------------------------------------- /src/client.test.ts: -------------------------------------------------------------------------------- 1 | import { beforeEach, describe, expect, it } from 'vitest'; 2 | 3 | import { Client } from '@/client'; 4 | 5 | describe('List operations', () => { 6 | const client = new Client(); 7 | beforeEach(() => { 8 | client.clear(); 9 | }); 10 | 11 | it('List - Get entry values in list', () => { 12 | client.lpush('foo', 'bar'); 13 | client.lpush('foo', 'foo'); 14 | client.lpush('foo', 'baz'); 15 | expect(client.lgetall('foo')).to.have.members(['baz', 'foo', 'bar']); 16 | }); 17 | 18 | it('Clear - Reset list to empty state', () => { 19 | client.set('foo', 'bar'); 20 | client.set('bar', 'foo'); 21 | client.clear(); 22 | expect(client.keys()).to.be.empty; 23 | }); 24 | 25 | it('List set', () => { 26 | client.lpush('foo', 'bar'); 27 | client.lpush('foo', 'foo'); 28 | client.lpush('foo', 'baz'); 29 | client.lset('foo', 1, 'bar'); 30 | expect(client.lgetall('foo')).to.have.members(['baz', 'bar', 'bar']); 31 | }); 32 | 33 | it('List get', () => { 34 | client.lpush('foo', 'bar'); 35 | client.lpush('foo', 'foo'); 36 | client.lpush('foo', 'baz'); 37 | expect(client.lget('foo', 1)).to.equal('foo'); 38 | }); 39 | 40 | it('List range', () => { 41 | client.lpush('foo', 'bar'); 42 | client.lpush('foo', 'foo'); 43 | client.lpush('foo', 'baz'); 44 | expect(client.lgetall('foo')).to.have.members(['baz', 'foo', 'bar']); 45 | expect(client.lrange('foo', 0, 2)).to.have.members(['foo', 'bar']); 46 | }); 47 | }); 48 | 49 | describe('Hash operations', () => { 50 | const client = new Client(); 51 | beforeEach(() => { 52 | client.clear(); 53 | }); 54 | 55 | it('Hash set and get', () => { 56 | client.hset('foo', 'bar', 'baz'); 57 | expect(client.hget('foo', 'bar')).to.equal('baz'); 58 | }); 59 | 60 | it('Hash get all', () => { 61 | client.hset('foo', 'bar', 'baz'); 62 | client.hset('foo', 'foo', 'bar'); 63 | client.hset('foo', 'bar', 'baz'); 64 | 65 | const values = client.hgetall('foo'); 66 | 67 | const expected = { 68 | bar: 'baz', 69 | foo: 'bar', 70 | }; 71 | 72 | expect(Object.keys(values)).to.have.members(Object.keys(expected)); 73 | 74 | for (const [key, value] of Object.entries(expected)) { 75 | expect(values).have.property(key, value); 76 | } 77 | }); 78 | 79 | it('Hash delete', () => { 80 | client.hset('foo', 'bar', 'baz'); 81 | client.hdel('foo', 'bar'); 82 | 83 | expect(client.hget('foo', 'bar')).to.be.null; 84 | }); 85 | }); 86 | -------------------------------------------------------------------------------- /src/driver/fs.ts: -------------------------------------------------------------------------------- 1 | import { mkdirSync, readFileSync } from 'node:fs'; 2 | import { dirname, resolve } from 'node:path'; 3 | import debounce, { type DebouncedFunction } from 'debounce'; 4 | import exitHook from 'exit-hook'; 5 | 6 | import { JsonMap, MemoryDriver } from '@/index'; 7 | import type { IStorageParser, Serializable } from '@/typings'; 8 | import { FileWriter } from '@/utils/file-writer'; 9 | import { access } from '@/utils/fs-extra'; 10 | 11 | export interface FsOptions { 12 | parser?: IStorageParser; 13 | 14 | /** 15 | * The encoding to use when writing to the file. 16 | * @default UTF-8 17 | */ 18 | encoding?: BufferEncoding; 19 | 20 | /** 21 | * @default 100 22 | */ 23 | debounceTime?: number; 24 | } 25 | 26 | export default class FsDriver extends MemoryDriver { 27 | private readonly _path: string; 28 | private readonly _writer: FileWriter; 29 | private readonly _parser: IStorageParser; 30 | private readonly _debounceTime: number; 31 | private readonly _bouncyWriteFn: DebouncedFunction<() => void>; 32 | private readonly _encoding: BufferEncoding; 33 | 34 | constructor(path: string, opts: FsOptions = {}) { 35 | const { parser = JsonMap, debounceTime = 100 } = opts; 36 | super(); 37 | 38 | this._path = resolve(path); 39 | this._parser = parser; 40 | this._debounceTime = debounceTime || 1; 41 | this._bouncyWriteFn = debounce(this.write, this._debounceTime); 42 | this._encoding = opts.encoding || 'utf-8'; 43 | this._writer = new FileWriter(this._path, { encoding: this._encoding }); 44 | 45 | exitHook(() => { 46 | this._bouncyWriteFn.clear(); 47 | this.write(); 48 | }); 49 | 50 | // Try to create a recursive 51 | const fileDir = dirname(this._path); 52 | if (!access(fileDir)) { 53 | mkdirSync(fileDir, { recursive: true }); 54 | } 55 | 56 | if (access(this._path)) { 57 | const rawData = readFileSync(this._path, this._encoding); 58 | const parser = this._parser; 59 | 60 | const _storage = rawData === '' ? new Map() : parser.parse(rawData); 61 | 62 | _storage.forEach((val, key) => { 63 | this._storage[key] = val; 64 | }); 65 | } 66 | } 67 | 68 | async write(): Promise { 69 | const data = this._parser.stringify(this._storage); 70 | await this._writer.write(data); 71 | } 72 | 73 | override set(key: string, value: Serializable): void { 74 | super.set(key, value); 75 | this._bouncyWriteFn(); 76 | } 77 | 78 | override del(key: string): void { 79 | super.del(key); 80 | this._bouncyWriteFn(); 81 | } 82 | 83 | override clear(): void { 84 | super.clear(); 85 | this._bouncyWriteFn(); 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/driver/memory.test.ts: -------------------------------------------------------------------------------- 1 | import { beforeEach, describe, expect, it } from 'vitest'; 2 | 3 | import { Client } from '@/client'; 4 | import { sleep } from '@/tests/utils'; 5 | 6 | describe('In-Memory', () => { 7 | const client = new Client(); 8 | 9 | beforeEach(() => { 10 | client.clear(); 11 | }); 12 | 13 | it('Set and get', () => { 14 | client.set('foo', 'bar'); 15 | const value = client.get('foo'); 16 | 17 | expect(value).to.equal('bar'); 18 | }); 19 | 20 | it('Delete', () => { 21 | client.set('foo', 'bar'); 22 | client.del('foo'); 23 | 24 | const value = client.get('foo'); 25 | 26 | expect(value).to.be.null; 27 | }); 28 | 29 | it('Exists', () => { 30 | client.set('foo', 'bar'); 31 | expect(client.has('foo')).to.be.true; 32 | 33 | client.del('foo'); 34 | expect(client.exists('foo')).to.be.false; 35 | }); 36 | 37 | it('Keys', () => { 38 | client.set('foo', 'bar'); 39 | client.set('bar', 'foo'); 40 | expect(client.keys()).to.have.members(['foo', 'bar']); 41 | }); 42 | 43 | describe('Time-based', () => { 44 | const client = new Client(); 45 | 46 | beforeEach(() => { 47 | client.clear(); 48 | }); 49 | 50 | it('Set and get', async () => { 51 | client.setex('foo', 'bar', 3); 52 | expect(client.get('foo')).to.equal('bar'); 53 | await sleep(1000); 54 | expect(client.get('foo')).to.equal('bar'); 55 | 56 | await sleep(2000); 57 | expect(client.get('foo')).to.be.null; 58 | }); 59 | 60 | it('List - set and get', async () => { 61 | client.lpushex('list', 'bar', 2); 62 | client.lpush('list', 'foo'); 63 | client.lpush('list', 'baz'); 64 | client.lsetex('list', 1, 'bar', 1); 65 | 66 | expect(client.lget('list', 1)).to.equal('bar'); 67 | 68 | await sleep(1000); 69 | expect(client.lget('list', 1)).to.be.null; 70 | 71 | await sleep(1000); 72 | expect(client.lget('list', 0)).to.be.null; 73 | }); 74 | 75 | it('Hash - Time-based set and get', async () => { 76 | client.hsetex('foo', 'field', 'bar', 1); 77 | expect(client.hget('foo', 'field')).to.equal('bar'); 78 | await sleep(1100); 79 | expect(client.hget('foo', 'field')).to.be.null; 80 | }); 81 | 82 | it('should get the key TTL', async () => { 83 | client.setex('foo', 'bar', 2); 84 | expect(client.ttl('foo')).to.be.greaterThanOrEqual(0); 85 | await sleep(2100); 86 | expect(client.ttl('foo')).to.equal(-1); 87 | }); 88 | 89 | it('should get TTL in milliseconds', async () => { 90 | client.setex('foo', 'bar', 2); 91 | expect(client.ttl('foo', true)).to.be.greaterThanOrEqual(1000); 92 | await sleep(2100); 93 | expect(client.ttl('foo', true)).to.equal(-1); 94 | }); 95 | }); 96 | }); 97 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | # Project Settings 133 | .idea 134 | 135 | 136 | tests/output 137 | -------------------------------------------------------------------------------- /src/typings.ts: -------------------------------------------------------------------------------- 1 | import type { JsonValue } from 'type-fest'; 2 | 3 | // --------------------- 4 | 5 | export type StorageOperations = KVOperations & 6 | HashOperations & 7 | ListOperations & { 8 | ttl(key: string): number; 9 | }; 10 | 11 | export interface KVOperations< 12 | Key extends HashField = string, 13 | Value extends HashValue = Serializable, 14 | > { 15 | get(key: Key): Value | null; 16 | set(key: Key, value: Value | null): void; 17 | setex(key: Key, value: Value, seconds: number): void; 18 | del(key: Key): void; 19 | exists(key: Key): boolean; 20 | has(key: Key): boolean; 21 | keys(): Key[]; 22 | values(): Value[]; 23 | clear(): void; 24 | getall(): HashRecord; 25 | } 26 | 27 | /** 28 | * Hash operations 29 | */ 30 | export interface HashOperations< 31 | Field extends HashField = HashField, 32 | Value extends Serializable = Serializable, 33 | > { 34 | hget(key: string, field: Field): Value | null; 35 | hset(key: string, field: Field, value: Value): void; 36 | hsetex(key: string, field: Field, value: Value, seconds: number): void; 37 | hdel(key: string, field: Field): void; 38 | hexists(key: string, field: Field): boolean; 39 | hsize(key: string): number; 40 | hclear(key: string): void; 41 | hgetall(key: string): HashRecord; 42 | } 43 | 44 | /** 45 | * List operations 46 | */ 47 | export interface ListOperations { 48 | lset(key: string, index: number, value: Value | null): void; 49 | lsetex(key: string, index: number, value: Value, seconds: number): void; 50 | lget(key: string, index: number): Value | null; 51 | ldel(key: string, index: number): void; 52 | lpush(key: string, value: Value): void; 53 | lpop(key: string): Value | null; 54 | lsize(key: string): number; 55 | lclear(key: string): void; 56 | lrange(key: string, start: number, stop: number): Value[]; 57 | lgetall(key: string): Value[]; 58 | } 59 | 60 | export interface StorageDriver< 61 | Key extends HashField = HashField, 62 | Value extends HashValue = HashValue, 63 | > { 64 | get(key: Key): Value | null; 65 | set(key: Key, value: Value): void; 66 | del(key: Key): void; 67 | exists(key: Key): boolean; 68 | keys(): Key[]; 69 | values(): Value[]; 70 | clear(): void; 71 | } 72 | 73 | export interface IStorageParser { 74 | stringify(value: any): string; 75 | parse(value: any): Map; 76 | } 77 | 78 | export type ParserStringifyFn = (value: any) => string; 79 | export type ParserParseFn = (value: any) => Map; 80 | 81 | // --------------------- 82 | 83 | export type HashField = string | number; 84 | export type HashValue = Serializable | SerializableList; 85 | 86 | /** Alias to `HashField` */ 87 | export type HashKey = HashField; 88 | 89 | export type HashRecord< 90 | Key extends string | number | symbol = HashField, 91 | Value extends Serializable | SerializableList = HashValue, 92 | > = { 93 | [key in Key]: Value; 94 | }; 95 | 96 | // --------------------- 97 | 98 | /** Alias to JSON-compatible values. */ 99 | export type Serializable = JsonValue | Serializable[]; 100 | 101 | /** Alias to a list of JSON-compatible values. */ 102 | export type SerializableList = Serializable[]; 103 | 104 | // --------------------- 105 | 106 | export type { JsonPrimitive, JsonArray, JsonValue, JsonObject, Jsonify, Class } from 'type-fest'; 107 | -------------------------------------------------------------------------------- /src/utils/file-writer.ts: -------------------------------------------------------------------------------- 1 | import { PathLike } from 'node:fs'; 2 | import { rename, writeFile } from 'node:fs/promises'; 3 | import { basename, dirname, join } from 'node:path'; 4 | import { fileURLToPath } from 'node:url'; 5 | 6 | import { access } from '@/utils/fs-extra'; 7 | 8 | // Returns a temporary file 9 | // Example: for /some/file will return /some/.file.tmp 10 | function getTempFilename(file: PathLike): string { 11 | const f = file instanceof URL ? fileURLToPath(file) : file.toString(); 12 | return join(dirname(f), `.${basename(f)}.tmp`); 13 | } 14 | 15 | // Retries an asynchronous operation with a delay between retries and a maximum retry count 16 | async function retryAsyncOperation( 17 | fn: () => Promise, 18 | maxRetries: number, 19 | delayMs: number 20 | ): Promise { 21 | for (let i = 0; i < maxRetries; i++) { 22 | try { 23 | return await fn(); 24 | } catch (error) { 25 | if (i < maxRetries - 1) { 26 | await new Promise((resolve) => setTimeout(resolve, delayMs)); 27 | } else { 28 | throw error; // Rethrow the error if max retries reached 29 | } 30 | } 31 | } 32 | } 33 | 34 | type Resolve = () => void; 35 | type Reject = (error: Error) => void; 36 | type Data = Parameters[1]; 37 | 38 | interface FileWriterOptions { 39 | encoding?: BufferEncoding; 40 | } 41 | 42 | /** 43 | * Steno — File Writer 44 | * 45 | * @link https://github.com/typicode/steno/blob/7376d62410ec06e32ca18564d6b5c4b51f6aa14d/src/index.ts 46 | * @license MIT 47 | * @copyright Typicode 48 | */ 49 | export class FileWriter { 50 | readonly #filename: PathLike; 51 | readonly #tempFilename: PathLike; 52 | readonly #encoding: BufferEncoding = 'utf-8'; 53 | #locked = false; 54 | #prev: [Resolve, Reject] | null = null; 55 | #next: [Resolve, Reject] | null = null; 56 | #nextPromise: Promise | null = null; 57 | #nextData: Data | null = null; 58 | 59 | // File is locked, add data for later 60 | #add(data: Data): Promise { 61 | // Only keep most recent data 62 | this.#nextData = data; 63 | 64 | // Create a singleton promise to resolve all next promises once next data is written 65 | this.#nextPromise ||= new Promise((resolve, reject) => { 66 | this.#next = [resolve, reject]; 67 | }); 68 | 69 | // Return a promise that will resolve at the same time as next promise 70 | return new Promise((resolve, reject) => { 71 | this.#nextPromise?.then(resolve).catch(reject); 72 | }); 73 | } 74 | 75 | // File isn't locked, write data 76 | async #write(data: Data): Promise { 77 | // Lock file 78 | this.#locked = true; 79 | try { 80 | // Atomic write 81 | await writeFile(this.#tempFilename, data, this.#encoding); 82 | await retryAsyncOperation( 83 | async () => { 84 | if (await access(this.#tempFilename)) { 85 | await rename(this.#tempFilename, this.#filename); 86 | } 87 | }, 88 | 10, 89 | 100 90 | ); 91 | 92 | // Call resolve 93 | this.#prev?.[0](); 94 | } catch (err) { 95 | // Call reject 96 | if (err instanceof Error) { 97 | this.#prev?.[1](err); 98 | } 99 | throw err; 100 | } finally { 101 | // Unlock file 102 | this.#locked = false; 103 | 104 | this.#prev = this.#next; 105 | this.#next = this.#nextPromise = null; 106 | 107 | if (this.#nextData !== null) { 108 | const nextData = this.#nextData; 109 | this.#nextData = null; 110 | await this.write(nextData); 111 | } 112 | } 113 | } 114 | 115 | constructor(filename: PathLike, options: FileWriterOptions = {}) { 116 | this.#filename = filename; 117 | this.#tempFilename = getTempFilename(filename); 118 | 119 | if (options.encoding) { 120 | this.#encoding = options.encoding; 121 | } 122 | } 123 | 124 | async write(data: Data): Promise { 125 | return this.#locked ? this.#add(data) : this.#write(data); 126 | } 127 | } 128 | -------------------------------------------------------------------------------- /docs/driver-memory.md: -------------------------------------------------------------------------------- 1 | # Memory-based Storage (Default) 2 | 3 | On this page, you can find examples of using the memory-based driver. 4 | 5 | ## Table of Contents 6 | 7 | - [Usage](#usage) 8 | - [Key/Value Operations](#keyvalue-operations) 9 | - [set](#set) 10 | - [get](#get) 11 | - [getall](#getall) 12 | - [delete](#delete) 13 | - [clear](#clear) 14 | - [exists](#exists) 15 | - [size](#size) 16 | - [keys](#keys) 17 | - [values](#values) 18 | - [Time-based Key Expiration](#time-based-key-expiration) 19 | - [setex](#setex) 20 | - [hsetex](#hsetex) 21 | - [lsetex](#lsetex) 22 | - [TTL](#ttl) 23 | - [Hash Operations](#hash-operations) 24 | - [createHashMap](#createhashmap) 25 | - [abstract HashMap](#abstract-hashmap) 26 | - [hset](#hset) 27 | - [hget](#hget) 28 | - [hgetall](#hgetall) 29 | - [hkeys](#hkeys) 30 | - [hvalues](#hvalues) 31 | - [hdel](#hdel) 32 | - [hexists](#hexists) 33 | - [hsize](#hsize) 34 | - [hclear](#hclear) 35 | - [List Operations](#list-operations) 36 | - [createList](#createlist) 37 | - [abstract List](#abstract-list) 38 | - [lpush](#lpush) 39 | - [lpop](#lpop) 40 | - [lrange](#lrange) 41 | - [lset](#lset) 42 | - [lrem](#lrem) 43 | - [lclear](#lclear) 44 | - [lsize](#lsize) 45 | - [lget](#lget) 46 | - [lgetall](#lgetall) 47 | 48 | ## Usage 49 | 50 | This is the default diver of the `storage-box` package, No further configuration is required. 51 | 52 | ```typescript 53 | import { Client } from 'storage-box'; 54 | 55 | const c = new Client(); 56 | ``` 57 | 58 | ## Key/Value Operations 59 | 60 | ##### set 61 | 62 | ```typescript 63 | client.set('key', 'value'); 64 | ``` 65 | 66 | ##### get 67 | 68 | ```typescript 69 | const value = client.get('key'); 70 | ``` 71 | 72 | ##### getall 73 | 74 | ```typescript 75 | const objs = client.getall(); 76 | ``` 77 | 78 | ##### delete 79 | 80 | ```typescript 81 | client.del('key'); 82 | ``` 83 | 84 | ##### clear 85 | 86 | ```typescript 87 | client.clear(); 88 | ``` 89 | 90 | ##### exists 91 | 92 | ```typescript 93 | const exists = client.exists('key'); 94 | const has = client.has('key'); // has is an alias for exists 95 | ``` 96 | 97 | ##### size 98 | 99 | Length of the storage 100 | 101 | ```typescript 102 | const size = client.size(); 103 | ``` 104 | 105 | ##### keys 106 | 107 | ```typescript 108 | const keys = client.keys(); 109 | ``` 110 | 111 | ##### values 112 | 113 | ```typescript 114 | const values = client.values(); 115 | ``` 116 | 117 | ## Time-based Key Expiration 118 | 119 | ##### Setex 120 | 121 | ```typescript 122 | client.setex('key', 'value', 10); // 10 seconds 123 | ``` 124 | 125 | ##### TTL 126 | 127 | Returns the remaining time in seconds 128 | 129 | ```typescript 130 | const ttl = client.ttl('key'); 131 | const ttlMs = client.ttl('key', true); // Returns the remaining time in milliseconds 132 | ``` 133 | 134 | ## Hash Operations 135 | 136 | ### createHashMap 137 | 138 | ```typescript 139 | interface Vertex { 140 | x: number; 141 | y: number; 142 | } 143 | 144 | const hash = client.createHashMap(); 145 | ``` 146 | 147 | #### Abstract HashMap 148 | 149 | ```typescript 150 | import { expect } from 'chai'; 151 | import type { JsonObject } from 'storage-box'; 152 | 153 | interface CuteUser extends JsonObject { 154 | first: string; 155 | last: string; 156 | } 157 | 158 | class CuteMap extends HashMap { 159 | async addUser(user: CuteUser) { 160 | const randId = Math.random().toString(36).slice(2); 161 | await this.set(randId, user); 162 | } 163 | 164 | async initials(): string[] { 165 | const all = await this.getall(); 166 | return Object.values(all).map((u) => `${u.first[0]}${u.last[0]}`); 167 | } 168 | } 169 | 170 | const cuties = client.createHashMap(CuteMap); 171 | 172 | await cuties.addUser({ first: 'Mary', last: 'Jane' }); 173 | await cuties.addUser({ first: 'Peter', last: 'Parker' }); 174 | 175 | const initials = await cuties.initials(); 176 | expect(initials).to.have.members(['MJ', 'PP']); 177 | ``` 178 | 179 | ### hset 180 | 181 | ```typescript 182 | client.hset('key', 'field', 'value'); 183 | ``` 184 | 185 | ### hget 186 | 187 | ```typescript 188 | const value = client.hget('key', 'field'); 189 | ``` 190 | 191 | ### hgetall 192 | 193 | ```typescript 194 | const map = client.hgetall('key'); 195 | ``` 196 | 197 | ### hsetex 198 | 199 | ```typescript 200 | client.hsetex('key', 'field', 'value', 10); // 10 seconds 201 | ``` 202 | 203 | ### hkeys 204 | 205 | ```typescript 206 | const keys = client.hkeys('key'); 207 | ``` 208 | 209 | ### hvalues 210 | 211 | ```typescript 212 | const values = client.hvalues('key'); 213 | ``` 214 | 215 | ### hdel 216 | 217 | ```typescript 218 | client.hdel('key', 'field'); 219 | ``` 220 | 221 | ### hexists 222 | 223 | ```typescript 224 | const exists = client.hexists('key', 'field'); 225 | ``` 226 | 227 | ### hsize 228 | 229 | ```typescript 230 | const size = client.hsize('key'); 231 | ``` 232 | 233 | ### hclear 234 | 235 | ```typescript 236 | client.hclear('key'); 237 | ``` 238 | -------------------------------------------------------------------------------- /src/client.ts: -------------------------------------------------------------------------------- 1 | import { TTL_LIST_KEY } from '@/constants'; 2 | import MemoryDriver from '@/driver/memory'; 3 | import { HashMap } from '@/hash-map'; 4 | import { HashKey, HashValue } from '@/index'; 5 | import { List } from '@/list'; 6 | import type { SerializedTTL, TTL } from '@/ttl'; 7 | import type { 8 | Class, 9 | HashField, 10 | HashRecord, 11 | Serializable, 12 | SerializableList, 13 | StorageDriver, 14 | StorageOperations, 15 | } from '@/typings'; 16 | 17 | class Client implements StorageOperations { 18 | readonly #drive: StorageDriver; 19 | readonly #ttl: Map = new Map(); 20 | 21 | constructor(storage?: Driver) { 22 | this.#drive = storage || new MemoryDriver(); 23 | this.#load_ttl(); 24 | } 25 | 26 | getall(): HashRecord { 27 | const record: HashRecord = {}; 28 | for (const key of this.#drive.keys()) { 29 | record[key] = this.get(key); 30 | } 31 | return record; 32 | } 33 | 34 | get(key: HashField): Value | null { 35 | const ttl = this.#ttl.get(key); 36 | 37 | // Return if ttl is not set or not expired 38 | if (!ttl || ttl.dat > Date.now()) { 39 | const val = this.#drive.get(key) as Value; 40 | return val ?? null; 41 | } 42 | 43 | if (ttl.type === 'key') { 44 | this.del(key); 45 | } 46 | 47 | if (ttl.type === 'list') { 48 | // Delete key from TTL list due to TTL mismatch 49 | this.#ttl.delete(key); 50 | } 51 | 52 | return null; 53 | } 54 | 55 | set(key: HashKey, value: Serializable | null) { 56 | this.#drive.set(key, value); 57 | } 58 | 59 | del(key: HashKey) { 60 | this.#drive.del(key); 61 | } 62 | 63 | exists(key: HashKey) { 64 | return this.#drive.exists(key); 65 | } 66 | 67 | has(key: HashKey) { 68 | return this.exists(key); 69 | } 70 | 71 | keys(): Key[] { 72 | return this.#drive.keys() as Key[]; 73 | } 74 | 75 | values() { 76 | const vals: Value[] = []; 77 | for (const key of this.#drive.keys()) { 78 | vals.push(this.get(key) as Value); 79 | } 80 | return vals; 81 | } 82 | 83 | clear() { 84 | this.#drive.clear(); 85 | } 86 | 87 | //// 88 | // Hash operations 89 | //// 90 | 91 | #get_hash(key: HashKey): HashRecord { 92 | if (!this.#drive.exists(key)) { 93 | this.#drive.set(key, {}); 94 | return {}; 95 | } 96 | 97 | const map = this.#drive.get(key) as HashRecord | null; 98 | if (!map) { 99 | return {}; 100 | } 101 | 102 | if (typeof map !== 'object') { 103 | throw new Error('Accessed non-object value at key: ' + key); 104 | } 105 | 106 | return map; 107 | } 108 | 109 | hget(key: HashKey, field: HashField) { 110 | const map = this.#get_hash(key); 111 | return map[field] ?? null; 112 | } 113 | 114 | hset(key: HashKey, field: HashField, value: Serializable) { 115 | const map = this.#get_hash(key); 116 | map[field] = value; 117 | this.#drive.set(key, map); 118 | } 119 | 120 | hsetex(key: HashKey, field: HashField, value: Serializable, seconds: number) { 121 | const map = this.#get_hash(key); 122 | map[field] = value; 123 | this.#drive.set(key, map); 124 | const secs = seconds * 1000; 125 | const delAt = Date.now() + secs; 126 | this.#create_hdel_timout(key, field, delAt); 127 | } 128 | 129 | hkeys(key: HashKey) { 130 | const map = this.#get_hash(key); 131 | return Object.keys(map); 132 | } 133 | 134 | hvalues(key: HashKey) { 135 | const map = this.#get_hash(key); 136 | return Object.values(map); 137 | } 138 | 139 | hdel(key: HashKey, field: HashField) { 140 | const map = this.#get_hash(key); 141 | delete map[field]; 142 | this.#drive.set(key, map); 143 | } 144 | 145 | hexists(key: HashKey, field: HashField) { 146 | const map = this.#get_hash(key); 147 | return field in map; 148 | } 149 | 150 | hsize(key: HashKey) { 151 | const map = this.#get_hash(key); 152 | return Object.keys(map).length; 153 | } 154 | 155 | hclear(key: HashKey) { 156 | this.#drive.set(key, {}); 157 | } 158 | 159 | hgetall(key: string): HashRecord { 160 | const map = this.#get_hash(key); 161 | return map as HashRecord; 162 | } 163 | 164 | #createInstance(key: string | undefined, abstract: Class): Instance { 165 | if (typeof key !== 'string') { 166 | const random = Buffer.from(Math.random().toString(36).slice(2)).toString('hex'); 167 | key = `[${abstract.name}-${random}]`; 168 | } 169 | 170 | return new abstract(this, key); 171 | } 172 | 173 | createHashMap< 174 | Key extends HashField, 175 | Value extends HashValue, 176 | Map extends HashMap = HashMap, 177 | >(key?: string | Class, abstract?: Class): Map { 178 | return this.#createInstance( 179 | typeof key !== 'string' ? undefined : key, 180 | typeof key !== 'string' ? (key ?? HashMap) : ((abstract as any) ?? HashMap) 181 | ); 182 | } 183 | 184 | createList>( 185 | key?: string | Class<_List>, 186 | abstract?: Class<_List> 187 | ): _List { 188 | return this.#createInstance( 189 | typeof key !== 'string' ? undefined : key, 190 | typeof key !== 'string' ? (key ?? List) : ((abstract as any) ?? List) 191 | ); 192 | } 193 | 194 | //// 195 | // List operations 196 | //// 197 | 198 | #get_list(key: HashField): SerializableList { 199 | if (!this.#drive.exists(key)) { 200 | this.#drive.set(key, []); 201 | } 202 | 203 | const list = this.#drive.get(key); // Not using this.get() to avoid TTL check 204 | if (!list) { 205 | return []; 206 | } 207 | 208 | if (!Array.isArray(list)) { 209 | throw new TypeError(`Expected list at key: ${key}`); 210 | } 211 | 212 | return list as SerializableList; 213 | } 214 | 215 | lgetall(key: HashKey) { 216 | return this.#get_list(key); 217 | } 218 | 219 | lset(key: HashField, index: number, value: Serializable | null) { 220 | const list = this.#get_list(key); 221 | list[index] = value; 222 | this.#drive.set(key, list); 223 | } 224 | 225 | lget(key: HashField, index: number): HashValue | null { 226 | const ttl = this.#ttl.get(key); 227 | 228 | if (!ttl || ttl.dat > Date.now()) { 229 | const list = this.#get_list(key); 230 | return list[index] as HashValue; 231 | } 232 | 233 | if (ttl.type === 'list') { 234 | this.lset(key, ttl.index, null); 235 | } 236 | 237 | if (ttl.type === 'key') { 238 | // TTL mismatch with the key, delete the key from the TTL list 239 | this.#ttl.delete(key); 240 | } 241 | 242 | return null; 243 | } 244 | 245 | ldel(key: HashKey, index: number) { 246 | const list = this.#get_list(key); 247 | list.splice(index, 1); 248 | this.#drive.set(key, list); 249 | } 250 | 251 | lpush(key: HashKey, value: Serializable): void { 252 | const list = this.#get_list(key); 253 | list.push(value); 254 | this.#drive.set(key, list); 255 | } 256 | 257 | lpushex(key: HashKey, value: Serializable, seconds: number): void { 258 | const list = this.#get_list(key); 259 | list.push(value); 260 | this.#drive.set(key, list); 261 | const secs = seconds * 1000; 262 | const delAt = Date.now() + secs; 263 | this.#create_ldel_timout(key, list.length - 1, delAt); 264 | } 265 | 266 | lexists(key: HashKey, value: Serializable): boolean { 267 | const list = this.#get_list(key); 268 | return list.includes(value); 269 | } 270 | 271 | /** 272 | * Removes and returns the last element of the list stored at key. 273 | * 274 | * @param key - The key of the list. 275 | */ 276 | lpop(key: HashKey): HashValue | null { 277 | const list = this.#get_list(key); 278 | return list.pop() ?? null; 279 | } 280 | 281 | lsize(key: HashKey) { 282 | const list = this.#get_list(key); 283 | return list.length; 284 | } 285 | 286 | lclear(key: HashKey) { 287 | this.#drive.set(key, []); 288 | } 289 | 290 | /** 291 | * Returns a slice of the list stored at key, starting at the specified index and ending at the specified index. 292 | * 293 | * @param key - The key of the list. 294 | * @param start - The index to start the slice at. 295 | * @param stop - The index to end the slice at. 296 | */ 297 | lrange(key: HashKey, start: number, stop: number): HashValue[] { 298 | const list = this.#get_list(key); 299 | return list.slice(start, stop); 300 | } 301 | 302 | #load_ttl() { 303 | const ttlList = this.#drive.get(TTL_LIST_KEY) as SerializedTTL[] | undefined; 304 | if (!ttlList || !Array.isArray(ttlList)) { 305 | // TTL list malformed, clear it 306 | return this.#drive.del(TTL_LIST_KEY); 307 | } 308 | 309 | ttlList.map(({ key, dat, ...rest }) => { 310 | // If the key does not exist, remove it from the TTL list 311 | if (!this.#drive.exists(key)) { 312 | this.#ttl.delete(key); 313 | return; 314 | } 315 | 316 | // If the key has already expired, remove it from the TTL list 317 | if (!dat || dat < Date.now()) { 318 | this.#drive.del(key); 319 | this.#ttl.delete(key); 320 | return; 321 | } 322 | 323 | this.#ttl.set(key, { 324 | dat, 325 | ...rest, 326 | }); 327 | 328 | // Set the timeout for the key 329 | switch (rest.type) { 330 | case 'key': 331 | this.#create_del_timout(key, dat); 332 | break; 333 | case 'list': 334 | this.#create_ldel_timout(key, rest.index, dat); 335 | break; 336 | case 'hash': 337 | this.#create_hdel_timout(key, rest.field, dat); 338 | break; 339 | default: 340 | throw new Error('TTL malformed at key: ' + key); 341 | } 342 | }); 343 | } 344 | 345 | #create_del_timout(key: HashField, dat: number) { 346 | const timeLeft = dat - Date.now(); 347 | setTimeout(() => { 348 | this.#drive.del(key); 349 | this.#ttl.delete(key); 350 | }, timeLeft); 351 | 352 | this.#ttl.set(key, { 353 | type: 'key', 354 | dat, 355 | }); 356 | 357 | this.#update_ttl_list(); 358 | } 359 | 360 | #create_ldel_timout(key: HashField, index: number, dat: number) { 361 | const timeLeft = dat - Date.now(); 362 | setTimeout(() => { 363 | this.lset(key, index, null); 364 | this.#ttl.delete(key); 365 | }, timeLeft); 366 | 367 | this.#ttl.set(key, { 368 | type: 'list', 369 | index, 370 | dat, 371 | }); 372 | 373 | this.#update_ttl_list(); 374 | } 375 | 376 | #create_hdel_timout(key: HashField, field: HashField, dat: number) { 377 | const timeLeft = dat - Date.now(); 378 | setTimeout(() => { 379 | this.hset(key, field, null); 380 | this.#ttl.delete(key); 381 | }, timeLeft); 382 | 383 | this.#ttl.set(key, { 384 | type: 'hash', 385 | field, 386 | dat, 387 | }); 388 | 389 | this.#update_ttl_list(); 390 | } 391 | 392 | #update_ttl_list() { 393 | const ttlList: SerializedTTL[] = []; 394 | this.#ttl.forEach((ttl, key) => { 395 | ttlList.push(Object.assign(ttl, { key })); 396 | }); 397 | this.set(TTL_LIST_KEY, ttlList); 398 | } 399 | 400 | /** 401 | * Delete a key after a certain time. 402 | * 403 | * @param key 404 | * @param value 405 | * @param seconds 406 | */ 407 | setex(key: HashKey, value: Serializable, seconds: number) { 408 | this.#drive.set(key, value); 409 | const secs = seconds * 1000; 410 | const delAt = Date.now() + secs; 411 | this.#create_del_timout(key, delAt); 412 | } 413 | 414 | /** 415 | * Set list item with expiration time. The item in the list will be deleted after the expiration time. 416 | * 417 | * @param key 418 | * @param index 419 | * @param value 420 | * @param seconds 421 | */ 422 | lsetex(key: HashKey, index: number, value: Serializable, seconds: number) { 423 | const list = this.#get_list(key); 424 | list[index] = value; 425 | this.#drive.set(key, list); 426 | const secs = seconds * 1000; 427 | const delAt = Date.now() + secs; 428 | this.#create_ldel_timout(key, index, delAt); 429 | } 430 | 431 | /** 432 | * Get the remaining time to live in seconds. 433 | * 434 | * Returns -1 if the key does not exist or does not have a timeout. 435 | * 436 | * @param key 437 | * @param milliseconds If true, returns the remaining time in milliseconds. 438 | */ 439 | ttl(key: HashKey, milliseconds?: boolean) { 440 | const item = this.#ttl.get(key); 441 | if (!item) { 442 | return -1; 443 | } 444 | const now = Date.now(); 445 | const ttl = item.dat - now; 446 | if (ttl < 0) { 447 | return -1; 448 | } 449 | if (milliseconds) { 450 | return ttl; 451 | } 452 | return Math.floor(ttl / 1000); 453 | } 454 | } 455 | 456 | export { Client }; 457 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@se-oss/msgpack': 9 | specifier: ^1.0.0 10 | version: 1.0.0(@msgpack/msgpack@3.1.0) 11 | debounce: 12 | specifier: ^2.1.0 13 | version: 2.1.1 14 | exit-hook: 15 | specifier: ^4.0.0 16 | version: 4.0.0 17 | type-fest: 18 | specifier: ^4.26.0 19 | version: 4.26.1 20 | 21 | devDependencies: 22 | '@changesets/cli': 23 | specifier: ^2.27.7 24 | version: 2.27.8 25 | '@ianvs/prettier-plugin-sort-imports': 26 | specifier: ^4.3.1 27 | version: 4.3.1(prettier@3.3.3) 28 | '@sindresorhus/tsconfig': 29 | specifier: ^6.0.0 30 | version: 6.0.0 31 | '@types/node': 32 | specifier: ^22.5.2 33 | version: 22.5.5 34 | '@typescript-eslint/eslint-plugin': 35 | specifier: ^7.18.0 36 | version: 7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.6.2) 37 | eslint: 38 | specifier: ^8.57.0 39 | version: 8.57.1 40 | prettier: 41 | specifier: ^3.3.3 42 | version: 3.3.3 43 | tsup: 44 | specifier: ^8.2.4 45 | version: 8.3.0(typescript@5.6.2) 46 | typescript: 47 | specifier: ^5.5.4 48 | version: 5.6.2 49 | vitest: 50 | specifier: ^3.0.7 51 | version: 3.0.7(@types/node@22.5.5) 52 | 53 | packages: 54 | 55 | /@ampproject/remapping@2.3.0: 56 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 57 | engines: {node: '>=6.0.0'} 58 | dependencies: 59 | '@jridgewell/gen-mapping': 0.3.5 60 | '@jridgewell/trace-mapping': 0.3.25 61 | dev: true 62 | 63 | /@babel/code-frame@7.24.7: 64 | resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} 65 | engines: {node: '>=6.9.0'} 66 | dependencies: 67 | '@babel/highlight': 7.24.7 68 | picocolors: 1.1.0 69 | dev: true 70 | 71 | /@babel/compat-data@7.25.4: 72 | resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} 73 | engines: {node: '>=6.9.0'} 74 | dev: true 75 | 76 | /@babel/core@7.25.2: 77 | resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} 78 | engines: {node: '>=6.9.0'} 79 | dependencies: 80 | '@ampproject/remapping': 2.3.0 81 | '@babel/code-frame': 7.24.7 82 | '@babel/generator': 7.25.6 83 | '@babel/helper-compilation-targets': 7.25.2 84 | '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) 85 | '@babel/helpers': 7.25.6 86 | '@babel/parser': 7.25.6 87 | '@babel/template': 7.25.0 88 | '@babel/traverse': 7.25.6 89 | '@babel/types': 7.25.6 90 | convert-source-map: 2.0.0 91 | debug: 4.3.7 92 | gensync: 1.0.0-beta.2 93 | json5: 2.2.3 94 | semver: 6.3.1 95 | transitivePeerDependencies: 96 | - supports-color 97 | dev: true 98 | 99 | /@babel/generator@7.25.6: 100 | resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} 101 | engines: {node: '>=6.9.0'} 102 | dependencies: 103 | '@babel/types': 7.25.6 104 | '@jridgewell/gen-mapping': 0.3.5 105 | '@jridgewell/trace-mapping': 0.3.25 106 | jsesc: 2.5.2 107 | dev: true 108 | 109 | /@babel/helper-compilation-targets@7.25.2: 110 | resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} 111 | engines: {node: '>=6.9.0'} 112 | dependencies: 113 | '@babel/compat-data': 7.25.4 114 | '@babel/helper-validator-option': 7.24.8 115 | browserslist: 4.23.3 116 | lru-cache: 5.1.1 117 | semver: 6.3.1 118 | dev: true 119 | 120 | /@babel/helper-module-imports@7.24.7: 121 | resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} 122 | engines: {node: '>=6.9.0'} 123 | dependencies: 124 | '@babel/traverse': 7.25.6 125 | '@babel/types': 7.25.6 126 | transitivePeerDependencies: 127 | - supports-color 128 | dev: true 129 | 130 | /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): 131 | resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} 132 | engines: {node: '>=6.9.0'} 133 | peerDependencies: 134 | '@babel/core': ^7.0.0 135 | dependencies: 136 | '@babel/core': 7.25.2 137 | '@babel/helper-module-imports': 7.24.7 138 | '@babel/helper-simple-access': 7.24.7 139 | '@babel/helper-validator-identifier': 7.24.7 140 | '@babel/traverse': 7.25.6 141 | transitivePeerDependencies: 142 | - supports-color 143 | dev: true 144 | 145 | /@babel/helper-simple-access@7.24.7: 146 | resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} 147 | engines: {node: '>=6.9.0'} 148 | dependencies: 149 | '@babel/traverse': 7.25.6 150 | '@babel/types': 7.25.6 151 | transitivePeerDependencies: 152 | - supports-color 153 | dev: true 154 | 155 | /@babel/helper-string-parser@7.24.8: 156 | resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} 157 | engines: {node: '>=6.9.0'} 158 | dev: true 159 | 160 | /@babel/helper-validator-identifier@7.24.7: 161 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 162 | engines: {node: '>=6.9.0'} 163 | dev: true 164 | 165 | /@babel/helper-validator-option@7.24.8: 166 | resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} 167 | engines: {node: '>=6.9.0'} 168 | dev: true 169 | 170 | /@babel/helpers@7.25.6: 171 | resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} 172 | engines: {node: '>=6.9.0'} 173 | dependencies: 174 | '@babel/template': 7.25.0 175 | '@babel/types': 7.25.6 176 | dev: true 177 | 178 | /@babel/highlight@7.24.7: 179 | resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} 180 | engines: {node: '>=6.9.0'} 181 | dependencies: 182 | '@babel/helper-validator-identifier': 7.24.7 183 | chalk: 2.4.2 184 | js-tokens: 4.0.0 185 | picocolors: 1.1.0 186 | dev: true 187 | 188 | /@babel/parser@7.25.6: 189 | resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} 190 | engines: {node: '>=6.0.0'} 191 | hasBin: true 192 | dependencies: 193 | '@babel/types': 7.25.6 194 | dev: true 195 | 196 | /@babel/runtime@7.25.6: 197 | resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} 198 | engines: {node: '>=6.9.0'} 199 | dependencies: 200 | regenerator-runtime: 0.14.1 201 | dev: true 202 | 203 | /@babel/template@7.25.0: 204 | resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} 205 | engines: {node: '>=6.9.0'} 206 | dependencies: 207 | '@babel/code-frame': 7.24.7 208 | '@babel/parser': 7.25.6 209 | '@babel/types': 7.25.6 210 | dev: true 211 | 212 | /@babel/traverse@7.25.6: 213 | resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} 214 | engines: {node: '>=6.9.0'} 215 | dependencies: 216 | '@babel/code-frame': 7.24.7 217 | '@babel/generator': 7.25.6 218 | '@babel/parser': 7.25.6 219 | '@babel/template': 7.25.0 220 | '@babel/types': 7.25.6 221 | debug: 4.3.7 222 | globals: 11.12.0 223 | transitivePeerDependencies: 224 | - supports-color 225 | dev: true 226 | 227 | /@babel/types@7.25.6: 228 | resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} 229 | engines: {node: '>=6.9.0'} 230 | dependencies: 231 | '@babel/helper-string-parser': 7.24.8 232 | '@babel/helper-validator-identifier': 7.24.7 233 | to-fast-properties: 2.0.0 234 | dev: true 235 | 236 | /@changesets/apply-release-plan@7.0.5: 237 | resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} 238 | dependencies: 239 | '@changesets/config': 3.0.3 240 | '@changesets/get-version-range-type': 0.4.0 241 | '@changesets/git': 3.0.1 242 | '@changesets/should-skip-package': 0.1.1 243 | '@changesets/types': 6.0.0 244 | '@manypkg/get-packages': 1.1.3 245 | detect-indent: 6.1.0 246 | fs-extra: 7.0.1 247 | lodash.startcase: 4.4.0 248 | outdent: 0.5.0 249 | prettier: 2.8.8 250 | resolve-from: 5.0.0 251 | semver: 7.6.3 252 | dev: true 253 | 254 | /@changesets/assemble-release-plan@6.0.4: 255 | resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} 256 | dependencies: 257 | '@changesets/errors': 0.2.0 258 | '@changesets/get-dependents-graph': 2.1.2 259 | '@changesets/should-skip-package': 0.1.1 260 | '@changesets/types': 6.0.0 261 | '@manypkg/get-packages': 1.1.3 262 | semver: 7.6.3 263 | dev: true 264 | 265 | /@changesets/changelog-git@0.2.0: 266 | resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} 267 | dependencies: 268 | '@changesets/types': 6.0.0 269 | dev: true 270 | 271 | /@changesets/cli@2.27.8: 272 | resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} 273 | hasBin: true 274 | dependencies: 275 | '@changesets/apply-release-plan': 7.0.5 276 | '@changesets/assemble-release-plan': 6.0.4 277 | '@changesets/changelog-git': 0.2.0 278 | '@changesets/config': 3.0.3 279 | '@changesets/errors': 0.2.0 280 | '@changesets/get-dependents-graph': 2.1.2 281 | '@changesets/get-release-plan': 4.0.4 282 | '@changesets/git': 3.0.1 283 | '@changesets/logger': 0.1.1 284 | '@changesets/pre': 2.0.1 285 | '@changesets/read': 0.6.1 286 | '@changesets/should-skip-package': 0.1.1 287 | '@changesets/types': 6.0.0 288 | '@changesets/write': 0.3.2 289 | '@manypkg/get-packages': 1.1.3 290 | '@types/semver': 7.5.8 291 | ansi-colors: 4.1.3 292 | ci-info: 3.9.0 293 | enquirer: 2.4.1 294 | external-editor: 3.1.0 295 | fs-extra: 7.0.1 296 | mri: 1.2.0 297 | outdent: 0.5.0 298 | p-limit: 2.3.0 299 | package-manager-detector: 0.2.0 300 | picocolors: 1.1.0 301 | resolve-from: 5.0.0 302 | semver: 7.6.3 303 | spawndamnit: 2.0.0 304 | term-size: 2.2.1 305 | dev: true 306 | 307 | /@changesets/config@3.0.3: 308 | resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} 309 | dependencies: 310 | '@changesets/errors': 0.2.0 311 | '@changesets/get-dependents-graph': 2.1.2 312 | '@changesets/logger': 0.1.1 313 | '@changesets/types': 6.0.0 314 | '@manypkg/get-packages': 1.1.3 315 | fs-extra: 7.0.1 316 | micromatch: 4.0.8 317 | dev: true 318 | 319 | /@changesets/errors@0.2.0: 320 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 321 | dependencies: 322 | extendable-error: 0.1.7 323 | dev: true 324 | 325 | /@changesets/get-dependents-graph@2.1.2: 326 | resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} 327 | dependencies: 328 | '@changesets/types': 6.0.0 329 | '@manypkg/get-packages': 1.1.3 330 | picocolors: 1.1.0 331 | semver: 7.6.3 332 | dev: true 333 | 334 | /@changesets/get-release-plan@4.0.4: 335 | resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} 336 | dependencies: 337 | '@changesets/assemble-release-plan': 6.0.4 338 | '@changesets/config': 3.0.3 339 | '@changesets/pre': 2.0.1 340 | '@changesets/read': 0.6.1 341 | '@changesets/types': 6.0.0 342 | '@manypkg/get-packages': 1.1.3 343 | dev: true 344 | 345 | /@changesets/get-version-range-type@0.4.0: 346 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 347 | dev: true 348 | 349 | /@changesets/git@3.0.1: 350 | resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} 351 | dependencies: 352 | '@changesets/errors': 0.2.0 353 | '@manypkg/get-packages': 1.1.3 354 | is-subdir: 1.2.0 355 | micromatch: 4.0.8 356 | spawndamnit: 2.0.0 357 | dev: true 358 | 359 | /@changesets/logger@0.1.1: 360 | resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 361 | dependencies: 362 | picocolors: 1.1.0 363 | dev: true 364 | 365 | /@changesets/parse@0.4.0: 366 | resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} 367 | dependencies: 368 | '@changesets/types': 6.0.0 369 | js-yaml: 3.14.1 370 | dev: true 371 | 372 | /@changesets/pre@2.0.1: 373 | resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} 374 | dependencies: 375 | '@changesets/errors': 0.2.0 376 | '@changesets/types': 6.0.0 377 | '@manypkg/get-packages': 1.1.3 378 | fs-extra: 7.0.1 379 | dev: true 380 | 381 | /@changesets/read@0.6.1: 382 | resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} 383 | dependencies: 384 | '@changesets/git': 3.0.1 385 | '@changesets/logger': 0.1.1 386 | '@changesets/parse': 0.4.0 387 | '@changesets/types': 6.0.0 388 | fs-extra: 7.0.1 389 | p-filter: 2.1.0 390 | picocolors: 1.1.0 391 | dev: true 392 | 393 | /@changesets/should-skip-package@0.1.1: 394 | resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} 395 | dependencies: 396 | '@changesets/types': 6.0.0 397 | '@manypkg/get-packages': 1.1.3 398 | dev: true 399 | 400 | /@changesets/types@4.1.0: 401 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 402 | dev: true 403 | 404 | /@changesets/types@6.0.0: 405 | resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} 406 | dev: true 407 | 408 | /@changesets/write@0.3.2: 409 | resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} 410 | dependencies: 411 | '@changesets/types': 6.0.0 412 | fs-extra: 7.0.1 413 | human-id: 1.0.2 414 | prettier: 2.8.8 415 | dev: true 416 | 417 | /@esbuild/aix-ppc64@0.23.1: 418 | resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} 419 | engines: {node: '>=18'} 420 | cpu: [ppc64] 421 | os: [aix] 422 | requiresBuild: true 423 | dev: true 424 | optional: true 425 | 426 | /@esbuild/aix-ppc64@0.25.0: 427 | resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} 428 | engines: {node: '>=18'} 429 | cpu: [ppc64] 430 | os: [aix] 431 | requiresBuild: true 432 | dev: true 433 | optional: true 434 | 435 | /@esbuild/android-arm64@0.23.1: 436 | resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} 437 | engines: {node: '>=18'} 438 | cpu: [arm64] 439 | os: [android] 440 | requiresBuild: true 441 | dev: true 442 | optional: true 443 | 444 | /@esbuild/android-arm64@0.25.0: 445 | resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} 446 | engines: {node: '>=18'} 447 | cpu: [arm64] 448 | os: [android] 449 | requiresBuild: true 450 | dev: true 451 | optional: true 452 | 453 | /@esbuild/android-arm@0.23.1: 454 | resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} 455 | engines: {node: '>=18'} 456 | cpu: [arm] 457 | os: [android] 458 | requiresBuild: true 459 | dev: true 460 | optional: true 461 | 462 | /@esbuild/android-arm@0.25.0: 463 | resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} 464 | engines: {node: '>=18'} 465 | cpu: [arm] 466 | os: [android] 467 | requiresBuild: true 468 | dev: true 469 | optional: true 470 | 471 | /@esbuild/android-x64@0.23.1: 472 | resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} 473 | engines: {node: '>=18'} 474 | cpu: [x64] 475 | os: [android] 476 | requiresBuild: true 477 | dev: true 478 | optional: true 479 | 480 | /@esbuild/android-x64@0.25.0: 481 | resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} 482 | engines: {node: '>=18'} 483 | cpu: [x64] 484 | os: [android] 485 | requiresBuild: true 486 | dev: true 487 | optional: true 488 | 489 | /@esbuild/darwin-arm64@0.23.1: 490 | resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} 491 | engines: {node: '>=18'} 492 | cpu: [arm64] 493 | os: [darwin] 494 | requiresBuild: true 495 | dev: true 496 | optional: true 497 | 498 | /@esbuild/darwin-arm64@0.25.0: 499 | resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} 500 | engines: {node: '>=18'} 501 | cpu: [arm64] 502 | os: [darwin] 503 | requiresBuild: true 504 | dev: true 505 | optional: true 506 | 507 | /@esbuild/darwin-x64@0.23.1: 508 | resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} 509 | engines: {node: '>=18'} 510 | cpu: [x64] 511 | os: [darwin] 512 | requiresBuild: true 513 | dev: true 514 | optional: true 515 | 516 | /@esbuild/darwin-x64@0.25.0: 517 | resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} 518 | engines: {node: '>=18'} 519 | cpu: [x64] 520 | os: [darwin] 521 | requiresBuild: true 522 | dev: true 523 | optional: true 524 | 525 | /@esbuild/freebsd-arm64@0.23.1: 526 | resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} 527 | engines: {node: '>=18'} 528 | cpu: [arm64] 529 | os: [freebsd] 530 | requiresBuild: true 531 | dev: true 532 | optional: true 533 | 534 | /@esbuild/freebsd-arm64@0.25.0: 535 | resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} 536 | engines: {node: '>=18'} 537 | cpu: [arm64] 538 | os: [freebsd] 539 | requiresBuild: true 540 | dev: true 541 | optional: true 542 | 543 | /@esbuild/freebsd-x64@0.23.1: 544 | resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} 545 | engines: {node: '>=18'} 546 | cpu: [x64] 547 | os: [freebsd] 548 | requiresBuild: true 549 | dev: true 550 | optional: true 551 | 552 | /@esbuild/freebsd-x64@0.25.0: 553 | resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} 554 | engines: {node: '>=18'} 555 | cpu: [x64] 556 | os: [freebsd] 557 | requiresBuild: true 558 | dev: true 559 | optional: true 560 | 561 | /@esbuild/linux-arm64@0.23.1: 562 | resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} 563 | engines: {node: '>=18'} 564 | cpu: [arm64] 565 | os: [linux] 566 | requiresBuild: true 567 | dev: true 568 | optional: true 569 | 570 | /@esbuild/linux-arm64@0.25.0: 571 | resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} 572 | engines: {node: '>=18'} 573 | cpu: [arm64] 574 | os: [linux] 575 | requiresBuild: true 576 | dev: true 577 | optional: true 578 | 579 | /@esbuild/linux-arm@0.23.1: 580 | resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} 581 | engines: {node: '>=18'} 582 | cpu: [arm] 583 | os: [linux] 584 | requiresBuild: true 585 | dev: true 586 | optional: true 587 | 588 | /@esbuild/linux-arm@0.25.0: 589 | resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} 590 | engines: {node: '>=18'} 591 | cpu: [arm] 592 | os: [linux] 593 | requiresBuild: true 594 | dev: true 595 | optional: true 596 | 597 | /@esbuild/linux-ia32@0.23.1: 598 | resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} 599 | engines: {node: '>=18'} 600 | cpu: [ia32] 601 | os: [linux] 602 | requiresBuild: true 603 | dev: true 604 | optional: true 605 | 606 | /@esbuild/linux-ia32@0.25.0: 607 | resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} 608 | engines: {node: '>=18'} 609 | cpu: [ia32] 610 | os: [linux] 611 | requiresBuild: true 612 | dev: true 613 | optional: true 614 | 615 | /@esbuild/linux-loong64@0.23.1: 616 | resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} 617 | engines: {node: '>=18'} 618 | cpu: [loong64] 619 | os: [linux] 620 | requiresBuild: true 621 | dev: true 622 | optional: true 623 | 624 | /@esbuild/linux-loong64@0.25.0: 625 | resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} 626 | engines: {node: '>=18'} 627 | cpu: [loong64] 628 | os: [linux] 629 | requiresBuild: true 630 | dev: true 631 | optional: true 632 | 633 | /@esbuild/linux-mips64el@0.23.1: 634 | resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} 635 | engines: {node: '>=18'} 636 | cpu: [mips64el] 637 | os: [linux] 638 | requiresBuild: true 639 | dev: true 640 | optional: true 641 | 642 | /@esbuild/linux-mips64el@0.25.0: 643 | resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} 644 | engines: {node: '>=18'} 645 | cpu: [mips64el] 646 | os: [linux] 647 | requiresBuild: true 648 | dev: true 649 | optional: true 650 | 651 | /@esbuild/linux-ppc64@0.23.1: 652 | resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} 653 | engines: {node: '>=18'} 654 | cpu: [ppc64] 655 | os: [linux] 656 | requiresBuild: true 657 | dev: true 658 | optional: true 659 | 660 | /@esbuild/linux-ppc64@0.25.0: 661 | resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} 662 | engines: {node: '>=18'} 663 | cpu: [ppc64] 664 | os: [linux] 665 | requiresBuild: true 666 | dev: true 667 | optional: true 668 | 669 | /@esbuild/linux-riscv64@0.23.1: 670 | resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} 671 | engines: {node: '>=18'} 672 | cpu: [riscv64] 673 | os: [linux] 674 | requiresBuild: true 675 | dev: true 676 | optional: true 677 | 678 | /@esbuild/linux-riscv64@0.25.0: 679 | resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} 680 | engines: {node: '>=18'} 681 | cpu: [riscv64] 682 | os: [linux] 683 | requiresBuild: true 684 | dev: true 685 | optional: true 686 | 687 | /@esbuild/linux-s390x@0.23.1: 688 | resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} 689 | engines: {node: '>=18'} 690 | cpu: [s390x] 691 | os: [linux] 692 | requiresBuild: true 693 | dev: true 694 | optional: true 695 | 696 | /@esbuild/linux-s390x@0.25.0: 697 | resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} 698 | engines: {node: '>=18'} 699 | cpu: [s390x] 700 | os: [linux] 701 | requiresBuild: true 702 | dev: true 703 | optional: true 704 | 705 | /@esbuild/linux-x64@0.23.1: 706 | resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} 707 | engines: {node: '>=18'} 708 | cpu: [x64] 709 | os: [linux] 710 | requiresBuild: true 711 | dev: true 712 | optional: true 713 | 714 | /@esbuild/linux-x64@0.25.0: 715 | resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} 716 | engines: {node: '>=18'} 717 | cpu: [x64] 718 | os: [linux] 719 | requiresBuild: true 720 | dev: true 721 | optional: true 722 | 723 | /@esbuild/netbsd-arm64@0.25.0: 724 | resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} 725 | engines: {node: '>=18'} 726 | cpu: [arm64] 727 | os: [netbsd] 728 | requiresBuild: true 729 | dev: true 730 | optional: true 731 | 732 | /@esbuild/netbsd-x64@0.23.1: 733 | resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} 734 | engines: {node: '>=18'} 735 | cpu: [x64] 736 | os: [netbsd] 737 | requiresBuild: true 738 | dev: true 739 | optional: true 740 | 741 | /@esbuild/netbsd-x64@0.25.0: 742 | resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} 743 | engines: {node: '>=18'} 744 | cpu: [x64] 745 | os: [netbsd] 746 | requiresBuild: true 747 | dev: true 748 | optional: true 749 | 750 | /@esbuild/openbsd-arm64@0.23.1: 751 | resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} 752 | engines: {node: '>=18'} 753 | cpu: [arm64] 754 | os: [openbsd] 755 | requiresBuild: true 756 | dev: true 757 | optional: true 758 | 759 | /@esbuild/openbsd-arm64@0.25.0: 760 | resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} 761 | engines: {node: '>=18'} 762 | cpu: [arm64] 763 | os: [openbsd] 764 | requiresBuild: true 765 | dev: true 766 | optional: true 767 | 768 | /@esbuild/openbsd-x64@0.23.1: 769 | resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} 770 | engines: {node: '>=18'} 771 | cpu: [x64] 772 | os: [openbsd] 773 | requiresBuild: true 774 | dev: true 775 | optional: true 776 | 777 | /@esbuild/openbsd-x64@0.25.0: 778 | resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} 779 | engines: {node: '>=18'} 780 | cpu: [x64] 781 | os: [openbsd] 782 | requiresBuild: true 783 | dev: true 784 | optional: true 785 | 786 | /@esbuild/sunos-x64@0.23.1: 787 | resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} 788 | engines: {node: '>=18'} 789 | cpu: [x64] 790 | os: [sunos] 791 | requiresBuild: true 792 | dev: true 793 | optional: true 794 | 795 | /@esbuild/sunos-x64@0.25.0: 796 | resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} 797 | engines: {node: '>=18'} 798 | cpu: [x64] 799 | os: [sunos] 800 | requiresBuild: true 801 | dev: true 802 | optional: true 803 | 804 | /@esbuild/win32-arm64@0.23.1: 805 | resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} 806 | engines: {node: '>=18'} 807 | cpu: [arm64] 808 | os: [win32] 809 | requiresBuild: true 810 | dev: true 811 | optional: true 812 | 813 | /@esbuild/win32-arm64@0.25.0: 814 | resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} 815 | engines: {node: '>=18'} 816 | cpu: [arm64] 817 | os: [win32] 818 | requiresBuild: true 819 | dev: true 820 | optional: true 821 | 822 | /@esbuild/win32-ia32@0.23.1: 823 | resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} 824 | engines: {node: '>=18'} 825 | cpu: [ia32] 826 | os: [win32] 827 | requiresBuild: true 828 | dev: true 829 | optional: true 830 | 831 | /@esbuild/win32-ia32@0.25.0: 832 | resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} 833 | engines: {node: '>=18'} 834 | cpu: [ia32] 835 | os: [win32] 836 | requiresBuild: true 837 | dev: true 838 | optional: true 839 | 840 | /@esbuild/win32-x64@0.23.1: 841 | resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} 842 | engines: {node: '>=18'} 843 | cpu: [x64] 844 | os: [win32] 845 | requiresBuild: true 846 | dev: true 847 | optional: true 848 | 849 | /@esbuild/win32-x64@0.25.0: 850 | resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} 851 | engines: {node: '>=18'} 852 | cpu: [x64] 853 | os: [win32] 854 | requiresBuild: true 855 | dev: true 856 | optional: true 857 | 858 | /@eslint-community/eslint-utils@4.4.0(eslint@8.57.1): 859 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 860 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 861 | peerDependencies: 862 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 863 | dependencies: 864 | eslint: 8.57.1 865 | eslint-visitor-keys: 3.4.3 866 | dev: true 867 | 868 | /@eslint-community/regexpp@4.11.1: 869 | resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} 870 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 871 | dev: true 872 | 873 | /@eslint/eslintrc@2.1.4: 874 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 875 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 876 | dependencies: 877 | ajv: 6.12.6 878 | debug: 4.3.7 879 | espree: 9.6.1 880 | globals: 13.24.0 881 | ignore: 5.3.2 882 | import-fresh: 3.3.0 883 | js-yaml: 4.1.0 884 | minimatch: 3.1.2 885 | strip-json-comments: 3.1.1 886 | transitivePeerDependencies: 887 | - supports-color 888 | dev: true 889 | 890 | /@eslint/js@8.57.1: 891 | resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} 892 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 893 | dev: true 894 | 895 | /@humanwhocodes/config-array@0.13.0: 896 | resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} 897 | engines: {node: '>=10.10.0'} 898 | deprecated: Use @eslint/config-array instead 899 | dependencies: 900 | '@humanwhocodes/object-schema': 2.0.3 901 | debug: 4.3.7 902 | minimatch: 3.1.2 903 | transitivePeerDependencies: 904 | - supports-color 905 | dev: true 906 | 907 | /@humanwhocodes/module-importer@1.0.1: 908 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 909 | engines: {node: '>=12.22'} 910 | dev: true 911 | 912 | /@humanwhocodes/object-schema@2.0.3: 913 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 914 | deprecated: Use @eslint/object-schema instead 915 | dev: true 916 | 917 | /@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3): 918 | resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==} 919 | peerDependencies: 920 | '@vue/compiler-sfc': 2.7.x || 3.x 921 | prettier: 2 || 3 922 | peerDependenciesMeta: 923 | '@vue/compiler-sfc': 924 | optional: true 925 | dependencies: 926 | '@babel/core': 7.25.2 927 | '@babel/generator': 7.25.6 928 | '@babel/parser': 7.25.6 929 | '@babel/traverse': 7.25.6 930 | '@babel/types': 7.25.6 931 | prettier: 3.3.3 932 | semver: 7.6.3 933 | transitivePeerDependencies: 934 | - supports-color 935 | dev: true 936 | 937 | /@isaacs/cliui@8.0.2: 938 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 939 | engines: {node: '>=12'} 940 | dependencies: 941 | string-width: 5.1.2 942 | string-width-cjs: /string-width@4.2.3 943 | strip-ansi: 7.1.0 944 | strip-ansi-cjs: /strip-ansi@6.0.1 945 | wrap-ansi: 8.1.0 946 | wrap-ansi-cjs: /wrap-ansi@7.0.0 947 | dev: true 948 | 949 | /@jridgewell/gen-mapping@0.3.5: 950 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 951 | engines: {node: '>=6.0.0'} 952 | dependencies: 953 | '@jridgewell/set-array': 1.2.1 954 | '@jridgewell/sourcemap-codec': 1.5.0 955 | '@jridgewell/trace-mapping': 0.3.25 956 | dev: true 957 | 958 | /@jridgewell/resolve-uri@3.1.2: 959 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 960 | engines: {node: '>=6.0.0'} 961 | dev: true 962 | 963 | /@jridgewell/set-array@1.2.1: 964 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 965 | engines: {node: '>=6.0.0'} 966 | dev: true 967 | 968 | /@jridgewell/sourcemap-codec@1.5.0: 969 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 970 | dev: true 971 | 972 | /@jridgewell/trace-mapping@0.3.25: 973 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 974 | dependencies: 975 | '@jridgewell/resolve-uri': 3.1.2 976 | '@jridgewell/sourcemap-codec': 1.5.0 977 | dev: true 978 | 979 | /@manypkg/find-root@1.1.0: 980 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 981 | dependencies: 982 | '@babel/runtime': 7.25.6 983 | '@types/node': 12.20.55 984 | find-up: 4.1.0 985 | fs-extra: 8.1.0 986 | dev: true 987 | 988 | /@manypkg/get-packages@1.1.3: 989 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 990 | dependencies: 991 | '@babel/runtime': 7.25.6 992 | '@changesets/types': 4.1.0 993 | '@manypkg/find-root': 1.1.0 994 | fs-extra: 8.1.0 995 | globby: 11.1.0 996 | read-yaml-file: 1.1.0 997 | dev: true 998 | 999 | /@msgpack/msgpack@3.1.0: 1000 | resolution: {integrity: sha512-igBxaq5JHWdJ0lDyKkCo00pDu+bNVuBAs/cHra6a3ndCw6vlZK9BGLuG7Fvmar/DXK2uJ25zvgcAZEl+AvLpjQ==} 1001 | engines: {node: '>= 18'} 1002 | dev: false 1003 | 1004 | /@nodelib/fs.scandir@2.1.5: 1005 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 1006 | engines: {node: '>= 8'} 1007 | dependencies: 1008 | '@nodelib/fs.stat': 2.0.5 1009 | run-parallel: 1.2.0 1010 | dev: true 1011 | 1012 | /@nodelib/fs.stat@2.0.5: 1013 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 1014 | engines: {node: '>= 8'} 1015 | dev: true 1016 | 1017 | /@nodelib/fs.walk@1.2.8: 1018 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 1019 | engines: {node: '>= 8'} 1020 | dependencies: 1021 | '@nodelib/fs.scandir': 2.1.5 1022 | fastq: 1.17.1 1023 | dev: true 1024 | 1025 | /@pkgjs/parseargs@0.11.0: 1026 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 1027 | engines: {node: '>=14'} 1028 | requiresBuild: true 1029 | dev: true 1030 | optional: true 1031 | 1032 | /@rollup/rollup-android-arm-eabi@4.21.3: 1033 | resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==} 1034 | cpu: [arm] 1035 | os: [android] 1036 | requiresBuild: true 1037 | dev: true 1038 | optional: true 1039 | 1040 | /@rollup/rollup-android-arm-eabi@4.34.9: 1041 | resolution: {integrity: sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==} 1042 | cpu: [arm] 1043 | os: [android] 1044 | requiresBuild: true 1045 | dev: true 1046 | optional: true 1047 | 1048 | /@rollup/rollup-android-arm64@4.21.3: 1049 | resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==} 1050 | cpu: [arm64] 1051 | os: [android] 1052 | requiresBuild: true 1053 | dev: true 1054 | optional: true 1055 | 1056 | /@rollup/rollup-android-arm64@4.34.9: 1057 | resolution: {integrity: sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==} 1058 | cpu: [arm64] 1059 | os: [android] 1060 | requiresBuild: true 1061 | dev: true 1062 | optional: true 1063 | 1064 | /@rollup/rollup-darwin-arm64@4.21.3: 1065 | resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==} 1066 | cpu: [arm64] 1067 | os: [darwin] 1068 | requiresBuild: true 1069 | dev: true 1070 | optional: true 1071 | 1072 | /@rollup/rollup-darwin-arm64@4.34.9: 1073 | resolution: {integrity: sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==} 1074 | cpu: [arm64] 1075 | os: [darwin] 1076 | requiresBuild: true 1077 | dev: true 1078 | optional: true 1079 | 1080 | /@rollup/rollup-darwin-x64@4.21.3: 1081 | resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==} 1082 | cpu: [x64] 1083 | os: [darwin] 1084 | requiresBuild: true 1085 | dev: true 1086 | optional: true 1087 | 1088 | /@rollup/rollup-darwin-x64@4.34.9: 1089 | resolution: {integrity: sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==} 1090 | cpu: [x64] 1091 | os: [darwin] 1092 | requiresBuild: true 1093 | dev: true 1094 | optional: true 1095 | 1096 | /@rollup/rollup-freebsd-arm64@4.34.9: 1097 | resolution: {integrity: sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==} 1098 | cpu: [arm64] 1099 | os: [freebsd] 1100 | requiresBuild: true 1101 | dev: true 1102 | optional: true 1103 | 1104 | /@rollup/rollup-freebsd-x64@4.34.9: 1105 | resolution: {integrity: sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==} 1106 | cpu: [x64] 1107 | os: [freebsd] 1108 | requiresBuild: true 1109 | dev: true 1110 | optional: true 1111 | 1112 | /@rollup/rollup-linux-arm-gnueabihf@4.21.3: 1113 | resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==} 1114 | cpu: [arm] 1115 | os: [linux] 1116 | requiresBuild: true 1117 | dev: true 1118 | optional: true 1119 | 1120 | /@rollup/rollup-linux-arm-gnueabihf@4.34.9: 1121 | resolution: {integrity: sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==} 1122 | cpu: [arm] 1123 | os: [linux] 1124 | requiresBuild: true 1125 | dev: true 1126 | optional: true 1127 | 1128 | /@rollup/rollup-linux-arm-musleabihf@4.21.3: 1129 | resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==} 1130 | cpu: [arm] 1131 | os: [linux] 1132 | requiresBuild: true 1133 | dev: true 1134 | optional: true 1135 | 1136 | /@rollup/rollup-linux-arm-musleabihf@4.34.9: 1137 | resolution: {integrity: sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==} 1138 | cpu: [arm] 1139 | os: [linux] 1140 | requiresBuild: true 1141 | dev: true 1142 | optional: true 1143 | 1144 | /@rollup/rollup-linux-arm64-gnu@4.21.3: 1145 | resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==} 1146 | cpu: [arm64] 1147 | os: [linux] 1148 | requiresBuild: true 1149 | dev: true 1150 | optional: true 1151 | 1152 | /@rollup/rollup-linux-arm64-gnu@4.34.9: 1153 | resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} 1154 | cpu: [arm64] 1155 | os: [linux] 1156 | requiresBuild: true 1157 | dev: true 1158 | optional: true 1159 | 1160 | /@rollup/rollup-linux-arm64-musl@4.21.3: 1161 | resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==} 1162 | cpu: [arm64] 1163 | os: [linux] 1164 | requiresBuild: true 1165 | dev: true 1166 | optional: true 1167 | 1168 | /@rollup/rollup-linux-arm64-musl@4.34.9: 1169 | resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} 1170 | cpu: [arm64] 1171 | os: [linux] 1172 | requiresBuild: true 1173 | dev: true 1174 | optional: true 1175 | 1176 | /@rollup/rollup-linux-loongarch64-gnu@4.34.9: 1177 | resolution: {integrity: sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==} 1178 | cpu: [loong64] 1179 | os: [linux] 1180 | requiresBuild: true 1181 | dev: true 1182 | optional: true 1183 | 1184 | /@rollup/rollup-linux-powerpc64le-gnu@4.21.3: 1185 | resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==} 1186 | cpu: [ppc64] 1187 | os: [linux] 1188 | requiresBuild: true 1189 | dev: true 1190 | optional: true 1191 | 1192 | /@rollup/rollup-linux-powerpc64le-gnu@4.34.9: 1193 | resolution: {integrity: sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==} 1194 | cpu: [ppc64] 1195 | os: [linux] 1196 | requiresBuild: true 1197 | dev: true 1198 | optional: true 1199 | 1200 | /@rollup/rollup-linux-riscv64-gnu@4.21.3: 1201 | resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==} 1202 | cpu: [riscv64] 1203 | os: [linux] 1204 | requiresBuild: true 1205 | dev: true 1206 | optional: true 1207 | 1208 | /@rollup/rollup-linux-riscv64-gnu@4.34.9: 1209 | resolution: {integrity: sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==} 1210 | cpu: [riscv64] 1211 | os: [linux] 1212 | requiresBuild: true 1213 | dev: true 1214 | optional: true 1215 | 1216 | /@rollup/rollup-linux-s390x-gnu@4.21.3: 1217 | resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==} 1218 | cpu: [s390x] 1219 | os: [linux] 1220 | requiresBuild: true 1221 | dev: true 1222 | optional: true 1223 | 1224 | /@rollup/rollup-linux-s390x-gnu@4.34.9: 1225 | resolution: {integrity: sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==} 1226 | cpu: [s390x] 1227 | os: [linux] 1228 | requiresBuild: true 1229 | dev: true 1230 | optional: true 1231 | 1232 | /@rollup/rollup-linux-x64-gnu@4.21.3: 1233 | resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==} 1234 | cpu: [x64] 1235 | os: [linux] 1236 | requiresBuild: true 1237 | dev: true 1238 | optional: true 1239 | 1240 | /@rollup/rollup-linux-x64-gnu@4.34.9: 1241 | resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} 1242 | cpu: [x64] 1243 | os: [linux] 1244 | requiresBuild: true 1245 | dev: true 1246 | optional: true 1247 | 1248 | /@rollup/rollup-linux-x64-musl@4.21.3: 1249 | resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==} 1250 | cpu: [x64] 1251 | os: [linux] 1252 | requiresBuild: true 1253 | dev: true 1254 | optional: true 1255 | 1256 | /@rollup/rollup-linux-x64-musl@4.34.9: 1257 | resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} 1258 | cpu: [x64] 1259 | os: [linux] 1260 | requiresBuild: true 1261 | dev: true 1262 | optional: true 1263 | 1264 | /@rollup/rollup-win32-arm64-msvc@4.21.3: 1265 | resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==} 1266 | cpu: [arm64] 1267 | os: [win32] 1268 | requiresBuild: true 1269 | dev: true 1270 | optional: true 1271 | 1272 | /@rollup/rollup-win32-arm64-msvc@4.34.9: 1273 | resolution: {integrity: sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==} 1274 | cpu: [arm64] 1275 | os: [win32] 1276 | requiresBuild: true 1277 | dev: true 1278 | optional: true 1279 | 1280 | /@rollup/rollup-win32-ia32-msvc@4.21.3: 1281 | resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==} 1282 | cpu: [ia32] 1283 | os: [win32] 1284 | requiresBuild: true 1285 | dev: true 1286 | optional: true 1287 | 1288 | /@rollup/rollup-win32-ia32-msvc@4.34.9: 1289 | resolution: {integrity: sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==} 1290 | cpu: [ia32] 1291 | os: [win32] 1292 | requiresBuild: true 1293 | dev: true 1294 | optional: true 1295 | 1296 | /@rollup/rollup-win32-x64-msvc@4.21.3: 1297 | resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==} 1298 | cpu: [x64] 1299 | os: [win32] 1300 | requiresBuild: true 1301 | dev: true 1302 | optional: true 1303 | 1304 | /@rollup/rollup-win32-x64-msvc@4.34.9: 1305 | resolution: {integrity: sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==} 1306 | cpu: [x64] 1307 | os: [win32] 1308 | requiresBuild: true 1309 | dev: true 1310 | optional: true 1311 | 1312 | /@se-oss/msgpack@1.0.0(@msgpack/msgpack@3.1.0): 1313 | resolution: {integrity: sha512-fRfNKjEtejD/aekxa16MPCoungYUHYVmUIxBF5y/Nf60vbnHd05GHX7cYpD/6rlnI2BKqheEVuzJIlD+QZgqhw==} 1314 | peerDependencies: 1315 | '@msgpack/msgpack': ^3.1 1316 | dependencies: 1317 | '@msgpack/msgpack': 3.1.0 1318 | dev: false 1319 | 1320 | /@sindresorhus/tsconfig@6.0.0: 1321 | resolution: {integrity: sha512-+fUdfuDd/7O2OZ9/UvJy76IEWn2Tpvm2l+rwUoS2Yz4jCUTSNOQQv2PLWrwekt8cPLwHmpHaBpay34bkBmVl2Q==} 1322 | engines: {node: '>=18'} 1323 | dev: true 1324 | 1325 | /@types/estree@1.0.5: 1326 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 1327 | dev: true 1328 | 1329 | /@types/estree@1.0.6: 1330 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 1331 | dev: true 1332 | 1333 | /@types/node@12.20.55: 1334 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 1335 | dev: true 1336 | 1337 | /@types/node@22.5.5: 1338 | resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} 1339 | dependencies: 1340 | undici-types: 6.19.8 1341 | dev: true 1342 | 1343 | /@types/semver@7.5.8: 1344 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 1345 | dev: true 1346 | 1347 | /@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0)(eslint@8.57.1)(typescript@5.6.2): 1348 | resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} 1349 | engines: {node: ^18.18.0 || >=20.0.0} 1350 | peerDependencies: 1351 | '@typescript-eslint/parser': ^7.0.0 1352 | eslint: ^8.56.0 1353 | typescript: '*' 1354 | peerDependenciesMeta: 1355 | typescript: 1356 | optional: true 1357 | dependencies: 1358 | '@eslint-community/regexpp': 4.11.1 1359 | '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.2) 1360 | '@typescript-eslint/scope-manager': 7.18.0 1361 | '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) 1362 | '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) 1363 | '@typescript-eslint/visitor-keys': 7.18.0 1364 | eslint: 8.57.1 1365 | graphemer: 1.4.0 1366 | ignore: 5.3.2 1367 | natural-compare: 1.4.0 1368 | ts-api-utils: 1.3.0(typescript@5.6.2) 1369 | typescript: 5.6.2 1370 | transitivePeerDependencies: 1371 | - supports-color 1372 | dev: true 1373 | 1374 | /@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2): 1375 | resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} 1376 | engines: {node: ^18.18.0 || >=20.0.0} 1377 | peerDependencies: 1378 | eslint: ^8.56.0 1379 | typescript: '*' 1380 | peerDependenciesMeta: 1381 | typescript: 1382 | optional: true 1383 | dependencies: 1384 | '@typescript-eslint/scope-manager': 7.18.0 1385 | '@typescript-eslint/types': 7.18.0 1386 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) 1387 | '@typescript-eslint/visitor-keys': 7.18.0 1388 | debug: 4.4.0 1389 | eslint: 8.57.1 1390 | typescript: 5.6.2 1391 | transitivePeerDependencies: 1392 | - supports-color 1393 | dev: true 1394 | 1395 | /@typescript-eslint/scope-manager@7.18.0: 1396 | resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} 1397 | engines: {node: ^18.18.0 || >=20.0.0} 1398 | dependencies: 1399 | '@typescript-eslint/types': 7.18.0 1400 | '@typescript-eslint/visitor-keys': 7.18.0 1401 | dev: true 1402 | 1403 | /@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.6.2): 1404 | resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} 1405 | engines: {node: ^18.18.0 || >=20.0.0} 1406 | peerDependencies: 1407 | eslint: ^8.56.0 1408 | typescript: '*' 1409 | peerDependenciesMeta: 1410 | typescript: 1411 | optional: true 1412 | dependencies: 1413 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) 1414 | '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) 1415 | debug: 4.3.7 1416 | eslint: 8.57.1 1417 | ts-api-utils: 1.3.0(typescript@5.6.2) 1418 | typescript: 5.6.2 1419 | transitivePeerDependencies: 1420 | - supports-color 1421 | dev: true 1422 | 1423 | /@typescript-eslint/types@7.18.0: 1424 | resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} 1425 | engines: {node: ^18.18.0 || >=20.0.0} 1426 | dev: true 1427 | 1428 | /@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.2): 1429 | resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} 1430 | engines: {node: ^18.18.0 || >=20.0.0} 1431 | peerDependencies: 1432 | typescript: '*' 1433 | peerDependenciesMeta: 1434 | typescript: 1435 | optional: true 1436 | dependencies: 1437 | '@typescript-eslint/types': 7.18.0 1438 | '@typescript-eslint/visitor-keys': 7.18.0 1439 | debug: 4.3.7 1440 | globby: 11.1.0 1441 | is-glob: 4.0.3 1442 | minimatch: 9.0.5 1443 | semver: 7.6.3 1444 | ts-api-utils: 1.3.0(typescript@5.6.2) 1445 | typescript: 5.6.2 1446 | transitivePeerDependencies: 1447 | - supports-color 1448 | dev: true 1449 | 1450 | /@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.6.2): 1451 | resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} 1452 | engines: {node: ^18.18.0 || >=20.0.0} 1453 | peerDependencies: 1454 | eslint: ^8.56.0 1455 | dependencies: 1456 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) 1457 | '@typescript-eslint/scope-manager': 7.18.0 1458 | '@typescript-eslint/types': 7.18.0 1459 | '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) 1460 | eslint: 8.57.1 1461 | transitivePeerDependencies: 1462 | - supports-color 1463 | - typescript 1464 | dev: true 1465 | 1466 | /@typescript-eslint/visitor-keys@7.18.0: 1467 | resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} 1468 | engines: {node: ^18.18.0 || >=20.0.0} 1469 | dependencies: 1470 | '@typescript-eslint/types': 7.18.0 1471 | eslint-visitor-keys: 3.4.3 1472 | dev: true 1473 | 1474 | /@ungap/structured-clone@1.2.0: 1475 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 1476 | dev: true 1477 | 1478 | /@vitest/expect@3.0.7: 1479 | resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==} 1480 | dependencies: 1481 | '@vitest/spy': 3.0.7 1482 | '@vitest/utils': 3.0.7 1483 | chai: 5.2.0 1484 | tinyrainbow: 2.0.0 1485 | dev: true 1486 | 1487 | /@vitest/mocker@3.0.7(vite@6.2.0): 1488 | resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==} 1489 | peerDependencies: 1490 | msw: ^2.4.9 1491 | vite: ^5.0.0 || ^6.0.0 1492 | peerDependenciesMeta: 1493 | msw: 1494 | optional: true 1495 | vite: 1496 | optional: true 1497 | dependencies: 1498 | '@vitest/spy': 3.0.7 1499 | estree-walker: 3.0.3 1500 | magic-string: 0.30.17 1501 | vite: 6.2.0(@types/node@22.5.5) 1502 | dev: true 1503 | 1504 | /@vitest/pretty-format@3.0.7: 1505 | resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==} 1506 | dependencies: 1507 | tinyrainbow: 2.0.0 1508 | dev: true 1509 | 1510 | /@vitest/runner@3.0.7: 1511 | resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==} 1512 | dependencies: 1513 | '@vitest/utils': 3.0.7 1514 | pathe: 2.0.3 1515 | dev: true 1516 | 1517 | /@vitest/snapshot@3.0.7: 1518 | resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==} 1519 | dependencies: 1520 | '@vitest/pretty-format': 3.0.7 1521 | magic-string: 0.30.17 1522 | pathe: 2.0.3 1523 | dev: true 1524 | 1525 | /@vitest/spy@3.0.7: 1526 | resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==} 1527 | dependencies: 1528 | tinyspy: 3.0.2 1529 | dev: true 1530 | 1531 | /@vitest/utils@3.0.7: 1532 | resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==} 1533 | dependencies: 1534 | '@vitest/pretty-format': 3.0.7 1535 | loupe: 3.1.3 1536 | tinyrainbow: 2.0.0 1537 | dev: true 1538 | 1539 | /acorn-jsx@5.3.2(acorn@8.12.1): 1540 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 1541 | peerDependencies: 1542 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 1543 | dependencies: 1544 | acorn: 8.12.1 1545 | dev: true 1546 | 1547 | /acorn@8.12.1: 1548 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} 1549 | engines: {node: '>=0.4.0'} 1550 | hasBin: true 1551 | dev: true 1552 | 1553 | /ajv@6.12.6: 1554 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 1555 | dependencies: 1556 | fast-deep-equal: 3.1.3 1557 | fast-json-stable-stringify: 2.1.0 1558 | json-schema-traverse: 0.4.1 1559 | uri-js: 4.4.1 1560 | dev: true 1561 | 1562 | /ansi-colors@4.1.3: 1563 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 1564 | engines: {node: '>=6'} 1565 | dev: true 1566 | 1567 | /ansi-regex@5.0.1: 1568 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1569 | engines: {node: '>=8'} 1570 | dev: true 1571 | 1572 | /ansi-regex@6.1.0: 1573 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 1574 | engines: {node: '>=12'} 1575 | dev: true 1576 | 1577 | /ansi-styles@3.2.1: 1578 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 1579 | engines: {node: '>=4'} 1580 | dependencies: 1581 | color-convert: 1.9.3 1582 | dev: true 1583 | 1584 | /ansi-styles@4.3.0: 1585 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1586 | engines: {node: '>=8'} 1587 | dependencies: 1588 | color-convert: 2.0.1 1589 | dev: true 1590 | 1591 | /ansi-styles@6.2.1: 1592 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 1593 | engines: {node: '>=12'} 1594 | dev: true 1595 | 1596 | /any-promise@1.3.0: 1597 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 1598 | dev: true 1599 | 1600 | /anymatch@3.1.3: 1601 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1602 | engines: {node: '>= 8'} 1603 | dependencies: 1604 | normalize-path: 3.0.0 1605 | picomatch: 2.3.1 1606 | dev: true 1607 | 1608 | /argparse@1.0.10: 1609 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 1610 | dependencies: 1611 | sprintf-js: 1.0.3 1612 | dev: true 1613 | 1614 | /argparse@2.0.1: 1615 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 1616 | dev: true 1617 | 1618 | /array-union@2.1.0: 1619 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 1620 | engines: {node: '>=8'} 1621 | dev: true 1622 | 1623 | /assertion-error@2.0.1: 1624 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 1625 | engines: {node: '>=12'} 1626 | dev: true 1627 | 1628 | /balanced-match@1.0.2: 1629 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1630 | dev: true 1631 | 1632 | /better-path-resolve@1.0.0: 1633 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 1634 | engines: {node: '>=4'} 1635 | dependencies: 1636 | is-windows: 1.0.2 1637 | dev: true 1638 | 1639 | /binary-extensions@2.3.0: 1640 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 1641 | engines: {node: '>=8'} 1642 | dev: true 1643 | 1644 | /brace-expansion@1.1.11: 1645 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1646 | dependencies: 1647 | balanced-match: 1.0.2 1648 | concat-map: 0.0.1 1649 | dev: true 1650 | 1651 | /brace-expansion@2.0.1: 1652 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1653 | dependencies: 1654 | balanced-match: 1.0.2 1655 | dev: true 1656 | 1657 | /braces@3.0.3: 1658 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 1659 | engines: {node: '>=8'} 1660 | dependencies: 1661 | fill-range: 7.1.1 1662 | dev: true 1663 | 1664 | /browserslist@4.23.3: 1665 | resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} 1666 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1667 | hasBin: true 1668 | dependencies: 1669 | caniuse-lite: 1.0.30001660 1670 | electron-to-chromium: 1.5.25 1671 | node-releases: 2.0.18 1672 | update-browserslist-db: 1.1.0(browserslist@4.23.3) 1673 | dev: true 1674 | 1675 | /bundle-require@5.0.0(esbuild@0.23.1): 1676 | resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} 1677 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1678 | peerDependencies: 1679 | esbuild: '>=0.18' 1680 | dependencies: 1681 | esbuild: 0.23.1 1682 | load-tsconfig: 0.2.5 1683 | dev: true 1684 | 1685 | /cac@6.7.14: 1686 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1687 | engines: {node: '>=8'} 1688 | dev: true 1689 | 1690 | /callsites@3.1.0: 1691 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1692 | engines: {node: '>=6'} 1693 | dev: true 1694 | 1695 | /caniuse-lite@1.0.30001660: 1696 | resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} 1697 | dev: true 1698 | 1699 | /chai@5.2.0: 1700 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 1701 | engines: {node: '>=12'} 1702 | dependencies: 1703 | assertion-error: 2.0.1 1704 | check-error: 2.1.1 1705 | deep-eql: 5.0.2 1706 | loupe: 3.1.1 1707 | pathval: 2.0.0 1708 | dev: true 1709 | 1710 | /chalk@2.4.2: 1711 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1712 | engines: {node: '>=4'} 1713 | dependencies: 1714 | ansi-styles: 3.2.1 1715 | escape-string-regexp: 1.0.5 1716 | supports-color: 5.5.0 1717 | dev: true 1718 | 1719 | /chalk@4.1.2: 1720 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1721 | engines: {node: '>=10'} 1722 | dependencies: 1723 | ansi-styles: 4.3.0 1724 | supports-color: 7.2.0 1725 | dev: true 1726 | 1727 | /chardet@0.7.0: 1728 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 1729 | dev: true 1730 | 1731 | /check-error@2.1.1: 1732 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 1733 | engines: {node: '>= 16'} 1734 | dev: true 1735 | 1736 | /chokidar@3.6.0: 1737 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 1738 | engines: {node: '>= 8.10.0'} 1739 | dependencies: 1740 | anymatch: 3.1.3 1741 | braces: 3.0.3 1742 | glob-parent: 5.1.2 1743 | is-binary-path: 2.1.0 1744 | is-glob: 4.0.3 1745 | normalize-path: 3.0.0 1746 | readdirp: 3.6.0 1747 | optionalDependencies: 1748 | fsevents: 2.3.3 1749 | dev: true 1750 | 1751 | /ci-info@3.9.0: 1752 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 1753 | engines: {node: '>=8'} 1754 | dev: true 1755 | 1756 | /color-convert@1.9.3: 1757 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1758 | dependencies: 1759 | color-name: 1.1.3 1760 | dev: true 1761 | 1762 | /color-convert@2.0.1: 1763 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1764 | engines: {node: '>=7.0.0'} 1765 | dependencies: 1766 | color-name: 1.1.4 1767 | dev: true 1768 | 1769 | /color-name@1.1.3: 1770 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1771 | dev: true 1772 | 1773 | /color-name@1.1.4: 1774 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1775 | dev: true 1776 | 1777 | /commander@4.1.1: 1778 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1779 | engines: {node: '>= 6'} 1780 | dev: true 1781 | 1782 | /concat-map@0.0.1: 1783 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1784 | dev: true 1785 | 1786 | /consola@3.2.3: 1787 | resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} 1788 | engines: {node: ^14.18.0 || >=16.10.0} 1789 | dev: true 1790 | 1791 | /convert-source-map@2.0.0: 1792 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1793 | dev: true 1794 | 1795 | /cross-spawn@5.1.0: 1796 | resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} 1797 | dependencies: 1798 | lru-cache: 4.1.5 1799 | shebang-command: 1.2.0 1800 | which: 1.3.1 1801 | dev: true 1802 | 1803 | /cross-spawn@7.0.3: 1804 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1805 | engines: {node: '>= 8'} 1806 | dependencies: 1807 | path-key: 3.1.1 1808 | shebang-command: 2.0.0 1809 | which: 2.0.2 1810 | dev: true 1811 | 1812 | /debounce@2.1.1: 1813 | resolution: {integrity: sha512-+xRWxgel9LgTC4PwKlm7TJUK6B6qsEK77NaiNvXmeQ7Y3e6OVVsBC4a9BSptS/mAYceyAz37Oa8JTTuPRft7uQ==} 1814 | engines: {node: '>=18'} 1815 | dev: false 1816 | 1817 | /debug@4.3.7: 1818 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 1819 | engines: {node: '>=6.0'} 1820 | peerDependencies: 1821 | supports-color: '*' 1822 | peerDependenciesMeta: 1823 | supports-color: 1824 | optional: true 1825 | dependencies: 1826 | ms: 2.1.3 1827 | dev: true 1828 | 1829 | /debug@4.4.0: 1830 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 1831 | engines: {node: '>=6.0'} 1832 | peerDependencies: 1833 | supports-color: '*' 1834 | peerDependenciesMeta: 1835 | supports-color: 1836 | optional: true 1837 | dependencies: 1838 | ms: 2.1.3 1839 | dev: true 1840 | 1841 | /deep-eql@5.0.2: 1842 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 1843 | engines: {node: '>=6'} 1844 | dev: true 1845 | 1846 | /deep-is@0.1.4: 1847 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1848 | dev: true 1849 | 1850 | /detect-indent@6.1.0: 1851 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 1852 | engines: {node: '>=8'} 1853 | dev: true 1854 | 1855 | /dir-glob@3.0.1: 1856 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1857 | engines: {node: '>=8'} 1858 | dependencies: 1859 | path-type: 4.0.0 1860 | dev: true 1861 | 1862 | /doctrine@3.0.0: 1863 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1864 | engines: {node: '>=6.0.0'} 1865 | dependencies: 1866 | esutils: 2.0.3 1867 | dev: true 1868 | 1869 | /eastasianwidth@0.2.0: 1870 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1871 | dev: true 1872 | 1873 | /electron-to-chromium@1.5.25: 1874 | resolution: {integrity: sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==} 1875 | dev: true 1876 | 1877 | /emoji-regex@8.0.0: 1878 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1879 | dev: true 1880 | 1881 | /emoji-regex@9.2.2: 1882 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1883 | dev: true 1884 | 1885 | /enquirer@2.4.1: 1886 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 1887 | engines: {node: '>=8.6'} 1888 | dependencies: 1889 | ansi-colors: 4.1.3 1890 | strip-ansi: 6.0.1 1891 | dev: true 1892 | 1893 | /es-module-lexer@1.6.0: 1894 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 1895 | dev: true 1896 | 1897 | /esbuild@0.23.1: 1898 | resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} 1899 | engines: {node: '>=18'} 1900 | hasBin: true 1901 | requiresBuild: true 1902 | optionalDependencies: 1903 | '@esbuild/aix-ppc64': 0.23.1 1904 | '@esbuild/android-arm': 0.23.1 1905 | '@esbuild/android-arm64': 0.23.1 1906 | '@esbuild/android-x64': 0.23.1 1907 | '@esbuild/darwin-arm64': 0.23.1 1908 | '@esbuild/darwin-x64': 0.23.1 1909 | '@esbuild/freebsd-arm64': 0.23.1 1910 | '@esbuild/freebsd-x64': 0.23.1 1911 | '@esbuild/linux-arm': 0.23.1 1912 | '@esbuild/linux-arm64': 0.23.1 1913 | '@esbuild/linux-ia32': 0.23.1 1914 | '@esbuild/linux-loong64': 0.23.1 1915 | '@esbuild/linux-mips64el': 0.23.1 1916 | '@esbuild/linux-ppc64': 0.23.1 1917 | '@esbuild/linux-riscv64': 0.23.1 1918 | '@esbuild/linux-s390x': 0.23.1 1919 | '@esbuild/linux-x64': 0.23.1 1920 | '@esbuild/netbsd-x64': 0.23.1 1921 | '@esbuild/openbsd-arm64': 0.23.1 1922 | '@esbuild/openbsd-x64': 0.23.1 1923 | '@esbuild/sunos-x64': 0.23.1 1924 | '@esbuild/win32-arm64': 0.23.1 1925 | '@esbuild/win32-ia32': 0.23.1 1926 | '@esbuild/win32-x64': 0.23.1 1927 | dev: true 1928 | 1929 | /esbuild@0.25.0: 1930 | resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} 1931 | engines: {node: '>=18'} 1932 | hasBin: true 1933 | requiresBuild: true 1934 | optionalDependencies: 1935 | '@esbuild/aix-ppc64': 0.25.0 1936 | '@esbuild/android-arm': 0.25.0 1937 | '@esbuild/android-arm64': 0.25.0 1938 | '@esbuild/android-x64': 0.25.0 1939 | '@esbuild/darwin-arm64': 0.25.0 1940 | '@esbuild/darwin-x64': 0.25.0 1941 | '@esbuild/freebsd-arm64': 0.25.0 1942 | '@esbuild/freebsd-x64': 0.25.0 1943 | '@esbuild/linux-arm': 0.25.0 1944 | '@esbuild/linux-arm64': 0.25.0 1945 | '@esbuild/linux-ia32': 0.25.0 1946 | '@esbuild/linux-loong64': 0.25.0 1947 | '@esbuild/linux-mips64el': 0.25.0 1948 | '@esbuild/linux-ppc64': 0.25.0 1949 | '@esbuild/linux-riscv64': 0.25.0 1950 | '@esbuild/linux-s390x': 0.25.0 1951 | '@esbuild/linux-x64': 0.25.0 1952 | '@esbuild/netbsd-arm64': 0.25.0 1953 | '@esbuild/netbsd-x64': 0.25.0 1954 | '@esbuild/openbsd-arm64': 0.25.0 1955 | '@esbuild/openbsd-x64': 0.25.0 1956 | '@esbuild/sunos-x64': 0.25.0 1957 | '@esbuild/win32-arm64': 0.25.0 1958 | '@esbuild/win32-ia32': 0.25.0 1959 | '@esbuild/win32-x64': 0.25.0 1960 | dev: true 1961 | 1962 | /escalade@3.2.0: 1963 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1964 | engines: {node: '>=6'} 1965 | dev: true 1966 | 1967 | /escape-string-regexp@1.0.5: 1968 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1969 | engines: {node: '>=0.8.0'} 1970 | dev: true 1971 | 1972 | /escape-string-regexp@4.0.0: 1973 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1974 | engines: {node: '>=10'} 1975 | dev: true 1976 | 1977 | /eslint-scope@7.2.2: 1978 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1979 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1980 | dependencies: 1981 | esrecurse: 4.3.0 1982 | estraverse: 5.3.0 1983 | dev: true 1984 | 1985 | /eslint-visitor-keys@3.4.3: 1986 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1987 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1988 | dev: true 1989 | 1990 | /eslint@8.57.1: 1991 | resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} 1992 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1993 | hasBin: true 1994 | dependencies: 1995 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) 1996 | '@eslint-community/regexpp': 4.11.1 1997 | '@eslint/eslintrc': 2.1.4 1998 | '@eslint/js': 8.57.1 1999 | '@humanwhocodes/config-array': 0.13.0 2000 | '@humanwhocodes/module-importer': 1.0.1 2001 | '@nodelib/fs.walk': 1.2.8 2002 | '@ungap/structured-clone': 1.2.0 2003 | ajv: 6.12.6 2004 | chalk: 4.1.2 2005 | cross-spawn: 7.0.3 2006 | debug: 4.3.7 2007 | doctrine: 3.0.0 2008 | escape-string-regexp: 4.0.0 2009 | eslint-scope: 7.2.2 2010 | eslint-visitor-keys: 3.4.3 2011 | espree: 9.6.1 2012 | esquery: 1.6.0 2013 | esutils: 2.0.3 2014 | fast-deep-equal: 3.1.3 2015 | file-entry-cache: 6.0.1 2016 | find-up: 5.0.0 2017 | glob-parent: 6.0.2 2018 | globals: 13.24.0 2019 | graphemer: 1.4.0 2020 | ignore: 5.3.2 2021 | imurmurhash: 0.1.4 2022 | is-glob: 4.0.3 2023 | is-path-inside: 3.0.3 2024 | js-yaml: 4.1.0 2025 | json-stable-stringify-without-jsonify: 1.0.1 2026 | levn: 0.4.1 2027 | lodash.merge: 4.6.2 2028 | minimatch: 3.1.2 2029 | natural-compare: 1.4.0 2030 | optionator: 0.9.4 2031 | strip-ansi: 6.0.1 2032 | text-table: 0.2.0 2033 | transitivePeerDependencies: 2034 | - supports-color 2035 | dev: true 2036 | 2037 | /espree@9.6.1: 2038 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 2039 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 2040 | dependencies: 2041 | acorn: 8.12.1 2042 | acorn-jsx: 5.3.2(acorn@8.12.1) 2043 | eslint-visitor-keys: 3.4.3 2044 | dev: true 2045 | 2046 | /esprima@4.0.1: 2047 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 2048 | engines: {node: '>=4'} 2049 | hasBin: true 2050 | dev: true 2051 | 2052 | /esquery@1.6.0: 2053 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 2054 | engines: {node: '>=0.10'} 2055 | dependencies: 2056 | estraverse: 5.3.0 2057 | dev: true 2058 | 2059 | /esrecurse@4.3.0: 2060 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 2061 | engines: {node: '>=4.0'} 2062 | dependencies: 2063 | estraverse: 5.3.0 2064 | dev: true 2065 | 2066 | /estraverse@5.3.0: 2067 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 2068 | engines: {node: '>=4.0'} 2069 | dev: true 2070 | 2071 | /estree-walker@3.0.3: 2072 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 2073 | dependencies: 2074 | '@types/estree': 1.0.5 2075 | dev: true 2076 | 2077 | /esutils@2.0.3: 2078 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 2079 | engines: {node: '>=0.10.0'} 2080 | dev: true 2081 | 2082 | /execa@5.1.1: 2083 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 2084 | engines: {node: '>=10'} 2085 | dependencies: 2086 | cross-spawn: 7.0.3 2087 | get-stream: 6.0.1 2088 | human-signals: 2.1.0 2089 | is-stream: 2.0.1 2090 | merge-stream: 2.0.0 2091 | npm-run-path: 4.0.1 2092 | onetime: 5.1.2 2093 | signal-exit: 3.0.7 2094 | strip-final-newline: 2.0.0 2095 | dev: true 2096 | 2097 | /exit-hook@4.0.0: 2098 | resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} 2099 | engines: {node: '>=18'} 2100 | dev: false 2101 | 2102 | /expect-type@1.2.0: 2103 | resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} 2104 | engines: {node: '>=12.0.0'} 2105 | dev: true 2106 | 2107 | /extendable-error@0.1.7: 2108 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 2109 | dev: true 2110 | 2111 | /external-editor@3.1.0: 2112 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 2113 | engines: {node: '>=4'} 2114 | dependencies: 2115 | chardet: 0.7.0 2116 | iconv-lite: 0.4.24 2117 | tmp: 0.0.33 2118 | dev: true 2119 | 2120 | /fast-deep-equal@3.1.3: 2121 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 2122 | dev: true 2123 | 2124 | /fast-glob@3.3.2: 2125 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 2126 | engines: {node: '>=8.6.0'} 2127 | dependencies: 2128 | '@nodelib/fs.stat': 2.0.5 2129 | '@nodelib/fs.walk': 1.2.8 2130 | glob-parent: 5.1.2 2131 | merge2: 1.4.1 2132 | micromatch: 4.0.8 2133 | dev: true 2134 | 2135 | /fast-json-stable-stringify@2.1.0: 2136 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 2137 | dev: true 2138 | 2139 | /fast-levenshtein@2.0.6: 2140 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 2141 | dev: true 2142 | 2143 | /fastq@1.17.1: 2144 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 2145 | dependencies: 2146 | reusify: 1.0.4 2147 | dev: true 2148 | 2149 | /fdir@6.3.0(picomatch@4.0.2): 2150 | resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} 2151 | peerDependencies: 2152 | picomatch: ^3 || ^4 2153 | peerDependenciesMeta: 2154 | picomatch: 2155 | optional: true 2156 | dependencies: 2157 | picomatch: 4.0.2 2158 | dev: true 2159 | 2160 | /file-entry-cache@6.0.1: 2161 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 2162 | engines: {node: ^10.12.0 || >=12.0.0} 2163 | dependencies: 2164 | flat-cache: 3.2.0 2165 | dev: true 2166 | 2167 | /fill-range@7.1.1: 2168 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 2169 | engines: {node: '>=8'} 2170 | dependencies: 2171 | to-regex-range: 5.0.1 2172 | dev: true 2173 | 2174 | /find-up@4.1.0: 2175 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 2176 | engines: {node: '>=8'} 2177 | dependencies: 2178 | locate-path: 5.0.0 2179 | path-exists: 4.0.0 2180 | dev: true 2181 | 2182 | /find-up@5.0.0: 2183 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 2184 | engines: {node: '>=10'} 2185 | dependencies: 2186 | locate-path: 6.0.0 2187 | path-exists: 4.0.0 2188 | dev: true 2189 | 2190 | /flat-cache@3.2.0: 2191 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 2192 | engines: {node: ^10.12.0 || >=12.0.0} 2193 | dependencies: 2194 | flatted: 3.3.1 2195 | keyv: 4.5.4 2196 | rimraf: 3.0.2 2197 | dev: true 2198 | 2199 | /flatted@3.3.1: 2200 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 2201 | dev: true 2202 | 2203 | /foreground-child@3.3.0: 2204 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 2205 | engines: {node: '>=14'} 2206 | dependencies: 2207 | cross-spawn: 7.0.3 2208 | signal-exit: 4.1.0 2209 | dev: true 2210 | 2211 | /fs-extra@7.0.1: 2212 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 2213 | engines: {node: '>=6 <7 || >=8'} 2214 | dependencies: 2215 | graceful-fs: 4.2.11 2216 | jsonfile: 4.0.0 2217 | universalify: 0.1.2 2218 | dev: true 2219 | 2220 | /fs-extra@8.1.0: 2221 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 2222 | engines: {node: '>=6 <7 || >=8'} 2223 | dependencies: 2224 | graceful-fs: 4.2.11 2225 | jsonfile: 4.0.0 2226 | universalify: 0.1.2 2227 | dev: true 2228 | 2229 | /fs.realpath@1.0.0: 2230 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 2231 | dev: true 2232 | 2233 | /fsevents@2.3.3: 2234 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 2235 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 2236 | os: [darwin] 2237 | requiresBuild: true 2238 | dev: true 2239 | optional: true 2240 | 2241 | /gensync@1.0.0-beta.2: 2242 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 2243 | engines: {node: '>=6.9.0'} 2244 | dev: true 2245 | 2246 | /get-func-name@2.0.2: 2247 | resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 2248 | dev: true 2249 | 2250 | /get-stream@6.0.1: 2251 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 2252 | engines: {node: '>=10'} 2253 | dev: true 2254 | 2255 | /glob-parent@5.1.2: 2256 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 2257 | engines: {node: '>= 6'} 2258 | dependencies: 2259 | is-glob: 4.0.3 2260 | dev: true 2261 | 2262 | /glob-parent@6.0.2: 2263 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 2264 | engines: {node: '>=10.13.0'} 2265 | dependencies: 2266 | is-glob: 4.0.3 2267 | dev: true 2268 | 2269 | /glob@10.4.5: 2270 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 2271 | hasBin: true 2272 | dependencies: 2273 | foreground-child: 3.3.0 2274 | jackspeak: 3.4.3 2275 | minimatch: 9.0.5 2276 | minipass: 7.1.2 2277 | package-json-from-dist: 1.0.0 2278 | path-scurry: 1.11.1 2279 | dev: true 2280 | 2281 | /glob@7.2.3: 2282 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 2283 | deprecated: Glob versions prior to v9 are no longer supported 2284 | dependencies: 2285 | fs.realpath: 1.0.0 2286 | inflight: 1.0.6 2287 | inherits: 2.0.4 2288 | minimatch: 3.1.2 2289 | once: 1.4.0 2290 | path-is-absolute: 1.0.1 2291 | dev: true 2292 | 2293 | /globals@11.12.0: 2294 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 2295 | engines: {node: '>=4'} 2296 | dev: true 2297 | 2298 | /globals@13.24.0: 2299 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 2300 | engines: {node: '>=8'} 2301 | dependencies: 2302 | type-fest: 0.20.2 2303 | dev: true 2304 | 2305 | /globby@11.1.0: 2306 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 2307 | engines: {node: '>=10'} 2308 | dependencies: 2309 | array-union: 2.1.0 2310 | dir-glob: 3.0.1 2311 | fast-glob: 3.3.2 2312 | ignore: 5.3.2 2313 | merge2: 1.4.1 2314 | slash: 3.0.0 2315 | dev: true 2316 | 2317 | /graceful-fs@4.2.11: 2318 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 2319 | dev: true 2320 | 2321 | /graphemer@1.4.0: 2322 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 2323 | dev: true 2324 | 2325 | /has-flag@3.0.0: 2326 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 2327 | engines: {node: '>=4'} 2328 | dev: true 2329 | 2330 | /has-flag@4.0.0: 2331 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 2332 | engines: {node: '>=8'} 2333 | dev: true 2334 | 2335 | /human-id@1.0.2: 2336 | resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} 2337 | dev: true 2338 | 2339 | /human-signals@2.1.0: 2340 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 2341 | engines: {node: '>=10.17.0'} 2342 | dev: true 2343 | 2344 | /iconv-lite@0.4.24: 2345 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 2346 | engines: {node: '>=0.10.0'} 2347 | dependencies: 2348 | safer-buffer: 2.1.2 2349 | dev: true 2350 | 2351 | /ignore@5.3.2: 2352 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 2353 | engines: {node: '>= 4'} 2354 | dev: true 2355 | 2356 | /import-fresh@3.3.0: 2357 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 2358 | engines: {node: '>=6'} 2359 | dependencies: 2360 | parent-module: 1.0.1 2361 | resolve-from: 4.0.0 2362 | dev: true 2363 | 2364 | /imurmurhash@0.1.4: 2365 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 2366 | engines: {node: '>=0.8.19'} 2367 | dev: true 2368 | 2369 | /inflight@1.0.6: 2370 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 2371 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 2372 | dependencies: 2373 | once: 1.4.0 2374 | wrappy: 1.0.2 2375 | dev: true 2376 | 2377 | /inherits@2.0.4: 2378 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 2379 | dev: true 2380 | 2381 | /is-binary-path@2.1.0: 2382 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 2383 | engines: {node: '>=8'} 2384 | dependencies: 2385 | binary-extensions: 2.3.0 2386 | dev: true 2387 | 2388 | /is-extglob@2.1.1: 2389 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 2390 | engines: {node: '>=0.10.0'} 2391 | dev: true 2392 | 2393 | /is-fullwidth-code-point@3.0.0: 2394 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 2395 | engines: {node: '>=8'} 2396 | dev: true 2397 | 2398 | /is-glob@4.0.3: 2399 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 2400 | engines: {node: '>=0.10.0'} 2401 | dependencies: 2402 | is-extglob: 2.1.1 2403 | dev: true 2404 | 2405 | /is-number@7.0.0: 2406 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 2407 | engines: {node: '>=0.12.0'} 2408 | dev: true 2409 | 2410 | /is-path-inside@3.0.3: 2411 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 2412 | engines: {node: '>=8'} 2413 | dev: true 2414 | 2415 | /is-stream@2.0.1: 2416 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 2417 | engines: {node: '>=8'} 2418 | dev: true 2419 | 2420 | /is-subdir@1.2.0: 2421 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 2422 | engines: {node: '>=4'} 2423 | dependencies: 2424 | better-path-resolve: 1.0.0 2425 | dev: true 2426 | 2427 | /is-windows@1.0.2: 2428 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 2429 | engines: {node: '>=0.10.0'} 2430 | dev: true 2431 | 2432 | /isexe@2.0.0: 2433 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2434 | dev: true 2435 | 2436 | /jackspeak@3.4.3: 2437 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 2438 | dependencies: 2439 | '@isaacs/cliui': 8.0.2 2440 | optionalDependencies: 2441 | '@pkgjs/parseargs': 0.11.0 2442 | dev: true 2443 | 2444 | /joycon@3.1.1: 2445 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 2446 | engines: {node: '>=10'} 2447 | dev: true 2448 | 2449 | /js-tokens@4.0.0: 2450 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2451 | dev: true 2452 | 2453 | /js-yaml@3.14.1: 2454 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 2455 | hasBin: true 2456 | dependencies: 2457 | argparse: 1.0.10 2458 | esprima: 4.0.1 2459 | dev: true 2460 | 2461 | /js-yaml@4.1.0: 2462 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2463 | hasBin: true 2464 | dependencies: 2465 | argparse: 2.0.1 2466 | dev: true 2467 | 2468 | /jsesc@2.5.2: 2469 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2470 | engines: {node: '>=4'} 2471 | hasBin: true 2472 | dev: true 2473 | 2474 | /json-buffer@3.0.1: 2475 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 2476 | dev: true 2477 | 2478 | /json-schema-traverse@0.4.1: 2479 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 2480 | dev: true 2481 | 2482 | /json-stable-stringify-without-jsonify@1.0.1: 2483 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 2484 | dev: true 2485 | 2486 | /json5@2.2.3: 2487 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 2488 | engines: {node: '>=6'} 2489 | hasBin: true 2490 | dev: true 2491 | 2492 | /jsonfile@4.0.0: 2493 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 2494 | optionalDependencies: 2495 | graceful-fs: 4.2.11 2496 | dev: true 2497 | 2498 | /keyv@4.5.4: 2499 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 2500 | dependencies: 2501 | json-buffer: 3.0.1 2502 | dev: true 2503 | 2504 | /levn@0.4.1: 2505 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 2506 | engines: {node: '>= 0.8.0'} 2507 | dependencies: 2508 | prelude-ls: 1.2.1 2509 | type-check: 0.4.0 2510 | dev: true 2511 | 2512 | /lilconfig@3.1.2: 2513 | resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} 2514 | engines: {node: '>=14'} 2515 | dev: true 2516 | 2517 | /lines-and-columns@1.2.4: 2518 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 2519 | dev: true 2520 | 2521 | /load-tsconfig@0.2.5: 2522 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 2523 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2524 | dev: true 2525 | 2526 | /locate-path@5.0.0: 2527 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 2528 | engines: {node: '>=8'} 2529 | dependencies: 2530 | p-locate: 4.1.0 2531 | dev: true 2532 | 2533 | /locate-path@6.0.0: 2534 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 2535 | engines: {node: '>=10'} 2536 | dependencies: 2537 | p-locate: 5.0.0 2538 | dev: true 2539 | 2540 | /lodash.merge@4.6.2: 2541 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 2542 | dev: true 2543 | 2544 | /lodash.sortby@4.7.0: 2545 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 2546 | dev: true 2547 | 2548 | /lodash.startcase@4.4.0: 2549 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 2550 | dev: true 2551 | 2552 | /loupe@3.1.1: 2553 | resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} 2554 | dependencies: 2555 | get-func-name: 2.0.2 2556 | dev: true 2557 | 2558 | /loupe@3.1.3: 2559 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 2560 | dev: true 2561 | 2562 | /lru-cache@10.4.3: 2563 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 2564 | dev: true 2565 | 2566 | /lru-cache@4.1.5: 2567 | resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} 2568 | dependencies: 2569 | pseudomap: 1.0.2 2570 | yallist: 2.1.2 2571 | dev: true 2572 | 2573 | /lru-cache@5.1.1: 2574 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2575 | dependencies: 2576 | yallist: 3.1.1 2577 | dev: true 2578 | 2579 | /magic-string@0.30.17: 2580 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 2581 | dependencies: 2582 | '@jridgewell/sourcemap-codec': 1.5.0 2583 | dev: true 2584 | 2585 | /merge-stream@2.0.0: 2586 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2587 | dev: true 2588 | 2589 | /merge2@1.4.1: 2590 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2591 | engines: {node: '>= 8'} 2592 | dev: true 2593 | 2594 | /micromatch@4.0.8: 2595 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 2596 | engines: {node: '>=8.6'} 2597 | dependencies: 2598 | braces: 3.0.3 2599 | picomatch: 2.3.1 2600 | dev: true 2601 | 2602 | /mimic-fn@2.1.0: 2603 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2604 | engines: {node: '>=6'} 2605 | dev: true 2606 | 2607 | /minimatch@3.1.2: 2608 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2609 | dependencies: 2610 | brace-expansion: 1.1.11 2611 | dev: true 2612 | 2613 | /minimatch@9.0.5: 2614 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 2615 | engines: {node: '>=16 || 14 >=14.17'} 2616 | dependencies: 2617 | brace-expansion: 2.0.1 2618 | dev: true 2619 | 2620 | /minipass@7.1.2: 2621 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 2622 | engines: {node: '>=16 || 14 >=14.17'} 2623 | dev: true 2624 | 2625 | /mri@1.2.0: 2626 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 2627 | engines: {node: '>=4'} 2628 | dev: true 2629 | 2630 | /ms@2.1.3: 2631 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2632 | dev: true 2633 | 2634 | /mz@2.7.0: 2635 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 2636 | dependencies: 2637 | any-promise: 1.3.0 2638 | object-assign: 4.1.1 2639 | thenify-all: 1.6.0 2640 | dev: true 2641 | 2642 | /nanoid@3.3.8: 2643 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 2644 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 2645 | hasBin: true 2646 | dev: true 2647 | 2648 | /natural-compare@1.4.0: 2649 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2650 | dev: true 2651 | 2652 | /node-releases@2.0.18: 2653 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 2654 | dev: true 2655 | 2656 | /normalize-path@3.0.0: 2657 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2658 | engines: {node: '>=0.10.0'} 2659 | dev: true 2660 | 2661 | /npm-run-path@4.0.1: 2662 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2663 | engines: {node: '>=8'} 2664 | dependencies: 2665 | path-key: 3.1.1 2666 | dev: true 2667 | 2668 | /object-assign@4.1.1: 2669 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 2670 | engines: {node: '>=0.10.0'} 2671 | dev: true 2672 | 2673 | /once@1.4.0: 2674 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2675 | dependencies: 2676 | wrappy: 1.0.2 2677 | dev: true 2678 | 2679 | /onetime@5.1.2: 2680 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2681 | engines: {node: '>=6'} 2682 | dependencies: 2683 | mimic-fn: 2.1.0 2684 | dev: true 2685 | 2686 | /optionator@0.9.4: 2687 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 2688 | engines: {node: '>= 0.8.0'} 2689 | dependencies: 2690 | deep-is: 0.1.4 2691 | fast-levenshtein: 2.0.6 2692 | levn: 0.4.1 2693 | prelude-ls: 1.2.1 2694 | type-check: 0.4.0 2695 | word-wrap: 1.2.5 2696 | dev: true 2697 | 2698 | /os-tmpdir@1.0.2: 2699 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 2700 | engines: {node: '>=0.10.0'} 2701 | dev: true 2702 | 2703 | /outdent@0.5.0: 2704 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 2705 | dev: true 2706 | 2707 | /p-filter@2.1.0: 2708 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 2709 | engines: {node: '>=8'} 2710 | dependencies: 2711 | p-map: 2.1.0 2712 | dev: true 2713 | 2714 | /p-limit@2.3.0: 2715 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2716 | engines: {node: '>=6'} 2717 | dependencies: 2718 | p-try: 2.2.0 2719 | dev: true 2720 | 2721 | /p-limit@3.1.0: 2722 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2723 | engines: {node: '>=10'} 2724 | dependencies: 2725 | yocto-queue: 0.1.0 2726 | dev: true 2727 | 2728 | /p-locate@4.1.0: 2729 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2730 | engines: {node: '>=8'} 2731 | dependencies: 2732 | p-limit: 2.3.0 2733 | dev: true 2734 | 2735 | /p-locate@5.0.0: 2736 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2737 | engines: {node: '>=10'} 2738 | dependencies: 2739 | p-limit: 3.1.0 2740 | dev: true 2741 | 2742 | /p-map@2.1.0: 2743 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 2744 | engines: {node: '>=6'} 2745 | dev: true 2746 | 2747 | /p-try@2.2.0: 2748 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2749 | engines: {node: '>=6'} 2750 | dev: true 2751 | 2752 | /package-json-from-dist@1.0.0: 2753 | resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} 2754 | dev: true 2755 | 2756 | /package-manager-detector@0.2.0: 2757 | resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} 2758 | dev: true 2759 | 2760 | /parent-module@1.0.1: 2761 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2762 | engines: {node: '>=6'} 2763 | dependencies: 2764 | callsites: 3.1.0 2765 | dev: true 2766 | 2767 | /path-exists@4.0.0: 2768 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2769 | engines: {node: '>=8'} 2770 | dev: true 2771 | 2772 | /path-is-absolute@1.0.1: 2773 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2774 | engines: {node: '>=0.10.0'} 2775 | dev: true 2776 | 2777 | /path-key@3.1.1: 2778 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2779 | engines: {node: '>=8'} 2780 | dev: true 2781 | 2782 | /path-scurry@1.11.1: 2783 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 2784 | engines: {node: '>=16 || 14 >=14.18'} 2785 | dependencies: 2786 | lru-cache: 10.4.3 2787 | minipass: 7.1.2 2788 | dev: true 2789 | 2790 | /path-type@4.0.0: 2791 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2792 | engines: {node: '>=8'} 2793 | dev: true 2794 | 2795 | /pathe@2.0.3: 2796 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 2797 | dev: true 2798 | 2799 | /pathval@2.0.0: 2800 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 2801 | engines: {node: '>= 14.16'} 2802 | dev: true 2803 | 2804 | /picocolors@1.1.0: 2805 | resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} 2806 | dev: true 2807 | 2808 | /picocolors@1.1.1: 2809 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 2810 | dev: true 2811 | 2812 | /picomatch@2.3.1: 2813 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2814 | engines: {node: '>=8.6'} 2815 | dev: true 2816 | 2817 | /picomatch@4.0.2: 2818 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 2819 | engines: {node: '>=12'} 2820 | dev: true 2821 | 2822 | /pify@4.0.1: 2823 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 2824 | engines: {node: '>=6'} 2825 | dev: true 2826 | 2827 | /pirates@4.0.6: 2828 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2829 | engines: {node: '>= 6'} 2830 | dev: true 2831 | 2832 | /postcss-load-config@6.0.1: 2833 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 2834 | engines: {node: '>= 18'} 2835 | peerDependencies: 2836 | jiti: '>=1.21.0' 2837 | postcss: '>=8.0.9' 2838 | tsx: ^4.8.1 2839 | yaml: ^2.4.2 2840 | peerDependenciesMeta: 2841 | jiti: 2842 | optional: true 2843 | postcss: 2844 | optional: true 2845 | tsx: 2846 | optional: true 2847 | yaml: 2848 | optional: true 2849 | dependencies: 2850 | lilconfig: 3.1.2 2851 | dev: true 2852 | 2853 | /postcss@8.5.3: 2854 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 2855 | engines: {node: ^10 || ^12 || >=14} 2856 | dependencies: 2857 | nanoid: 3.3.8 2858 | picocolors: 1.1.1 2859 | source-map-js: 1.2.1 2860 | dev: true 2861 | 2862 | /prelude-ls@1.2.1: 2863 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2864 | engines: {node: '>= 0.8.0'} 2865 | dev: true 2866 | 2867 | /prettier@2.8.8: 2868 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 2869 | engines: {node: '>=10.13.0'} 2870 | hasBin: true 2871 | dev: true 2872 | 2873 | /prettier@3.3.3: 2874 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 2875 | engines: {node: '>=14'} 2876 | hasBin: true 2877 | dev: true 2878 | 2879 | /pseudomap@1.0.2: 2880 | resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} 2881 | dev: true 2882 | 2883 | /punycode@2.3.1: 2884 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2885 | engines: {node: '>=6'} 2886 | dev: true 2887 | 2888 | /queue-microtask@1.2.3: 2889 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2890 | dev: true 2891 | 2892 | /read-yaml-file@1.1.0: 2893 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 2894 | engines: {node: '>=6'} 2895 | dependencies: 2896 | graceful-fs: 4.2.11 2897 | js-yaml: 3.14.1 2898 | pify: 4.0.1 2899 | strip-bom: 3.0.0 2900 | dev: true 2901 | 2902 | /readdirp@3.6.0: 2903 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2904 | engines: {node: '>=8.10.0'} 2905 | dependencies: 2906 | picomatch: 2.3.1 2907 | dev: true 2908 | 2909 | /regenerator-runtime@0.14.1: 2910 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 2911 | dev: true 2912 | 2913 | /resolve-from@4.0.0: 2914 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2915 | engines: {node: '>=4'} 2916 | dev: true 2917 | 2918 | /resolve-from@5.0.0: 2919 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2920 | engines: {node: '>=8'} 2921 | dev: true 2922 | 2923 | /reusify@1.0.4: 2924 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2925 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2926 | dev: true 2927 | 2928 | /rimraf@3.0.2: 2929 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2930 | deprecated: Rimraf versions prior to v4 are no longer supported 2931 | hasBin: true 2932 | dependencies: 2933 | glob: 7.2.3 2934 | dev: true 2935 | 2936 | /rollup@4.21.3: 2937 | resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==} 2938 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2939 | hasBin: true 2940 | dependencies: 2941 | '@types/estree': 1.0.5 2942 | optionalDependencies: 2943 | '@rollup/rollup-android-arm-eabi': 4.21.3 2944 | '@rollup/rollup-android-arm64': 4.21.3 2945 | '@rollup/rollup-darwin-arm64': 4.21.3 2946 | '@rollup/rollup-darwin-x64': 4.21.3 2947 | '@rollup/rollup-linux-arm-gnueabihf': 4.21.3 2948 | '@rollup/rollup-linux-arm-musleabihf': 4.21.3 2949 | '@rollup/rollup-linux-arm64-gnu': 4.21.3 2950 | '@rollup/rollup-linux-arm64-musl': 4.21.3 2951 | '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3 2952 | '@rollup/rollup-linux-riscv64-gnu': 4.21.3 2953 | '@rollup/rollup-linux-s390x-gnu': 4.21.3 2954 | '@rollup/rollup-linux-x64-gnu': 4.21.3 2955 | '@rollup/rollup-linux-x64-musl': 4.21.3 2956 | '@rollup/rollup-win32-arm64-msvc': 4.21.3 2957 | '@rollup/rollup-win32-ia32-msvc': 4.21.3 2958 | '@rollup/rollup-win32-x64-msvc': 4.21.3 2959 | fsevents: 2.3.3 2960 | dev: true 2961 | 2962 | /rollup@4.34.9: 2963 | resolution: {integrity: sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==} 2964 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2965 | hasBin: true 2966 | dependencies: 2967 | '@types/estree': 1.0.6 2968 | optionalDependencies: 2969 | '@rollup/rollup-android-arm-eabi': 4.34.9 2970 | '@rollup/rollup-android-arm64': 4.34.9 2971 | '@rollup/rollup-darwin-arm64': 4.34.9 2972 | '@rollup/rollup-darwin-x64': 4.34.9 2973 | '@rollup/rollup-freebsd-arm64': 4.34.9 2974 | '@rollup/rollup-freebsd-x64': 4.34.9 2975 | '@rollup/rollup-linux-arm-gnueabihf': 4.34.9 2976 | '@rollup/rollup-linux-arm-musleabihf': 4.34.9 2977 | '@rollup/rollup-linux-arm64-gnu': 4.34.9 2978 | '@rollup/rollup-linux-arm64-musl': 4.34.9 2979 | '@rollup/rollup-linux-loongarch64-gnu': 4.34.9 2980 | '@rollup/rollup-linux-powerpc64le-gnu': 4.34.9 2981 | '@rollup/rollup-linux-riscv64-gnu': 4.34.9 2982 | '@rollup/rollup-linux-s390x-gnu': 4.34.9 2983 | '@rollup/rollup-linux-x64-gnu': 4.34.9 2984 | '@rollup/rollup-linux-x64-musl': 4.34.9 2985 | '@rollup/rollup-win32-arm64-msvc': 4.34.9 2986 | '@rollup/rollup-win32-ia32-msvc': 4.34.9 2987 | '@rollup/rollup-win32-x64-msvc': 4.34.9 2988 | fsevents: 2.3.3 2989 | dev: true 2990 | 2991 | /run-parallel@1.2.0: 2992 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2993 | dependencies: 2994 | queue-microtask: 1.2.3 2995 | dev: true 2996 | 2997 | /safer-buffer@2.1.2: 2998 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2999 | dev: true 3000 | 3001 | /semver@6.3.1: 3002 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 3003 | hasBin: true 3004 | dev: true 3005 | 3006 | /semver@7.6.3: 3007 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 3008 | engines: {node: '>=10'} 3009 | hasBin: true 3010 | dev: true 3011 | 3012 | /shebang-command@1.2.0: 3013 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 3014 | engines: {node: '>=0.10.0'} 3015 | dependencies: 3016 | shebang-regex: 1.0.0 3017 | dev: true 3018 | 3019 | /shebang-command@2.0.0: 3020 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 3021 | engines: {node: '>=8'} 3022 | dependencies: 3023 | shebang-regex: 3.0.0 3024 | dev: true 3025 | 3026 | /shebang-regex@1.0.0: 3027 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 3028 | engines: {node: '>=0.10.0'} 3029 | dev: true 3030 | 3031 | /shebang-regex@3.0.0: 3032 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 3033 | engines: {node: '>=8'} 3034 | dev: true 3035 | 3036 | /siginfo@2.0.0: 3037 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 3038 | dev: true 3039 | 3040 | /signal-exit@3.0.7: 3041 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 3042 | dev: true 3043 | 3044 | /signal-exit@4.1.0: 3045 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 3046 | engines: {node: '>=14'} 3047 | dev: true 3048 | 3049 | /slash@3.0.0: 3050 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 3051 | engines: {node: '>=8'} 3052 | dev: true 3053 | 3054 | /source-map-js@1.2.1: 3055 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 3056 | engines: {node: '>=0.10.0'} 3057 | dev: true 3058 | 3059 | /source-map@0.8.0-beta.0: 3060 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 3061 | engines: {node: '>= 8'} 3062 | dependencies: 3063 | whatwg-url: 7.1.0 3064 | dev: true 3065 | 3066 | /spawndamnit@2.0.0: 3067 | resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} 3068 | dependencies: 3069 | cross-spawn: 5.1.0 3070 | signal-exit: 3.0.7 3071 | dev: true 3072 | 3073 | /sprintf-js@1.0.3: 3074 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 3075 | dev: true 3076 | 3077 | /stackback@0.0.2: 3078 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 3079 | dev: true 3080 | 3081 | /std-env@3.8.0: 3082 | resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 3083 | dev: true 3084 | 3085 | /string-width@4.2.3: 3086 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 3087 | engines: {node: '>=8'} 3088 | dependencies: 3089 | emoji-regex: 8.0.0 3090 | is-fullwidth-code-point: 3.0.0 3091 | strip-ansi: 6.0.1 3092 | dev: true 3093 | 3094 | /string-width@5.1.2: 3095 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 3096 | engines: {node: '>=12'} 3097 | dependencies: 3098 | eastasianwidth: 0.2.0 3099 | emoji-regex: 9.2.2 3100 | strip-ansi: 7.1.0 3101 | dev: true 3102 | 3103 | /strip-ansi@6.0.1: 3104 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3105 | engines: {node: '>=8'} 3106 | dependencies: 3107 | ansi-regex: 5.0.1 3108 | dev: true 3109 | 3110 | /strip-ansi@7.1.0: 3111 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 3112 | engines: {node: '>=12'} 3113 | dependencies: 3114 | ansi-regex: 6.1.0 3115 | dev: true 3116 | 3117 | /strip-bom@3.0.0: 3118 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 3119 | engines: {node: '>=4'} 3120 | dev: true 3121 | 3122 | /strip-final-newline@2.0.0: 3123 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 3124 | engines: {node: '>=6'} 3125 | dev: true 3126 | 3127 | /strip-json-comments@3.1.1: 3128 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 3129 | engines: {node: '>=8'} 3130 | dev: true 3131 | 3132 | /sucrase@3.35.0: 3133 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 3134 | engines: {node: '>=16 || 14 >=14.17'} 3135 | hasBin: true 3136 | dependencies: 3137 | '@jridgewell/gen-mapping': 0.3.5 3138 | commander: 4.1.1 3139 | glob: 10.4.5 3140 | lines-and-columns: 1.2.4 3141 | mz: 2.7.0 3142 | pirates: 4.0.6 3143 | ts-interface-checker: 0.1.13 3144 | dev: true 3145 | 3146 | /supports-color@5.5.0: 3147 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 3148 | engines: {node: '>=4'} 3149 | dependencies: 3150 | has-flag: 3.0.0 3151 | dev: true 3152 | 3153 | /supports-color@7.2.0: 3154 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 3155 | engines: {node: '>=8'} 3156 | dependencies: 3157 | has-flag: 4.0.0 3158 | dev: true 3159 | 3160 | /term-size@2.2.1: 3161 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 3162 | engines: {node: '>=8'} 3163 | dev: true 3164 | 3165 | /text-table@0.2.0: 3166 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 3167 | dev: true 3168 | 3169 | /thenify-all@1.6.0: 3170 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 3171 | engines: {node: '>=0.8'} 3172 | dependencies: 3173 | thenify: 3.3.1 3174 | dev: true 3175 | 3176 | /thenify@3.3.1: 3177 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 3178 | dependencies: 3179 | any-promise: 1.3.0 3180 | dev: true 3181 | 3182 | /tinybench@2.9.0: 3183 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 3184 | dev: true 3185 | 3186 | /tinyexec@0.3.2: 3187 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 3188 | dev: true 3189 | 3190 | /tinyglobby@0.2.6: 3191 | resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} 3192 | engines: {node: '>=12.0.0'} 3193 | dependencies: 3194 | fdir: 6.3.0(picomatch@4.0.2) 3195 | picomatch: 4.0.2 3196 | dev: true 3197 | 3198 | /tinypool@1.0.2: 3199 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 3200 | engines: {node: ^18.0.0 || >=20.0.0} 3201 | dev: true 3202 | 3203 | /tinyrainbow@2.0.0: 3204 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 3205 | engines: {node: '>=14.0.0'} 3206 | dev: true 3207 | 3208 | /tinyspy@3.0.2: 3209 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 3210 | engines: {node: '>=14.0.0'} 3211 | dev: true 3212 | 3213 | /tmp@0.0.33: 3214 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 3215 | engines: {node: '>=0.6.0'} 3216 | dependencies: 3217 | os-tmpdir: 1.0.2 3218 | dev: true 3219 | 3220 | /to-fast-properties@2.0.0: 3221 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 3222 | engines: {node: '>=4'} 3223 | dev: true 3224 | 3225 | /to-regex-range@5.0.1: 3226 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3227 | engines: {node: '>=8.0'} 3228 | dependencies: 3229 | is-number: 7.0.0 3230 | dev: true 3231 | 3232 | /tr46@1.0.1: 3233 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 3234 | dependencies: 3235 | punycode: 2.3.1 3236 | dev: true 3237 | 3238 | /tree-kill@1.2.2: 3239 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 3240 | hasBin: true 3241 | dev: true 3242 | 3243 | /ts-api-utils@1.3.0(typescript@5.6.2): 3244 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 3245 | engines: {node: '>=16'} 3246 | peerDependencies: 3247 | typescript: '>=4.2.0' 3248 | dependencies: 3249 | typescript: 5.6.2 3250 | dev: true 3251 | 3252 | /ts-interface-checker@0.1.13: 3253 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 3254 | dev: true 3255 | 3256 | /tsup@8.3.0(typescript@5.6.2): 3257 | resolution: {integrity: sha512-ALscEeyS03IomcuNdFdc0YWGVIkwH1Ws7nfTbAPuoILvEV2hpGQAY72LIOjglGo4ShWpZfpBqP/jpQVCzqYQag==} 3258 | engines: {node: '>=18'} 3259 | hasBin: true 3260 | peerDependencies: 3261 | '@microsoft/api-extractor': ^7.36.0 3262 | '@swc/core': ^1 3263 | postcss: ^8.4.12 3264 | typescript: '>=4.5.0' 3265 | peerDependenciesMeta: 3266 | '@microsoft/api-extractor': 3267 | optional: true 3268 | '@swc/core': 3269 | optional: true 3270 | postcss: 3271 | optional: true 3272 | typescript: 3273 | optional: true 3274 | dependencies: 3275 | bundle-require: 5.0.0(esbuild@0.23.1) 3276 | cac: 6.7.14 3277 | chokidar: 3.6.0 3278 | consola: 3.2.3 3279 | debug: 4.3.7 3280 | esbuild: 0.23.1 3281 | execa: 5.1.1 3282 | joycon: 3.1.1 3283 | picocolors: 1.1.0 3284 | postcss-load-config: 6.0.1 3285 | resolve-from: 5.0.0 3286 | rollup: 4.21.3 3287 | source-map: 0.8.0-beta.0 3288 | sucrase: 3.35.0 3289 | tinyglobby: 0.2.6 3290 | tree-kill: 1.2.2 3291 | typescript: 5.6.2 3292 | transitivePeerDependencies: 3293 | - jiti 3294 | - supports-color 3295 | - tsx 3296 | - yaml 3297 | dev: true 3298 | 3299 | /type-check@0.4.0: 3300 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 3301 | engines: {node: '>= 0.8.0'} 3302 | dependencies: 3303 | prelude-ls: 1.2.1 3304 | dev: true 3305 | 3306 | /type-fest@0.20.2: 3307 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 3308 | engines: {node: '>=10'} 3309 | dev: true 3310 | 3311 | /type-fest@4.26.1: 3312 | resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} 3313 | engines: {node: '>=16'} 3314 | dev: false 3315 | 3316 | /typescript@5.6.2: 3317 | resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} 3318 | engines: {node: '>=14.17'} 3319 | hasBin: true 3320 | dev: true 3321 | 3322 | /undici-types@6.19.8: 3323 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 3324 | dev: true 3325 | 3326 | /universalify@0.1.2: 3327 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 3328 | engines: {node: '>= 4.0.0'} 3329 | dev: true 3330 | 3331 | /update-browserslist-db@1.1.0(browserslist@4.23.3): 3332 | resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} 3333 | hasBin: true 3334 | peerDependencies: 3335 | browserslist: '>= 4.21.0' 3336 | dependencies: 3337 | browserslist: 4.23.3 3338 | escalade: 3.2.0 3339 | picocolors: 1.1.0 3340 | dev: true 3341 | 3342 | /uri-js@4.4.1: 3343 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 3344 | dependencies: 3345 | punycode: 2.3.1 3346 | dev: true 3347 | 3348 | /vite-node@3.0.7(@types/node@22.5.5): 3349 | resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==} 3350 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 3351 | hasBin: true 3352 | dependencies: 3353 | cac: 6.7.14 3354 | debug: 4.4.0 3355 | es-module-lexer: 1.6.0 3356 | pathe: 2.0.3 3357 | vite: 6.2.0(@types/node@22.5.5) 3358 | transitivePeerDependencies: 3359 | - '@types/node' 3360 | - jiti 3361 | - less 3362 | - lightningcss 3363 | - sass 3364 | - sass-embedded 3365 | - stylus 3366 | - sugarss 3367 | - supports-color 3368 | - terser 3369 | - tsx 3370 | - yaml 3371 | dev: true 3372 | 3373 | /vite@6.2.0(@types/node@22.5.5): 3374 | resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} 3375 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 3376 | hasBin: true 3377 | peerDependencies: 3378 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 3379 | jiti: '>=1.21.0' 3380 | less: '*' 3381 | lightningcss: ^1.21.0 3382 | sass: '*' 3383 | sass-embedded: '*' 3384 | stylus: '*' 3385 | sugarss: '*' 3386 | terser: ^5.16.0 3387 | tsx: ^4.8.1 3388 | yaml: ^2.4.2 3389 | peerDependenciesMeta: 3390 | '@types/node': 3391 | optional: true 3392 | jiti: 3393 | optional: true 3394 | less: 3395 | optional: true 3396 | lightningcss: 3397 | optional: true 3398 | sass: 3399 | optional: true 3400 | sass-embedded: 3401 | optional: true 3402 | stylus: 3403 | optional: true 3404 | sugarss: 3405 | optional: true 3406 | terser: 3407 | optional: true 3408 | tsx: 3409 | optional: true 3410 | yaml: 3411 | optional: true 3412 | dependencies: 3413 | '@types/node': 22.5.5 3414 | esbuild: 0.25.0 3415 | postcss: 8.5.3 3416 | rollup: 4.34.9 3417 | optionalDependencies: 3418 | fsevents: 2.3.3 3419 | dev: true 3420 | 3421 | /vitest@3.0.7(@types/node@22.5.5): 3422 | resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==} 3423 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 3424 | hasBin: true 3425 | peerDependencies: 3426 | '@edge-runtime/vm': '*' 3427 | '@types/debug': ^4.1.12 3428 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 3429 | '@vitest/browser': 3.0.7 3430 | '@vitest/ui': 3.0.7 3431 | happy-dom: '*' 3432 | jsdom: '*' 3433 | peerDependenciesMeta: 3434 | '@edge-runtime/vm': 3435 | optional: true 3436 | '@types/debug': 3437 | optional: true 3438 | '@types/node': 3439 | optional: true 3440 | '@vitest/browser': 3441 | optional: true 3442 | '@vitest/ui': 3443 | optional: true 3444 | happy-dom: 3445 | optional: true 3446 | jsdom: 3447 | optional: true 3448 | dependencies: 3449 | '@types/node': 22.5.5 3450 | '@vitest/expect': 3.0.7 3451 | '@vitest/mocker': 3.0.7(vite@6.2.0) 3452 | '@vitest/pretty-format': 3.0.7 3453 | '@vitest/runner': 3.0.7 3454 | '@vitest/snapshot': 3.0.7 3455 | '@vitest/spy': 3.0.7 3456 | '@vitest/utils': 3.0.7 3457 | chai: 5.2.0 3458 | debug: 4.4.0 3459 | expect-type: 1.2.0 3460 | magic-string: 0.30.17 3461 | pathe: 2.0.3 3462 | std-env: 3.8.0 3463 | tinybench: 2.9.0 3464 | tinyexec: 0.3.2 3465 | tinypool: 1.0.2 3466 | tinyrainbow: 2.0.0 3467 | vite: 6.2.0(@types/node@22.5.5) 3468 | vite-node: 3.0.7(@types/node@22.5.5) 3469 | why-is-node-running: 2.3.0 3470 | transitivePeerDependencies: 3471 | - jiti 3472 | - less 3473 | - lightningcss 3474 | - msw 3475 | - sass 3476 | - sass-embedded 3477 | - stylus 3478 | - sugarss 3479 | - supports-color 3480 | - terser 3481 | - tsx 3482 | - yaml 3483 | dev: true 3484 | 3485 | /webidl-conversions@4.0.2: 3486 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 3487 | dev: true 3488 | 3489 | /whatwg-url@7.1.0: 3490 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 3491 | dependencies: 3492 | lodash.sortby: 4.7.0 3493 | tr46: 1.0.1 3494 | webidl-conversions: 4.0.2 3495 | dev: true 3496 | 3497 | /which@1.3.1: 3498 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 3499 | hasBin: true 3500 | dependencies: 3501 | isexe: 2.0.0 3502 | dev: true 3503 | 3504 | /which@2.0.2: 3505 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3506 | engines: {node: '>= 8'} 3507 | hasBin: true 3508 | dependencies: 3509 | isexe: 2.0.0 3510 | dev: true 3511 | 3512 | /why-is-node-running@2.3.0: 3513 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 3514 | engines: {node: '>=8'} 3515 | hasBin: true 3516 | dependencies: 3517 | siginfo: 2.0.0 3518 | stackback: 0.0.2 3519 | dev: true 3520 | 3521 | /word-wrap@1.2.5: 3522 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 3523 | engines: {node: '>=0.10.0'} 3524 | dev: true 3525 | 3526 | /wrap-ansi@7.0.0: 3527 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 3528 | engines: {node: '>=10'} 3529 | dependencies: 3530 | ansi-styles: 4.3.0 3531 | string-width: 4.2.3 3532 | strip-ansi: 6.0.1 3533 | dev: true 3534 | 3535 | /wrap-ansi@8.1.0: 3536 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 3537 | engines: {node: '>=12'} 3538 | dependencies: 3539 | ansi-styles: 6.2.1 3540 | string-width: 5.1.2 3541 | strip-ansi: 7.1.0 3542 | dev: true 3543 | 3544 | /wrappy@1.0.2: 3545 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 3546 | dev: true 3547 | 3548 | /yallist@2.1.2: 3549 | resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} 3550 | dev: true 3551 | 3552 | /yallist@3.1.1: 3553 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 3554 | dev: true 3555 | 3556 | /yocto-queue@0.1.0: 3557 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 3558 | engines: {node: '>=10'} 3559 | dev: true 3560 | --------------------------------------------------------------------------------