diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..d88011f --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml new file mode 100644 index 0000000..330ab60 --- /dev/null +++ b/.github/workflows/autofix.yml @@ -0,0 +1,39 @@ +name: autofix.ci + +on: + pull_request: + branches-ignore: + - 'renovate/**' + push: + branches: + - main + +permissions: + contents: read + +jobs: + apply: + name: Apply automated fixes + runs-on: ubuntu-latest + if: ${{ github.actor != 'renovate[bot]' && ! contains(github.event.head_commit.author.name , 'renovate[bot]') && ! contains(github.event.head_commit.message , 'chore(release)') }} + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - name: Setup toolchains + uses: jdx/mise-action@be3be2260bc02bc3fbf94c5e2fed8b7964baf074 # v3.4.0 + - name: Install Dependencies + run: pnpm install --no-frozen-lockfile + - name: Format code + run: pnpm biome check --write + - name: Fix package.json + run: pnpm syncpack fix + - name: Format package.json + run: pnpm syncpack format + - name: Fix audit issues + run: pnpm audit --fix + - name: Update package lock file + run: pnpm install --no-frozen-lockfile + - name: Submit autofix + uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 # v1.3.2 + with: + fail-fast: false diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a87464c..e23052f 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -12,38 +12,34 @@ jobs: secrets: inherit release: name: Release - needs: test runs-on: ubuntu-latest permissions: + id-token: write contents: write - issues: write pull-requests: write - id-token: write steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Install jq - uses: dcarbone/install-jq-action@v2 - - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: latest - - name: Setup Node.js - uses: actions/setup-node@v4 + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - name: Setup toolchains + uses: jdx/mise-action@be3be2260bc02bc3fbf94c5e2fed8b7964baf074 # v3.4.0 + - name: Install Dependencies + run: pnpm install + - name: Update npm + run: npm install -g npm@latest + - name: Create Release Pull Request or Publish to npm + uses: changesets/action@e0145edc7d9d8679003495b11f87bd8ef63c0cba # v1.5.3 + id: changesets with: - node-version: 'lts/*' - cache: 'pnpm' - - name: Release on GitHub - run: pnpm --package conventional-changelog-conventionalcommits --package semantic-release dlx semantic-release + publish: 'pnpm tsdown && pnpm changeset publish' + commitMode: 'github-api' + title: 'Release new version' + commit: 'Bump version package' env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Update version for JSR registry + - name: Publish to JSR run: | VERSION=$(node -p "require('./package.json').version") jq --arg version "$VERSION" '.version = $version' jsr.json > jsr.json.tmp mv jsr.json.tmp jsr.json - echo "VERSION=$VERSION" >> $GITHUB_ENV - - name: Publish package to JSR - if: env.VERSION != '0.0.0-development' - run: pnpm dlx jsr publish + pnpm dlx jsr publish --allow-dirty + if: steps.changesets.outputs.published == 'true' diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 781471b..a0c094d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,76 +11,70 @@ jobs: name: Lints runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: latest - - uses: actions/setup-node@v4 - with: - node-version: 'lts/*' - cache: 'pnpm' + - name: Checkout + uses: actions/checkout@v5.0.0 + - name: Setup toolchains + uses: jdx/mise-action@be3be2260bc02bc3fbf94c5e2fed8b7964baf074 # v3.4.0 - name: Install dependencies run: pnpm install - - name: Prettier check - run: pnpm test:prettier + - name: Biome check + run: pnpm biome check + - name: Syncpack lint + run: pnpm syncpack lint + - name: Syncpack format + run: pnpm syncpack format --check - name: Checks for known security issues with the installed packages run: pnpm audit - name: Verify the integrity of provenance attestations and registry signatures for installed dependencies run: pnpm npm audit signatures - name: Verify the package for publishing performing all checks and validations run: pnpm dlx jsr publish --dry-run - node: - name: Node - needs: lints + unit-test: + name: Unit Test runs-on: ubuntu-latest - strategy: - matrix: - node: [18, 20, 21] + permissions: + id-token: write + contents: read steps: - - uses: actions/checkout@v4 - - name: Setup pnpm - uses: pnpm/action-setup@v3 + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - name: Setup toolchains + uses: jdx/mise-action@be3be2260bc02bc3fbf94c5e2fed8b7964baf074 # v3.4.0 + - name: Install Dependencies + run: pnpm install + - name: Run Tests + run: pnpm vitest --coverage --reporter=junit --outputFile=test-report.junit.xml + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@5a1091511ad55cbe89839c7260b706298ca349f7 # v5.5.1 with: - version: latest - - name: Set up Node.js ${{matrix.node}} - uses: actions/setup-node@v4 + use_oidc: true + - name: Upload test results to Codecov + uses: codecov/test-results-action@47f89e9acb64b76debcd5ea40642d25a4adced9f # v1.1.1 + if: ${{ !cancelled() }} with: - node-version: ${{matrix.node}} - cache: 'pnpm' - - name: Install dependencies - run: pnpm install - - name: Run unit tests - run: pnpm test -- --environment=node - test: - name: Test - needs: lints + use_oidc: true + benchmark: + name: Benchmark runs-on: ubuntu-latest - strategy: - matrix: - environment: [edge-runtime, jsdom, happy-dom] steps: - - uses: actions/checkout@v4 - - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: latest - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 'lts/*' - cache: 'pnpm' - - name: Install dependencies + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - name: Setup toolchains + uses: jdx/mise-action@be3be2260bc02bc3fbf94c5e2fed8b7964baf074 # v3.4.0 + - name: Install Dependencies run: pnpm install - - name: Run unit tests - run: pnpm test -- --environment=${{ matrix.environment }} + - name: Run Benchmarks + uses: CodSpeedHQ/action@4348f634fa7309fe23aac9502e88b999ec90a164 # v4.3.1 + with: + run: pnpm vitest bench + mode: 'instrumentation' deno: name: Deno - needs: lints runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v5.0.0 - name: Install Deno - uses: denoland/setup-deno@v1 + uses: denoland/setup-deno@v2.0.3 - name: Type-check the dependencies run: deno check src/index.ts diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index bd5535a..0000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -pnpm-lock.yaml diff --git a/.prettierrc.yml b/.prettierrc.yml deleted file mode 100644 index eca9e73..0000000 --- a/.prettierrc.yml +++ /dev/null @@ -1,3 +0,0 @@ -semi: false -singleQuote: true -trailingComma: none diff --git a/.releaserc.json b/.releaserc.json deleted file mode 100644 index b91e9df..0000000 --- a/.releaserc.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "branches": ["main"], - "tagFormat": "${version}", - "plugins": [ - "@semantic-release/commit-analyzer", - "@semantic-release/release-notes-generator", - "@semantic-release/npm", - "@semantic-release/github" - ] -} diff --git a/.syncpackrc.json b/.syncpackrc.json new file mode 100644 index 0000000..0998545 --- /dev/null +++ b/.syncpackrc.json @@ -0,0 +1,56 @@ +{ + "$schema": "./node_modules/syncpack/schema.json", + "sortFirst": [ + "name", + "description", + "version", + "productName", + "author", + "homepage", + "repository", + "bugs", + "private", + "publishConfig", + "sideEffects", + "type", + "main", + "module", + "types", + "exports", + "scripts", + "dependencies", + "devDependencies", + "peerDependencies", + "trustedDependencies", + "workspaces", + "packageManager" + ], + "sortExports": ["import", "types"], + "sortAz": [ + "exports", + "scripts", + "workspaces", + "dependencies", + "devDependencies", + "peerDependencies", + "trustedDependencies" + ], + "semverGroups": [ + { + "label": "All non-peer dependencies must be pinned", + "range": "", + "dependencyTypes": ["!peer"], + "dependencies": ["**"], + "packages": ["**"] + }, + { + "label": "Allow peer deps to be equal or higher than current versions", + "range": ">=", + "dependencyTypes": ["peer"], + "dependencies": ["**"], + "packages": ["**"] + } + ], + "formatBugs": false, + "formatRepository": false +} diff --git a/README.md b/README.md index bfb7469..6d3a007 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ # vn-number 🇻🇳 -[![JSR Score](https://jsr.io/badges/@hckhanh/vn-number)](https://jsr.io/@hckhanh/vn-number) - 🛠 A bunch of utility functions that work with number in 🇻🇳 Vietnamese language +[![NPM Downloads](https://img.shields.io/npm/dw/vn-number)](https://www.npmjs.com/package/vn-number) +[![JSR](https://jsr.io/badges/@hckhanh/vn-number/weekly-downloads)](https://jsr.io/@hckhanh/vn-number) + ## Features - [Zero dependencies](https://jsr.io/@hckhanh/vn-number/dependencies) @@ -13,7 +14,7 @@ ## Functions -### Read Vietnamese number (một triệu hai trăm năm mươi nghìn) +### Read Vietnamese number ```ts import { readVnNumber } from '@hckhanh/vn-number' @@ -22,7 +23,7 @@ const result = readVnNumber(1250000) console.log(result) // một triệu hai trăm năm mươi nghìn ``` -### Format number in Vietnamese format (1.250.000) +### Format number in Vietnamese format ```ts import { formatVnNumber } from '@hckhanh/vn-number' @@ -31,7 +32,7 @@ const result = formatVnNumber(1250000) console.log(result) // 1.250.000 ``` -### Format VN currency (VND) (1.250.000 ₫) +### Format VN currency (VND - ₫) ```ts import { formatVnCurrency } from '@hckhanh/vn-number' @@ -40,7 +41,7 @@ const result = formatVnCurrency(1250000) console.log(result) // 1.250.000 ₫ ``` -### Format percentage in Vietnamese format (99,1%) +### Format percentage in Vietnamese format ```ts import { formatVnPercent } from '@hckhanh/vn-number' @@ -51,4 +52,4 @@ console.log(result) // 99,1% ## Release Notes -You can go to [Releases](https://github.com/hckhanh/vn-number/releases) page to see the release notes. +You can go to [the Releases](https://github.com/hckhanh/vn-number/releases) page to see the release notes. diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..9e330b2 --- /dev/null +++ b/biome.json @@ -0,0 +1,61 @@ +{ + "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "noUnusedImports": { + "level": "warn", + "fix": "safe" + } + }, + "style": { + "useTemplate": "off", + "useConsistentTypeDefinitions": { + "level": "warn", + "fix": "safe" + }, + "useNodejsImportProtocol": { + "level": "warn", + "fix": "safe" + }, + "noUnusedTemplateLiteral": { + "level": "warn", + "fix": "safe" + } + }, + "nursery": { + "recommended": true + } + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "semicolons": "asNeeded", + "arrowParentheses": "always" + } + } +} diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..9790b26 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,13 @@ +coverage: + status: + project: + default: + target: auto + threshold: 1% + patch: + default: + target: auto + threshold: 1% + +ignore: + - 'docs' diff --git a/jsr.json b/jsr.json index a39351a..5d34984 100644 --- a/jsr.json +++ b/jsr.json @@ -1,19 +1,9 @@ { "name": "@hckhanh/vn-number", "version": "0.0.0-development", + "license": "MIT", "exports": "./src/index.ts", - "exclude": [ - ".github/", - "src/**/*.test.ts", - ".git*", - ".prettier*", - ".*ignore", - "*.yml", - "*.yaml", - "*.config.ts", - ".*rc.json", - "package.json", - "renovate.json", - "tsconfig.json" - ] + "publish": { + "include": ["LICENSE", "README.md", "src/**/*.ts"] + } } diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..087d5e7 --- /dev/null +++ b/mise.toml @@ -0,0 +1,4 @@ +[tools] +npm = "11.6.2" +node = "24.11.0" +pnpm = "10.20.0" diff --git a/package.json b/package.json index 92da4f9..8529813 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,38 @@ { "name": "@hckhanh/vn-number", - "version": "0.0.0-development", "description": "A bunch of utility functions that work with number in Vietnamese language", - "type": "module", - "private": true, - "sideEffects": false, - "scripts": { - "test": "vitest related src/**/*.ts", - "test:prettier": "prettier --check ." - }, + "version": "1.5.7", "author": { "name": "Khánh Hoàng", "email": "hi@khanh.sh", "url": "https://khanh.sh" }, - "license": "MIT", + "private": true, + "sideEffects": false, + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": "./dist/index.js", + "./package.json": "./package.json" + }, + "scripts": { + "format": "biome check --write", + "test": "vitest" + }, + "devDependencies": { + "@biomejs/biome": "2.3.2", + "@codspeed/vitest-plugin": "5.0.1", + "@vitest/coverage-v8": "3.2.4", + "syncpack": "14.0.0-alpha.23", + "tsdown": "0.15.12", + "typescript": "5.9.3", + "vitest": "3.2.4" + }, + "files": [ + "dist" + ], "keywords": [ "reader", "read", @@ -41,11 +59,5 @@ "helper-functions", "helper-script" ], - "devDependencies": { - "@edge-runtime/vm": "3.2.0", - "happy-dom": "13.10.1", - "jsdom": "24.1.1", - "prettier": "3.3.3", - "vitest": "1.6.0" - } + "license": "MIT" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1686ff..cb72f99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,325 +8,669 @@ importers: .: devDependencies: - '@edge-runtime/vm': - specifier: 3.2.0 - version: 3.2.0 - happy-dom: - specifier: 13.10.1 - version: 13.10.1 - jsdom: - specifier: 24.1.1 - version: 24.1.1 - prettier: - specifier: 3.3.3 - version: 3.3.3 + '@biomejs/biome': + specifier: 2.3.2 + version: 2.3.2 + '@codspeed/vitest-plugin': + specifier: 5.0.1 + version: 5.0.1(tinybench@2.9.0)(vite@7.1.12(jiti@2.6.1)(tsx@4.20.6))(vitest@3.2.4(jiti@2.6.1)(tsx@4.20.6)) + '@vitest/coverage-v8': + specifier: 3.2.4 + version: 3.2.4(vitest@3.2.4(jiti@2.6.1)(tsx@4.20.6)) + syncpack: + specifier: 14.0.0-alpha.23 + version: 14.0.0-alpha.23 + tsdown: + specifier: 0.15.12 + version: 0.15.12(typescript@5.9.3) + typescript: + specifier: 5.9.3 + version: 5.9.3 vitest: - specifier: 1.6.0 - version: 1.6.0(@edge-runtime/vm@3.2.0)(happy-dom@13.10.1)(jsdom@24.1.1) + specifier: 3.2.4 + version: 3.2.4(jiti@2.6.1)(tsx@4.20.6) packages: - '@edge-runtime/primitives@4.1.0': - resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} - engines: {node: '>=16'} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} - '@edge-runtime/vm@3.2.0': - resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} - engines: {node: '>=16'} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@biomejs/biome@2.3.2': + resolution: {integrity: sha512-8e9tzamuDycx7fdrcJ/F/GDZ8SYukc5ud6tDicjjFqURKYFSWMl0H0iXNXZEGmcmNUmABgGuHThPykcM41INgg==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.3.2': + resolution: {integrity: sha512-4LECm4kc3If0JISai4c3KWQzukoUdpxy4fRzlrPcrdMSRFksR9ZoXK7JBcPuLBmd2SoT4/d7CQS33VnZpgBjew==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.3.2': + resolution: {integrity: sha512-jNMnfwHT4N3wi+ypRfMTjLGnDmKYGzxVr1EYAPBcauRcDnICFXN81wD6wxJcSUrLynoyyYCdfW6vJHS/IAoTDA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.3.2': + resolution: {integrity: sha512-2Zz4usDG1GTTPQnliIeNx6eVGGP2ry5vE/v39nT73a3cKN6t5H5XxjcEoZZh62uVZvED7hXXikclvI64vZkYqw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-arm64@2.3.2': + resolution: {integrity: sha512-amnqvk+gWybbQleRRq8TMe0rIv7GHss8mFJEaGuEZYWg1Tw14YKOkeo8h6pf1c+d3qR+JU4iT9KXnBKGON4klw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-linux-x64-musl@2.3.2': + resolution: {integrity: sha512-gzB19MpRdTuOuLtPpFBGrV3Lq424gHyq2lFj8wfX9tvLMLdmA/R9C7k/mqBp/spcbWuHeIEKgEs3RviOPcWGBA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@biomejs/cli-linux-x64@2.3.2': + resolution: {integrity: sha512-8BG/vRAhFz1pmuyd24FQPhNeueLqPtwvZk6yblABY2gzL2H8fLQAF/Z2OPIc+BPIVPld+8cSiKY/KFh6k81xfA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@biomejs/cli-win32-arm64@2.3.2': + resolution: {integrity: sha512-lCruqQlfWjhMlOdyf5pDHOxoNm4WoyY2vZ4YN33/nuZBRstVDuqPPjS0yBkbUlLEte11FbpW+wWSlfnZfSIZvg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.3.2': + resolution: {integrity: sha512-6Ee9P26DTb4D8sN9nXxgbi9Dw5vSOfH98M7UlmkjKB2vtUbrRqCbZiNfryGiwnPIpd6YUoTl7rLVD2/x1CyEHQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@codspeed/core@5.0.1': + resolution: {integrity: sha512-4g5ZyFAin8QywK4+0FK1uXG3GLRPu0oc3xbP+7OUhhFxbwpzFuaJtKmnTofMqLy9/pHH6Bl/7H0/DTVH3cpFkA==} + + '@codspeed/vitest-plugin@5.0.1': + resolution: {integrity: sha512-RQLy8AGI16oTtmTyBIS2iKzD4AQQzJP7waurrYkUlnOlCa5Yp/7KXVZuZVzhqwYmPcH984xzFtsC2CENYbpRHQ==} + peerDependencies: + tinybench: '>=2.9.0' + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vitest: '>=3.2' + + '@emnapi/core@1.6.0': + resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + + '@emnapi/runtime@1.6.0': + resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@oxc-project/types@0.95.0': + resolution: {integrity: sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + + '@rolldown/binding-android-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-bfgKYhFiXJALeA/riil908+2vlyWGdwa7Ju5S+JgWZYdR4jtiPOGdM6WLfso1dojCh+4ZWeiTwPeV9IKQEX+4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-xjCv4CRVsSnnIxTuyH1RDJl5OEQ1c9JYOwfDAHddjJDxCw46ZX9q80+xq7Eok7KC4bRSZudMJllkvOKv0T9SeA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.45': + resolution: {integrity: sha512-ddcO9TD3D/CLUa/l8GO8LHzBOaZqWg5ClMy3jICoxwCuoz47h9dtqPsIeTiB6yR501LQTeDsjA4lIFd7u3Ljfw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.45': + resolution: {integrity: sha512-MBTWdrzW9w+UMYDUvnEuh0pQvLENkl2Sis15fHTfHVW7ClbGuez+RWopZudIDEGkpZXdeI4CkRXk+vdIIebrmg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45': + resolution: {integrity: sha512-4YgoCFiki1HR6oSg+GxxfzfnVCesQxLF1LEnw9uXS/MpBmuog0EOO2rYfy69rWP4tFZL9IWp6KEfGZLrZ7aUog==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45': + resolution: {integrity: sha512-LE1gjAwQRrbCOorJJ7LFr10s5vqYf5a00V5Ea9wXcT2+56n5YosJkcp8eQ12FxRBv2YX8dsdQJb+ZTtYJwb6XQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': + resolution: {integrity: sha512-tdy8ThO/fPp40B81v0YK3QC+KODOmzJzSUOO37DinQxzlTJ026gqUSOM8tzlVixRbQJltgVDCTYF8HNPRErQTA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': + resolution: {integrity: sha512-lS082ROBWdmOyVY/0YB3JmsiClaWoxvC+dA8/rbhyB9VLkvVEaihLEOr4CYmrMse151C4+S6hCw6oa1iewox7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': + resolution: {integrity: sha512-Hi73aYY0cBkr1/SvNQqH8Cd+rSV6S9RB5izCv0ySBcRnd/Wfn5plguUoGYwBnhHgFbh6cPw9m2dUVBR6BG1gxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': + resolution: {integrity: sha512-fljEqbO7RHHogNDxYtTzr+GNjlfOx21RUyGmF+NrkebZ8emYYiIqzPxsaMZuRx0rgZmVmliOzEp86/CQFDKhJQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.45': + resolution: {integrity: sha512-ZJDB7lkuZE9XUnWQSYrBObZxczut+8FZ5pdanm8nNS1DAo8zsrPuvGwn+U3fwU98WaiFsNrA4XHngesCGr8tEQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-zyzAjItHPUmxg6Z8SyRhLdXlJn3/D9KL5b9mObUrBHhWS/GwRH4665xCiFqeuktAhhWutqfc+rOV2LjK4VYQGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-wODcGzlfxqS6D7BR0srkJk3drPwXYLu7jPHN27ce2c4PUnVVmJnp9mJzUQGT4LpmHmmVdMZ+P6hKvyTGBzc1CA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] os: [win32] - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45': + resolution: {integrity: sha512-wiU40G1nQo9rtfvF9jLbl79lUgjfaD/LTyUEw2Wg/gdF5OhjzpKMVugZQngO+RNdwYaNj+Fs+kWBWfp4VXPMHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@rolldown/pluginutils@1.0.0-beta.45': + resolution: {integrity: sha512-Le9ulGCrD8ggInzWw/k2J8QcbPz7eGIOWqfJ2L+1R0Opm7n6J37s2hiDWlh6LJN0Lk9L5sUzMvRHKW7UxBZsQA==} - '@rollup/rollup-android-arm-eabi@4.14.0': - resolution: {integrity: sha512-jwXtxYbRt1V+CdQSy6Z+uZti7JF5irRKF8hlKfEnF/xJpcNGuuiZMBvuoYM+x9sr9iWGnzrlM0+9hvQ1kgkf1w==} + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.14.0': - resolution: {integrity: sha512-fI9nduZhCccjzlsA/OuAwtFGWocxA4gqXGTLvOyiF8d+8o0fZUeSztixkYjcGq1fGZY3Tkq4yRvHPFxU+jdZ9Q==} + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.14.0': - resolution: {integrity: sha512-BcnSPRM76/cD2gQC+rQNGBN6GStBs2pl/FpweW8JYuz5J/IEa0Fr4AtrPv766DB/6b2MZ/AfSIOSGw3nEIP8SA==} + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.14.0': - resolution: {integrity: sha512-LDyFB9GRolGN7XI6955aFeI3wCdCUszFWumWU0deHA8VpR3nWRrjG6GtGjBrQxQKFevnUTHKCfPR4IvrW3kCgQ==} + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.14.0': - resolution: {integrity: sha512-ygrGVhQP47mRh0AAD0zl6QqCbNsf0eTo+vgwkY6LunBcg0f2Jv365GXlDUECIyoXp1kKwL5WW6rsO429DBY/bA==} + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} cpu: [arm] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-gnu@4.14.0': - resolution: {integrity: sha512-x+uJ6MAYRlHGe9wi4HQjxpaKHPM3d3JjqqCkeC5gpnnI6OWovLdXTpfa8trjxPLnWKyBsSi5kne+146GAxFt4A==} + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.14.0': - resolution: {integrity: sha512-nrRw8ZTQKg6+Lttwqo6a2VxR9tOroa2m91XbdQ2sUUzHoedXlsyvY1fN4xWdqz8PKmf4orDwejxXHjh7YBGUCA==} + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-powerpc64le-gnu@4.14.0': - resolution: {integrity: sha512-xV0d5jDb4aFu84XKr+lcUJ9y3qpIWhttO3Qev97z8DKLXR62LC3cXT/bMZXrjLF9X+P5oSmJTzAhqwUbY96PnA==} - cpu: [ppc64le] + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.14.0': - resolution: {integrity: sha512-SDDhBQwZX6LPRoPYjAZWyL27LbcBo7WdBFWJi5PI9RPCzU8ijzkQn7tt8NXiXRiFMJCVpkuMkBf4OxSxVMizAw==} + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} cpu: [riscv64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.14.0': - resolution: {integrity: sha512-RxB/qez8zIDshNJDufYlTT0ZTVut5eCpAZ3bdXDU9yTxBzui3KhbGjROK2OYTTor7alM7XBhssgoO3CZ0XD3qA==} + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} cpu: [s390x] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.14.0': - resolution: {integrity: sha512-C6y6z2eCNCfhZxT9u+jAM2Fup89ZjiG5pIzZIDycs1IwESviLxwkQcFRGLjnDrP+PT+v5i4YFvlcfAs+LnreXg==} + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.14.0': - resolution: {integrity: sha512-i0QwbHYfnOMYsBEyjxcwGu5SMIi9sImDVjDg087hpzXqhBSosxkE7gyIYFHgfFl4mr7RrXksIBZ4DoLoP4FhJg==} + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} cpu: [x64] os: [linux] + libc: [musl] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.14.0': - resolution: {integrity: sha512-Fq52EYb0riNHLBTAcL0cun+rRwyZ10S9vKzhGKKgeD+XbwunszSY0rVMco5KbOsTlwovP2rTOkiII/fQ4ih/zQ==} + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.14.0': - resolution: {integrity: sha512-e/PBHxPdJ00O9p5Ui43+vixSgVf4NlLsmV6QneGERJ3lnjIua/kim6PRFe3iDueT1rQcgSkYP8ZBBXa/h4iPvw==} + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.14.0': - resolution: {integrity: sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==} + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} cpu: [x64] os: [win32] - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/coverage-v8@3.2.4': + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + peerDependencies: + '@vitest/browser': 3.2.4 + vitest: 3.2.4 + peerDependenciesMeta: + '@vitest/browser': + optional: true - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-kit@2.1.3: + resolution: {integrity: sha512-TH+b3Lv6pUjy/Nu0m6A2JULtdzLpmqF9x1Dhj00ZoEiML8qvVA9j1flkzTKNYgdEhWrjDwtWNpyyCUbfQe514g==} + engines: {node: '>=20.19.0'} + + ast-v8-to-istanbul@0.3.8: + resolution: {integrity: sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + axios@1.13.1: + resolution: {integrity: sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + birpc@2.6.1: + resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - cssstyle@4.0.1: - resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} - engines: {node: '>=18'} - - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -334,39 +678,106 @@ packages: supports-color: optional: true - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + dts-resolver@2.1.2: + resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} hasBin: true estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} fsevents@2.3.3: @@ -374,75 +785,111 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} - happy-dom@13.10.1: - resolution: {integrity: sha512-9GZLEFvQL5EgfJX2zcBgu1nsPUn98JF/EiJnSfQbdxI6YEQGqpd09lXXxOmYonRBIEFz9JlGCOiPflDzgS1p8w==} - engines: {node: '>=16.0.0'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true - https-proxy-agent@7.0.5: - resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} - engines: {node: '>= 14'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - js-tokens@8.0.3: - resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} - jsdom@24.1.1: - resolution: {integrity: sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==} - engines: {node: '>=18'} - peerDependencies: - canvas: ^2.11.2 - peerDependenciesMeta: - canvas: - optional: true + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - magic-string@0.30.7: - resolution: {integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==} - engines: {node: '>=12'} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} @@ -452,105 +899,113 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} - mlly@1.6.1: - resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true - nwsapi@2.2.12: - resolution: {integrity: sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} + engines: {node: '>= 14.16'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} - hasBin: true - - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + rolldown-plugin-dts@0.17.3: + resolution: {integrity: sha512-8mGnNUVNrqEdTnrlcaDxs4sAZg0No6njO+FuhQd4L56nUbJO1tHxOoKDH3mmMJg7f/BhEj/1KjU5W9kZ9zM/kQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.44 + typescript: ^5.0.0 + vue-tsc: ~3.1.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + rolldown@1.0.0-beta.45: + resolution: {integrity: sha512-iMmuD72XXLf26Tqrv1cryNYLX6NNPLhZ3AmNkSf8+xda0H+yijjGJ+wVT9UdBUHOpKzq9RjKtQKRCWoEKQQBZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true - rollup@4.14.0: - resolution: {integrity: sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==} + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rrweb-cssom@0.6.0: - resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - - rrweb-cssom@0.7.1: - resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -567,539 +1022,946 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + syncpack-darwin-arm64@14.0.0-alpha.23: + resolution: {integrity: sha512-j5viNfqTQGU+RX2dtuVU6PzA43c8LSzzTaU+LiK/4XR0dXSWBWl30CldP3JOsC2p68AZ5PfMwKDwCSMAtmuBpw==} + cpu: [arm64] + os: [darwin] + + syncpack-darwin-x64@14.0.0-alpha.23: + resolution: {integrity: sha512-Ctuw1TLzYsAsR9V7SBBTvsQR+A2l2ik7xpqja/wZ1Gv2gmWPz1JproX/9A5hA5+Ji+/hJ7Fqy7osxozAWA0uTw==} + cpu: [x64] + os: [darwin] + + syncpack-linux-arm64@14.0.0-alpha.23: + resolution: {integrity: sha512-OToUm+p7Yc8HYbJshighBNlEwHRStrVOQ9DEJHBVR05BOV8pNJ7ccMdeWy5D1uO4pV69Pn2Q3hVOu66eEQguiA==} + cpu: [arm64] + os: [linux] + + syncpack-linux-x64@14.0.0-alpha.23: + resolution: {integrity: sha512-00TX/4XSBDKN4gNtCgjnzR3zR3sWkgMSucx0m6K6KwOJrZBXgXXfKw+/Z8DDztzKQjMieHUjSSIKZlXCcWKpqQ==} + cpu: [x64] + os: [linux] + + syncpack-windows-arm64@14.0.0-alpha.23: + resolution: {integrity: sha512-C31cF1x1xeZ7Zt3ckK18ynuj+rMjBOvflsYRg45sX9vAt/7r0UndbCODhEVMRaoFqSds2+Aw2N5RpsGC6OS2Yg==} + cpu: [arm64] + os: [win32] + + syncpack-windows-x64@14.0.0-alpha.23: + resolution: {integrity: sha512-Wn5uHhfp5hbCIz/mXZTaqPz7vTZ6lswynSxHfAHpVNmTQguUskHXZrKh3nNTNsDPukAozs/8mVdwavvdR71YoA==} + cpu: [x64] + os: [win32] + + syncpack@14.0.0-alpha.23: + resolution: {integrity: sha512-w/vA43wcK1LuygnJ0FAKkRI3j/QqI/42M7SoFjxCo81o2Ck4H/5C2Xm1AxX7ViGd2fda4WVevvlVy2uyKuwlSQ==} + engines: {node: '>=14.17.0'} + hasBin: true + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} + engines: {node: '>=14.0.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tsdown@0.15.12: + resolution: {integrity: sha512-c8VLlQm8/lFrOAg5VMVeN4NAbejZyVQkzd+ErjuaQgJFI/9MhR9ivr0H/CM7UlOF1+ELlF6YaI7sU/4itgGQ8w==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + unrun: ^0.2.1 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + unrun: + optional: true + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsx@4.20.6: + resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unconfig@7.3.3: + resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} + + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite@7.1.12: + resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@bcoe/v8-coverage@1.0.2': {} + + '@biomejs/biome@2.3.2': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.3.2 + '@biomejs/cli-darwin-x64': 2.3.2 + '@biomejs/cli-linux-arm64': 2.3.2 + '@biomejs/cli-linux-arm64-musl': 2.3.2 + '@biomejs/cli-linux-x64': 2.3.2 + '@biomejs/cli-linux-x64-musl': 2.3.2 + '@biomejs/cli-win32-arm64': 2.3.2 + '@biomejs/cli-win32-x64': 2.3.2 + + '@biomejs/cli-darwin-arm64@2.3.2': + optional: true + + '@biomejs/cli-darwin-x64@2.3.2': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.3.2': + optional: true + + '@biomejs/cli-linux-arm64@2.3.2': + optional: true + + '@biomejs/cli-linux-x64-musl@2.3.2': + optional: true + + '@biomejs/cli-linux-x64@2.3.2': + optional: true + + '@biomejs/cli-win32-arm64@2.3.2': + optional: true + + '@biomejs/cli-win32-x64@2.3.2': + optional: true + + '@codspeed/core@5.0.1': + dependencies: + axios: 1.13.1 + find-up: 6.3.0 + form-data: 4.0.4 + node-gyp-build: 4.8.4 + transitivePeerDependencies: + - debug + + '@codspeed/vitest-plugin@5.0.1(tinybench@2.9.0)(vite@7.1.12(jiti@2.6.1)(tsx@4.20.6))(vitest@3.2.4(jiti@2.6.1)(tsx@4.20.6))': + dependencies: + '@codspeed/core': 5.0.1 + tinybench: 2.9.0 + vite: 7.1.12(jiti@2.6.1)(tsx@4.20.6) + vitest: 3.2.4(jiti@2.6.1)(tsx@4.20.6) + transitivePeerDependencies: + - debug + + '@emnapi/core@1.6.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.6.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + '@esbuild/aix-ppc64@0.25.11': + optional: true - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + '@esbuild/android-arm64@0.25.11': + optional: true - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.11': + optional: true - strip-literal@2.0.0: - resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + '@esbuild/android-x64@0.25.11': + optional: true - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + '@esbuild/darwin-arm64@0.25.11': + optional: true - tinybench@2.6.0: - resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + '@esbuild/darwin-x64@0.25.11': + optional: true - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + '@esbuild/freebsd-arm64@0.25.11': + optional: true - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} - engines: {node: '>=14.0.0'} + '@esbuild/freebsd-x64@0.25.11': + optional: true - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + '@esbuild/linux-arm64@0.25.11': + optional: true - tr46@5.0.0: - resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} - engines: {node: '>=18'} + '@esbuild/linux-arm@0.25.11': + optional: true - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + '@esbuild/linux-ia32@0.25.11': + optional: true - ufo@1.4.0: - resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + '@esbuild/linux-loong64@0.25.11': + optional: true - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} + '@esbuild/linux-mips64el@0.25.11': + optional: true - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + '@esbuild/linux-ppc64@0.25.11': + optional: true - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + '@esbuild/linux-riscv64@0.25.11': + optional: true - vite@5.2.8: - resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + '@esbuild/linux-s390x@0.25.11': + optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 - happy-dom: '*' - jsdom: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true + '@esbuild/linux-x64@0.25.11': + optional: true - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + '@esbuild/netbsd-arm64@0.25.11': + optional: true - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.25.11': + optional: true - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} + '@esbuild/openbsd-arm64@0.25.11': + optional: true - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.25.11': + optional: true - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} + '@esbuild/openharmony-arm64@0.25.11': + optional: true - whatwg-url@14.0.0: - resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} - engines: {node: '>=18'} + '@esbuild/sunos-x64@0.25.11': + optional: true - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@esbuild/win32-arm64@0.25.11': + optional: true - why-is-node-running@2.2.2: - resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} - engines: {node: '>=8'} - hasBin: true + '@esbuild/win32-ia32@0.25.11': + optional: true - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + '@esbuild/win32-x64@0.25.11': + optional: true - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + '@istanbuljs/schema@0.1.3': {} - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 -snapshots: + '@jridgewell/resolve-uri@3.1.2': {} - '@edge-runtime/primitives@4.1.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@edge-runtime/vm@3.2.0': + '@jridgewell/trace-mapping@0.3.31': dependencies: - '@edge-runtime/primitives': 4.1.0 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - '@esbuild/aix-ppc64@0.20.2': + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 optional: true - '@esbuild/android-arm64@0.20.2': - optional: true + '@oxc-project/types@0.95.0': {} - '@esbuild/android-arm@0.20.2': + '@pkgjs/parseargs@0.11.0': optional: true - '@esbuild/android-x64@0.20.2': + '@quansync/fs@0.1.5': + dependencies: + quansync: 0.2.11 + + '@rolldown/binding-android-arm64@1.0.0-beta.45': optional: true - '@esbuild/darwin-arm64@0.20.2': + '@rolldown/binding-darwin-arm64@1.0.0-beta.45': optional: true - '@esbuild/darwin-x64@0.20.2': + '@rolldown/binding-darwin-x64@1.0.0-beta.45': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@rolldown/binding-freebsd-x64@1.0.0-beta.45': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.45': optional: true - '@esbuild/linux-arm64@0.20.2': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.45': optional: true - '@esbuild/linux-arm@0.20.2': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.45': optional: true - '@esbuild/linux-ia32@0.20.2': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.45': optional: true - '@esbuild/linux-loong64@0.20.2': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.45': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.45': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.45': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@esbuild/linux-riscv64@0.20.2': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.45': optional: true - '@esbuild/linux-s390x@0.20.2': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.45': optional: true - '@esbuild/linux-x64@0.20.2': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.45': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@rolldown/pluginutils@1.0.0-beta.45': {} + + '@rollup/rollup-android-arm-eabi@4.52.5': optional: true - '@esbuild/openbsd-x64@0.20.2': + '@rollup/rollup-android-arm64@4.52.5': optional: true - '@esbuild/sunos-x64@0.20.2': + '@rollup/rollup-darwin-arm64@4.52.5': optional: true - '@esbuild/win32-arm64@0.20.2': + '@rollup/rollup-darwin-x64@4.52.5': optional: true - '@esbuild/win32-ia32@0.20.2': + '@rollup/rollup-freebsd-arm64@4.52.5': optional: true - '@esbuild/win32-x64@0.20.2': + '@rollup/rollup-freebsd-x64@4.52.5': optional: true - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true - '@jridgewell/sourcemap-codec@1.4.15': {} + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true - '@rollup/rollup-android-arm-eabi@4.14.0': + '@rollup/rollup-linux-arm64-gnu@4.52.5': optional: true - '@rollup/rollup-android-arm64@4.14.0': + '@rollup/rollup-linux-arm64-musl@4.52.5': optional: true - '@rollup/rollup-darwin-arm64@4.14.0': + '@rollup/rollup-linux-loong64-gnu@4.52.5': optional: true - '@rollup/rollup-darwin-x64@4.14.0': + '@rollup/rollup-linux-ppc64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.14.0': + '@rollup/rollup-linux-riscv64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-arm64-gnu@4.14.0': + '@rollup/rollup-linux-riscv64-musl@4.52.5': optional: true - '@rollup/rollup-linux-arm64-musl@4.14.0': + '@rollup/rollup-linux-s390x-gnu@4.52.5': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.14.0': + '@rollup/rollup-linux-x64-gnu@4.52.5': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.14.0': + '@rollup/rollup-linux-x64-musl@4.52.5': optional: true - '@rollup/rollup-linux-s390x-gnu@4.14.0': + '@rollup/rollup-openharmony-arm64@4.52.5': optional: true - '@rollup/rollup-linux-x64-gnu@4.14.0': + '@rollup/rollup-win32-arm64-msvc@4.52.5': optional: true - '@rollup/rollup-linux-x64-musl@4.14.0': + '@rollup/rollup-win32-ia32-msvc@4.52.5': optional: true - '@rollup/rollup-win32-arm64-msvc@4.14.0': + '@rollup/rollup-win32-x64-gnu@4.52.5': optional: true - '@rollup/rollup-win32-ia32-msvc@4.14.0': + '@rollup/rollup-win32-x64-msvc@4.52.5': optional: true - '@rollup/rollup-win32-x64-msvc@4.14.0': + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 optional: true - '@sinclair/typebox@0.27.8': {} + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} - '@types/estree@1.0.5': {} + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(jiti@2.6.1)(tsx@4.20.6))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + ast-v8-to-istanbul: 0.3.8 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 + magicast: 0.3.5 + std-env: 3.10.0 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.4(jiti@2.6.1)(tsx@4.20.6) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + tinyrainbow: 2.0.0 - '@vitest/expect@1.6.0': + '@vitest/mocker@3.2.4(vite@7.1.12(jiti@2.6.1)(tsx@4.20.6))': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.1.12(jiti@2.6.1)(tsx@4.20.6) - '@vitest/runner@1.6.0': + '@vitest/pretty-format@3.2.4': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 - pathe: 1.1.2 + tinyrainbow: 2.0.0 - '@vitest/snapshot@1.6.0': + '@vitest/runner@3.2.4': dependencies: - magic-string: 0.30.7 - pathe: 1.1.2 - pretty-format: 29.7.0 + '@vitest/utils': 3.2.4 + pathe: 2.0.3 + strip-literal: 3.1.0 - '@vitest/spy@1.6.0': + '@vitest/snapshot@3.2.4': dependencies: - tinyspy: 2.2.1 + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.21 + pathe: 2.0.3 - '@vitest/utils@1.6.0': + '@vitest/spy@3.2.4': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + tinyspy: 4.0.4 - acorn-walk@8.3.2: {} + '@vitest/utils@3.2.4': + dependencies: + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 + tinyrainbow: 2.0.0 + + ansi-regex@5.0.1: {} - acorn@8.11.3: {} + ansi-regex@6.2.2: {} - agent-base@7.1.0: + ansi-styles@4.3.0: dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color + color-convert: 2.0.1 - ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + + ansis@4.2.0: {} + + assertion-error@2.0.1: {} + + ast-kit@2.1.3: + dependencies: + '@babel/parser': 7.28.5 + pathe: 2.0.3 - assertion-error@1.1.0: {} + ast-v8-to-istanbul@0.3.8: + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + estree-walker: 3.0.3 + js-tokens: 9.0.1 asynckit@0.4.0: {} + axios@1.13.1: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.4 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + birpc@2.6.1: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + cac@6.7.14: {} - chai@4.4.1: + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + chai@5.3.3: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.2.1 + pathval: 2.0.1 + + check-error@2.1.1: {} + + chokidar@4.0.3: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.3 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + readdirp: 4.1.2 - check-error@1.0.3: + color-convert@2.0.1: dependencies: - get-func-name: 2.0.2 + color-name: 1.1.4 + + color-name@1.1.4: {} combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - cssstyle@4.0.1: + debug@4.4.3: dependencies: - rrweb-cssom: 0.6.0 + ms: 2.1.3 - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 + deep-eql@5.0.2: {} - debug@4.3.4: - dependencies: - ms: 2.1.2 + defu@6.1.4: {} + + delayed-stream@1.0.0: {} + + diff@8.0.2: {} - decimal.js@10.4.3: {} + dts-resolver@2.1.2: {} - deep-eql@4.1.3: + dunder-proto@1.0.1: dependencies: - type-detect: 4.0.8 + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 - delayed-stream@1.0.0: {} + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + empathic@2.0.0: {} - diff-sequences@29.6.3: {} + es-define-property@1.0.1: {} - entities@4.5.0: {} + es-errors@1.3.0: {} - esbuild@0.20.2: + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.11: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.8 + + expect-type@1.2.2: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 - execa@8.0.1: + follow-redirects@1.15.11: {} + + foreground-child@3.3.1: dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 + cross-spawn: 7.0.6 signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - form-data@4.0.0: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 fsevents@2.3.3: optional: true - get-func-name@2.0.2: {} + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 - get-stream@8.0.1: {} + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 - happy-dom@13.10.1: + glob@10.4.5: dependencies: - entities: 4.5.0 - webidl-conversions: 7.0.0 - whatwg-mimetype: 3.0.0 + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + gopd@1.2.0: {} - html-encoding-sniffer@4.0.0: + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: dependencies: - whatwg-encoding: 3.1.1 + has-symbols: 1.1.0 - http-proxy-agent@7.0.2: + hasown@2.0.2: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color + function-bind: 1.1.2 + + hookable@5.5.3: {} + + html-escaper@2.0.2: {} + + is-fullwidth-code-point@3.0.0: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 - https-proxy-agent@7.0.5: + istanbul-lib-source-maps@5.0.6: dependencies: - agent-base: 7.1.0 - debug: 4.3.4 + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - human-signals@5.0.0: {} + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 - iconv-lite@0.6.3: + jackspeak@3.4.3: dependencies: - safer-buffer: 2.1.2 + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 - is-potential-custom-element-name@1.0.1: {} + jiti@2.6.1: {} - is-stream@3.0.0: {} + js-tokens@9.0.1: {} - isexe@2.0.0: {} + jsesc@3.1.0: {} - js-tokens@8.0.3: {} - - jsdom@24.1.1: - dependencies: - cssstyle: 4.0.1 - data-urls: 5.0.0 - decimal.js: 10.4.3 - form-data: 4.0.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.12 - parse5: 7.1.2 - rrweb-cssom: 0.7.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 14.0.0 - ws: 8.18.0 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 - jsonc-parser@3.2.1: {} + loupe@3.2.1: {} - local-pkg@0.5.0: + lru-cache@10.4.3: {} + + magic-string@0.30.21: dependencies: - mlly: 1.6.1 - pkg-types: 1.0.3 + '@jridgewell/sourcemap-codec': 1.5.5 - loupe@2.3.7: + magicast@0.3.5: dependencies: - get-func-name: 2.0.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + source-map-js: 1.2.1 - magic-string@0.30.7: + make-dir@4.0.0: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + semver: 7.7.3 - merge-stream@2.0.0: {} + math-intrinsics@1.1.0: {} mime-db@1.52.0: {} @@ -1107,107 +1969,126 @@ snapshots: dependencies: mime-db: 1.52.0 - mimic-fn@4.0.0: {} - - mlly@1.6.1: + minimatch@9.0.5: dependencies: - acorn: 8.11.3 - pathe: 1.1.2 - pkg-types: 1.0.3 - ufo: 1.4.0 + brace-expansion: 2.0.2 - ms@2.1.2: {} + minipass@7.1.2: {} - nanoid@3.3.7: {} + ms@2.1.3: {} - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - - nwsapi@2.2.12: {} + nanoid@3.3.11: {} - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 + node-gyp-build@4.8.4: {} - p-limit@5.0.0: + p-limit@4.0.0: dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.2.1 - parse5@7.1.2: + p-locate@6.0.0: dependencies: - entities: 4.5.0 + p-limit: 4.0.0 - path-key@3.1.1: {} + package-json-from-dist@1.0.1: {} - path-key@4.0.0: {} + path-exists@5.0.0: {} - pathe@1.1.2: {} + path-key@3.1.1: {} - pathval@1.1.1: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 - picocolors@1.0.0: {} + pathe@2.0.3: {} - pkg-types@1.0.3: - dependencies: - jsonc-parser: 3.2.1 - mlly: 1.6.1 - pathe: 1.1.2 + pathval@2.0.1: {} - postcss@8.4.38: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 + picocolors@1.1.1: {} - prettier@3.3.3: {} + picomatch@4.0.3: {} - pretty-format@29.7.0: + postcss@8.5.6: dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 - psl@1.9.0: {} + proxy-from-env@1.1.0: {} - punycode@2.3.1: {} + quansync@0.2.11: {} - querystringify@2.2.0: {} + readdirp@4.1.2: {} - react-is@18.2.0: {} + resolve-pkg-maps@1.0.0: {} - requires-port@1.0.0: {} + rolldown-plugin-dts@0.17.3(rolldown@1.0.0-beta.45)(typescript@5.9.3): + dependencies: + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + ast-kit: 2.1.3 + birpc: 2.6.1 + debug: 4.4.3 + dts-resolver: 2.1.2 + get-tsconfig: 4.13.0 + magic-string: 0.30.21 + rolldown: 1.0.0-beta.45 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - oxc-resolver + - supports-color - rollup@4.14.0: + rolldown@1.0.0-beta.45: dependencies: - '@types/estree': 1.0.5 + '@oxc-project/types': 0.95.0 + '@rolldown/pluginutils': 1.0.0-beta.45 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.14.0 - '@rollup/rollup-android-arm64': 4.14.0 - '@rollup/rollup-darwin-arm64': 4.14.0 - '@rollup/rollup-darwin-x64': 4.14.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.14.0 - '@rollup/rollup-linux-arm64-gnu': 4.14.0 - '@rollup/rollup-linux-arm64-musl': 4.14.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.14.0 - '@rollup/rollup-linux-riscv64-gnu': 4.14.0 - '@rollup/rollup-linux-s390x-gnu': 4.14.0 - '@rollup/rollup-linux-x64-gnu': 4.14.0 - '@rollup/rollup-linux-x64-musl': 4.14.0 - '@rollup/rollup-win32-arm64-msvc': 4.14.0 - '@rollup/rollup-win32-ia32-msvc': 4.14.0 - '@rollup/rollup-win32-x64-msvc': 4.14.0 + '@rolldown/binding-android-arm64': 1.0.0-beta.45 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.45 + '@rolldown/binding-darwin-x64': 1.0.0-beta.45 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.45 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.45 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.45 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.45 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.45 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.45 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.45 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.45 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.45 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.45 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.45 + + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 fsevents: 2.3.3 - rrweb-cssom@0.6.0: {} - - rrweb-cssom@0.7.1: {} - - safer-buffer@2.1.2: {} - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 + semver@7.7.3: {} shebang-command@2.0.0: dependencies: @@ -1219,140 +2100,230 @@ snapshots: signal-exit@4.1.0: {} - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} stackback@0.0.2: {} - std-env@3.7.0: {} + std-env@3.10.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 - strip-final-newline@3.0.0: {} + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 - strip-literal@2.0.0: + supports-color@7.2.0: dependencies: - js-tokens: 8.0.3 + has-flag: 4.0.0 + + syncpack-darwin-arm64@14.0.0-alpha.23: + optional: true + + syncpack-darwin-x64@14.0.0-alpha.23: + optional: true + + syncpack-linux-arm64@14.0.0-alpha.23: + optional: true + + syncpack-linux-x64@14.0.0-alpha.23: + optional: true + + syncpack-windows-arm64@14.0.0-alpha.23: + optional: true + + syncpack-windows-x64@14.0.0-alpha.23: + optional: true - symbol-tree@3.2.4: {} + syncpack@14.0.0-alpha.23: + dependencies: + tsx: 4.20.6 + optionalDependencies: + syncpack-darwin-arm64: 14.0.0-alpha.23 + syncpack-darwin-x64: 14.0.0-alpha.23 + syncpack-linux-arm64: 14.0.0-alpha.23 + syncpack-linux-x64: 14.0.0-alpha.23 + syncpack-windows-arm64: 14.0.0-alpha.23 + syncpack-windows-x64: 14.0.0-alpha.23 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 - tinybench@2.6.0: {} + tinybench@2.9.0: {} - tinypool@0.8.4: {} + tinyexec@0.3.2: {} - tinyspy@2.2.1: {} + tinyexec@1.0.1: {} - tough-cookie@4.1.4: + tinyglobby@0.2.15: dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinypool@1.1.1: {} + + tinyrainbow@2.0.0: {} - tr46@5.0.0: + tinyspy@4.0.4: {} + + tree-kill@1.2.2: {} + + tsdown@0.15.12(typescript@5.9.3): dependencies: - punycode: 2.3.1 + ansis: 4.2.0 + cac: 6.7.14 + chokidar: 4.0.3 + debug: 4.4.3 + diff: 8.0.2 + empathic: 2.0.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.45 + rolldown-plugin-dts: 0.17.3(rolldown@1.0.0-beta.45)(typescript@5.9.3) + semver: 7.7.3 + tinyexec: 1.0.1 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig: 7.3.3 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc - type-detect@4.0.8: {} + tslib@2.8.1: + optional: true - ufo@1.4.0: {} + tsx@4.20.6: + dependencies: + esbuild: 0.25.11 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 - universalify@0.2.0: {} + typescript@5.9.3: {} - url-parse@1.5.10: + unconfig@7.3.3: dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 + '@quansync/fs': 0.1.5 + defu: 6.1.4 + jiti: 2.6.1 + quansync: 0.2.11 - vite-node@1.6.0: + vite-node@3.2.4(jiti@2.6.1)(tsx@4.20.6): dependencies: cac: 6.7.14 - debug: 4.3.4 - pathe: 1.1.2 - picocolors: 1.0.0 - vite: 5.2.8 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.12(jiti@2.6.1)(tsx@4.20.6) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml - vite@5.2.8: + vite@7.1.12(jiti@2.6.1)(tsx@4.20.6): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.14.0 + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 + jiti: 2.6.1 + tsx: 4.20.6 - vitest@1.6.0(@edge-runtime/vm@3.2.0)(happy-dom@13.10.1)(jsdom@24.1.1): - dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.2 - chai: 4.4.1 - debug: 4.3.4 - execa: 8.0.1 - local-pkg: 0.5.0 - magic-string: 0.30.7 - pathe: 1.1.2 - picocolors: 1.0.0 - std-env: 3.7.0 - strip-literal: 2.0.0 - tinybench: 2.6.0 - tinypool: 0.8.4 - vite: 5.2.8 - vite-node: 1.6.0 - why-is-node-running: 2.2.2 - optionalDependencies: - '@edge-runtime/vm': 3.2.0 - happy-dom: 13.10.1 - jsdom: 24.1.1 + vitest@3.2.4(jiti@2.6.1)(tsx@4.20.6): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.1.12(jiti@2.6.1)(tsx@4.20.6)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.12(jiti@2.6.1)(tsx@4.20.6) + vite-node: 3.2.4(jiti@2.6.1)(tsx@4.20.6) + why-is-node-running: 2.3.0 transitivePeerDependencies: + - jiti - less - lightningcss + - msw - sass + - sass-embedded - stylus - sugarss - supports-color - terser - - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - - webidl-conversions@7.0.0: {} - - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - - whatwg-mimetype@3.0.0: {} - - whatwg-mimetype@4.0.0: {} - - whatwg-url@14.0.0: - dependencies: - tr46: 5.0.0 - webidl-conversions: 7.0.0 + - tsx + - yaml which@2.0.2: dependencies: isexe: 2.0.0 - why-is-node-running@2.2.2: + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 - ws@8.18.0: {} - - xml-name-validator@5.0.0: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 - xmlchars@2.2.0: {} + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 - yocto-queue@1.0.0: {} + yocto-queue@1.2.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..efc037a --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +onlyBuiltDependencies: + - esbuild diff --git a/renovate.json b/renovate.json index 37f5832..e4778fe 100644 --- a/renovate.json +++ b/renovate.json @@ -1,17 +1,23 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "configMigration": true, "extends": [ + "config:best-practices", "config:js-lib", ":automergePr", ":automergeMinor", ":automergeTypes", - "npm:unpublishSafe", + "security:minimumReleaseAgeNpm", "group:definitelyTyped", + "schedule:nonOfficeHours", ":separateMultipleMajorReleases", + "schedule:automergeNonOfficeHours", ":automergeRequireAllStatusChecks" ], - "timezone": "Asia/Ho_Chi_Minh", - "postUpdateOptions": ["pnpmDedupe"], - "packageRules": [] + "packageRules": [ + { + "groupName": "fumadocs monorepo", + "matchPackageNames": ["/^fumadocs-/"], + "matchUpdateTypes": ["digest", "patch", "minor", "major"] + } + ] } diff --git a/src/format/number.bench.ts b/src/format/number.bench.ts new file mode 100644 index 0000000..d7e072a --- /dev/null +++ b/src/format/number.bench.ts @@ -0,0 +1,394 @@ +import { bench, describe } from 'vitest' +import { formatVnCurrency, formatVnNumber, formatVnPercent } from './number.ts' + +describe('formatVnNumber - typical usage scenarios', () => { + bench('format product quantity (15)', () => { + formatVnNumber(15) + }) + + bench('format order count (1,234)', () => { + formatVnNumber(1234) + }) + + bench('format total sales (125,678)', () => { + formatVnNumber(125678) + }) + + bench('format user count (5,432,100)', () => { + formatVnNumber(5432100) + }) + + bench('format decimal value (12,345.67)', () => { + formatVnNumber(12345.67) + }) + + bench('format negative value (-5,432)', () => { + formatVnNumber(-5432) + }) +}) + +describe('formatVnCurrency - typical usage scenarios', () => { + bench('format small price (15,000 VND)', () => { + formatVnCurrency(15000) + }) + + bench('format typical product price (199,000 VND)', () => { + formatVnCurrency(199000) + }) + + bench('format invoice total (5,450,000 VND)', () => { + formatVnCurrency(5450000) + }) + + bench('format transaction amount (19,990,000 VND)', () => { + formatVnCurrency(19990000) + }) + + bench('format monthly revenue (125,000,000 VND)', () => { + formatVnCurrency(125000000) + }) + + bench('format annual budget (2,500,000,000 VND)', () => { + formatVnCurrency(2500000000) + }) + + bench('format large contract (15,000,000,000 VND)', () => { + formatVnCurrency(15000000000) + }) + + bench('format decimal amount (199,000.50 VND)', () => { + formatVnCurrency(199000.5) + }) +}) + +describe('formatVnPercent - typical usage scenarios', () => { + bench('format discount rate (15%)', () => { + formatVnPercent(0.15) + }) + + bench('format interest rate (5.5%)', () => { + formatVnPercent(0.055) + }) + + bench('format completion rate (75%)', () => { + formatVnPercent(0.75) + }) + + bench('format growth rate (25%)', () => { + formatVnPercent(0.25) + }) + + bench('format conversion rate (2.5%)', () => { + formatVnPercent(0.025) + }) + + bench('format full completion (100%)', () => { + formatVnPercent(1) + }) + + bench('format over target (125%)', () => { + formatVnPercent(1.25) + }) + + bench('format small percentage (0.5%)', () => { + formatVnPercent(0.005) + }) + + bench('format negative change (-10%)', () => { + formatVnPercent(-0.1) + }) +}) + +describe('formatVnNumber - realistic batch operations', () => { + bench('format 50 order counts', () => { + for (let i = 0; i < 50; i++) { + const count = Math.floor(Math.random() * 10000) + formatVnNumber(count) + } + }) + + bench('format 50 product quantities', () => { + for (let i = 0; i < 50; i++) { + const quantity = Math.floor(Math.random() * 1000) + formatVnNumber(quantity) + } + }) +}) + +describe('formatVnCurrency - realistic batch operations', () => { + bench('format 50 e-commerce prices (10k-50M VND)', () => { + for (let i = 0; i < 50; i++) { + const price = Math.floor(Math.random() * 49990000) + 10000 + formatVnCurrency(price) + } + }) + + bench('format 50 invoice totals (100k-100M VND)', () => { + for (let i = 0; i < 50; i++) { + const total = Math.floor(Math.random() * 99900000) + 100000 + formatVnCurrency(total) + } + }) + + bench('format 50 financial amounts (1M-10B VND)', () => { + for (let i = 0; i < 50; i++) { + const amount = Math.floor(Math.random() * 9999000000) + 1000000 + formatVnCurrency(amount) + } + }) +}) + +describe('formatVnPercent - realistic batch operations', () => { + bench('format 50 growth rates (-50% to +150%)', () => { + for (let i = 0; i < 50; i++) { + const growth = Math.random() * 2 - 0.5 + formatVnPercent(growth) + } + }) + + bench('format 50 conversion rates (0-10%)', () => { + for (let i = 0; i < 50; i++) { + const rate = Math.random() * 0.1 + formatVnPercent(rate) + } + }) + + bench('format 50 completion rates (0-100%)', () => { + for (let i = 0; i < 50; i++) { + const completion = Math.random() + formatVnPercent(completion) + } + }) +}) + +describe('real-world application scenarios', () => { + bench('display e-commerce product card', () => { + const price = 199000 + const discount = 0.15 + const finalPrice = price * (1 - discount) + const stock = 45 + const sold = 1234 + + formatVnCurrency(price) + formatVnPercent(discount) + formatVnCurrency(finalPrice) + formatVnNumber(stock) + formatVnNumber(sold) + }) + + bench('display shopping cart (5 items)', () => { + const cart = [ + { quantity: 2, price: 199000 }, + { quantity: 1, price: 450000 }, + { quantity: 5, price: 89000 }, + { quantity: 3, price: 250000 }, + { quantity: 1, price: 1200000 }, + ] + + let subtotal = 0 + cart.forEach((item) => { + const lineTotal = item.quantity * item.price + subtotal += lineTotal + + formatVnNumber(item.quantity) + formatVnCurrency(item.price) + formatVnCurrency(lineTotal) + }) + + const shippingFee = 30000 + const discount = 0.1 + const discountAmount = subtotal * discount + const total = subtotal + shippingFee - discountAmount + + formatVnCurrency(subtotal) + formatVnCurrency(shippingFee) + formatVnPercent(discount) + formatVnCurrency(discountAmount) + formatVnCurrency(total) + }) + + bench('display invoice (10 line items)', () => { + let subtotal = 0 + + for (let i = 0; i < 10; i++) { + const quantity = Math.floor(Math.random() * 20) + 1 + const unitPrice = Math.floor(Math.random() * 5000000) + 50000 + const lineTotal = quantity * unitPrice + subtotal += lineTotal + + formatVnNumber(quantity) + formatVnCurrency(unitPrice) + formatVnCurrency(lineTotal) + } + + const taxRate = 0.1 + const taxAmount = subtotal * taxRate + const total = subtotal + taxAmount + + formatVnCurrency(subtotal) + formatVnPercent(taxRate) + formatVnCurrency(taxAmount) + formatVnCurrency(total) + }) + + bench('display financial dashboard (weekly metrics)', () => { + const weeklyData = Array.from({ length: 7 }, () => ({ + revenue: Math.floor(Math.random() * 50000000) + 1000000, + orders: Math.floor(Math.random() * 500) + 10, + avgOrderValue: Math.floor(Math.random() * 2000000) + 100000, + conversionRate: Math.random() * 0.1, + })) + + weeklyData.forEach((day) => { + formatVnCurrency(day.revenue) + formatVnNumber(day.orders) + formatVnCurrency(day.avgOrderValue) + formatVnPercent(day.conversionRate) + }) + + const totalRevenue = weeklyData.reduce((sum, day) => sum + day.revenue, 0) + const totalOrders = weeklyData.reduce((sum, day) => sum + day.orders, 0) + const avgRevenue = totalRevenue / 7 + const avgOrders = totalOrders / 7 + + formatVnCurrency(totalRevenue) + formatVnNumber(totalOrders) + formatVnCurrency(avgRevenue) + formatVnNumber(avgOrders) + }) + + bench('display product catalog (20 products)', () => { + for (let i = 0; i < 20; i++) { + const price = Math.floor(Math.random() * 10000000) + 10000 + const discount = Math.random() * 0.5 + const finalPrice = price * (1 - discount) + const stock = Math.floor(Math.random() * 1000) + 1 + const sold = Math.floor(Math.random() * 5000) + const rating = 3 + Math.random() * 2 + + formatVnCurrency(price) + formatVnPercent(discount) + formatVnCurrency(finalPrice) + formatVnNumber(stock) + formatVnNumber(sold) + formatVnNumber(rating) + } + }) + + bench('display sales report (monthly performance)', () => { + const monthlyData = Array.from({ length: 12 }, () => ({ + revenue: Math.floor(Math.random() * 500000000) + 10000000, + orders: Math.floor(Math.random() * 5000) + 100, + newCustomers: Math.floor(Math.random() * 500) + 10, + returningRate: Math.random() * 0.5 + 0.3, + growthRate: Math.random() * 0.4 - 0.1, + })) + + monthlyData.forEach((month) => { + formatVnCurrency(month.revenue) + formatVnNumber(month.orders) + formatVnNumber(month.newCustomers) + formatVnPercent(month.returningRate) + formatVnPercent(month.growthRate) + }) + }) + + bench('display payment summary', () => { + const subtotal = 5450000 + const shippingFee = 30000 + const discount = 0.15 + const discountAmount = subtotal * discount + const taxRate = 0.1 + const taxableAmount = subtotal - discountAmount + const taxAmount = taxableAmount * taxRate + const total = taxableAmount + taxAmount + shippingFee + + formatVnCurrency(subtotal) + formatVnCurrency(shippingFee) + formatVnPercent(discount) + formatVnCurrency(discountAmount) + formatVnPercent(taxRate) + formatVnCurrency(taxAmount) + formatVnCurrency(total) + }) + + bench('display data table (50 rows × 6 columns)', () => { + for (let i = 0; i < 50; i++) { + const orderId = Math.floor(Math.random() * 100000) + const quantity = Math.floor(Math.random() * 100) + 1 + const unitPrice = Math.floor(Math.random() * 5000000) + 10000 + const total = quantity * unitPrice + const discount = Math.random() * 0.3 + const status = Math.random() + + formatVnNumber(orderId) + formatVnNumber(quantity) + formatVnCurrency(unitPrice) + formatVnCurrency(total) + formatVnPercent(discount) + formatVnPercent(status) + } + }) +}) + +describe('input type variations - real-world scenarios', () => { + const typicalPrice = 19990000 + + bench('formatVnCurrency with different input types', () => { + formatVnCurrency(typicalPrice) + formatVnCurrency(String(typicalPrice)) + formatVnCurrency(BigInt(typicalPrice)) + }) + + bench('formatVnNumber with different input types', () => { + const count = 1234 + formatVnNumber(count) + formatVnNumber(String(count)) + formatVnNumber(BigInt(count)) + }) + + bench('formatVnPercent with different input types', () => { + const rate = 0.15 + formatVnPercent(rate) + formatVnPercent(String(rate)) + }) + + bench('mixed input types in data processing (30 values)', () => { + for (let i = 0; i < 30; i++) { + const value = Math.floor(Math.random() * 100000000) + const inputType = i % 3 + + if (inputType === 0) { + formatVnCurrency(value) + } else if (inputType === 1) { + formatVnCurrency(String(value)) + } else { + formatVnCurrency(BigInt(value)) + } + } + }) +}) + +describe('combined operations - real-world scenarios', () => { + bench('format all three types together (typical dashboard row)', () => { + const revenue = 19990000 + const growth = 0.25 + const orders = 1234 + + formatVnCurrency(revenue) + formatVnPercent(growth) + formatVnNumber(orders) + }) + + bench('format complete product listing (30 products)', () => { + for (let i = 0; i < 30; i++) { + const price = Math.floor(Math.random() * 10000000) + 10000 + const discount = Math.random() * 0.5 + const stock = Math.floor(Math.random() * 1000) + 1 + + formatVnCurrency(price) + formatVnPercent(discount) + formatVnNumber(stock) + } + }) +}) diff --git a/src/format/number.ts b/src/format/number.ts index ca89fb1..ef37400 100644 --- a/src/format/number.ts +++ b/src/format/number.ts @@ -10,7 +10,7 @@ function formatNumber( number: string | number | bigint | null | undefined, formatter: Intl.NumberFormat, invalidValue: string, - fallbackValue: string + fallbackValue: string, ) { if ( (typeof number === 'number' && !isNaN(number)) || @@ -45,7 +45,7 @@ function formatNumber( */ export function formatVnNumber( number: string | number | bigint | null | undefined, - fallbackValue: string = '0' + fallbackValue: string = '0', ): string { const formatter = new Intl.NumberFormat('vi-VN') return formatNumber(number, formatter, 'NaN', fallbackValue) @@ -66,11 +66,11 @@ export function formatVnNumber( */ export function formatVnCurrency( money: string | number | bigint | null | undefined, - fallbackValue: string = '0 ₫' + fallbackValue: string = '0 ₫', ): string { const formatter = new Intl.NumberFormat('vi-VN', { currency: 'VND', - style: 'currency' + style: 'currency', }) return formatNumber(money, formatter, 'NaN ₫', fallbackValue) } @@ -91,12 +91,12 @@ export function formatVnCurrency( */ export function formatVnPercent( value: string | number | bigint | null | undefined, - fallbackValue: string = '0%' + fallbackValue: string = '0%', ): string { const formatter = new Intl.NumberFormat('vi-VN', { style: 'percent', maximumFractionDigits: 2, - minimumFractionDigits: 0 + minimumFractionDigits: 0, }) return formatNumber(value, formatter, 'NaN%', fallbackValue) } diff --git a/src/index.ts b/src/index.ts index c8bc32c..ee419b1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,2 @@ -export * from './read/index.ts' - export * from './format/index.ts' +export * from './read/index.ts' diff --git a/src/read/Billion.test.ts b/src/read/Billion.test.ts index 06d2a21..89fcc37 100644 --- a/src/read/Billion.test.ts +++ b/src/read/Billion.test.ts @@ -1,23 +1,23 @@ import { describe, expect, it } from 'vitest' import Billion from './Billion.ts' -describe('Billion', function () { - it('should read first number: 2.000.000.000', function () { +describe('Billion', () => { + it('should read first number: 2.000.000.000', () => { const billion = new Billion('2') expect(billion.read(true)).to.equal('hai tỷ') }) - it('should read number: 1.002.000.000.000', function () { + it('should read number: 1.002.000.000.000', () => { const billion = new Billion('002') expect(billion.read()).to.equal('không trăm lẻ hai tỷ') }) - it('should read number: 100.000.100.000', function () { + it('should read number: 100.000.100.000', () => { const billion = new Billion('100') expect(billion.read(true)).to.equal('một trăm tỷ') }) - it('should read number: 1.000.000.000.000.000', function () { + it('should read number: 1.000.000.000.000.000', () => { const billion = new Billion('000') expect(billion.read()).to.equal('tỷ') }) diff --git a/src/read/Billion.ts b/src/read/Billion.ts index 1677940..3fa866d 100644 --- a/src/read/Billion.ts +++ b/src/read/Billion.ts @@ -1,10 +1,10 @@ import Numbers from './Numbers.ts' /** - * A group three numbers, a component in a billion position of the input number + * Group three numbers, a component in a billion position of the input number */ export default class Billion extends Numbers { - public read(firstNumber?: boolean): string { + public override read(firstNumber?: boolean): string { return `${super.read(firstNumber)} tỷ`.trim() } } diff --git a/src/read/Million.test.ts b/src/read/Million.test.ts index 71a4dc8..8f9b0ab 100644 --- a/src/read/Million.test.ts +++ b/src/read/Million.test.ts @@ -1,18 +1,18 @@ import { describe, expect, it } from 'vitest' import Million from './Million.ts' -describe('Million', function () { - it('should read first number: 10.100.000', function () { +describe('Million', () => { + it('should read first number: 10.100.000', () => { const million = new Million('10') expect(million.read(true)).to.equal('mười triệu') }) - it('should read number: 1.000.100.000', function () { + it('should read number: 1.000.100.000', () => { const million = new Million('000') expect(million.read()).to.equal('') }) - it('should read number: 100.100.000', function () { + it('should read number: 100.100.000', () => { const million = new Million('100') expect(million.read()).to.equal('một trăm triệu') }) diff --git a/src/read/Number.test.ts b/src/read/Number.test.ts index 5d2c1a4..059fbfe 100644 --- a/src/read/Number.test.ts +++ b/src/read/Number.test.ts @@ -1,152 +1,152 @@ import { describe, expect, it } from 'vitest' import Numbers from './Numbers.ts' -describe('Numbers', function () { - it('should read number: 5', function () { +describe('Numbers', () => { + it('should read number: 5', () => { const s: string = '5' const number = new Numbers(s) expect(number.read()).to.equal('năm') }) - it('should read number: 32', function () { + it('should read number: 32', () => { const s: string = '32' const number = new Numbers(s) expect(number.read()).to.equal('ba mươi hai') }) - it('should read number: 15', function () { + it('should read number: 15', () => { const s: string = '15' const number = new Numbers(s) expect(number.read()).to.equal('mười lăm') }) - it('should read number: 21', function () { + it('should read number: 21', () => { const s: string = '21' const number = new Numbers(s) expect(number.read()).to.equal('hai mươi mốt') }) - it('should read number: 001', function () { + it('should read number: 001', () => { const s: string = '001' const number = new Numbers(s) expect(number.read()).to.equal('không trăm lẻ một') }) - it('should read number: 068', function () { + it('should read number: 068', () => { const s: string = '068' const number = new Numbers(s) expect(number.read()).to.equal('không trăm sáu mươi tám') }) - it('should read number: 060', function () { + it('should read number: 060', () => { const s: string = '060' const number = new Numbers(s) expect(number.read()).to.equal('không trăm sáu mươi') }) - it('should read number: 162', function () { + it('should read number: 162', () => { const s: string = '162' const number = new Numbers(s) expect(number.read()).to.equal('một trăm sáu mươi hai') }) - it('should read number: 601', function () { + it('should read number: 601', () => { const s: string = '601' const number = new Numbers(s) expect(number.read()).to.equal('sáu trăm lẻ một') }) - it('should read number: 611', function () { + it('should read number: 611', () => { const s: string = '611' const number = new Numbers(s) expect(number.read()).to.equal('sáu trăm mười một') }) - it('should read number: 221', function () { + it('should read number: 221', () => { const s: string = '221' const number = new Numbers(s) expect(number.read()).to.equal('hai trăm hai mươi mốt') }) - it('should read number: 155', function () { + it('should read number: 155', () => { const s: string = '155' const number = new Numbers(s) expect(number.read()).to.equal('một trăm năm mươi lăm') }) - it('should read number: 600', function () { + it('should read number: 600', () => { const s: string = '600' const number = new Numbers(s) expect(number.read()).to.equal('sáu trăm') }) - it('should read number: 610', function () { + it('should read number: 610', () => { const s: string = '610' const number = new Numbers(s) expect(number.read()).to.equal('sáu trăm mười') }) - it('should read first number: 1', function () { + it('should read first number: 1', () => { const s: string = '1' const number = new Numbers(s) expect(number.read(true)).to.equal('một') }) - it('should read first number: 10', function () { + it('should read first number: 10', () => { const s: string = '10' const number = new Numbers(s) expect(number.read(true)).to.equal('mười') }) - it('should read first number: 21', function () { + it('should read first number: 21', () => { const s: string = '21' const number = new Numbers(s) expect(number.read(true)).to.equal('hai mươi mốt') }) - it('should read first number: 221', function () { + it('should read first number: 221', () => { const s: string = '221' const number = new Numbers(s) expect(number.read(true)).to.equal('hai trăm hai mươi mốt') }) - it('should read number: 000', function () { + it('should read number: 000', () => { const s: string = '000' const number = new Numbers(s) expect(number.read()).to.equal('') }) - it('should read number: 000', function () { + it('should read number: 000', () => { const s: string = '000' const number = new Numbers(s) expect(number.read(true)).to.equal('không') }) - it('should read number: 601', function () { + it('should read number: 601', () => { const s: string = '601' const number = new Numbers(s) expect(number.read(true)).to.equal('sáu trăm lẻ một') }) - it('should read first number: 1, before billion group', function () { + it('should read first number: 1, before billion group', () => { const s: string = '1' const number = new Numbers(s) expect(number.read(true, true)).to.equal('một nghìn') }) - it('should read first number: 1, before billion group', function () { + it('should read first number: 1, before billion group', () => { const s: string = '1' const number = new Numbers(s) expect(number.read(true, false)).to.equal('một') }) - it('should read first number: 1, before billion group', function () { + it('should read first number: 1, before billion group', () => { const s: string = '001' const number = new Numbers(s) expect(number.read(false, true)).to.equal('không trăm lẻ một') }) - it('should read number: 000, before billion group', function () { + it('should read number: 000, before billion group', () => { const s: string = '000' const number = new Numbers(s) expect(number.read(false, true)).to.equal('') diff --git a/src/read/NumberReader.test.ts b/src/read/NumberReader.test.ts index 7ff0302..958dc39 100644 --- a/src/read/NumberReader.test.ts +++ b/src/read/NumberReader.test.ts @@ -1,135 +1,135 @@ import { describe, expect, it } from 'vitest' import NumberReader from './NumberReader.ts' -describe('NumberReader', function () { - it('should throw error when read number: a.000', function () { +describe('NumberReader', () => { + it('should throw error when read number: a.000', () => { const number: string = 'a000' expect(() => NumberReader.read(number)).to.throw(`Invalid number: "a"`) }) - it('should read number: 1.000', function () { + it('should read number: 1.000', () => { const number: number = 1000 expect(NumberReader.read(number)).to.equal('một nghìn') }) - it('should read number: 60.000', function () { + it('should read number: 60.000', () => { const number: number = 60000 expect(NumberReader.read(number)).to.equal('sáu mươi nghìn') }) - it('should read number: 60', function () { + it('should read number: 60', () => { const number: number = 60 expect(NumberReader.read(number)).to.equal('sáu mươi') }) - it('should read number: 600.000', function () { + it('should read number: 600.000', () => { const number: number = 600000 expect(NumberReader.read(number)).to.equal('sáu trăm nghìn') }) - it('should read number: 600.001', function () { + it('should read number: 600.001', () => { const number: number = 600001 expect(NumberReader.read(number)).to.equal( - 'sáu trăm nghìn không trăm lẻ một' + 'sáu trăm nghìn không trăm lẻ một', ) }) - it('should read number: 1.060.000', function () { + it('should read number: 1.060.000', () => { const number: number = 1060000 expect(NumberReader.read(number)).to.equal( - 'một triệu không trăm sáu mươi nghìn' + 'một triệu không trăm sáu mươi nghìn', ) }) - it('should read number: 15.000.000', function () { + it('should read number: 15.000.000', () => { const number: number = 15000000 expect(NumberReader.read(number)).to.equal('mười lăm triệu') }) - it('should read number: 19.900.000', function () { + it('should read number: 19.900.000', () => { const number: number = 19900000 expect(NumberReader.read(number)).to.equal( - 'mười chín triệu chín trăm nghìn' + 'mười chín triệu chín trăm nghìn', ) }) - it('should read number: 30.000.000', function () { + it('should read number: 30.000.000', () => { const number: number = 30000000 expect(NumberReader.read(number)).to.equal('ba mươi triệu') }) - it('should read number: 60.000.000', function () { + it('should read number: 60.000.000', () => { const number: number = 60000000 expect(NumberReader.read(number)).to.equal('sáu mươi triệu') }) - it('should read number: 100.000.000', function () { + it('should read number: 100.000.000', () => { const number: number = 100000000 expect(NumberReader.read(number)).to.equal('một trăm triệu') }) - it('should read number: 500.000.000', function () { + it('should read number: 500.000.000', () => { const number: number = 500000000 expect(NumberReader.read(number)).to.equal('năm trăm triệu') }) - it('should read number: 1.000.000.000', function () { + it('should read number: 1.000.000.000', () => { const number: number = 1000000000 expect(NumberReader.read(number)).to.equal('một tỷ') }) - it('should read number: 1.100.000.000', function () { + it('should read number: 1.100.000.000', () => { const number: number = 1100000000 expect(NumberReader.read(number)).to.equal('một tỷ một trăm triệu') }) - it('should read number: 2.000.000.000', function () { + it('should read number: 2.000.000.000', () => { const number: number = 2000000000 expect(NumberReader.read(number)).to.equal('hai tỷ') }) - it('should read number: 1.000.000.000.000', function () { + it('should read number: 1.000.000.000.000', () => { const number: string = '1000000000000' expect(NumberReader.read(number)).to.equal('một nghìn tỷ') }) - it('should read number: 1.001.000.000.000', function () { + it('should read number: 1.001.000.000.000', () => { const number: string = '1001000000000' expect(NumberReader.read(number)).to.equal('một nghìn không trăm lẻ một tỷ') }) - it('should read number: 1.001.500.000.000', function () { + it('should read number: 1.001.500.000.000', () => { const number: string = '1001500000000' expect(NumberReader.read(number)).to.equal( - 'một nghìn không trăm lẻ một tỷ năm trăm triệu' + 'một nghìn không trăm lẻ một tỷ năm trăm triệu', ) }) - it('should read number: 1.001.500.100.000', function () { + it('should read number: 1.001.500.100.000', () => { const number: string = '1001500100000' expect(NumberReader.read(number)).to.equal( - 'một nghìn không trăm lẻ một tỷ năm trăm triệu một trăm nghìn' + 'một nghìn không trăm lẻ một tỷ năm trăm triệu một trăm nghìn', ) }) - it('should read number: 1.001.500.100.001', function () { + it('should read number: 1.001.500.100.001', () => { const number: string = '1001500100001' expect(NumberReader.read(number)).to.equal( - 'một nghìn không trăm lẻ một tỷ năm trăm triệu một trăm nghìn không trăm lẻ một' + 'một nghìn không trăm lẻ một tỷ năm trăm triệu một trăm nghìn không trăm lẻ một', ) }) - it('should read number: 1.000.001.000.000.000', function () { + it('should read number: 1.000.001.000.000.000', () => { const number: string = '1000001000000000' expect(NumberReader.read(number)).to.equal('một triệu không trăm lẻ một tỷ') }) - it('should read number: 1.000.000.000.000.000.000', function () { + it('should read number: 1.000.000.000.000.000.000', () => { const number: string = '1000000000000000000' expect(NumberReader.read(number)).to.equal('một tỷ tỷ') }) - it('should read bigint number: 1.000.000.000.000.000.000', function () { + it('should read bigint number: 1.000.000.000.000.000.000', () => { const number = BigInt('1000000000000000000') expect(NumberReader.read(number)).to.equal('một tỷ tỷ') }) diff --git a/src/read/NumberReader.ts b/src/read/NumberReader.ts index eb68925..ab6c133 100644 --- a/src/read/NumberReader.ts +++ b/src/read/NumberReader.ts @@ -1,7 +1,7 @@ +import Billion from './Billion.ts' +import Million from './Million.ts' import Numbers from './Numbers.ts' import Thousand from './Thousand.ts' -import Million from './Million.ts' -import Billion from './Billion.ts' import { InvalidNumberTypeError } from './Utils.ts' /** @@ -23,7 +23,7 @@ enum NumberType { /** * Number in the billion group (xxx.000.000.000) */ - Billion + Billion, } /** @@ -34,7 +34,7 @@ export default class NumberReader { [NumberType.Numbers]: Numbers, [NumberType.Thousand]: Thousand, [NumberType.Million]: Million, - [NumberType.Billion]: Billion + [NumberType.Billion]: Billion, } /** @@ -46,9 +46,9 @@ export default class NumberReader { public static read(number: string | number | bigint): string { const s = number.toString() - const numberGroups = this.getGroupNumbers(s) - const numbers = this.mapToNumbers(numberGroups) - return this.readNumbers(numbers) + const numberGroups = NumberReader.getGroupNumbers(s) + const numbers = NumberReader.mapToNumbers(numberGroups) + return NumberReader.readNumbers(numbers) } /** @@ -77,7 +77,7 @@ export default class NumberReader { const numbers: Numbers[] = [] for (let i = numberGroups.length - 1, currentType = 0; i >= 0; i--) { - numbers.unshift(this.getNumber(numberGroups[i], currentType++)) + numbers.unshift(NumberReader.getNumber(numberGroups[i], currentType++)) currentType = currentType === 4 ? 1 : currentType } @@ -100,7 +100,7 @@ export default class NumberReader { * @param type Type number of the {@link Numbers} object */ private static getNumber(s: string, type: NumberType): Numbers { - const NumberClass = this.NumberClasses[type] + const NumberClass = NumberReader.NumberClasses[type] if (NumberClass) { return new NumberClass(s) diff --git a/src/read/Numbers.ts b/src/read/Numbers.ts index d3e0369..cfb424a 100644 --- a/src/read/Numbers.ts +++ b/src/read/Numbers.ts @@ -32,7 +32,7 @@ export default class Numbers { private static suffixFirstAndBeforeBillion( s: string, firstNumber?: boolean, - beforeBillion?: boolean + beforeBillion?: boolean, ): string { if (firstNumber && beforeBillion) { s += ' nghìn' diff --git a/src/read/Thousand.test.ts b/src/read/Thousand.test.ts index eca437c..896a5e4 100644 --- a/src/read/Thousand.test.ts +++ b/src/read/Thousand.test.ts @@ -1,13 +1,13 @@ import { describe, expect, it } from 'vitest' import Thousand from './Thousand.ts' -describe('Thousand', function () { - it('should read number: 060.000', function () { +describe('Thousand', () => { + it('should read number: 060.000', () => { const thousand = new Thousand('060') expect(thousand.read()).to.equal('không trăm sáu mươi nghìn') }) - it('should read number: 000.100', function () { + it('should read number: 000.100', () => { const thousand = new Thousand('000') expect(thousand.read()).to.equal('') }) diff --git a/src/read/Utils.ts b/src/read/Utils.ts index 55a6d3d..97945ad 100644 --- a/src/read/Utils.ts +++ b/src/read/Utils.ts @@ -11,7 +11,7 @@ const NumberMap: { [key: string]: string } = { '6': 'sáu', '7': 'bảy', '8': 'tám', - '9': 'chín' + '9': 'chín', } /** @@ -40,7 +40,7 @@ export class InvalidNumberTypeError extends Error { * @return string the number in string */ export function getNumberFromMap(number: string[1]): string { - if (Object.prototype.hasOwnProperty.call(NumberMap, number)) { + if (Object.hasOwn(NumberMap, number)) { return NumberMap[number] } else { throw new NotNumberError(number) diff --git a/src/read/Zerofill.ts b/src/read/Zerofill.ts index 7c5758c..d7eb333 100644 --- a/src/read/Zerofill.ts +++ b/src/read/Zerofill.ts @@ -1,7 +1,7 @@ import Numbers from './Numbers.ts' /** - * A group three numbers, this component will deal with three zero numbers + * Group three numbers, this component will deal with three zero numbers */ export default abstract class Zerofill extends Numbers { /** @@ -9,7 +9,7 @@ export default abstract class Zerofill extends Numbers { */ protected abstract get unitName(): string - public read(firstNumber?: boolean): string { + public override read(firstNumber?: boolean): string { if (this.first !== '0' || this.second !== '0' || this.last !== '0') { return `${super.read(firstNumber)} ${this.unitName}` } else { diff --git a/src/read/index.bench.ts b/src/read/index.bench.ts new file mode 100644 index 0000000..f846e9b --- /dev/null +++ b/src/read/index.bench.ts @@ -0,0 +1,166 @@ +import { bench, describe } from 'vitest' +import { readVnNumber } from './index.ts' + +describe('readVnNumber - typical usage scenarios', () => { + bench('product quantity (5 items)', () => { + readVnNumber(5) + }) + + bench('typical product price (199,000 VND)', () => { + readVnNumber(199000) + }) + + bench('invoice total (5,450,000 VND)', () => { + readVnNumber(5450000) + }) + + bench('transaction amount (19,990,000 VND)', () => { + readVnNumber(19990000) + }) + + bench('annual revenue (2,500,000,000 VND)', () => { + readVnNumber(2500000000) + }) + + bench('large contract value (15,000,000,000 VND)', () => { + readVnNumber(15000000000) + }) +}) + +describe('readVnNumber - realistic batch operations', () => { + bench('read 50 product quantities (1-100)', () => { + for (let i = 0; i < 50; i++) { + const quantity = Math.floor(Math.random() * 100) + 1 + readVnNumber(quantity) + } + }) + + bench('read 50 e-commerce prices (10k-50M VND)', () => { + for (let i = 0; i < 50; i++) { + const price = Math.floor(Math.random() * 49990000) + 10000 + readVnNumber(price) + } + }) + + bench('read 50 invoice totals (100k-100M VND)', () => { + for (let i = 0; i < 50; i++) { + const total = Math.floor(Math.random() * 99900000) + 100000 + readVnNumber(total) + } + }) + + bench('read 50 financial amounts (1M-10B VND)', () => { + for (let i = 0; i < 50; i++) { + const amount = Math.floor(Math.random() * 9999000000) + 1000000 + readVnNumber(amount) + } + }) +}) + +describe('readVnNumber - real-world application scenarios', () => { + bench('display shopping cart (5 items with quantities)', () => { + const cart = [ + { quantity: 2, price: 199000 }, + { quantity: 1, price: 450000 }, + { quantity: 5, price: 89000 }, + { quantity: 3, price: 250000 }, + { quantity: 1, price: 1200000 }, + ] + + cart.forEach((item) => { + readVnNumber(item.quantity) + readVnNumber(item.price) + readVnNumber(item.quantity * item.price) + }) + }) + + bench('display invoice line items (10 items)', () => { + for (let i = 0; i < 10; i++) { + const quantity = Math.floor(Math.random() * 20) + 1 + const unitPrice = Math.floor(Math.random() * 5000000) + 50000 + const lineTotal = quantity * unitPrice + + readVnNumber(quantity) + readVnNumber(unitPrice) + readVnNumber(lineTotal) + } + }) + + bench('display financial dashboard (20 metrics)', () => { + const metrics = { + dailyRevenue: Array.from( + { length: 7 }, + () => Math.floor(Math.random() * 50000000) + 1000000, + ), + orderCounts: Array.from( + { length: 7 }, + () => Math.floor(Math.random() * 500) + 10, + ), + avgOrderValue: Array.from( + { length: 7 }, + () => Math.floor(Math.random() * 2000000) + 100000, + ), + } + + metrics.dailyRevenue.forEach((revenue) => { + readVnNumber(revenue) + }) + metrics.orderCounts.forEach((count) => { + readVnNumber(count) + }) + metrics.avgOrderValue.forEach((avg) => { + readVnNumber(avg) + }) + }) + + bench('display product catalog (20 products)', () => { + for (let i = 0; i < 20; i++) { + const price = Math.floor(Math.random() * 10000000) + 10000 + const stock = Math.floor(Math.random() * 1000) + 1 + const sold = Math.floor(Math.random() * 5000) + + readVnNumber(price) + readVnNumber(stock) + readVnNumber(sold) + } + }) + + bench('display payment receipt (typical transaction)', () => { + const subtotal = 5450000 + const shippingFee = 30000 + const discount = 500000 + const total = subtotal + shippingFee - discount + + readVnNumber(subtotal) + readVnNumber(shippingFee) + readVnNumber(discount) + readVnNumber(total) + }) +}) + +describe('readVnNumber - input type variations', () => { + const typicalPrice = 19990000 + + bench('number input (typical price)', () => { + readVnNumber(typicalPrice) + }) + + bench('string input (from API/form)', () => { + readVnNumber(String(typicalPrice)) + }) + + bench('bigint input (large transaction)', () => { + readVnNumber(BigInt(typicalPrice)) + }) + + bench('mixed input types in data processing (30 values)', () => { + for (let i = 0; i < 30; i++) { + const value = Math.floor(Math.random() * 100000000) + const inputType = i % 3 + + if (inputType === 0) readVnNumber(value) + else if (inputType === 1) readVnNumber(String(value)) + else readVnNumber(BigInt(value)) + } + }) +}) diff --git a/src/read/index.test.ts b/src/read/index.test.ts index 2a643c7..2cf6227 100644 --- a/src/read/index.test.ts +++ b/src/read/index.test.ts @@ -1,16 +1,16 @@ import { describe, expect, it } from 'vitest' import { readVnNumber } from './index.ts' -describe('index', function () { - it('should read number 2.000.000.000 in string', function () { +describe('index', () => { + it('should read number 2.000.000.000 in string', () => { expect(readVnNumber('2000000000')).to.equal('hai tỷ') }) - it('should read number 2.000.000.000 in number', function () { + it('should read number 2.000.000.000 in number', () => { expect(readVnNumber(2000000000)).to.equal('hai tỷ') }) - it('should read number 2.500.000.000 in BigIn', function () { + it('should read number 2.500.000.000 in BigIn', () => { expect(readVnNumber(BigInt(2500000000))).to.equal('hai tỷ năm trăm triệu') }) }) diff --git a/tsconfig.json b/tsconfig.json index 05a3f5f..8217fe5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,27 @@ { "compilerOptions": { + // Environment setup & latest features + "lib": ["ESNext"], "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Bundler", + "module": "Preserve", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + "allowImportingTsExtensions": true, + + // Bundler mode + "moduleResolution": "bundler", + "noEmit": true, + + // Best practices "strict": true, "skipLibCheck": true, - "esModuleInterop": true, - "allowImportingTsExtensions": true, - "forceConsistentCasingInFileNames": true, - "paths": { - "~/*": ["./src/*"] - } + "noFallthroughCasesInSwitch": true, + "noImplicitOverride": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false } } diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 0000000..18af111 --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + platform: 'neutral', + entry: ['src/index.ts'], + outDir: 'dist', + format: 'esm', + dts: true, + exports: true, +}) diff --git a/vitest.config.mts b/vitest.config.mts new file mode 100644 index 0000000..f2f0e1e --- /dev/null +++ b/vitest.config.mts @@ -0,0 +1,6 @@ +import codspeed from '@codspeed/vitest-plugin' +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + plugins: [codspeed()], +})