pax_global_header00006660000000000000000000000064152532747040014523gustar00rootroot0000000000000052 comment=0b05f3f7215bed05bbca6a6a3cb1dbb6c27e7f36 sxzz-verkit-a5b7150/000077500000000000000000000000001525327470400143715ustar00rootroot00000000000000sxzz-verkit-a5b7150/.editorconfig000066400000000000000000000001161525327470400170440ustar00rootroot00000000000000root = true [*] indent_size = 2 end_of_line = lf insert_final_newline = true sxzz-verkit-a5b7150/.gitattributes000066400000000000000000000000231525327470400172570ustar00rootroot00000000000000* text=auto eol=lf sxzz-verkit-a5b7150/.github/000077500000000000000000000000001525327470400157315ustar00rootroot00000000000000sxzz-verkit-a5b7150/.github/FUNDING.yml000066400000000000000000000000151525327470400175420ustar00rootroot00000000000000github: sxzz sxzz-verkit-a5b7150/.github/renovate.json5000066400000000000000000000001031525327470400205260ustar00rootroot00000000000000{ extends: ['github>sxzz/renovate-config'], automerge: true, } sxzz-verkit-a5b7150/.github/workflows/000077500000000000000000000000001525327470400177665ustar00rootroot00000000000000sxzz-verkit-a5b7150/.github/workflows/release-commit.yml000066400000000000000000000002661525327470400234230ustar00rootroot00000000000000name: Publish Any Commit on: [push, pull_request] permissions: {} jobs: release: uses: sxzz/workflows/.github/workflows/release-commit.yml@main with: compact: true sxzz-verkit-a5b7150/.github/workflows/release.yml000066400000000000000000000003551525327470400221340ustar00rootroot00000000000000name: Release on: push: tags: - 'v*' jobs: release: uses: sxzz/workflows/.github/workflows/release.yml@main with: publish: true stage: true permissions: contents: write id-token: write sxzz-verkit-a5b7150/.github/workflows/unit-test.yml000066400000000000000000000005001525327470400224400ustar00rootroot00000000000000name: Unit Test on: push: branches: [main] pull_request: branches: [main] permissions: {} jobs: unit-test: uses: sxzz/workflows/.github/workflows/unit-test.yml@main coverage: uses: sxzz/workflows/.github/workflows/coverage.yml@main needs: unit-test permissions: id-token: write sxzz-verkit-a5b7150/.gitignore000066400000000000000000000000711525327470400163570ustar00rootroot00000000000000node_modules dist coverage *.log .DS_Store .eslintcache sxzz-verkit-a5b7150/.vscode/000077500000000000000000000000001525327470400157325ustar00rootroot00000000000000sxzz-verkit-a5b7150/.vscode/settings.json000066400000000000000000000000421525327470400204610ustar00rootroot00000000000000{ "editor.formatOnSave": true } sxzz-verkit-a5b7150/LICENSE000066400000000000000000000021261525327470400153770ustar00rootroot00000000000000The MIT License (MIT) Copyright © 2026-PRESENT Kevin Deng (https://github.com/sxzz) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. sxzz-verkit-a5b7150/README.md000066400000000000000000000223641525327470400156570ustar00rootroot00000000000000# verkit [![Open on npmx][npmx-version-src]][npmx-href] [![npm downloads][npmx-downloads-src]][npmx-href] [![Unit Test][unit-test-src]][unit-test-href] [![Codecov][codecov-src]][codecov-href] Fast, zero-dependency SemVer for ESM and TypeScript, with functional, tree-shakeable APIs. ## Features - ✅ Complete SemVer version and range toolkit. - 🚀 Faster than [node-semver] across tested operations. - 📦 Pure ESM with zero runtime dependencies. - 💙 First-class TypeScript declarations. - 🌳 Functional, tree-shakeable named exports. - 🔁 Mutable `SemVer` and `SemVerRange` records. - ⚡ 26.0% smaller for full CDN imports. - 🪶 61.4% smaller with common bundled imports. - 🛡️ Immutable collection operations. ## Install ```bash npm add verkit ``` ## Versions ```ts import { coerce, increment, normalize, normalizeFull, parse, truncate, } from 'verkit' const version = parse('1.2.3-rc.1+sha.abc') const coerced = coerce('release 42.6.7.9', { rtl: true }) version.patch = 4 normalizeFull(version) // '1.2.4-rc.1+sha.abc' normalize(version) // '1.2.4-rc.1' increment(version, 'minor') // '1.3.0' truncate(version, 'patch') // '1.2.4' coerced?.major // 6 ``` Version APIs accept strings or mutable `SemVer` objects returned by `parse` or `coerce`. `normalizeFull` keeps build metadata; normalized, incremented, and truncated versions omit it. ## Comparison ```ts import { compare, compareBuild, isGreaterThan, sortReversed } from 'verkit' compare('1.0.0+one', '1.0.0+two') // 0 compareBuild('1.0.0+one', '1.0.0+two') // -1 isGreaterThan('2.0.0', '1.0.0') // true sortReversed(['1.0.0', '2.0.0']) // ['2.0.0', '1.0.0'] ``` `compare` ignores build metadata; `compareBuild` uses it as a tie-breaker. ## Ranges ```ts import { findMaxSatisfying, normalizeRange, parseRange, satisfies, } from 'verkit' const range = parseRange('^1.2.3') normalizeRange(range) // '>=1.2.3 <2.0.0-0' satisfies('1.5.0', range) // true findMaxSatisfying(['1.2.3', '1.5.0', '2.0.0'], range) // '1.5.0' ``` Range APIs accept strings or mutable `SemVerRange` objects. They support comparators, unions, hyphens, wildcards, tilde, caret, loose parsing, and prereleases. Range options are fixed when a `SemVerRange` is created. APIs that receive a parsed range use its stored options and do not accept another options argument: ```ts const prereleases = parseRange('1.x', { includePrerelease: true }) satisfies('1.0.0-rc.1', prereleases) // true ``` To use different options, pass the original range string again or create another parsed range. ## API See the [API reference](https://npmx.dev/package-docs/verkit). ## Invalid input behavior `parse`, `parseComparator`, and `parseRange` throw detailed `TypeError`s. Their `tryParse*` wrappers return `null`; other safe transforms and predicates keep their documented `null`/`false` behavior. ## Migrating from node-semver Only renamed or reshaped [node-semver] APIs are listed; same-named functions such as `clean`, `coerce`, `compare`, and `satisfies` are omitted. | node-semver | verkit | | ---------------------------------------------- | --------------------------------------------------------------------------------------------------- | | `SemVer` | `parse` | | `parse` | `tryParse` | | `valid` | `normalize` | | `inc`, `diff` | `increment`, `difference` | | `major`, `minor`, `patch`, `prerelease` | `getMajor`, `getMinor`, `getPatch`, `getPrerelease` | | `rcompare`, `compareLoose`, `cmp` | `compareReversed`, `compare` with `{ loose: true }`, `compareWithOperator` | | `eq`, `neq`, `gt`, `gte`, `lt`, `lte` | `isEqual`, `isNotEqual`, `isGreaterThan`, `isGreaterThanOrEqual`, `isLessThan`, `isLessThanOrEqual` | | `rsort` | `sortReversed` | | `rcompareIdentifiers` | `compareIdentifiersReversed` | | `Comparator` | `SemVerComparator`, `parseComparator`, `tryParseComparator` | | Comparator formatting, test, and intersection | `normalizeComparator`, `satisfiesComparator`, `comparatorsIntersect` | | `Range` | `parseRange` | | `toComparators`, `validRange` | `rangeToComparators`, `normalizeRange` | | `maxSatisfying`, `minSatisfying`, `minVersion` | `findMaxSatisfying`, `findMinSatisfying`, `findMinimumForRange` | | `outside`, `gtr`, `ltr` | `isOutsideRange`, `isGreaterThanRange`, `isLessThanRange` | | `intersects`, `subset` | `rangesIntersect`, `isRangeSubset` | | `RELEASE_TYPES` | `INCREMENT_TYPES` (also includes `release`) | `valid` returns a normalized `string | null` in node-semver, so its equivalent is `normalize`. Use `isValid` when you only need a boolean. Use options objects such as `{ loose: true }` and `{ identifier, identifierBase }`. Range options belong to the string-parsing step; parsed `SemVerRange` objects already contain them. ## Differences from node-semver verkit follows [node-semver] semantics with four user-visible differences: - Array helpers never mutate their inputs. - Parsed `SemVerRange` objects retain their parse-time options. node-semver helpers may reparse a `Range` from `raw` using call-site options. - verkit is ESM-only, with no CommonJS, CLI, or `NODE_DEBUG=semver` output. - Error text, stack traces, and supported runtimes may differ. ## Bundle size Full package imports, minified with Rolldown: | Package | Minified | gzip | Brotli | | --------------------- | -------: | ------: | ------: | | verkit | 18,820 B | 5,914 B | 5,375 B | | [semver][node-semver] | 24,424 B | 7,427 B | 6,765 B | | verkit reduction | 26.0% | 20.4% | 20.5% | Common validation, range, comparison, increment, and coercion imports, tree-shaken and minified with Rolldown: | Package | Minified | gzip | Brotli | | --------------------- | -------: | ------: | ------: | | verkit | 9,872 B | 3,401 B | 3,121 B | | [semver][node-semver] | 25,577 B | 7,500 B | 6,835 B | | verkit reduction | 61.4% | 54.7% | 54.3% | Run `pnpm test:size` to reproduce the comparison. ## Benchmarks Measured on a MacBook Pro with an Apple M1 Max and 32 GB RAM. Higher is better. | Operation | verkit ops/s | semver ops/s | Faster | | ------------------------- | -----------: | -----------: | ------------ | | Parse and normalize | 3.67M | 3.26M | verkit 1.13× | | Compare | 3.09M | 2.36M | verkit 1.31× | | Compare parsed versions | 40.59M | 28.62M | verkit 1.42× | | Increment | 3.38M | 2.03M | verkit 1.66× | | Coerce | 2.77M | 2.32M | verkit 1.19× | | Satisfy uncached ranges | 148.5K | 122.3K | verkit 1.21× | | Satisfy pre-parsed inputs | 22.91M | 7.20M | verkit 3.18× | Range benchmarks either cycle through 1,001 inputs to avoid cache hits or parse once and reuse the resulting objects. Run runtime benchmarks with `pnpm bench`. ## Sponsors

Sponsors

## License [MIT](./LICENSE) © 2026-PRESENT [Kevin Deng](https://github.com/sxzz). Parts of the implementation and test fixtures are derived from [node-semver] under the ISC license; see [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md). [npmx-version-src]: https://npmx.dev/api/registry/badge/version/verkit [npmx-downloads-src]: https://npmx.dev/api/registry/badge/downloads-month/verkit [npmx-href]: https://npmx.dev/verkit [node-semver]: https://github.com/npm/node-semver [unit-test-src]: https://github.com/sxzz/verkit/actions/workflows/unit-test.yml/badge.svg [unit-test-href]: https://github.com/sxzz/verkit/actions/workflows/unit-test.yml [codecov-src]: https://codecov.io/gh/sxzz/verkit/graph/badge.svg?token=hBBtxizmt9 [codecov-href]: https://codecov.io/gh/sxzz/verkit sxzz-verkit-a5b7150/THIRD_PARTY_NOTICES.md000066400000000000000000000017001525327470400177260ustar00rootroot00000000000000# Third-Party Notices verkit includes a TypeScript reimplementation derived from node-semver. The node-semver project is distributed under the following ISC license: > The ISC License > > Copyright (c) Isaac Z. Schlueter and Contributors > > Permission to use, copy, modify, and/or distribute this software for any > purpose with or without fee is hereby granted, provided that the above > copyright notice and this permission notice appear in all copies. > > THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR > IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. sxzz-verkit-a5b7150/benchmarks/000077500000000000000000000000001525327470400165065ustar00rootroot00000000000000sxzz-verkit-a5b7150/benchmarks/semver.bench.ts000066400000000000000000000062121525327470400214360ustar00rootroot00000000000000import { Range as NodeSemVerRange, coerce as semverCoerce, compare as semverCompare, inc as semverIncrement, parse as semverParse, satisfies as semverSatisfies, valid as semverValid, } from 'semver' import { test } from 'vitest' import { coerce, compare, increment, normalize, parse, parseRange, satisfies, } from '../src/index.ts' const version = '12.34.56-beta.7+sha.abcdef' const stableVersion = '12.34.56' const coercionInput = 'release/12.34.56-beta.7+sha.abcdef' const complexRange = '>=10.2.0 <11 || ^12.30.0 || 14.0.0 - 16.x' // node-semver caches up to 1000 parsed range fragments. Cycling through more // inputs ensures its cache cannot hide the cost of parsing string ranges. const uncachedRanges = Array.from( { length: 1_001 }, (_, patch) => `>=10.2.${patch} <11 || ^12.30.${patch} || 14.0.${patch} - 16.x`, ) const parsedVersion = parse(version) const parsedStableVersion = parse(stableVersion) const parsedComplexRange = parseRange(complexRange) const semverParsedVersion = semverParse(version)! const semverParsedStableVersion = semverParse(stableVersion)! const semverParsedComplexRange = new NodeSemVerRange(complexRange) let verkitRangeIndex = 0 let semverRangeIndex = 0 test('parse and normalize', async ({ bench }) => { await bench.compare( bench('verkit', () => { normalize(version) }), bench('semver', () => { semverValid(version) }), ) }) test('compare', async ({ bench }) => { await bench.compare( bench('verkit', () => { compare(version, stableVersion) }), bench('semver', () => { semverCompare(version, stableVersion) }), ) }) test('compare parsed versions', async ({ bench }) => { await bench.compare( bench('verkit', () => { compare(parsedVersion, parsedStableVersion) }), bench('semver', () => { semverCompare(semverParsedVersion, semverParsedStableVersion) }), ) }) test('increment', async ({ bench }) => { await bench.compare( bench('verkit', () => { increment(version, 'prerelease') }), bench('semver', () => { semverIncrement(version, 'prerelease') }), ) }) test('coerce', async ({ bench }) => { await bench.compare( bench('verkit', () => { coerce(coercionInput, { includePrerelease: true }) }), bench('semver', () => { semverCoerce(coercionInput, { includePrerelease: true }) }), ) }) test('satisfies uncached ranges', async ({ bench }) => { await bench.compare( bench('verkit', () => { const range = uncachedRanges[verkitRangeIndex]! verkitRangeIndex = (verkitRangeIndex + 1) % uncachedRanges.length satisfies(stableVersion, range) }), bench('semver', () => { const range = uncachedRanges[semverRangeIndex]! semverRangeIndex = (semverRangeIndex + 1) % uncachedRanges.length semverSatisfies(stableVersion, range) }), ) }) test('satisfies pre-parsed inputs', async ({ bench }) => { await bench.compare( bench('verkit', () => { satisfies(parsedStableVersion, parsedComplexRange) }), bench('semver', () => { semverSatisfies(semverParsedStableVersion, semverParsedComplexRange) }), ) }) sxzz-verkit-a5b7150/eslint.config.js000066400000000000000000000002021525327470400174630ustar00rootroot00000000000000import { sxzz } from '@sxzz/eslint-config' export default sxzz().append({ rules: { 'unicorn/no-array-sort': 'off', }, }) sxzz-verkit-a5b7150/package.json000066400000000000000000000040721525327470400166620ustar00rootroot00000000000000{ "name": "verkit", "type": "module", "version": "0.5.0", "description": "Fast, zero-dependency SemVer for ESM and TypeScript, with functional, tree-shakeable APIs.", "author": "Kevin Deng ", "license": "MIT", "funding": "https://github.com/sponsors/sxzz", "homepage": "https://github.com/sxzz/verkit#readme", "repository": { "type": "git", "url": "git+https://github.com/sxzz/verkit.git" }, "bugs": { "url": "https://github.com/sxzz/verkit/issues" }, "keywords": [ "semver", "semantic-versioning", "version", "range", "esm", "typescript", "functional", "immutable" ], "sideEffects": false, "exports": { ".": "./dist/index.js", "./comparator": "./dist/comparator.js", "./range": "./dist/range.js", "./version": "./dist/version.js", "./package.json": "./package.json" }, "files": [ "dist" ], "publishConfig": { "access": "public" }, "engines": { "node": ">=18.12.0" }, "devEngines": { "packageManager": { "name": "pnpm", "version": "12.4.2", "onFail": "download" } }, "scripts": { "lint": "eslint --cache .", "lint:fix": "pnpm run lint --fix", "build": "tsdown", "bench": "vitest bench --run --experimental.viteModuleRunner=false", "dev": "tsdown --watch", "test": "vitest", "test:size": "vitest run tests/bundle-size.test.ts", "typecheck": "tsc --noEmit", "format": "prettier --cache --write .", "release": "bumpp", "prepublishOnly": "pnpm run build" }, "devDependencies": { "@sxzz/eslint-config": "^8.6.0", "@sxzz/prettier-config": "^2.3.3", "@types/node": "^26.6.1", "@types/semver": "^7.8.0", "@typescript/native-preview": "npm:typescript@7.0.2", "@vitest/coverage-v8": "^5.0.1", "bumpp": "^12.3.0", "eslint": "^10.10.0", "prettier": "^3.9.8", "rolldown": "^1.2.9", "semver": "^7.8.5", "tsdown": "^0.23.0", "tsdown-preset-sxzz": "^0.7.1", "typescript": "~6.0.3", "vitest": "5.0.1" }, "prettier": "@sxzz/prettier-config" } sxzz-verkit-a5b7150/pnpm-lock.yaml000066400000000000000000005011561525327470400171650ustar00rootroot00000000000000--- lockfileVersion: '9.0' importers: .: configDependencies: {} packageManagerDependencies: pnpm: specifier: 12.4.2 version: 12.4.2 packages: '@pnpm/exe.android-arm64@12.4.2': resolution: {integrity: sha512-E255MbcQ0V1577M2BV0ajWuP7KmTPYA0jqZnk3rK6Lq3kTvZWulMMb7iqRmnLsQbyWTkMEB2CfyM70loVDA8xg==} cpu: [arm64] os: [android] '@pnpm/exe.android-x64@12.4.2': resolution: {integrity: sha512-J1pSeCUwuKxMG70ZzpWn8JzElxiEa8NN/3N0SlZRtU2xbztChaJCKF3HaBNIj9yPfeofWzJo/lwNvDDjraQuZw==} cpu: [x64] os: [android] '@pnpm/exe.darwin-arm64@12.4.2': resolution: {integrity: sha512-A0WDo8iErfZBXgrLseQxw8i8Y9ctUpOEl/Uu+cubnTzpD8tT9ykIB548L8YTM2WD4OS+ZOHSxy8aGZcvKq8PaQ==} cpu: [arm64] os: [darwin] '@pnpm/exe.darwin-x64@12.4.2': resolution: {integrity: sha512-MSgJdovBWHcb5DEOvfPH9yNi/T5O1Xa4ess+E1ESGo/5yuty7S4JoiIjami+fsNXfnoQMlwsMUqYU4zAvBcNCw==} cpu: [x64] os: [darwin] '@pnpm/exe.freebsd-x64@12.4.2': resolution: {integrity: sha512-h2YumlQSNvgbRPv+RXwABohX65f9bOBZn+jMIt7bFDISZPCzQ+Nvpt6Awbp4ip5PwQgYxbu5iREJ1fHE39Fm8A==} cpu: [x64] os: [freebsd] '@pnpm/exe.linux-arm64-musl@12.4.2': resolution: {integrity: sha512-LwSEtSEDTv6S51YLs3YvSkPyun/QmfMic1UGICUkPWFu6ByP43RdMlkKvmVkfGhAYCpnxO057vrmyJqtfZrPCA==} cpu: [arm64] os: [linux] libc: [musl] '@pnpm/exe.linux-arm64@12.4.2': resolution: {integrity: sha512-2dSiDXyhx+RTHsewxex8f/jVjqQXWJ2oow4kCVHEWdZKeBpgMxvZ6fHkTAUBJXgqhbKIDHvuNlZBP7gJfUWL5A==} cpu: [arm64] os: [linux] libc: [glibc] '@pnpm/exe.linux-ppc64@12.4.2': resolution: {integrity: sha512-8Itc+jQk+MTz04LS9D1RcH+VctAWmzM4l1cJQ+Sx7pAJNo7EKHdRMbC0Tok1jyQ7eEHNJZD5EleYneZqWfZM+g==} cpu: [ppc64] os: [linux] libc: [glibc] '@pnpm/exe.linux-riscv64@12.4.2': resolution: {integrity: sha512-hleOeqhTVpH+z9RVMGnxvU4ZnrkBUClWjCbHD9u6kwyqhGSpevoU1wTGish+CBRhmIgMAy9pAfFpqhbAKOKNfw==} cpu: [riscv64] os: [linux] libc: [glibc] '@pnpm/exe.linux-s390x@12.4.2': resolution: {integrity: sha512-LAsQRRdP9aToENR6dtcIJ9l+e1zMYOX0tQcLGpRyLPVBQcYRLlvAPcmDshsiIHQjp05SDa9FI0czX1ZQ1a7a/A==} cpu: [s390x] os: [linux] libc: [glibc] '@pnpm/exe.linux-x64-musl@12.4.2': resolution: {integrity: sha512-kzfzH2/0BWdTABK14Yj5a1xsdkTEQUp2eXEPNakaD9jKL025lq3hyaKHIz/gIZaPDMe/1bFFK/En4ztFlbBJxw==} cpu: [x64] os: [linux] libc: [musl] '@pnpm/exe.linux-x64@12.4.2': resolution: {integrity: sha512-/pbt0UVTa8NMDhzOWLQRfZ6G9ROKXlJPZtx845BqyWfc7hCrWXhTLBd70yO2y8+E+IWN3oHM1s/JsIQNGk1yvg==} cpu: [x64] os: [linux] libc: [glibc] '@pnpm/exe.win32-arm64@12.4.2': resolution: {integrity: sha512-PsW19e4dAUNpZ0cS9flaxFuAmpt2dKlH/Vvi8TZ4qyJjjQzue/CEsWm+6wKVP4CJ7IT8RdL4qh+soOPWIgF2Zw==} cpu: [arm64] os: [win32] '@pnpm/exe.win32-x64@12.4.2': resolution: {integrity: sha512-+xGoeE0g55ztWvl8i5QqdmNfW3nIrTVcoQrNshEOwxthm9Ag48oXton3uxOA3/SANyz5AXexEjj2KO20NnOrEw==} cpu: [x64] os: [win32] pnpm@12.4.2: resolution: {integrity: sha512-CK3GYTGAJ1x8ntraOdzwjJxhrU5+rzMKTzRh8QKw+QdCNFTRF/mOctR/7wYWBwZE17/8lzpqV/UJCm18NosHyQ==} engines: {node: '>=18.*'} hasBin: true snapshots: '@pnpm/exe.android-arm64@12.4.2': optional: true '@pnpm/exe.android-x64@12.4.2': optional: true '@pnpm/exe.darwin-arm64@12.4.2': optional: true '@pnpm/exe.darwin-x64@12.4.2': optional: true '@pnpm/exe.freebsd-x64@12.4.2': optional: true '@pnpm/exe.linux-arm64-musl@12.4.2': optional: true '@pnpm/exe.linux-arm64@12.4.2': optional: true '@pnpm/exe.linux-ppc64@12.4.2': optional: true '@pnpm/exe.linux-riscv64@12.4.2': optional: true '@pnpm/exe.linux-s390x@12.4.2': optional: true '@pnpm/exe.linux-x64-musl@12.4.2': optional: true '@pnpm/exe.linux-x64@12.4.2': optional: true '@pnpm/exe.win32-arm64@12.4.2': optional: true '@pnpm/exe.win32-x64@12.4.2': optional: true pnpm@12.4.2: optionalDependencies: '@pnpm/exe.android-arm64': 12.4.2 '@pnpm/exe.android-x64': 12.4.2 '@pnpm/exe.darwin-arm64': 12.4.2 '@pnpm/exe.darwin-x64': 12.4.2 '@pnpm/exe.freebsd-x64': 12.4.2 '@pnpm/exe.linux-arm64': 12.4.2 '@pnpm/exe.linux-arm64-musl': 12.4.2 '@pnpm/exe.linux-ppc64': 12.4.2 '@pnpm/exe.linux-riscv64': 12.4.2 '@pnpm/exe.linux-s390x': 12.4.2 '@pnpm/exe.linux-x64': 12.4.2 '@pnpm/exe.linux-x64-musl': 12.4.2 '@pnpm/exe.win32-arm64': 12.4.2 '@pnpm/exe.win32-x64': 12.4.2 --- lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: .: devDependencies: '@sxzz/eslint-config': specifier: ^8.6.0 version: 8.6.0(@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.69.0(typescript@6.0.3))(@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(prettier@3.9.8)(typescript@6.0.3) '@sxzz/prettier-config': specifier: ^2.3.3 version: 2.3.3(prettier@3.9.8) '@types/node': specifier: ^26.6.1 version: 26.6.1 '@types/semver': specifier: ^7.8.0 version: 7.8.0 '@typescript/native-preview': specifier: npm:typescript@7.0.2 version: typescript@7.0.2 '@vitest/coverage-v8': specifier: ^5.0.1 version: 5.0.1(vitest@5.0.1) bumpp: specifier: ^12.3.0 version: 12.3.0 eslint: specifier: ^10.10.0 version: 10.10.0(jiti@2.7.0) prettier: specifier: ^3.9.8 version: 3.9.8 rolldown: specifier: ^1.2.9 version: 1.2.9 semver: specifier: ^7.8.5 version: 7.8.5 tsdown: specifier: ^0.23.0 version: 0.23.0(@arethetypeswrong/core@0.18.5)(publint@0.3.24)(typescript@6.0.3)(typescript@7.0.2) tsdown-preset-sxzz: specifier: ^0.7.1 version: 0.7.1(tsdown@0.23.0(@arethetypeswrong/core@0.18.5)(publint@0.3.24)(typescript@6.0.3)(typescript@7.0.2)) typescript: specifier: ~6.0.3 version: 6.0.3 vitest: specifier: 5.0.1 version: 5.0.1(@types/node@26.6.1)(@vitest/coverage-v8@5.0.1)(vite@8.2.2(@types/node@26.6.1)(jiti@2.7.0)(yaml@2.9.0)) packages: '@andrewbranch/untar.js@1.0.4': resolution: {integrity: sha512-pVXSwPsLuw8IGLo2Di0EaOfsk+ntVvpkk942J/sHYIkwvtKUakEcPh7HBgZ6tuimgzKSEHgCvO4XgQ05DEbwDw==} '@arethetypeswrong/core@0.18.5': resolution: {integrity: sha512-9ytjzGwxjm9Uz7I9avfbt5vlQt6uk9uRRESzJjqrznl6WKvI6dwYTo+vJ3U02Wrq/mR3iql/PzhvHhKdJIAjDQ==} engines: {node: '>=20'} '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} '@babel/parser@7.29.8': resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true '@babel/types@7.29.8': resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} '@braidai/lang@1.1.2': resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} '@cacheable/memory@2.2.0': resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} '@cacheable/utils@2.5.0': resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} '@emnapi/core@1.11.1': resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} '@emnapi/runtime@1.11.1': resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} '@emnapi/wasi-threads@1.2.2': resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} '@es-joy/jsdoccomment@0.92.0': resolution: {integrity: sha512-WivZqV5jPTYDQJgIMp0hTsyQESKYNY6yCJr4b0l84tYtQntkAMkc6zARh2vlRQyeg4aYHPUkCUDpvr2IWAiGpQ==} engines: {node: ^22.22.2 || >=24.15.0} '@es-joy/jsdoccomment@0.96.0': resolution: {integrity: sha512-nvtxrDqAJOKMPSsMHqshCnHvnCqFnJTsKpTaTSaZoUi9VxGVe2JvgQeAY/Qvh2wyqXByIAqNTgI7h9elXzn0yQ==} engines: {node: ^22.22.2 || >=24.15.0} '@es-joy/resolve.exports@1.2.0': resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} '@eslint-community/eslint-plugin-eslint-comments@4.7.2': resolution: {integrity: sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 '@eslint-community/eslint-utils@4.10.1': resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/compat@2.1.1': resolution: {integrity: sha512-rMcy8GSrwNzcISX/BlTDY/GLB4eCopEuy9woIls3To+15OLxykZrxxq+WUcylCPCQ6F4MujjBM1DX5V1aqI3Vw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^8.40 || 9 || 10 peerDependenciesMeta: eslint: optional: true '@eslint/config-array@0.23.5': resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/config-helpers@0.5.5': resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/config-helpers@0.7.0': resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/css-tree@4.1.0': resolution: {integrity: sha512-cg0ohyrAG3swyGqt8t1K/OK97DqBw/ftDvlvyY1fmEst5B40UOmsimwLENq74z2dyw5CDM+3zJIW+CV2nFNDdA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/js@10.0.1': resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^10.0.0 peerDependenciesMeta: eslint: optional: true '@eslint/markdown@8.0.3': resolution: {integrity: sha512-rBTSSShrq7e4O+PWfeE4azH4/CWPNrC+VGxBXiW00o3vYVJnznsZiDayj3KC9JztIMVRZxZHn2nrDIUau/4j7A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/object-schema@3.0.5': resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/plugin-kit@0.7.3': resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} '@humanfs/node@0.16.8': resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} '@humanfs/types@0.15.0': resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.6.0': resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@keyv/bigmap@1.3.1': resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} engines: {node: '>= 18'} peerDependencies: keyv: ^5.6.0 '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} '@loaderkit/resolve@1.0.6': resolution: {integrity: sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==} '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} peerDependencies: '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 '@ota-meshi/ast-token-store@0.3.0': resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@oxc-parser/binding-android-arm-eabi@0.139.0': resolution: {integrity: sha512-22EsXTA3Vc7OvrF4bfT48PFln2UbxkVgrp/Tm32qLw76Dv7SmcInfClJe6yPYamnli6HiqasnESZ5ezN+X4ybg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] '@oxc-parser/binding-android-arm64@0.139.0': resolution: {integrity: sha512-uASQkZV+CUQ6xXvoMzDQyfhd8OMusdv2FyCPfAi5ZDYptesapJlw7erhpGi1Lc+U8QjQV2JUrIh7d/3su2LzmQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] '@oxc-parser/binding-darwin-arm64@0.139.0': resolution: {integrity: sha512-vuQOv2WF5pZCkdSPEExul98o853M3MCR24DpWsGrUoPJu5KcnGE34kLXY2yFwBwZwT+eN1x40Tt4q6ZzlEdNUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] '@oxc-parser/binding-darwin-x64@0.139.0': resolution: {integrity: sha512-zxZB8ChS+7XactZhcyxQ292P/DNiiBaPPKYiVUlb3RC0V/hme5bokNubjcmEmbW9uTfmqLTpveAdkbe66H3pGg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] '@oxc-parser/binding-freebsd-x64@0.139.0': resolution: {integrity: sha512-iw2MsoCPBQwdJqywRAGsF1jEAcGoZ+DeG2LVzt5pdUvRHqajsMF46BH0rHiWoWtMwcMSia+oQYga7fHo7u7Bcw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] '@oxc-parser/binding-linux-arm-gnueabihf@0.139.0': resolution: {integrity: sha512-SwjD/k3Y5bwGJWOH313VyaDrAuaYg1Pe+4AAXCgUKvSO5IHkj+mZ0oFcOWmB5nTuOM3uwdT+leL8h4OnFlI5hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@oxc-parser/binding-linux-arm-musleabihf@0.139.0': resolution: {integrity: sha512-qbeygDkcvailKFhphb2YGMMXsaZIynHlPtoOrcx4NZB/tRbUKraCCMbw8dPeFtEKasfS2qWh1VnReY+Lcys1zA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@oxc-parser/binding-linux-arm64-gnu@0.139.0': resolution: {integrity: sha512-SrlL02KeImKlvx/9rCeopOLH7qKI3rqKKEguK6KBwVwEGLhV/A47dW4DNigf6/LFhrwoovaiayEQryjYAI86dQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-arm64-musl@0.139.0': resolution: {integrity: sha512-u9e884ChAVRmIZ1jr/m46S96FoDQnruFjISLi4Y0i6Wu/JUUmIiw7+umLyXILJsPfUuqnN5BJLe23t07+Y6+IA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] '@oxc-parser/binding-linux-ppc64-gnu@0.139.0': resolution: {integrity: sha512-Z9tU2b3GJfAXOdirQmz4gZQkQkVjy53i77gf91l0733MQKa/qtk73KQQE2GzDtMqim+HyjpzvemmqzBtH2IJUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-riscv64-gnu@0.139.0': resolution: {integrity: sha512-RyUbr7hzPK84YDWKs77PRYk9VBwWbsbuYsQzQWiSmLnARXTg2zntLPGfCH/1wpfUYdmGkp/6SsqTXSsYdw9Jgw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-riscv64-musl@0.139.0': resolution: {integrity: sha512-dcQhjtcDvtR8BgkUpt03Yz5SzxdzYvTigenIJOEsiSX6G2t6yybEMxGWjp0dOuYGror0BaqcZfTyXR58amCEig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] '@oxc-parser/binding-linux-s390x-gnu@0.139.0': resolution: {integrity: sha512-iuGrxysV4rGUymdKpn7bgZQ6Vix8Bi/6D/rp71HYIzphq6NKrsBhsGOYsSZte+uBFL43tXh7Xr7TM72sGliJNA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-x64-gnu@0.139.0': resolution: {integrity: sha512-NxJdZZyaa2JLLvNfH/iJQXfCNfKcPMylwY4ObMpBVmW4Nq+RyUpVVQXrMMelcQ6rwx3nuhF1Iga8n+eoAKGCIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] '@oxc-parser/binding-linux-x64-musl@0.139.0': resolution: {integrity: sha512-ePxBvvtzISmSsJ0RIj8FNikSCn58i1jtccj7XR4U9Li4iSzhkFyYlnJ51cQTUwkairz8WMTD4SpKoot8RyTnQA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] '@oxc-parser/binding-openharmony-arm64@0.139.0': resolution: {integrity: sha512-b/c2+mPXMOxG5x16n8yf9cjor/ntQQScmYnSmLEWIWJ4rfXd5dokMxx0kliSLA+YAGq6DD3K9BWi+aFXHiiV1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] '@oxc-parser/binding-wasm32-wasi@0.139.0': resolution: {integrity: sha512-rNU0pO+/CVPC2qZ+xtX5R2cOje9Q75q3UkfgwUCPlplqxMv6Iffd5tMPGVMCLGnPINxPlmi0WPsW94HltbYvfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] '@oxc-parser/binding-win32-arm64-msvc@0.139.0': resolution: {integrity: sha512-JPEmfncZfqAFiGsAN6UZSMIBqnG8wn8buywRacFOWjP+9dZwcs03SsBp4tmyjM/4l/VoH/IuThrW1Jof3OyQUw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] '@oxc-parser/binding-win32-ia32-msvc@0.139.0': resolution: {integrity: sha512-c06dWBwEnFHof5JN7T9/ts23uATXS9czPEBO60d4xnjH2Am29Bo7OGKdVHRmcWQnw0OBxlTg9fIEXAvtcwOBfw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] '@oxc-parser/binding-win32-x64-msvc@0.139.0': resolution: {integrity: sha512-bI3/44urQjW/D495JPXe+c9d+4Q+ONi3DvDNnzwRZYTWHZ3hAlFdmirYK4mzhTfCZiAly02EbMYir7QGU+9O2Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] '@oxc-project/types@0.139.0': resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} '@oxc-project/types@0.148.0': resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} '@oxc-project/types@0.150.0': resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} '@pkgr/core@0.3.6': resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} engines: {node: ^14.18.0 || >=16.0.0} '@prettier/plugin-oxc@0.2.3': resolution: {integrity: sha512-6TYRFBxthmW0IULsZjik2Gu62jc17xPILlcSIXTXfrhDH4etIcissalZ+RO5oweMWidM3jJ38QJbkD2C6J0/LA==} engines: {node: '>=14'} '@publint/pack@0.1.7': resolution: {integrity: sha512-4EDEmvxWtgsCnnVeBvtFIFZtUhPPt1+bA9JrSwU4Sa//6oKtzCSlGGXYJr44OD9aGISymbieJ4mCKHUygUDU+g==} engines: {node: '>=18'} '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} '@rolldown/binding-android-arm-eabi@1.2.7': resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] '@rolldown/binding-android-arm-eabi@1.2.9': resolution: {integrity: sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] '@rolldown/binding-android-arm64@1.2.7': resolution: {integrity: sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] '@rolldown/binding-android-arm64@1.2.9': resolution: {integrity: sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] '@rolldown/binding-darwin-arm64@1.2.7': resolution: {integrity: sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] '@rolldown/binding-darwin-arm64@1.2.9': resolution: {integrity: sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] '@rolldown/binding-darwin-x64@1.2.7': resolution: {integrity: sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] '@rolldown/binding-darwin-x64@1.2.9': resolution: {integrity: sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] '@rolldown/binding-freebsd-x64@1.2.7': resolution: {integrity: sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] '@rolldown/binding-freebsd-x64@1.2.9': resolution: {integrity: sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] '@rolldown/binding-linux-arm-gnueabihf@1.2.7': resolution: {integrity: sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@rolldown/binding-linux-arm-gnueabihf@1.2.9': resolution: {integrity: sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@rolldown/binding-linux-arm64-gnu@1.2.7': resolution: {integrity: sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] '@rolldown/binding-linux-arm64-gnu@1.2.9': resolution: {integrity: sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.2.7': resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] '@rolldown/binding-linux-arm64-musl@1.2.9': resolution: {integrity: sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.2.7': resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] '@rolldown/binding-linux-ppc64-gnu@1.2.9': resolution: {integrity: sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.2.7': resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.2.9': resolution: {integrity: sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.2.7': resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.2.9': resolution: {integrity: sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] '@rolldown/binding-linux-x64-musl@1.2.7': resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] '@rolldown/binding-linux-x64-musl@1.2.9': resolution: {integrity: sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] '@rolldown/binding-openharmony-arm64@1.2.7': resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] '@rolldown/binding-openharmony-arm64@1.2.9': resolution: {integrity: sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] '@rolldown/binding-win32-arm64-msvc@1.2.7': resolution: {integrity: sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] '@rolldown/binding-win32-arm64-msvc@1.2.9': resolution: {integrity: sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] '@rolldown/binding-win32-x64-msvc@1.2.7': resolution: {integrity: sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] '@rolldown/binding-win32-x64-msvc@1.2.9': resolution: {integrity: sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} '@sindresorhus/base62@1.0.0': resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} '@sxzz/eslint-config@8.6.0': resolution: {integrity: sha512-thRzAvQw2IaZf0iuGJJUX98cyPtQ5MXGG+Jc7XJM+770jSV2DML0YxvDuPUBizrl8i9mN2AjjXJsUtLY4eIE2w==} engines: {node: ^22.23.0 || ^24.15.0 || >=26.0.0} peerDependencies: '@unocss/eslint-plugin': '>=65.0.0' eslint: ^9.5.0 || ^10.0.0 eslint-plugin-astro: ^1.5.0 || ^2.0.0 || ^3.0.0 peerDependenciesMeta: '@unocss/eslint-plugin': optional: true eslint-plugin-astro: optional: true '@sxzz/prettier-config@2.3.3': resolution: {integrity: sha512-MFy6ysBnGzOZRcLffCyab6ZCh8WQi5WslCf5V9s0sWtahW5lSMASrIY2Hm5gmUhAgjRnILAUxRzAZo0Cm1Y3gw==} peerDependencies: prettier: ^3.8.0 prettier-plugin-astro: ^0.14.1 peerDependenciesMeta: prettier-plugin-astro: optional: true '@tybys/wasm-util@0.10.3': resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/hast@3.0.5': resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/katex@0.16.8': resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/node@26.6.1': resolution: {integrity: sha512-VqGJBMCtdhqkBUCcBLvywI0NJ+KLuVzgNnlBUNFOQjqVxzo2lxLUNg1DSey8+u2u6ktswSAxg+s68QLzWHNOuA==} '@types/semver@7.8.0': resolution: {integrity: sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} '@typescript-eslint/eslint-plugin@8.69.0': resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.69.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/parser@8.69.0': resolution: {integrity: sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/project-service@8.69.0': resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/scope-manager@8.69.0': resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.69.0': resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/type-utils@8.69.0': resolution: {integrity: sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/types@8.69.0': resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.69.0': resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/utils@8.69.0': resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' '@typescript-eslint/visitor-keys@8.69.0': resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/typescript-aix-ppc64@7.0.2': resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} engines: {node: '>=16.20.0'} cpu: [ppc64] os: [aix] '@typescript/typescript-darwin-arm64@7.0.2': resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [darwin] '@typescript/typescript-darwin-x64@7.0.2': resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [darwin] '@typescript/typescript-freebsd-arm64@7.0.2': resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [freebsd] '@typescript/typescript-freebsd-x64@7.0.2': resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} engines: {node: '>=16.20.0'} cpu: [x64] os: [freebsd] '@typescript/typescript-linux-arm64@7.0.2': resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [linux] '@typescript/typescript-linux-arm@7.0.2': resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} engines: {node: '>=16.20.0'} cpu: [arm] os: [linux] '@typescript/typescript-linux-loong64@7.0.2': resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} engines: {node: '>=16.20.0'} cpu: [loong64] os: [linux] '@typescript/typescript-linux-mips64el@7.0.2': resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} engines: {node: '>=16.20.0'} cpu: [mips64el] os: [linux] '@typescript/typescript-linux-ppc64@7.0.2': resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} engines: {node: '>=16.20.0'} cpu: [ppc64] os: [linux] '@typescript/typescript-linux-riscv64@7.0.2': resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} engines: {node: '>=16.20.0'} cpu: [riscv64] os: [linux] '@typescript/typescript-linux-s390x@7.0.2': resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} engines: {node: '>=16.20.0'} cpu: [s390x] os: [linux] '@typescript/typescript-linux-x64@7.0.2': resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} engines: {node: '>=16.20.0'} cpu: [x64] os: [linux] '@typescript/typescript-netbsd-arm64@7.0.2': resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [netbsd] '@typescript/typescript-netbsd-x64@7.0.2': resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} engines: {node: '>=16.20.0'} cpu: [x64] os: [netbsd] '@typescript/typescript-openbsd-arm64@7.0.2': resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [openbsd] '@typescript/typescript-openbsd-x64@7.0.2': resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} engines: {node: '>=16.20.0'} cpu: [x64] os: [openbsd] '@typescript/typescript-sunos-x64@7.0.2': resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} engines: {node: '>=16.20.0'} cpu: [x64] os: [sunos] '@typescript/typescript-win32-arm64@7.0.2': resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} engines: {node: '>=16.20.0'} cpu: [arm64] os: [win32] '@typescript/typescript-win32-x64@7.0.2': resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} engines: {node: '>=16.20.0'} cpu: [x64] os: [win32] '@vitest/coverage-v8@5.0.1': resolution: {integrity: sha512-FRC8ACiudC3dI6MTplzRSYWHDRnIv2IPfbzs4FdoJNsMal/35sWV8hwIfV8ZcqzSPy+uXHeMVONt9CEqtOU17w==} peerDependencies: '@vitest/browser': 5.0.1 vitest: 5.0.1 peerDependenciesMeta: '@vitest/browser': optional: true '@vitest/istanbul-lib-coverage@1.0.1': resolution: {integrity: sha512-k3DJZ8LhMBK9NS4SclF1ASD3OgXEWDorbIcPTRDK0/Zae6fRvu+fJRxtFdLfHsa9Y24beCdPnoNZ4LviTNstfA==} engines: {node: '>=22'} '@vitest/istanbul-lib-report@1.0.1': resolution: {integrity: sha512-1EOLRfsTMnyAr3+kEAsP4o9dhaDlGPpD7H5iLBBeq//YpNB1VIahkPhB+eRp9N2Dkfw8oySROjE3yf9XDeaIkQ==} engines: {node: '>=22'} '@vitest/mocker@5.0.1': resolution: {integrity: sha512-6K1DoBNAPGvuOcSsGA4D6x+5zEEff/KmOOP3uetT2TrGpVfI+HRHRnJJfKi5ib/g1vx8IYHQD8s0pbJz8WQI7Q==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true '@vitest/spy@5.0.1': resolution: {integrity: sha512-rbto/mF/SGERxEgYOek7Xm6B9b+y+mVoo+f4b2LymYO8zM1b7uB5nHuhVMTP2hxdzgxvGiZYGxGIaMvL5y180Q==} '@yuku-codegen/binding-android-arm64@0.9.3': resolution: {integrity: sha512-viote6xAyL5cKLquV2X2wRfopSckH+msDYbaI8Hh8JAaogYs8MJZVRUbSrbsY29TaPrIFZwNRwQ8+YSxs0dkGw==} cpu: [arm64] os: [android] '@yuku-codegen/binding-darwin-arm64@0.9.3': resolution: {integrity: sha512-y2PGOLyxc724EJ+Et/5PxGfutQuV1Z2J9cxHo6W1I5CR3nk0i03J4yPrnw6rNJOfrtlISzcc7q0RrSyfPndpIg==} cpu: [arm64] os: [darwin] '@yuku-codegen/binding-darwin-x64@0.9.3': resolution: {integrity: sha512-xZ9UpXUOLmsrKVUp7MRXxWU3drNiilRC42OLpjWEhnOehIGVF1bZgzHcqRYJxVyU53RMrkRMsaxplkGd6Qo/ow==} cpu: [x64] os: [darwin] '@yuku-codegen/binding-freebsd-x64@0.9.3': resolution: {integrity: sha512-RGCYSZw3VonreVTpur9iOfnbMngR2/f7UOE7gwcDx5WoHjIhtmTK9EIq9qs78ARdMFAPzKp5OzHljl5QMaGJ7g==} cpu: [x64] os: [freebsd] '@yuku-codegen/binding-linux-arm-gnu@0.9.3': resolution: {integrity: sha512-kjIJIw39GSPTF0hnq+jnM0tR+J5WlariAAWetxMtawNskITDT1ZigaK3YF5hMhDz2mAofaM1t+63qtx+7aXjeg==} cpu: [arm] os: [linux] libc: [glibc] '@yuku-codegen/binding-linux-arm-musl@0.9.3': resolution: {integrity: sha512-TVHeVdzaS4ub86URrQufiy4t01ZtdyKDZ5sTPqWFKAUbQJ7rQ0o5vIT+/jCeHQbP+Yf9p5peRdmPbcZewoDNiA==} cpu: [arm] os: [linux] libc: [musl] '@yuku-codegen/binding-linux-arm64-gnu@0.9.3': resolution: {integrity: sha512-9aQeeLh1qaCa2GcyzHnwLKGfFrsI+KOyhnh4+fICSq5kyhzCWQfXVCCK4RTEZPLcyuVwfN5Id0JEYavRN4oNTQ==} cpu: [arm64] os: [linux] libc: [glibc] '@yuku-codegen/binding-linux-arm64-musl@0.9.3': resolution: {integrity: sha512-TLXA5Hd1nr8VSP2MtxcFddsBIHj+DPpyG5eberEGMATndgG7STlKQmle51MV0MZ8UgsdYM6CybIVpzlCPQwP9w==} cpu: [arm64] os: [linux] libc: [musl] '@yuku-codegen/binding-linux-x64-gnu@0.9.3': resolution: {integrity: sha512-tk0BFbF3Clb9k9biPH3qmr+Qwk24rRM26+HY91hYXmZlzlepZG0scQ6OffZFWtzwKE5JjlZpMdcWj1lTiHbEjA==} cpu: [x64] os: [linux] libc: [glibc] '@yuku-codegen/binding-linux-x64-musl@0.9.3': resolution: {integrity: sha512-xo+pXshsCXruEEkDMbwHqkeTyC4XHb6A6oXr6x2YK3jOMcS5kZz0e26BmTCr40J0nY/K3ysmwG9R1xHygtiuwQ==} cpu: [x64] os: [linux] libc: [musl] '@yuku-codegen/binding-win32-arm64@0.9.3': resolution: {integrity: sha512-70gAQo6HZzMgIJTjeMZOEO2XaRj4GcNGP/n81R9tXQv0x8d4ZHnZDv+ygeWfHo+xchAUPwpnrVZA4p6RhJa3GQ==} cpu: [arm64] os: [win32] '@yuku-codegen/binding-win32-x64@0.9.3': resolution: {integrity: sha512-7Hz3NGlq6qBBR8zMEk6GMZivofNjnYZpMXSoUwUgz9Ur2LaivuP23HQh0ern+T6HVkTJEvilw4VJrg1rX1Ugcg==} cpu: [x64] os: [win32] '@yuku-parser/binding-android-arm64@0.9.3': resolution: {integrity: sha512-z3tDGTaUXD5Q4IuebFOY/QHxhR/SqujMhkMv9C5bh25upyFEXdafp0MsXQIIheWhVZzn5VMOniyxFni/7s9LgQ==} cpu: [arm64] os: [android] '@yuku-parser/binding-darwin-arm64@0.9.3': resolution: {integrity: sha512-hzKvKSKS7z3ufnu1VkQYEoxmS6A5uNnkwukKnc2atxpWdq648nLVOqut4h1jUXjbM2WcoTfuZLF6AHAGFf8cmg==} cpu: [arm64] os: [darwin] '@yuku-parser/binding-darwin-x64@0.9.3': resolution: {integrity: sha512-OM2PiVlPATvzlj/KGHNlu+t8FC3YzM5joVNjhsz/EaigQ8x2UUQ1Q0agQLiv5GZ2L8TSzrLUwBCZ7YOvP8q+tw==} cpu: [x64] os: [darwin] '@yuku-parser/binding-freebsd-x64@0.9.3': resolution: {integrity: sha512-WMn9M4LHNVysGNwsAJ9gpRPqQIW2lcPrDNGcyk0agx3IYqCJq1MQugh6Be8Otc5U08eGdE39o8Kx9YWJmXz7GA==} cpu: [x64] os: [freebsd] '@yuku-parser/binding-linux-arm-gnu@0.9.3': resolution: {integrity: sha512-vqKjwiyW1FWvbykYMEQIcAJwA17WxK3rxxqDuyCvQwcNVaLEUxI4BXiUdlF3kHucc7MnoFQhoRPkySgOzlLM+Q==} cpu: [arm] os: [linux] libc: [glibc] '@yuku-parser/binding-linux-arm-musl@0.9.3': resolution: {integrity: sha512-qohilhYOT+zkt2gYzym4F1T6BzRdvPqS9/sFB03pmnVV8LrvjOXVsGwEBAa3CEvzJKhAZjdTmVz7zsVdjyHWLg==} cpu: [arm] os: [linux] libc: [musl] '@yuku-parser/binding-linux-arm64-gnu@0.9.3': resolution: {integrity: sha512-tvTIyUvTGkeee68i4JIo9o27As+Ug6LXOZvElGgFbTs6+KBdb5LGhvugaIQljdfIsm2XnIbOLG6OnQSXHMLB9w==} cpu: [arm64] os: [linux] libc: [glibc] '@yuku-parser/binding-linux-arm64-musl@0.9.3': resolution: {integrity: sha512-OWZBHW1wuChBpFlrF+On1yiBcFPMRrj2g0VKsM/PCBGffu1OM0ORkS+vLS3Snu6wYwndM5Dd9Ctvux6eUlrQjA==} cpu: [arm64] os: [linux] libc: [musl] '@yuku-parser/binding-linux-x64-gnu@0.9.3': resolution: {integrity: sha512-/tbk1h0dlADOCngbiQO9V3SHwBIJkoGBq8BDEraSw2CC3nGxPEPTCCYUDp5738Ij2FxVwy1FWVuhFkHvpMrPbQ==} cpu: [x64] os: [linux] libc: [glibc] '@yuku-parser/binding-linux-x64-musl@0.9.3': resolution: {integrity: sha512-u3+0sCso/mcjDvtc3866D2giV7l34PDyDVBkMesAWa3DWbIWPlybehi2SSnmScgArV22ctqSSgUzdBBVJ6zYAg==} cpu: [x64] os: [linux] libc: [musl] '@yuku-parser/binding-win32-arm64@0.9.3': resolution: {integrity: sha512-xnGEvdhyjRkXozHtpXVpEEkyGZWAxJ3RoILv7XRV5SvTEztaTCk5GQyfcOzI9An/EJtcL4ERCI8QmS0TpDPJiA==} cpu: [arm64] os: [win32] '@yuku-parser/binding-win32-x64@0.9.3': resolution: {integrity: sha512-N5eShGcuwnrXEprePFmEjtng6acZmtnC4zgazK9xxkavcx1q1uX8Nz8lU5RS973EMlNr902cIc6Cd2D4tqZDBg==} cpu: [x64] os: [win32] '@yuku-toolchain/types@0.9.3': resolution: {integrity: sha512-rFE+5P4g2wxko5C85MugJOlVjBHEQq87dIkhLkniLXLp63PEtgaFjD954i5HXlfnyzLxPcZHsSOVDVgmo1HToA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} are-docs-informative@0.1.1: resolution: {integrity: sha512-sqRsNQBwbKLRX0jV5Cu5uzmtflf892n4Vukz7T659ebL4pz3mpOqCMU7lxMoBTFwnp10E3YB5ZcyHM41W5bcDA==} engines: {node: '>=18'} args-tokenizer@0.3.0: resolution: {integrity: sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==} assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} ast-v8-to-istanbul@1.0.5: resolution: {integrity: sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==} balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} baseline-browser-mapping@2.11.21: resolution: {integrity: sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==} engines: {node: '>=6.0.0'} hasBin: true boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} browserslist@4.28.8: resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true builtin-modules@5.3.0: resolution: {integrity: sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==} engines: {node: '>=18.20'} bumpp@12.3.0: resolution: {integrity: sha512-YgW09sgbIGQmAD/Jk7FEGP0tm0PeDz+Zgk+IAk+MOHhb/98pj/l3CgkxSjd7C1O99JPxTNwS+bPOTNaHuNh6lQ==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} cacheable@2.5.0: resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} caniuse-lite@1.0.30001810: resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} comment-parser@1.4.7: resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} engines: {node: '>= 12.0.0'} comment-parser@1.4.8: resolution: {integrity: sha512-rKZTGo4fzKYna8UcL0isTg5wkBNla7bxTypLwZQXjIdi++IdP1OJ41rI5Mti3/jltkPujbu4i9LIARYA+zpotQ==} engines: {node: '>= 12.0.0'} convert-hrtime@5.0.0: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} core-js-compat@3.50.0: resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} engines: {node: '>=6.4.0'} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} detect-indent@7.0.2: resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} engines: {node: '>=12.20'} detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dts-resolver@3.0.0: resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} engines: {node: ^22.18.0 || >=24.0.0} peerDependencies: oxc-resolver: '>=11.0.0' peerDependenciesMeta: oxc-resolver: optional: true electron-to-chromium@1.5.421: resolution: {integrity: sha512-cUhfpHQy+PGbt+X90DMcAVazDCziIZr73hpxD4LRs4BGQoJCifPzTfQWa7S6c+uhokTOBe8tot09GBSEO6c9LA==} empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} enhanced-resolve@5.24.5: resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} entities@8.0.0: resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} engines: {node: '>=20.19.0'} es-module-lexer@2.3.2: resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} eslint-compat-utils@0.5.1: resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' eslint-config-flat-gitignore@2.4.0: resolution: {integrity: sha512-JhYC+V7qEDiCDsbJcVP8fxNc62fk4+i91YLP/YvmVHlkaQ8Xo99olYN8MO5COdxl7onGlsrfZVONe5NYsZP1UA==} peerDependencies: eslint: ^9.5.0 || ^10.0.0 eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-flat-config-utils@3.2.0: resolution: {integrity: sha512-PHgo1X5uqIorJONLVD9BIaOSdoYFD3z/AeJljdqDPlWVRpeCYkDbK9k0AXoYVqqNJr6FEYIEr5Rm2TSktLQcHw==} eslint-json-compat-utils@0.2.3: resolution: {integrity: sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==} engines: {node: '>=12'} peerDependencies: '@eslint/json': '*' eslint: '*' jsonc-eslint-parser: ^2.4.0 || ^3.0.0 peerDependenciesMeta: '@eslint/json': optional: true eslint-plugin-antfu@3.2.3: resolution: {integrity: sha512-U2fnz/H0gFPxpuC7QpaHa0Jv2AgCZ5hunp36SOP/yWo8yFzgvMh8X4pZ4uN4IKoqtBhk7G3HuVa93Urf51+sZg==} peerDependencies: eslint: '*' eslint-plugin-baseline-js@0.7.1: resolution: {integrity: sha512-A3MkhHabfzl6Yi8lIoQL266f4bKUWhzS+6ASSXBItAMMopUiTG76ygxT4HlGydPujmgxtzcM8GSKQzf0l2p18g==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: eslint: '>=9.29.0 <11' eslint-plugin-command@4.0.0: resolution: {integrity: sha512-mM1UdKu39YF5nUBVbA+PaVvpB3R3Niwjes8CQ8rJTTbgIThgrfQILgDqmtpAAQL1xGaolCoES1SfiwzwPVGkXQ==} engines: {node: ^22.22.2 || >=24.15.0} peerDependencies: '@typescript-eslint/typescript-estree': '*' '@typescript-eslint/utils': '*' eslint: '*' eslint-plugin-de-morgan@2.1.3: resolution: {integrity: sha512-vuU/AIPvzsRhCyAfgaWwRVy0QUGvtv2pCn3N6tV4LZRFRNKPuV+Md1mYLvLuM9tORKLe8plzx5DqS9/II/3dew==} engines: {node: ^20.0.0 || >=22.0.0} peerDependencies: eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' eslint-plugin-es-x@9.7.0: resolution: {integrity: sha512-BT0pUw0toxtrHulYycGiUTL++qC11opyPYMuGUR7AgmuQ/N1YN1xLupF8rGxlaGqEqkqeedJuacCxxAcYgGkvg==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: eslint: '>=9.29.0' eslint-plugin-importer@0.4.1: resolution: {integrity: sha512-PobM0w3wXkbAQr2yw0PVOLF/7fAMEoX/m0FstaS7D6ggngcsqB8Ug9Pw6B8PK8qDbOLBib6ZRgI/68L9RaqtTA==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} peerDependencies: eslint: ^9.0.0 || ^10.0.0 eslint-plugin-jsdoc@64.3.5: resolution: {integrity: sha512-BqRUwfREoBH+7pzDD+uIQ3aema5P7BnPYcHj3mU0DLm+p/5TEHdimkXgnQfYl0AGgB9PZxZW/Lk7D69FTJSLXw==} engines: {node: ^22.22.2 || >=24.15.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 eslint-plugin-jsonc@3.4.2: resolution: {integrity: sha512-q5xzjCYFQuhFomTbctXzd3STfDJ8XduvaigjQmMEbP2gzSKrc58y3Fv6D775/cIK1/sRUn+4kpljiU2iW8k0zw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: '>=9.38.0' eslint-plugin-n@18.3.0: resolution: {integrity: sha512-cPVguuDe6DrIPb/qUXHf8P89MaVTUmiYWwpt5gX5AILsvRIiZAxMFXcFR6QHYBksqKJpjfUBlL/RleCJUWcD7w==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: '>=8.57.1' ts-declaration-location: ^1.0.6 typescript: '>=5.0.0' peerDependenciesMeta: ts-declaration-location: optional: true typescript: optional: true eslint-plugin-perfectionist@5.11.0: resolution: {integrity: sha512-kZV1otBcu4xT5R1p+0x1N1wRv4pS+OIbxrA47n5a1fTnN3MWbexOx5eQgbQhGyCNbpvF/rqrbnpkGjumHF+Y0Q==} engines: {node: ^20.0.0 || >=22.0.0} peerDependencies: eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 eslint-plugin-pnpm@1.9.1: resolution: {integrity: sha512-8++1Egww2cqc9Wylmt7P+xXNMQVCosAZ4m4W4Gc0V5lGea8HFByHTRvUI+ZvvpO8fLXGg2O4MQc90EhuI3mMdQ==} peerDependencies: eslint: ^9.0.0 || ^10.0.0 eslint-plugin-prettier@5.5.6: resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' eslint: '>=8.0.0' eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' prettier: '>=3.0.0' peerDependenciesMeta: '@types/eslint': optional: true eslint-config-prettier: optional: true eslint-plugin-regexp@3.3.0: resolution: {integrity: sha512-TT0JTQbW7CRKohntpGAsMdQ1K3MsmJK4gdAhKJtIwlJ0JvuYxauymFgJdvqxIY4lqNj0EuRZWVrymQtEdJYEFg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: '>=9.38.0' eslint-plugin-sxzz@0.5.0: resolution: {integrity: sha512-RU31t0+dkBYWzlZIuYurLXvt8dIx62EpMADGiaa//aX9XtVgyYSV81boDRRK6lrNa0I0ZotTsqUm8DC6T71z+g==} engines: {node: ^22.18.0 || >=24.0.0} peerDependencies: eslint: ^9.15.0 || ^10.0.0 eslint-plugin-unicorn@74.0.0: resolution: {integrity: sha512-AGnsGi2SxHg1HEAXxn9nSnZfyjvTWkxm8E8hpd/9tD6dLjBUdcD7+D6ZN64HmmCXTSXlrwVyUqe20Uyb2CaurA==} engines: {node: '>=22'} peerDependencies: eslint: '>=10.4' eslint-plugin-unused-imports@4.4.1: resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true eslint-plugin-vue@10.10.0: resolution: {integrity: sha512-dL9x9rBHqqNcByWiLOHK6L0SB97V82/NC0cZRn9cXPjM7pCuWlpQQP9bFH4vjBv80ej1ZpzAkuD8zWH1o9bZbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 vue-eslint-parser: ^10.3.0 peerDependenciesMeta: '@stylistic/eslint-plugin': optional: true '@typescript-eslint/parser': optional: true eslint-plugin-yml@3.8.1: resolution: {integrity: sha512-E/70psRwxz5EJ8dBtzrFfqSiiInuSytbdtFCjueb/GcKjsWzPBfxfhtQePImMAPjHwMA/VDurO7DJwStDJ4wWg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: eslint: '>=9.38.0' eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-type-tracer@0.5.2: resolution: {integrity: sha512-YiJmgk6OD1suPB4UC3M/PB+oxahf145jQQ5gFXFk9F9Y7puWwnqGYC2BtTB+FoHqdOohImeTt0rNk0lhhECNaQ==} engines: {node: ^18 || >=20} peerDependencies: eslint: '>=8' eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint@10.10.0: resolution: {integrity: sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' peerDependenciesMeta: jiti: optional: true espree@11.2.0: resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fault@2.0.1: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true fflate@0.8.3: resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} file-entry-cache@11.1.5: resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} find-up-simple@1.0.1: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} flat-cache@6.1.23: resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] function-timeout@1.0.2: resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} engines: {node: '>=18'} get-tsconfig@4.14.3: resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} get-tsconfig@5.0.0-beta.6: resolution: {integrity: sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==} engines: {node: '>=20.20.0'} github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} globals@17.12.0: resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==} engines: {node: '>=18'} globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} hashery@1.5.1: resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} engines: {node: '>=20'} hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} hookified@1.15.1: resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} hookified@2.2.0: resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} identifier-regex@1.1.0: resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} engines: {node: '>=18'} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} ignore@7.0.8: resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} engines: {node: '>= 4'} import-without-cache@0.4.0: resolution: {integrity: sha512-NkJQA7oZ4YHQhd2+H3BoRFKF3d/XNsiKpHZCQEMH9pDX27hQQLsTyOocyRgaIVtf8gHX3Nt3LPkR4e5EdtPAGQ==} engines: {node: ^22.18.0 || >=24.0.0} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} indent-string@5.0.0: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} is-builtin-module@5.0.0: resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} engines: {node: '>=18.20'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} is-identifier@1.1.0: resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} engines: {node: '>=18'} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} jsdoc-type-pratt-parser@9.0.1: resolution: {integrity: sha512-1LJ/negRKJxH0+ulOsJYEpUgzIs1DAOz9QctuS4In2LW/Ro3l8C4ej5al+5FU2hBGEOAY3R3SCnP6x8226JMIw==} engines: {node: ^22.22.2 || >=24.15.0} jsdoc-type-pratt-parser@9.2.1: resolution: {integrity: sha512-V4Ww4EHnTcTLSOMoB0FsF72JhQvcAsriCm/LWnxJeGWoxIjEL2l9na11abQok5SYShq8m0Gl02el/xAbTCulvQ==} engines: {node: ^22.22.2 || >=24.15.0} jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} jsonc-eslint-parser@3.3.0: resolution: {integrity: sha512-hYTGkHGNRZnXOFZ1urhINADoqDrGfpy53cjw+dxk84QE0pUDujQzeUeamNs6Mz44/TKD49z2x6/GVSu4ZrtA+Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} katex@0.16.47: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] lightningcss-darwin-arm64@1.33.0: resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.33.0: resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.33.0: resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.33.0: resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.33.0: resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [glibc] lightningcss-linux-arm64-musl@1.33.0: resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] libc: [musl] lightningcss-linux-x64-gnu@1.33.0: resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [glibc] lightningcss-linux-x64-musl@1.33.0: resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] libc: [musl] lightningcss-win32-arm64-msvc@1.33.0: resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.33.0: resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] lightningcss@1.33.0: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} lru-cache@11.5.2: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} magic-string@1.2.3: resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} magicast@0.5.4: resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} make-asynchronous@1.1.0: resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} engines: {node: '>=18'} markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} mdast-util-from-markdown@2.0.3: resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} mdast-util-frontmatter@2.0.1: resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} mdast-util-gfm-autolink-literal@2.0.1: resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} mdast-util-gfm-footnote@2.1.0: resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} mdast-util-gfm-strikethrough@2.0.0: resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} mdast-util-gfm-table@2.0.0: resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} mdast-util-gfm-task-list-item@2.0.0: resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} mdast-util-math@3.0.0: resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} mdn-data@2.34.0: resolution: {integrity: sha512-OgIlLv0NxJKVW4GTSAoEgpRGd4F2XCqGinK0MsMlBCCS/Zcm2/LsbercNWNA7PeMMcjl75NnI97eqyo7zkdxWA==} micromark-core-commonmark@2.0.3: resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-extension-frontmatter@2.0.0: resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} micromark-extension-gfm-autolink-literal@2.1.0: resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} micromark-extension-gfm-footnote@2.1.0: resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} micromark-extension-gfm-strikethrough@2.1.0: resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} micromark-extension-gfm-table@2.1.1: resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} micromark-extension-gfm-tagfilter@2.0.0: resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} micromark-extension-gfm-task-list-item@2.1.0: resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} micromark-extension-math@3.1.0: resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} micromark-factory-label@2.0.1: resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} micromark-factory-space@2.0.1: resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} micromark-factory-title@2.0.1: resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} micromark-factory-whitespace@2.0.1: resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} micromark-util-character@2.1.1: resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} micromark-util-chunked@2.0.1: resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} micromark-util-classify-character@2.0.1: resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} micromark-util-combine-extensions@2.0.1: resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} micromark-util-decode-numeric-character-reference@2.0.2: resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} micromark-util-decode-string@2.0.1: resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} micromark-util-encode@2.0.1: resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} micromark-util-html-tag-name@2.0.1: resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} micromark-util-normalize-identifier@2.0.1: resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} micromark-util-resolve-all@2.0.1: resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} micromark-util-subtokenize@2.1.0: resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} micromark-util-types@2.0.2: resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} minimatch@10.2.6: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} nanoid@3.3.18: resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} natural-orderby@5.0.0: resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} engines: {node: '>=18'} node-releases@2.0.54: resolution: {integrity: sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==} engines: {node: '>=18'} nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} object-deep-merge@2.0.1: resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} obug@2.1.4: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} oxc-parser@0.139.0: resolution: {integrity: sha512-cf1TKZN+zc0lwqigeyXKzKVk5+vNRe99Or2+wVJsXLdlhJgC+gsIniYDfj/ZEBzCJ8Xm21ZG6YtMbR262CcS2w==} engines: {node: ^20.19.0 || >=22.12.0} p-event@6.0.1: resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} engines: {node: '>=16.17'} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} p-timeout@6.1.4: resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} engines: {node: '>=14.16'} package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} parse-imports-exports@0.2.4: resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} parse-statements@1.0.11: resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@4.0.7: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} pnpm-workspace-yaml@1.9.1: resolution: {integrity: sha512-Xj/T2X6DNAWbtk/9UQ0/TJRswltiHZevmcMjqoL7WrpJi67lu3qaslU4+I+zJ8wtwqmuvAE0KkB8rbv2ZdogBg==} postcss-selector-parser@7.1.6: resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==} engines: {node: '>=4'} postcss@8.5.28: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} prettier-linter-helpers@1.0.1: resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} prettier@3.9.8: resolution: {integrity: sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==} engines: {node: '>=14'} hasBin: true publint@0.3.24: resolution: {integrity: sha512-9zS56KrKBoqi5Qt8h92uMP8TTM9AYZSgnmCo4u2priMqkOZvQnTsziZ2p5LJ2ywbYkAjoCDp2jda9u4cgFefIw==} engines: {node: '>=18'} hasBin: true punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} qified@0.10.1: resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} engines: {node: '>=20'} quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} quote-js-string@0.1.0: resolution: {integrity: sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==} engines: {node: '>=22'} refa@0.12.1: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} regexp-ast-analysis@0.7.1: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} regjsparser@0.13.2: resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true reserved-identifiers@1.2.0: resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} engines: {node: '>=18'} resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} rolldown-plugin-dts@0.28.5: resolution: {integrity: sha512-yYd3C9CeJwqjOc9X23m0Tyxcqic491uLZlfg51szT287S8zCCqLR2uoySoElgqy2CLn7PdXcEo1dlkBs4n1WHg==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} peerDependencies: '@typescript/native-preview': '*' '@volar/typescript': ~2.4.0 rolldown: ^1.2.0 typescript: ^5.0.0 || ^6.0.0 || ~7.0.0 vue-tsc: ~3.2.0 || ~3.3.0 peerDependenciesMeta: '@typescript/native-preview': optional: true '@volar/typescript': optional: true typescript: optional: true vue-tsc: optional: true rolldown@1.2.7: resolution: {integrity: sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true rolldown@1.2.9: resolution: {integrity: sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} engines: {node: ^14.0.0 || >=16.0.0} semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@5.0.0: resolution: {integrity: sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==} spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@4.2.0: resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} strip-indent@4.1.1: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} super-regex@1.1.0: resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} engines: {node: '>=18'} synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} time-span@5.1.0: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} tinybench@6.1.4: resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} engines: {node: '>=20.0.0'} tinyexec@1.3.0: resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} tinyexec@1.3.1: resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} tinyrainbow@3.1.1: resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} engines: {node: '>=14.0.0'} to-valid-identifier@1.0.0: resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} engines: {node: '>=20'} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' tsdown-preset-sxzz@0.7.1: resolution: {integrity: sha512-ZLGHoO/IncDl8yB0a/F/LvzWDjkf//e/IRDLEyhFk1200TPHuwISdciMHir2iz3HMoiuS6Z7a35B8hgd3q8o7g==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} peerDependencies: tsdown: ^0.22.0 || ^0.23.0-0 tsdown@0.23.0: resolution: {integrity: sha512-BaT+ep1xnj5hdyICLd5r5SYYE+TXnI1ATePLykv9vcKpHpFTWUWRH+x1AF/E2qcu3YB6+vI8IdyxIIIffEqw5Q==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 '@tsdown/css': 0.23.0 '@tsdown/exe': 0.23.0 '@vitejs/devtools': '*' publint: ^0.3.8 tsx: '*' typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 unplugin-unused: '>=0.5.0' unrun: '*' peerDependenciesMeta: '@arethetypeswrong/core': optional: true '@tsdown/css': optional: true '@tsdown/exe': optional: true '@vitejs/devtools': optional: true publint: optional: true tsx: optional: true typescript: optional: true unplugin-unused: optional: true unrun: optional: true tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} typescript-eslint@8.69.0: resolution: {integrity: sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' typescript@5.6.1-rc: resolution: {integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==} engines: {node: '>=14.17'} hasBin: true typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true typescript@7.0.2: resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} engines: {node: '>=16.20.0'} hasBin: true unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} unconfig@7.5.0: resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==} undici-types@8.9.0: resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} unist-util-visit-parents@6.0.2: resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} update-browserslist-db@1.3.2: resolution: {integrity: sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} verkit@0.3.2: resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} engines: {node: '>=18.12.0'} verkit@0.4.0: resolution: {integrity: sha512-sXMwN6DMHeouPfCxkxWkKAmxphWKEenHYY5H1nIBzU3PmDsmJp6kBXJdshjVdpMZuWCmL9SH7KFRx29AylpP6g==} engines: {node: '>=18.12.0'} vite@8.2.2: resolution: {integrity: sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 '@vitejs/devtools': ^0.4.0 || ^0.5.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.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 '@vitejs/devtools': optional: true esbuild: optional: true jiti: optional: true less: 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@5.0.1: resolution: {integrity: sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^22.0.0 || >=24.0.0 '@vitest/browser-playwright': 5.0.1 '@vitest/browser-preview': 5.0.1 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 '@vitest/coverage-istanbul': 5.0.1 '@vitest/coverage-v8': 5.0.1 '@vitest/ui': 5.0.1 happy-dom: '*' jsdom: '*' vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true '@opentelemetry/api': optional: true '@types/node': optional: true '@vitest/browser-playwright': optional: true '@vitest/browser-preview': optional: true '@vitest/browser-webdriverio': optional: true '@vitest/coverage-istanbul': optional: true '@vitest/coverage-v8': optional: true '@vitest/ui': optional: true happy-dom: optional: true jsdom: optional: true vue-eslint-parser@10.4.1: resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} 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 word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} yaml-eslint-parser@2.1.0: resolution: {integrity: sha512-1zo9KRfp6vIAXBEhWAz09ex3hUwh3T+/6dGbGteHvNseA0Uk4FgQnPES55klZ6cDzSy9FpgKS0D/CoLUvCCj4w==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} yuku-ast@0.9.3: resolution: {integrity: sha512-Kt0PXlPCXdKF1fWFTl7N3DaxsVk6DHF8VAXHJMkwPtJnWYgbx20pYgGSweuC/86mIM7k1NUITQ4JffgOLUWTCw==} yuku-codegen@0.9.3: resolution: {integrity: sha512-7oTWwetHiMSyrVPFb8089lBBqkU1gaeQZyumNBJ0t5hocMQRaWhnMeSXTz7J1xm/rcw9+ePsajORdZbub2C35w==} yuku-parser@0.9.3: resolution: {integrity: sha512-96wPoHnwaXfkZv7UIOUkDb+s7ZH8lv8Qtg+MxdvHUV1LFa5jV9iKOaams1942YQt+krFQrWiD6lSg2ermv5kHA==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: '@andrewbranch/untar.js@1.0.4': {} '@arethetypeswrong/core@0.18.5': dependencies: '@andrewbranch/untar.js': 1.0.4 '@loaderkit/resolve': 1.0.6 cjs-module-lexer: 1.4.3 fflate: 0.8.3 lru-cache: 11.5.2 semver: 7.8.5 typescript: 5.6.1-rc validate-npm-package-name: 5.0.1 '@babel/helper-string-parser@7.29.7': {} '@babel/helper-validator-identifier@7.29.7': {} '@babel/parser@7.29.8': dependencies: '@babel/types': 7.29.8 '@babel/types@7.29.8': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 '@bcoe/v8-coverage@1.0.2': {} '@braidai/lang@1.1.2': {} '@cacheable/memory@2.2.0': dependencies: '@cacheable/utils': 2.5.0 '@keyv/bigmap': 1.3.1(keyv@5.6.0) hookified: 1.15.1 keyv: 5.6.0 '@cacheable/utils@2.5.0': dependencies: hashery: 1.5.1 keyv: 5.6.0 '@emnapi/core@1.11.1': dependencies: '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true '@emnapi/runtime@1.11.1': dependencies: tslib: 2.8.1 optional: true '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 optional: true '@es-joy/jsdoccomment@0.92.0': dependencies: '@types/estree': 1.0.9 '@typescript-eslint/types': 8.69.0 comment-parser: 1.4.7 esquery: 1.7.0 jsdoc-type-pratt-parser: 9.0.1 '@es-joy/jsdoccomment@0.96.0': dependencies: '@types/estree': 1.0.9 '@typescript-eslint/types': 8.69.0 comment-parser: 1.4.8 esquery: 1.7.0 jsdoc-type-pratt-parser: 9.2.1 '@es-joy/resolve.exports@1.2.0': {} '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.10.0(jiti@2.7.0))': dependencies: escape-string-regexp: 4.0.0 eslint: 10.10.0(jiti@2.7.0) ignore: 7.0.8 '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(jiti@2.7.0))': dependencies: eslint: 10.10.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} '@eslint/compat@2.1.1(eslint@10.10.0(jiti@2.7.0))': dependencies: '@eslint/core': 1.2.1 optionalDependencies: eslint: 10.10.0(jiti@2.7.0) '@eslint/config-array@0.23.5': dependencies: '@eslint/object-schema': 3.0.5 debug: 4.4.3 minimatch: 10.2.6 transitivePeerDependencies: - supports-color '@eslint/config-helpers@0.5.5': dependencies: '@eslint/core': 1.2.1 '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 '@eslint/css-tree@4.1.0': dependencies: mdn-data: 2.34.0 source-map-js: 1.2.1 '@eslint/js@10.0.1(eslint@10.10.0(jiti@2.7.0))': optionalDependencies: eslint: 10.10.0(jiti@2.7.0) '@eslint/markdown@8.0.3': dependencies: '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.3 github-slugger: 2.0.0 mdast-util-from-markdown: 2.0.3 mdast-util-frontmatter: 2.0.1 mdast-util-gfm: 3.1.0 mdast-util-math: 3.0.0 micromark-extension-frontmatter: 2.0.0 micromark-extension-gfm: 3.0.0 micromark-extension-math: 3.1.0 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color '@eslint/object-schema@3.0.5': {} '@eslint/plugin-kit@0.7.3': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 '@humanfs/node@0.16.8': dependencies: '@humanfs/core': 0.19.2 '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 '@humanfs/types@0.15.0': {} '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: hashery: 1.5.1 hookified: 1.15.1 keyv: 5.6.0 '@keyv/serialize@1.1.1': {} '@loaderkit/resolve@1.0.6': dependencies: '@braidai/lang': 1.1.2 '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 '@tybys/wasm-util': 0.10.3 optional: true '@ota-meshi/ast-token-store@0.3.0': {} '@oxc-parser/binding-android-arm-eabi@0.139.0': optional: true '@oxc-parser/binding-android-arm64@0.139.0': optional: true '@oxc-parser/binding-darwin-arm64@0.139.0': optional: true '@oxc-parser/binding-darwin-x64@0.139.0': optional: true '@oxc-parser/binding-freebsd-x64@0.139.0': optional: true '@oxc-parser/binding-linux-arm-gnueabihf@0.139.0': optional: true '@oxc-parser/binding-linux-arm-musleabihf@0.139.0': optional: true '@oxc-parser/binding-linux-arm64-gnu@0.139.0': optional: true '@oxc-parser/binding-linux-arm64-musl@0.139.0': optional: true '@oxc-parser/binding-linux-ppc64-gnu@0.139.0': optional: true '@oxc-parser/binding-linux-riscv64-gnu@0.139.0': optional: true '@oxc-parser/binding-linux-riscv64-musl@0.139.0': optional: true '@oxc-parser/binding-linux-s390x-gnu@0.139.0': optional: true '@oxc-parser/binding-linux-x64-gnu@0.139.0': optional: true '@oxc-parser/binding-linux-x64-musl@0.139.0': optional: true '@oxc-parser/binding-openharmony-arm64@0.139.0': optional: true '@oxc-parser/binding-wasm32-wasi@0.139.0': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true '@oxc-parser/binding-win32-arm64-msvc@0.139.0': optional: true '@oxc-parser/binding-win32-ia32-msvc@0.139.0': optional: true '@oxc-parser/binding-win32-x64-msvc@0.139.0': optional: true '@oxc-project/types@0.139.0': {} '@oxc-project/types@0.148.0': {} '@oxc-project/types@0.150.0': {} '@pkgr/core@0.3.6': {} '@prettier/plugin-oxc@0.2.3': dependencies: oxc-parser: 0.139.0 '@publint/pack@0.1.7': dependencies: tinyexec: 1.3.1 '@quansync/fs@1.0.0': dependencies: quansync: 1.0.0 '@rolldown/binding-android-arm-eabi@1.2.7': optional: true '@rolldown/binding-android-arm-eabi@1.2.9': optional: true '@rolldown/binding-android-arm64@1.2.7': optional: true '@rolldown/binding-android-arm64@1.2.9': optional: true '@rolldown/binding-darwin-arm64@1.2.7': optional: true '@rolldown/binding-darwin-arm64@1.2.9': optional: true '@rolldown/binding-darwin-x64@1.2.7': optional: true '@rolldown/binding-darwin-x64@1.2.9': optional: true '@rolldown/binding-freebsd-x64@1.2.7': optional: true '@rolldown/binding-freebsd-x64@1.2.9': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.2.7': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.2.9': optional: true '@rolldown/binding-linux-arm64-gnu@1.2.7': optional: true '@rolldown/binding-linux-arm64-gnu@1.2.9': optional: true '@rolldown/binding-linux-arm64-musl@1.2.7': optional: true '@rolldown/binding-linux-arm64-musl@1.2.9': optional: true '@rolldown/binding-linux-ppc64-gnu@1.2.7': optional: true '@rolldown/binding-linux-ppc64-gnu@1.2.9': optional: true '@rolldown/binding-linux-s390x-gnu@1.2.7': optional: true '@rolldown/binding-linux-s390x-gnu@1.2.9': optional: true '@rolldown/binding-linux-x64-gnu@1.2.7': optional: true '@rolldown/binding-linux-x64-gnu@1.2.9': optional: true '@rolldown/binding-linux-x64-musl@1.2.7': optional: true '@rolldown/binding-linux-x64-musl@1.2.9': optional: true '@rolldown/binding-openharmony-arm64@1.2.7': optional: true '@rolldown/binding-openharmony-arm64@1.2.9': optional: true '@rolldown/binding-win32-arm64-msvc@1.2.7': optional: true '@rolldown/binding-win32-arm64-msvc@1.2.9': optional: true '@rolldown/binding-win32-x64-msvc@1.2.7': optional: true '@rolldown/binding-win32-x64-msvc@1.2.9': optional: true '@rolldown/pluginutils@1.0.1': {} '@sindresorhus/base62@1.0.0': {} '@sxzz/eslint-config@8.6.0(@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/typescript-estree@8.69.0(typescript@6.0.3))(@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(prettier@3.9.8)(typescript@6.0.3)': dependencies: '@eslint-community/eslint-plugin-eslint-comments': 4.7.2(eslint@10.10.0(jiti@2.7.0)) '@eslint/js': 10.0.1(eslint@10.10.0(jiti@2.7.0)) '@eslint/markdown': 8.0.3 eslint: 10.10.0(jiti@2.7.0) eslint-config-flat-gitignore: 2.4.0(eslint@10.10.0(jiti@2.7.0)) eslint-config-prettier: 10.1.8(eslint@10.10.0(jiti@2.7.0)) eslint-flat-config-utils: 3.2.0 eslint-plugin-antfu: 3.2.3(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-baseline-js: 0.7.1(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-command: 4.0.0(@typescript-eslint/typescript-estree@8.69.0(typescript@6.0.3))(@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-de-morgan: 2.1.3(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-importer: 0.4.1(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-jsdoc: 64.3.5(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) eslint-plugin-jsonc: 3.4.2(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-n: 18.3.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) eslint-plugin-perfectionist: 5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) eslint-plugin-pnpm: 1.9.1(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-prettier: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(jiti@2.7.0)))(eslint@10.10.0(jiti@2.7.0))(prettier@3.9.8) eslint-plugin-regexp: 3.3.0(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-sxzz: 0.5.0(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-unicorn: 74.0.0(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-vue: 10.10.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.10.0(jiti@2.7.0))) eslint-plugin-yml: 3.8.1(eslint@10.10.0(jiti@2.7.0)) globals: 17.12.0 jsonc-eslint-parser: 3.3.0 typescript-eslint: 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) vue-eslint-parser: 10.4.1(eslint@10.10.0(jiti@2.7.0)) transitivePeerDependencies: - '@eslint/json' - '@stylistic/eslint-plugin' - '@types/eslint' - '@typescript-eslint/eslint-plugin' - '@typescript-eslint/parser' - '@typescript-eslint/typescript-estree' - '@typescript-eslint/utils' - prettier - supports-color - ts-declaration-location - typescript '@sxzz/prettier-config@2.3.3(prettier@3.9.8)': dependencies: '@prettier/plugin-oxc': 0.2.3 prettier: 3.9.8 '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 '@types/deep-eql@4.0.2': {} '@types/esrecurse@4.3.1': {} '@types/estree@1.0.9': {} '@types/hast@3.0.5': dependencies: '@types/unist': 3.0.3 '@types/json-schema@7.0.15': {} '@types/katex@0.16.8': {} '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 '@types/ms@2.1.0': {} '@types/node@26.6.1': dependencies: undici-types: 8.9.0 '@types/semver@7.8.0': {} '@types/unist@3.0.3': {} '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.69.0 '@typescript-eslint/type-utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.69.0 eslint: 10.10.0(jiti@2.7.0) ignore: 7.0.8 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.69.0 '@typescript-eslint/types': 8.69.0 '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3 eslint: 10.10.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/project-service@8.69.0(typescript@6.0.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) '@typescript-eslint/types': 8.69.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/scope-manager@8.69.0': dependencies: '@typescript-eslint/types': 8.69.0 '@typescript-eslint/visitor-keys': 8.69.0 '@typescript-eslint/tsconfig-utils@8.69.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 '@typescript-eslint/type-utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.69.0 '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 eslint: 10.10.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.69.0': {} '@typescript-eslint/typescript-estree@8.69.0(typescript@6.0.3)': dependencies: '@typescript-eslint/project-service': 8.69.0(typescript@6.0.3) '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) '@typescript-eslint/types': 8.69.0 '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3 minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.69.0 '@typescript-eslint/types': 8.69.0 '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) eslint: 10.10.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color '@typescript-eslint/visitor-keys@8.69.0': dependencies: '@typescript-eslint/types': 8.69.0 eslint-visitor-keys: 5.0.1 '@typescript/typescript-aix-ppc64@7.0.2': optional: true '@typescript/typescript-darwin-arm64@7.0.2': optional: true '@typescript/typescript-darwin-x64@7.0.2': optional: true '@typescript/typescript-freebsd-arm64@7.0.2': optional: true '@typescript/typescript-freebsd-x64@7.0.2': optional: true '@typescript/typescript-linux-arm64@7.0.2': optional: true '@typescript/typescript-linux-arm@7.0.2': optional: true '@typescript/typescript-linux-loong64@7.0.2': optional: true '@typescript/typescript-linux-mips64el@7.0.2': optional: true '@typescript/typescript-linux-ppc64@7.0.2': optional: true '@typescript/typescript-linux-riscv64@7.0.2': optional: true '@typescript/typescript-linux-s390x@7.0.2': optional: true '@typescript/typescript-linux-x64@7.0.2': optional: true '@typescript/typescript-netbsd-arm64@7.0.2': optional: true '@typescript/typescript-netbsd-x64@7.0.2': optional: true '@typescript/typescript-openbsd-arm64@7.0.2': optional: true '@typescript/typescript-openbsd-x64@7.0.2': optional: true '@typescript/typescript-sunos-x64@7.0.2': optional: true '@typescript/typescript-win32-arm64@7.0.2': optional: true '@typescript/typescript-win32-x64@7.0.2': optional: true '@vitest/coverage-v8@5.0.1(vitest@5.0.1)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/istanbul-lib-coverage': 1.0.1 '@vitest/istanbul-lib-report': 1.0.1 ast-v8-to-istanbul: 1.0.5 magicast: 0.5.4 obug: 2.1.4 std-env: 4.2.0 tinyrainbow: 3.1.1 vitest: 5.0.1(@types/node@26.6.1)(@vitest/coverage-v8@5.0.1)(vite@8.2.2(@types/node@26.6.1)(jiti@2.7.0)(yaml@2.9.0)) '@vitest/istanbul-lib-coverage@1.0.1': {} '@vitest/istanbul-lib-report@1.0.1': dependencies: '@vitest/istanbul-lib-coverage': 1.0.1 '@vitest/mocker@5.0.1(vite@8.2.2(@types/node@26.6.1)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.1 estree-walker: 3.0.3 magic-string: 1.2.3 optionalDependencies: vite: 8.2.2(@types/node@26.6.1)(jiti@2.7.0)(yaml@2.9.0) '@vitest/spy@5.0.1': {} '@yuku-codegen/binding-android-arm64@0.9.3': optional: true '@yuku-codegen/binding-darwin-arm64@0.9.3': optional: true '@yuku-codegen/binding-darwin-x64@0.9.3': optional: true '@yuku-codegen/binding-freebsd-x64@0.9.3': optional: true '@yuku-codegen/binding-linux-arm-gnu@0.9.3': optional: true '@yuku-codegen/binding-linux-arm-musl@0.9.3': optional: true '@yuku-codegen/binding-linux-arm64-gnu@0.9.3': optional: true '@yuku-codegen/binding-linux-arm64-musl@0.9.3': optional: true '@yuku-codegen/binding-linux-x64-gnu@0.9.3': optional: true '@yuku-codegen/binding-linux-x64-musl@0.9.3': optional: true '@yuku-codegen/binding-win32-arm64@0.9.3': optional: true '@yuku-codegen/binding-win32-x64@0.9.3': optional: true '@yuku-parser/binding-android-arm64@0.9.3': optional: true '@yuku-parser/binding-darwin-arm64@0.9.3': optional: true '@yuku-parser/binding-darwin-x64@0.9.3': optional: true '@yuku-parser/binding-freebsd-x64@0.9.3': optional: true '@yuku-parser/binding-linux-arm-gnu@0.9.3': optional: true '@yuku-parser/binding-linux-arm-musl@0.9.3': optional: true '@yuku-parser/binding-linux-arm64-gnu@0.9.3': optional: true '@yuku-parser/binding-linux-arm64-musl@0.9.3': optional: true '@yuku-parser/binding-linux-x64-gnu@0.9.3': optional: true '@yuku-parser/binding-linux-x64-musl@0.9.3': optional: true '@yuku-parser/binding-win32-arm64@0.9.3': optional: true '@yuku-parser/binding-win32-x64@0.9.3': optional: true '@yuku-toolchain/types@0.9.3': {} acorn-jsx@5.3.2(acorn@8.18.0): dependencies: acorn: 8.18.0 acorn@8.18.0: {} ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 are-docs-informative@0.1.1: {} args-tokenizer@0.3.0: {} assertion-error@2.0.1: {} ast-v8-to-istanbul@1.0.5: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 js-tokens: 10.0.0 balanced-match@4.0.4: {} baseline-browser-mapping@2.11.21: {} boolbase@1.0.0: {} brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 browserslist@4.28.8: dependencies: baseline-browser-mapping: 2.11.21 caniuse-lite: 1.0.30001810 electron-to-chromium: 1.5.421 node-releases: 2.0.54 update-browserslist-db: 1.3.2(browserslist@4.28.8) builtin-modules@5.3.0: {} bumpp@12.3.0: dependencies: args-tokenizer: 0.3.0 cac: 7.0.0 jsonc-parser: 3.3.1 package-manager-detector: 1.8.0 tinyexec: 1.3.1 tinyglobby: 0.2.17 unconfig: 7.5.0 verkit: 0.4.0 yaml: 2.9.0 cac@7.0.0: {} cacheable@2.5.0: dependencies: '@cacheable/memory': 2.2.0 '@cacheable/utils': 2.5.0 hookified: 1.15.1 keyv: 5.6.0 qified: 0.10.1 caniuse-lite@1.0.30001810: {} ccount@2.0.1: {} chai@6.2.2: {} change-case@5.4.4: {} character-entities@2.0.2: {} ci-info@4.4.0: {} cjs-module-lexer@1.4.3: {} commander@8.3.0: {} comment-parser@1.4.7: {} comment-parser@1.4.8: {} convert-hrtime@5.0.0: {} core-js-compat@3.50.0: dependencies: browserslist: 4.28.8 cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 cssesc@3.0.0: {} debug@4.4.3: dependencies: ms: 2.1.3 decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 deep-is@0.1.4: {} defu@6.1.7: {} dequal@2.0.3: {} detect-indent@7.0.2: {} detect-libc@2.1.2: {} devlop@1.1.0: dependencies: dequal: 2.0.3 diff-sequences@29.6.3: {} dts-resolver@3.0.0: {} electron-to-chromium@1.5.421: {} empathic@2.0.1: {} enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 entities@8.0.0: {} es-module-lexer@2.3.2: {} escalade@3.2.0: {} escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} eslint-compat-utils@0.5.1(eslint@10.10.0(jiti@2.7.0)): dependencies: eslint: 10.10.0(jiti@2.7.0) semver: 7.8.5 eslint-config-flat-gitignore@2.4.0(eslint@10.10.0(jiti@2.7.0)): dependencies: '@eslint/compat': 2.1.1(eslint@10.10.0(jiti@2.7.0)) eslint: 10.10.0(jiti@2.7.0) eslint-config-prettier@10.1.8(eslint@10.10.0(jiti@2.7.0)): dependencies: eslint: 10.10.0(jiti@2.7.0) eslint-flat-config-utils@3.2.0: dependencies: '@eslint/config-helpers': 0.5.5 pathe: 2.0.3 eslint-json-compat-utils@0.2.3(eslint@10.10.0(jiti@2.7.0))(jsonc-eslint-parser@3.3.0): dependencies: eslint: 10.10.0(jiti@2.7.0) esquery: 1.7.0 jsonc-eslint-parser: 3.3.0 eslint-plugin-antfu@3.2.3(eslint@10.10.0(jiti@2.7.0)): dependencies: eslint: 10.10.0(jiti@2.7.0) eslint-plugin-baseline-js@0.7.1(eslint@10.10.0(jiti@2.7.0)): dependencies: eslint: 10.10.0(jiti@2.7.0) eslint-plugin-es-x: 9.7.0(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-command@4.0.0(@typescript-eslint/typescript-estree@8.69.0(typescript@6.0.3))(@typescript-eslint/utils@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)): dependencies: '@es-joy/jsdoccomment': 0.92.0 '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) eslint: 10.10.0(jiti@2.7.0) eslint-plugin-de-morgan@2.1.3(eslint@10.10.0(jiti@2.7.0)): dependencies: eslint: 10.10.0(jiti@2.7.0) eslint-plugin-es-x@7.8.0(eslint@10.10.0(jiti@2.7.0)): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 eslint: 10.10.0(jiti@2.7.0) eslint-compat-utils: 0.5.1(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-es-x@9.7.0(eslint@10.10.0(jiti@2.7.0)): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 eslint: 10.10.0(jiti@2.7.0) eslint-type-tracer: 0.5.2(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-importer@0.4.1(eslint@10.10.0(jiti@2.7.0)): dependencies: eslint: 10.10.0(jiti@2.7.0) eslint-plugin-jsdoc@64.3.5(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): dependencies: '@es-joy/jsdoccomment': 0.96.0 '@es-joy/resolve.exports': 1.2.0 '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) are-docs-informative: 0.1.1 comment-parser: 1.4.8 debug: 4.4.3 escape-string-regexp: 5.0.0 eslint: 10.10.0(jiti@2.7.0) espree: 11.2.0 esquery: 1.7.0 html-entities: 2.6.0 object-deep-merge: 2.0.1 parse-imports-exports: 0.2.4 semver: 7.8.5 spdx-expression-parse: 5.0.0 to-valid-identifier: 1.0.0 transitivePeerDependencies: - supports-color - typescript eslint-plugin-jsonc@3.4.2(eslint@10.10.0(jiti@2.7.0)): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.3 '@ota-meshi/ast-token-store': 0.3.0 diff-sequences: 29.6.3 eslint: 10.10.0(jiti@2.7.0) eslint-json-compat-utils: 0.2.3(eslint@10.10.0(jiti@2.7.0))(jsonc-eslint-parser@3.3.0) jsonc-eslint-parser: 3.3.0 natural-compare: 1.4.0 synckit: 0.11.13 transitivePeerDependencies: - '@eslint/json' eslint-plugin-n@18.3.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) enhanced-resolve: 5.24.5 eslint: 10.10.0(jiti@2.7.0) eslint-plugin-es-x: 7.8.0(eslint@10.10.0(jiti@2.7.0)) get-tsconfig: 4.14.3 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 semver: 7.8.5 optionalDependencies: typescript: 6.0.3 eslint-plugin-perfectionist@5.11.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): dependencies: '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) eslint: 10.10.0(jiti@2.7.0) natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript eslint-plugin-pnpm@1.9.1(eslint@10.10.0(jiti@2.7.0)): dependencies: empathic: 2.0.1 eslint: 10.10.0(jiti@2.7.0) eslint-json-compat-utils: 0.2.3(eslint@10.10.0(jiti@2.7.0))(jsonc-eslint-parser@3.3.0) jsonc-eslint-parser: 3.3.0 pathe: 2.0.3 pnpm-workspace-yaml: 1.9.1 tinyglobby: 0.2.17 yaml: 2.9.0 yaml-eslint-parser: 2.1.0 transitivePeerDependencies: - '@eslint/json' eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(jiti@2.7.0)))(eslint@10.10.0(jiti@2.7.0))(prettier@3.9.8): dependencies: eslint: 10.10.0(jiti@2.7.0) prettier: 3.9.8 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: eslint-config-prettier: 10.1.8(eslint@10.10.0(jiti@2.7.0)) eslint-plugin-regexp@3.3.0(eslint@10.10.0(jiti@2.7.0)): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 comment-parser: 1.4.8 eslint: 10.10.0(jiti@2.7.0) jsdoc-type-pratt-parser: 9.2.1 refa: 0.12.1 regexp-ast-analysis: 0.7.1 scslre: 0.3.0 eslint-plugin-sxzz@0.5.0(eslint@10.10.0(jiti@2.7.0)): dependencies: eslint: 10.10.0(jiti@2.7.0) eslint-plugin-unicorn@74.0.0(eslint@10.10.0(jiti@2.7.0)): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) '@eslint/css-tree': 4.1.0 browserslist: 4.28.8 change-case: 5.4.4 ci-info: 4.4.0 core-js-compat: 3.50.0 detect-indent: 7.0.2 entities: 8.0.0 eslint: 10.10.0(jiti@2.7.0) find-up-simple: 1.0.1 globals: 17.12.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 is-identifier: 1.1.0 pluralize: 8.0.0 quote-js-string: 0.1.0 regjsparser: 0.13.2 reserved-identifiers: 1.2.0 semver: 7.8.5 strip-indent: 4.1.1 yaml: 2.9.0 eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0)): dependencies: eslint: 10.10.0(jiti@2.7.0) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) eslint-plugin-vue@10.10.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.10.0(jiti@2.7.0))): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) eslint: 10.10.0(jiti@2.7.0) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 7.1.6 semver: 7.8.5 vue-eslint-parser: 10.4.1(eslint@10.10.0(jiti@2.7.0)) xml-name-validator: 5.0.0 optionalDependencies: '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) eslint-plugin-yml@3.8.1(eslint@10.10.0(jiti@2.7.0)): dependencies: '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.3 '@ota-meshi/ast-token-store': 0.3.0 diff-sequences: 29.6.3 escape-string-regexp: 5.0.0 eslint: 10.10.0(jiti@2.7.0) natural-compare: 1.4.0 yaml-eslint-parser: 2.1.0 eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 eslint-type-tracer@0.5.2(eslint@10.10.0(jiti@2.7.0)): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) eslint: 10.10.0(jiti@2.7.0) eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@5.0.1: {} eslint@10.10.0(jiti@2.7.0): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.3 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 11.1.5 find-up: 5.0.0 glob-parent: 6.0.2 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 minimatch: 10.2.6 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: jiti: 2.7.0 transitivePeerDependencies: - supports-color espree@11.2.0: dependencies: acorn: 8.18.0 acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 5.0.1 esquery@1.7.0: dependencies: estraverse: 5.3.0 esrecurse@4.3.0: dependencies: estraverse: 5.3.0 estraverse@5.3.0: {} estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 esutils@2.0.3: {} expect-type@1.4.0: {} fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} fault@2.0.1: dependencies: format: 0.2.2 fdir@6.5.0(picomatch@4.0.7): optionalDependencies: picomatch: 4.0.7 fflate@0.8.3: {} file-entry-cache@11.1.5: dependencies: flat-cache: 6.1.23 find-up-simple@1.0.1: {} find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 flat-cache@6.1.23: dependencies: cacheable: 2.5.0 flatted: 3.4.4 hookified: 1.15.1 flatted@3.4.4: {} format@0.2.2: {} fsevents@2.3.3: optional: true function-timeout@1.0.2: {} get-tsconfig@4.14.3: dependencies: resolve-pkg-maps: 1.0.0 get-tsconfig@5.0.0-beta.6: dependencies: resolve-pkg-maps: 1.0.0 github-slugger@2.0.0: {} glob-parent@6.0.2: dependencies: is-glob: 4.0.3 globals@15.15.0: {} globals@17.12.0: {} globrex@0.1.2: {} graceful-fs@4.2.11: {} hashery@1.5.1: dependencies: hookified: 1.15.1 hookable@6.1.1: {} hookified@1.15.1: {} hookified@2.2.0: {} html-entities@2.6.0: {} identifier-regex@1.1.0: dependencies: reserved-identifiers: 1.2.0 ignore@5.3.2: {} ignore@7.0.8: {} import-without-cache@0.4.0: {} imurmurhash@0.1.4: {} indent-string@5.0.0: {} is-builtin-module@5.0.0: dependencies: builtin-modules: 5.3.0 is-extglob@2.1.1: {} is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-identifier@1.1.0: dependencies: identifier-regex: 1.1.0 super-regex: 1.1.0 isexe@2.0.0: {} jiti@2.7.0: {} js-tokens@10.0.0: {} jsdoc-type-pratt-parser@9.0.1: dependencies: '@types/estree': 1.0.9 jsdoc-type-pratt-parser@9.2.1: dependencies: '@types/estree': 1.0.9 '@types/node': 26.6.1 jsesc@3.1.0: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} jsonc-eslint-parser@3.3.0: dependencies: acorn: 8.18.0 eslint-visitor-keys: 5.0.1 verkit: 0.3.2 jsonc-parser@3.3.1: {} katex@0.16.47: dependencies: commander: 8.3.0 keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 lightningcss-android-arm64@1.33.0: optional: true lightningcss-darwin-arm64@1.33.0: optional: true lightningcss-darwin-x64@1.33.0: optional: true lightningcss-freebsd-x64@1.33.0: optional: true lightningcss-linux-arm-gnueabihf@1.33.0: optional: true lightningcss-linux-arm64-gnu@1.33.0: optional: true lightningcss-linux-arm64-musl@1.33.0: optional: true lightningcss-linux-x64-gnu@1.33.0: optional: true lightningcss-linux-x64-musl@1.33.0: optional: true lightningcss-win32-arm64-msvc@1.33.0: optional: true lightningcss-win32-x64-msvc@1.33.0: optional: true lightningcss@1.33.0: dependencies: detect-libc: 2.1.2 optionalDependencies: lightningcss-android-arm64: 1.33.0 lightningcss-darwin-arm64: 1.33.0 lightningcss-darwin-x64: 1.33.0 lightningcss-freebsd-x64: 1.33.0 lightningcss-linux-arm-gnueabihf: 1.33.0 lightningcss-linux-arm64-gnu: 1.33.0 lightningcss-linux-arm64-musl: 1.33.0 lightningcss-linux-x64-gnu: 1.33.0 lightningcss-linux-x64-musl: 1.33.0 lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 locate-path@6.0.0: dependencies: p-locate: 5.0.0 longest-streak@3.1.0: {} lru-cache@11.5.2: {} magic-string@1.2.3: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 magicast@0.5.4: dependencies: '@babel/parser': 7.29.8 '@babel/types': 7.29.8 source-map-js: 1.2.1 make-asynchronous@1.1.0: dependencies: p-event: 6.0.1 type-fest: 4.41.0 web-worker: 1.5.0 markdown-table@3.0.4: {} mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 mdast-util-from-markdown@2.0.3: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color mdast-util-frontmatter@2.0.1: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: - supports-color mdast-util-gfm-autolink-literal@2.0.1: dependencies: '@types/mdast': 4.0.4 ccount: 2.0.1 devlop: 1.1.0 mdast-util-find-and-replace: 3.0.2 micromark-util-character: 2.1.1 mdast-util-gfm-footnote@2.1.0: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm-table@2.0.0: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm-task-list-item@2.0.0: dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-gfm@3.1.0: dependencies: mdast-util-from-markdown: 2.0.3 mdast-util-gfm-autolink-literal: 2.0.1 mdast-util-gfm-footnote: 2.1.0 mdast-util-gfm-strikethrough: 2.0.0 mdast-util-gfm-table: 2.0.0 mdast-util-gfm-task-list-item: 2.0.0 mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color mdast-util-math@3.0.0: dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 longest-streak: 3.1.0 mdast-util-from-markdown: 2.0.3 mdast-util-to-markdown: 2.1.2 unist-util-remove-position: 5.0.0 transitivePeerDependencies: - supports-color mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 unist-util-is: 6.0.1 mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 longest-streak: 3.1.0 mdast-util-phrasing: 4.1.0 mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 unist-util-visit: 5.1.0 zwitch: 2.0.4 mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 mdn-data@2.34.0: {} micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 micromark-factory-space: 2.0.1 micromark-factory-title: 2.0.1 micromark-factory-whitespace: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 micromark-util-classify-character: 2.0.1 micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-extension-frontmatter@2.0.0: dependencies: fault: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-extension-gfm-autolink-literal@2.1.0: dependencies: micromark-util-character: 2.1.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-extension-gfm-footnote@2.1.0: dependencies: devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-extension-gfm-strikethrough@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-classify-character: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-extension-gfm-table@2.1.1: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-extension-gfm-tagfilter@2.0.0: dependencies: micromark-util-types: 2.0.2 micromark-extension-gfm-task-list-item@2.1.0: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-extension-gfm@3.0.0: dependencies: micromark-extension-gfm-autolink-literal: 2.1.0 micromark-extension-gfm-footnote: 2.1.0 micromark-extension-gfm-strikethrough: 2.1.0 micromark-extension-gfm-table: 2.1.1 micromark-extension-gfm-tagfilter: 2.0.0 micromark-extension-gfm-task-list-item: 2.1.0 micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 micromark-extension-math@3.1.0: dependencies: '@types/katex': 0.16.8 devlop: 1.1.0 katex: 0.16.47 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-classify-character@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: micromark-util-symbol: 2.0.1 micromark-util-decode-string@2.0.1: dependencies: decode-named-character-reference: 1.3.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 micromark-util-encode@2.0.1: {} micromark-util-html-tag-name@2.0.1: {} micromark-util-normalize-identifier@2.0.1: dependencies: micromark-util-symbol: 2.0.1 micromark-util-resolve-all@2.0.1: dependencies: micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} micromark-util-types@2.0.2: {} micromark@4.0.2: dependencies: '@types/debug': 4.1.13 debug: 4.4.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 micromark-util-combine-extensions: 2.0.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-encode: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color minimatch@10.2.6: dependencies: brace-expansion: 5.0.9 mri@1.2.0: {} ms@2.1.3: {} nanoid@3.3.18: {} natural-compare@1.4.0: {} natural-orderby@5.0.0: {} node-releases@2.0.54: {} nth-check@2.1.1: dependencies: boolbase: 1.0.0 object-deep-merge@2.0.1: {} obug@2.1.4: {} optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 oxc-parser@0.139.0: dependencies: '@oxc-project/types': 0.139.0 optionalDependencies: '@oxc-parser/binding-android-arm-eabi': 0.139.0 '@oxc-parser/binding-android-arm64': 0.139.0 '@oxc-parser/binding-darwin-arm64': 0.139.0 '@oxc-parser/binding-darwin-x64': 0.139.0 '@oxc-parser/binding-freebsd-x64': 0.139.0 '@oxc-parser/binding-linux-arm-gnueabihf': 0.139.0 '@oxc-parser/binding-linux-arm-musleabihf': 0.139.0 '@oxc-parser/binding-linux-arm64-gnu': 0.139.0 '@oxc-parser/binding-linux-arm64-musl': 0.139.0 '@oxc-parser/binding-linux-ppc64-gnu': 0.139.0 '@oxc-parser/binding-linux-riscv64-gnu': 0.139.0 '@oxc-parser/binding-linux-riscv64-musl': 0.139.0 '@oxc-parser/binding-linux-s390x-gnu': 0.139.0 '@oxc-parser/binding-linux-x64-gnu': 0.139.0 '@oxc-parser/binding-linux-x64-musl': 0.139.0 '@oxc-parser/binding-openharmony-arm64': 0.139.0 '@oxc-parser/binding-wasm32-wasi': 0.139.0 '@oxc-parser/binding-win32-arm64-msvc': 0.139.0 '@oxc-parser/binding-win32-ia32-msvc': 0.139.0 '@oxc-parser/binding-win32-x64-msvc': 0.139.0 p-event@6.0.1: dependencies: p-timeout: 6.1.4 p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 p-locate@5.0.0: dependencies: p-limit: 3.1.0 p-timeout@6.1.4: {} package-manager-detector@1.8.0: {} parse-imports-exports@0.2.4: dependencies: parse-statements: 1.0.11 parse-statements@1.0.11: {} path-exists@4.0.0: {} path-key@3.1.1: {} pathe@2.0.3: {} picocolors@1.1.1: {} picomatch@4.0.7: {} pluralize@8.0.0: {} pnpm-workspace-yaml@1.9.1: dependencies: yaml: 2.9.0 postcss-selector-parser@7.1.6: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 postcss@8.5.28: dependencies: nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.1: dependencies: fast-diff: 1.3.0 prettier@3.9.8: {} publint@0.3.24: dependencies: '@publint/pack': 0.1.7 package-manager-detector: 1.8.0 picocolors: 1.1.1 sade: 1.8.1 punycode@2.3.1: {} qified@0.10.1: dependencies: hookified: 2.2.0 quansync@1.0.0: {} quote-js-string@0.1.0: {} refa@0.12.1: dependencies: '@eslint-community/regexpp': 4.12.2 regexp-ast-analysis@0.7.1: dependencies: '@eslint-community/regexpp': 4.12.2 refa: 0.12.1 regjsparser@0.13.2: dependencies: jsesc: 3.1.0 reserved-identifiers@1.2.0: {} resolve-pkg-maps@1.0.0: {} rolldown-plugin-dts@0.28.5(rolldown@1.2.9)(typescript@6.0.3)(typescript@7.0.2): dependencies: dts-resolver: 3.0.0 get-tsconfig: 5.0.0-beta.6 obug: 2.1.4 rolldown: 1.2.9 yuku-ast: 0.9.3 yuku-codegen: 0.9.3 yuku-parser: 0.9.3 optionalDependencies: '@typescript/native-preview': typescript@7.0.2 typescript: 6.0.3 transitivePeerDependencies: - oxc-resolver rolldown@1.2.7: dependencies: '@oxc-project/types': 0.148.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: '@rolldown/binding-android-arm-eabi': 1.2.7 '@rolldown/binding-android-arm64': 1.2.7 '@rolldown/binding-darwin-arm64': 1.2.7 '@rolldown/binding-darwin-x64': 1.2.7 '@rolldown/binding-freebsd-x64': 1.2.7 '@rolldown/binding-linux-arm-gnueabihf': 1.2.7 '@rolldown/binding-linux-arm64-gnu': 1.2.7 '@rolldown/binding-linux-arm64-musl': 1.2.7 '@rolldown/binding-linux-ppc64-gnu': 1.2.7 '@rolldown/binding-linux-s390x-gnu': 1.2.7 '@rolldown/binding-linux-x64-gnu': 1.2.7 '@rolldown/binding-linux-x64-musl': 1.2.7 '@rolldown/binding-openharmony-arm64': 1.2.7 '@rolldown/binding-win32-arm64-msvc': 1.2.7 '@rolldown/binding-win32-x64-msvc': 1.2.7 rolldown@1.2.9: dependencies: '@oxc-project/types': 0.150.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: '@rolldown/binding-android-arm-eabi': 1.2.9 '@rolldown/binding-android-arm64': 1.2.9 '@rolldown/binding-darwin-arm64': 1.2.9 '@rolldown/binding-darwin-x64': 1.2.9 '@rolldown/binding-freebsd-x64': 1.2.9 '@rolldown/binding-linux-arm-gnueabihf': 1.2.9 '@rolldown/binding-linux-arm64-gnu': 1.2.9 '@rolldown/binding-linux-arm64-musl': 1.2.9 '@rolldown/binding-linux-ppc64-gnu': 1.2.9 '@rolldown/binding-linux-s390x-gnu': 1.2.9 '@rolldown/binding-linux-x64-gnu': 1.2.9 '@rolldown/binding-linux-x64-musl': 1.2.9 '@rolldown/binding-openharmony-arm64': 1.2.9 '@rolldown/binding-win32-arm64-msvc': 1.2.9 '@rolldown/binding-win32-x64-msvc': 1.2.9 sade@1.8.1: dependencies: mri: 1.2.0 scslre@0.3.0: dependencies: '@eslint-community/regexpp': 4.12.2 refa: 0.12.1 regexp-ast-analysis: 0.7.1 semver@7.8.5: {} shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} siginfo@2.0.0: {} source-map-js@1.2.1: {} spdx-exceptions@2.5.0: {} spdx-expression-parse@5.0.0: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.23 spdx-license-ids@3.0.23: {} stackback@0.0.2: {} std-env@4.2.0: {} strip-indent@4.1.1: {} super-regex@1.1.0: dependencies: function-timeout: 1.0.2 make-asynchronous: 1.1.0 time-span: 5.1.0 synckit@0.11.13: dependencies: '@pkgr/core': 0.3.6 tapable@2.3.3: {} time-span@5.1.0: dependencies: convert-hrtime: 5.0.0 tinybench@6.1.4: {} tinyexec@1.3.0: {} tinyexec@1.3.1: {} tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 tinyrainbow@3.1.1: {} to-valid-identifier@1.0.0: dependencies: '@sindresorhus/base62': 1.0.0 reserved-identifiers: 1.2.0 tree-kill@1.2.2: {} ts-api-utils@2.5.0(typescript@6.0.3): dependencies: typescript: 6.0.3 tsdown-preset-sxzz@0.7.1(tsdown@0.23.0(@arethetypeswrong/core@0.18.5)(publint@0.3.24)(typescript@6.0.3)(typescript@7.0.2)): dependencies: '@arethetypeswrong/core': 0.18.5 publint: 0.3.24 tsdown: 0.23.0(@arethetypeswrong/core@0.18.5)(publint@0.3.24)(typescript@6.0.3)(typescript@7.0.2) tsdown@0.23.0(@arethetypeswrong/core@0.18.5)(publint@0.3.24)(typescript@6.0.3)(typescript@7.0.2): dependencies: cac: 7.0.0 defu: 6.1.7 empathic: 2.0.1 hookable: 6.1.1 import-without-cache: 0.4.0 obug: 2.1.4 picomatch: 4.0.7 rolldown: 1.2.9 rolldown-plugin-dts: 0.28.5(rolldown@1.2.9)(typescript@6.0.3)(typescript@7.0.2) tinyexec: 1.3.1 tinyglobby: 0.2.17 tree-kill: 1.2.2 unconfig-core: 7.5.0 verkit: 0.4.0 optionalDependencies: '@arethetypeswrong/core': 0.18.5 publint: 0.3.24 typescript: 6.0.3 transitivePeerDependencies: - '@typescript/native-preview' - '@volar/typescript' - oxc-resolver - vue-tsc tslib@2.8.1: optional: true type-check@0.4.0: dependencies: prelude-ls: 1.2.1 type-fest@4.41.0: {} typescript-eslint@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3): dependencies: '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) '@typescript-eslint/utils': 8.69.0(eslint@10.10.0(jiti@2.7.0))(typescript@6.0.3) eslint: 10.10.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color typescript@5.6.1-rc: {} typescript@6.0.3: {} typescript@7.0.2: optionalDependencies: '@typescript/typescript-aix-ppc64': 7.0.2 '@typescript/typescript-darwin-arm64': 7.0.2 '@typescript/typescript-darwin-x64': 7.0.2 '@typescript/typescript-freebsd-arm64': 7.0.2 '@typescript/typescript-freebsd-x64': 7.0.2 '@typescript/typescript-linux-arm': 7.0.2 '@typescript/typescript-linux-arm64': 7.0.2 '@typescript/typescript-linux-loong64': 7.0.2 '@typescript/typescript-linux-mips64el': 7.0.2 '@typescript/typescript-linux-ppc64': 7.0.2 '@typescript/typescript-linux-riscv64': 7.0.2 '@typescript/typescript-linux-s390x': 7.0.2 '@typescript/typescript-linux-x64': 7.0.2 '@typescript/typescript-netbsd-arm64': 7.0.2 '@typescript/typescript-netbsd-x64': 7.0.2 '@typescript/typescript-openbsd-arm64': 7.0.2 '@typescript/typescript-openbsd-x64': 7.0.2 '@typescript/typescript-sunos-x64': 7.0.2 '@typescript/typescript-win32-arm64': 7.0.2 '@typescript/typescript-win32-x64': 7.0.2 unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 quansync: 1.0.0 unconfig@7.5.0: dependencies: '@quansync/fs': 1.0.0 defu: 6.1.7 jiti: 2.7.0 quansync: 1.0.0 unconfig-core: 7.5.0 undici-types@8.9.0: {} unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.3 unist-util-visit: 5.1.0 unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.1 unist-util-visit@5.1.0: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 update-browserslist-db@1.3.2(browserslist@4.28.8): dependencies: browserslist: 4.28.8 escalade: 3.2.0 picocolors: 1.1.1 uri-js@4.4.1: dependencies: punycode: 2.3.1 util-deprecate@1.0.2: {} validate-npm-package-name@5.0.1: {} verkit@0.3.2: {} verkit@0.4.0: {} vite@8.2.2(@types/node@26.6.1)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 postcss: 8.5.28 rolldown: 1.2.7 tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.6.1 fsevents: 2.3.3 jiti: 2.7.0 yaml: 2.9.0 vitest@5.0.1(@types/node@26.6.1)(@vitest/coverage-v8@5.0.1)(vite@8.2.2(@types/node@26.6.1)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@types/chai': 5.2.3 '@vitest/mocker': 5.0.1(vite@8.2.2(@types/node@26.6.1)(jiti@2.7.0)(yaml@2.9.0)) chai: 6.2.2 es-module-lexer: 2.3.2 expect-type: 1.4.0 magic-string: 1.2.3 obug: 2.1.4 picomatch: 4.0.7 std-env: 4.2.0 tinybench: 6.1.4 tinyexec: 1.3.0 tinyglobby: 0.2.17 vite: 8.2.2(@types/node@26.6.1)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.6.1 '@vitest/coverage-v8': 5.0.1(vitest@5.0.1) transitivePeerDependencies: - msw vue-eslint-parser@10.4.1(eslint@10.10.0(jiti@2.7.0)): dependencies: debug: 4.4.3 eslint: 10.10.0(jiti@2.7.0) eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 espree: 11.2.0 esquery: 1.7.0 semver: 7.8.5 transitivePeerDependencies: - supports-color web-worker@1.5.0: {} which@2.0.2: dependencies: isexe: 2.0.0 why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 stackback: 0.0.2 word-wrap@1.2.5: {} xml-name-validator@5.0.0: {} yaml-eslint-parser@2.1.0: dependencies: eslint-visitor-keys: 5.0.1 yaml: 2.9.0 yaml@2.9.0: {} yocto-queue@0.1.0: {} yuku-ast@0.9.3: dependencies: '@yuku-toolchain/types': 0.9.3 yuku-codegen@0.9.3: dependencies: '@yuku-toolchain/types': 0.9.3 optionalDependencies: '@yuku-codegen/binding-android-arm64': 0.9.3 '@yuku-codegen/binding-darwin-arm64': 0.9.3 '@yuku-codegen/binding-darwin-x64': 0.9.3 '@yuku-codegen/binding-freebsd-x64': 0.9.3 '@yuku-codegen/binding-linux-arm-gnu': 0.9.3 '@yuku-codegen/binding-linux-arm-musl': 0.9.3 '@yuku-codegen/binding-linux-arm64-gnu': 0.9.3 '@yuku-codegen/binding-linux-arm64-musl': 0.9.3 '@yuku-codegen/binding-linux-x64-gnu': 0.9.3 '@yuku-codegen/binding-linux-x64-musl': 0.9.3 '@yuku-codegen/binding-win32-arm64': 0.9.3 '@yuku-codegen/binding-win32-x64': 0.9.3 yuku-parser@0.9.3: dependencies: '@yuku-toolchain/types': 0.9.3 yuku-ast: 0.9.3 optionalDependencies: '@yuku-parser/binding-android-arm64': 0.9.3 '@yuku-parser/binding-darwin-arm64': 0.9.3 '@yuku-parser/binding-darwin-x64': 0.9.3 '@yuku-parser/binding-freebsd-x64': 0.9.3 '@yuku-parser/binding-linux-arm-gnu': 0.9.3 '@yuku-parser/binding-linux-arm-musl': 0.9.3 '@yuku-parser/binding-linux-arm64-gnu': 0.9.3 '@yuku-parser/binding-linux-arm64-musl': 0.9.3 '@yuku-parser/binding-linux-x64-gnu': 0.9.3 '@yuku-parser/binding-linux-x64-musl': 0.9.3 '@yuku-parser/binding-win32-arm64': 0.9.3 '@yuku-parser/binding-win32-x64': 0.9.3 zwitch@2.0.4: {} sxzz-verkit-a5b7150/pnpm-workspace.yaml000066400000000000000000000002151525327470400202210ustar00rootroot00000000000000packages: [] minimumReleaseAge: 0 shellEmulator: true trustLockfile: true trustPolicy: no-downgrade trustPolicyIgnoreAfter: 604800 # 7 days sxzz-verkit-a5b7150/src/000077500000000000000000000000001525327470400151605ustar00rootroot00000000000000sxzz-verkit-a5b7150/src/comparator.ts000066400000000000000000000004431525327470400177000ustar00rootroot00000000000000export { comparatorsIntersect, normalizeComparator, satisfiesComparator, } from './comparator/operations.ts' export { parseComparator, tryParseComparator } from './comparator/parse.ts' export type { ComparatorInput, RangeOptions, SemVerComparator, } from './comparator/types.ts' sxzz-verkit-a5b7150/src/comparator/000077500000000000000000000000001525327470400173275ustar00rootroot00000000000000sxzz-verkit-a5b7150/src/comparator/operations.ts000066400000000000000000000035251525327470400220670ustar00rootroot00000000000000import { formatComparator, parseComparator } from './parse.ts' import { parsedComparatorsIntersect, testComparatorVersion } from './set.ts' import type { VersionInput } from '../version/types.ts' import type { ComparatorInput, RangeOptions, SemVerComparator, } from './types.ts' function resolveComparator( comparator: ComparatorInput, options: RangeOptions, ): SemVerComparator { return typeof comparator === 'string' ? parseComparator(comparator, options) : comparator } export function normalizeComparator( comparator: string, options?: RangeOptions, ): string export function normalizeComparator(comparator: ComparatorInput): string export function normalizeComparator( comparator: ComparatorInput, options: RangeOptions = {}, ): string { return formatComparator(resolveComparator(comparator, options)) } export function satisfiesComparator( version: VersionInput, comparator: string, options?: RangeOptions, ): boolean export function satisfiesComparator( version: VersionInput, comparator: ComparatorInput, ): boolean export function satisfiesComparator( version: VersionInput, comparator: ComparatorInput, options: RangeOptions = {}, ): boolean { return testComparatorVersion(resolveComparator(comparator, options), version) } export function comparatorsIntersect( left: string, right: string, options?: RangeOptions, ): boolean export function comparatorsIntersect( left: ComparatorInput, right: ComparatorInput, ): boolean export function comparatorsIntersect( left: ComparatorInput, right: ComparatorInput, options: RangeOptions = {}, ): boolean { const parsedLeft = resolveComparator(left, options) const parsedRight = resolveComparator(right, options) return parsedComparatorsIntersect(parsedLeft, parsedRight, { ...parsedLeft.options, ...parsedRight.options, ...options, }) } sxzz-verkit-a5b7150/src/comparator/parse.ts000066400000000000000000000037271525327470400210220ustar00rootroot00000000000000import { formatComparableVersion, parse } from '../version/parse.ts' import { FULL_PLAIN, GREATER_LESS_THAN, LOOSE_PLAIN, safeRegex, } from '../version/patterns.ts' import type { ComparatorInput, RangeOptions, SemVerComparator, } from './types.ts' const STRICT_COMPARATOR = safeRegex( String.raw`^${GREATER_LESS_THAN}\s*(${FULL_PLAIN})$|^$`, ) const LOOSE_COMPARATOR = safeRegex( String.raw`^${GREATER_LESS_THAN}\s*(${LOOSE_PLAIN})$|^$`, ) export function formatComparator(comparator: SemVerComparator): string { return comparator.version ? `${comparator.operator}${formatComparableVersion(comparator.version)}` : '' } export function parseComparator( comparator: string, options?: RangeOptions, ): SemVerComparator export function parseComparator(comparator: ComparatorInput): SemVerComparator export function parseComparator( comparator: ComparatorInput, options: RangeOptions = {}, ): SemVerComparator { if (typeof comparator !== 'string') return comparator const normalized = comparator.trim().replaceAll(/\s+/g, ' ') const match = normalized.match( options.loose ? LOOSE_COMPARATOR : STRICT_COMPARATOR, ) if (!match) throw new TypeError(`Invalid comparator: ${normalized}`) const operator = ( match[1] === '=' ? '' : match[1] || '' ) as SemVerComparator['operator'] const version = match[2] ? parse(match[2], options) : null return { operator, options, value: version ? `${operator}${formatComparableVersion(version)}` : '', version, } } export function tryParseComparator( comparator: string, options?: RangeOptions, ): SemVerComparator | null export function tryParseComparator( comparator: ComparatorInput, ): SemVerComparator | null export function tryParseComparator( comparator: ComparatorInput, options: RangeOptions = {}, ): SemVerComparator | null { try { return typeof comparator === 'string' ? parseComparator(comparator, options) : comparator } catch { return null } } sxzz-verkit-a5b7150/src/comparator/set.ts000066400000000000000000000061621525327470400204770ustar00rootroot00000000000000import { compareParsed } from '../version/comparison.ts' import { tryParse } from '../version/parse.ts' import { formatComparator } from './parse.ts' import type { SemVer, VersionInput } from '../version/types.ts' import type { RangeOptions, SemVerComparator } from './types.ts' export function testParsedComparator( comparator: SemVerComparator, version: SemVer, ): boolean { if (!comparator.version) return true const comparison = compareParsed(version, comparator.version) switch (comparator.operator) { case '': return comparison === 0 case '>': return comparison > 0 case '>=': return comparison >= 0 case '<': return comparison < 0 case '<=': return comparison <= 0 } } export function testComparatorVersion( comparator: SemVerComparator, version: VersionInput, ): boolean { const parsed = tryParse(version, comparator.options) return parsed ? testParsedComparator(comparator, parsed) : false } export function comparatorAllowsPrerelease( comparator: SemVerComparator, version: SemVer, ): boolean { const allowed = comparator.version return ( allowed !== null && !!allowed.prerelease?.length && allowed.major === version.major && allowed.minor === version.minor && allowed.patch === version.patch ) } export function testComparatorSet( set: readonly SemVerComparator[], version: SemVer, options: RangeOptions, ): boolean { if (set.some((comparator) => !testParsedComparator(comparator, version))) { return false } return ( !version.prerelease?.length || !!options.includePrerelease || set.some((comparator) => comparatorAllowsPrerelease(comparator, version)) ) } export function parsedComparatorsIntersect( left: SemVerComparator, right: SemVerComparator, options: RangeOptions = {}, ): boolean { if (!left.version || !right.version) return true // An exact-version comparator admits one version, so the other side must be // tested as a set to apply the prerelease rule. if (left.operator === '') { return testComparatorSet([right], left.version, options) } if (right.operator === '') { return testComparatorSet([left], right.version, options) } const leftValue = formatComparator(left) const rightValue = formatComparator(right) if ( options.includePrerelease && (leftValue === '<0.0.0-0' || rightValue === '<0.0.0-0') ) { return false } if ( !options.includePrerelease && (leftValue.startsWith('<0.0.0') || rightValue.startsWith('<0.0.0')) ) { return false } if (left.operator.startsWith('>') && right.operator.startsWith('>')) { return true } if (left.operator.startsWith('<') && right.operator.startsWith('<')) { return true } const comparison = compareParsed(left.version, right.version) if ( comparison === 0 && left.operator.includes('=') && right.operator.includes('=') ) { return true } if ( comparison < 0 && left.operator.startsWith('>') && right.operator.startsWith('<') ) { return true } return ( comparison > 0 && left.operator.startsWith('<') && right.operator.startsWith('>') ) } sxzz-verkit-a5b7150/src/comparator/types.ts000066400000000000000000000005441525327470400210460ustar00rootroot00000000000000import type { SemVer, VersionOptions } from '../version/types.ts' export interface RangeOptions extends VersionOptions { includePrerelease?: boolean } export interface SemVerComparator { operator: '' | '<' | '<=' | '>' | '>=' options: RangeOptions value: string version: SemVer | null } export type ComparatorInput = SemVerComparator | string sxzz-verkit-a5b7150/src/index.ts000066400000000000000000000001301525327470400166310ustar00rootroot00000000000000export * from './comparator.ts' export * from './range.ts' export * from './version.ts' sxzz-verkit-a5b7150/src/range.ts000066400000000000000000000007141525327470400166260ustar00rootroot00000000000000export { findMaxSatisfying, findMinimumForRange, findMinSatisfying, isGreaterThanRange, isLessThanRange, isOutsideRange, isValidRange, normalizeRange, rangesIntersect, rangeToComparators, satisfies, simplifyRange, } from './range/operations.ts' export { parseRange, tryParseRange } from './range/parse.ts' export { isRangeSubset } from './range/subset.ts' export type { RangeDirection, RangeInput, SemVerRange } from './range/types.ts' sxzz-verkit-a5b7150/src/range/000077500000000000000000000000001525327470400162545ustar00rootroot00000000000000sxzz-verkit-a5b7150/src/range/operations.ts000066400000000000000000000261721525327470400210170ustar00rootroot00000000000000import { formatComparator, parseComparator } from '../comparator/parse.ts' import { compareParsed, sort } from '../version/comparison.ts' import { formatComparableVersion, parse, tryParse } from '../version/parse.ts' import { formatRange, parsedRangesIntersect, parseRange, testParsedRange, testRangeVersion, tryParseRange, type ParseRangeInput, } from './parse.ts' import type { RangeOptions } from '../comparator/types.ts' import type { SemVer, VersionInput } from '../version/types.ts' import type { RangeDirection, RangeInput, SemVerRange } from './types.ts' type TryParseRangeInput = ( range: RangeInput, options?: RangeOptions, ) => SemVerRange | null type IsOutsideRangeInput = ( version: VersionInput, range: RangeInput, direction: RangeDirection, options?: RangeOptions, ) => boolean export function isValidRange(range: string, options?: RangeOptions): boolean export function isValidRange(range: RangeInput): boolean export function isValidRange( range: RangeInput, options: RangeOptions = {}, ): boolean { return (tryParseRange as TryParseRangeInput)(range, options) !== null } export function normalizeRange( range: string, options?: RangeOptions, ): string | null export function normalizeRange(range: RangeInput): string | null export function normalizeRange( range: RangeInput, options: RangeOptions = {}, ): string | null { const parsed = (tryParseRange as TryParseRangeInput)(range, options) return parsed ? formatRange(parsed) || '*' : null } export function satisfies( version: VersionInput, range: string, options?: RangeOptions, ): boolean export function satisfies(version: VersionInput, range: RangeInput): boolean export function satisfies( version: VersionInput, range: RangeInput, options: RangeOptions = {}, ): boolean { const parsed = (tryParseRange as TryParseRangeInput)(range, options) return parsed ? testRangeVersion(parsed, version) : false } export function rangeToComparators( range: string, options?: RangeOptions, ): string[][] export function rangeToComparators(range: RangeInput): string[][] export function rangeToComparators( range: RangeInput, options: RangeOptions = {}, ): string[][] { return (parseRange as ParseRangeInput)(range, options).sets.map((set) => set.map(formatComparator).join(' ').trim().split(' '), ) } export function findMaxSatisfying( versions: readonly T[], range: string, options?: RangeOptions, ): T | null export function findMaxSatisfying( versions: readonly T[], range: RangeInput, ): T | null export function findMaxSatisfying( versions: readonly T[], range: RangeInput, options: RangeOptions = {}, ): T | null { const parsedRange = (tryParseRange as TryParseRangeInput)(range, options) if (!parsedRange) return null let maximum: T | null = null let maximumParsed: SemVer | null = null for (const version of versions) { const parsedVersion = tryParse(version, parsedRange.options) if (!parsedVersion || !testParsedRange(parsedRange, parsedVersion)) continue if (!maximumParsed || compareParsed(maximumParsed, parsedVersion) < 0) { maximum = version maximumParsed = parsedVersion } } return maximum } export function findMinSatisfying( versions: readonly T[], range: string, options?: RangeOptions, ): T | null export function findMinSatisfying( versions: readonly T[], range: RangeInput, ): T | null export function findMinSatisfying( versions: readonly T[], range: RangeInput, options: RangeOptions = {}, ): T | null { const parsedRange = (tryParseRange as TryParseRangeInput)(range, options) if (!parsedRange) return null let minimum: T | null = null let minimumParsed: SemVer | null = null for (const version of versions) { const parsedVersion = tryParse(version, parsedRange.options) if (!parsedVersion || !testParsedRange(parsedRange, parsedVersion)) continue if (!minimumParsed || compareParsed(minimumParsed, parsedVersion) > 0) { minimum = version minimumParsed = parsedVersion } } return minimum } function nextVersionAfter(version: SemVer): SemVer { const { prerelease } = version return prerelease?.length ? { major: version.major, minor: version.minor, patch: version.patch, prerelease: [...prerelease, 0], } : { major: version.major, minor: version.minor, patch: version.patch + 1, } } export function findMinimumForRange( range: string, options?: RangeOptions, ): SemVer | null export function findMinimumForRange(range: RangeInput): SemVer | null export function findMinimumForRange( range: RangeInput, options: RangeOptions = {}, ): SemVer | null { const parsedRange = (parseRange as ParseRangeInput)(range, options) const zero: SemVer = { major: 0, minor: 0, patch: 0 } if (testParsedRange(parsedRange, zero)) return zero const zeroPrerelease: SemVer = { ...zero, prerelease: [0] } if (testParsedRange(parsedRange, zeroPrerelease)) return zeroPrerelease let minimum: SemVer | null = null for (const set of parsedRange.sets) { let setMinimum: SemVer | null = null for (const comparator of set) { if (!comparator.version) continue const candidate = comparator.operator === '>' ? nextVersionAfter(comparator.version) : comparator.operator === '' || comparator.operator === '>=' ? structuredClone(comparator.version) : null if ( candidate && (!setMinimum || compareParsed(candidate, setMinimum) > 0) ) { setMinimum = candidate } } if (setMinimum && (!minimum || compareParsed(minimum, setMinimum) > 0)) { minimum = setMinimum } } return minimum && testParsedRange(parsedRange, minimum) ? minimum : null } function compareInDirection( left: SemVer, right: SemVer, direction: RangeDirection, ): boolean { const comparison = compareParsed(left, right) return direction === '>' ? comparison > 0 : comparison < 0 } function compareOppositeOrEqual( left: SemVer, right: SemVer, direction: RangeDirection, ): boolean { const comparison = compareParsed(left, right) return direction === '>' ? comparison <= 0 : comparison >= 0 } function compareOpposite( left: SemVer, right: SemVer, direction: RangeDirection, ): boolean { const comparison = compareParsed(left, right) return direction === '>' ? comparison < 0 : comparison > 0 } export function isOutsideRange( version: VersionInput, range: string, direction: RangeDirection, options?: RangeOptions, ): boolean export function isOutsideRange( version: VersionInput, range: RangeInput, direction: RangeDirection, ): boolean export function isOutsideRange( version: VersionInput, range: RangeInput, direction: RangeDirection, options: RangeOptions = {}, ): boolean { if (direction !== '>' && direction !== '<') { throw new TypeError('Must provide a direction of "<" or ">"') } const parsedRange = (parseRange as ParseRangeInput)(range, options) const parsedVersion = parse(version, parsedRange.options) if (testParsedRange(parsedRange, parsedVersion)) return false const inclusiveDirection = direction === '>' ? '>=' : '<=' for (const set of parsedRange.sets) { const concrete = set.map((comparator) => comparator.version ? comparator : parseComparator('>=0.0.0'), ) let high = concrete[0]! let low = concrete[0]! for (const comparator of concrete) { if (compareInDirection(comparator.version!, high.version!, direction)) { high = comparator } else if ( compareOpposite(comparator.version!, low.version!, direction) ) { low = comparator } } if (high.operator === direction || high.operator === inclusiveDirection) { return false } if ( (!low.operator || low.operator === direction) && compareOppositeOrEqual(parsedVersion, low.version!, direction) ) { return false } if ( low.operator === inclusiveDirection && compareOpposite(parsedVersion, low.version!, direction) ) { return false } } return true } export function isGreaterThanRange( version: VersionInput, range: string, options?: RangeOptions, ): boolean export function isGreaterThanRange( version: VersionInput, range: RangeInput, ): boolean export function isGreaterThanRange( version: VersionInput, range: RangeInput, options: RangeOptions = {}, ): boolean { return (isOutsideRange as IsOutsideRangeInput)(version, range, '>', options) } export function isLessThanRange( version: VersionInput, range: string, options?: RangeOptions, ): boolean export function isLessThanRange( version: VersionInput, range: RangeInput, ): boolean export function isLessThanRange( version: VersionInput, range: RangeInput, options: RangeOptions = {}, ): boolean { return (isOutsideRange as IsOutsideRangeInput)(version, range, '<', options) } export function rangesIntersect( left: string, right: string, options?: RangeOptions, ): boolean export function rangesIntersect(left: RangeInput, right: RangeInput): boolean export function rangesIntersect( left: RangeInput, right: RangeInput, options: RangeOptions = {}, ): boolean { const parsedLeft = (parseRange as ParseRangeInput)(left, options) const parsedRight = (parseRange as ParseRangeInput)(right, options) return parsedRangesIntersect(parsedLeft, parsedRight, { ...parsedLeft.options, ...parsedRight.options, ...options, }) } export function simplifyRange( versions: readonly T[], range: string, options?: RangeOptions, ): string export function simplifyRange( versions: readonly T[], range: RangeInput, ): string export function simplifyRange( versions: readonly T[], range: RangeInput, options: RangeOptions = {}, ): string { const parsedRange = (parseRange as ParseRangeInput)(range, options) const sorted = sort(versions, parsedRange.options) const sets: [T, T | null][] = [] let first: T | null = null let previous: T | null = null for (const version of sorted) { if (testRangeVersion(parsedRange, version)) { previous = version first ??= version } else if (previous) { sets.push([first!, previous]) first = null previous = null } } if (first) sets.push([first, null]) const simplified = sets .map(([minimum, maximum]) => { const minimumValue = formatComparableVersion( parse(minimum, parsedRange.options), ) const maximumValue = maximum ? formatComparableVersion(parse(maximum, parsedRange.options)) : null if (minimumValue === maximumValue) return minimumValue if (!maximum && minimum === sorted[0]) return '*' if (!maximumValue) return `>=${minimumValue}` if (minimum === sorted[0]) return `<=${maximumValue}` return `${minimumValue} - ${maximumValue}` }) .join(' || ') const original = typeof range === 'string' ? range : formatRange(parsedRange) || '*' return simplified.length < original.length ? simplified : original } sxzz-verkit-a5b7150/src/range/parse.ts000066400000000000000000000316601525327470400177440ustar00rootroot00000000000000import { formatComparator, parseComparator } from '../comparator/parse.ts' import { parsedComparatorsIntersect, testComparatorSet, } from '../comparator/set.ts' import { tryParse } from '../version/parse.ts' import { BUILD, GREATER_LESS_THAN, LONE_CARET, LONE_TILDE, LOOSE_PLAIN, safeRegex, XRANGE_PLAIN, XRANGE_PLAIN_LOOSE, } from '../version/patterns.ts' import type { RangeOptions, SemVerComparator } from '../comparator/types.ts' import type { SemVer, VersionInput } from '../version/types.ts' import type { RangeInput, SemVerRange } from './types.ts' export type ParseRangeInput = ( range: RangeInput, options?: RangeOptions, ) => SemVerRange export function formatRange(range: SemVerRange): string { return range.sets.map((set) => set.map(formatComparator).join(' ')).join('||') } const BUILD_STRIP = new RegExp(BUILD, 'g') const BUILD_SAFE = safeRegex(BUILD) const STRICT_HYPHEN = safeRegex( String.raw`^\s*(${XRANGE_PLAIN})\s+-\s+(${XRANGE_PLAIN})\s*$`, ) const LOOSE_HYPHEN = safeRegex( String.raw`^\s*(${XRANGE_PLAIN_LOOSE})\s+-\s+(${XRANGE_PLAIN_LOOSE})\s*$`, ) const COMPARATOR_TRIM = safeRegex( String.raw`(\s*)${GREATER_LESS_THAN}\s*(${LOOSE_PLAIN}|${XRANGE_PLAIN})`, 'g', ) const TILDE_TRIM = safeRegex(String.raw`(\s*)${LONE_TILDE}\s+`, 'g') const CARET_TRIM = safeRegex(String.raw`(\s*)${LONE_CARET}\s+`, 'g') const STRICT_TILDE = safeRegex(`^${LONE_TILDE}${XRANGE_PLAIN}$`) const LOOSE_TILDE = safeRegex(`^${LONE_TILDE}${XRANGE_PLAIN_LOOSE}$`) const STRICT_CARET = safeRegex(`^${LONE_CARET}${XRANGE_PLAIN}$`) const LOOSE_CARET = safeRegex(`^${LONE_CARET}${XRANGE_PLAIN_LOOSE}$`) const STRICT_XRANGE = safeRegex( String.raw`^${GREATER_LESS_THAN}\s*${XRANGE_PLAIN}$`, ) const LOOSE_XRANGE = safeRegex( String.raw`^${GREATER_LESS_THAN}\s*${XRANGE_PLAIN_LOOSE}$`, ) const STAR = safeRegex(String.raw`(<|>)?=?\s*\*`) const GTE_ZERO = /^\s*>=\s*0\.0\.0\s*$/ const GTE_ZERO_PRERELEASE = /^\s*>=\s*0\.0\.0-0\s*$/ const LOOSE_COMPARATOR = safeRegex( String.raw`^${GREATER_LESS_THAN}\s*(${LOOSE_PLAIN})$|^$`, ) function isWildcard(value: unknown): boolean { return !value || String(value).toLowerCase() === 'x' || String(value) === '*' } function hasInvalidWildcardOrder( major: string | undefined, minor: string | undefined, patch: string | undefined, ): boolean { return ( (isWildcard(major) && !isWildcard(minor)) || (isWildcard(minor) && Boolean(patch) && !isWildcard(patch)) ) } function replaceTilde(comparator: string, options: RangeOptions): string { const expression = options.loose ? LOOSE_TILDE : STRICT_TILDE const lowerPrerelease = options.includePrerelease ? '-0' : '' return comparator.replace( expression, (_match, major, minor, patch, prerelease) => { if (isWildcard(major)) return '' if (isWildcard(minor)) { return `>=${major}.0.0${lowerPrerelease} <${Number(major) + 1}.0.0-0` } if (isWildcard(patch)) { return `>=${major}.${minor}.0${lowerPrerelease} <${major}.${Number(minor) + 1}.0-0` } return prerelease ? `>=${major}.${minor}.${patch}-${prerelease} <${major}.${Number(minor) + 1}.0-0` : `>=${major}.${minor}.${patch} <${major}.${Number(minor) + 1}.0-0` }, ) } function replaceTildes(comparator: string, options: RangeOptions): string { return comparator .trim() .split(/\s+/) .map((part) => replaceTilde(part, options)) .join(' ') } function replaceCaret(comparator: string, options: RangeOptions): string { const expression = options.loose ? LOOSE_CARET : STRICT_CARET const lowerPrerelease = options.includePrerelease ? '-0' : '' return comparator.replace( expression, (_match, major, minor, patch, prerelease) => { if (isWildcard(major)) return '' if (isWildcard(minor)) { return `>=${major}.0.0${lowerPrerelease} <${Number(major) + 1}.0.0-0` } if (isWildcard(patch)) { return major === '0' ? `>=${major}.${minor}.0${lowerPrerelease} <${major}.${Number(minor) + 1}.0-0` : `>=${major}.${minor}.0${lowerPrerelease} <${Number(major) + 1}.0.0-0` } if (prerelease) { return major === '0' ? minor === '0' ? `>=${major}.${minor}.${patch}-${prerelease} <${major}.${minor}.${Number(patch) + 1}-0` : `>=${major}.${minor}.${patch}-${prerelease} <${major}.${Number(minor) + 1}.0-0` : `>=${major}.${minor}.${patch}-${prerelease} <${Number(major) + 1}.0.0-0` } return major === '0' ? minor === '0' ? `>=${major}.${minor}.${patch} <${major}.${minor}.${Number(patch) + 1}-0` : `>=${major}.${minor}.${patch} <${major}.${Number(minor) + 1}.0-0` : `>=${major}.${minor}.${patch} <${Number(major) + 1}.0.0-0` }, ) } function replaceCarets(comparator: string, options: RangeOptions): string { return comparator .trim() .split(/\s+/) .map((part) => replaceCaret(part, options)) .join(' ') } function replaceXRange(comparator: string, options: RangeOptions): string { const expression = options.loose ? LOOSE_XRANGE : STRICT_XRANGE return comparator .trim() .replace(expression, (match, rawOperator, rawMajor, rawMinor, rawPatch) => { let operator = rawOperator as string let major = rawMajor as number | string let minor = rawMinor as number | string let patch = rawPatch as number | string if ( hasInvalidWildcardOrder( String(major), minor === undefined ? undefined : String(minor), patch === undefined ? undefined : String(patch), ) ) { return comparator } const wildcardMajor = isWildcard(major) const wildcardMinor = wildcardMajor || isWildcard(minor) const wildcardPatch = wildcardMinor || isWildcard(patch) if (operator === '=' && wildcardPatch) operator = '' if (wildcardMajor) { return operator === '>' || operator === '<' ? '<0.0.0-0' : '*' } let prerelease = options.includePrerelease ? '-0' : '' if (operator && wildcardPatch) { if (wildcardMinor) minor = 0 patch = 0 if (operator === '>') { operator = '>=' if (wildcardMinor) { major = Number(major) + 1 minor = 0 } else { minor = Number(minor) + 1 } } else if (operator === '<=') { operator = '<' if (wildcardMinor) major = Number(major) + 1 else minor = Number(minor) + 1 } if (operator === '<') prerelease = '-0' return `${operator}${major}.${minor}.${patch}${prerelease}` } if (wildcardMinor) { return `>=${major}.0.0${prerelease} <${Number(major) + 1}.0.0-0` } if (wildcardPatch) { return `>=${major}.${minor}.0${prerelease} <${major}.${Number(minor) + 1}.0-0` } return match }) } function replaceXRanges(comparator: string, options: RangeOptions): string { return comparator .split(/\s+/) .map((part) => replaceXRange(part, options)) .join(' ') } function replaceHyphenRange(range: string, options: RangeOptions): string { const expression = options.loose ? LOOSE_HYPHEN : STRICT_HYPHEN return range.replace( expression, ( _match, rawFrom, fromMajor, fromMinor, fromPatch, fromPrerelease, _fromBuild, rawTo, toMajor, toMinor, toPatch, toPrerelease, ) => { let from = rawFrom as string let to = rawTo as string if (isWildcard(fromMajor)) from = '' else if (isWildcard(fromMinor)) { from = `>=${fromMajor}.0.0${options.includePrerelease ? '-0' : ''}` } else if (isWildcard(fromPatch)) { from = `>=${fromMajor}.${fromMinor}.0${options.includePrerelease ? '-0' : ''}` } else if (fromPrerelease) from = `>=${from}` else from = `>=${from}${options.includePrerelease ? '-0' : ''}` if (isWildcard(toMajor)) to = '' else if (isWildcard(toMinor)) to = `<${Number(toMajor) + 1}.0.0-0` else if (isWildcard(toPatch)) { to = `<${toMajor}.${Number(toMinor) + 1}.0-0` } else if (toPrerelease) { to = `<=${toMajor}.${toMinor}.${toPatch}-${toPrerelease}` } else if (options.includePrerelease) { to = `<${toMajor}.${toMinor}.${Number(toPatch) + 1}-0` } else to = `<=${to}` return `${from} ${to}`.trim() }, ) } function expandComparator(comparator: string, options: RangeOptions): string { return replaceXRanges( replaceTildes( replaceCarets(comparator.replace(BUILD_SAFE, ''), options), options, ), options, ) .trim() .replace(STAR, '') } function parseSimpleRange( input: string, options: RangeOptions, ): SemVerComparator[] { const range = input.replace(BUILD_STRIP, '') const expanded = replaceHyphenRange(range, options) .replace(COMPARATOR_TRIM, '$1$2$3') .replace(TILDE_TRIM, '$1~') .replace(CARET_TRIM, '$1^') let parts = expanded .split(' ') .map((part) => expandComparator(part, options)) .join(' ') .split(/\s+/) .map((part) => part .trim() .replace( options.includePrerelease ? GTE_ZERO_PRERELEASE : GTE_ZERO, '', ), ) if (options.loose) { parts = parts.filter((part) => LOOSE_COMPARATOR.test(part)) } const unique = new Map() for (const comparator of parts.map((part) => parseComparator(part, options), )) { if (comparator.value === '<0.0.0-0') { return [comparator] } unique.set(comparator.value, comparator) } if (unique.size > 1) unique.delete('') return [...unique.values()] } export function parseRange(range: string, options?: RangeOptions): SemVerRange export function parseRange(range: RangeInput): SemVerRange export function parseRange( range: RangeInput, options: RangeOptions = {}, ): SemVerRange { if (typeof range !== 'string') return range const parsedOptions = { ...options } const normalizedRange = range.trim().replaceAll(/\s+/g, ' ') let sets = normalizedRange .split('||') .map((part) => parseSimpleRange(part.trim(), parsedOptions)) .filter((set) => set.length) if (!sets.length) { throw new TypeError( `Range contains no valid comparator sets: ${normalizedRange}`, ) } if (sets.length > 1) { const first = sets[0]! sets = sets.filter((set) => set[0]?.value !== '<0.0.0-0') if (!sets.length) sets = [first] else if (sets.length > 1) { const any = sets.find((set) => set.length === 1 && set[0]?.value === '') if (any) sets = [any] } } return { options: parsedOptions, sets, } } export function tryParseRange( range: string, options?: RangeOptions, ): SemVerRange | null export function tryParseRange(range: RangeInput): SemVerRange | null export function tryParseRange( range: RangeInput, options: RangeOptions = {}, ): SemVerRange | null { try { return (parseRange as ParseRangeInput)(range, options) } catch { return null } } export function testParsedRange(range: SemVerRange, version: SemVer): boolean { return range.sets.some((set) => testComparatorSet(set, version, range.options), ) } export function testRangeVersion( range: SemVerRange, version: VersionInput, ): boolean { const parsed = tryParse(version, range.options) return parsed ? testParsedRange(range, parsed) : false } function exactVersion(set: readonly SemVerComparator[]): SemVer | null { for (const comparator of set) { if (comparator.operator === '' && comparator.version) { return comparator.version } } return null } function isSatisfiable( comparators: readonly SemVerComparator[], options: RangeOptions, ): boolean { const exact = exactVersion(comparators) if (exact) return testComparatorSet(comparators, exact, options) const remaining = [...comparators] let current = remaining.pop() while (current && remaining.length) { if ( remaining.some( (other) => !parsedComparatorsIntersect(current!, other, options), ) ) { return false } current = remaining.pop() } return true } function setsIntersect( left: readonly SemVerComparator[], right: readonly SemVerComparator[], options: RangeOptions, ): boolean { // The caller has already checked that both sets are satisfiable. const leftExact = exactVersion(left) if (leftExact) return testComparatorSet(right, leftExact, options) const rightExact = exactVersion(right) if (rightExact) return testComparatorSet(left, rightExact, options) return left.every((leftComparator) => right.every((rightComparator) => parsedComparatorsIntersect(leftComparator, rightComparator, options), ), ) } export function parsedRangesIntersect( left: SemVerRange, right: SemVerRange, options: RangeOptions = {}, ): boolean { return left.sets.some( (leftSet) => isSatisfiable(leftSet, options) && right.sets.some( (rightSet) => isSatisfiable(rightSet, options) && setsIntersect(leftSet, rightSet, options), ), ) } sxzz-verkit-a5b7150/src/range/subset.ts000066400000000000000000000142111525327470400201300ustar00rootroot00000000000000import { parseComparator } from '../comparator/parse.ts' import { comparatorAllowsPrerelease, testComparatorSet, testParsedComparator, } from '../comparator/set.ts' import { compareParsed } from '../version/comparison.ts' import { formatComparableVersion } from '../version/parse.ts' import { parseRange, type ParseRangeInput } from './parse.ts' import type { RangeOptions, SemVerComparator } from '../comparator/types.ts' import type { SemVer } from '../version/types.ts' import type { RangeInput } from './types.ts' function higherLowerBound( left: SemVerComparator | undefined, right: SemVerComparator, ): SemVerComparator { if (!left) return right const comparison = compareParsed(left.version!, right.version!) return comparison > 0 ? left : comparison < 0 || (right.operator === '>' && left.operator === '>=') ? right : left } function lowerUpperBound( left: SemVerComparator | undefined, right: SemVerComparator, ): SemVerComparator { if (!left) return right const comparison = compareParsed(left.version!, right.version!) return comparison < 0 ? left : comparison > 0 || (right.operator === '<' && left.operator === '<=') ? right : left } function simpleRangeSubset( rawSubset: readonly SemVerComparator[], rawSuperset: readonly SemVerComparator[], options: RangeOptions, ): boolean | null { let subset = rawSubset let superset = rawSuperset const subsetAny = subset.length === 1 && !subset[0]!.version const supersetAny = superset.length === 1 && !superset[0]!.version if (subsetAny) { if (supersetAny) return true subset = [ parseComparator(options.includePrerelease ? '>=0.0.0-0' : '>=0.0.0'), ] } if (supersetAny) { if (options.includePrerelease) return true superset = [parseComparator('>=0.0.0')] } const equal = new Map() let lower: SemVerComparator | undefined let upper: SemVerComparator | undefined for (const comparator of subset) { if (comparator.operator === '>' || comparator.operator === '>=') { lower = higherLowerBound(lower, comparator) } else if (comparator.operator === '<' || comparator.operator === '<=') { upper = lowerUpperBound(upper, comparator) } else if (comparator.version) { equal.set(formatComparableVersion(comparator.version), comparator.version) } } if (equal.size > 1) return null let boundsComparison: number | undefined if (lower && upper) { boundsComparison = compareParsed(lower.version!, upper.version!) if (boundsComparison > 0) return null if ( boundsComparison === 0 && (lower.operator !== '>=' || upper.operator !== '<=') ) { return null } } for (const version of equal.values()) { if (lower && !testParsedComparator(lower, version)) return null if (upper && !testParsedComparator(upper, version)) return null // Testing each superset comparator on its own would skip the prerelease rule. return testComparatorSet(superset, version, options) } let needsLowerPrerelease = lower && !options.includePrerelease && lower.version!.prerelease?.length ? lower.version! : null let needsUpperPrerelease = upper && !options.includePrerelease && upper.version!.prerelease?.length ? upper.version! : null const upperPrerelease = needsUpperPrerelease?.prerelease if ( upperPrerelease?.length === 1 && upper?.operator === '<' && upperPrerelease[0] === 0 ) { needsUpperPrerelease = null } let hasSupersetLower = false let hasSupersetUpper = false for (const comparator of superset) { hasSupersetLower ||= comparator.operator === '>' || comparator.operator === '>=' hasSupersetUpper ||= comparator.operator === '<' || comparator.operator === '<=' if (lower) { if ( needsLowerPrerelease && comparatorAllowsPrerelease(comparator, needsLowerPrerelease) ) { needsLowerPrerelease = null } if (comparator.operator === '>' || comparator.operator === '>=') { const higher = higherLowerBound(lower, comparator) if (higher === comparator && higher !== lower) return false } else if ( lower.operator === '>=' && !testParsedComparator(comparator, lower.version!) ) { return false } } if (upper) { if ( needsUpperPrerelease && comparatorAllowsPrerelease(comparator, needsUpperPrerelease) ) { needsUpperPrerelease = null } if (comparator.operator === '<' || comparator.operator === '<=') { const lowerBound = lowerUpperBound(upper, comparator) if (lowerBound === comparator && lowerBound !== upper) return false } else if ( upper.operator === '<=' && !testParsedComparator(comparator, upper.version!) ) { return false } } if ( comparator.operator === '' && (lower || upper) && boundsComparison !== 0 ) { return false } } if (lower && hasSupersetUpper && !upper && boundsComparison !== 0) return false if (upper && hasSupersetLower && !lower && boundsComparison !== 0) return false return !needsLowerPrerelease && !needsUpperPrerelease } export function isRangeSubset( subset: string, superset: string, options?: RangeOptions, ): boolean export function isRangeSubset(subset: RangeInput, superset: RangeInput): boolean export function isRangeSubset( subset: RangeInput, superset: RangeInput, options: RangeOptions = {}, ): boolean { if (subset === superset) return true const parsedSubset = (parseRange as ParseRangeInput)(subset, options) const parsedSuperset = (parseRange as ParseRangeInput)(superset, options) const effectiveOptions = { ...parsedSubset.options, ...parsedSuperset.options, ...options, } let sawNonNull = false for (const subsetSet of parsedSubset.sets) { let matched = false for (const supersetSet of parsedSuperset.sets) { const result = simpleRangeSubset(subsetSet, supersetSet, effectiveOptions) sawNonNull ||= result !== null if (result) { matched = true break } } if (!matched && sawNonNull) return false } return true } sxzz-verkit-a5b7150/src/range/types.ts000066400000000000000000000003731525327470400177730ustar00rootroot00000000000000import type { RangeOptions, SemVerComparator } from '../comparator/types.ts' export interface SemVerRange { options: RangeOptions sets: SemVerComparator[][] } export type RangeInput = SemVerRange | string export type RangeDirection = '<' | '>' sxzz-verkit-a5b7150/src/version.ts000066400000000000000000000017441525327470400172230ustar00rootroot00000000000000export { compare, compareBuild, compareMain, comparePrerelease, compareReversed, compareWithOperator, isEqual, isGreaterThan, isGreaterThanOrEqual, isLessThan, isLessThanOrEqual, isNotEqual, sort, sortReversed, } from './version/comparison.ts' export { INCREMENT_TYPES, SEMVER_SPEC_VERSION, TRUNCATION_TYPES, } from './version/constants.ts' export { compareIdentifiers, compareIdentifiersReversed, } from './version/identifiers.ts' export { clean, coerce, difference, getBuild, getMajor, getMinor, getPatch, getPrerelease, increment, isPrerelease, isStable, isValid, normalize, normalizeFull, truncate, } from './version/operations.ts' export { parse, tryParse } from './version/parse.ts' export type { CoerceOptions, Comparison, ComparisonOperator, IncrementOptions, IncrementType, PrereleaseIdentifier, SemVer, TruncationType, VersionDifference, VersionInput, VersionOptions, } from './version/types.ts' sxzz-verkit-a5b7150/src/version/000077500000000000000000000000001525327470400166455ustar00rootroot00000000000000sxzz-verkit-a5b7150/src/version/comparison.ts000066400000000000000000000121471525327470400213740ustar00rootroot00000000000000import { compareIdentifiers } from './identifiers.ts' import { parse } from './parse.ts' import type { Comparison, ComparisonOperator, SemVer, VersionInput, VersionOptions, } from './types.ts' export function compareMainParsed(left: SemVer, right: SemVer): Comparison { return left.major === right.major ? left.minor === right.minor ? left.patch === right.patch ? 0 : left.patch < right.patch ? -1 : 1 : left.minor < right.minor ? -1 : 1 : left.major < right.major ? -1 : 1 } export function comparePrereleaseParsed( left: SemVer, right: SemVer, ): Comparison { const leftPrerelease = left.prerelease const rightPrerelease = right.prerelease if (leftPrerelease?.length && !rightPrerelease?.length) return -1 if (!leftPrerelease?.length && rightPrerelease?.length) return 1 if (!leftPrerelease?.length && !rightPrerelease?.length) return 0 for (let index = 0; ; index++) { const leftIdentifier = leftPrerelease?.[index] const rightIdentifier = rightPrerelease?.[index] if (leftIdentifier === undefined && rightIdentifier === undefined) return 0 if (rightIdentifier === undefined) return 1 if (leftIdentifier === undefined) return -1 if (leftIdentifier !== rightIdentifier) { return compareIdentifiers(leftIdentifier, rightIdentifier) } } } export function compareParsed(left: SemVer, right: SemVer): Comparison { return compareMainParsed(left, right) || comparePrereleaseParsed(left, right) } export function compareBuildParsed(left: SemVer, right: SemVer): Comparison { const precedence = compareParsed(left, right) if (precedence !== 0) return precedence for (let index = 0; ; index++) { const leftIdentifier = left.build?.[index] const rightIdentifier = right.build?.[index] if (leftIdentifier === undefined && rightIdentifier === undefined) return 0 if (rightIdentifier === undefined) return 1 if (leftIdentifier === undefined) return -1 if (leftIdentifier !== rightIdentifier) { return compareIdentifiers(leftIdentifier, rightIdentifier) } } } export function compare( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): Comparison { return compareParsed(parse(left, options), parse(right, options)) } export function compareReversed( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): Comparison { return compare(right, left, options) } export function compareMain( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): Comparison { return compareMainParsed(parse(left, options), parse(right, options)) } export function comparePrerelease( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): Comparison { return comparePrereleaseParsed(parse(left, options), parse(right, options)) } export function compareBuild( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): Comparison { return compareBuildParsed(parse(left, options), parse(right, options)) } export function compareWithOperator( left: VersionInput, operator: ComparisonOperator, right: VersionInput, options: VersionOptions = {}, ): boolean { if (operator === '===') return left === right if (operator === '!==') return left !== right const comparison = compare(left, right, options) switch (operator) { case '': case '=': case '==': return comparison === 0 case '!=': return comparison !== 0 case '>': return comparison > 0 case '>=': return comparison >= 0 case '<': return comparison < 0 case '<=': return comparison <= 0 default: throw new TypeError(`Invalid operator: ${operator as string}`) } } export function isEqual( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): boolean { return compare(left, right, options) === 0 } export function isNotEqual( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): boolean { return compare(left, right, options) !== 0 } export function isGreaterThan( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): boolean { return compare(left, right, options) > 0 } export function isGreaterThanOrEqual( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): boolean { return compare(left, right, options) >= 0 } export function isLessThan( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): boolean { return compare(left, right, options) < 0 } export function isLessThanOrEqual( left: VersionInput, right: VersionInput, options: VersionOptions = {}, ): boolean { return compare(left, right, options) <= 0 } export function sort( versions: readonly T[], options: VersionOptions = {}, ): T[] { return [...versions].sort((left, right) => compareBuild(left, right, options)) } export function sortReversed( versions: readonly T[], options: VersionOptions = {}, ): T[] { return [...versions].sort((left, right) => compareBuild(right, left, options)) } sxzz-verkit-a5b7150/src/version/constants.ts000066400000000000000000000011141525327470400212260ustar00rootroot00000000000000import type { IncrementType, TruncationType } from './types.ts' export const SEMVER_SPEC_VERSION: string = '2.0.0' export const INCREMENT_TYPES: readonly IncrementType[] = [ 'major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease', 'release', ] export const TRUNCATION_TYPES: readonly TruncationType[] = [ 'major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease', ] export const MAX_LENGTH: number = 256 export const MAX_SAFE_COMPONENT_LENGTH: number = 16 export const MAX_SAFE_BUILD_LENGTH: number = MAX_LENGTH - 6 sxzz-verkit-a5b7150/src/version/identifiers.ts000066400000000000000000000016511525327470400215250ustar00rootroot00000000000000import type { Comparison, PrereleaseIdentifier } from './types.ts' const NUMERIC = /^\d+$/ export function compareIdentifiers( left: PrereleaseIdentifier, right: PrereleaseIdentifier, ): Comparison { if (typeof left === 'number' && typeof right === 'number') { return left === right ? 0 : left < right ? -1 : 1 } const leftNumeric = NUMERIC.test(String(left)) const rightNumeric = NUMERIC.test(String(right)) const normalizedLeft = leftNumeric ? Number(left) : left const normalizedRight = rightNumeric ? Number(right) : right return normalizedLeft === normalizedRight ? 0 : leftNumeric && !rightNumeric ? -1 : rightNumeric && !leftNumeric ? 1 : normalizedLeft < normalizedRight ? -1 : 1 } export function compareIdentifiersReversed( left: PrereleaseIdentifier, right: PrereleaseIdentifier, ): Comparison { return compareIdentifiers(right, left) } sxzz-verkit-a5b7150/src/version/operations.ts000066400000000000000000000244341525327470400214070ustar00rootroot00000000000000import { compareMainParsed, compareParsed } from './comparison.ts' import { TRUNCATION_TYPES } from './constants.ts' import { compareIdentifiers } from './identifiers.ts' import { formatComparableVersion, formatFullVersion, parse, tryParse, } from './parse.ts' import { COERCE, COERCE_FULL, PRERELEASE, PRERELEASE_LOOSE, safeRegex, } from './patterns.ts' import type { CoerceOptions, IncrementOptions, IncrementType, PrereleaseIdentifier, SemVer, TruncationType, VersionDifference, VersionInput, VersionOptions, } from './types.ts' const COERCE_EXACT = safeRegex(COERCE) const COERCE_FULL_EXACT = safeRegex(COERCE_FULL) const PRERELEASE_EXACT = safeRegex(`^${PRERELEASE}$`) const PRERELEASE_LOOSE_EXACT = safeRegex(`^${PRERELEASE_LOOSE}$`) export function isValid( version: VersionInput, options: VersionOptions = {}, ): boolean { return tryParse(version, options) !== null } export function isPrerelease( version: VersionInput, options: VersionOptions = {}, ): boolean | null { const parsed = tryParse(version, options) if (!parsed) return null return !!parsed.prerelease?.length } export function isStable( version: VersionInput, options: VersionOptions = {}, ): boolean | null { const parsed = tryParse(version, options) if (!parsed) return null return !parsed.prerelease?.length } export function normalizeFull( version: VersionInput, options: VersionOptions = {}, ): string | null { const parsed = tryParse(version, options) return parsed ? formatFullVersion(parsed) : null } export function normalize( version: VersionInput, options: VersionOptions = {}, ): string | null { const parsed = tryParse(version, options) return parsed ? formatComparableVersion(parsed) : null } export function clean( version: VersionInput, options: VersionOptions = {}, ): string | null { if (typeof version !== 'string') { return normalize(version, options) } return normalize(version.trim().replace(/^[=v]+/, ''), options) } export function coerce( value: number | VersionInput, options: CoerceOptions = {}, ): SemVer | null { if (typeof value === 'object') return value const input = typeof value === 'number' ? String(value) : value let match: RegExpExecArray | null = null if (options.rtl) { const source = options.includePrerelease ? COERCE_FULL : COERCE const expression = safeRegex(source, 'g') let next: RegExpExecArray | null while ( (next = expression.exec(input)) && (!match || match.index + match[0].length !== input.length) ) { if ( !match || next.index + next[0].length !== match.index + match[0].length ) { match = next } expression.lastIndex = next.index + next[1]!.length + next[2]!.length } } else { match = (options.includePrerelease ? COERCE_FULL_EXACT : COERCE_EXACT).exec( input, ) } if (!match) return null const major = match[2] const minor = match[3] || '0' const patch = match[4] || '0' const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '' const build = options.includePrerelease && match[6] ? `+${match[6]}` : '' return tryParse(`${major}.${minor}.${patch}${prerelease}${build}`, options) } function isPrereleasePrefix( prerelease: readonly PrereleaseIdentifier[], identifier: string, ): boolean { const identifiers = identifier.split('.') return ( identifiers.length <= prerelease.length && identifiers.every( (part, index) => compareIdentifiers(prerelease[index]!, part) === 0, ) ) } function incrementPrerelease( version: SemVer, identifier: string | undefined, identifierBase: 0 | 1 | false | undefined, ): void { const base = Number(identifierBase) ? 1 : 0 let prerelease = version.prerelease if (prerelease?.length) { let foundNumeric = false for (let index = prerelease.length - 1; index >= 0; index--) { if (typeof prerelease[index] === 'number') { prerelease[index] = Number(prerelease[index]) + 1 foundNumeric = true break } } if (!foundNumeric) { if (identifier === prerelease.join('.') && identifierBase === false) { throw new Error('invalid increment argument: identifier already exists') } prerelease.push(base) } } else { prerelease = [base] version.prerelease = prerelease } if (!identifier) return const reset: PrereleaseIdentifier[] = identifierBase === false ? [identifier] : [identifier, base] if (isPrereleasePrefix(prerelease, identifier)) { const next = prerelease[identifier.split('.').length] if (Number.isNaN(Number(next))) version.prerelease = reset } else { version.prerelease = reset } } function incrementMutable( version: SemVer, release: IncrementType | 'pre', identifier: string | undefined, identifierBase: 0 | 1 | false | undefined, ): void { switch (release) { case 'premajor': version.prerelease = undefined version.patch = 0 version.minor = 0 version.major++ incrementPrerelease(version, identifier, identifierBase) break case 'preminor': version.prerelease = undefined version.patch = 0 version.minor++ incrementPrerelease(version, identifier, identifierBase) break case 'prepatch': version.prerelease = undefined incrementMutable(version, 'patch', identifier, identifierBase) incrementPrerelease(version, identifier, identifierBase) break case 'prerelease': if (!version.prerelease?.length) { incrementMutable(version, 'patch', identifier, identifierBase) } incrementPrerelease(version, identifier, identifierBase) break case 'release': if (!version.prerelease?.length) { throw new Error( `version ${formatFullVersion(version)} is not a prerelease`, ) } version.prerelease = undefined break case 'major': if ( version.minor !== 0 || version.patch !== 0 || !version.prerelease?.length ) { version.major++ } version.minor = 0 version.patch = 0 version.prerelease = undefined break case 'minor': if (version.patch !== 0 || !version.prerelease?.length) { version.minor++ } version.patch = 0 version.prerelease = undefined break case 'patch': if (!version.prerelease?.length) version.patch++ version.prerelease = undefined break /* v8 ignore next */ case 'pre': incrementPrerelease(version, identifier, identifierBase) break default: throw new Error(`invalid increment argument: ${release as string}`) } } function incrementParsedVersion( parsed: SemVer, release: IncrementType, identifier?: string, identifierBase?: 0 | 1 | false, loose = false, ): string { if (release.startsWith('pre')) { if (!identifier && identifierBase === false) { throw new Error('invalid increment argument: identifier is empty') } if (identifier) { const expression = loose ? PRERELEASE_LOOSE_EXACT : PRERELEASE_EXACT const match = `-${identifier}`.match(expression) if (!match || match[1] !== identifier) { throw new Error(`invalid identifier: ${identifier}`) } } } const mutable: SemVer = { build: parsed.build ? [...parsed.build] : undefined, major: parsed.major, minor: parsed.minor, patch: parsed.patch, prerelease: parsed.prerelease ? [...parsed.prerelease] : undefined, } incrementMutable(mutable, release, identifier, identifierBase) return formatComparableVersion(mutable) } export function increment( version: VersionInput, release: IncrementType, options: IncrementOptions = {}, ): string | null { try { return incrementParsedVersion( parse(version, options), release, options.identifier, options.identifierBase, options.loose, ) } catch { return null } } export function truncate( version: VersionInput, truncation: TruncationType, options: VersionOptions = {}, ): string | null { if (!TRUNCATION_TYPES.includes(truncation)) return null const parsed = tryParse(version, options) if (!parsed) return null if (truncation.startsWith('pre')) return formatComparableVersion(parsed) return formatComparableVersion({ major: parsed.major, minor: truncation === 'major' ? 0 : parsed.minor, patch: truncation === 'major' || truncation === 'minor' ? 0 : parsed.patch, }) } export function difference( left: VersionInput, right: VersionInput, ): VersionDifference | null { const leftVersion = parse(left) const rightVersion = parse(right) const comparison = compareParsed(leftVersion, rightVersion) if (comparison === 0) return null const high = comparison > 0 ? leftVersion : rightVersion const low = comparison > 0 ? rightVersion : leftVersion const highHasPrerelease = high.prerelease?.length const lowHasPrerelease = low.prerelease?.length if (lowHasPrerelease && !highHasPrerelease) { if (low.patch === 0 && low.minor === 0) return 'major' if (compareMainParsed(low, high) === 0) { return low.minor !== 0 && low.patch === 0 ? 'minor' : 'patch' } } const prefix = highHasPrerelease ? 'pre' : '' if (leftVersion.major !== rightVersion.major) { return `${prefix}major` as VersionDifference } if (leftVersion.minor !== rightVersion.minor) { return `${prefix}minor` as VersionDifference } if (leftVersion.patch !== rightVersion.patch) { return `${prefix}patch` as VersionDifference } return 'prerelease' } export function getMajor( version: VersionInput, options: VersionOptions = {}, ): number { return parse(version, options).major } export function getMinor( version: VersionInput, options: VersionOptions = {}, ): number { return parse(version, options).minor } export function getPatch( version: VersionInput, options: VersionOptions = {}, ): number { return parse(version, options).patch } export function getPrerelease( version: VersionInput, options: VersionOptions = {}, ): PrereleaseIdentifier[] | null { const parsed = tryParse(version, options) return parsed ? [...(parsed.prerelease || [])] : null } export function getBuild( version: VersionInput, options: VersionOptions = {}, ): string[] | null { const parsed = tryParse(version, options) return parsed ? [...(parsed.build || [])] : null } sxzz-verkit-a5b7150/src/version/parse.ts000066400000000000000000000045731525327470400203400ustar00rootroot00000000000000import { MAX_LENGTH } from './constants.ts' import { FULL_PLAIN, LOOSE_PLAIN, safeRegex } from './patterns.ts' import type { PrereleaseIdentifier, SemVer, VersionInput, VersionOptions, } from './types.ts' const FULL = safeRegex(`^${FULL_PLAIN}$`) const LOOSE = safeRegex(`^${LOOSE_PLAIN}$`) const NUMERIC = /^\d+$/ export function formatComparableVersion( version: Pick, ): string { const base = `${version.major}.${version.minor}.${version.patch}` return version.prerelease?.length ? `${base}-${version.prerelease.join('.')}` : base } export function formatFullVersion( version: Pick, ): string { const comparable = formatComparableVersion(version) return version.build?.length ? `${comparable}+${version.build.join('.')}` : comparable } export function parse( version: VersionInput, options: VersionOptions = {}, ): SemVer { if (typeof version !== 'string') return version if (version.length > MAX_LENGTH) { throw new TypeError( `Version exceeds the maximum length of ${MAX_LENGTH} characters`, ) } const match = version.trim().match(options.loose ? LOOSE : FULL) if (!match) throw new TypeError(`Invalid version syntax: ${version}`) const major = Number(match[1]) const minor = Number(match[2]) const patch = Number(match[3]) if (major > Number.MAX_SAFE_INTEGER || major < 0) { throw new TypeError(`Invalid major version: ${match[1]}`) } if (minor > Number.MAX_SAFE_INTEGER || minor < 0) { throw new TypeError(`Invalid minor version: ${match[2]}`) } if (patch > Number.MAX_SAFE_INTEGER || patch < 0) { throw new TypeError(`Invalid patch version: ${match[3]}`) } const prerelease = match[4] ? match[4].split('.').map((identifier) => { if (NUMERIC.test(identifier)) { const numeric = Number(identifier) if (numeric >= 0 && numeric < Number.MAX_SAFE_INTEGER) { return numeric } } return identifier }) : undefined const build = match[5]?.split('.') return { build, major, minor, patch, prerelease, } } export function tryParse( version: VersionInput, options: VersionOptions = {}, ): SemVer | null { try { return parse(version, options) } catch { return null } } sxzz-verkit-a5b7150/src/version/patterns.ts000066400000000000000000000057711525327470400210670ustar00rootroot00000000000000import { MAX_LENGTH, MAX_SAFE_BUILD_LENGTH, MAX_SAFE_COMPONENT_LENGTH, } from './constants.ts' export const LETTER_DASH_NUMBER: string = '[a-zA-Z0-9-]' export const NUMERIC_IDENTIFIER: string = String.raw`0|[1-9]\d*` export const NUMERIC_IDENTIFIER_LOOSE: string = String.raw`\d+` export const NON_NUMERIC_IDENTIFIER: string = String.raw`\d*[a-zA-Z-]${LETTER_DASH_NUMBER}*` export const MAIN_VERSION: string = String.raw`(${NUMERIC_IDENTIFIER})\.(${NUMERIC_IDENTIFIER})\.(${NUMERIC_IDENTIFIER})` export const MAIN_VERSION_LOOSE: string = String.raw`(${NUMERIC_IDENTIFIER_LOOSE})\.(${NUMERIC_IDENTIFIER_LOOSE})\.(${NUMERIC_IDENTIFIER_LOOSE})` export const PRERELEASE_IDENTIFIER: string = `(?:${NON_NUMERIC_IDENTIFIER}|${NUMERIC_IDENTIFIER})` export const PRERELEASE_IDENTIFIER_LOOSE: string = `(?:${NON_NUMERIC_IDENTIFIER}|${NUMERIC_IDENTIFIER_LOOSE})` export const PRERELEASE: string = String.raw`(?:-(${PRERELEASE_IDENTIFIER}(?:\.${PRERELEASE_IDENTIFIER})*))` export const PRERELEASE_LOOSE: string = String.raw`(?:-?(${PRERELEASE_IDENTIFIER_LOOSE}(?:\.${PRERELEASE_IDENTIFIER_LOOSE})*))` export const BUILD_IDENTIFIER: string = `${LETTER_DASH_NUMBER}+` export const BUILD: string = String.raw`(?:\+(${BUILD_IDENTIFIER}(?:\.${BUILD_IDENTIFIER})*))` export const FULL_PLAIN: string = `v?${MAIN_VERSION}${PRERELEASE}?${BUILD}?` export const LOOSE_PLAIN: string = String.raw`[v=\s]*${MAIN_VERSION_LOOSE}${PRERELEASE_LOOSE}?${BUILD}?` export const GREATER_LESS_THAN: string = '((?:<|>)?=?)' export const XRANGE_IDENTIFIER: string = String.raw`${NUMERIC_IDENTIFIER}|x|X|\*` export const XRANGE_IDENTIFIER_LOOSE: string = String.raw`${NUMERIC_IDENTIFIER_LOOSE}|x|X|\*` export const XRANGE_PLAIN: string = String.raw`[v=\s]*(${XRANGE_IDENTIFIER})(?:\.(${XRANGE_IDENTIFIER})(?:\.(${XRANGE_IDENTIFIER})(?:${PRERELEASE})?${BUILD}?)?)?` export const XRANGE_PLAIN_LOOSE: string = String.raw`[v=\s]*(${XRANGE_IDENTIFIER_LOOSE})(?:\.(${XRANGE_IDENTIFIER_LOOSE})(?:\.(${XRANGE_IDENTIFIER_LOOSE})(?:${PRERELEASE_LOOSE})?${BUILD}?)?)?` export const LONE_TILDE: string = '(?:~>?)' export const LONE_CARET: string = String.raw`(?:\^)` export const COERCE_PLAIN: string = String.raw`(^|[^\d])(\d{1,${MAX_SAFE_COMPONENT_LENGTH}})(?:\.(\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?(?:\.(\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` export const COERCE: string = String.raw`${COERCE_PLAIN}(?:$|[^\d])` export const COERCE_FULL: string = String.raw`${COERCE_PLAIN}(?:${PRERELEASE})?(?:${BUILD})?(?:$|[^\d])` export function makeSafeRegexSource(source: string): string { const replacements: readonly (readonly [string, number])[] = [ [String.raw`\s`, 1], [String.raw`\d`, MAX_LENGTH], [LETTER_DASH_NUMBER, MAX_SAFE_BUILD_LENGTH], ] for (const [token, maximum] of replacements) { source = source .split(`${token}*`) .join(`${token}{0,${maximum}}`) .split(`${token}+`) .join(`${token}{1,${maximum}}`) } return source } export function safeRegex(source: string, flags?: string): RegExp { return new RegExp(makeSafeRegexSource(source), flags) } sxzz-verkit-a5b7150/src/version/types.ts000066400000000000000000000017541525327470400203700ustar00rootroot00000000000000export interface VersionOptions { loose?: boolean } export interface CoerceOptions extends VersionOptions { includePrerelease?: boolean rtl?: boolean } export interface IncrementOptions extends VersionOptions { identifier?: string identifierBase?: 0 | 1 | false } export type PrereleaseIdentifier = number | string export interface SemVer { major: number minor: number patch: number prerelease?: PrereleaseIdentifier[] | undefined build?: string[] | undefined } export type VersionInput = SemVer | string export type Comparison = -1 | 0 | 1 export type ComparisonOperator = '' | '!=' | '!==' | '<' | '<=' | '=' | '==' | '===' | '>' | '>=' export type IncrementType = | 'major' | 'minor' | 'patch' | 'premajor' | 'preminor' | 'prepatch' | 'prerelease' | 'release' export type TruncationType = Exclude export type VersionDifference = | 'major' | 'minor' | 'patch' | 'premajor' | 'preminor' | 'prepatch' | 'prerelease' sxzz-verkit-a5b7150/tests/000077500000000000000000000000001525327470400155335ustar00rootroot00000000000000sxzz-verkit-a5b7150/tests/bundle-size.test.ts000066400000000000000000000070421525327470400213050ustar00rootroot00000000000000import { Buffer } from 'node:buffer' import { join } from 'node:path' import { stdout } from 'node:process' import { fileURLToPath } from 'node:url' import { brotliCompressSync, gzipSync, constants as zlibConstants, } from 'node:zlib' import { rolldown } from 'rolldown' import { describe, expect, it } from 'vitest' import { runCommonOperations as runSemverOperations } from './fixtures/bundle-size/semver.ts' import { runCommonOperations as runVerkitOperations } from './fixtures/bundle-size/verkit.ts' interface BundleSize { readonly brotli: number readonly gzip: number readonly minified: number } const { dirname } = import.meta const entries = { full: { semver: fileURLToPath(import.meta.resolve('semver')), verkit: join(dirname, '../src/index.ts'), }, common: { semver: join(dirname, 'fixtures/bundle-size/semver.ts'), verkit: join(dirname, 'fixtures/bundle-size/verkit.ts'), }, } as const const VERKIT_BUDGETS: Record<'common' | 'full', BundleSize> = { common: { brotli: 3_700, gzip: 4_000, minified: 12_000, }, full: { brotli: 5_500, gzip: 6_000, minified: 20_000, }, } async function getMinifiedBundleSize(input: string): Promise { const bundle = await rolldown({ input, treeshake: true }) try { // Use the exact same minification pipeline for both consumers so the // comparison measures their tree-shaken runtime code, not build settings. const output = await bundle.generate({ format: 'esm', minify: true }) const chunk = output.output.find((item) => item.type === 'chunk') if (!chunk) throw new Error(`Rolldown did not emit a chunk for ${input}`) const code = Buffer.from(chunk.code) return { brotli: brotliCompressSync(code, { params: { [zlibConstants.BROTLI_PARAM_QUALITY]: 11, }, }).byteLength, gzip: gzipSync(code, { level: 9 }).byteLength, minified: code.byteLength, } } finally { await bundle.close() } } function formatSize(size: BundleSize): string { return `min ${size.minified} B, gzip ${size.gzip} B, brotli ${size.brotli} B` } function expectSmallerAndWithinBudget( verkit: BundleSize, semver: BundleSize, budget: BundleSize, ): void { expect(verkit.minified).toBeLessThan(semver.minified) expect(verkit.gzip).toBeLessThan(semver.gzip) expect(verkit.brotli).toBeLessThan(semver.brotli) expect(verkit.minified).toBeLessThanOrEqual(budget.minified) expect(verkit.gzip).toBeLessThanOrEqual(budget.gzip) expect(verkit.brotli).toBeLessThanOrEqual(budget.brotli) } describe('bundle size', () => { it('is smaller than minified npm semver for a full import', async () => { const [verkit, semver] = await Promise.all([ getMinifiedBundleSize(entries.full.verkit), getMinifiedBundleSize(entries.full.semver), ]) expectSmallerAndWithinBudget(verkit, semver, VERKIT_BUDGETS.full) stdout.write( `\nBundle size (full/CDN) — verkit: ${formatSize(verkit)}; semver: ${formatSize(semver)}\n`, ) }) it('is smaller than minified npm semver for common imports', async () => { const [verkit, semver] = await Promise.all([ getMinifiedBundleSize(entries.common.verkit), getMinifiedBundleSize(entries.common.semver), ]) expect(runVerkitOperations('1.2.3', '^1.0.0')).toEqual( runSemverOperations('1.2.3', '^1.0.0'), ) expectSmallerAndWithinBudget(verkit, semver, VERKIT_BUDGETS.common) stdout.write( `\nBundle size (common imports) — verkit: ${formatSize(verkit)}; semver: ${formatSize(semver)}\n`, ) }) }) sxzz-verkit-a5b7150/tests/comparator.test.ts000066400000000000000000000060351525327470400212340ustar00rootroot00000000000000import { describe, expect, it } from 'vitest' import { comparatorsIntersect, normalizeComparator, parseComparator, satisfiesComparator, tryParseComparator, } from '../src/comparator.ts' import { parse } from '../src/version.ts' import comparatorIntersections from './fixtures/node-semver/comparator-intersection.ts' type IntersectionCase = readonly [string, string, boolean, boolean?] describe('comparators', () => { it('parses reusable mutable comparators', () => { const comparator = parseComparator('>=1.2.3') expect(comparator).toEqual({ operator: '>=', options: {}, value: '>=1.2.3', version: parse('1.2.3'), }) expect(parseComparator(comparator)).toBe(comparator) expect(tryParseComparator(comparator)).toBe(comparator) expect(tryParseComparator('not a comparator')).toBeNull() expect(() => parseComparator('not a comparator')).toThrow(TypeError) comparator.version!.patch = 4 expect(normalizeComparator(comparator)).toBe('>=1.2.4') expect(satisfiesComparator('1.2.4', comparator)).toBe(true) expect(comparatorsIntersect(comparator, parseComparator('<2.0.0'))).toBe( true, ) }) it('normalizes and tests strict comparators', () => { expect(normalizeComparator(' >= 1.2.3+build ')).toBe('>=1.2.3') expect(satisfiesComparator('1.2.3+other', '>=1.2.3')).toBe(true) expect(satisfiesComparator('1.2.3-alpha', '>=1.2.3')).toBe(false) expect(satisfiesComparator('not a version', '>=1.2.3')).toBe(false) expect(satisfiesComparator(parse('1.2.3'), '>=1.2.3')).toBe(true) expect(() => normalizeComparator('not a comparator')).toThrow(TypeError) }) it('matches every comparator intersection fixture', () => { for (const row of comparatorIntersections as readonly IntersectionCase[]) { const [left, right, expected, includePrerelease = false] = row expect(comparatorsIntersect(left, right, { includePrerelease })).toBe( expected, ) } }) it('applies the prerelease rule to an exact-version comparator', () => { const cases: readonly IntersectionCase[] = [ ['1.2.3-a', '>1.0.0', false], ['1.2.3-a', '>=1.0.0', false], ['1.2.3-a', '<2.0.0', false], ['1.2.3-a', '<=2.0.0', false], ['=1.2.3-a', '<2.0.0', false], ['1.2.3-a', '>=1.2.3', false], ['>1.0.0', '1.2.3-a', false], ['<2.0.0', '1.2.3-a', false], ['>=1.2.3', '=1.2.3-a', false], // the rule is satisfied: same tuple, and the other side is a prerelease ['1.2.3-a', '>=1.2.3-a', true], ['1.2.3-a', '<1.2.3-b', true], ['1.2.3-a', '=1.2.3-a', true], ['>=1.2.3-a', '1.2.3-a', true], ['1.2.3-a', '>1.0.0', true, true], ['1.2.3-a', '<2.0.0', true, true], // plain versions are untouched ['1.2.3', '>1.0.0', true], ['1.2.3', '<1.0.0', false], ['>1.0.0', '1.2.3', true], ] for (const [left, right, expected, includePrerelease = false] of cases) { expect(comparatorsIntersect(left, right, { includePrerelease })).toBe( expected, ) } }) }) sxzz-verkit-a5b7150/tests/comparator.types.ts000066400000000000000000000020551525327470400214170ustar00rootroot00000000000000import { comparatorsIntersect, normalizeComparator, parseComparator, satisfiesComparator, tryParseComparator, type ComparatorInput, type RangeOptions, type SemVerComparator, } from '../src/index.ts' declare const input: ComparatorInput declare const options: RangeOptions declare const parsed: SemVerComparator parseComparator(input) tryParseComparator(input) normalizeComparator(input) satisfiesComparator('1.0.0', input) comparatorsIntersect(input, parsed) // @ts-expect-error A parsed comparator already contains its parsing options. parseComparator(parsed, options) // @ts-expect-error A parsed comparator already contains its parsing options. tryParseComparator(parsed, options) // @ts-expect-error A parsed comparator already contains its parsing options. normalizeComparator(parsed, options) // @ts-expect-error A parsed comparator already contains its parsing options. satisfiesComparator('1.0.0', parsed, options) // @ts-expect-error Parsed comparators already contain their parsing options. comparatorsIntersect(parsed, '>=1.0.0', options) sxzz-verkit-a5b7150/tests/comparison.test.ts000066400000000000000000000106431525327470400212370ustar00rootroot00000000000000import { describe, expect, it } from 'vitest' import { compare, compareBuild, compareIdentifiers, compareIdentifiersReversed, compareMain, comparePrerelease, compareReversed, compareWithOperator, isEqual, isGreaterThan, isGreaterThanOrEqual, isLessThan, isLessThanOrEqual, isNotEqual, parse, sort, sortReversed, type VersionOptions, } from '../src/version.ts' import comparisons from './fixtures/node-semver/comparisons.ts' import equality from './fixtures/node-semver/equality.ts' type ComparisonCase = readonly [string, string, unknown?] function versionOptions(value: unknown): VersionOptions { if (value === true) return { loose: true } return value && typeof value === 'object' ? (value as VersionOptions) : {} } describe('version comparison', () => { it('accepts parsed SemVer objects', () => { const left = parse('2.0.0+two') const right = { major: 1, minor: 0, patch: 0 } expect(compare(left, right)).toBe(1) expect(compareBuild(left, '2.0.0+one')).toBe(1) expect(compareBuild(right, { ...right, build: ['one'] })).toBe(-1) expect(isGreaterThan(left, right)).toBe(true) }) it('orders every comparison fixture', () => { for (const row of comparisons as readonly ComparisonCase[]) { const [left, right, rawOptions] = row const options = versionOptions(rawOptions) expect(compare(left, right, options)).toBe(1) expect(compareReversed(left, right, options)).toBe(-1) expect(isGreaterThan(left, right, options)).toBe(true) expect(isGreaterThanOrEqual(left, right, options)).toBe(true) expect(isLessThan(right, left, options)).toBe(true) expect(isLessThanOrEqual(right, left, options)).toBe(true) expect(isNotEqual(left, right, options)).toBe(true) } }) it('treats every equality fixture as equivalent', () => { for (const row of equality as readonly ComparisonCase[]) { const [left, right, rawOptions] = row const options = versionOptions(rawOptions) expect(compare(left, right, options)).toBe(0) expect(isEqual(left, right, options)).toBe(true) expect(isGreaterThanOrEqual(left, right, options)).toBe(true) expect(isLessThanOrEqual(left, right, options)).toBe(true) expect(compareWithOperator(left, '=', right, options)).toBe(true) } }) it('compares main, prerelease, and build components independently', () => { expect(compareMain('1.2.3-alpha', '1.2.3')).toBe(0) expect(comparePrerelease('1.2.3-alpha', '9.9.9-beta')).toBe(-1) expect(compare('1.2.3+2', '1.2.3+1')).toBe(0) expect(compareBuild('1.2.3+2', '1.2.3+1')).toBe(1) expect(compareBuild('1.2.3+one', '1.2.3+one')).toBe(0) expect(compareBuild('1.2.3+one', '1.2.3')).toBe(1) }) it('supports semver and identity operators', () => { expect(compareWithOperator('1.2.3', '', '1.2.3')).toBe(true) expect(compareWithOperator('v1.2.3', '==', '1.2.3')).toBe(true) expect(compareWithOperator('v1.2.3', '===', '1.2.3')).toBe(false) expect(compareWithOperator('v1.2.3', '!==', '1.2.3')).toBe(true) expect(compareWithOperator('2.0.0', '!=', '1.0.0')).toBe(true) expect(compareWithOperator('2.0.0', '>', '1.0.0')).toBe(true) expect(compareWithOperator('2.0.0', '>=', '2.0.0')).toBe(true) expect(compareWithOperator('1.0.0', '<', '2.0.0')).toBe(true) expect(compareWithOperator('2.0.0', '<=', '2.0.0')).toBe(true) expect(() => compareWithOperator('1.0.0', 'not-an-operator' as never, '1.0.0'), ).toThrow(TypeError) }) it('compares identifiers using semver precedence', () => { expect(compareIdentifiers(1, 1)).toBe(0) expect(compareIdentifiers(1, 2)).toBe(-1) expect(compareIdentifiers('2', 'alpha')).toBe(-1) expect(compareIdentifiers('beta', 'alpha')).toBe(1) expect(compareIdentifiersReversed('beta', 'alpha')).toBe(-1) }) }) describe('sorting', () => { it('preserves parsed object identities', () => { const lower = parse('1.0.0') const higher = parse('2.0.0') expect(sort([higher, lower])).toEqual([lower, higher]) expect(sortReversed([lower, higher])).toEqual([higher, lower]) }) it('sorts by build-aware precedence without mutating the input', () => { const versions = ['1.0.0+2', '2.0.0', '1.0.0+1'] const original = [...versions] expect(sort(versions)).toEqual(['1.0.0+1', '1.0.0+2', '2.0.0']) expect(sortReversed(versions)).toEqual(['2.0.0', '1.0.0+2', '1.0.0+1']) expect(versions).toEqual(original) }) }) sxzz-verkit-a5b7150/tests/fixtures/000077500000000000000000000000001525327470400174045ustar00rootroot00000000000000sxzz-verkit-a5b7150/tests/fixtures/bundle-size/000077500000000000000000000000001525327470400216255ustar00rootroot00000000000000sxzz-verkit-a5b7150/tests/fixtures/bundle-size/semver.ts000066400000000000000000000007061525327470400235010ustar00rootroot00000000000000import { coerce, compare, inc, satisfies, valid } from 'semver' export function runCommonOperations( version: string, range: string, ): readonly [string | null, boolean, number, string | null, number | null] { return [ valid(version), satisfies(version, range), compare(version, '1.0.0'), inc(version, 'patch'), /* v8 ignore start -- @preserve */ coerce(version)?.major ?? null, /* v8 ignore stop -- @preserve */ ] } sxzz-verkit-a5b7150/tests/fixtures/bundle-size/verkit.ts000066400000000000000000000010161525327470400234770ustar00rootroot00000000000000import { coerce, compare, increment, normalize, satisfies, } from '../../../src/index.ts' export function runCommonOperations( version: string, range: string, ): readonly [string | null, boolean, number, string | null, number | null] { const coerced = coerce(version) return [ normalize(version), satisfies(version, range), compare(version, '1.0.0'), increment(version, 'patch'), /* v8 ignore start -- @preserve */ coerced?.major ?? null, /* v8 ignore stop -- @preserve */ ] } sxzz-verkit-a5b7150/tests/fixtures/node-semver/000077500000000000000000000000001525327470400216305ustar00rootroot00000000000000sxzz-verkit-a5b7150/tests/fixtures/node-semver/comparator-intersection.ts000066400000000000000000000026151525327470400270570ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // c0, c1, expected intersection, includePrerelease const fixtures: readonly (readonly unknown[])[] = [ // One is a Version ['1.3.0', '>=1.3.0', true], ['1.3.0', '>1.3.0', false], ['>=1.3.0', '1.3.0', true], ['>1.3.0', '1.3.0', false], // Same direction increasing ['>1.3.0', '>1.2.0', true], ['>1.2.0', '>1.3.0', true], ['>=1.2.0', '>1.3.0', true], ['>1.2.0', '>=1.3.0', true], // Same direction decreasing ['<1.3.0', '<1.2.0', true], ['<1.2.0', '<1.3.0', true], ['<=1.2.0', '<1.3.0', true], ['<1.2.0', '<=1.3.0', true], // Different directions, same semver and inclusive operator ['>=1.3.0', '<=1.3.0', true], ['>=v1.3.0', '<=1.3.0', true], ['>=1.3.0', '>=1.3.0', true], ['<=1.3.0', '<=1.3.0', true], ['<=1.3.0', '<=v1.3.0', true], ['>1.3.0', '<=1.3.0', false], ['>=1.3.0', '<1.3.0', false], // Opposite matching directions ['>1.0.0', '<2.0.0', true], ['>=1.0.0', '<2.0.0', true], ['>=1.0.0', '<=2.0.0', true], ['>1.0.0', '<=2.0.0', true], ['<=2.0.0', '>1.0.0', true], ['<=1.0.0', '>=2.0.0', false], ['', '', true], ['', '>1.0.0', true], ['<=2.0.0', '', true], ['<0.0.0', '<0.1.0', false], ['<0.1.0', '<0.0.0', false], ['<0.0.0-0', '<0.1.0', false], ['<0.1.0', '<0.0.0-0', false], ['<0.0.0-0', '<0.1.0', false, true], ['<0.1.0', '<0.0.0-0', false, true], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/comparisons.ts000066400000000000000000000022341525327470400245360ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [version1, version2] // version1 should be greater than version2 // used by the cmp, eq, gt, lt, and neq tests const fixtures: readonly (readonly unknown[])[] = [ ['0.0.0', '0.0.0-foo'], ['0.0.1', '0.0.0'], ['1.0.0', '0.9.9'], ['0.10.0', '0.9.0'], ['0.99.0', '0.10.0', {}], ['2.0.0', '1.2.3', { loose: false }], ['v0.0.0', '0.0.0-foo', true], ['v0.0.1', '0.0.0', { loose: true }], ['v1.0.0', '0.9.9', true], ['v0.10.0', '0.9.0', true], ['v0.99.0', '0.10.0', true], ['v2.0.0', '1.2.3', true], ['0.0.0', 'v0.0.0-foo', true], ['0.0.1', 'v0.0.0', true], ['1.0.0', 'v0.9.9', true], ['0.10.0', 'v0.9.0', true], ['0.99.0', 'v0.10.0', true], ['2.0.0', 'v1.2.3', true], ['1.2.3', '1.2.3-asdf'], ['1.2.3', '1.2.3-4'], ['1.2.3', '1.2.3-4-foo'], ['1.2.3-5-foo', '1.2.3-5'], ['1.2.3-5', '1.2.3-4'], ['1.2.3-5-foo', '1.2.3-5-Foo'], ['3.0.0', '2.7.2+asdf'], ['1.2.3-a.10', '1.2.3-a.5'], ['1.2.3-a.b', '1.2.3-a.5'], ['1.2.3-a.b', '1.2.3-a'], ['1.2.3-a.b.c.10.d.5', '1.2.3-a.b.c.5.d.100'], ['1.2.3-r2', '1.2.3-r100'], ['1.2.3-r100', '1.2.3-R2'], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/equality.ts000066400000000000000000000030131525327470400240320ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [version1, version2] // version1 should be equivalent to version2 const fixtures: readonly (readonly unknown[])[] = [ ['1.2.3', 'v1.2.3', true], ['1.2.3', '=1.2.3', true], ['1.2.3', 'v 1.2.3', true], ['1.2.3', '= 1.2.3', true], ['1.2.3', ' v1.2.3', true], ['1.2.3', ' =1.2.3', true], ['1.2.3', ' v 1.2.3', true], ['1.2.3', ' = 1.2.3', true], ['1.2.3-0', 'v1.2.3-0', true], ['1.2.3-0', '=1.2.3-0', true], ['1.2.3-0', 'v 1.2.3-0', true], ['1.2.3-0', '= 1.2.3-0', true], ['1.2.3-0', ' v1.2.3-0', true], ['1.2.3-0', ' =1.2.3-0', true], ['1.2.3-0', ' v 1.2.3-0', true], ['1.2.3-0', ' = 1.2.3-0', true], ['1.2.3-1', 'v1.2.3-1', true], ['1.2.3-1', '=1.2.3-1', true], ['1.2.3-1', 'v 1.2.3-1', true], ['1.2.3-1', '= 1.2.3-1', true], ['1.2.3-1', ' v1.2.3-1', true], ['1.2.3-1', ' =1.2.3-1', true], ['1.2.3-1', ' v 1.2.3-1', true], ['1.2.3-1', ' = 1.2.3-1', true], ['1.2.3-beta', 'v1.2.3-beta', true], ['1.2.3-beta', '=1.2.3-beta', true], ['1.2.3-beta', 'v 1.2.3-beta', true], ['1.2.3-beta', '= 1.2.3-beta', true], ['1.2.3-beta', ' v1.2.3-beta', true], ['1.2.3-beta', ' =1.2.3-beta', true], ['1.2.3-beta', ' v 1.2.3-beta', true], ['1.2.3-beta', ' = 1.2.3-beta', true], ['1.2.3-beta+build', ' = 1.2.3-beta+otherbuild', true], ['1.2.3+build', ' = 1.2.3+otherbuild', true], ['1.2.3-beta+build', '1.2.3-beta+otherbuild'], ['1.2.3+build', '1.2.3+otherbuild'], [' v1.2.3+build', '1.2.3+otherbuild'], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/increments.ts000066400000000000000000000202471525327470400243540ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [version, inc, result, options, identifier, identifierBase] // inc(version, inc, options, identifier, identifierBase) -> result const fixtures: readonly (readonly unknown[])[] = [ ['1.2.3', 'major', '2.0.0'], ['1.2.3', 'minor', '1.3.0'], ['1.2.3', 'patch', '1.2.4'], ['1.2.3tag', 'major', '2.0.0', true], ['1.2.3-tag', 'major', '2.0.0'], ['1.2.3', 'fake', null], ['1.2.0-0', 'patch', '1.2.0'], ['fake', 'major', null], ['1.2.3-4', 'major', '2.0.0'], ['1.2.3-4', 'minor', '1.3.0'], ['1.2.3-4', 'patch', '1.2.3'], ['1.2.3-alpha.0.beta', 'major', '2.0.0'], ['1.2.3-alpha.0.beta', 'minor', '1.3.0'], ['1.2.3-alpha.0.beta', 'patch', '1.2.3'], ['1.2.4', 'prerelease', '1.2.5-0'], ['1.2.3-0', 'prerelease', '1.2.3-1'], ['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1'], ['1.2.3-alpha.1', 'prerelease', '1.2.3-alpha.2'], ['1.2.3-alpha.2', 'prerelease', '1.2.3-alpha.3'], ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-alpha.1.beta'], ['1.2.3-alpha.1.beta', 'prerelease', '1.2.3-alpha.2.beta'], ['1.2.3-alpha.2.beta', 'prerelease', '1.2.3-alpha.3.beta'], ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-alpha.10.1.beta'], ['1.2.3-alpha.10.1.beta', 'prerelease', '1.2.3-alpha.10.2.beta'], ['1.2.3-alpha.10.2.beta', 'prerelease', '1.2.3-alpha.10.3.beta'], ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1'], ['1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2'], ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3'], [ '3.0.0-alpha.beta.5.4', 'prerelease', '3.0.0-alpha.beta.5.5', false, 'alpha.beta', ], [ '3.0.0-alpha.beta.5.4', 'prerelease', '3.0.0-alpha.beta.5.5', false, 'alpha.beta.5', ], [ '3.0.0-alpha.beta.gamma', 'prerelease', '3.0.0-alpha.beta.0', false, 'alpha.beta', ], ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'], ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'], ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'], ['1.0.0', 'prepatch', '1.0.1-alpha.1.1a.0', null, 'alpha.1.1a'], ['1.2.0', 'prepatch', '1.2.1-0'], ['1.2.0-1', 'prepatch', '1.2.1-0'], ['1.2.0', 'preminor', '1.3.0-0'], ['1.2.3-1', 'preminor', '1.3.0-0'], ['1.2.0', 'premajor', '2.0.0-0'], ['1.2.3-1', 'premajor', '2.0.0-0'], ['1.2.0-1', 'minor', '1.2.0'], ['1.0.0-1', 'major', '1.0.0'], ['1.0.0-1', 'release', '1.0.0'], ['1.2.0-1', 'release', '1.2.0'], ['1.2.3-1', 'release', '1.2.3'], ['1.2.3', 'release', null], // [version, inc, result, identifierIndex, loose, identifier] ['1.2.3', 'major', '2.0.0', false, 'dev'], ['1.2.3', 'minor', '1.3.0', false, 'dev'], ['1.2.3', 'patch', '1.2.4', false, 'dev'], ['1.2.3tag', 'major', '2.0.0', true, 'dev'], ['1.2.3-tag', 'major', '2.0.0', false, 'dev'], ['1.2.3', 'fake', null, false, 'dev'], ['1.2.0-0', 'patch', '1.2.0', false, 'dev'], ['fake', 'major', null, false, 'dev'], ['1.2.3-4', 'major', '2.0.0', false, 'dev'], ['1.2.3-4', 'minor', '1.3.0', false, 'dev'], ['1.2.3-4', 'patch', '1.2.3', false, 'dev'], ['1.2.3-alpha.0.beta', 'major', '2.0.0', false, 'dev'], ['1.2.3-alpha.0.beta', 'minor', '1.3.0', false, 'dev'], ['1.2.3-alpha.0.beta', 'patch', '1.2.3', false, 'dev'], ['1.2.4', 'prerelease', '1.2.5-dev.0', false, 'dev'], ['1.2.3-0', 'prerelease', '1.2.3-dev.0', false, 'dev'], ['1.2.3-alpha.0', 'prerelease', '1.2.3-dev.0', false, 'dev'], ['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1', false, 'alpha'], ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'], ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-alpha.1.beta', false, 'alpha'], ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'], [ '1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-alpha.10.1.beta', false, 'alpha', ], [ '1.2.3-alpha.10.1.beta', 'prerelease', '1.2.3-alpha.10.2.beta', false, 'alpha', ], [ '1.2.3-alpha.10.2.beta', 'prerelease', '1.2.3-alpha.10.3.beta', false, 'alpha', ], ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-dev.0', false, 'dev'], [ '1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1', false, 'alpha', ], [ '1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2', false, 'alpha', ], [ '1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3', false, 'alpha', ], [ '3.0.0-alpha.beta.5.4', 'prerelease', '3.0.0-alpha.beta.5.5', false, 'alpha.beta', ], [ '3.0.0-alpha.beta.5.4', 'prerelease', '3.0.0-alpha.beta.5.5', false, 'alpha.beta.5', ], [ '3.0.0-alpha.beta.gamma', 'prerelease', '3.0.0-alpha.beta.0', false, 'alpha.beta', ], ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-dev.0', false, 'dev'], ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta', false, 'alpha'], ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta', false, 'alpha'], ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta', false, 'alpha'], ['1.2.0', 'prepatch', '1.2.1-dev.0', false, 'dev'], ['1.2.0-1', 'prepatch', '1.2.1-dev.0', false, 'dev'], ['1.2.0', 'preminor', '1.3.0-dev.0', false, 'dev'], ['1.2.3-1', 'preminor', '1.3.0-dev.0', false, 'dev'], ['1.2.0', 'premajor', '2.0.0-dev.0', false, 'dev'], ['1.2.3-1', 'premajor', '2.0.0-dev.0', false, 'dev'], ['1.2.3-1', 'premajor', '2.0.0-dev.1', false, 'dev', 1], ['1.2.0-1', 'minor', '1.2.0', false, 'dev'], ['1.0.0-1', 'major', '1.0.0', 'dev'], ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev'], ['1.2.3-0', 'prerelease', '1.2.3-1.0', false, '1'], ['1.2.3-1.0', 'prerelease', '1.2.3-1.1', false, '1'], ['1.2.3-1.1', 'prerelease', '1.2.3-1.2', false, '1'], ['1.2.3-1.1', 'prerelease', '1.2.3-2.0', false, '2'], // [version, inc, result, identifierIndex, loose, identifier, identifierBase] ['1.2.0-1', 'prerelease', '1.2.0-alpha.0', false, 'alpha', '0'], ['1.2.1', 'prerelease', '1.2.2-alpha.0', false, 'alpha', '0'], ['0.2.0', 'prerelease', '0.2.1-alpha.0', false, 'alpha', '0'], ['1.2.2', 'prerelease', '1.2.3-alpha.1', false, 'alpha', '1'], ['1.2.3', 'prerelease', '1.2.4-alpha.1', false, 'alpha', '1'], ['1.2.4', 'prerelease', '1.2.5-alpha.1', false, 'alpha', '1'], ['1.2.0', 'prepatch', '1.2.1-dev.1', false, 'dev', '1'], ['1.2.0-1', 'prepatch', '1.2.1-dev.1', false, 'dev', '1'], ['1.2.0', 'premajor', '2.0.0-dev.0', false, 'dev', '0'], ['1.2.3-1', 'premajor', '2.0.0-dev.0', false, 'dev', '0'], ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.0', false, 'dev', '0'], ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.1', false, 'dev', '1'], ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.bar.0', false, '', '0'], ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.bar.1', false, '', '1'], ['1.2.0', 'preminor', '1.3.0-dev.1', false, 'dev', '1'], ['1.2.3-1', 'preminor', '1.3.0-dev.0', false, 'dev'], ['1.2.0', 'prerelease', '1.2.1-1', false, '', '1'], ['1.2.0-1', 'prerelease', '1.2.0-alpha', false, 'alpha', false], ['1.2.1', 'prerelease', '1.2.2-alpha', false, 'alpha', false], ['1.2.2', 'prerelease', '1.2.3-alpha', false, 'alpha', false], ['1.2.0', 'prepatch', '1.2.1-dev', false, 'dev', false], ['1.2.0-1', 'prepatch', '1.2.1-dev', false, 'dev', false], ['1.2.0', 'premajor', '2.0.0-dev', false, 'dev', false], ['1.2.3-1', 'premajor', '2.0.0-dev', false, 'dev', false], ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev', false, 'dev', false], ['1.2.3-dev.bar', 'prerelease', '1.2.3-dev.baz', false, 'dev.baz', false], ['1.2.0', 'preminor', '1.3.0-dev', false, 'dev', false], ['1.2.3-1', 'preminor', '1.3.0-dev', false, 'dev', false], ['1.2.3-dev', 'prerelease', null, false, 'dev', false], ['1.2.0-dev', 'premajor', '2.0.0-dev', false, 'dev', false], ['1.2.0-dev', 'preminor', '1.3.0-beta', false, 'beta', false], ['1.2.0-dev', 'prepatch', '1.2.1-dev', false, 'dev', false], ['1.2.0', 'prerelease', null, false, '', false], ['1.0.0-rc.1+build.4', 'prerelease', '1.0.0-rc.2', 'rc', false], ['1.2.0', 'prerelease', null, false, 'invalid/preid'], ['1.2.0', 'prerelease', null, false, 'invalid+build'], ['1.2.0beta', 'prerelease', null, { loose: true }, 'invalid/preid'], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/invalid-versions.ts000066400000000000000000000016171525327470400255010ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // none of these are semvers // [value, reason, opt] import { MAX_LENGTH } from '../../../src/version/constants.ts' const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER const fixtures: readonly (readonly unknown[])[] = [ [new Array(MAX_LENGTH).join('1') + '.0.0', 'too long'], [`${MAX_SAFE_INTEGER}0.0.0`, 'too big'], [`0.${MAX_SAFE_INTEGER}0.0`, 'too big'], [`0.0.${MAX_SAFE_INTEGER}0`, 'too big'], ['hello, world', 'not a version'], ['hello, world', 'even loose, its still junk', true], ['xyz', 'even loose as an opt, same', { loose: true }], [/a regexp/, 'regexp is not a string'], [/1.2.3/, 'semver-ish regexp is not a string'], [ { /* v8 ignore next -- @preserve */ toString: () => { throw new Error('never throw') }, }, 'obj with a tostring is not a string', ], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/range-exclude.ts000066400000000000000000000063741525327470400247350ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [range, version, options] // version should not be included by range const fixtures: readonly (readonly unknown[])[] = [ ['1.0.0 - 2.0.0', '2.2.3'], ['1.2.3+asdf - 2.4.3+asdf', '1.2.3-pre.2'], ['1.2.3+asdf - 2.4.3+asdf', '2.4.3-alpha'], ['^1.2.3+build', '2.0.0'], ['^1.2.3+build', '1.2.0'], ['^1.2.3', '1.2.3-pre'], ['^1.2', '1.2.0-pre'], ['>1.2', '1.3.0-beta'], ['<=1.2.3', '1.2.3-beta'], ['^1.2.3', '1.2.3-beta'], ['=0.7.x', '0.7.0-asdf'], ['>=0.7.x', '0.7.0-asdf'], ['<=0.7.x', '0.7.0-asdf'], ['1', '1.0.0beta', { loose: 420 }], ['<1', '1.0.0beta', true], ['< 1', '1.0.0beta', true], ['1.0.0', '1.0.1'], ['>=1.0.0', '0.0.0'], ['>=1.0.0', '0.0.1'], ['>=1.0.0', '0.1.0'], ['>1.0.0', '0.0.1'], ['>1.0.0', '0.1.0'], ['<=2.0.0', '3.0.0'], ['<=2.0.0', '2.9999.9999'], ['<=2.0.0', '2.2.9'], ['<2.0.0', '2.9999.9999'], ['<2.0.0', '2.2.9'], ['>=0.1.97', 'v0.1.93', true], ['>=0.1.97', '0.1.93'], ['0.1.20 || 1.2.4', '1.2.3'], ['>=0.2.3 || <0.0.1', '0.0.3'], ['>=0.2.3 || <0.0.1', '0.2.2'], ['2.x.x', '1.1.3', { loose: NaN }], ['2.x.x', '3.1.3'], ['1.2.x', '1.3.3'], ['1.2.x || 2.x', '3.1.3'], ['1.2.x || 2.x', '1.1.3'], ['2.*.*', '1.1.3'], ['2.*.*', '3.1.3'], ['1.2.*', '1.3.3'], ['1.2.* || 2.*', '3.1.3'], ['1.2.* || 2.*', '1.1.3'], ['2', '1.1.2'], ['2.3', '2.4.1'], ['~0.0.1', '0.1.0-alpha'], ['~0.0.1', '0.1.0'], ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0 ['~2.4', '2.3.9'], ['~>3.2.1', '3.3.2'], // >=3.2.1 <3.3.0 ['~>3.2.1', '3.2.0'], // >=3.2.1 <3.3.0 ['~1', '0.2.3'], // >=1.0.0 <2.0.0 ['~>1', '2.2.3'], ['~1.0', '1.1.0'], // >=1.0.0 <1.1.0 ['<1', '1.0.0'], ['>=1.2', '1.1.1'], ['1', '2.0.0beta', true], ['~v0.5.4-beta', '0.5.4-alpha'], ['=0.7.x', '0.8.2'], ['>=0.7.x', '0.6.2'], ['<0.7.x', '0.7.2'], ['<1.2.3', '1.2.3-beta'], ['=1.2.3', '1.2.3-beta'], ['>1.2', '1.2.8'], ['^0.0.1', '0.0.2-alpha'], ['^0.0.1', '0.0.2'], ['^1.2.3', '2.0.0-alpha'], ['^1.2.3', '1.2.2'], ['^1.2', '1.1.9'], ['*', 'v1.2.3-foo', true], // invalid versions never satisfy, but shouldn't throw ['*', 'not a version'], ['>=2', 'glorp'], ['>=2', false], ['2.x', '3.0.0-pre.0', { includePrerelease: true }], ['^0.0.3', '0.0.3-alpha', { includePrerelease: true }], ['^0.2.3', '0.2.3-alpha', { includePrerelease: true }], ['^1.0.0', '1.0.0-rc1', { includePrerelease: true }], ['^1.0.0', '2.0.0-rc1', { includePrerelease: true }], ['^1.2.3-rc2', '2.0.0', { includePrerelease: true }], ['^1.0.0', '2.0.0-rc1'], ['1 - 2', '3.0.0-pre', { includePrerelease: true }], ['1 - 2', '2.0.0-pre'], ['1 - 2', '1.0.0-pre'], ['1.0 - 2', '1.0.0-pre'], ['1.1.x', '1.0.0-a'], ['1.1.x', '1.1.0-a'], ['1.1.x', '1.2.0-a'], ['1.1.x', '1.2.0-a', { includePrerelease: true }], ['1.1.x', '1.0.0-a', { includePrerelease: true }], ['1.x', '1.0.0-a'], ['1.x', '1.1.0-a'], ['1.x', '1.2.0-a'], ['1.x', '0.0.0-a', { includePrerelease: true }], ['1.x', '2.0.0-a', { includePrerelease: true }], ['>=1.0.0 <1.1.0', '1.1.0'], ['>=1.0.0 <1.1.0', '1.1.0', { includePrerelease: true }], ['>=1.0.0 <1.1.0', '1.1.0-pre'], ['>=1.0.0 <1.1.0-pre', '1.1.0-pre'], ['== 1.0.0 || foo', '2.0.0', { loose: true }], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/range-include.ts000066400000000000000000000107321525327470400247200ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [range, version, options] // version should be included by range const fixtures: readonly (readonly unknown[])[] = [ ['1.0.0 - 2.0.0', '1.2.3'], ['^1.2.3+build', '1.2.3'], ['^1.2.3+build', '1.3.0'], ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3'], ['1.2.3pre+asdf - 2.4.3-pre+asdf', '1.2.3', true], ['1.2.3-pre+asdf - 2.4.3pre+asdf', '1.2.3', true], ['1.2.3pre+asdf - 2.4.3pre+asdf', '1.2.3', true], ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3-pre.2'], ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '2.4.3-alpha'], ['1.2.3+asdf - 2.4.3+asdf', '1.2.3'], ['1.0.0', '1.0.0'], ['>=*', '0.2.4'], ['', '1.0.0'], ['*', '1.2.3', {}], ['*', 'v1.2.3', { loose: 123 }], ['>=1.0.0', '1.0.0', /asdf/], ['>=1.0.0', '1.0.1', { loose: null }], ['>=1.0.0', '1.1.0', { loose: 0 }], ['>1.0.0', '1.0.1', { loose: undefined }], ['>1.0.0', '1.1.0'], ['<=2.0.0', '2.0.0'], ['<=2.0.0', '1.9999.9999'], ['<=2.0.0', '0.2.9'], ['<2.0.0', '1.9999.9999'], ['<2.0.0', '0.2.9'], ['>= 1.0.0', '1.0.0'], ['>= 1.0.0', '1.0.1'], ['>= 1.0.0', '1.1.0'], ['> 1.0.0', '1.0.1'], ['> 1.0.0', '1.1.0'], ['<= 2.0.0', '2.0.0'], ['<= 2.0.0', '1.9999.9999'], ['<= 2.0.0', '0.2.9'], ['< 2.0.0', '1.9999.9999'], ['<\t2.0.0', '0.2.9'], ['>=0.1.97', 'v0.1.97', true], ['>=0.1.97', '0.1.97'], ['0.1.20 || 1.2.4', '1.2.4'], ['>=0.2.3 || <0.0.1', '0.0.0'], ['>=0.2.3 || <0.0.1', '0.2.3'], ['>=0.2.3 || <0.0.1', '0.2.4'], ['||', '1.3.4'], ['2.x.x', '2.1.3'], ['1.2.x', '1.2.3'], ['1.2.x || 2.x', '2.1.3'], ['1.2.x || 2.x', '1.2.3'], ['x', '1.2.3'], ['2.*.*', '2.1.3'], ['1.2.*', '1.2.3'], ['1.2.* || 2.*', '2.1.3'], ['1.2.* || 2.*', '1.2.3'], ['*', '1.2.3'], ['2', '2.1.2'], ['2.3', '2.3.1'], ['~0.0.1', '0.0.1'], ['~0.0.1', '0.0.2'], ['~x', '0.0.9'], // >=2.4.0 <2.5.0 ['~2', '2.0.9'], // >=2.4.0 <2.5.0 ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0 ['~2.4', '2.4.5'], ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0, ['~1', '1.2.3'], // >=1.0.0 <2.0.0 ['~>1', '1.2.3'], ['~> 1', '1.2.3'], ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0, ['~ 1.0', '1.0.2'], ['~ 1.0.3', '1.0.12'], ['~ 1.0.3alpha', '1.0.12', { loose: true }], ['>=1', '1.0.0'], ['>= 1', '1.0.0'], ['<1.2', '1.1.1'], ['< 1.2', '1.1.1'], ['~v0.5.4-pre', '0.5.5'], ['~v0.5.4-pre', '0.5.4'], ['=0.7.x', '0.7.2'], ['<=0.7.x', '0.7.2'], ['>=0.7.x', '0.7.2'], ['<=0.7.x', '0.6.2'], ['~1.2.1 >=1.2.3', '1.2.3'], ['~1.2.1 =1.2.3', '1.2.3'], ['~1.2.1 1.2.3', '1.2.3'], ['~1.2.1 >=1.2.3 1.2.3', '1.2.3'], ['~1.2.1 1.2.3 >=1.2.3', '1.2.3'], ['>=1.2.1 1.2.3', '1.2.3'], ['1.2.3 >=1.2.1', '1.2.3'], ['>=1.2.3 >=1.2.1', '1.2.3'], ['>=1.2.1 >=1.2.3', '1.2.3'], ['>=1.2', '1.2.8'], ['^1.2.3', '1.8.1'], ['^0.1.2', '0.1.2'], ['^0.1', '0.1.2'], ['^0.0.1', '0.0.1'], ['^1.2', '1.4.2'], ['^1.2 ^1', '1.4.2'], ['^1.2.3-alpha', '1.2.3-pre'], ['^1.2.0-alpha', '1.2.0-pre'], ['^0.0.1-alpha', '0.0.1-beta'], ['^0.0.1-alpha', '0.0.1'], ['^0.1.1-alpha', '0.1.1-beta'], ['^x', '1.2.3'], ['x - 1.0.0', '0.9.7'], ['x - 1.x', '0.9.7'], ['1.0.0 - x', '1.9.7'], ['1.x - x', '1.9.7'], ['<=7.x', '7.9.9'], ['2.x', '2.0.0-pre.0', { includePrerelease: true }], ['2.x', '2.1.0-pre.0', { includePrerelease: true }], ['1.1.x', '1.1.0-a', { includePrerelease: true }], ['1.1.x', '1.1.1-a', { includePrerelease: true }], // tilde ranges are documented as equivalent to the matching x-range, // so with includePrerelease they must accept the same prereleases. #512 ['~1.1', '1.1.0-a', { includePrerelease: true }], ['~1.1.x', '1.1.0-a', { includePrerelease: true }], ['~1.1', '1.1.1-a', { includePrerelease: true }], ['~2', '2.0.0-pre.0', { includePrerelease: true }], ['~2.x', '2.0.0-pre.0', { includePrerelease: true }], ['*', '1.0.0-rc1', { includePrerelease: true }], ['^1.0.0-0', '1.0.1-rc1', { includePrerelease: true }], ['^1.0.0-rc2', '1.0.1-rc1', { includePrerelease: true }], ['^1.0.0', '1.0.1-rc1', { includePrerelease: true }], ['^1.0.0', '1.1.0-rc1', { includePrerelease: true }], ['1 - 2', '2.0.0-pre', { includePrerelease: true }], ['1 - 2', '1.0.0-pre', { includePrerelease: true }], ['1.0 - 2', '1.0.0-pre', { includePrerelease: true }], ['=0.7.x', '0.7.0-asdf', { includePrerelease: true }], ['>=0.7.x', '0.7.0-asdf', { includePrerelease: true }], ['<=0.7.x', '0.7.0-asdf', { includePrerelease: true }], ['>=1.0.0 <=1.1.0', '1.1.0-pre', { includePrerelease: true }], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/range-intersection.ts000066400000000000000000000040461525327470400260040ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // r0, r1, expected intersection const fixtures: readonly (readonly unknown[])[] = [ ['1.3.0 || <1.0.0 >2.0.0', '1.3.0 || <1.0.0 >2.0.0', true], ['<1.0.0 >2.0.0', '>0.0.0', false], ['>0.0.0', '<1.0.0 >2.0.0', false], ['<1.0.0 >2.0.0', '>1.4.0 <1.6.0', false], ['<1.0.0 >2.0.0', '>1.4.0 <1.6.0 || 2.0.0', false], ['>1.0.0 <=2.0.0', '2.0.0', true], ['<1.0.0 >=2.0.0', '2.1.0', false], ['<1.0.0 >=2.0.0', '>1.4.0 <1.6.0 || 2.0.0', false], ['1.5.x', '<1.5.0 || >=1.6.0', false], ['<1.5.0 || >=1.6.0', '1.5.x', false], [ '<1.6.16 || >=1.7.0 <1.7.11 || >=1.8.0 <1.8.2', '>=1.6.16 <1.7.0 || >=1.7.11 <1.8.0 || >=1.8.2', false, ], [ '<=1.6.16 || >=1.7.0 <1.7.11 || >=1.8.0 <1.8.2', '>=1.6.16 <1.7.0 || >=1.7.11 <1.8.0 || >=1.8.2', true, ], ['>=1.0.0', '<=1.0.0', true], ['>1.0.0 <1.0.0', '<=0.0.0', false], ['*', '0.0.1', true], ['*', '>=1.0.0', true], ['*', '>1.0.0', true], ['*', '~1.0.0', true], ['*', '<1.6.0', true], ['*', '<=1.6.0', true], ['1.*', '0.0.1', false], ['1.*', '2.0.0', false], ['1.*', '1.0.0', true], ['1.*', '<2.0.0', true], ['1.*', '>1.0.0', true], ['1.*', '<=1.0.0', true], ['1.*', '^1.0.0', true], ['1.0.*', '0.0.1', false], ['1.0.*', '<0.0.1', false], ['1.0.*', '>0.0.1', true], ['*', '1.3.0 || <1.0.0 >2.0.0', true], ['1.3.0 || <1.0.0 >2.0.0', '*', true], ['1.*', '1.3.0 || <1.0.0 >2.0.0', true], ['x', '0.0.1', true], ['x', '>=1.0.0', true], ['x', '>1.0.0', true], ['x', '~1.0.0', true], ['x', '<1.6.0', true], ['x', '<=1.6.0', true], ['1.x', '0.0.1', false], ['1.x', '2.0.0', false], ['1.x', '1.0.0', true], ['1.x', '<2.0.0', true], ['1.x', '>1.0.0', true], ['1.x', '<=1.0.0', true], ['1.x', '^1.0.0', true], ['1.0.x', '0.0.1', false], ['1.0.x', '<0.0.1', false], ['1.0.x', '>0.0.1', true], ['x', '1.3.0 || <1.0.0 >2.0.0', true], ['1.3.0 || <1.0.0 >2.0.0', 'x', true], ['1.x', '1.3.0 || <1.0.0 >2.0.0', true], ['*', '*', true], ['x', '', true], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/range-parse.ts000066400000000000000000000146251525327470400244140ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [range, canonical result, options] // null result means it's not a valid range // '*' is the return value from functions.validRange(), but // new Range().range will be '' in those cases const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER const fixtures: readonly (readonly unknown[])[] = [ ['1.0.0 - 2.0.0', '>=1.0.0 <=2.0.0'], ['1.0.0 - 2.0.0', '>=1.0.0-0 <2.0.1-0', { includePrerelease: true }], ['1 - 2', '>=1.0.0 <3.0.0-0'], ['1 - 2', '>=1.0.0-0 <3.0.0-0', { includePrerelease: true }], ['1.0 - 2.0', '>=1.0.0 <2.1.0-0'], ['1.0 - 2.0', '>=1.0.0-0 <2.1.0-0', { includePrerelease: true }], ['1.0.0', '1.0.0', { loose: false }], ['>=*', '*'], ['', '*'], ['*', '*'], ['>=1.0.0', '>=1.0.0'], ['>1.0.0', '>1.0.0'], ['<=2.0.0', '<=2.0.0'], ['1', '>=1.0.0 <2.0.0-0'], ['<2.0.0', '<2.0.0'], ['>= 1.0.0', '>=1.0.0'], ['>= 1.0.0', '>=1.0.0'], ['>= 1.0.0', '>=1.0.0'], ['> 1.0.0', '>1.0.0'], ['> 1.0.0', '>1.0.0'], ['<= 2.0.0', '<=2.0.0'], ['<= 2.0.0', '<=2.0.0'], ['<= 2.0.0', '<=2.0.0'], ['< 2.0.0', '<2.0.0'], ['<\t2.0.0', '<2.0.0'], ['>=0.1.97', '>=0.1.97'], ['0.1.20 || 1.2.4', '0.1.20||1.2.4'], ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'], ['||', '*'], ['2.x.x', '>=2.0.0 <3.0.0-0'], ['1.2.x', '>=1.2.0 <1.3.0-0'], ['1.2.x || 2.x', '>=1.2.0 <1.3.0-0||>=2.0.0 <3.0.0-0'], ['1.x.5', null], ['1.*.5', null], ['1.x.5 || 2.x', null], ['x.1', null], ['x.1.2', null], ['x.x.1', null], ['x', '*'], ['2.*.*', '>=2.0.0 <3.0.0-0'], ['1.2.*', '>=1.2.0 <1.3.0-0'], ['1.2.* || 2.*', '>=1.2.0 <1.3.0-0||>=2.0.0 <3.0.0-0'], ['2', '>=2.0.0 <3.0.0-0'], ['2.3', '>=2.3.0 <2.4.0-0'], ['~2.4', '>=2.4.0 <2.5.0-0'], ['~>3.2.1', '>=3.2.1 <3.3.0-0'], ['~1', '>=1.0.0 <2.0.0-0'], ['~>1', '>=1.0.0 <2.0.0-0'], ['~> 1', '>=1.0.0 <2.0.0-0'], ['~1.0', '>=1.0.0 <1.1.0-0'], ['~ 1.0', '>=1.0.0 <1.1.0-0'], // tilde with includePrerelease must lower-bound at -0 just like the // equivalent x-range (e.g. ~1.2 is documented as the same as 1.2.x), // so that prereleases such as 1.2.0-rc match. See #512. ['~1', '>=1.0.0-0 <2.0.0-0', { includePrerelease: true }], ['~1.x', '>=1.0.0-0 <2.0.0-0', { includePrerelease: true }], ['~1.2', '>=1.2.0-0 <1.3.0-0', { includePrerelease: true }], ['~1.2.x', '>=1.2.0-0 <1.3.0-0', { includePrerelease: true }], ['~0.0', '<0.1.0-0', { includePrerelease: true }], // a fully-specified tilde keeps its exact lower bound (matches caret), // and an explicit prerelease is preserved as-is ['~1.2.3', '>=1.2.3 <1.3.0-0', { includePrerelease: true }], ['~1.2.3-beta.4', '>=1.2.3-beta.4 <1.3.0-0', { includePrerelease: true }], ['^0', '<1.0.0-0'], ['^ 1', '>=1.0.0 <2.0.0-0'], ['^0.1', '>=0.1.0 <0.2.0-0'], ['^1.0', '>=1.0.0 <2.0.0-0'], ['^1.2', '>=1.2.0 <2.0.0-0'], ['^0.0.1', '>=0.0.1 <0.0.2-0'], ['^0.0.1-beta', '>=0.0.1-beta <0.0.2-0'], ['^0.1.2', '>=0.1.2 <0.2.0-0'], ['^1.2.3', '>=1.2.3 <2.0.0-0'], ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0-0'], ['<1', '<1.0.0-0'], ['< 1', '<1.0.0-0'], ['>=1', '>=1.0.0'], ['>= 1', '>=1.0.0'], ['<1.2', '<1.2.0-0'], ['< 1.2', '<1.2.0-0'], ['>01.02.03', '>1.2.3', true], ['>01.02.03', null], ['~1.2.3beta', '>=1.2.3-beta <1.3.0-0', { loose: true }], ['~1.2.3beta', null], ['^ 1.2 ^ 1', '>=1.2.0 <2.0.0-0 >=1.0.0'], ['1.2 - 3.4.5', '>=1.2.0 <=3.4.5'], ['1.2.3 - 3.4', '>=1.2.3 <3.5.0-0'], ['1.2 - 3.4', '>=1.2.0 <3.5.0-0'], ['>1', '>=2.0.0'], ['>1.2', '>=1.3.0'], ['>X', '<0.0.0-0'], ['* 2.x', '<0.0.0-0'], ['>x 2.x || * || =09090', null], ['>=09090', '>=9090.0.0', true], ['>=09090-0', null, { includePrerelease: true }], ['>=09090-0', null, { loose: true, includePrerelease: true }], [`^${MAX_SAFE_INTEGER}.0.0`, null], [`=${MAX_SAFE_INTEGER}.0.0`, `${MAX_SAFE_INTEGER}.0.0`], [ `^${MAX_SAFE_INTEGER - 1}.0.0`, `>=${MAX_SAFE_INTEGER - 1}.0.0 <${MAX_SAFE_INTEGER}.0.0-0`, ], // x-ranges with build metadata ['1.x.x+build >2.x+build', '>=1.0.0 <2.0.0-0 >=3.0.0', null], ['>=1.x+build <2.x.x+build', '>=1.0.0 <2.0.0-0', null], ['1.x.x+build || 2.x.x+build', '>=1.0.0 <2.0.0-0||>=2.0.0 <3.0.0-0', null], ['1.x+build.123', '>=1.0.0 <2.0.0-0', null], ['1.x.x+meta-data', '>=1.0.0 <2.0.0-0', null], ['1.x.x+build.123 >2.x.x+meta-data', '>=1.0.0 <2.0.0-0 >=3.0.0', null], ['1.x.x+build <2.x.x+meta', '>=1.0.0 <2.0.0-0', null], ['>1.x+build <=2.x.x+meta', '>=2.0.0 <3.0.0-0', null], [' 1.x.x+build >2.x.x+build ', '>=1.0.0 <2.0.0-0 >=3.0.0', null], ['^1.x+build', '>=1.0.0 <2.0.0-0', null], ['^1.x.x+build', '>=1.0.0 <2.0.0-0', null], ['^1.2.x+build', '>=1.2.0 <2.0.0-0', null], ['^1.x+meta-data', '>=1.0.0 <2.0.0-0', null], ['^1.x.x+build.123', '>=1.0.0 <2.0.0-0', null], ['~1.x+build', '>=1.0.0 <2.0.0-0', null], ['~1.x.x+build', '>=1.0.0 <2.0.0-0', null], ['~1.2.x+build', '>=1.2.0 <1.3.0-0', null], ['~1.x+meta-data', '>=1.0.0 <2.0.0-0', null], ['~1.x.x+build.123', '>=1.0.0 <2.0.0-0', null], ['^1.x.x+build || ~2.x.x+meta', '>=1.0.0 <2.0.0-0||>=2.0.0 <3.0.0-0', null], ['~1.x.x+build >2.x+meta', '>=1.0.0 <2.0.0-0 >=3.0.0', null], ['^1.x+build.123 <2.x.x+meta-data', '>=1.0.0 <2.0.0-0', null], // // x-ranges with prerelease and build ['1.x.x-alpha+build', '>=1.0.0 <2.0.0-0', null], ['>1.x.x-alpha+build', '>=2.0.0', null], ['>=1.x.x-alpha+build <2.x.x+build', '>=1.0.0 <2.0.0-0', null], [ '1.x.x-alpha+build || 2.x.x+build', '>=1.0.0 <2.0.0-0||>=2.0.0 <3.0.0-0', null, ], // long build metadata must be stripped, not bled into the version ['4.17.0+' + 'a'.repeat(250) + '3', '4.17.0', { loose: true }], ['4.17.0+' + 'a'.repeat(251), '4.17.0', { loose: true }], ['v1.0+' + 'a'.repeat(249) + 'x6', '>=1.0.0 <1.1.0-0', null], ['1.2.3+' + 'a'.repeat(251) + ' - 2.0.0', '>=1.2.3 <=2.0.0', null], ['1.2.3+' + 'a'.repeat(251) + ' - 2.0.0', '>=1.2.3 <=2.0.0', { loose: true }], ['> 1.2.3+' + 'a'.repeat(251), '>1.2.3', null], ['>= 1.2.3+' + 'a'.repeat(251), '>=1.2.3', { loose: true }], ['~1.2.3+' + 'a'.repeat(251), '>=1.2.3 <1.3.0-0', null], ['^1.2.3+' + 'a'.repeat(251), '>=1.2.3 <2.0.0-0', null], ['1.2.3+sha512.' + 'a'.repeat(251), '1.2.3', { loose: true }], [ '1.2.3+sha256.' + 'a'.repeat(200) + '.' + 'b'.repeat(200), '1.2.3', { loose: true }, ], [ '1.2.3+' + 'a'.repeat(251) + ' || 2.0.0+' + 'b'.repeat(251), '1.2.3||2.0.0', { loose: true }, ], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/range-subset.ts000066400000000000000000000062501525327470400246020ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. const fixtures: readonly (readonly unknown[])[] = [ ['1.2.3', '1.2.3', true], ['1.2.3', '1.x', true], ['1.2.3 1.2.4', '1.2.3', true], ['1.2.3 1.2.4', '1.2.9', true], ['1.2.3', '>1.2.0', true], ['1.2.3 2.3.4 || 2.3.4', '3', false], ['^1.2.3-pre.0', '1.x', false], ['^1.2.3-pre.0', '1.x', true, { includePrerelease: true }], ['>2 <1', '3', true], ['1 || 2 || 3', '>=1.0.0', true], ['1.2.3', '*', true], ['^1.2.3', '*', true], ['^1.2.3-pre.0', '*', false], ['^1.2.3-pre.0', '*', true, { includePrerelease: true }], ['1 || 2 || 3', '*', true], ['^1.2.3-pre.0', '>=1.0.0', false], ['^1.2.3-pre.0', '>=1.0.0', true, { includePrerelease: true }], ['^1.2.3-pre.0', '>=1.2.3-pre.0', true], ['^1.2.3-pre.0', '>=1.2.3-pre.0', true, { includePrerelease: true }], ['^10.2.0-beta.2', '^10.2.0-beta.1', true], ['>1.2.3-pre.0', '>=1.2.3-pre.0', true], ['>1.2.3-pre.0', '>1.2.3-pre.0 || 2', true], ['1 >1.2.3-pre.0', '>1.2.3-pre.0', true], ['1 <=1.2.3-pre.0', '>=1.0.0-0', false], ['1 <=1.2.3-pre.0', '>=1.0.0-0', true, { includePrerelease: true }], ['1 <=1.2.3-pre.0', '<=1.2.3-pre.0', true], ['1 <=1.2.3-pre.0', '<=1.2.3-pre.0', true, { includePrerelease: true }], ['<1.2.3-pre.0', '<=1.2.3-pre.0', true], ['<1.2.3-pre.0', '<1.2.3-pre.0 || 2', true], ['1 <1.2.3-pre.0', '<1.2.3-pre.0', true], ['*', '*', true], ['', '*', true], ['*', '', true], ['', '', true], ['*', '>=0.0.0-0', true, { includePrerelease: true }], ['*', '>=0.0.0', true], ['*', '>=0.0.0', false, { includePrerelease: true }], ['*', '>=0.0.0-0', true], ['^2 || ^3 || ^4', '>=1', true], ['^2 || ^3 || ^4', '>1', true], ['^2 || ^3 || ^4', '>=2', true], ['^2 || ^3 || ^4', '>=3', false], ['>=1', '^2 || ^3 || ^4', false], ['>1', '^2 || ^3 || ^4', false], ['>=2', '^2 || ^3 || ^4', false], ['>=3', '^2 || ^3 || ^4', false], ['^1', '^2 || ^3 || ^4', false], ['^2', '^2 || ^3 || ^4', true], ['^3', '^2 || ^3 || ^4', true], ['^4', '^2 || ^3 || ^4', true], ['1.x', '^2 || ^3 || ^4', false], ['2.x', '^2 || ^3 || ^4', true], ['3.x', '^2 || ^3 || ^4', true], ['4.x', '^2 || ^3 || ^4', true], ['>=1.0.0 <=1.0.0 || 2.0.0', '1.0.0 || 2.0.0', true], ['<=1.0.0 >=1.0.0 || 2.0.0', '1.0.0 || 2.0.0', true], ['>=1.0.0', '1.0.0', false], ['>=1.0.0 <2.0.0', '<2.0.0', true], ['>=1.0.0 <2.0.0', '>0.0.0', true], ['>=1.0.0 <=1.0.0', '1.0.0', true], ['>=1.0.0 <=1.0.0', '2.0.0', false], ['<2.0.0', '>=1.0.0 <2.0.0', false], ['>=1.0.0', '>=1.0.0 <2.0.0', false], ['>=1.0.0 <2.0.0', '<2.0.0', true], ['>=1.0.0 <2.0.0', '>=1.0.0', true], ['>=1.0.0 <2.0.0', '>1.0.0', false], ['>=1.0.0 <=2.0.0', '<2.0.0', false], ['>=1.0.0', '<1.0.0', false], ['<=1.0.0', '>1.0.0', false], ['<=1.0.0 >1.0.0', '>1.0.0', true], ['1.0.0 >1.0.0', '>1.0.0', true], ['1.0.0 <1.0.0', '>1.0.0', true], ['<1 <2 <3', '<4', true], ['<3 <2 <1', '<4', true], ['>1 >2 >3', '>0', true], ['>3 >2 >1', '>0', true], ['<=1 <=2 <=3', '<4', true], ['<=3 <=2 <=1', '<4', true], ['>=1 >=2 >=3', '>0', true], ['>=3 >=2 >=1', '>0', true], ['>=3 >=2 >=1', '>=3 >=2 >=1', true], ['>2.0.0', '>=2.0.0', true], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/truncations.ts000066400000000000000000000025071525327470400245550ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [version, releaseType, result] // truncate(version, type) -> result const fixtures: readonly (readonly unknown[])[] = [ ['1.2.3-foo', 'patch', '1.2.3'], ['1.2.3', 'patch', '1.2.3'], ['1.2.3', 'minor', '1.2.0'], ['1.2.3', 'major', '1.0.0'], // invalid inputs ['1.2.3', 'fake', null], ['fake', 'major', null], // additional pre-release, build, and pre+build inputs ['4.5.6-rc2', 'prerelease', '4.5.6-rc2'], ['4.5.6-rc2', 'prepatch', '4.5.6-rc2'], ['4.5.6-rc2', 'preminor', '4.5.6-rc2'], ['4.5.6-rc2', 'premajor', '4.5.6-rc2'], ['4.5.6-rc2', 'patch', '4.5.6'], ['4.5.6-rc2', 'minor', '4.5.0'], ['4.5.6-rc2', 'major', '4.0.0'], ['4.5.6+dadb0d', 'prerelease', '4.5.6'], ['4.5.6+dadb0d', 'prepatch', '4.5.6'], ['4.5.6+dadb0d', 'preminor', '4.5.6'], ['4.5.6+dadb0d', 'premajor', '4.5.6'], ['4.5.6+dadb0d', 'patch', '4.5.6'], ['4.5.6+dadb0d', 'minor', '4.5.0'], ['4.5.6+dadb0d', 'major', '4.0.0'], ['4.5.6-rc2+dadb0d', 'prerelease', '4.5.6-rc2'], ['4.5.6-rc2+dadb0d', 'prepatch', '4.5.6-rc2'], ['4.5.6-rc2+dadb0d', 'preminor', '4.5.6-rc2'], ['4.5.6-rc2+dadb0d', 'premajor', '4.5.6-rc2'], ['4.5.6-rc2+dadb0d', 'patch', '4.5.6'], ['4.5.6-rc2+dadb0d', 'minor', '4.5.0'], ['4.5.6-rc2+dadb0d', 'major', '4.0.0'], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/valid-versions.ts000066400000000000000000000022751525327470400251530ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [version, major, minor, patch, prerelease[], build[]] const fixtures: readonly (readonly unknown[])[] = [ ['1.0.0', 1, 0, 0, [], []], ['2.1.0', 2, 1, 0, [], []], ['3.2.1', 3, 2, 1, [], []], ['v1.2.3', 1, 2, 3, [], []], // prerelease ['1.2.3-0', 1, 2, 3, [0], []], ['1.2.3-123', 1, 2, 3, [123], []], ['1.2.3-1.2.3', 1, 2, 3, [1, 2, 3], []], ['1.2.3-1a', 1, 2, 3, ['1a'], []], ['1.2.3-a1', 1, 2, 3, ['a1'], []], ['1.2.3-alpha', 1, 2, 3, ['alpha'], []], ['1.2.3-alpha.1', 1, 2, 3, ['alpha', 1], []], ['1.2.3-alpha-1', 1, 2, 3, ['alpha-1'], []], ['1.2.3-alpha-.-beta', 1, 2, 3, ['alpha-', '-beta'], []], // build ['1.2.3+456', 1, 2, 3, [], ['456']], ['1.2.3+build', 1, 2, 3, [], ['build']], ['1.2.3+new-build', 1, 2, 3, [], ['new-build']], ['1.2.3+build.1', 1, 2, 3, [], ['build', '1']], ['1.2.3+build.1a', 1, 2, 3, [], ['build', '1a']], ['1.2.3+build.a1', 1, 2, 3, [], ['build', 'a1']], ['1.2.3+build.alpha', 1, 2, 3, [], ['build', 'alpha']], ['1.2.3+build.alpha.beta', 1, 2, 3, [], ['build', 'alpha', 'beta']], // mixed ['1.2.3-alpha+build', 1, 2, 3, ['alpha'], ['build']], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/version-gt-range.ts000066400000000000000000000032021525327470400253640ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [range, version, options] // Version should be greater than range const fixtures: readonly (readonly unknown[])[] = [ ['~1.2.2', '1.3.0'], ['~0.6.1-1', '0.7.1-1'], ['1.0.0 - 2.0.0', '2.0.1'], ['1.0.0', '1.0.1-beta1'], ['1.0.0', '2.0.0'], ['<=2.0.0', '2.1.1'], ['<=2.0.0', '3.2.9'], ['<2.0.0', '2.0.0'], ['0.1.20 || 1.2.4', '1.2.5'], ['2.x.x', '3.0.0'], ['1.2.x', '1.3.0'], ['1.2.x || 2.x', '3.0.0'], ['2.*.*', '5.0.1'], ['1.2.*', '1.3.3'], ['1.2.* || 2.*', '4.0.0'], ['2', '3.0.0'], ['2.3', '2.4.2'], ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0 ['~2.4', '2.5.5'], ['~>3.2.1', '3.3.0'], // >=3.2.1 <3.3.0 ['~1', '2.2.3'], // >=1.0.0 <2.0.0 ['~>1', '2.2.4'], ['~> 1', '3.2.3'], ['~1.0', '1.1.2'], // >=1.0.0 <1.1.0 ['~ 1.0', '1.1.0'], ['<1.2', '1.2.0'], ['< 1.2', '1.2.1'], ['1', '2.0.0beta', true], ['~v0.5.4-pre', '0.6.0'], ['~v0.5.4-pre', '0.6.1-pre'], ['=0.7.x', '0.8.0'], ['=0.7.x', '0.8.0-asdf'], ['<0.7.x', '0.7.0'], ['1.0.0 - 2.0.0', '2.2.3'], ['1.0.0', '1.0.1'], ['<=2.0.0', '3.0.0'], ['<=2.0.0', '2.9999.9999'], ['<=2.0.0', '2.2.9'], ['<2.0.0', '2.9999.9999'], ['<2.0.0', '2.2.9'], ['2.x.x', '3.1.3'], ['1.2.x', '1.3.3'], ['1.2.x || 2.x', '3.1.3'], ['2.*.*', '3.1.3'], ['1.2.* || 2.*', '3.1.3'], ['2', '3.1.2'], ['2.3', '2.4.1'], ['~>3.2.1', '3.3.2'], // >=3.2.1 <3.3.0 ['~>1', '2.2.3'], ['~1.0', '1.1.0'], // >=1.0.0 <1.1.0 ['<1', '1.0.0'], ['<1', '1.0.0beta', true], ['< 1', '1.0.0beta', true], ['=0.7.x', '0.8.2'], ['<0.7.x', '0.7.2'], ['0.7.x', '0.7.2-beta'], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/version-lt-range.ts000066400000000000000000000033131525327470400253740ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [range, version, options] // Version should be less than range const fixtures: readonly (readonly unknown[])[] = [ ['~1.2.2', '1.2.1'], ['~0.6.1-1', '0.6.1-0'], ['1.0.0 - 2.0.0', '0.0.1'], ['1.0.0-beta.2', '1.0.0-beta.1'], ['1.0.0', '0.0.0'], ['>=2.0.0', '1.1.1'], ['>=2.0.0', '1.2.9'], ['>2.0.0', '2.0.0'], ['0.1.20 || 1.2.4', '0.1.5'], ['2.x.x', '1.0.0'], ['1.2.x', '1.1.0'], ['1.2.x || 2.x', '1.0.0'], ['2.*.*', '1.0.1'], ['1.2.*', '1.1.3'], ['1.2.* || 2.*', '1.1.9999'], ['2', '1.0.0'], ['2.3', '2.2.2'], ['~2.4', '2.3.0'], // >=2.4.0 <2.5.0 ['~2.4', '2.3.5'], ['~>3.2.1', '3.2.0'], // >=3.2.1 <3.3.0 ['~1', '0.2.3'], // >=1.0.0 <2.0.0 ['~>1', '0.2.4'], ['~> 1', '0.2.3'], ['~1.0', '0.1.2'], // >=1.0.0 <1.1.0 ['~ 1.0', '0.1.0'], ['>1.2', '1.2.0'], ['> 1.2', '1.2.1'], ['1', '0.0.0beta', true], ['~v0.5.4-pre', '0.5.4-alpha'], ['=0.7.x', '0.6.0'], ['=0.7.x', '0.6.0-asdf'], ['>=0.7.x', '0.6.0'], ['1.0.0 - 2.0.0', '0.2.3'], ['1.0.0', '0.0.1'], ['>=2.0.0', '1.0.0'], ['>=2.0.0', '1.9999.9999'], ['>2.0.0', '1.2.9'], ['2.x.x', '1.1.3'], ['1.2.x', '1.1.3'], ['1.2.x || 2.x', '1.1.3'], ['2.*.*', '1.1.3'], ['1.2.* || 2.*', '1.1.3'], ['2', '1.9999.9999'], ['2.3', '2.2.1'], ['~>3.2.1', '2.3.2'], // >=3.2.1 <3.3.0 ['~>1', '0.2.3'], ['~1.0', '0.0.0'], // >=1.0.0 <1.1.0 ['>1', '1.0.0'], ['2', '1.0.0beta', true], ['>1', '1.0.0beta', true], ['> 1', '1.0.0beta', true], ['=0.7.x', '0.6.2'], ['=0.7.x', '0.7.0-asdf'], ['^1', '1.0.0-0'], ['>=0.7.x', '0.7.0-asdf'], ['1', '1.0.0beta', true], ['>=0.7.x', '0.6.2'], ['>1.2.3', '1.3.0-alpha'], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/version-not-gt-range.ts000066400000000000000000000046161525327470400261740ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [range, version, options] // Version should NOT be greater than range const fixtures: readonly (readonly unknown[])[] = [ ['~0.6.1-1', '0.6.1-1'], ['1.0.0 - 2.0.0', '1.2.3'], ['1.0.0 - 2.0.0', '0.9.9'], ['1.0.0', '1.0.0'], ['>=*', '0.2.4'], ['', '1.0.0', true], ['*', '1.2.3'], ['*', 'v1.2.3-foo'], ['>=1.0.0', '1.0.0'], ['>=1.0.0', '1.0.1'], ['>=1.0.0', '1.1.0'], ['>1.0.0', '1.0.1'], ['>1.0.0', '1.1.0'], ['<=2.0.0', '2.0.0'], ['<=2.0.0', '1.9999.9999'], ['<=2.0.0', '0.2.9'], ['<2.0.0', '1.9999.9999'], ['<2.0.0', '0.2.9'], ['>= 1.0.0', '1.0.0'], ['>= 1.0.0', '1.0.1'], ['>= 1.0.0', '1.1.0'], ['> 1.0.0', '1.0.1'], ['> 1.0.0', '1.1.0'], ['<= 2.0.0', '2.0.0'], ['<= 2.0.0', '1.9999.9999'], ['<= 2.0.0', '0.2.9'], ['< 2.0.0', '1.9999.9999'], ['<\t2.0.0', '0.2.9'], ['>=0.1.97', 'v0.1.97'], ['>=0.1.97', '0.1.97'], ['0.1.20 || 1.2.4', '1.2.4'], ['0.1.20 || >1.2.4', '1.2.4'], ['0.1.20 || 1.2.4', '1.2.3'], ['0.1.20 || 1.2.4', '0.1.20'], ['>=0.2.3 || <0.0.1', '0.0.0'], ['>=0.2.3 || <0.0.1', '0.2.3'], ['>=0.2.3 || <0.0.1', '0.2.4'], ['||', '1.3.4'], ['2.x.x', '2.1.3'], ['1.2.x', '1.2.3'], ['1.2.x || 2.x', '2.1.3'], ['1.2.x || 2.x', '1.2.3'], ['x', '1.2.3'], ['2.*.*', '2.1.3'], ['1.2.*', '1.2.3'], ['1.2.* || 2.*', '2.1.3'], ['1.2.* || 2.*', '1.2.3'], ['2', '2.1.2'], ['2.3', '2.3.1'], ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0 ['~2.4', '2.4.5'], ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0 ['~1', '1.2.3'], // >=1.0.0 <2.0.0 ['~>1', '1.2.3'], ['~> 1', '1.2.3'], ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0 ['~ 1.0', '1.0.2'], ['>=1', '1.0.0'], ['>= 1', '1.0.0'], ['<1.2', '1.1.1'], ['< 1.2', '1.1.1'], ['1', '1.0.0beta', true], ['~v0.5.4-pre', '0.5.5'], ['~v0.5.4-pre', '0.5.4'], ['=0.7.x', '0.7.2'], ['>=0.7.x', '0.7.2'], ['=0.7.x', '0.7.0-asdf'], ['>=0.7.x', '0.7.0-asdf'], ['<=0.7.x', '0.6.2'], ['>0.2.3 >0.2.4 <=0.2.5', '0.2.5'], ['>=0.2.3 <=0.2.4', '0.2.4'], ['1.0.0 - 2.0.0', '2.0.0'], ['^1', '0.0.0-0'], ['^3.0.0', '2.0.0'], ['^1.0.0 || ~2.0.1', '2.0.0'], ['^0.1.0 || ~3.0.1 || 5.0.0', '3.2.0'], ['^0.1.0 || ~3.0.1 || 5.0.0', '1.0.0beta', true], ['^0.1.0 || ~3.0.1 || 5.0.0', '5.0.0-0', true], ['^0.1.0 || ~3.0.1 || >4 <=5.0.0', '3.5.0'], ['0.7.x', '0.7.2-beta', { includePrerelease: true }], ] export default fixtures sxzz-verkit-a5b7150/tests/fixtures/node-semver/version-not-lt-range.ts000066400000000000000000000050271525327470400261760ustar00rootroot00000000000000// Derived from node-semver v7.8.5 under the ISC license. // [range, version, options] // Version should NOT be less than range const fixtures: readonly (readonly unknown[])[] = [ ['~ 1.0', '1.1.0'], ['~0.6.1-1', '0.6.1-1'], ['1.0.0 - 2.0.0', '1.2.3'], ['1.0.0 - 2.0.0', '2.9.9'], ['1.0.0', '1.0.0'], ['>=*', '0.2.4'], ['', '1.0.0', true], ['*', '1.2.3'], ['>=1.0.0', '1.0.0'], ['>=1.0.0', '1.0.1'], ['>=1.0.0', '1.1.0'], ['>1.0.0', '1.0.1'], ['>1.0.0', '1.1.0'], ['<=2.0.0', '2.0.0'], ['<=2.0.0', '1.9999.9999'], ['<=2.0.0', '0.2.9'], ['<2.0.0', '1.9999.9999'], ['<2.0.0', '0.2.9'], ['>= 1.0.0', '1.0.0'], ['>= 1.0.0', '1.0.1'], ['>= 1.0.0', '1.1.0'], ['> 1.0.0', '1.0.1'], ['> 1.0.0', '1.1.0'], ['<= 2.0.0', '2.0.0'], ['<= 2.0.0', '1.9999.9999'], ['<= 2.0.0', '0.2.9'], ['< 2.0.0', '1.9999.9999'], ['<\t2.0.0', '0.2.9'], ['>=0.1.97', 'v0.1.97'], ['>=0.1.97', '0.1.97'], ['0.1.20 || 1.2.4', '1.2.4'], ['0.1.20 || >1.2.4', '1.2.4'], ['0.1.20 || 1.2.4', '1.2.3'], ['0.1.20 || 1.2.4', '0.1.20'], ['>=0.2.3 || <0.0.1', '0.0.0'], ['>=0.2.3 || <0.0.1', '0.2.3'], ['>=0.2.3 || <0.0.1', '0.2.4'], ['||', '1.3.4'], ['2.x.x', '2.1.3'], ['1.2.x', '1.2.3'], ['1.2.x || 2.x', '2.1.3'], ['1.2.x || 2.x', '1.2.3'], ['x', '1.2.3'], ['2.*.*', '2.1.3'], ['1.2.*', '1.2.3'], ['1.2.* || 2.*', '2.1.3'], ['1.2.* || 2.*', '1.2.3'], ['2', '2.1.2'], ['2.3', '2.3.1'], ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0 ['~2.4', '2.4.5'], ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0 ['~1', '1.2.3'], // >=1.0.0 <2.0.0 ['~>1', '1.2.3'], ['~> 1', '1.2.3'], ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0 ['~ 1.0', '1.0.2'], ['>=1', '1.0.0'], ['>= 1', '1.0.0'], ['<1.2', '1.1.1'], ['< 1.2', '1.1.1'], ['~v0.5.4-pre', '0.5.5'], ['~v0.5.4-pre', '0.5.4'], ['=0.7.x', '0.7.2'], ['>=0.7.x', '0.7.2'], ['<=0.7.x', '0.6.2'], ['>0.2.3 >0.2.4 <=0.2.5', '0.2.5'], ['>=0.2.3 <=0.2.4', '0.2.4'], ['1.0.0 - 2.0.0', '2.0.0'], ['^3.0.0', '4.0.0'], ['^1.0.0 || ~2.0.1', '2.0.0'], ['^0.1.0 || ~3.0.1 || 5.0.0', '3.2.0'], ['^0.1.0 || ~3.0.1 || 5.0.0', '1.0.0beta', true], ['^0.1.0 || ~3.0.1 || 5.0.0', '5.0.0-0', true], ['^0.1.0 || ~3.0.1 || >4 <=5.0.0', '3.5.0'], ['^1.0.0alpha', '1.0.0beta', true], ['~1.0.0alpha', '1.0.0beta', true], ['^1.0.0-alpha', '1.0.0beta', true], ['~1.0.0-alpha', '1.0.0beta', true], ['^1.0.0-alpha', '1.0.0-beta'], ['~1.0.0-alpha', '1.0.0-beta'], ['=0.1.0', '1.0.0'], ['>1.2.3', '1.3.0-alpha', { includePrerelease: true }], ] export default fixtures sxzz-verkit-a5b7150/tests/range.test.ts000066400000000000000000000353531525327470400201660ustar00rootroot00000000000000import { describe, expect, it } from 'vitest' import { parseComparator, type RangeOptions } from '../src/comparator.ts' import { findMaxSatisfying, findMinimumForRange, findMinSatisfying, isGreaterThanRange, isLessThanRange, isOutsideRange, isRangeSubset, isValidRange, normalizeRange, parseRange, rangesIntersect, rangeToComparators, satisfies, simplifyRange, tryParseRange, } from '../src/range.ts' import { normalize, parse } from '../src/version.ts' import rangeExclude from './fixtures/node-semver/range-exclude.ts' import rangeInclude from './fixtures/node-semver/range-include.ts' import rangeIntersections from './fixtures/node-semver/range-intersection.ts' import rangeParse from './fixtures/node-semver/range-parse.ts' import rangeSubsets from './fixtures/node-semver/range-subset.ts' import versionGtRange from './fixtures/node-semver/version-gt-range.ts' import versionLtRange from './fixtures/node-semver/version-lt-range.ts' import versionNotGtRange from './fixtures/node-semver/version-not-gt-range.ts' import versionNotLtRange from './fixtures/node-semver/version-not-lt-range.ts' type RangeCase = readonly [string, string, unknown?] type RangeParseCase = readonly [string, string | null, unknown?] type RangeIntersectionCase = readonly [string, string, boolean, unknown?] type RangeSubsetCase = readonly [string, string, boolean, unknown?] function rangeOptions(value: unknown): RangeOptions { if (value === true) return { loose: true } return value && typeof value === 'object' ? (value as RangeOptions) : {} } function minimumValue(range: string): string | null { const minimum = findMinimumForRange(range) return minimum ? normalize(minimum) : null } describe('range parsing and satisfaction', () => { it('parses reusable SemVerRange objects', () => { const range = parseRange('^1.2.3') expect(parseRange(range)).toBe(range) expect(() => parseRange('not a range')).toThrow('Invalid comparator: not') expect(tryParseRange('not a range')).toBeNull() expect(isValidRange(range)).toBe(true) expect(normalizeRange(range)).toBe('>=1.2.3 <2.0.0-0') expect(satisfies('1.5.0', range)).toBe(true) expect(rangeToComparators(range)).toEqual([['>=1.2.3', '<2.0.0-0']]) expect(normalize(findMinimumForRange(range)!)).toBe('1.2.3') expect(rangesIntersect(range, '>=1.5.0')).toBe(true) expect(isRangeSubset(range, '1.x')).toBe(true) }) it('fixes range options at parse time', () => { const version = '1.0.0-rc.1' const range = parseRange('1.x', { includePrerelease: true }) expect(range.options.includePrerelease).toBe(true) expect(normalizeRange(range)).toBe('>=1.0.0-0 <2.0.0-0') expect(satisfies(version, range)).toBe(true) expect(findMaxSatisfying([version], range)).toBe(version) }) it('returns independent mutable SemVerRange objects', () => { const options: RangeOptions = {} const first = parseRange('^1.2.3', options) const second = parseRange('^1.2.3', options) expect(first.sets).not.toBe(second.sets) expect(first.sets[0]).not.toBe(second.sets[0]) expect(first.sets[0]![0]!.version).not.toBe(second.sets[0]![0]!.version) first.options.includePrerelease = true first.sets[0]![0]!.operator = '>' first.sets[0]![0]!.version!.patch = 9 expect(second.options.includePrerelease).toBeUndefined() expect(options.includePrerelease).toBeUndefined() expect(second.sets[0]![0]!.operator).toBe('>=') expect(second.sets[0]![0]!.value).toBe('>=1.2.3') expect(second.sets[0]![0]!.version!.patch).toBe(3) expect(normalizeRange(first)).toBe('>1.2.9 <2.0.0-0') }) it('accepts SemVer objects with optional identifier arrays', () => { expect(satisfies({ major: 1, minor: 5, patch: 0 }, '^1.2.3')).toBe(true) expect( satisfies( { major: 1, minor: 5, patch: 0, prerelease: ['rc', 1] }, '^1.2.3', ), ).toBe(false) }) it('normalizes every range fixture', () => { for (const row of rangeParse as readonly RangeParseCase[]) { const [range, expected, rawOptions] = row const options = rangeOptions(rawOptions) expect(normalizeRange(range, options)).toBe(expected) expect(isValidRange(range, options)).toBe(expected !== null) } }) it('includes every positive range fixture', () => { for (const row of rangeInclude as readonly RangeCase[]) { const [range, version, rawOptions] = row expect(satisfies(version, range, rangeOptions(rawOptions))).toBe(true) } }) it('excludes every negative range fixture', () => { for (const row of rangeExclude as readonly RangeCase[]) { const [range, version, rawOptions] = row expect(satisfies(version, range, rangeOptions(rawOptions))).toBe(false) } }) it('converts disjunctions to comparator sets', () => { expect(rangeToComparators('^1.2.3 || ~2.0')).toEqual([ ['>=1.2.3', '<2.0.0-0'], ['>=2.0.0', '<2.1.0-0'], ]) expect(() => rangeToComparators('not a range')).toThrow(TypeError) expect(satisfies('1.0.0', 'not a range')).toBe(false) }) }) describe('range sets', () => { it('matches every range intersection fixture', () => { for (const row of rangeIntersections as readonly RangeIntersectionCase[]) { const [left, right, expected, rawOptions] = row expect(rangesIntersect(left, right, rangeOptions(rawOptions))).toBe( expected, ) } }) it('finds satisfying extrema and theoretical minimums', () => { const versions = ['1.2.3', '1.5.0', '2.0.0', '1.4.0'] expect(findMaxSatisfying(versions, '^1.2.0')).toBe('1.5.0') expect(findMinSatisfying(versions, '^1.2.0')).toBe('1.2.3') expect(findMaxSatisfying(versions, 'invalid')).toBeNull() expect(findMinSatisfying(versions, 'invalid')).toBeNull() expect(minimumValue('>1.2.3')).toBe('1.2.4') expect(minimumValue('>1.2.3-alpha.1')).toBe('1.2.3-alpha.1.0') expect(findMinimumForRange('<0.0.0')).toBeNull() }) it('returns parsed extrema by identity', () => { const lower = parse('1.2.3') const higher = parse('1.5.0') const outside = parse('2.0.0') const versions = [higher, outside, lower] expect(findMaxSatisfying(versions, '^1.0.0')).toBe(higher) expect(findMinSatisfying(versions, '^1.0.0')).toBe(lower) expect(isGreaterThanRange(outside, '^1.0.0')).toBe(true) expect(simplifyRange(versions, '>=1.0.0 <2.0.0')).toBe('<=1.5.0') }) it('matches every minimum-version behavior case', () => { const cases: readonly (readonly [string, string | null])[] = [ ['*', '0.0.0'], ['* || >=2', '0.0.0'], ['>=2 || *', '0.0.0'], ['>2 || *', '0.0.0'], ['1.0.0', '1.0.0'], ['1.0', '1.0.0'], ['1.0.x', '1.0.0'], ['1.0.*', '1.0.0'], ['1', '1.0.0'], ['1.x.x', '1.0.0'], ['1.*.x', '1.0.0'], ['1.x.*', '1.0.0'], ['1.x', '1.0.0'], ['1.*', '1.0.0'], ['=1.0.0', '1.0.0'], ['~1.1.1', '1.1.1'], ['~1.1.1-beta', '1.1.1-beta'], ['~1.1.1 || >=2', '1.1.1'], ['^1.1.1', '1.1.1'], ['^1.1.1-beta', '1.1.1-beta'], ['^1.1.1 || >=2', '1.1.1'], ['^2.16.2 ^2.16', '2.16.2'], ['1.1.1 - 1.8.0', '1.1.1'], ['1.1 - 1.8.0', '1.1.0'], ['<2', '0.0.0'], ['<0.0.0-beta', '0.0.0-0'], ['<0.0.1-beta', '0.0.0'], ['<2 || >4', '0.0.0'], ['>4 || <2', '0.0.0'], ['<=2 || >=4', '0.0.0'], ['>=4 || <=2', '0.0.0'], ['<0.0.0-beta >0.0.0-alpha', '0.0.0-alpha.0'], ['>0.0.0-alpha <0.0.0-beta', '0.0.0-alpha.0'], ['>=1.1.1 <2 || >=2.2.2 <2', '1.1.1'], ['>=2.2.2 <2 || >=1.1.1 <2', '1.1.1'], ['>1.0.0', '1.0.1'], ['>1.0.0-0', '1.0.0-0.0'], ['>1.0.0-beta', '1.0.0-beta.0'], ['>2 || >1.0.0', '1.0.1'], ['>2 || >1.0.0-0', '1.0.0-0.0'], ['>2 || >1.0.0-beta', '1.0.0-beta.0'], ['>4 <3', null], ] for (const [range, expected] of cases) { expect(minimumValue(range)).toBe(expected) } }) it('returns an independent mutable minimum version', () => { const range = parseRange('>=1.2.3') const comparatorVersion = range.sets[0]![0]!.version! const minimum = findMinimumForRange(range)! expect(minimum).toEqual(comparatorVersion) expect(minimum).not.toBe(comparatorVersion) minimum.patch = 4 expect(comparatorVersion.patch).toBe(3) }) it('ignores wildcard comparators in mutable parsed ranges', () => { const range = parseRange('>1.2.3') range.sets[0]!.unshift(parseComparator('')) expect(normalize(findMinimumForRange(range)!)).toBe('1.2.4') expect(isRangeSubset(range, '>1.0.0')).toBe(true) }) it('matches every subset behavior fixture', () => { for (const row of rangeSubsets as readonly RangeSubsetCase[]) { const [subset, superset, expected, rawOptions] = row expect(isRangeSubset(subset, superset, rangeOptions(rawOptions))).toBe( expected, ) } expect(isRangeSubset('<2.0.0', '1.0.0')).toBe(false) }) it('simplifies over a copied array', () => { const versions = [ '1.0.0', '1.0.1', '1.0.2', '1.0.3', '1.0.4', '1.1.0', '1.1.1', '1.1.2', '1.2.0', '1.2.1', '1.2.2', '1.2.3', '1.2.4', '1.2.5', '2.0.0', '2.0.1', '2.1.0', '2.1.1', '2.1.2', '2.2.0', '2.2.1', '2.2.2', '2.3.0', '2.3.1', '2.4.0', '3.0.0', '3.1.0', '3.2.0', '3.3.0', ] const original = [...versions] expect(simplifyRange(versions, '1.x')).toBe('1.x') expect( simplifyRange(versions, '1.0.0 || 1.0.1 || 1.0.2 || 1.0.3 || 1.0.4'), ).toBe('<=1.0.4') expect(simplifyRange(versions, '>=3.0.0 <3.1.0')).toBe('3.0.0') expect(simplifyRange(versions, '3.0.0 || 3.1 || 3.2 || 3.3')).toBe( '>=3.0.0', ) expect(simplifyRange(versions, '1 || 2 || 3')).toBe('*') expect(simplifyRange(versions, '2.1 || 2.2 || 2.3')).toBe('2.1.0 - 2.3.1') const parsedRange = parseRange('1.x') parsedRange.sets = parseRange('>=3.0.0').sets expect(simplifyRange(versions, parsedRange)).toBe('>=3.0.0') expect(simplifyRange(versions, parseRange('*'))).toBe('*') expect(versions).toEqual(original) }) }) describe('exact-version range algebra', () => { it('applies the prerelease rule on the exact-version path', () => { // subset, superset, isRangeSubset, rangesIntersect (defaults to the former) type Case = readonly [string, string, boolean, boolean?] const cases: readonly Case[] = [ ['1.2.3-a', '*', false], ['1.2.3-a', 'x', false], ['1.2.3-a', '>=0.0.0', false], ['1.2.3-a', '>=0.0.0-0', false], ['1.2.3-a', '>1.0.0', false], ['1.2.3-a', '>=1.0.0', false], ['1.2.3-a', '<2.0.0', false], ['1.2.3-a', '<=2.0.0', false], ['1.2.3-a', '1.x', false], ['1.2.3-a', '1.2.x', false], ['1.2.3-a', '^1.0.0', false], ['1.2.3-a', '~1.2.0', false], ['1.2.3-a', '1.0.0 - 2.0.0', false], ['1.2.3-a', '>=1.0.0 <2.0.0', false], ['=1.2.3-a', '<2.0.0', false], ['1.2.3-a 1.2.3-a', '>1.0.0', false], // an exact comparator can coexist with other comparators in the set ['1.2.3-a <=2.0.0', '*', false], ['=2.0.0-rc.1', '1.0.0 - 3.0.0', false], // only the prerelease branch of the union is excluded ['1.2.3-a || 2.0.0', '>1.0.0', false, true], ['2.0.0 || 1.2.3-a', '>1.0.0', false, true], // the superset names a prerelease at the same tuple, so it is admitted ['1.2.3-a', '^1.2.3-a', true], ['1.2.3-a', '~1.2.3-a', true], ['1.2.3-a', '>=1.2.3-a <1.2.4', true], ['1.2.3-a', '1.2.3-a - 1.2.3-b', true], ['1.2.3-a', '1.2.3-a', true], ['1.2.3-a', '1.2.3-a || 2.0.0', true], ['1.2.3', '>1.0.0', true], ['1.2.3', '1.x', true], ] for (const [subset, superset, expected, intersects = expected] of cases) { expect(isRangeSubset(subset, superset)).toBe(expected) expect(rangesIntersect(subset, superset)).toBe(intersects) expect(rangesIntersect(superset, subset)).toBe(intersects) expect(isRangeSubset(subset, superset, { includePrerelease: true })).toBe( true, ) } }) it('keeps subset and intersection in step with satisfies', () => { // A bare exact version is a range with a single member, so both answers are // decided by satisfies() and need no reference implementation. const versions = [ '1.2.3', '1.2.3-a', '1.2.3-a.0', '1.2.3-0', '1.2.3+build', '1.2.3-a+build', '2.0.0', '2.0.0-rc.1', '0.0.0-0', '1.0.0-alpha.beta', ] const ranges = [ '', '*', 'x', '>=0.0.0', '>=0.0.0-0', '<0.0.0-0', '>1.0.0', '>=1.0.0', '<2.0.0', '<=2.0.0', '<1.2.4', '>1.2.3-a', '>=1.2.3-a', '<=1.2.3-a', '^1.0.0', '^1.2.3', '^1.2.3-a', '~1.2.0', '~1.2.3-a', '1.x', '1.2.x', '1.0.0 - 2.0.0', '1.2.3-a - 1.2.3-b', '>=1.0.0 <2.0.0', '>=1.2.3-a <1.2.4', '1.2.3', '1.2.3-a', '=1.2.3-a', '2.0.0', '1.2.3-a || 2.0.0', '<1.0.0 || >2.0.0', '^1.0.0 || ^2.0.0', ] const optionSets: readonly RangeOptions[] = [ {}, { includePrerelease: true }, { loose: true }, ] for (const options of optionSets) { for (const version of versions) { for (const range of ranges) { const expected = satisfies(version, range, options) expect(isRangeSubset(version, range, options)).toBe(expected) expect(rangesIntersect(version, range, options)).toBe(expected) expect(rangesIntersect(range, version, options)).toBe(expected) } } } }) }) describe('outside ranges', () => { it('matches every greater-than fixture', () => { for (const row of versionGtRange as readonly RangeCase[]) { const [range, version, rawOptions] = row expect(isGreaterThanRange(version, range, rangeOptions(rawOptions))).toBe( true, ) } for (const row of versionNotGtRange as readonly RangeCase[]) { const [range, version, rawOptions] = row expect(isGreaterThanRange(version, range, rangeOptions(rawOptions))).toBe( false, ) } }) it('matches every less-than fixture', () => { for (const row of versionLtRange as readonly RangeCase[]) { const [range, version, rawOptions] = row expect(isLessThanRange(version, range, rangeOptions(rawOptions))).toBe( true, ) } for (const row of versionNotLtRange as readonly RangeCase[]) { const [range, version, rawOptions] = row expect(isLessThanRange(version, range, rangeOptions(rawOptions))).toBe( false, ) } }) it('rejects an invalid direction', () => { expect(() => isOutsideRange('1.0.0', '*', '?' as never)).toThrow(TypeError) }) }) sxzz-verkit-a5b7150/tests/range.types.ts000066400000000000000000000050131525327470400203410ustar00rootroot00000000000000import { findMaxSatisfying, findMinimumForRange, findMinSatisfying, isGreaterThanRange, isLessThanRange, isOutsideRange, isRangeSubset, isValidRange, normalizeRange, parseRange, rangesIntersect, rangeToComparators, satisfies, simplifyRange, tryParseRange, type RangeOptions, type SemVerRange, } from '../src/index.ts' declare const options: RangeOptions declare const parsed: SemVerRange declare const versions: readonly string[] parseRange(parsed) tryParseRange(parsed) isValidRange(parsed) normalizeRange(parsed) satisfies('1.0.0', parsed) rangeToComparators(parsed) findMaxSatisfying(versions, parsed) findMinSatisfying(versions, parsed) findMinimumForRange(parsed) isOutsideRange('1.0.0', parsed, '>') isGreaterThanRange('1.0.0', parsed) isLessThanRange('1.0.0', parsed) rangesIntersect(parsed, '1.x') simplifyRange(versions, parsed) isRangeSubset(parsed, '1.x') // @ts-expect-error A parsed range already contains its parsing options. parseRange(parsed, options) // @ts-expect-error A parsed range already contains its parsing options. tryParseRange(parsed, options) // @ts-expect-error A parsed range already contains its parsing options. isValidRange(parsed, options) // @ts-expect-error A parsed range already contains its parsing options. normalizeRange(parsed, options) // @ts-expect-error A parsed range already contains its parsing options. satisfies('1.0.0', parsed, options) // @ts-expect-error A parsed range already contains its parsing options. rangeToComparators(parsed, options) // @ts-expect-error A parsed range already contains its parsing options. findMaxSatisfying(versions, parsed, options) // @ts-expect-error A parsed range already contains its parsing options. findMinSatisfying(versions, parsed, options) // @ts-expect-error A parsed range already contains its parsing options. findMinimumForRange(parsed, options) // @ts-expect-error A parsed range already contains its parsing options. isOutsideRange('1.0.0', parsed, '>', options) // @ts-expect-error A parsed range already contains its parsing options. isGreaterThanRange('1.0.0', parsed, options) // @ts-expect-error A parsed range already contains its parsing options. isLessThanRange('1.0.0', parsed, options) // @ts-expect-error A parsed range already contains its parsing options. rangesIntersect(parsed, '1.x', options) // @ts-expect-error A parsed range already contains its parsing options. simplifyRange(versions, parsed, options) // @ts-expect-error A parsed range already contains its parsing options. isRangeSubset(parsed, '1.x', options) sxzz-verkit-a5b7150/tests/readme.test.ts000066400000000000000000000024031525327470400203150ustar00rootroot00000000000000import { describe, expect, it } from 'vitest' import { coerce, compare, compareBuild, findMaxSatisfying, increment, isGreaterThan, normalize, normalizeFull, normalizeRange, parse, parseRange, satisfies, sortReversed, truncate, } from '../src/index.ts' describe('README examples', () => { it('keeps version operation examples executable', () => { const version = parse('1.2.3-rc.1+sha.abc') version.patch = 4 expect(normalizeFull(version)).toBe('1.2.4-rc.1+sha.abc') expect(normalize(version)).toBe('1.2.4-rc.1') expect(increment(version, 'minor')).toBe('1.3.0') expect(truncate(version, 'patch')).toBe('1.2.4') expect(coerce('release 42.6.7.9', { rtl: true })?.major).toBe(6) }) it('keeps comparison and range examples executable', () => { expect(compare('1.0.0+one', '1.0.0+two')).toBe(0) expect(compareBuild('1.0.0+one', '1.0.0+two')).toBe(-1) expect(isGreaterThan('2.0.0', '1.0.0')).toBe(true) expect(sortReversed(['1.0.0', '2.0.0'])).toEqual(['2.0.0', '1.0.0']) const range = parseRange('^1.2.3') expect(normalizeRange(range)).toBe('>=1.2.3 <2.0.0-0') expect(satisfies('1.5.0', range)).toBe(true) expect(findMaxSatisfying(['1.2.3', '1.5.0', '2.0.0'], range)).toBe('1.5.0') }) }) sxzz-verkit-a5b7150/tests/version.test.ts000066400000000000000000000223051525327470400205500ustar00rootroot00000000000000import { describe, expect, it } from 'vitest' import { clean, coerce, difference, getBuild, getMajor, getMinor, getPatch, getPrerelease, increment, isPrerelease, isStable, isValid, normalize, normalizeFull, parse, truncate, tryParse, type IncrementOptions, type IncrementType, type PrereleaseIdentifier, type SemVer, type TruncationType, type VersionDifference, type VersionOptions, } from '../src/version.ts' import increments from './fixtures/node-semver/increments.ts' import invalidVersions from './fixtures/node-semver/invalid-versions.ts' import truncations from './fixtures/node-semver/truncations.ts' import validVersions from './fixtures/node-semver/valid-versions.ts' type ValidVersionCase = readonly [ string, number, number, number, readonly PrereleaseIdentifier[], readonly string[], ] type InvalidVersionCase = readonly [unknown, string, unknown?] type IncrementCase = readonly [ string, string, string | null, unknown?, unknown?, unknown?, ] type TruncationCase = readonly [string, string, string | null] function versionOptions(value: unknown): VersionOptions { if (value === true) return { loose: true } return value && typeof value === 'object' ? (value as VersionOptions) : {} } function incrementOptions( rawOptions: unknown, rawIdentifier: unknown, rawBase: unknown, ): IncrementOptions { if (typeof rawOptions === 'string') { return { identifier: rawOptions, identifierBase: normalizeIdentifierBase(rawIdentifier), } } return { ...versionOptions(rawOptions), identifier: typeof rawIdentifier === 'string' ? rawIdentifier : undefined, identifierBase: normalizeIdentifierBase(rawBase), } } function normalizeIdentifierBase(value: unknown): 0 | 1 | false | undefined { if (value === false) return false if (value === 0 || value === '0') return 0 if (value === 1 || value === '1') return 1 return undefined } describe('version parsing and accessors', () => { it('parses reusable mutable SemVer objects', () => { const version = parse('1.2.3-rc.1+build.7') expect(version).toEqual({ build: ['build', '7'], major: 1, minor: 2, patch: 3, prerelease: ['rc', 1], }) expect(parse(version)).toBe(version) expect(() => parse('not a version')).toThrow( 'Invalid version syntax: not a version', ) expect(() => parse('9007199254740992.0.0')).toThrow( 'Invalid major version: 9007199254740992', ) expect(parse('1.2.3-9007199254740991').prerelease).toEqual([ '9007199254740991', ]) expect(() => parse(`1.2.3+${'x'.repeat(256)}`)).toThrow( 'Version exceeds the maximum length of 256 characters', ) expect(tryParse('not a version')).toBeNull() version.patch = 4 version.prerelease![0] = 'beta' version.build = ['next'] expect(isValid(version)).toBe(true) expect(isPrerelease(version)).toBe(true) expect(isStable(version)).toBe(false) expect(normalizeFull(version)).toBe('1.2.4-beta.1+next') expect(normalize(version)).toBe('1.2.4-beta.1') expect(clean(version)).toBe('1.2.4-beta.1') expect(coerce(version)).toBe(version) expect(increment(version, 'minor')).toBe('1.3.0') expect(truncate(version, 'patch')).toBe('1.2.4') expect(getMajor(version)).toBe(1) expect(getMinor(version)).toBe(2) expect(getPatch(version)).toBe(4) expect(getPrerelease(version)).toEqual(['beta', 1]) expect(getBuild(version)).toEqual(['next']) }) it('accepts SemVer objects without empty identifier arrays', () => { const version: SemVer = { major: 1, minor: 2, patch: 3 } const parsed = parse('1.2.3') expect(parse(version)).toBe(version) expect(parsed.prerelease).toBeUndefined() expect(parsed.build).toBeUndefined() expect(normalizeFull(version)).toBe('1.2.3') expect(increment(version, 'patch')).toBe('1.2.4') expect(getPrerelease(version)).toEqual([]) expect(getBuild(version)).toEqual([]) expect(isPrerelease(version)).toBe(false) expect(isStable(version)).toBe(true) }) it('accepts every valid node-semver fixture', () => { for (const row of validVersions as readonly ValidVersionCase[]) { const [version, major, minor, patch, prerelease, build] = row const comparable = `${major}.${minor}.${patch}${prerelease.length ? `-${prerelease.join('.')}` : ''}` const full = `${comparable}${build.length ? `+${build.join('.')}` : ''}` expect(isValid(version)).toBe(true) expect(isPrerelease(version)).toBe(prerelease.length > 0) expect(isStable(version)).toBe(prerelease.length === 0) expect(normalizeFull(version)).toBe(full) expect(normalize(version)).toBe(comparable) expect(getMajor(version)).toBe(major) expect(getMinor(version)).toBe(minor) expect(getPatch(version)).toBe(patch) expect(getPrerelease(version)).toEqual(prerelease) expect(getBuild(version)).toEqual(build) } }) it('rejects every invalid node-semver fixture', () => { for (const row of invalidVersions as readonly InvalidVersionCase[]) { const [version, , rawOptions] = row if (typeof version !== 'string') continue const options = versionOptions(rawOptions) expect(isValid(version, options)).toBe(false) expect(isPrerelease(version, options)).toBeNull() expect(isStable(version, options)).toBeNull() expect(normalizeFull(version, options)).toBeNull() expect(normalize(version, options)).toBeNull() } }) it('keeps full and comparable normalization distinct', () => { expect(normalizeFull('v1.2.3-rc.1+sha.abc')).toBe('1.2.3-rc.1+sha.abc') expect(normalize('v1.2.3-rc.1+sha.abc')).toBe('1.2.3-rc.1') expect(clean(' =v1.2.3+build ')).toBe('1.2.3') }) it('uses strict accessors for invalid input', () => { expect(() => getMajor('not a version')).toThrow(TypeError) expect(() => getMinor('not a version')).toThrow(TypeError) expect(() => getPatch('not a version')).toThrow(TypeError) expect(getPrerelease('not a version')).toBeNull() expect(getBuild('not a version')).toBeNull() expect(() => difference('1.0.0', 'nope')).toThrow(TypeError) }) }) describe('version operations', () => { it('matches every increment fixture', () => { for (const row of increments as readonly IncrementCase[]) { const [version, release, expected, options, identifier, base] = row expect( increment( version, release as IncrementType, incrementOptions(options, identifier, base), ), ).toBe(expected) } }) it('matches every truncation fixture', () => { for (const row of truncations as readonly TruncationCase[]) { const [version, truncation, expected] = row expect(truncate(version, truncation as TruncationType)).toBe(expected) } }) it('coerces left-to-right, right-to-left, and prerelease forms', () => { expect(coerce(123)).toEqual(parse('123.0.0')) expect(coerce('release 1.2.3.4')).toEqual(parse('1.2.3')) expect(coerce('release 1.2.3.4', { rtl: true })).toEqual(parse('2.3.4')) expect(coerce('1.2.3-ignored', { rtl: true })).toEqual(parse('1.2.3')) expect(coerce('v2')).toEqual(parse('2.0.0')) expect(coerce('1.2.3-rc.1+build.7', { includePrerelease: true })).toEqual( parse('1.2.3-rc.1+build.7'), ) expect( coerce('release 1.2.3-rc.1+build.7', { includePrerelease: true, rtl: true, }), ).toEqual(parse('1.2.3-rc.1+build.7')) expect(coerce('not a version')).toBeNull() expect(coerce('9'.repeat(17))).toBeNull() }) it('reports node-semver-compatible differences', () => { const cases: readonly (readonly [ string, string, VersionDifference | null, ])[] = [ ['1.2.3', '0.2.3', 'major'], ['0.2.3', '1.2.3', 'major'], ['1.4.5', '0.2.3', 'major'], ['1.2.3', '2.0.0-pre', 'premajor'], ['2.0.0-pre', '1.2.3', 'premajor'], ['1.2.3', '1.3.3', 'minor'], ['1.0.1', '1.1.0-pre', 'preminor'], ['1.2.3', '1.2.4', 'patch'], ['1.2.3', '1.2.4-pre', 'prepatch'], ['0.0.1', '0.0.1-pre', 'patch'], ['0.0.1', '0.0.1-pre-2', 'patch'], ['1.1.0', '1.1.0-pre', 'minor'], ['1.1.0-pre-1', '1.1.0-pre-2', 'prerelease'], ['1.0.0', '1.0.0', null], ['1.0.0-1', '1.0.0-1', null], ['0.0.2-1', '0.0.2', 'patch'], ['0.0.2-1', '0.0.3', 'patch'], ['0.0.2-1', '0.1.0', 'minor'], ['0.0.2-1', '1.0.0', 'major'], ['0.1.0-1', '0.1.0', 'minor'], ['1.0.0-1', '1.0.0', 'major'], ['1.0.0-1', '1.1.1', 'major'], ['1.0.0-1', '2.1.1', 'major'], ['1.0.1-1', '1.0.1', 'patch'], ['0.0.0-1', '0.0.0', 'major'], ['1.0.0-1', '2.0.0', 'major'], ['1.0.0-1', '2.0.0-1', 'premajor'], ['1.0.0-1', '1.1.0-1', 'preminor'], ['1.0.0-1', '1.0.1-1', 'prepatch'], ['1.7.2-1', '1.8.1', 'minor'], ['1.1.1-pre', '2.1.1-pre', 'premajor'], ['1.1.1-pre', '2.1.1', 'major'], ['1.2.3-1', '1.2.3', 'patch'], ['1.4.0-1', '2.3.5', 'major'], ['1.6.1-5', '1.7.2', 'minor'], ['2.0.0-1', '2.1.1', 'major'], ['1.2.3+one', '1.2.3+two', null], ] for (const [left, right, expected] of cases) { expect(difference(left, right)).toBe(expected) } }) }) sxzz-verkit-a5b7150/tsconfig.json000066400000000000000000000011131525327470400170740ustar00rootroot00000000000000{ "compilerOptions": { "target": "esnext", "lib": ["es2022"], "moduleDetection": "force", "module": "nodenext", "moduleResolution": "nodenext", "resolveJsonModule": true, "types": ["node"], "allowImportingTsExtensions": true, "strict": true, "noUnusedLocals": true, "declaration": true, "noEmit": true, "esModuleInterop": true, "isolatedDeclarations": true, "isolatedModules": true, "verbatimModuleSyntax": true, "erasableSyntaxOnly": true, "skipLibCheck": true }, "include": ["benchmarks", "src", "tests"] } sxzz-verkit-a5b7150/tsdown.config.ts000066400000000000000000000001261525327470400175220ustar00rootroot00000000000000import { lib } from 'tsdown-preset-sxzz' export default lib({ entry: 'shallow', })