├── .npmrc ├── tsup.config.ts ├── .prettierignore ├── tsconfig.json ├── vitest.config.ts ├── .github ├── dependabot.yml └── workflows │ ├── ci.yml │ └── release.yml ├── eslint.config.mjs ├── src ├── errors.ts ├── constants.ts ├── extend.test.ts ├── utf8.test.ts ├── index.ts ├── typings.ts ├── encode.test.ts ├── extend.ts ├── decode.test.ts ├── index.bench.ts ├── index.test.ts ├── stream.test.ts ├── stream.ts ├── encode.ts └── decode.ts ├── LICENSE ├── package.json ├── .gitignore ├── README.md └── pnpm-lock.yaml /.npmrc: -------------------------------------------------------------------------------- 1 | hoist=true 2 | shamefully-hoist=true 3 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | clean: true, 5 | dts: true, 6 | entry: ['src/index.ts', 'src/extend.ts'], 7 | format: ['cjs', 'esm'], 8 | target: 'esnext', 9 | outDir: 'dist', 10 | }); 11 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .changeset 3 | node_modules 4 | build 5 | dist 6 | 7 | .gitignore 8 | .prettierignore 9 | 10 | .env 11 | .env.* 12 | !.env.example 13 | 14 | # Ignore files for PNPM, NPM and YARN 15 | package-lock.json 16 | yarn.lock 17 | pnpm-lock.yaml 18 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@shahrad/tsconfig", 4 | "compilerOptions": { 5 | "noUncheckedIndexedAccess": false 6 | }, 7 | "include": ["**/*.ts"], 8 | "exclude": ["node_modules", "dist"] 9 | } 10 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | environment: 'node', 6 | testTimeout: 20000, 7 | globals: true, 8 | exclude: ['**/node_modules/**', '**/dist/**'], 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: '/' 5 | schedule: 6 | interval: 'daily' 7 | groups: 8 | all-dependencies: 9 | patterns: 10 | - '*' 11 | update-types: 12 | - 'minor' 13 | - 'patch' 14 | - package-ecosystem: 'github-actions' 15 | directory: '/' 16 | schedule: 17 | interval: 'daily' 18 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from '@shahrad/eslint-config'; 2 | import globals from 'globals'; 3 | 4 | export default defineConfig( 5 | { 6 | ignores: ['dist/**'], 7 | }, 8 | { 9 | languageOptions: { 10 | ecmaVersion: 'latest', 11 | sourceType: 'module', 12 | globals: { 13 | ...globals.node, 14 | ...globals.browser, 15 | }, 16 | }, 17 | rules: { 18 | 'no-console': 'error', 19 | }, 20 | } 21 | ); 22 | -------------------------------------------------------------------------------- /src/errors.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Custom error class for invalid Base64 strings. 3 | */ 4 | export class InvalidBase64Error extends Error { 5 | constructor(message: string) { 6 | super(message); 7 | this.name = 'InvalidBase64Error'; 8 | } 9 | } 10 | 11 | /** 12 | * Custom error class for invalid Data URLs. 13 | */ 14 | export class InvalidDataURLError extends Error { 15 | constructor(message: string) { 16 | super(message); 17 | this.name = 'InvalidDataURLError'; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * The Base64 character set. 3 | * @private 4 | */ 5 | export const B64_CHAR_SET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 6 | 7 | /** 8 | * A regular expression to test for valid Base64 encoded strings. 9 | * 10 | * @private 11 | */ 12 | export const B64_REGEX = /^(?:[A-Za-z\d+/]{4})*(?:[A-Za-z\d+/]{2}==|[A-Za-z\d+/]{3}=)?$/; 13 | 14 | /** 15 | * A regular expression to test for valid URL-safe Base64 encoded strings. 16 | * 17 | * @private 18 | */ 19 | export const B64_URL_REGEX = /^(?:[A-Za-z\d-_]{4})*(?:[A-Za-z\d-_]{2,3})?$/; 20 | 21 | /** 22 | * A lookup table for Base64 characters. 23 | * @private 24 | */ 25 | export const B64_LOOKUP: Record = {}; 26 | for (let i = 0; i < B64_CHAR_SET.length; i++) { 27 | B64_LOOKUP[B64_CHAR_SET[i]] = i; 28 | } 29 | -------------------------------------------------------------------------------- /src/extend.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import './extend'; 4 | 5 | describe('prototype extensions', () => { 6 | const text = 'Hello, world!'; 7 | const encodedText = 'SGVsbG8sIHdvcmxkIQ=='; 8 | 9 | it('should extend String.prototype with toBase64', () => { 10 | expect(text.toBase64()).toBe(encodedText); 11 | }); 12 | 13 | it('should extend String.prototype with fromBase64', () => { 14 | expect(encodedText.fromBase64()).toBe(text); 15 | }); 16 | 17 | it('should extend String.prototype with toUint8Array', () => { 18 | const expectedUint8Array = new Uint8Array([ 19 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 20 | ]); 21 | expect(encodedText.toUint8Array()).toEqual(expectedUint8Array); 22 | }); 23 | 24 | it('should extend Uint8Array.prototype with toBase64', () => { 25 | const uint8Array = new Uint8Array([ 26 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 27 | ]); 28 | expect(uint8Array.toBase64()).toBe(encodedText); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /src/utf8.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { decode } from './decode'; 4 | import { encode } from './encode'; 5 | 6 | describe('UTF-8 support', () => { 7 | const utf8Strings = { 8 | 'Hello, world! 👋': 'SGVsbG8sIHdvcmxkISDwn5GL', 9 | '你好,世界!': '5L2g5aW9LOS4lueVjCE=', 10 | 'こんにちは、世界!': '44GT44KT44Gr44Gh44Gv44CB5LiW55WM77yB', 11 | 'Привет, мир!': '0J/RgNC40LLQtdGCLCDQvNC40YAh', 12 | '안녕하세요, 세계!': '7JWI64WV7ZWY7IS47JqULCDshLjqs4Qh', 13 | '👋🌍': '8J+Ri/CfjI0=', 14 | '€15\n': '4oKsMTUK', 15 | François: 'RnJhbsOnb2lz', 16 | Jörg: 'SsO2cmc=', 17 | José: 'Sm9zw6k=', 18 | Tran: 'VHJhbg==', 19 | Trần: 'VHLhuqdu', 20 | أبو: '2KPYqNmI', 21 | }; 22 | 23 | for (const [decoded, encoded] of Object.entries(utf8Strings)) { 24 | it(`should encode "${decoded}" correctly`, () => { 25 | expect(encode(decoded)).toBe(encoded); 26 | }); 27 | 28 | it(`should decode "${encoded}" correctly`, () => { 29 | expect(decode(encoded)).toBe(decoded); 30 | }); 31 | } 32 | }); 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Shahrad Elahi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | 8 | jobs: 9 | format: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: pnpm/action-setup@v4 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version: 22 17 | cache: 'pnpm' 18 | 19 | - run: pnpm install --frozen-lockfile 20 | - run: pnpm format:check 21 | 22 | lint: 23 | runs-on: ubuntu-latest 24 | steps: 25 | - uses: actions/checkout@v4 26 | - uses: pnpm/action-setup@v4 27 | - uses: actions/setup-node@v4 28 | with: 29 | node-version: 22 30 | cache: 'pnpm' 31 | 32 | - run: pnpm install --frozen-lockfile 33 | - run: pnpm lint 34 | 35 | test: 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: actions/checkout@v4 39 | - uses: pnpm/action-setup@v4 40 | - uses: actions/setup-node@v4 41 | with: 42 | node-version: 22 43 | cache: 'pnpm' 44 | 45 | - run: pnpm install --frozen-lockfile 46 | - run: pnpm test 47 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | decode as atob, 3 | decode, 4 | decodeURL, 5 | fromDataURL, 6 | isValid, 7 | isValidURL, 8 | toUint8Array, 9 | } from './decode'; 10 | import { encode as btoa, encode, encodeURL, fromUint8Array, toDataURL } from './encode'; 11 | import { InvalidBase64Error, InvalidDataURLError } from './errors'; 12 | 13 | export { 14 | encode, 15 | decode, 16 | encodeURL, 17 | decodeURL, 18 | isValid, 19 | isValidURL, 20 | fromUint8Array, 21 | toUint8Array, 22 | toDataURL, 23 | fromDataURL, 24 | btoa, 25 | atob, 26 | InvalidBase64Error, 27 | InvalidDataURLError, 28 | }; 29 | 30 | /** 31 | * A class that provides Base64 encoding and decoding functions. 32 | */ 33 | export class Base64 { 34 | public static encode = encode; 35 | public static decode = decode; 36 | public static encodeURL = encodeURL; 37 | public static decodeURL = decodeURL; 38 | public static isValid = isValid; 39 | public static isValidURL = isValidURL; 40 | public static fromUint8Array = fromUint8Array; 41 | public static toUint8Array = toUint8Array; 42 | public static fromDataURL = fromDataURL; 43 | public static toDataURL = toDataURL; 44 | public static btoa = btoa; 45 | public static atob = atob; 46 | } 47 | 48 | export * from './stream'; 49 | export type * from './typings'; 50 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Package 2 | 3 | on: 4 | push: 5 | tags: 6 | - v* 7 | 8 | jobs: 9 | create-github-release: 10 | permissions: 11 | contents: write 12 | runs-on: ubuntu-latest 13 | if: startsWith(github.ref, 'refs/tags/v') 14 | steps: 15 | - name: Calculate release name 16 | run: | 17 | GITHUB_REF=${{ github.ref }} 18 | RELEASE_NAME=${GITHUB_REF#"refs/tags/"} 19 | echo "RELEASE_NAME=${RELEASE_NAME}" >> $GITHUB_ENV 20 | 21 | - name: Publish release 22 | uses: actions/create-release@v1 23 | env: 24 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 25 | with: 26 | tag_name: ${{ github.ref }} 27 | release_name: ${{ env.RELEASE_NAME }} 28 | draft: false 29 | prerelease: false 30 | 31 | publish-npm-release: 32 | runs-on: ubuntu-latest 33 | permissions: 34 | contents: read 35 | id-token: write 36 | steps: 37 | - uses: actions/checkout@v4 38 | - uses: pnpm/action-setup@v4 39 | - uses: actions/setup-node@v4 40 | with: 41 | node-version: 22 42 | cache: 'pnpm' 43 | registry-url: 'https://registry.npmjs.org' 44 | 45 | - run: pnpm install --frozen-lockfile 46 | - run: npm publish --provenance --access public 47 | env: 48 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 49 | -------------------------------------------------------------------------------- /src/typings.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A branded type to provide compile-time safety for distinguishing different string types. 3 | * @template T The base type (e.g., string). 4 | * @template U A unique brand identifier (e.g., 'Base64'). 5 | */ 6 | type Brand = T & { readonly __brand: U }; 7 | 8 | /** 9 | * Represents a Base64 encoded string. 10 | * Using a branded type for compile-time safety. 11 | */ 12 | export type Base64String = Brand; 13 | 14 | /** 15 | * Represents a URL-safe Base64 encoded string. 16 | * Using a branded type for compile-time safety. 17 | */ 18 | export type Base64UrlString = Brand; 19 | 20 | /** 21 | * Represents a string that is not Base64 encoded. 22 | */ 23 | export type NotBase64 = string; 24 | 25 | /** 26 | * Represents a value that may or may not be Base64 encoded. 27 | */ 28 | export type MaybeBase64 = unknown; 29 | 30 | /** 31 | * Represents a readable stream of data. 32 | */ 33 | export type ReadableStream = globalThis.ReadableStream; 34 | 35 | /** 36 | * Represents a transform stream that can be used to modify data as it is being read. 37 | */ 38 | export type TransformStream = globalThis.TransformStream; 39 | 40 | /** 41 | * Options for Base64 encoding. 42 | */ 43 | export interface Base64EncodeOptions { 44 | /** 45 | * If `true`, the padding characters (`=`) will be omitted from the encoded string. 46 | */ 47 | omitPadding?: boolean; 48 | 49 | /** 50 | * If `true`, the URL-safe alphabet will be used. 51 | */ 52 | urlSafe?: SafeURL; 53 | } 54 | 55 | /** 56 | * Options for Base64 decoding. 57 | */ 58 | export interface Base64DecodeOptions { 59 | /** 60 | * If `true`, the URL-safe alphabet will be used for decoding. 61 | */ 62 | urlSafe?: boolean; 63 | } 64 | -------------------------------------------------------------------------------- /src/encode.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { encode, fromUint8Array, toDataURL } from './encode'; 4 | 5 | describe('encode', () => { 6 | const text = 'Hello, world!'; 7 | const encodedText = 'SGVsbG8sIHdvcmxkIQ=='; 8 | 9 | it('should encode a string to Base64', () => { 10 | expect(encode(text)).toBe(encodedText); 11 | }); 12 | 13 | it('should encode a string to URL-safe Base64', () => { 14 | const textWithSpecialChars = 'a+b/c='; 15 | const expected = 'YStiL2M9'; 16 | expect(encode(textWithSpecialChars, { urlSafe: true, omitPadding: true })).toBe(expected); 17 | }); 18 | 19 | it('should convert a Uint8Array to a Base64 string', () => { 20 | const uint8Array = new Uint8Array([ 21 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 22 | ]); 23 | expect(fromUint8Array(uint8Array)).toBe(encodedText); 24 | }); 25 | 26 | it('should convert a Uint8Array to a URL-safe Base64 string', () => { 27 | const uint8Array = new Uint8Array([97, 43, 98, 47, 99, 61]); 28 | const expected = 'YStiL2M9'; 29 | expect(fromUint8Array(uint8Array, { urlSafe: true, omitPadding: true })).toBe(expected); 30 | }); 31 | 32 | it('should encode without padding', () => { 33 | const text = 'Hello, world'; 34 | const encoded = 'SGVsbG8sIHdvcmxk'; 35 | expect(encode(text, { omitPadding: true })).toBe(encoded); 36 | }); 37 | 38 | it('should encode to a Data URL', () => { 39 | const mimeType = 'text/plain'; 40 | const dataURL = 'data:text/plain;base64,SGVsbG8sIHdvcmxkIQ=='; 41 | expect(toDataURL(text, mimeType)).toBe(dataURL); 42 | }); 43 | 44 | it('should handle complex MIME types', () => { 45 | const complexMimeType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; 46 | const url = toDataURL(text, complexMimeType); 47 | expect(url.startsWith(`data:${complexMimeType};base64,`)).toBe(true); 48 | }); 49 | }); 50 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@se-oss/base64", 3 | "version": "1.0.2", 4 | "description": "Robust Base64 encoding/decoding for TypeScript, with URL-safe, Uint8Array, and streaming capabilities.", 5 | "keywords": [ 6 | "base64", 7 | "encoding", 8 | "decoding", 9 | "typescript", 10 | "url-safe", 11 | "uint8array", 12 | "stream", 13 | "binary", 14 | "data-url" 15 | ], 16 | "homepage": "https://github.com/shahradelahi/ts-base64", 17 | "repository": "github:shahradelahi/ts-base64", 18 | "license": "MIT", 19 | "author": "Shahrad Elahi (https://github.com/shahradelahi)", 20 | "type": "module", 21 | "exports": { 22 | ".": { 23 | "import": "./dist/index.js", 24 | "default": "./dist/index.cjs" 25 | }, 26 | "./extend": { 27 | "types": "./dist/extend.d.ts", 28 | "import": "./dist/extend.js", 29 | "default": "./dist/extend.cjs" 30 | } 31 | }, 32 | "main": "dist/index.js", 33 | "types": "dist/index.d.ts", 34 | "files": [ 35 | "dist/**", 36 | "!**/*.d.cts" 37 | ], 38 | "scripts": { 39 | "bench": "vitest bench --run", 40 | "build": "tsup", 41 | "clean": "git clean -dfx node_modules dist .tsbuildinfo", 42 | "dev": "tsup --watch", 43 | "format": "prettier --write .", 44 | "format:check": "prettier --check .", 45 | "lint": "pnpm typecheck && eslint .", 46 | "lint:fix": "eslint --fix .", 47 | "prepublishOnly": "pnpm build && pnpm lint && pnpm format:check && pnpm test", 48 | "test": "vitest --run", 49 | "typecheck": "tsc --noEmit" 50 | }, 51 | "prettier": "@shahrad/prettier-config", 52 | "devDependencies": { 53 | "@shahrad/eslint-config": "^1.0.1", 54 | "@shahrad/prettier-config": "^1.2.2", 55 | "@shahrad/tsconfig": "^1.2.0", 56 | "@types/node": "^24.9.2", 57 | "eslint": "^9.38.0", 58 | "globals": "^16.4.0", 59 | "js-base64": "^3.7.8", 60 | "prettier": "^3.6.2", 61 | "tsup": "^8.5.0", 62 | "typescript": "^5.9.3", 63 | "vitest": "^4.0.5" 64 | }, 65 | "packageManager": "pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd" 66 | } 67 | -------------------------------------------------------------------------------- /src/extend.ts: -------------------------------------------------------------------------------- 1 | import { decode, toUint8Array } from './decode'; 2 | import { encode, encodeURL, fromUint8Array } from './encode'; 3 | import type { Base64String, Base64UrlString } from './typings'; 4 | 5 | declare global { 6 | interface String { 7 | /** 8 | * Encodes the string to Base64. 9 | * @param urlSafe If `true`, encodes to a URL-safe Base64 string. 10 | * @returns The Base64 encoded string. 11 | */ 12 | toBase64(urlSafe?: boolean): Base64String | Base64UrlString; 13 | /** 14 | * Decodes the Base64 string. 15 | * @returns The decoded string. 16 | */ 17 | fromBase64(): string; 18 | /** 19 | * Converts the Base64 string to a Uint8Array. 20 | * @returns The Uint8Array. 21 | */ 22 | toUint8Array(): Uint8Array; 23 | } 24 | 25 | interface Uint8Array { 26 | /** 27 | * Encodes the Uint8Array to a Base64 string. 28 | * @param urlSafe If `true`, encodes to a URL-safe Base64 string. 29 | * @returns The Base64 encoded string. 30 | */ 31 | toBase64(urlSafe?: boolean): Base64String | Base64UrlString; 32 | } 33 | } 34 | 35 | if (!String.prototype.toBase64) { 36 | Object.defineProperty(String.prototype, 'toBase64', { 37 | value: function (urlSafe?: boolean): Base64String | Base64UrlString { 38 | if (urlSafe) { 39 | return encodeURL(this.toString(), { omitPadding: true }); 40 | } 41 | return encode(this.toString()); 42 | }, 43 | writable: true, 44 | configurable: true, 45 | }); 46 | } 47 | 48 | if (!String.prototype.fromBase64) { 49 | Object.defineProperty(String.prototype, 'fromBase64', { 50 | value: function (): string { 51 | return decode(this.toString() as Base64String); 52 | }, 53 | writable: true, 54 | configurable: true, 55 | }); 56 | } 57 | 58 | if (!String.prototype.toUint8Array) { 59 | Object.defineProperty(String.prototype, 'toUint8Array', { 60 | value: function (): Uint8Array { 61 | return toUint8Array(this.toString() as Base64String); 62 | }, 63 | writable: true, 64 | configurable: true, 65 | }); 66 | } 67 | 68 | if (!Uint8Array.prototype.toBase64) { 69 | Object.defineProperty(Uint8Array.prototype, 'toBase64', { 70 | value: function (urlSafe?: boolean): Base64String | Base64UrlString { 71 | return fromUint8Array(this, { urlSafe }); 72 | }, 73 | writable: true, 74 | configurable: true, 75 | }); 76 | } 77 | -------------------------------------------------------------------------------- /src/decode.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { decode, fromDataURL, isValid, isValidURL, toUint8Array } from './decode'; 4 | import { InvalidDataURLError } from './errors'; 5 | import type { Base64String, Base64UrlString } from './typings'; 6 | 7 | describe('decode', () => { 8 | const text = 'Hello, world!'; 9 | const encodedText = 'SGVsbG8sIHdvcmxkIQ=='; 10 | const urlSafeEncodedText = 'SGVsbG8sIHdvcmxkIQ'; 11 | 12 | it('should decode a Base64 string', () => { 13 | expect(decode(encodedText as Base64String)).toBe(text); 14 | }); 15 | 16 | it('should decode a URL-safe Base64 string', () => { 17 | const urlSafeEncoded = 'YStiL2M9'; 18 | const expected = 'a+b/c='; 19 | expect(decode(urlSafeEncoded as Base64UrlString, { urlSafe: true })).toBe(expected); 20 | }); 21 | 22 | it('should check if a string is valid Base64', () => { 23 | expect(isValid(encodedText)).toBe(true); 24 | expect(isValid('not base64')).toBe(false); 25 | }); 26 | 27 | it('should check if a string is valid URL-safe Base64', () => { 28 | expect(isValidURL(urlSafeEncodedText)).toBe(true); 29 | expect(isValidURL('not+base64')).toBe(false); 30 | }); 31 | 32 | it('should check if a string is valid URL-safe Base64 with isValid', () => { 33 | expect(isValid(urlSafeEncodedText, { urlSafe: true })).toBe(true); 34 | expect(isValid('not+base64', { urlSafe: true })).toBe(false); 35 | }); 36 | 37 | it('should convert a Base64 string to a Uint8Array', () => { 38 | const expectedUint8Array = new Uint8Array([ 39 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 40 | ]); 41 | expect(toUint8Array(encodedText as Base64String)).toEqual(expectedUint8Array); 42 | }); 43 | 44 | it('should convert a URL-safe Base64 string to a Uint8Array', () => { 45 | const urlSafeEncoded = 'YStiL2M9'; 46 | const expectedUint8Array = new Uint8Array([97, 43, 98, 47, 99, 61]); 47 | expect(toUint8Array(urlSafeEncoded as Base64UrlString)).toEqual(expectedUint8Array); 48 | }); 49 | 50 | it('should decode unpadded strings', () => { 51 | const text = 'Hello, world'; 52 | const encoded = 'SGVsbG8sIHdvcmxk'; 53 | expect(decode(encoded as Base64String)).toBe(text); 54 | }); 55 | 56 | it('should decode from a Data URL', () => { 57 | const mimeType = 'text/plain'; 58 | const dataURL = 'data:text/plain;base64,SGVsbG8sIHdvcmxkIQ=='; 59 | const { data, mimeType: extractedMimeType } = fromDataURL(dataURL); 60 | expect(data).toBe(text); 61 | expect(extractedMimeType).toBe(mimeType); 62 | }); 63 | 64 | it('should throw an InvalidDataURLError for an invalid Data URL', () => { 65 | const invalidDataURL = 'not a data url'; 66 | expect(() => fromDataURL(invalidDataURL)).toThrow(InvalidDataURLError); 67 | }); 68 | }); 69 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # Snowpack dependency directory (https://snowpack.dev/) 45 | web_modules/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Optional stylelint cache 57 | .stylelintcache 58 | 59 | # Optional REPL history 60 | .node_repl_history 61 | 62 | # Output of 'npm pack' 63 | *.tgz 64 | 65 | # Yarn Integrity file 66 | .yarn-integrity 67 | 68 | # dotenv environment variable files 69 | .env 70 | .env.* 71 | !.env.example 72 | 73 | # parcel-bundler cache (https://parceljs.org/) 74 | .cache 75 | .parcel-cache 76 | 77 | # Next.js build output 78 | .next 79 | out 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and not Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # vuepress v2.x temp and cache directory 95 | .temp 96 | .cache 97 | 98 | # Sveltekit cache directory 99 | .svelte-kit/ 100 | 101 | # vitepress build output 102 | **/.vitepress/dist 103 | 104 | # vitepress cache directory 105 | **/.vitepress/cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # Firebase cache directory 120 | .firebase/ 121 | 122 | # TernJS port file 123 | .tern-port 124 | 125 | # Stores VSCode versions used for testing VSCode extensions 126 | .vscode-test 127 | 128 | # yarn v3 129 | .pnp.* 130 | .yarn/* 131 | !.yarn/patches 132 | !.yarn/plugins 133 | !.yarn/releases 134 | !.yarn/sdks 135 | !.yarn/versions 136 | 137 | # Vite logs files 138 | vite.config.js.timestamp-* 139 | vite.config.ts.timestamp-* 140 | -------------------------------------------------------------------------------- /src/index.bench.ts: -------------------------------------------------------------------------------- 1 | import { Base64 as jsBase64 } from 'js-base64'; 2 | import { bench, describe } from 'vitest'; 3 | 4 | import { decode, fromDataURL, toUint8Array } from './decode'; 5 | import { encode, fromUint8Array, toDataURL } from './encode'; 6 | 7 | const smallString = 'Hello, world!'; 8 | const mediumString = 'a'.repeat(1024); 9 | const largeString = 'a'.repeat(1024 * 1024); 10 | 11 | const encodedSmallString = encode(smallString); 12 | const encodedMediumString = encode(mediumString); 13 | const encodedLargeString = encode(largeString); 14 | 15 | describe('encode', () => { 16 | bench('native', () => { 17 | btoa(smallString); 18 | btoa(mediumString); 19 | btoa(largeString); 20 | }); 21 | 22 | bench('@se-oss/base64', () => { 23 | encode(smallString); 24 | encode(mediumString); 25 | encode(largeString); 26 | }); 27 | 28 | bench('js-base64', () => { 29 | jsBase64.encode(smallString); 30 | jsBase64.encode(mediumString); 31 | jsBase64.encode(largeString); 32 | }); 33 | }); 34 | 35 | describe('decode', () => { 36 | bench('native', () => { 37 | atob(encodedSmallString); 38 | atob(encodedMediumString); 39 | atob(encodedLargeString); 40 | }); 41 | 42 | bench('@se-oss/base64', () => { 43 | decode(encodedSmallString); 44 | decode(encodedMediumString); 45 | decode(encodedLargeString); 46 | }); 47 | 48 | bench('js-base64', () => { 49 | jsBase64.decode(encodedSmallString); 50 | jsBase64.decode(encodedMediumString); 51 | jsBase64.decode(encodedLargeString); 52 | }); 53 | }); 54 | 55 | const smallUint8Array = new Uint8Array([ 56 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 57 | ]); 58 | const mediumUint8Array = new Uint8Array(1024); 59 | const largeUint8Array = new Uint8Array(1024 * 1024); 60 | 61 | describe('fromUint8Array', () => { 62 | bench('@se-oss/base64', () => { 63 | fromUint8Array(smallUint8Array); 64 | fromUint8Array(mediumUint8Array); 65 | fromUint8Array(largeUint8Array); 66 | }); 67 | 68 | bench('js-base64', () => { 69 | jsBase64.fromUint8Array(smallUint8Array); 70 | jsBase64.fromUint8Array(mediumUint8Array); 71 | jsBase64.fromUint8Array(largeUint8Array); 72 | }); 73 | }); 74 | 75 | describe('toUint8Array', () => { 76 | bench('@se-oss/base64', () => { 77 | toUint8Array(encodedSmallString); 78 | toUint8Array(encodedMediumString); 79 | toUint8Array(encodedLargeString); 80 | }); 81 | 82 | bench('js-base64', () => { 83 | jsBase64.toUint8Array(encodedSmallString); 84 | jsBase64.toUint8Array(encodedMediumString); 85 | jsBase64.toUint8Array(encodedLargeString); 86 | }); 87 | }); 88 | 89 | const mimeType = 'text/plain'; 90 | const smallDataURL = toDataURL(smallString, mimeType); 91 | const mediumDataURL = toDataURL(mediumString, mimeType); 92 | const largeDataURL = toDataURL(largeString, mimeType); 93 | 94 | describe('toDataURL', () => { 95 | bench('@se-oss/base64', () => { 96 | toDataURL(smallString, mimeType); 97 | toDataURL(mediumString, mimeType); 98 | toDataURL(largeString, mimeType); 99 | }); 100 | }); 101 | 102 | describe('fromDataURL', () => { 103 | bench('@se-oss/base64', () => { 104 | fromDataURL(smallDataURL); 105 | fromDataURL(mediumDataURL); 106 | fromDataURL(largeDataURL); 107 | }); 108 | }); 109 | -------------------------------------------------------------------------------- /src/index.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { 4 | atob, 5 | Base64, 6 | btoa, 7 | decode, 8 | encode, 9 | fromUint8Array, 10 | isValid, 11 | isValidURL, 12 | toUint8Array, 13 | } from './index'; 14 | import type { Base64String, Base64UrlString } from './typings'; 15 | 16 | describe('Base64', () => { 17 | const text = 'Hello, world!'; 18 | const encodedText = 'SGVsbG8sIHdvcmxkIQ=='; 19 | const urlSafeEncodedText = 'SGVsbG8sIHdvcmxkIQ'; 20 | 21 | it('should encode a string to Base64', () => { 22 | expect(encode(text)).toBe(encodedText); 23 | expect(Base64.encode(text)).toBe(encodedText); 24 | }); 25 | 26 | it('should decode a Base64 string', () => { 27 | expect(decode(encodedText as Base64String)).toBe(text); 28 | expect(Base64.decode(encodedText as Base64String)).toBe(text); 29 | }); 30 | 31 | it('should encode a string to URL-safe Base64', () => { 32 | const textWithSpecialChars = 'a+b/c='; 33 | const expected = 'YStiL2M9'; 34 | expect(encode(textWithSpecialChars, { urlSafe: true, omitPadding: true })).toBe(expected); 35 | expect(Base64.encode(textWithSpecialChars, { urlSafe: true, omitPadding: true })).toBe( 36 | expected 37 | ); 38 | }); 39 | 40 | it('should decode a URL-safe Base64 string', () => { 41 | const urlSafeEncoded = 'YStiL2M9'; 42 | const expected = 'a+b/c='; 43 | expect(decode(urlSafeEncoded as Base64UrlString, { urlSafe: true })).toBe(expected); 44 | expect(Base64.decode(urlSafeEncoded as Base64UrlString, { urlSafe: true })).toBe(expected); 45 | }); 46 | 47 | it('should check if a string is valid Base64', () => { 48 | expect(isValid(encodedText)).toBe(true); 49 | expect(isValid('not base64')).toBe(false); 50 | expect(Base64.isValid(encodedText)).toBe(true); 51 | expect(Base64.isValid('not base64')).toBe(false); 52 | }); 53 | 54 | it('should check if a string is valid URL-safe Base64', () => { 55 | expect(isValidURL(urlSafeEncodedText)).toBe(true); 56 | expect(isValidURL('not+base64')).toBe(false); 57 | expect(Base64.isValidURL(urlSafeEncodedText)).toBe(true); 58 | expect(Base64.isValidURL('not+base64')).toBe(false); 59 | }); 60 | 61 | it('should convert a Uint8Array to a Base64 string', () => { 62 | const uint8Array = new Uint8Array([ 63 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 64 | ]); 65 | expect(fromUint8Array(uint8Array)).toBe(encodedText); 66 | expect(Base64.fromUint8Array(uint8Array)).toBe(encodedText); 67 | }); 68 | 69 | it('should convert a Base64 string to a Uint8Array', () => { 70 | const expectedUint8Array = new Uint8Array([ 71 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 72 | ]); 73 | expect(toUint8Array(encodedText as Base64String)).toEqual(expectedUint8Array); 74 | expect(Base64.toUint8Array(encodedText as Base64String)).toEqual(expectedUint8Array); 75 | }); 76 | 77 | it('should polyfill btoa', () => { 78 | expect(btoa(text)).toBe(encodedText); 79 | expect(Base64.btoa(text)).toBe(encodedText); 80 | }); 81 | 82 | it('should polyfill atob', () => { 83 | expect(atob(encodedText as Base64String)).toBe(text); 84 | expect(Base64.atob(encodedText as Base64String)).toBe(text); 85 | }); 86 | 87 | it('should encode without padding', () => { 88 | const text = 'Hello, world'; 89 | const encoded = 'SGVsbG8sIHdvcmxk'; 90 | expect(encode(text, { omitPadding: true })).toBe(encoded); 91 | expect(Base64.encode(text, { omitPadding: true })).toBe(encoded); 92 | }); 93 | 94 | it('should decode unpadded strings', () => { 95 | const text = 'Hello, world'; 96 | const encoded = 'SGVsbG8sIHdvcmxk'; 97 | expect(decode(encoded as Base64String)).toBe(text); 98 | expect(Base64.decode(encoded as Base64String)).toBe(text); 99 | }); 100 | }); 101 | -------------------------------------------------------------------------------- /src/stream.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | 3 | import { Base64DecodeStream, Base64EncodeStream } from './stream'; 4 | 5 | describe('Streaming API', () => { 6 | it('should encode a stream of strings', async () => { 7 | const stream = new ReadableStream({ 8 | start(controller) { 9 | controller.enqueue('Hello'); 10 | controller.enqueue(', '); 11 | controller.enqueue('world!'); 12 | controller.close(); 13 | }, 14 | }); 15 | 16 | const encodeStream = new Base64EncodeStream(); 17 | const encodedStream = stream.pipeThrough(encodeStream); 18 | 19 | const reader = encodedStream.getReader(); 20 | let result = ''; 21 | let done = false; 22 | 23 | while (!done) { 24 | const { value, done: d } = await reader.read(); 25 | done = d; 26 | if (value) { 27 | result += value; 28 | } 29 | } 30 | 31 | expect(result).toBe('SGVsbG8sIHdvcmxkIQ=='); 32 | }); 33 | 34 | it('should decode a stream of strings', async () => { 35 | const stream = new ReadableStream({ 36 | start(controller) { 37 | controller.enqueue('SGVsbG8'); 38 | controller.enqueue('sIHdvcmxk'); 39 | controller.enqueue('IQ=='); 40 | controller.close(); 41 | }, 42 | }); 43 | 44 | const decodeStream = new Base64DecodeStream(); 45 | const decodedStream = stream.pipeThrough(decodeStream); 46 | 47 | const reader = decodedStream.getReader(); 48 | let result = ''; 49 | let done = false; 50 | 51 | while (!done) { 52 | const { value, done: d } = await reader.read(); 53 | done = d; 54 | if (value) { 55 | result += value; 56 | } 57 | } 58 | 59 | expect(result).toBe('Hello, world!'); 60 | }); 61 | }); 62 | 63 | describe('Streaming API with UTF-8 support', () => { 64 | const utf8Strings = { 65 | 'Hello, world! 👋': 'SGVsbG8sIHdvcmxkISDwn5GL', 66 | '你好,世界!': '5L2g5aW9LOS4lueVjCE=', 67 | 'こんにちは、世界!': '44GT44KT44Gr44Gh44Gv44CB5LiW55WM77yB', 68 | 'Привет, мир!': '0J/RgNC40LLQtdGCLCDQvNC40YAh', 69 | '안녕하세요, 세계!': '7JWI64WV7ZWY7IS47JqULCDshLjqs4Qh', 70 | '👋🌍': '8J+Ri/CfjI0=', 71 | '€15\n': '4oKsMTUK', 72 | François: 'RnJhbsOnb2lz', 73 | Jörg: 'SsO2cmc=', 74 | José: 'Sm9zw6k=', 75 | Tran: 'VHJhbg==', 76 | Trần: 'VHLhuqdu', 77 | أبو: '2KPYqNmI', 78 | }; 79 | 80 | for (const [decoded, encoded] of Object.entries(utf8Strings)) { 81 | it(`should encode a stream of "${decoded}" correctly`, async () => { 82 | const stream = new ReadableStream({ 83 | start(controller) { 84 | controller.enqueue(decoded); 85 | controller.close(); 86 | }, 87 | }); 88 | 89 | const encodeStream = new Base64EncodeStream(); 90 | const encodedStream = stream.pipeThrough(encodeStream); 91 | 92 | const reader = encodedStream.getReader(); 93 | let result = ''; 94 | let done = false; 95 | 96 | while (!done) { 97 | const { value, done: d } = await reader.read(); 98 | done = d; 99 | if (value) { 100 | result += value; 101 | } 102 | } 103 | 104 | expect(result).toBe(encoded); 105 | }); 106 | 107 | it(`should decode a stream of "${encoded}" correctly`, async () => { 108 | const stream = new ReadableStream({ 109 | start(controller) { 110 | controller.enqueue(encoded); 111 | controller.close(); 112 | }, 113 | }); 114 | 115 | const decodeStream = new Base64DecodeStream(); 116 | const decodedStream = stream.pipeThrough(decodeStream); 117 | 118 | const reader = decodedStream.getReader(); 119 | let result = ''; 120 | let done = false; 121 | 122 | while (!done) { 123 | const { value, done: d } = await reader.read(); 124 | done = d; 125 | if (value) { 126 | result += value; 127 | } 128 | } 129 | 130 | expect(result).toBe(decoded); 131 | }); 132 | } 133 | }); 134 | -------------------------------------------------------------------------------- /src/stream.ts: -------------------------------------------------------------------------------- 1 | import { decode } from './decode'; 2 | import { fromUint8Array } from './encode'; 3 | import type { Base64String, TransformStream } from './typings'; 4 | 5 | /** 6 | * A TransformStream that encodes a stream of strings or Uint8Arrays into Base64. 7 | * @example 8 | * ```ts 9 | * import { Base64EncodeStream } from '@se-oss/base64'; 10 | * 11 | * const stream = new ReadableStream({ 12 | * start(controller) { 13 | * controller.enqueue('Hello'); 14 | * controller.enqueue(', '); 15 | * controller.enqueue('world!'); 16 | * controller.close(); 17 | * }, 18 | * }); 19 | * 20 | * const encodeStream = new Base64EncodeStream(); 21 | * const encodedStream = stream.pipeThrough(encodeStream); 22 | * 23 | * const reader = encodedStream.getReader(); 24 | * let result = ''; 25 | * let done = false; 26 | * 27 | * while (!done) { 28 | * const { value, done: d } = await reader.read(); 29 | * done = d; 30 | * if (value) { 31 | * result += value; 32 | * } 33 | * } 34 | * 35 | * console.log(result); // 'SGVsbG8sIHdvcmxkIQ==' 36 | * ``` 37 | */ 38 | export class Base64EncodeStream implements TransformStream { 39 | public readonly readable: ReadableStream; 40 | public readonly writable: WritableStream; 41 | private buffer = new Uint8Array(0); 42 | 43 | constructor() { 44 | const transformer = { 45 | transform: ( 46 | chunk: string | Uint8Array, 47 | controller: TransformStreamDefaultController 48 | ) => { 49 | const chunkBuffer = typeof chunk === 'string' ? new TextEncoder().encode(chunk) : chunk; 50 | 51 | const combinedBuffer = new Uint8Array(this.buffer.length + chunkBuffer.length); 52 | combinedBuffer.set(this.buffer); 53 | combinedBuffer.set(chunkBuffer, this.buffer.length); 54 | this.buffer = combinedBuffer; 55 | 56 | const remaining = this.buffer.length % 3; 57 | const toProcess = this.buffer.subarray(0, this.buffer.length - remaining); 58 | this.buffer = this.buffer.subarray(this.buffer.length - remaining); 59 | 60 | if (toProcess.length > 0) { 61 | controller.enqueue(fromUint8Array(toProcess)); 62 | } 63 | }, 64 | flush: (controller: TransformStreamDefaultController) => { 65 | if (this.buffer.length > 0) { 66 | controller.enqueue(fromUint8Array(this.buffer)); 67 | } 68 | }, 69 | }; 70 | const stream = new globalThis.TransformStream(transformer); 71 | this.readable = stream.readable; 72 | this.writable = stream.writable; 73 | } 74 | } 75 | 76 | /** 77 | * A TransformStream that decodes a stream of Base64 strings into strings. 78 | * @example 79 | * ```ts 80 | * import { Base64DecodeStream } from '@se-oss/base64'; 81 | * 82 | * const stream = new ReadableStream({ 83 | * start(controller) { 84 | * controller.enqueue('SGVsbG8'); 85 | * controller.enqueue('sIHdvcmxk'); 86 | * controller.enqueue('IQ=='); 87 | * controller.close(); 88 | * }, 89 | * }); 90 | * 91 | * const decodeStream = new Base64DecodeStream(); 92 | * const decodedStream = stream.pipeThrough(decodeStream); 93 | * 94 | * const reader = decodedStream.getReader(); 95 | * let result = ''; 96 | * let done = false; 97 | * 98 | * while (!done) { 99 | * const { value, done: d } = await reader.read(); 100 | * done = d; 101 | * if (value) { 102 | * result += value; 103 | * } 104 | * } 105 | * 106 | * console.log(result); // 'Hello, world!' 107 | * ``` 108 | */ 109 | export class Base64DecodeStream implements TransformStream { 110 | public readonly readable: ReadableStream; 111 | public readonly writable: WritableStream; 112 | private buffer = ''; 113 | 114 | constructor() { 115 | const transformer = { 116 | transform: (chunk: Base64String, controller: TransformStreamDefaultController) => { 117 | this.buffer += chunk; 118 | const remaining = this.buffer.length % 4; 119 | const toProcess = this.buffer.slice(0, this.buffer.length - remaining); 120 | this.buffer = this.buffer.slice(this.buffer.length - remaining); 121 | if (toProcess.length > 0) { 122 | controller.enqueue(decode(toProcess as Base64String)); 123 | } 124 | }, 125 | flush: (controller: TransformStreamDefaultController) => { 126 | if (this.buffer.length > 0) { 127 | controller.enqueue(decode(this.buffer as Base64String)); 128 | } 129 | }, 130 | }; 131 | const stream = new globalThis.TransformStream(transformer); 132 | this.readable = stream.readable; 133 | this.writable = stream.writable; 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /src/encode.ts: -------------------------------------------------------------------------------- 1 | import { B64_CHAR_SET } from './constants'; 2 | import type { Base64EncodeOptions, Base64String, Base64UrlString, NotBase64 } from './typings'; 3 | 4 | /** 5 | * Encodes a string into a Base64 encoded string. 6 | * 7 | * @param value The string to encode. 8 | * @param options The options for encoding. 9 | * @returns The Base64 encoded string. 10 | * @throws {TypeError} If the value to encode is not a string. 11 | * @example 12 | * ```ts 13 | * import { encode } from '@se-oss/base64'; 14 | * 15 | * const encoded = encode('Hello, world!'); 16 | * console.log(encoded); // 'SGVsbG8sIHdvcmxkIQ==' 17 | * ``` 18 | */ 19 | export function encode< 20 | SafeURL extends boolean, 21 | Result = SafeURL extends true ? Base64UrlString : Base64String, 22 | >(value: NotBase64, options: Base64EncodeOptions = {}): Result { 23 | if (typeof (value as unknown) !== 'string') { 24 | throw new TypeError('The value to encode must be a string.'); 25 | } 26 | 27 | let result: string; 28 | 29 | // Node.js environment 30 | if (typeof Buffer !== 'undefined') { 31 | result = Buffer.from(value, 'utf-8').toString('base64'); 32 | } 33 | // Browser environment 34 | else if (typeof TextEncoder !== 'undefined' && typeof btoa !== 'undefined') { 35 | const uint8Array = new TextEncoder().encode(value); 36 | 37 | let binaryString = ''; 38 | for (let i = 0; i < uint8Array.length; i++) { 39 | binaryString += String.fromCharCode(uint8Array[i]); 40 | } 41 | result = btoa(binaryString); 42 | } 43 | // Fallback for other environments 44 | else { 45 | const utf8Bytes = new TextEncoder().encode(value); 46 | result = fromUint8Array(utf8Bytes, { 47 | omitPadding: options.omitPadding, 48 | urlSafe: options.urlSafe, 49 | }); 50 | } 51 | 52 | if (options.urlSafe) { 53 | result = result.replace(/\+/g, '-').replace(/\//g, '_'); 54 | } 55 | 56 | if (options.omitPadding) { 57 | result = result.replace(/=+$/, ''); 58 | } 59 | 60 | return result as Result; 61 | } 62 | 63 | /** 64 | * Encodes a string into a URL-safe Base64 encoded string. 65 | * 66 | * @param value The string to encode. 67 | * @param options The options for encoding. 68 | * @returns The URL-safe Base64 encoded string. 69 | * @example 70 | * ```ts 71 | * import { encodeURL } from '@se-oss/base64'; 72 | * 73 | * // The input contains characters that are not URL-safe in Base64 74 | * const encoded = encodeURL('?\xbf\xff'); 75 | * console.log(encoded); // 'P7_f' 76 | * ``` 77 | */ 78 | export function encodeURL(value: NotBase64, options: Base64EncodeOptions = {}): Base64UrlString { 79 | return encode(value, { ...options, urlSafe: true }) as Base64UrlString; 80 | } 81 | 82 | /** 83 | * Converts a `Uint8Array` to a Base64 encoded string. 84 | * 85 | * @param value The `Uint8Array` to convert. 86 | * @param options The options for encoding. 87 | * @returns The Base64 encoded string. 88 | * @throws {TypeError} If the value to convert is not a Uint8Array. 89 | * @example 90 | * ```ts 91 | * import { fromUint8Array } from '@se-oss/base64'; 92 | * 93 | * const uint8 = new Uint8Array([72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33]); 94 | * const encoded = fromUint8Array(uint8); 95 | * console.log(encoded); // 'SGVsbG8sIHdvcmxkIQ==' 96 | * ``` 97 | */ 98 | export function fromUint8Array< 99 | SafeURL extends boolean, 100 | Result = SafeURL extends true ? Base64UrlString : Base64String, 101 | >(value: Uint8Array, options: Base64EncodeOptions = {}): Result { 102 | if (typeof value !== 'object' || value.constructor.name !== 'Uint8Array') { 103 | throw new TypeError('The value to convert must be a Uint8Array.'); 104 | } 105 | 106 | let result: string; 107 | 108 | // Node.js environment 109 | if (typeof Buffer !== 'undefined') { 110 | result = Buffer.from(value).toString('base64'); 111 | } 112 | 113 | // Browser environment 114 | else if (typeof btoa !== 'undefined') { 115 | let binaryString = ''; 116 | const chunkSize = 4096; 117 | for (let i = 0; i < value.length; i += chunkSize) { 118 | binaryString += String.fromCharCode.apply(null, Array.from(value.subarray(i, i + chunkSize))); 119 | } 120 | result = btoa(binaryString); 121 | } 122 | 123 | // Fallback 124 | else { 125 | let res = ''; 126 | const chars = B64_CHAR_SET; 127 | let i = 0; 128 | const len = value.length; 129 | 130 | while (i < len) { 131 | const remainingBytes = len - i; 132 | 133 | const chr1 = value[i++]; 134 | const chr2 = i < len ? value[i++] : 0; 135 | const chr3 = i < len ? value[i++] : 0; 136 | 137 | const enc1 = chr1 >> 2; 138 | const enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 139 | const enc3 = remainingBytes > 1 ? ((chr2 & 15) << 2) | (chr3 >> 6) : 64; 140 | const enc4 = remainingBytes > 2 ? chr3 & 63 : 64; 141 | 142 | res += chars.charAt(enc1) + chars.charAt(enc2) + chars.charAt(enc3) + chars.charAt(enc4); 143 | } 144 | result = res; 145 | } 146 | 147 | if (options.urlSafe) { 148 | result = result.replace(/\+/g, '-').replace(/\//g, '_'); 149 | } 150 | 151 | if (options.omitPadding) { 152 | result = result.replace(/=/g, ''); 153 | } 154 | 155 | return result as Result; 156 | } 157 | 158 | /** 159 | * Encodes a string into a Base64-encoded Data URL. 160 | * 161 | * @param value The string to encode. 162 | * @param mimeType The MIME type of the data. 163 | * @param options The options for encoding. 164 | * @returns The Base64-encoded Data URL. 165 | * @example 166 | * ```ts 167 | * import { toDataURL } from '@se-oss/base64'; 168 | * 169 | * const dataURL = toDataURL('Hello, world!', 'text/plain'); 170 | * console.log(dataURL); // 'data:text/plain;base64,SGVsbG8sIHdvcmxkIQ==' 171 | * ``` 172 | */ 173 | export function toDataURL( 174 | value: NotBase64, 175 | mimeType: string, 176 | options: Base64EncodeOptions = {} 177 | ): string { 178 | const encoded = encode(value, options); 179 | return `data:${mimeType};base64,${encoded}`; 180 | } 181 | -------------------------------------------------------------------------------- /src/decode.ts: -------------------------------------------------------------------------------- 1 | import { B64_LOOKUP, B64_REGEX, B64_URL_REGEX } from './constants'; 2 | import { InvalidBase64Error, InvalidDataURLError } from './errors'; 3 | import type { 4 | Base64DecodeOptions, 5 | Base64String, 6 | Base64UrlString, 7 | MaybeBase64, 8 | NotBase64, 9 | } from './typings'; 10 | 11 | /** 12 | * Checks if a string is a valid Base64 encoded string. 13 | * 14 | * @param value The string to check. 15 | * @param options The options for decoding. 16 | * @returns `true` if the string is a valid Base64 encoded string, `false` otherwise. 17 | * @example 18 | * ```ts 19 | * import { isValid } from '@se-oss/base64'; 20 | * 21 | * console.log(isValid('SGVsbG8sIHdvcmxkIQ==')); // true 22 | * console.log(isValid('not base64')); // false 23 | * ``` 24 | */ 25 | export function isValid( 26 | value: MaybeBase64, 27 | options: Base64DecodeOptions = {} 28 | ): value is Base64String { 29 | if (typeof value !== 'string') { 30 | return false; 31 | } 32 | if (options.urlSafe) { 33 | return B64_URL_REGEX.test(value); 34 | } 35 | return B64_REGEX.test(value); 36 | } 37 | 38 | /** 39 | * Checks if a string is a valid URL-safe Base64 encoded string. 40 | * 41 | * @param value The string to check. 42 | * @returns `true` if the string is a valid URL-safe Base64 encoded string, `false` otherwise. 43 | * @example 44 | * ```ts 45 | * import { isValidURL } from '@se-oss/base64'; 46 | * 47 | * console.log(isValidURL('P7_f')); // true 48 | * console.log(isValidURL('SGVsbG8sIHdvcmxkIQ==')); // false 49 | * ``` 50 | */ 51 | export function isValidURL(value: MaybeBase64): value is Base64UrlString { 52 | if (typeof value !== 'string') { 53 | return false; 54 | } 55 | return B64_URL_REGEX.test(value); 56 | } 57 | 58 | /** 59 | * Decodes a Base64 encoded string. 60 | * 61 | * @param value The Base64 encoded string to decode. 62 | * @param options The options for decoding. 63 | * @returns The decoded string. 64 | * @throws {InvalidBase64Error} If the input is not a valid Base64 string. 65 | * @example 66 | * ```ts 67 | * import { decode } from '@se-oss/base64'; 68 | * 69 | * const decoded = decode('SGVsbG8sIHdvcmxkIQ=='); 70 | * console.log(decoded); // 'Hello, world!' 71 | * ``` 72 | */ 73 | export function decode(value: MaybeBase64, options: Base64DecodeOptions = {}): NotBase64 { 74 | if (typeof value !== 'string') { 75 | throw new InvalidBase64Error('The value to decode must be a string.'); 76 | } 77 | 78 | let base64: string = value; 79 | if (options.urlSafe) { 80 | base64 = base64.replace(/-/g, '+').replace(/_/g, '/'); 81 | } 82 | 83 | while (base64.length % 4) { 84 | base64 += '='; 85 | } 86 | 87 | // Node.js environment 88 | if (typeof Buffer !== 'undefined') { 89 | return Buffer.from(base64, 'base64').toString('utf-8'); 90 | } 91 | 92 | // Browser environment 93 | else if (typeof TextDecoder !== 'undefined' && typeof atob !== 'undefined') { 94 | const binaryString = atob(base64); 95 | const uint8Array = new Uint8Array(binaryString.length); 96 | for (let i = 0; i < binaryString.length; i++) { 97 | uint8Array[i] = binaryString.charCodeAt(i); 98 | } 99 | return new TextDecoder().decode(uint8Array); 100 | } 101 | 102 | // Fallback for other environments 103 | else { 104 | const uint8Array = toUint8Array(base64, { urlSafe: options.urlSafe }); 105 | return new TextDecoder().decode(uint8Array); 106 | } 107 | } 108 | 109 | /** 110 | * Decodes a URL-safe Base64 encoded string. 111 | * 112 | * @param value The URL-safe Base64 encoded string to decode. 113 | * @returns The decoded string. 114 | * @example 115 | * ```ts 116 | * import { decodeURL } from '@se-oss/base64'; 117 | * 118 | * const decoded = decodeURL('P7_f'); 119 | * console.log(decoded); // '?\xbf\xff' 120 | * ``` 121 | */ 122 | export function decodeURL(value: Base64UrlString): NotBase64 { 123 | return decode(value, { urlSafe: true }); 124 | } 125 | 126 | /** 127 | * Converts a Base64 encoded string to a `Uint8Array`. 128 | * 129 | * @param value The Base64 encoded string to convert. 130 | * @param options The options for decoding. 131 | * @returns The `Uint8Array`. 132 | * @example 133 | * ```ts 134 | * import { toUint8Array } from '@se-oss/base64'; 135 | * 136 | * const uint8 = toUint8Array('SGVsbG8sIHdvcmxkIQ=='); 137 | * console.log(uint8); // Uint8Array(13) [ 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33 ] 138 | * ``` 139 | */ 140 | export function toUint8Array(value: MaybeBase64, options: Base64DecodeOptions = {}): Uint8Array { 141 | if (typeof value !== 'string') { 142 | throw new InvalidBase64Error('The value to decode must be a string.'); 143 | } 144 | 145 | let base64: string = value; 146 | if (options.urlSafe) { 147 | base64 = base64.replace(/-/g, '+').replace(/_/g, '/'); 148 | } 149 | 150 | // Node.js environment 151 | if (typeof Buffer !== 'undefined') { 152 | return new Uint8Array(Buffer.from(base64, 'base64')); 153 | } 154 | 155 | // Browser environment 156 | if (typeof TextDecoder !== 'undefined' && typeof atob !== 'undefined') { 157 | const binaryString = atob(base64); 158 | const uint8Array = new Uint8Array(binaryString.length); 159 | for (let i = 0; i < binaryString.length; i++) { 160 | uint8Array[i] = binaryString.charCodeAt(i); 161 | } 162 | return uint8Array; 163 | } 164 | 165 | while (base64.length % 4) { 166 | base64 += '='; 167 | } 168 | 169 | const lookup = B64_LOOKUP; 170 | const bytes = new Uint8Array((base64.length * 3) / 4); // Allocate maximum possible size 171 | let i = 0; 172 | let j = 0; 173 | 174 | const sanitizedValue = base64.replace(/[^A-Za-z0-9+/=]/g, ''); 175 | 176 | while (i < sanitizedValue.length) { 177 | const enc1 = lookup[sanitizedValue.charAt(i++)]; 178 | const enc2 = lookup[sanitizedValue.charAt(i++)]; 179 | const enc3 = lookup[sanitizedValue.charAt(i++)]; 180 | const enc4 = lookup[sanitizedValue.charAt(i++)]; 181 | 182 | const chr1 = (enc1 << 2) | (enc2 >> 4); 183 | const chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 184 | const chr3 = ((enc3 & 3) << 6) | enc4; 185 | 186 | bytes[j++] = chr1; 187 | 188 | if (enc3 !== 64) { 189 | bytes[j++] = chr2; 190 | } 191 | if (enc4 !== 64) { 192 | bytes[j++] = chr3; 193 | } 194 | } 195 | 196 | return bytes.slice(0, j); 197 | } 198 | 199 | /** 200 | * Decodes a Base64-encoded Data URL. 201 | * 202 | * @param dataURL The Data URL to decode. 203 | * @returns An object containing the decoded data and the MIME type. 204 | * @throws {InvalidDataURLError} If the input is not a valid Data URL. 205 | * @example 206 | * ```ts 207 | * import { fromDataURL } from '@se-oss/base64'; 208 | * 209 | * const { data, mimeType } = fromDataURL('data:text/plain;base64,SGVsbG8sIHdvcmxkIQ=='); 210 | * console.log(data); // 'Hello, world!' 211 | * console.log(mimeType); // 'text/plain' 212 | * ``` 213 | */ 214 | export function fromDataURL(dataURL: string): { data: NotBase64; mimeType: string } { 215 | const match = dataURL.match(/^data:(?[\w/\-+.]{1,100});base64,(?.*)$/); 216 | 217 | if (!match?.groups) { 218 | throw new InvalidDataURLError('Invalid Data URL.'); 219 | } 220 | 221 | const { mime, data } = match.groups; 222 | const decoded = decode(data as Base64String); 223 | 224 | return { data: decoded, mimeType: mime }; 225 | } 226 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @se-oss/base64 2 | 3 | [![CI](https://github.com/shahradelahi/ts-base64/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/shahradelahi/ts-base64/actions/workflows/ci.yml) 4 | [![NPM Version](https://img.shields.io/npm/v/@se-oss/base64.svg)](https://www.npmjs.com/package/@se-oss/base64) 5 | [![MIT License](https://img.shields.io/badge/License-MIT-blue.svg?style=flat)](/LICENSE) 6 | ![npm bundle size](https://img.shields.io/bundlephobia/minzip/@se-oss/base64) 7 | [![Install Size](https://packagephobia.com/badge?p=@se-oss/base64)](https://packagephobia.com/result?p=@se-oss/base64) 8 | 9 | _@se-oss/base64_ is a library for Base64 for TypeScript, and it provides a comprehensive set of tools for Base64 encoding and decoding, with support for URL-safe encoding, Uint8Array conversion, and a class-based API. 10 | 11 | --- 12 | 13 | - [Installation](#-installation) 14 | - [Usage](#-usage) 15 | - [Functions](#functions) 16 | - [Class](#class) 17 | - [Streaming API](#streaming-api) 18 | - [Prototype Extensions](#prototype-extensions) 19 | - [Advanced Configuration](#advanced-configuration) 20 | - [Omitting Padding](#omitting-padding) 21 | - [Error Handling](#error-handling) 22 | - [Performance](#-performance) 23 | - [Contributing](#-contributing) 24 | - [License](#license) 25 | 26 | ## 📦 Installation 27 | 28 | ```bash 29 | npm install @se-oss/base64 30 | ``` 31 | 32 |
33 | Install using your favorite package manager 34 | 35 | **pnpm** 36 | 37 | ```bash 38 | pnpm install @se-oss/base64 39 | ``` 40 | 41 | **yarn** 42 | 43 | ```bash 44 | yarn add @se-oss/base64 45 | ``` 46 | 47 |
48 | 49 | ## 📖 Usage 50 | 51 | You can use the library as a collection of functions or as a class. 52 | 53 | ### Functions 54 | 55 | ```typescript 56 | import { 57 | decode, 58 | decodeURL, 59 | encode, 60 | encodeURL, 61 | fromUint8Array, 62 | isValid, 63 | toUint8Array, 64 | } from '@se-oss/base64'; 65 | 66 | const text = 'Hello, world!'; 67 | 68 | // Encode and decode 69 | const encoded = encode(text); // 'SGVsbG8sIHdvcmxkIQ==' 70 | const decoded = decode(encoded); // 'Hello, world!' 71 | 72 | // URL-safe encode and decode 73 | const urlSafeEncoded = encodeURL(text); // 'SGVsbG8sIHdvcmxkIQ' 74 | const urlSafeDecoded = decodeURL(urlSafeEncoded); // 'Hello, world!' 75 | 76 | // Check for valid Base64 77 | isValid(encoded); // true 78 | isValid('not base64'); // false 79 | 80 | // Work with Uint8Arrays 81 | const uint8Array = new Uint8Array([ 82 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 83 | ]); 84 | const encodedFromUint8Array = fromUint8Array(uint8Array); // 'SGVsbG8sIHdvcmxkIQ==' 85 | const decodedToUint8Array = toUint8Array(encodedFromUint8Array); // Uint8Array([72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33]) 86 | ``` 87 | 88 | ### Class 89 | 90 | ```typescript 91 | import { Base64 } from '@se-oss/base64'; 92 | 93 | const text = 'Hello, world!'; 94 | 95 | // Encode and decode 96 | const encoded = Base64.encode(text); // 'SGVsbG8sIHdvcmxkIQ==' 97 | const decoded = Base64.decode(encoded); // 'Hello, world!' 98 | 99 | // URL-safe encode and decode 100 | const urlSafeEncoded = Base64.encodeURL(text); // 'SGVsbG8sIHdvcmxkIQ' 101 | const urlSafeDecoded = Base64.decodeURL(urlSafeEncoded); // 'Hello, world!' 102 | 103 | // Check for valid Base64 104 | Base64.isValid(encoded); // true 105 | Base64.isValid('not base64'); // false 106 | 107 | // Work with Uint8Arrays 108 | const uint8Array = new Uint8Array([ 109 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 110 | ]); 111 | const encodedFromUint8Array = Base64.fromUint8Array(uint8Array); // 'SGVsbG8sIHdvcmxkIQ==' 112 | const decodedToUint8Array = Base64.toUint8Array(encodedFromUint8Array); // Uint8Array([72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33]) 113 | ``` 114 | 115 | ### Streaming API 116 | 117 | The library provides a streaming API for encoding and decoding large data without high memory consumption. 118 | 119 | ```typescript 120 | import { Base64DecodeStream, Base64EncodeStream } from '@se-oss/base64'; 121 | 122 | const stream = new ReadableStream({ 123 | start(controller) { 124 | controller.enqueue('Hello'); 125 | controller.enqueue(', '); 126 | controller.enqueue('world!'); 127 | controller.close(); 128 | }, 129 | }); 130 | 131 | const encodeStream = new Base64EncodeStream(); 132 | const encodedStream = stream.pipeThrough(encodeStream); 133 | 134 | const reader = encodedStream.getReader(); 135 | let result = ''; 136 | let done = false; 137 | 138 | while (!done) { 139 | const { value, done: d } = await reader.read(); 140 | done = d; 141 | if (value) { 142 | result += value; 143 | } 144 | } 145 | 146 | console.log(result); // 'SGVsbG8sIHdvcmxkIQ==' 147 | ``` 148 | 149 | ### Prototype Extensions 150 | 151 | You can opt-in to prototype extensions to add `toBase64`, `fromBase64`, and `toUint8Array` methods to `String.prototype` and `Uint8Array.prototype`. 152 | 153 | ```typescript 154 | import '@se-oss/base64/extend'; 155 | 156 | const text = 'Hello, world!'; 157 | const encodedText = 'SGVsbG8sIHdvcmxkIQ=='; 158 | 159 | // String extensions 160 | text.toBase64(); // 'SGVsbG8sIHdvcmxkIQ==' 161 | encodedText.fromBase64(); // 'Hello, world!' 162 | encodedText.toUint8Array(); // Uint8Array([72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33]) 163 | 164 | // Uint8Array extension 165 | const uint8Array = new Uint8Array([ 166 | 72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 167 | ]); 168 | uint8Array.toBase64(); // 'SGVsbG8sIHdvcmxkIQ==' 169 | ``` 170 | 171 | ## Advanced Configuration 172 | 173 | ### Omitting Padding 174 | 175 | You can omit the padding characters (`=`) from the encoded string by passing an options object to the `encode` function. 176 | 177 | ```typescript 178 | import { encode } from '@se-oss/base64'; 179 | 180 | const text = 'Hello, world'; 181 | const encoded = encode(text, { omitPadding: true }); // 'SGVsbG8sIHdvcmxk' 182 | ``` 183 | 184 | The `decode` function can handle both padded and unpadded strings. 185 | 186 | ## 🚀 Performance 187 | 188 | The benchmarks are run against the native `btoa`/`atob` functions and the popular `js-base64` library. 189 | 190 | | Function | @se-oss/base64 (ops/sec) | js-base64 (ops/sec) | Native (ops/sec) | 191 | | :--------------- | :----------------------- | :------------------ | :--------------- | 192 | | `encode` | 1,567.04 | 1,547.28 | **1,985.42** | 193 | | `decode` | 2,303.86 | 656.18 | **2,965.57** | 194 | | `fromUint8Array` | **3,741.40** | 3,476.93 | - | 195 | | `toUint8Array` | **3,941.51** | 763.89 | - | 196 | | `toDataURL` | **1,580.90** | - | - | 197 | | `fromDataURL` | **899.29** | - | - | 198 | 199 | _Benchmark script: [`src/index.bench.ts`](src/index.bench.ts)_ 200 | 201 | ## 🤝 Contributing 202 | 203 | Want to contribute? Awesome! To show your support is to star the project, or to raise issues on [GitHub](https://github.com/shahradelahi/ts-base64) 204 | 205 | Thanks again for your support, it is much appreciated! 🙏 206 | 207 | ## License 208 | 209 | [MIT](/LICENSE) © [Shahrad Elahi](https://github.com/shahradelahi) and [contributors](https://github.com/shahradelahi/ts-base64/graphs/contributors). 210 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@shahrad/eslint-config': 12 | specifier: ^1.0.1 13 | version: 1.0.1(jiti@2.5.1)(typescript@5.9.3) 14 | '@shahrad/prettier-config': 15 | specifier: ^1.2.2 16 | version: 1.2.2(@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.6.2))(prettier-plugin-packagejson@2.5.18(prettier@3.6.2))(prettier-plugin-sh@0.15.0(prettier@3.6.2))(prettier@3.6.2) 17 | '@shahrad/tsconfig': 18 | specifier: ^1.2.0 19 | version: 1.2.0 20 | '@types/node': 21 | specifier: ^24.9.2 22 | version: 24.9.2 23 | eslint: 24 | specifier: ^9.38.0 25 | version: 9.38.0(jiti@2.5.1) 26 | globals: 27 | specifier: ^16.4.0 28 | version: 16.4.0 29 | js-base64: 30 | specifier: ^3.7.8 31 | version: 3.7.8 32 | prettier: 33 | specifier: ^3.6.2 34 | version: 3.6.2 35 | tsup: 36 | specifier: ^8.5.0 37 | version: 8.5.0(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3) 38 | typescript: 39 | specifier: ^5.9.3 40 | version: 5.9.3 41 | vitest: 42 | specifier: ^4.0.5 43 | version: 4.0.5(@types/node@24.9.2)(jiti@2.5.1)(tsx@4.20.6) 44 | 45 | packages: 46 | 47 | '@babel/code-frame@7.27.1': 48 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 49 | engines: {node: '>=6.9.0'} 50 | 51 | '@babel/generator@7.28.5': 52 | resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 53 | engines: {node: '>=6.9.0'} 54 | 55 | '@babel/helper-globals@7.28.0': 56 | resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 57 | engines: {node: '>=6.9.0'} 58 | 59 | '@babel/helper-string-parser@7.27.1': 60 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 61 | engines: {node: '>=6.9.0'} 62 | 63 | '@babel/helper-validator-identifier@7.28.5': 64 | resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 65 | engines: {node: '>=6.9.0'} 66 | 67 | '@babel/parser@7.28.5': 68 | resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 69 | engines: {node: '>=6.0.0'} 70 | hasBin: true 71 | 72 | '@babel/template@7.27.2': 73 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 74 | engines: {node: '>=6.9.0'} 75 | 76 | '@babel/traverse@7.28.5': 77 | resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 78 | engines: {node: '>=6.9.0'} 79 | 80 | '@babel/types@7.28.5': 81 | resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 82 | engines: {node: '>=6.9.0'} 83 | 84 | '@esbuild/aix-ppc64@0.25.11': 85 | resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} 86 | engines: {node: '>=18'} 87 | cpu: [ppc64] 88 | os: [aix] 89 | 90 | '@esbuild/android-arm64@0.25.11': 91 | resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} 92 | engines: {node: '>=18'} 93 | cpu: [arm64] 94 | os: [android] 95 | 96 | '@esbuild/android-arm@0.25.11': 97 | resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} 98 | engines: {node: '>=18'} 99 | cpu: [arm] 100 | os: [android] 101 | 102 | '@esbuild/android-x64@0.25.11': 103 | resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} 104 | engines: {node: '>=18'} 105 | cpu: [x64] 106 | os: [android] 107 | 108 | '@esbuild/darwin-arm64@0.25.11': 109 | resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} 110 | engines: {node: '>=18'} 111 | cpu: [arm64] 112 | os: [darwin] 113 | 114 | '@esbuild/darwin-x64@0.25.11': 115 | resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} 116 | engines: {node: '>=18'} 117 | cpu: [x64] 118 | os: [darwin] 119 | 120 | '@esbuild/freebsd-arm64@0.25.11': 121 | resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} 122 | engines: {node: '>=18'} 123 | cpu: [arm64] 124 | os: [freebsd] 125 | 126 | '@esbuild/freebsd-x64@0.25.11': 127 | resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} 128 | engines: {node: '>=18'} 129 | cpu: [x64] 130 | os: [freebsd] 131 | 132 | '@esbuild/linux-arm64@0.25.11': 133 | resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} 134 | engines: {node: '>=18'} 135 | cpu: [arm64] 136 | os: [linux] 137 | 138 | '@esbuild/linux-arm@0.25.11': 139 | resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} 140 | engines: {node: '>=18'} 141 | cpu: [arm] 142 | os: [linux] 143 | 144 | '@esbuild/linux-ia32@0.25.11': 145 | resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} 146 | engines: {node: '>=18'} 147 | cpu: [ia32] 148 | os: [linux] 149 | 150 | '@esbuild/linux-loong64@0.25.11': 151 | resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} 152 | engines: {node: '>=18'} 153 | cpu: [loong64] 154 | os: [linux] 155 | 156 | '@esbuild/linux-mips64el@0.25.11': 157 | resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} 158 | engines: {node: '>=18'} 159 | cpu: [mips64el] 160 | os: [linux] 161 | 162 | '@esbuild/linux-ppc64@0.25.11': 163 | resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} 164 | engines: {node: '>=18'} 165 | cpu: [ppc64] 166 | os: [linux] 167 | 168 | '@esbuild/linux-riscv64@0.25.11': 169 | resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} 170 | engines: {node: '>=18'} 171 | cpu: [riscv64] 172 | os: [linux] 173 | 174 | '@esbuild/linux-s390x@0.25.11': 175 | resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} 176 | engines: {node: '>=18'} 177 | cpu: [s390x] 178 | os: [linux] 179 | 180 | '@esbuild/linux-x64@0.25.11': 181 | resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} 182 | engines: {node: '>=18'} 183 | cpu: [x64] 184 | os: [linux] 185 | 186 | '@esbuild/netbsd-arm64@0.25.11': 187 | resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} 188 | engines: {node: '>=18'} 189 | cpu: [arm64] 190 | os: [netbsd] 191 | 192 | '@esbuild/netbsd-x64@0.25.11': 193 | resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} 194 | engines: {node: '>=18'} 195 | cpu: [x64] 196 | os: [netbsd] 197 | 198 | '@esbuild/openbsd-arm64@0.25.11': 199 | resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} 200 | engines: {node: '>=18'} 201 | cpu: [arm64] 202 | os: [openbsd] 203 | 204 | '@esbuild/openbsd-x64@0.25.11': 205 | resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} 206 | engines: {node: '>=18'} 207 | cpu: [x64] 208 | os: [openbsd] 209 | 210 | '@esbuild/openharmony-arm64@0.25.11': 211 | resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} 212 | engines: {node: '>=18'} 213 | cpu: [arm64] 214 | os: [openharmony] 215 | 216 | '@esbuild/sunos-x64@0.25.11': 217 | resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} 218 | engines: {node: '>=18'} 219 | cpu: [x64] 220 | os: [sunos] 221 | 222 | '@esbuild/win32-arm64@0.25.11': 223 | resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} 224 | engines: {node: '>=18'} 225 | cpu: [arm64] 226 | os: [win32] 227 | 228 | '@esbuild/win32-ia32@0.25.11': 229 | resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} 230 | engines: {node: '>=18'} 231 | cpu: [ia32] 232 | os: [win32] 233 | 234 | '@esbuild/win32-x64@0.25.11': 235 | resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} 236 | engines: {node: '>=18'} 237 | cpu: [x64] 238 | os: [win32] 239 | 240 | '@eslint-community/eslint-utils@4.9.0': 241 | resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 242 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 243 | peerDependencies: 244 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 245 | 246 | '@eslint-community/regexpp@4.12.2': 247 | resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 248 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 249 | 250 | '@eslint/config-array@0.21.1': 251 | resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 252 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 253 | 254 | '@eslint/config-helpers@0.4.2': 255 | resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 256 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 257 | 258 | '@eslint/core@0.16.0': 259 | resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} 260 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 261 | 262 | '@eslint/core@0.17.0': 263 | resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 264 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 265 | 266 | '@eslint/eslintrc@3.3.1': 267 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 268 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 269 | 270 | '@eslint/js@9.38.0': 271 | resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} 272 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 273 | 274 | '@eslint/object-schema@2.1.7': 275 | resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 276 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 277 | 278 | '@eslint/plugin-kit@0.4.1': 279 | resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 280 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 281 | 282 | '@humanfs/core@0.19.1': 283 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 284 | engines: {node: '>=18.18.0'} 285 | 286 | '@humanfs/node@0.16.7': 287 | resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 288 | engines: {node: '>=18.18.0'} 289 | 290 | '@humanwhocodes/module-importer@1.0.1': 291 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 292 | engines: {node: '>=12.22'} 293 | 294 | '@humanwhocodes/retry@0.4.3': 295 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 296 | engines: {node: '>=18.18'} 297 | 298 | '@ianvs/prettier-plugin-sort-imports@4.5.1': 299 | resolution: {integrity: sha512-vOQwIyQHnHz0ikvHEQDzwUkNfX74o/7qNEpm9LiPtyBvCg/AU/DOkhwe1o92chPS1QzS6G7HeiO+OwIt8a358A==} 300 | peerDependencies: 301 | '@prettier/plugin-oxc': ^0.0.4 302 | '@vue/compiler-sfc': 2.7.x || 3.x 303 | prettier: 2 || 3 || ^4.0.0-0 304 | peerDependenciesMeta: 305 | '@prettier/plugin-oxc': 306 | optional: true 307 | '@vue/compiler-sfc': 308 | optional: true 309 | 310 | '@isaacs/cliui@8.0.2': 311 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 312 | engines: {node: '>=12'} 313 | 314 | '@jridgewell/gen-mapping@0.3.13': 315 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 316 | 317 | '@jridgewell/resolve-uri@3.1.2': 318 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 319 | engines: {node: '>=6.0.0'} 320 | 321 | '@jridgewell/sourcemap-codec@1.5.5': 322 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 323 | 324 | '@jridgewell/trace-mapping@0.3.31': 325 | resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 326 | 327 | '@nodelib/fs.scandir@2.1.5': 328 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 329 | engines: {node: '>= 8'} 330 | 331 | '@nodelib/fs.stat@2.0.5': 332 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 333 | engines: {node: '>= 8'} 334 | 335 | '@nodelib/fs.walk@1.2.8': 336 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 337 | engines: {node: '>= 8'} 338 | 339 | '@pkgjs/parseargs@0.11.0': 340 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 341 | engines: {node: '>=14'} 342 | 343 | '@pkgr/core@0.2.9': 344 | resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} 345 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 346 | 347 | '@rollup/rollup-android-arm-eabi@4.52.5': 348 | resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} 349 | cpu: [arm] 350 | os: [android] 351 | 352 | '@rollup/rollup-android-arm64@4.52.5': 353 | resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} 354 | cpu: [arm64] 355 | os: [android] 356 | 357 | '@rollup/rollup-darwin-arm64@4.52.5': 358 | resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} 359 | cpu: [arm64] 360 | os: [darwin] 361 | 362 | '@rollup/rollup-darwin-x64@4.52.5': 363 | resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} 364 | cpu: [x64] 365 | os: [darwin] 366 | 367 | '@rollup/rollup-freebsd-arm64@4.52.5': 368 | resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} 369 | cpu: [arm64] 370 | os: [freebsd] 371 | 372 | '@rollup/rollup-freebsd-x64@4.52.5': 373 | resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} 374 | cpu: [x64] 375 | os: [freebsd] 376 | 377 | '@rollup/rollup-linux-arm-gnueabihf@4.52.5': 378 | resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} 379 | cpu: [arm] 380 | os: [linux] 381 | 382 | '@rollup/rollup-linux-arm-musleabihf@4.52.5': 383 | resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} 384 | cpu: [arm] 385 | os: [linux] 386 | 387 | '@rollup/rollup-linux-arm64-gnu@4.52.5': 388 | resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} 389 | cpu: [arm64] 390 | os: [linux] 391 | 392 | '@rollup/rollup-linux-arm64-musl@4.52.5': 393 | resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} 394 | cpu: [arm64] 395 | os: [linux] 396 | 397 | '@rollup/rollup-linux-loong64-gnu@4.52.5': 398 | resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} 399 | cpu: [loong64] 400 | os: [linux] 401 | 402 | '@rollup/rollup-linux-ppc64-gnu@4.52.5': 403 | resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} 404 | cpu: [ppc64] 405 | os: [linux] 406 | 407 | '@rollup/rollup-linux-riscv64-gnu@4.52.5': 408 | resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} 409 | cpu: [riscv64] 410 | os: [linux] 411 | 412 | '@rollup/rollup-linux-riscv64-musl@4.52.5': 413 | resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} 414 | cpu: [riscv64] 415 | os: [linux] 416 | 417 | '@rollup/rollup-linux-s390x-gnu@4.52.5': 418 | resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} 419 | cpu: [s390x] 420 | os: [linux] 421 | 422 | '@rollup/rollup-linux-x64-gnu@4.52.5': 423 | resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} 424 | cpu: [x64] 425 | os: [linux] 426 | 427 | '@rollup/rollup-linux-x64-musl@4.52.5': 428 | resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} 429 | cpu: [x64] 430 | os: [linux] 431 | 432 | '@rollup/rollup-openharmony-arm64@4.52.5': 433 | resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} 434 | cpu: [arm64] 435 | os: [openharmony] 436 | 437 | '@rollup/rollup-win32-arm64-msvc@4.52.5': 438 | resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} 439 | cpu: [arm64] 440 | os: [win32] 441 | 442 | '@rollup/rollup-win32-ia32-msvc@4.52.5': 443 | resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} 444 | cpu: [ia32] 445 | os: [win32] 446 | 447 | '@rollup/rollup-win32-x64-gnu@4.52.5': 448 | resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} 449 | cpu: [x64] 450 | os: [win32] 451 | 452 | '@rollup/rollup-win32-x64-msvc@4.52.5': 453 | resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} 454 | cpu: [x64] 455 | os: [win32] 456 | 457 | '@shahrad/eslint-config@1.0.1': 458 | resolution: {integrity: sha512-Gfjh8cdcptBjL14dWACJZ0tZy8KJdcVsOVWmyKa82v5PoLPZ4avMrT1hJyEWg0APhS1054M/udaBrlCAuHJ9XQ==} 459 | 460 | '@shahrad/prettier-config@1.2.2': 461 | resolution: {integrity: sha512-D6yRqGjD9mhdC5cWQkdoatybNmp6eZJZQ1IerFaANQL1pgtNyEasE2yFy3JdDxJRbHcL2GeaI/03tEPchU+Ddw==} 462 | peerDependencies: 463 | '@ianvs/prettier-plugin-sort-imports': ^4.4 464 | prettier: '>=3.0.0' 465 | prettier-plugin-packagejson: ^2.5 466 | prettier-plugin-sh: ^0.15 467 | 468 | '@shahrad/tsconfig@1.2.0': 469 | resolution: {integrity: sha512-5NM7tPrvUGF+VPqNgsjgWJ5aLJBcNiM/7aAsXw3PEZVek4Mfxq4vd7BLbjUsYd9HizgaNeCmfK5kIsxtCXp7/Q==} 470 | engines: {node: '>=18'} 471 | 472 | '@standard-schema/spec@1.0.0': 473 | resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} 474 | 475 | '@types/chai@5.2.3': 476 | resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} 477 | 478 | '@types/deep-eql@4.0.2': 479 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} 480 | 481 | '@types/estree@1.0.8': 482 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 483 | 484 | '@types/json-schema@7.0.15': 485 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 486 | 487 | '@types/node@24.9.2': 488 | resolution: {integrity: sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==} 489 | 490 | '@typescript-eslint/eslint-plugin@8.46.2': 491 | resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} 492 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 493 | peerDependencies: 494 | '@typescript-eslint/parser': ^8.46.2 495 | eslint: ^8.57.0 || ^9.0.0 496 | typescript: '>=4.8.4 <6.0.0' 497 | 498 | '@typescript-eslint/parser@8.46.2': 499 | resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} 500 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 501 | peerDependencies: 502 | eslint: ^8.57.0 || ^9.0.0 503 | typescript: '>=4.8.4 <6.0.0' 504 | 505 | '@typescript-eslint/project-service@8.46.2': 506 | resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} 507 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 508 | peerDependencies: 509 | typescript: '>=4.8.4 <6.0.0' 510 | 511 | '@typescript-eslint/scope-manager@8.46.2': 512 | resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} 513 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 514 | 515 | '@typescript-eslint/tsconfig-utils@8.46.2': 516 | resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} 517 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 518 | peerDependencies: 519 | typescript: '>=4.8.4 <6.0.0' 520 | 521 | '@typescript-eslint/type-utils@8.46.2': 522 | resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} 523 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 524 | peerDependencies: 525 | eslint: ^8.57.0 || ^9.0.0 526 | typescript: '>=4.8.4 <6.0.0' 527 | 528 | '@typescript-eslint/types@8.46.2': 529 | resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} 530 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 531 | 532 | '@typescript-eslint/typescript-estree@8.46.2': 533 | resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} 534 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 535 | peerDependencies: 536 | typescript: '>=4.8.4 <6.0.0' 537 | 538 | '@typescript-eslint/utils@8.46.2': 539 | resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} 540 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 541 | peerDependencies: 542 | eslint: ^8.57.0 || ^9.0.0 543 | typescript: '>=4.8.4 <6.0.0' 544 | 545 | '@typescript-eslint/visitor-keys@8.46.2': 546 | resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} 547 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 548 | 549 | '@vitest/expect@4.0.5': 550 | resolution: {integrity: sha512-DJctLVlKoddvP/G389oGmKWNG6GD9frm2FPXARziU80Rjo7SIYxQzb2YFzmQ4fVD3Q5utUYY8nUmWrqsuIlIXQ==} 551 | 552 | '@vitest/mocker@4.0.5': 553 | resolution: {integrity: sha512-iYHIy72LfbK+mL5W8zXROp6oOcJKXWeKcNjcPPsqoa18qIEDrhB6/Z08o0wRajTd6SSSDNw8NCSIHVNOMpz0mw==} 554 | peerDependencies: 555 | msw: ^2.4.9 556 | vite: ^6.0.0 || ^7.0.0-0 557 | peerDependenciesMeta: 558 | msw: 559 | optional: true 560 | vite: 561 | optional: true 562 | 563 | '@vitest/pretty-format@4.0.5': 564 | resolution: {integrity: sha512-t1T/sSdsYyNc5AZl0EMeD0jW9cpJe2cODP0R++ZQe1kTkpgrwEfxGFR/yCG4w8ZybizbXRTHU7lE8sTDD/QsGw==} 565 | 566 | '@vitest/runner@4.0.5': 567 | resolution: {integrity: sha512-CQVVe+YEeKSiFBD5gBAmRDQglm4PnMBYzeTmt06t5iWtsUN9StQeeKhYCea/oaqBYilf8sARG6fSctUcEL/UmQ==} 568 | 569 | '@vitest/snapshot@4.0.5': 570 | resolution: {integrity: sha512-jfmSAeR6xYNEvcD+/RxFGA1bzpqHtkVhgxo2cxXia+Q3xX7m6GpZij07rz+WyQcA/xEGn4eIS1OItkMyWsGBmQ==} 571 | 572 | '@vitest/spy@4.0.5': 573 | resolution: {integrity: sha512-TUmVQpAQign7r8+EnZsgTF3vY9BdGofTUge1rGNbnHn2IN3FChiQoT9lrPz7A7AVUZJU2LAZXl4v66HhsNMhoA==} 574 | 575 | '@vitest/utils@4.0.5': 576 | resolution: {integrity: sha512-V5RndUgCB5/AfNvK9zxGCrRs99IrPYtMTIdUzJMMFs9nrmE5JXExIEfjVtUteyTRiLfCm+dCRMHf/Uu7Mm8/dg==} 577 | 578 | acorn-jsx@5.3.2: 579 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 580 | peerDependencies: 581 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 582 | 583 | acorn@8.15.0: 584 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 585 | engines: {node: '>=0.4.0'} 586 | hasBin: true 587 | 588 | ajv@6.12.6: 589 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 590 | 591 | ansi-regex@5.0.1: 592 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 593 | engines: {node: '>=8'} 594 | 595 | ansi-regex@6.2.2: 596 | resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} 597 | engines: {node: '>=12'} 598 | 599 | ansi-styles@4.3.0: 600 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 601 | engines: {node: '>=8'} 602 | 603 | ansi-styles@6.2.3: 604 | resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} 605 | engines: {node: '>=12'} 606 | 607 | any-promise@1.3.0: 608 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 609 | 610 | argparse@2.0.1: 611 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 612 | 613 | assertion-error@2.0.1: 614 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 615 | engines: {node: '>=12'} 616 | 617 | balanced-match@1.0.2: 618 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 619 | 620 | brace-expansion@1.1.12: 621 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 622 | 623 | brace-expansion@2.0.2: 624 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 625 | 626 | braces@3.0.3: 627 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 628 | engines: {node: '>=8'} 629 | 630 | bundle-require@5.1.0: 631 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} 632 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 633 | peerDependencies: 634 | esbuild: '>=0.18' 635 | 636 | cac@6.7.14: 637 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 638 | engines: {node: '>=8'} 639 | 640 | callsites@3.1.0: 641 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 642 | engines: {node: '>=6'} 643 | 644 | chai@6.2.0: 645 | resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} 646 | engines: {node: '>=18'} 647 | 648 | chalk@4.1.2: 649 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 650 | engines: {node: '>=10'} 651 | 652 | chokidar@4.0.3: 653 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 654 | engines: {node: '>= 14.16.0'} 655 | 656 | color-convert@2.0.1: 657 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 658 | engines: {node: '>=7.0.0'} 659 | 660 | color-name@1.1.4: 661 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 662 | 663 | commander@4.1.1: 664 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 665 | engines: {node: '>= 6'} 666 | 667 | concat-map@0.0.1: 668 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 669 | 670 | confbox@0.1.8: 671 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 672 | 673 | consola@3.4.2: 674 | resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} 675 | engines: {node: ^14.18.0 || >=16.10.0} 676 | 677 | cross-spawn@7.0.6: 678 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 679 | engines: {node: '>= 8'} 680 | 681 | debug@4.4.3: 682 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 683 | engines: {node: '>=6.0'} 684 | peerDependencies: 685 | supports-color: '*' 686 | peerDependenciesMeta: 687 | supports-color: 688 | optional: true 689 | 690 | deep-is@0.1.4: 691 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 692 | 693 | detect-indent@7.0.2: 694 | resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} 695 | engines: {node: '>=12.20'} 696 | 697 | detect-newline@4.0.1: 698 | resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} 699 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 700 | 701 | eastasianwidth@0.2.0: 702 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 703 | 704 | emoji-regex@8.0.0: 705 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 706 | 707 | emoji-regex@9.2.2: 708 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 709 | 710 | es-module-lexer@1.7.0: 711 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 712 | 713 | esbuild@0.25.11: 714 | resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} 715 | engines: {node: '>=18'} 716 | hasBin: true 717 | 718 | escape-string-regexp@4.0.0: 719 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 720 | engines: {node: '>=10'} 721 | 722 | eslint-scope@8.4.0: 723 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 724 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 725 | 726 | eslint-visitor-keys@3.4.3: 727 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 728 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 729 | 730 | eslint-visitor-keys@4.2.1: 731 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 732 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 733 | 734 | eslint@9.38.0: 735 | resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} 736 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 737 | hasBin: true 738 | peerDependencies: 739 | jiti: '*' 740 | peerDependenciesMeta: 741 | jiti: 742 | optional: true 743 | 744 | espree@10.4.0: 745 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 746 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 747 | 748 | esquery@1.6.0: 749 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 750 | engines: {node: '>=0.10'} 751 | 752 | esrecurse@4.3.0: 753 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 754 | engines: {node: '>=4.0'} 755 | 756 | estraverse@5.3.0: 757 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 758 | engines: {node: '>=4.0'} 759 | 760 | estree-walker@3.0.3: 761 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 762 | 763 | esutils@2.0.3: 764 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 765 | engines: {node: '>=0.10.0'} 766 | 767 | expect-type@1.2.2: 768 | resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} 769 | engines: {node: '>=12.0.0'} 770 | 771 | fast-deep-equal@3.1.3: 772 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 773 | 774 | fast-glob@3.3.3: 775 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 776 | engines: {node: '>=8.6.0'} 777 | 778 | fast-json-stable-stringify@2.1.0: 779 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 780 | 781 | fast-levenshtein@2.0.6: 782 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 783 | 784 | fastq@1.19.1: 785 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 786 | 787 | fdir@6.5.0: 788 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 789 | engines: {node: '>=12.0.0'} 790 | peerDependencies: 791 | picomatch: ^3 || ^4 792 | peerDependenciesMeta: 793 | picomatch: 794 | optional: true 795 | 796 | file-entry-cache@8.0.0: 797 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 798 | engines: {node: '>=16.0.0'} 799 | 800 | fill-range@7.1.1: 801 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 802 | engines: {node: '>=8'} 803 | 804 | find-up@5.0.0: 805 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 806 | engines: {node: '>=10'} 807 | 808 | fix-dts-default-cjs-exports@1.0.1: 809 | resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} 810 | 811 | flat-cache@4.0.1: 812 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 813 | engines: {node: '>=16'} 814 | 815 | flatted@3.3.3: 816 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 817 | 818 | foreground-child@3.3.1: 819 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 820 | engines: {node: '>=14'} 821 | 822 | fsevents@2.3.3: 823 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 824 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 825 | os: [darwin] 826 | 827 | get-tsconfig@4.13.0: 828 | resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 829 | 830 | git-hooks-list@4.1.1: 831 | resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} 832 | 833 | glob-parent@5.1.2: 834 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 835 | engines: {node: '>= 6'} 836 | 837 | glob-parent@6.0.2: 838 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 839 | engines: {node: '>=10.13.0'} 840 | 841 | glob@10.4.5: 842 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 843 | hasBin: true 844 | 845 | globals@14.0.0: 846 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 847 | engines: {node: '>=18'} 848 | 849 | globals@16.4.0: 850 | resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} 851 | engines: {node: '>=18'} 852 | 853 | graphemer@1.4.0: 854 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 855 | 856 | has-flag@4.0.0: 857 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 858 | engines: {node: '>=8'} 859 | 860 | ignore@5.3.2: 861 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 862 | engines: {node: '>= 4'} 863 | 864 | ignore@7.0.5: 865 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 866 | engines: {node: '>= 4'} 867 | 868 | import-fresh@3.3.1: 869 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 870 | engines: {node: '>=6'} 871 | 872 | imurmurhash@0.1.4: 873 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 874 | engines: {node: '>=0.8.19'} 875 | 876 | is-extglob@2.1.1: 877 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 878 | engines: {node: '>=0.10.0'} 879 | 880 | is-fullwidth-code-point@3.0.0: 881 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 882 | engines: {node: '>=8'} 883 | 884 | is-glob@4.0.3: 885 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 886 | engines: {node: '>=0.10.0'} 887 | 888 | is-number@7.0.0: 889 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 890 | engines: {node: '>=0.12.0'} 891 | 892 | is-plain-obj@4.1.0: 893 | resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 894 | engines: {node: '>=12'} 895 | 896 | isexe@2.0.0: 897 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 898 | 899 | jackspeak@3.4.3: 900 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 901 | 902 | jiti@2.5.1: 903 | resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} 904 | hasBin: true 905 | 906 | joycon@3.1.1: 907 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 908 | engines: {node: '>=10'} 909 | 910 | js-base64@3.7.8: 911 | resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} 912 | 913 | js-tokens@4.0.0: 914 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 915 | 916 | js-yaml@4.1.0: 917 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 918 | hasBin: true 919 | 920 | jsesc@3.1.0: 921 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 922 | engines: {node: '>=6'} 923 | hasBin: true 924 | 925 | json-buffer@3.0.1: 926 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 927 | 928 | json-schema-traverse@0.4.1: 929 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 930 | 931 | json-stable-stringify-without-jsonify@1.0.1: 932 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 933 | 934 | keyv@4.5.4: 935 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 936 | 937 | levn@0.4.1: 938 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 939 | engines: {node: '>= 0.8.0'} 940 | 941 | lilconfig@3.1.3: 942 | resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 943 | engines: {node: '>=14'} 944 | 945 | lines-and-columns@1.2.4: 946 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 947 | 948 | load-tsconfig@0.2.5: 949 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 950 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 951 | 952 | locate-path@6.0.0: 953 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 954 | engines: {node: '>=10'} 955 | 956 | lodash.merge@4.6.2: 957 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 958 | 959 | lodash.sortby@4.7.0: 960 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 961 | 962 | lru-cache@10.4.3: 963 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 964 | 965 | magic-string@0.30.21: 966 | resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 967 | 968 | merge2@1.4.1: 969 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 970 | engines: {node: '>= 8'} 971 | 972 | micromatch@4.0.8: 973 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 974 | engines: {node: '>=8.6'} 975 | 976 | minimatch@3.1.2: 977 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 978 | 979 | minimatch@9.0.5: 980 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 981 | engines: {node: '>=16 || 14 >=14.17'} 982 | 983 | minipass@7.1.2: 984 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 985 | engines: {node: '>=16 || 14 >=14.17'} 986 | 987 | mlly@1.8.0: 988 | resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 989 | 990 | ms@2.1.3: 991 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 992 | 993 | mvdan-sh@0.10.1: 994 | resolution: {integrity: sha512-kMbrH0EObaKmK3nVRKUIIya1dpASHIEusM13S4V1ViHFuxuNxCo+arxoa6j/dbV22YBGjl7UKJm9QQKJ2Crzhg==} 995 | deprecated: See https://github.com/mvdan/sh/issues/1145 996 | 997 | mz@2.7.0: 998 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 999 | 1000 | nanoid@3.3.11: 1001 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 1002 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1003 | hasBin: true 1004 | 1005 | natural-compare@1.4.0: 1006 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1007 | 1008 | object-assign@4.1.1: 1009 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1010 | engines: {node: '>=0.10.0'} 1011 | 1012 | optionator@0.9.4: 1013 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1014 | engines: {node: '>= 0.8.0'} 1015 | 1016 | p-limit@3.1.0: 1017 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1018 | engines: {node: '>=10'} 1019 | 1020 | p-locate@5.0.0: 1021 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1022 | engines: {node: '>=10'} 1023 | 1024 | package-json-from-dist@1.0.1: 1025 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1026 | 1027 | parent-module@1.0.1: 1028 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1029 | engines: {node: '>=6'} 1030 | 1031 | path-exists@4.0.0: 1032 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1033 | engines: {node: '>=8'} 1034 | 1035 | path-key@3.1.1: 1036 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1037 | engines: {node: '>=8'} 1038 | 1039 | path-scurry@1.11.1: 1040 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1041 | engines: {node: '>=16 || 14 >=14.18'} 1042 | 1043 | pathe@2.0.3: 1044 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 1045 | 1046 | picocolors@1.1.1: 1047 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1048 | 1049 | picomatch@2.3.1: 1050 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1051 | engines: {node: '>=8.6'} 1052 | 1053 | picomatch@4.0.3: 1054 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 1055 | engines: {node: '>=12'} 1056 | 1057 | pirates@4.0.7: 1058 | resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} 1059 | engines: {node: '>= 6'} 1060 | 1061 | pkg-types@1.3.1: 1062 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 1063 | 1064 | postcss-load-config@6.0.1: 1065 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1066 | engines: {node: '>= 18'} 1067 | peerDependencies: 1068 | jiti: '>=1.21.0' 1069 | postcss: '>=8.0.9' 1070 | tsx: ^4.8.1 1071 | yaml: ^2.4.2 1072 | peerDependenciesMeta: 1073 | jiti: 1074 | optional: true 1075 | postcss: 1076 | optional: true 1077 | tsx: 1078 | optional: true 1079 | yaml: 1080 | optional: true 1081 | 1082 | postcss@8.5.6: 1083 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} 1084 | engines: {node: ^10 || ^12 || >=14} 1085 | 1086 | prelude-ls@1.2.1: 1087 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1088 | engines: {node: '>= 0.8.0'} 1089 | 1090 | prettier-plugin-packagejson@2.5.18: 1091 | resolution: {integrity: sha512-NKznPGcGrcj4NPGxnh+w78JXPyfB6I4RQSCM0v+CAXwpDG7OEpJQ5zMyfC5NBgKH1k7Skwcj5ak5by2mrHvC5g==} 1092 | peerDependencies: 1093 | prettier: '>= 1.16.0' 1094 | peerDependenciesMeta: 1095 | prettier: 1096 | optional: true 1097 | 1098 | prettier-plugin-sh@0.15.0: 1099 | resolution: {integrity: sha512-U0PikJr/yr2bzzARl43qI0mApBj0C1xdAfA04AZa6LnvIKawXHhuy2fFo6LNA7weRzGlAiNbaEFfKMFo0nZr/A==} 1100 | engines: {node: '>=16.0.0'} 1101 | peerDependencies: 1102 | prettier: ^3.0.3 1103 | 1104 | prettier@3.6.2: 1105 | resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} 1106 | engines: {node: '>=14'} 1107 | hasBin: true 1108 | 1109 | punycode@2.3.1: 1110 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1111 | engines: {node: '>=6'} 1112 | 1113 | queue-microtask@1.2.3: 1114 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1115 | 1116 | readdirp@4.1.2: 1117 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1118 | engines: {node: '>= 14.18.0'} 1119 | 1120 | resolve-from@4.0.0: 1121 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1122 | engines: {node: '>=4'} 1123 | 1124 | resolve-from@5.0.0: 1125 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1126 | engines: {node: '>=8'} 1127 | 1128 | resolve-pkg-maps@1.0.0: 1129 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1130 | 1131 | reusify@1.1.0: 1132 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1133 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1134 | 1135 | rollup@4.52.5: 1136 | resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} 1137 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1138 | hasBin: true 1139 | 1140 | run-parallel@1.2.0: 1141 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1142 | 1143 | semver@7.7.3: 1144 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1145 | engines: {node: '>=10'} 1146 | hasBin: true 1147 | 1148 | sh-syntax@0.4.2: 1149 | resolution: {integrity: sha512-/l2UZ5fhGZLVZa16XQM9/Vq/hezGGbdHeVEA01uWjOL1+7Ek/gt6FquW0iKKws4a9AYPYvlz6RyVvjh3JxOteg==} 1150 | engines: {node: '>=16.0.0'} 1151 | 1152 | shebang-command@2.0.0: 1153 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1154 | engines: {node: '>=8'} 1155 | 1156 | shebang-regex@3.0.0: 1157 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1158 | engines: {node: '>=8'} 1159 | 1160 | siginfo@2.0.0: 1161 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1162 | 1163 | signal-exit@4.1.0: 1164 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1165 | engines: {node: '>=14'} 1166 | 1167 | sort-object-keys@1.1.3: 1168 | resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} 1169 | 1170 | sort-package-json@3.4.0: 1171 | resolution: {integrity: sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==} 1172 | engines: {node: '>=20'} 1173 | hasBin: true 1174 | 1175 | source-map-js@1.2.1: 1176 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1177 | engines: {node: '>=0.10.0'} 1178 | 1179 | source-map@0.8.0-beta.0: 1180 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1181 | engines: {node: '>= 8'} 1182 | deprecated: The work that was done in this beta branch won't be included in future versions 1183 | 1184 | stackback@0.0.2: 1185 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1186 | 1187 | std-env@3.10.0: 1188 | resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} 1189 | 1190 | string-width@4.2.3: 1191 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1192 | engines: {node: '>=8'} 1193 | 1194 | string-width@5.1.2: 1195 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1196 | engines: {node: '>=12'} 1197 | 1198 | strip-ansi@6.0.1: 1199 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1200 | engines: {node: '>=8'} 1201 | 1202 | strip-ansi@7.1.2: 1203 | resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} 1204 | engines: {node: '>=12'} 1205 | 1206 | strip-json-comments@3.1.1: 1207 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1208 | engines: {node: '>=8'} 1209 | 1210 | sucrase@3.35.0: 1211 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1212 | engines: {node: '>=16 || 14 >=14.17'} 1213 | hasBin: true 1214 | 1215 | supports-color@7.2.0: 1216 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1217 | engines: {node: '>=8'} 1218 | 1219 | synckit@0.11.8: 1220 | resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 1221 | engines: {node: ^14.18.0 || >=16.0.0} 1222 | 1223 | thenify-all@1.6.0: 1224 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1225 | engines: {node: '>=0.8'} 1226 | 1227 | thenify@3.3.1: 1228 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1229 | 1230 | tinybench@2.9.0: 1231 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1232 | 1233 | tinyexec@0.3.2: 1234 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1235 | 1236 | tinyglobby@0.2.15: 1237 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 1238 | engines: {node: '>=12.0.0'} 1239 | 1240 | tinyrainbow@3.0.3: 1241 | resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} 1242 | engines: {node: '>=14.0.0'} 1243 | 1244 | to-regex-range@5.0.1: 1245 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1246 | engines: {node: '>=8.0'} 1247 | 1248 | tr46@1.0.1: 1249 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1250 | 1251 | tree-kill@1.2.2: 1252 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1253 | hasBin: true 1254 | 1255 | ts-api-utils@2.1.0: 1256 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1257 | engines: {node: '>=18.12'} 1258 | peerDependencies: 1259 | typescript: '>=4.8.4' 1260 | 1261 | ts-interface-checker@0.1.13: 1262 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1263 | 1264 | tslib@2.8.1: 1265 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1266 | 1267 | tsup@8.5.0: 1268 | resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} 1269 | engines: {node: '>=18'} 1270 | hasBin: true 1271 | peerDependencies: 1272 | '@microsoft/api-extractor': ^7.36.0 1273 | '@swc/core': ^1 1274 | postcss: ^8.4.12 1275 | typescript: '>=4.5.0' 1276 | peerDependenciesMeta: 1277 | '@microsoft/api-extractor': 1278 | optional: true 1279 | '@swc/core': 1280 | optional: true 1281 | postcss: 1282 | optional: true 1283 | typescript: 1284 | optional: true 1285 | 1286 | tsx@4.20.6: 1287 | resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} 1288 | engines: {node: '>=18.0.0'} 1289 | hasBin: true 1290 | 1291 | type-check@0.4.0: 1292 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1293 | engines: {node: '>= 0.8.0'} 1294 | 1295 | typescript-eslint@8.46.2: 1296 | resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} 1297 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1298 | peerDependencies: 1299 | eslint: ^8.57.0 || ^9.0.0 1300 | typescript: '>=4.8.4 <6.0.0' 1301 | 1302 | typescript@5.9.3: 1303 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1304 | engines: {node: '>=14.17'} 1305 | hasBin: true 1306 | 1307 | ufo@1.6.1: 1308 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1309 | 1310 | undici-types@7.16.0: 1311 | resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} 1312 | 1313 | uri-js@4.4.1: 1314 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1315 | 1316 | vite@7.1.12: 1317 | resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} 1318 | engines: {node: ^20.19.0 || >=22.12.0} 1319 | hasBin: true 1320 | peerDependencies: 1321 | '@types/node': ^20.19.0 || >=22.12.0 1322 | jiti: '>=1.21.0' 1323 | less: ^4.0.0 1324 | lightningcss: ^1.21.0 1325 | sass: ^1.70.0 1326 | sass-embedded: ^1.70.0 1327 | stylus: '>=0.54.8' 1328 | sugarss: ^5.0.0 1329 | terser: ^5.16.0 1330 | tsx: ^4.8.1 1331 | yaml: ^2.4.2 1332 | peerDependenciesMeta: 1333 | '@types/node': 1334 | optional: true 1335 | jiti: 1336 | optional: true 1337 | less: 1338 | optional: true 1339 | lightningcss: 1340 | optional: true 1341 | sass: 1342 | optional: true 1343 | sass-embedded: 1344 | optional: true 1345 | stylus: 1346 | optional: true 1347 | sugarss: 1348 | optional: true 1349 | terser: 1350 | optional: true 1351 | tsx: 1352 | optional: true 1353 | yaml: 1354 | optional: true 1355 | 1356 | vitest@4.0.5: 1357 | resolution: {integrity: sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==} 1358 | engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} 1359 | hasBin: true 1360 | peerDependencies: 1361 | '@edge-runtime/vm': '*' 1362 | '@types/debug': ^4.1.12 1363 | '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 1364 | '@vitest/browser-playwright': 4.0.5 1365 | '@vitest/browser-preview': 4.0.5 1366 | '@vitest/browser-webdriverio': 4.0.5 1367 | '@vitest/ui': 4.0.5 1368 | happy-dom: '*' 1369 | jsdom: '*' 1370 | peerDependenciesMeta: 1371 | '@edge-runtime/vm': 1372 | optional: true 1373 | '@types/debug': 1374 | optional: true 1375 | '@types/node': 1376 | optional: true 1377 | '@vitest/browser-playwright': 1378 | optional: true 1379 | '@vitest/browser-preview': 1380 | optional: true 1381 | '@vitest/browser-webdriverio': 1382 | optional: true 1383 | '@vitest/ui': 1384 | optional: true 1385 | happy-dom: 1386 | optional: true 1387 | jsdom: 1388 | optional: true 1389 | 1390 | webidl-conversions@4.0.2: 1391 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1392 | 1393 | whatwg-url@7.1.0: 1394 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1395 | 1396 | which@2.0.2: 1397 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1398 | engines: {node: '>= 8'} 1399 | hasBin: true 1400 | 1401 | why-is-node-running@2.3.0: 1402 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1403 | engines: {node: '>=8'} 1404 | hasBin: true 1405 | 1406 | word-wrap@1.2.5: 1407 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1408 | engines: {node: '>=0.10.0'} 1409 | 1410 | wrap-ansi@7.0.0: 1411 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1412 | engines: {node: '>=10'} 1413 | 1414 | wrap-ansi@8.1.0: 1415 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1416 | engines: {node: '>=12'} 1417 | 1418 | yocto-queue@0.1.0: 1419 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1420 | engines: {node: '>=10'} 1421 | 1422 | snapshots: 1423 | 1424 | '@babel/code-frame@7.27.1': 1425 | dependencies: 1426 | '@babel/helper-validator-identifier': 7.28.5 1427 | js-tokens: 4.0.0 1428 | picocolors: 1.1.1 1429 | 1430 | '@babel/generator@7.28.5': 1431 | dependencies: 1432 | '@babel/parser': 7.28.5 1433 | '@babel/types': 7.28.5 1434 | '@jridgewell/gen-mapping': 0.3.13 1435 | '@jridgewell/trace-mapping': 0.3.31 1436 | jsesc: 3.1.0 1437 | 1438 | '@babel/helper-globals@7.28.0': {} 1439 | 1440 | '@babel/helper-string-parser@7.27.1': {} 1441 | 1442 | '@babel/helper-validator-identifier@7.28.5': {} 1443 | 1444 | '@babel/parser@7.28.5': 1445 | dependencies: 1446 | '@babel/types': 7.28.5 1447 | 1448 | '@babel/template@7.27.2': 1449 | dependencies: 1450 | '@babel/code-frame': 7.27.1 1451 | '@babel/parser': 7.28.5 1452 | '@babel/types': 7.28.5 1453 | 1454 | '@babel/traverse@7.28.5': 1455 | dependencies: 1456 | '@babel/code-frame': 7.27.1 1457 | '@babel/generator': 7.28.5 1458 | '@babel/helper-globals': 7.28.0 1459 | '@babel/parser': 7.28.5 1460 | '@babel/template': 7.27.2 1461 | '@babel/types': 7.28.5 1462 | debug: 4.4.3 1463 | transitivePeerDependencies: 1464 | - supports-color 1465 | 1466 | '@babel/types@7.28.5': 1467 | dependencies: 1468 | '@babel/helper-string-parser': 7.27.1 1469 | '@babel/helper-validator-identifier': 7.28.5 1470 | 1471 | '@esbuild/aix-ppc64@0.25.11': 1472 | optional: true 1473 | 1474 | '@esbuild/android-arm64@0.25.11': 1475 | optional: true 1476 | 1477 | '@esbuild/android-arm@0.25.11': 1478 | optional: true 1479 | 1480 | '@esbuild/android-x64@0.25.11': 1481 | optional: true 1482 | 1483 | '@esbuild/darwin-arm64@0.25.11': 1484 | optional: true 1485 | 1486 | '@esbuild/darwin-x64@0.25.11': 1487 | optional: true 1488 | 1489 | '@esbuild/freebsd-arm64@0.25.11': 1490 | optional: true 1491 | 1492 | '@esbuild/freebsd-x64@0.25.11': 1493 | optional: true 1494 | 1495 | '@esbuild/linux-arm64@0.25.11': 1496 | optional: true 1497 | 1498 | '@esbuild/linux-arm@0.25.11': 1499 | optional: true 1500 | 1501 | '@esbuild/linux-ia32@0.25.11': 1502 | optional: true 1503 | 1504 | '@esbuild/linux-loong64@0.25.11': 1505 | optional: true 1506 | 1507 | '@esbuild/linux-mips64el@0.25.11': 1508 | optional: true 1509 | 1510 | '@esbuild/linux-ppc64@0.25.11': 1511 | optional: true 1512 | 1513 | '@esbuild/linux-riscv64@0.25.11': 1514 | optional: true 1515 | 1516 | '@esbuild/linux-s390x@0.25.11': 1517 | optional: true 1518 | 1519 | '@esbuild/linux-x64@0.25.11': 1520 | optional: true 1521 | 1522 | '@esbuild/netbsd-arm64@0.25.11': 1523 | optional: true 1524 | 1525 | '@esbuild/netbsd-x64@0.25.11': 1526 | optional: true 1527 | 1528 | '@esbuild/openbsd-arm64@0.25.11': 1529 | optional: true 1530 | 1531 | '@esbuild/openbsd-x64@0.25.11': 1532 | optional: true 1533 | 1534 | '@esbuild/openharmony-arm64@0.25.11': 1535 | optional: true 1536 | 1537 | '@esbuild/sunos-x64@0.25.11': 1538 | optional: true 1539 | 1540 | '@esbuild/win32-arm64@0.25.11': 1541 | optional: true 1542 | 1543 | '@esbuild/win32-ia32@0.25.11': 1544 | optional: true 1545 | 1546 | '@esbuild/win32-x64@0.25.11': 1547 | optional: true 1548 | 1549 | '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.5.1))': 1550 | dependencies: 1551 | eslint: 9.38.0(jiti@2.5.1) 1552 | eslint-visitor-keys: 3.4.3 1553 | 1554 | '@eslint-community/regexpp@4.12.2': {} 1555 | 1556 | '@eslint/config-array@0.21.1': 1557 | dependencies: 1558 | '@eslint/object-schema': 2.1.7 1559 | debug: 4.4.3 1560 | minimatch: 3.1.2 1561 | transitivePeerDependencies: 1562 | - supports-color 1563 | 1564 | '@eslint/config-helpers@0.4.2': 1565 | dependencies: 1566 | '@eslint/core': 0.17.0 1567 | 1568 | '@eslint/core@0.16.0': 1569 | dependencies: 1570 | '@types/json-schema': 7.0.15 1571 | 1572 | '@eslint/core@0.17.0': 1573 | dependencies: 1574 | '@types/json-schema': 7.0.15 1575 | 1576 | '@eslint/eslintrc@3.3.1': 1577 | dependencies: 1578 | ajv: 6.12.6 1579 | debug: 4.4.3 1580 | espree: 10.4.0 1581 | globals: 14.0.0 1582 | ignore: 5.3.2 1583 | import-fresh: 3.3.1 1584 | js-yaml: 4.1.0 1585 | minimatch: 3.1.2 1586 | strip-json-comments: 3.1.1 1587 | transitivePeerDependencies: 1588 | - supports-color 1589 | 1590 | '@eslint/js@9.38.0': {} 1591 | 1592 | '@eslint/object-schema@2.1.7': {} 1593 | 1594 | '@eslint/plugin-kit@0.4.1': 1595 | dependencies: 1596 | '@eslint/core': 0.17.0 1597 | levn: 0.4.1 1598 | 1599 | '@humanfs/core@0.19.1': {} 1600 | 1601 | '@humanfs/node@0.16.7': 1602 | dependencies: 1603 | '@humanfs/core': 0.19.1 1604 | '@humanwhocodes/retry': 0.4.3 1605 | 1606 | '@humanwhocodes/module-importer@1.0.1': {} 1607 | 1608 | '@humanwhocodes/retry@0.4.3': {} 1609 | 1610 | '@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.6.2)': 1611 | dependencies: 1612 | '@babel/generator': 7.28.5 1613 | '@babel/parser': 7.28.5 1614 | '@babel/traverse': 7.28.5 1615 | '@babel/types': 7.28.5 1616 | prettier: 3.6.2 1617 | semver: 7.7.3 1618 | transitivePeerDependencies: 1619 | - supports-color 1620 | 1621 | '@isaacs/cliui@8.0.2': 1622 | dependencies: 1623 | string-width: 5.1.2 1624 | string-width-cjs: string-width@4.2.3 1625 | strip-ansi: 7.1.2 1626 | strip-ansi-cjs: strip-ansi@6.0.1 1627 | wrap-ansi: 8.1.0 1628 | wrap-ansi-cjs: wrap-ansi@7.0.0 1629 | 1630 | '@jridgewell/gen-mapping@0.3.13': 1631 | dependencies: 1632 | '@jridgewell/sourcemap-codec': 1.5.5 1633 | '@jridgewell/trace-mapping': 0.3.31 1634 | 1635 | '@jridgewell/resolve-uri@3.1.2': {} 1636 | 1637 | '@jridgewell/sourcemap-codec@1.5.5': {} 1638 | 1639 | '@jridgewell/trace-mapping@0.3.31': 1640 | dependencies: 1641 | '@jridgewell/resolve-uri': 3.1.2 1642 | '@jridgewell/sourcemap-codec': 1.5.5 1643 | 1644 | '@nodelib/fs.scandir@2.1.5': 1645 | dependencies: 1646 | '@nodelib/fs.stat': 2.0.5 1647 | run-parallel: 1.2.0 1648 | 1649 | '@nodelib/fs.stat@2.0.5': {} 1650 | 1651 | '@nodelib/fs.walk@1.2.8': 1652 | dependencies: 1653 | '@nodelib/fs.scandir': 2.1.5 1654 | fastq: 1.19.1 1655 | 1656 | '@pkgjs/parseargs@0.11.0': 1657 | optional: true 1658 | 1659 | '@pkgr/core@0.2.9': {} 1660 | 1661 | '@rollup/rollup-android-arm-eabi@4.52.5': 1662 | optional: true 1663 | 1664 | '@rollup/rollup-android-arm64@4.52.5': 1665 | optional: true 1666 | 1667 | '@rollup/rollup-darwin-arm64@4.52.5': 1668 | optional: true 1669 | 1670 | '@rollup/rollup-darwin-x64@4.52.5': 1671 | optional: true 1672 | 1673 | '@rollup/rollup-freebsd-arm64@4.52.5': 1674 | optional: true 1675 | 1676 | '@rollup/rollup-freebsd-x64@4.52.5': 1677 | optional: true 1678 | 1679 | '@rollup/rollup-linux-arm-gnueabihf@4.52.5': 1680 | optional: true 1681 | 1682 | '@rollup/rollup-linux-arm-musleabihf@4.52.5': 1683 | optional: true 1684 | 1685 | '@rollup/rollup-linux-arm64-gnu@4.52.5': 1686 | optional: true 1687 | 1688 | '@rollup/rollup-linux-arm64-musl@4.52.5': 1689 | optional: true 1690 | 1691 | '@rollup/rollup-linux-loong64-gnu@4.52.5': 1692 | optional: true 1693 | 1694 | '@rollup/rollup-linux-ppc64-gnu@4.52.5': 1695 | optional: true 1696 | 1697 | '@rollup/rollup-linux-riscv64-gnu@4.52.5': 1698 | optional: true 1699 | 1700 | '@rollup/rollup-linux-riscv64-musl@4.52.5': 1701 | optional: true 1702 | 1703 | '@rollup/rollup-linux-s390x-gnu@4.52.5': 1704 | optional: true 1705 | 1706 | '@rollup/rollup-linux-x64-gnu@4.52.5': 1707 | optional: true 1708 | 1709 | '@rollup/rollup-linux-x64-musl@4.52.5': 1710 | optional: true 1711 | 1712 | '@rollup/rollup-openharmony-arm64@4.52.5': 1713 | optional: true 1714 | 1715 | '@rollup/rollup-win32-arm64-msvc@4.52.5': 1716 | optional: true 1717 | 1718 | '@rollup/rollup-win32-ia32-msvc@4.52.5': 1719 | optional: true 1720 | 1721 | '@rollup/rollup-win32-x64-gnu@4.52.5': 1722 | optional: true 1723 | 1724 | '@rollup/rollup-win32-x64-msvc@4.52.5': 1725 | optional: true 1726 | 1727 | '@shahrad/eslint-config@1.0.1(jiti@2.5.1)(typescript@5.9.3)': 1728 | dependencies: 1729 | '@eslint/js': 9.38.0 1730 | eslint: 9.38.0(jiti@2.5.1) 1731 | typescript-eslint: 8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3) 1732 | transitivePeerDependencies: 1733 | - jiti 1734 | - supports-color 1735 | - typescript 1736 | 1737 | '@shahrad/prettier-config@1.2.2(@ianvs/prettier-plugin-sort-imports@4.5.1(prettier@3.6.2))(prettier-plugin-packagejson@2.5.18(prettier@3.6.2))(prettier-plugin-sh@0.15.0(prettier@3.6.2))(prettier@3.6.2)': 1738 | dependencies: 1739 | '@ianvs/prettier-plugin-sort-imports': 4.5.1(prettier@3.6.2) 1740 | prettier: 3.6.2 1741 | prettier-plugin-packagejson: 2.5.18(prettier@3.6.2) 1742 | prettier-plugin-sh: 0.15.0(prettier@3.6.2) 1743 | 1744 | '@shahrad/tsconfig@1.2.0': {} 1745 | 1746 | '@standard-schema/spec@1.0.0': {} 1747 | 1748 | '@types/chai@5.2.3': 1749 | dependencies: 1750 | '@types/deep-eql': 4.0.2 1751 | assertion-error: 2.0.1 1752 | 1753 | '@types/deep-eql@4.0.2': {} 1754 | 1755 | '@types/estree@1.0.8': {} 1756 | 1757 | '@types/json-schema@7.0.15': {} 1758 | 1759 | '@types/node@24.9.2': 1760 | dependencies: 1761 | undici-types: 7.16.0 1762 | 1763 | '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3)': 1764 | dependencies: 1765 | '@eslint-community/regexpp': 4.12.2 1766 | '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3) 1767 | '@typescript-eslint/scope-manager': 8.46.2 1768 | '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3) 1769 | '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3) 1770 | '@typescript-eslint/visitor-keys': 8.46.2 1771 | eslint: 9.38.0(jiti@2.5.1) 1772 | graphemer: 1.4.0 1773 | ignore: 7.0.5 1774 | natural-compare: 1.4.0 1775 | ts-api-utils: 2.1.0(typescript@5.9.3) 1776 | typescript: 5.9.3 1777 | transitivePeerDependencies: 1778 | - supports-color 1779 | 1780 | '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3)': 1781 | dependencies: 1782 | '@typescript-eslint/scope-manager': 8.46.2 1783 | '@typescript-eslint/types': 8.46.2 1784 | '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) 1785 | '@typescript-eslint/visitor-keys': 8.46.2 1786 | debug: 4.4.3 1787 | eslint: 9.38.0(jiti@2.5.1) 1788 | typescript: 5.9.3 1789 | transitivePeerDependencies: 1790 | - supports-color 1791 | 1792 | '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': 1793 | dependencies: 1794 | '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) 1795 | '@typescript-eslint/types': 8.46.2 1796 | debug: 4.4.3 1797 | typescript: 5.9.3 1798 | transitivePeerDependencies: 1799 | - supports-color 1800 | 1801 | '@typescript-eslint/scope-manager@8.46.2': 1802 | dependencies: 1803 | '@typescript-eslint/types': 8.46.2 1804 | '@typescript-eslint/visitor-keys': 8.46.2 1805 | 1806 | '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': 1807 | dependencies: 1808 | typescript: 5.9.3 1809 | 1810 | '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3)': 1811 | dependencies: 1812 | '@typescript-eslint/types': 8.46.2 1813 | '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) 1814 | '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3) 1815 | debug: 4.4.3 1816 | eslint: 9.38.0(jiti@2.5.1) 1817 | ts-api-utils: 2.1.0(typescript@5.9.3) 1818 | typescript: 5.9.3 1819 | transitivePeerDependencies: 1820 | - supports-color 1821 | 1822 | '@typescript-eslint/types@8.46.2': {} 1823 | 1824 | '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': 1825 | dependencies: 1826 | '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) 1827 | '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) 1828 | '@typescript-eslint/types': 8.46.2 1829 | '@typescript-eslint/visitor-keys': 8.46.2 1830 | debug: 4.4.3 1831 | fast-glob: 3.3.3 1832 | is-glob: 4.0.3 1833 | minimatch: 9.0.5 1834 | semver: 7.7.3 1835 | ts-api-utils: 2.1.0(typescript@5.9.3) 1836 | typescript: 5.9.3 1837 | transitivePeerDependencies: 1838 | - supports-color 1839 | 1840 | '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3)': 1841 | dependencies: 1842 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.5.1)) 1843 | '@typescript-eslint/scope-manager': 8.46.2 1844 | '@typescript-eslint/types': 8.46.2 1845 | '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) 1846 | eslint: 9.38.0(jiti@2.5.1) 1847 | typescript: 5.9.3 1848 | transitivePeerDependencies: 1849 | - supports-color 1850 | 1851 | '@typescript-eslint/visitor-keys@8.46.2': 1852 | dependencies: 1853 | '@typescript-eslint/types': 8.46.2 1854 | eslint-visitor-keys: 4.2.1 1855 | 1856 | '@vitest/expect@4.0.5': 1857 | dependencies: 1858 | '@standard-schema/spec': 1.0.0 1859 | '@types/chai': 5.2.3 1860 | '@vitest/spy': 4.0.5 1861 | '@vitest/utils': 4.0.5 1862 | chai: 6.2.0 1863 | tinyrainbow: 3.0.3 1864 | 1865 | '@vitest/mocker@4.0.5(vite@7.1.12(@types/node@24.9.2)(jiti@2.5.1)(tsx@4.20.6))': 1866 | dependencies: 1867 | '@vitest/spy': 4.0.5 1868 | estree-walker: 3.0.3 1869 | magic-string: 0.30.21 1870 | optionalDependencies: 1871 | vite: 7.1.12(@types/node@24.9.2)(jiti@2.5.1)(tsx@4.20.6) 1872 | 1873 | '@vitest/pretty-format@4.0.5': 1874 | dependencies: 1875 | tinyrainbow: 3.0.3 1876 | 1877 | '@vitest/runner@4.0.5': 1878 | dependencies: 1879 | '@vitest/utils': 4.0.5 1880 | pathe: 2.0.3 1881 | 1882 | '@vitest/snapshot@4.0.5': 1883 | dependencies: 1884 | '@vitest/pretty-format': 4.0.5 1885 | magic-string: 0.30.21 1886 | pathe: 2.0.3 1887 | 1888 | '@vitest/spy@4.0.5': {} 1889 | 1890 | '@vitest/utils@4.0.5': 1891 | dependencies: 1892 | '@vitest/pretty-format': 4.0.5 1893 | tinyrainbow: 3.0.3 1894 | 1895 | acorn-jsx@5.3.2(acorn@8.15.0): 1896 | dependencies: 1897 | acorn: 8.15.0 1898 | 1899 | acorn@8.15.0: {} 1900 | 1901 | ajv@6.12.6: 1902 | dependencies: 1903 | fast-deep-equal: 3.1.3 1904 | fast-json-stable-stringify: 2.1.0 1905 | json-schema-traverse: 0.4.1 1906 | uri-js: 4.4.1 1907 | 1908 | ansi-regex@5.0.1: {} 1909 | 1910 | ansi-regex@6.2.2: {} 1911 | 1912 | ansi-styles@4.3.0: 1913 | dependencies: 1914 | color-convert: 2.0.1 1915 | 1916 | ansi-styles@6.2.3: {} 1917 | 1918 | any-promise@1.3.0: {} 1919 | 1920 | argparse@2.0.1: {} 1921 | 1922 | assertion-error@2.0.1: {} 1923 | 1924 | balanced-match@1.0.2: {} 1925 | 1926 | brace-expansion@1.1.12: 1927 | dependencies: 1928 | balanced-match: 1.0.2 1929 | concat-map: 0.0.1 1930 | 1931 | brace-expansion@2.0.2: 1932 | dependencies: 1933 | balanced-match: 1.0.2 1934 | 1935 | braces@3.0.3: 1936 | dependencies: 1937 | fill-range: 7.1.1 1938 | 1939 | bundle-require@5.1.0(esbuild@0.25.11): 1940 | dependencies: 1941 | esbuild: 0.25.11 1942 | load-tsconfig: 0.2.5 1943 | 1944 | cac@6.7.14: {} 1945 | 1946 | callsites@3.1.0: {} 1947 | 1948 | chai@6.2.0: {} 1949 | 1950 | chalk@4.1.2: 1951 | dependencies: 1952 | ansi-styles: 4.3.0 1953 | supports-color: 7.2.0 1954 | 1955 | chokidar@4.0.3: 1956 | dependencies: 1957 | readdirp: 4.1.2 1958 | 1959 | color-convert@2.0.1: 1960 | dependencies: 1961 | color-name: 1.1.4 1962 | 1963 | color-name@1.1.4: {} 1964 | 1965 | commander@4.1.1: {} 1966 | 1967 | concat-map@0.0.1: {} 1968 | 1969 | confbox@0.1.8: {} 1970 | 1971 | consola@3.4.2: {} 1972 | 1973 | cross-spawn@7.0.6: 1974 | dependencies: 1975 | path-key: 3.1.1 1976 | shebang-command: 2.0.0 1977 | which: 2.0.2 1978 | 1979 | debug@4.4.3: 1980 | dependencies: 1981 | ms: 2.1.3 1982 | 1983 | deep-is@0.1.4: {} 1984 | 1985 | detect-indent@7.0.2: {} 1986 | 1987 | detect-newline@4.0.1: {} 1988 | 1989 | eastasianwidth@0.2.0: {} 1990 | 1991 | emoji-regex@8.0.0: {} 1992 | 1993 | emoji-regex@9.2.2: {} 1994 | 1995 | es-module-lexer@1.7.0: {} 1996 | 1997 | esbuild@0.25.11: 1998 | optionalDependencies: 1999 | '@esbuild/aix-ppc64': 0.25.11 2000 | '@esbuild/android-arm': 0.25.11 2001 | '@esbuild/android-arm64': 0.25.11 2002 | '@esbuild/android-x64': 0.25.11 2003 | '@esbuild/darwin-arm64': 0.25.11 2004 | '@esbuild/darwin-x64': 0.25.11 2005 | '@esbuild/freebsd-arm64': 0.25.11 2006 | '@esbuild/freebsd-x64': 0.25.11 2007 | '@esbuild/linux-arm': 0.25.11 2008 | '@esbuild/linux-arm64': 0.25.11 2009 | '@esbuild/linux-ia32': 0.25.11 2010 | '@esbuild/linux-loong64': 0.25.11 2011 | '@esbuild/linux-mips64el': 0.25.11 2012 | '@esbuild/linux-ppc64': 0.25.11 2013 | '@esbuild/linux-riscv64': 0.25.11 2014 | '@esbuild/linux-s390x': 0.25.11 2015 | '@esbuild/linux-x64': 0.25.11 2016 | '@esbuild/netbsd-arm64': 0.25.11 2017 | '@esbuild/netbsd-x64': 0.25.11 2018 | '@esbuild/openbsd-arm64': 0.25.11 2019 | '@esbuild/openbsd-x64': 0.25.11 2020 | '@esbuild/openharmony-arm64': 0.25.11 2021 | '@esbuild/sunos-x64': 0.25.11 2022 | '@esbuild/win32-arm64': 0.25.11 2023 | '@esbuild/win32-ia32': 0.25.11 2024 | '@esbuild/win32-x64': 0.25.11 2025 | 2026 | escape-string-regexp@4.0.0: {} 2027 | 2028 | eslint-scope@8.4.0: 2029 | dependencies: 2030 | esrecurse: 4.3.0 2031 | estraverse: 5.3.0 2032 | 2033 | eslint-visitor-keys@3.4.3: {} 2034 | 2035 | eslint-visitor-keys@4.2.1: {} 2036 | 2037 | eslint@9.38.0(jiti@2.5.1): 2038 | dependencies: 2039 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.5.1)) 2040 | '@eslint-community/regexpp': 4.12.2 2041 | '@eslint/config-array': 0.21.1 2042 | '@eslint/config-helpers': 0.4.2 2043 | '@eslint/core': 0.16.0 2044 | '@eslint/eslintrc': 3.3.1 2045 | '@eslint/js': 9.38.0 2046 | '@eslint/plugin-kit': 0.4.1 2047 | '@humanfs/node': 0.16.7 2048 | '@humanwhocodes/module-importer': 1.0.1 2049 | '@humanwhocodes/retry': 0.4.3 2050 | '@types/estree': 1.0.8 2051 | ajv: 6.12.6 2052 | chalk: 4.1.2 2053 | cross-spawn: 7.0.6 2054 | debug: 4.4.3 2055 | escape-string-regexp: 4.0.0 2056 | eslint-scope: 8.4.0 2057 | eslint-visitor-keys: 4.2.1 2058 | espree: 10.4.0 2059 | esquery: 1.6.0 2060 | esutils: 2.0.3 2061 | fast-deep-equal: 3.1.3 2062 | file-entry-cache: 8.0.0 2063 | find-up: 5.0.0 2064 | glob-parent: 6.0.2 2065 | ignore: 5.3.2 2066 | imurmurhash: 0.1.4 2067 | is-glob: 4.0.3 2068 | json-stable-stringify-without-jsonify: 1.0.1 2069 | lodash.merge: 4.6.2 2070 | minimatch: 3.1.2 2071 | natural-compare: 1.4.0 2072 | optionator: 0.9.4 2073 | optionalDependencies: 2074 | jiti: 2.5.1 2075 | transitivePeerDependencies: 2076 | - supports-color 2077 | 2078 | espree@10.4.0: 2079 | dependencies: 2080 | acorn: 8.15.0 2081 | acorn-jsx: 5.3.2(acorn@8.15.0) 2082 | eslint-visitor-keys: 4.2.1 2083 | 2084 | esquery@1.6.0: 2085 | dependencies: 2086 | estraverse: 5.3.0 2087 | 2088 | esrecurse@4.3.0: 2089 | dependencies: 2090 | estraverse: 5.3.0 2091 | 2092 | estraverse@5.3.0: {} 2093 | 2094 | estree-walker@3.0.3: 2095 | dependencies: 2096 | '@types/estree': 1.0.8 2097 | 2098 | esutils@2.0.3: {} 2099 | 2100 | expect-type@1.2.2: {} 2101 | 2102 | fast-deep-equal@3.1.3: {} 2103 | 2104 | fast-glob@3.3.3: 2105 | dependencies: 2106 | '@nodelib/fs.stat': 2.0.5 2107 | '@nodelib/fs.walk': 1.2.8 2108 | glob-parent: 5.1.2 2109 | merge2: 1.4.1 2110 | micromatch: 4.0.8 2111 | 2112 | fast-json-stable-stringify@2.1.0: {} 2113 | 2114 | fast-levenshtein@2.0.6: {} 2115 | 2116 | fastq@1.19.1: 2117 | dependencies: 2118 | reusify: 1.1.0 2119 | 2120 | fdir@6.5.0(picomatch@4.0.3): 2121 | optionalDependencies: 2122 | picomatch: 4.0.3 2123 | 2124 | file-entry-cache@8.0.0: 2125 | dependencies: 2126 | flat-cache: 4.0.1 2127 | 2128 | fill-range@7.1.1: 2129 | dependencies: 2130 | to-regex-range: 5.0.1 2131 | 2132 | find-up@5.0.0: 2133 | dependencies: 2134 | locate-path: 6.0.0 2135 | path-exists: 4.0.0 2136 | 2137 | fix-dts-default-cjs-exports@1.0.1: 2138 | dependencies: 2139 | magic-string: 0.30.21 2140 | mlly: 1.8.0 2141 | rollup: 4.52.5 2142 | 2143 | flat-cache@4.0.1: 2144 | dependencies: 2145 | flatted: 3.3.3 2146 | keyv: 4.5.4 2147 | 2148 | flatted@3.3.3: {} 2149 | 2150 | foreground-child@3.3.1: 2151 | dependencies: 2152 | cross-spawn: 7.0.6 2153 | signal-exit: 4.1.0 2154 | 2155 | fsevents@2.3.3: 2156 | optional: true 2157 | 2158 | get-tsconfig@4.13.0: 2159 | dependencies: 2160 | resolve-pkg-maps: 1.0.0 2161 | optional: true 2162 | 2163 | git-hooks-list@4.1.1: {} 2164 | 2165 | glob-parent@5.1.2: 2166 | dependencies: 2167 | is-glob: 4.0.3 2168 | 2169 | glob-parent@6.0.2: 2170 | dependencies: 2171 | is-glob: 4.0.3 2172 | 2173 | glob@10.4.5: 2174 | dependencies: 2175 | foreground-child: 3.3.1 2176 | jackspeak: 3.4.3 2177 | minimatch: 9.0.5 2178 | minipass: 7.1.2 2179 | package-json-from-dist: 1.0.1 2180 | path-scurry: 1.11.1 2181 | 2182 | globals@14.0.0: {} 2183 | 2184 | globals@16.4.0: {} 2185 | 2186 | graphemer@1.4.0: {} 2187 | 2188 | has-flag@4.0.0: {} 2189 | 2190 | ignore@5.3.2: {} 2191 | 2192 | ignore@7.0.5: {} 2193 | 2194 | import-fresh@3.3.1: 2195 | dependencies: 2196 | parent-module: 1.0.1 2197 | resolve-from: 4.0.0 2198 | 2199 | imurmurhash@0.1.4: {} 2200 | 2201 | is-extglob@2.1.1: {} 2202 | 2203 | is-fullwidth-code-point@3.0.0: {} 2204 | 2205 | is-glob@4.0.3: 2206 | dependencies: 2207 | is-extglob: 2.1.1 2208 | 2209 | is-number@7.0.0: {} 2210 | 2211 | is-plain-obj@4.1.0: {} 2212 | 2213 | isexe@2.0.0: {} 2214 | 2215 | jackspeak@3.4.3: 2216 | dependencies: 2217 | '@isaacs/cliui': 8.0.2 2218 | optionalDependencies: 2219 | '@pkgjs/parseargs': 0.11.0 2220 | 2221 | jiti@2.5.1: 2222 | optional: true 2223 | 2224 | joycon@3.1.1: {} 2225 | 2226 | js-base64@3.7.8: {} 2227 | 2228 | js-tokens@4.0.0: {} 2229 | 2230 | js-yaml@4.1.0: 2231 | dependencies: 2232 | argparse: 2.0.1 2233 | 2234 | jsesc@3.1.0: {} 2235 | 2236 | json-buffer@3.0.1: {} 2237 | 2238 | json-schema-traverse@0.4.1: {} 2239 | 2240 | json-stable-stringify-without-jsonify@1.0.1: {} 2241 | 2242 | keyv@4.5.4: 2243 | dependencies: 2244 | json-buffer: 3.0.1 2245 | 2246 | levn@0.4.1: 2247 | dependencies: 2248 | prelude-ls: 1.2.1 2249 | type-check: 0.4.0 2250 | 2251 | lilconfig@3.1.3: {} 2252 | 2253 | lines-and-columns@1.2.4: {} 2254 | 2255 | load-tsconfig@0.2.5: {} 2256 | 2257 | locate-path@6.0.0: 2258 | dependencies: 2259 | p-locate: 5.0.0 2260 | 2261 | lodash.merge@4.6.2: {} 2262 | 2263 | lodash.sortby@4.7.0: {} 2264 | 2265 | lru-cache@10.4.3: {} 2266 | 2267 | magic-string@0.30.21: 2268 | dependencies: 2269 | '@jridgewell/sourcemap-codec': 1.5.5 2270 | 2271 | merge2@1.4.1: {} 2272 | 2273 | micromatch@4.0.8: 2274 | dependencies: 2275 | braces: 3.0.3 2276 | picomatch: 2.3.1 2277 | 2278 | minimatch@3.1.2: 2279 | dependencies: 2280 | brace-expansion: 1.1.12 2281 | 2282 | minimatch@9.0.5: 2283 | dependencies: 2284 | brace-expansion: 2.0.2 2285 | 2286 | minipass@7.1.2: {} 2287 | 2288 | mlly@1.8.0: 2289 | dependencies: 2290 | acorn: 8.15.0 2291 | pathe: 2.0.3 2292 | pkg-types: 1.3.1 2293 | ufo: 1.6.1 2294 | 2295 | ms@2.1.3: {} 2296 | 2297 | mvdan-sh@0.10.1: {} 2298 | 2299 | mz@2.7.0: 2300 | dependencies: 2301 | any-promise: 1.3.0 2302 | object-assign: 4.1.1 2303 | thenify-all: 1.6.0 2304 | 2305 | nanoid@3.3.11: {} 2306 | 2307 | natural-compare@1.4.0: {} 2308 | 2309 | object-assign@4.1.1: {} 2310 | 2311 | optionator@0.9.4: 2312 | dependencies: 2313 | deep-is: 0.1.4 2314 | fast-levenshtein: 2.0.6 2315 | levn: 0.4.1 2316 | prelude-ls: 1.2.1 2317 | type-check: 0.4.0 2318 | word-wrap: 1.2.5 2319 | 2320 | p-limit@3.1.0: 2321 | dependencies: 2322 | yocto-queue: 0.1.0 2323 | 2324 | p-locate@5.0.0: 2325 | dependencies: 2326 | p-limit: 3.1.0 2327 | 2328 | package-json-from-dist@1.0.1: {} 2329 | 2330 | parent-module@1.0.1: 2331 | dependencies: 2332 | callsites: 3.1.0 2333 | 2334 | path-exists@4.0.0: {} 2335 | 2336 | path-key@3.1.1: {} 2337 | 2338 | path-scurry@1.11.1: 2339 | dependencies: 2340 | lru-cache: 10.4.3 2341 | minipass: 7.1.2 2342 | 2343 | pathe@2.0.3: {} 2344 | 2345 | picocolors@1.1.1: {} 2346 | 2347 | picomatch@2.3.1: {} 2348 | 2349 | picomatch@4.0.3: {} 2350 | 2351 | pirates@4.0.7: {} 2352 | 2353 | pkg-types@1.3.1: 2354 | dependencies: 2355 | confbox: 0.1.8 2356 | mlly: 1.8.0 2357 | pathe: 2.0.3 2358 | 2359 | postcss-load-config@6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6): 2360 | dependencies: 2361 | lilconfig: 3.1.3 2362 | optionalDependencies: 2363 | jiti: 2.5.1 2364 | postcss: 8.5.6 2365 | tsx: 4.20.6 2366 | 2367 | postcss@8.5.6: 2368 | dependencies: 2369 | nanoid: 3.3.11 2370 | picocolors: 1.1.1 2371 | source-map-js: 1.2.1 2372 | 2373 | prelude-ls@1.2.1: {} 2374 | 2375 | prettier-plugin-packagejson@2.5.18(prettier@3.6.2): 2376 | dependencies: 2377 | sort-package-json: 3.4.0 2378 | synckit: 0.11.8 2379 | optionalDependencies: 2380 | prettier: 3.6.2 2381 | 2382 | prettier-plugin-sh@0.15.0(prettier@3.6.2): 2383 | dependencies: 2384 | mvdan-sh: 0.10.1 2385 | prettier: 3.6.2 2386 | sh-syntax: 0.4.2 2387 | 2388 | prettier@3.6.2: {} 2389 | 2390 | punycode@2.3.1: {} 2391 | 2392 | queue-microtask@1.2.3: {} 2393 | 2394 | readdirp@4.1.2: {} 2395 | 2396 | resolve-from@4.0.0: {} 2397 | 2398 | resolve-from@5.0.0: {} 2399 | 2400 | resolve-pkg-maps@1.0.0: 2401 | optional: true 2402 | 2403 | reusify@1.1.0: {} 2404 | 2405 | rollup@4.52.5: 2406 | dependencies: 2407 | '@types/estree': 1.0.8 2408 | optionalDependencies: 2409 | '@rollup/rollup-android-arm-eabi': 4.52.5 2410 | '@rollup/rollup-android-arm64': 4.52.5 2411 | '@rollup/rollup-darwin-arm64': 4.52.5 2412 | '@rollup/rollup-darwin-x64': 4.52.5 2413 | '@rollup/rollup-freebsd-arm64': 4.52.5 2414 | '@rollup/rollup-freebsd-x64': 4.52.5 2415 | '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 2416 | '@rollup/rollup-linux-arm-musleabihf': 4.52.5 2417 | '@rollup/rollup-linux-arm64-gnu': 4.52.5 2418 | '@rollup/rollup-linux-arm64-musl': 4.52.5 2419 | '@rollup/rollup-linux-loong64-gnu': 4.52.5 2420 | '@rollup/rollup-linux-ppc64-gnu': 4.52.5 2421 | '@rollup/rollup-linux-riscv64-gnu': 4.52.5 2422 | '@rollup/rollup-linux-riscv64-musl': 4.52.5 2423 | '@rollup/rollup-linux-s390x-gnu': 4.52.5 2424 | '@rollup/rollup-linux-x64-gnu': 4.52.5 2425 | '@rollup/rollup-linux-x64-musl': 4.52.5 2426 | '@rollup/rollup-openharmony-arm64': 4.52.5 2427 | '@rollup/rollup-win32-arm64-msvc': 4.52.5 2428 | '@rollup/rollup-win32-ia32-msvc': 4.52.5 2429 | '@rollup/rollup-win32-x64-gnu': 4.52.5 2430 | '@rollup/rollup-win32-x64-msvc': 4.52.5 2431 | fsevents: 2.3.3 2432 | 2433 | run-parallel@1.2.0: 2434 | dependencies: 2435 | queue-microtask: 1.2.3 2436 | 2437 | semver@7.7.3: {} 2438 | 2439 | sh-syntax@0.4.2: 2440 | dependencies: 2441 | tslib: 2.8.1 2442 | 2443 | shebang-command@2.0.0: 2444 | dependencies: 2445 | shebang-regex: 3.0.0 2446 | 2447 | shebang-regex@3.0.0: {} 2448 | 2449 | siginfo@2.0.0: {} 2450 | 2451 | signal-exit@4.1.0: {} 2452 | 2453 | sort-object-keys@1.1.3: {} 2454 | 2455 | sort-package-json@3.4.0: 2456 | dependencies: 2457 | detect-indent: 7.0.2 2458 | detect-newline: 4.0.1 2459 | git-hooks-list: 4.1.1 2460 | is-plain-obj: 4.1.0 2461 | semver: 7.7.3 2462 | sort-object-keys: 1.1.3 2463 | tinyglobby: 0.2.15 2464 | 2465 | source-map-js@1.2.1: {} 2466 | 2467 | source-map@0.8.0-beta.0: 2468 | dependencies: 2469 | whatwg-url: 7.1.0 2470 | 2471 | stackback@0.0.2: {} 2472 | 2473 | std-env@3.10.0: {} 2474 | 2475 | string-width@4.2.3: 2476 | dependencies: 2477 | emoji-regex: 8.0.0 2478 | is-fullwidth-code-point: 3.0.0 2479 | strip-ansi: 6.0.1 2480 | 2481 | string-width@5.1.2: 2482 | dependencies: 2483 | eastasianwidth: 0.2.0 2484 | emoji-regex: 9.2.2 2485 | strip-ansi: 7.1.2 2486 | 2487 | strip-ansi@6.0.1: 2488 | dependencies: 2489 | ansi-regex: 5.0.1 2490 | 2491 | strip-ansi@7.1.2: 2492 | dependencies: 2493 | ansi-regex: 6.2.2 2494 | 2495 | strip-json-comments@3.1.1: {} 2496 | 2497 | sucrase@3.35.0: 2498 | dependencies: 2499 | '@jridgewell/gen-mapping': 0.3.13 2500 | commander: 4.1.1 2501 | glob: 10.4.5 2502 | lines-and-columns: 1.2.4 2503 | mz: 2.7.0 2504 | pirates: 4.0.7 2505 | ts-interface-checker: 0.1.13 2506 | 2507 | supports-color@7.2.0: 2508 | dependencies: 2509 | has-flag: 4.0.0 2510 | 2511 | synckit@0.11.8: 2512 | dependencies: 2513 | '@pkgr/core': 0.2.9 2514 | 2515 | thenify-all@1.6.0: 2516 | dependencies: 2517 | thenify: 3.3.1 2518 | 2519 | thenify@3.3.1: 2520 | dependencies: 2521 | any-promise: 1.3.0 2522 | 2523 | tinybench@2.9.0: {} 2524 | 2525 | tinyexec@0.3.2: {} 2526 | 2527 | tinyglobby@0.2.15: 2528 | dependencies: 2529 | fdir: 6.5.0(picomatch@4.0.3) 2530 | picomatch: 4.0.3 2531 | 2532 | tinyrainbow@3.0.3: {} 2533 | 2534 | to-regex-range@5.0.1: 2535 | dependencies: 2536 | is-number: 7.0.0 2537 | 2538 | tr46@1.0.1: 2539 | dependencies: 2540 | punycode: 2.3.1 2541 | 2542 | tree-kill@1.2.2: {} 2543 | 2544 | ts-api-utils@2.1.0(typescript@5.9.3): 2545 | dependencies: 2546 | typescript: 5.9.3 2547 | 2548 | ts-interface-checker@0.1.13: {} 2549 | 2550 | tslib@2.8.1: {} 2551 | 2552 | tsup@8.5.0(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3): 2553 | dependencies: 2554 | bundle-require: 5.1.0(esbuild@0.25.11) 2555 | cac: 6.7.14 2556 | chokidar: 4.0.3 2557 | consola: 3.4.2 2558 | debug: 4.4.3 2559 | esbuild: 0.25.11 2560 | fix-dts-default-cjs-exports: 1.0.1 2561 | joycon: 3.1.1 2562 | picocolors: 1.1.1 2563 | postcss-load-config: 6.0.1(jiti@2.5.1)(postcss@8.5.6)(tsx@4.20.6) 2564 | resolve-from: 5.0.0 2565 | rollup: 4.52.5 2566 | source-map: 0.8.0-beta.0 2567 | sucrase: 3.35.0 2568 | tinyexec: 0.3.2 2569 | tinyglobby: 0.2.15 2570 | tree-kill: 1.2.2 2571 | optionalDependencies: 2572 | postcss: 8.5.6 2573 | typescript: 5.9.3 2574 | transitivePeerDependencies: 2575 | - jiti 2576 | - supports-color 2577 | - tsx 2578 | - yaml 2579 | 2580 | tsx@4.20.6: 2581 | dependencies: 2582 | esbuild: 0.25.11 2583 | get-tsconfig: 4.13.0 2584 | optionalDependencies: 2585 | fsevents: 2.3.3 2586 | optional: true 2587 | 2588 | type-check@0.4.0: 2589 | dependencies: 2590 | prelude-ls: 1.2.1 2591 | 2592 | typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3): 2593 | dependencies: 2594 | '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3) 2595 | '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3) 2596 | '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) 2597 | '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.5.1))(typescript@5.9.3) 2598 | eslint: 9.38.0(jiti@2.5.1) 2599 | typescript: 5.9.3 2600 | transitivePeerDependencies: 2601 | - supports-color 2602 | 2603 | typescript@5.9.3: {} 2604 | 2605 | ufo@1.6.1: {} 2606 | 2607 | undici-types@7.16.0: {} 2608 | 2609 | uri-js@4.4.1: 2610 | dependencies: 2611 | punycode: 2.3.1 2612 | 2613 | vite@7.1.12(@types/node@24.9.2)(jiti@2.5.1)(tsx@4.20.6): 2614 | dependencies: 2615 | esbuild: 0.25.11 2616 | fdir: 6.5.0(picomatch@4.0.3) 2617 | picomatch: 4.0.3 2618 | postcss: 8.5.6 2619 | rollup: 4.52.5 2620 | tinyglobby: 0.2.15 2621 | optionalDependencies: 2622 | '@types/node': 24.9.2 2623 | fsevents: 2.3.3 2624 | jiti: 2.5.1 2625 | tsx: 4.20.6 2626 | 2627 | vitest@4.0.5(@types/node@24.9.2)(jiti@2.5.1)(tsx@4.20.6): 2628 | dependencies: 2629 | '@vitest/expect': 4.0.5 2630 | '@vitest/mocker': 4.0.5(vite@7.1.12(@types/node@24.9.2)(jiti@2.5.1)(tsx@4.20.6)) 2631 | '@vitest/pretty-format': 4.0.5 2632 | '@vitest/runner': 4.0.5 2633 | '@vitest/snapshot': 4.0.5 2634 | '@vitest/spy': 4.0.5 2635 | '@vitest/utils': 4.0.5 2636 | debug: 4.4.3 2637 | es-module-lexer: 1.7.0 2638 | expect-type: 1.2.2 2639 | magic-string: 0.30.21 2640 | pathe: 2.0.3 2641 | picomatch: 4.0.3 2642 | std-env: 3.10.0 2643 | tinybench: 2.9.0 2644 | tinyexec: 0.3.2 2645 | tinyglobby: 0.2.15 2646 | tinyrainbow: 3.0.3 2647 | vite: 7.1.12(@types/node@24.9.2)(jiti@2.5.1)(tsx@4.20.6) 2648 | why-is-node-running: 2.3.0 2649 | optionalDependencies: 2650 | '@types/node': 24.9.2 2651 | transitivePeerDependencies: 2652 | - jiti 2653 | - less 2654 | - lightningcss 2655 | - msw 2656 | - sass 2657 | - sass-embedded 2658 | - stylus 2659 | - sugarss 2660 | - supports-color 2661 | - terser 2662 | - tsx 2663 | - yaml 2664 | 2665 | webidl-conversions@4.0.2: {} 2666 | 2667 | whatwg-url@7.1.0: 2668 | dependencies: 2669 | lodash.sortby: 4.7.0 2670 | tr46: 1.0.1 2671 | webidl-conversions: 4.0.2 2672 | 2673 | which@2.0.2: 2674 | dependencies: 2675 | isexe: 2.0.0 2676 | 2677 | why-is-node-running@2.3.0: 2678 | dependencies: 2679 | siginfo: 2.0.0 2680 | stackback: 0.0.2 2681 | 2682 | word-wrap@1.2.5: {} 2683 | 2684 | wrap-ansi@7.0.0: 2685 | dependencies: 2686 | ansi-styles: 4.3.0 2687 | string-width: 4.2.3 2688 | strip-ansi: 6.0.1 2689 | 2690 | wrap-ansi@8.1.0: 2691 | dependencies: 2692 | ansi-styles: 6.2.3 2693 | string-width: 5.1.2 2694 | strip-ansi: 7.1.2 2695 | 2696 | yocto-queue@0.1.0: {} 2697 | --------------------------------------------------------------------------------