├── .changeset ├── README.md └── config.json ├── .github └── workflows │ ├── format.yml │ ├── preview.yml │ └── publish.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts └── bench.js ├── src ├── index.ts └── types.ts ├── test └── flags.test.ts ├── tsconfig.json └── vite.config.ts /.changeset/README.md: -------------------------------------------------------------------------------- 1 | # Changesets 2 | 3 | Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works 4 | with multi-package repos, or single-package repos to help you version and publish your code. You can 5 | find the full documentation for it [in our repository](https://github.com/changesets/changesets) 6 | 7 | We have a quick list of common questions to get you started engaging with this project in 8 | [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) 9 | -------------------------------------------------------------------------------- /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.1.0/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "main", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /.github/workflows/format.yml: -------------------------------------------------------------------------------- 1 | name: Format 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | 9 | jobs: 10 | format: 11 | if: github.repository_owner == 'bombshell-dev' 12 | uses: bombshell-dev/automation/.github/workflows/format.yml@main 13 | secrets: inherit 14 | -------------------------------------------------------------------------------- /.github/workflows/preview.yml: -------------------------------------------------------------------------------- 1 | name: Preview 2 | 3 | on: 4 | workflow_dispatch: 5 | pull_request: 6 | 7 | jobs: 8 | format: 9 | if: github.repository_owner == 'bombshell-dev' 10 | uses: bombshell-dev/automation/.github/workflows/preview.yml@main 11 | secrets: inherit 12 | with: 13 | publish: '.' 14 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | 9 | jobs: 10 | publish: 11 | if: github.repository_owner == 'bombshell-dev' 12 | uses: bombshell-dev/automation/.github/workflows/publish.yml@main 13 | secrets: inherit 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | .pnpm-debug.log* 11 | 12 | # Diagnostic reports (https://nodejs.org/api/report.html) 13 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 14 | 15 | # Runtime data 16 | pids 17 | *.pid 18 | *.seed 19 | *.pid.lock 20 | 21 | # Directory for instrumented libs generated by jscoverage/JSCover 22 | lib-cov 23 | 24 | # Coverage directory used by tools like istanbul 25 | coverage 26 | *.lcov 27 | 28 | # nyc test coverage 29 | .nyc_output 30 | 31 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 32 | .grunt 33 | 34 | # Bower dependency directory (https://bower.io/) 35 | bower_components 36 | 37 | # node-waf configuration 38 | .lock-wscript 39 | 40 | # Compiled binary addons (https://nodejs.org/api/addons.html) 41 | build/Release 42 | 43 | # Dependency directories 44 | node_modules/ 45 | jspm_packages/ 46 | 47 | # Snowpack dependency directory (https://snowpack.dev/) 48 | web_modules/ 49 | 50 | # TypeScript cache 51 | *.tsbuildinfo 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Optional stylelint cache 60 | .stylelintcache 61 | 62 | # Microbundle cache 63 | .rpt2_cache/ 64 | .rts2_cache_cjs/ 65 | .rts2_cache_es/ 66 | .rts2_cache_umd/ 67 | 68 | # Optional REPL history 69 | .node_repl_history 70 | 71 | # Output of 'npm pack' 72 | *.tgz 73 | 74 | # Yarn Integrity file 75 | .yarn-integrity 76 | 77 | # dotenv environment variable files 78 | .env 79 | .env.development.local 80 | .env.test.local 81 | .env.production.local 82 | .env.local 83 | 84 | # parcel-bundler cache (https://parceljs.org/) 85 | .cache 86 | .parcel-cache 87 | 88 | # Next.js build output 89 | .next 90 | out 91 | 92 | # Nuxt.js build / generate output 93 | .nuxt 94 | dist 95 | 96 | # Gatsby files 97 | .cache/ 98 | # Comment in the public line in if your project uses Gatsby and not Next.js 99 | # https://nextjs.org/blog/next-9-1#public-directory-support 100 | # public 101 | 102 | # vuepress build output 103 | .vuepress/dist 104 | 105 | # vuepress v2.x temp and cache directory 106 | .temp 107 | .cache 108 | 109 | # Docusaurus cache and generated files 110 | .docusaurus 111 | 112 | # Serverless directories 113 | .serverless/ 114 | 115 | # FuseBox cache 116 | .fusebox/ 117 | 118 | # DynamoDB Local files 119 | .dynamodb/ 120 | 121 | # TernJS port file 122 | .tern-port 123 | 124 | # Stores VSCode versions used for testing VSCode extensions 125 | .vscode-test 126 | 127 | # yarn v2 128 | .yarn/cache 129 | .yarn/unplugged 130 | .yarn/build-state.yml 131 | .yarn/install-state.gz 132 | .pnp.* 133 | 134 | bench 135 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # @bomb.sh/args (fka `ultraflag`) 2 | 3 | ## 0.3.1 4 | 5 | ### Patch Changes 6 | 7 | - aafc601: Fixes a bug which set longhand `--boolean` args to `false` ([#8](https://github.com/bombshell-dev/args/pull/8)) 8 | 9 | ## 0.3.0 10 | 11 | ### Minor Changes 12 | 13 | - 726edef: Rename `ultraflag` to `@bomb.sh/args` 14 | 15 | ## 0.2.3 16 | 17 | ### Patch Changes 18 | 19 | - Updates README to include more context 20 | 21 | ## 0.2.2 22 | 23 | ### Patch Changes 24 | 25 | - 9381b11: Updates README to include `node:util` 26 | 27 | ## 0.2.1 28 | 29 | ### Patch Changes 30 | 31 | - 8a8ed93: Fixes an edge case where passing an empty `argv` array would return an empty object without default values. 32 | 33 | ## 0.2.0 34 | 35 | ### Minor Changes 36 | 37 | - d1774a6: Treat boolean arguments as positionals 38 | 39 | ## 0.1.0 40 | 41 | ### Minor Changes 42 | 43 | - 07f23c7: Optimize performance by using a single loop for parsing 44 | 45 | ## 0.0.2 46 | 47 | ### Patch Changes 48 | 49 | - 015b033: add benchmarks 50 | 51 | ## 0.0.1 52 | 53 | ### Patch Changes 54 | 55 | - 93b490c: Update README 56 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License Copyright (c) 2023 Nate Moore 2 | 3 | Permission is hereby granted, free of 4 | charge, to any person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, copy, modify, merge, 7 | publish, distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to the 9 | following conditions: 10 | 11 | The above copyright notice and this permission notice 12 | (including the next paragraph) shall be included in all copies or substantial 13 | portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO 18 | EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@bomb.sh/args` 2 | 3 | A <1kB library for parsing CLI flags. Inspired by Deno's `std/cli` [`parseArgs`](https://github.com/denoland/std/blob/main/cli/parse_args.ts) module. 4 | 5 | ### Features 6 | 7 | 🤏 very small 8 | 9 | 🍃 very simple 10 | 11 | 🏃 very fast (beats [`node:util`](https://nodejs.org/api/util.html#utilparseargsconfig)) 12 | 13 | 🔏 strongly typed 14 | 15 | ### Usage 16 | 17 | Basic usage does not require any configuration. 18 | 19 | ```js 20 | import { parse } from "@bomb.sh/args"; 21 | 22 | // my-cli build --bundle -rf --a value --b=value --c 1 23 | const argv = process.argv.slice(2); 24 | const args = parse(argv); 25 | 26 | console.log(args); 27 | // { _: ['build'], bundle: true, r: true, f: true, a: "value", b: "value", c: 1 } 28 | ``` 29 | 30 | Parsing can be configured to ensure arguments are coerced to specific types, which enhances type safety. 31 | 32 | ```js 33 | const args = parse(argv, { 34 | default: { a: 1, b: 2, c: "value" }, 35 | alias: { h: "help" }, 36 | boolean: ["foo", "bar"], 37 | string: ["baz", "qux"], 38 | array: ["input"], 39 | }); 40 | ``` 41 | 42 | ## Benchmarks 43 | 44 | ``` 45 | mri x 1,650,986 ops/sec ±0.32% (97 runs sampled) 46 | @bomb.sh/args x 1,407,191 ops/sec ±0.38% (99 runs sampled) 47 | minimist x 383,506 ops/sec ±0.28% (99 runs sampled) 48 | node:util x 320,953 ops/sec ±0.35% (98 runs sampled) 49 | yargs-parser x 31,874 ops/sec ±1.32% (92 runs sampled) 50 | ``` 51 | 52 | ## Acknowledgements 53 | 54 | This package was previously published as `ultraflag` up until `v0.3.0`, when it was renamed to `@bomb.sh/args`. 55 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@bomb.sh/args", 3 | "version": "0.3.1", 4 | "type": "module", 5 | "license": "MIT", 6 | "author": { 7 | "name": "Bombshell", 8 | "email": "oss@bomb.sh", 9 | "url": "https://bomb.sh" 10 | }, 11 | "homepage": "https://github.com/bombshell-dev/args", 12 | "keywords": [ 13 | "cli", 14 | "args", 15 | "yargs", 16 | "minimist" 17 | ], 18 | "exports": { 19 | ".": { 20 | "types": "./dist/index.d.ts", 21 | "import": "./dist/index.js" 22 | }, 23 | "./package.json": "./package.json" 24 | }, 25 | "scripts": { 26 | "dev": "bsh dev", 27 | "build": "bsh build", 28 | "format": "bsh format", 29 | "lint": "bsh lint", 30 | "test": "vitest run" 31 | }, 32 | "devDependencies": { 33 | "@bomb.sh/tools": "^0.0.5", 34 | "@changesets/cli": "^2.18.1", 35 | "benchmark": "^2.1.4", 36 | "chalk": "^5.4.1", 37 | "esbuild": "^0.25.1", 38 | "gzip-size": "^7.0.0", 39 | "minimist": "^1.2.7", 40 | "mri": "^1.2.0", 41 | "prettier": "^3.5.3", 42 | "pretty-bytes": "^6.0.0", 43 | "typescript": "^4.7.4", 44 | "vitest": "^3.0.9", 45 | "yargs-parser": "^21.1.1" 46 | }, 47 | "publishConfig": { 48 | "access": "public", 49 | "provenance": true 50 | }, 51 | "repository": { 52 | "type": "git", 53 | "url": "https://github.com/bombshell-dev/args" 54 | }, 55 | "volta": { 56 | "node": "22.14.0" 57 | }, 58 | "packageManager": "pnpm@10.7.0", 59 | "devEngines": { 60 | "runtime": { 61 | "name": "node", 62 | "version": "22.14.0", 63 | "onFail": "error" 64 | }, 65 | "packageManager": { 66 | "name": "pnpm", 67 | "version": "10.7.0", 68 | "onFail": "error" 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@bomb.sh/tools': 12 | specifier: ^0.0.5 13 | version: 0.0.5 14 | '@changesets/cli': 15 | specifier: ^2.18.1 16 | version: 2.27.11 17 | benchmark: 18 | specifier: ^2.1.4 19 | version: 2.1.4 20 | chalk: 21 | specifier: ^5.4.1 22 | version: 5.4.1 23 | esbuild: 24 | specifier: ^0.25.1 25 | version: 0.25.1 26 | gzip-size: 27 | specifier: ^7.0.0 28 | version: 7.0.0 29 | minimist: 30 | specifier: ^1.2.7 31 | version: 1.2.8 32 | mri: 33 | specifier: ^1.2.0 34 | version: 1.2.0 35 | prettier: 36 | specifier: ^3.5.3 37 | version: 3.5.3 38 | pretty-bytes: 39 | specifier: ^6.0.0 40 | version: 6.1.1 41 | typescript: 42 | specifier: ^4.7.4 43 | version: 4.9.5 44 | vitest: 45 | specifier: ^3.0.9 46 | version: 3.0.9(@types/node@22.10.5) 47 | yargs-parser: 48 | specifier: ^21.1.1 49 | version: 21.1.1 50 | 51 | packages: 52 | 53 | '@babel/runtime@7.26.0': 54 | resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} 55 | engines: {node: '>=6.9.0'} 56 | 57 | '@biomejs/biome@1.9.4': 58 | resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} 59 | engines: {node: '>=14.21.3'} 60 | hasBin: true 61 | 62 | '@biomejs/cli-darwin-arm64@1.9.4': 63 | resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} 64 | engines: {node: '>=14.21.3'} 65 | cpu: [arm64] 66 | os: [darwin] 67 | 68 | '@biomejs/cli-darwin-x64@1.9.4': 69 | resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} 70 | engines: {node: '>=14.21.3'} 71 | cpu: [x64] 72 | os: [darwin] 73 | 74 | '@biomejs/cli-linux-arm64-musl@1.9.4': 75 | resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} 76 | engines: {node: '>=14.21.3'} 77 | cpu: [arm64] 78 | os: [linux] 79 | 80 | '@biomejs/cli-linux-arm64@1.9.4': 81 | resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} 82 | engines: {node: '>=14.21.3'} 83 | cpu: [arm64] 84 | os: [linux] 85 | 86 | '@biomejs/cli-linux-x64-musl@1.9.4': 87 | resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} 88 | engines: {node: '>=14.21.3'} 89 | cpu: [x64] 90 | os: [linux] 91 | 92 | '@biomejs/cli-linux-x64@1.9.4': 93 | resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} 94 | engines: {node: '>=14.21.3'} 95 | cpu: [x64] 96 | os: [linux] 97 | 98 | '@biomejs/cli-win32-arm64@1.9.4': 99 | resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} 100 | engines: {node: '>=14.21.3'} 101 | cpu: [arm64] 102 | os: [win32] 103 | 104 | '@biomejs/cli-win32-x64@1.9.4': 105 | resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} 106 | engines: {node: '>=14.21.3'} 107 | cpu: [x64] 108 | os: [win32] 109 | 110 | '@bomb.sh/args@0.3.1': 111 | resolution: {integrity: sha512-CwxKrfgcorUPP6KfYD59aRdBYWBTsfsxT+GmoLVnKo5Tmyoqbpo0UNcjngRMyU+6tiPbd18RuIYxhgAn44wU/Q==} 112 | 113 | '@bomb.sh/tools@0.0.5': 114 | resolution: {integrity: sha512-1KTr9jAVUEbnaVhQLwi7KtYYnlZcymh7kkhY/Ti6/EOSFC7uuAq5/2vY9L+iRvUBkR6eKFgveRQKguyMOkMn4w==} 115 | hasBin: true 116 | 117 | '@changesets/apply-release-plan@7.0.7': 118 | resolution: {integrity: sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA==} 119 | 120 | '@changesets/assemble-release-plan@6.0.5': 121 | resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} 122 | 123 | '@changesets/changelog-git@0.2.0': 124 | resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} 125 | 126 | '@changesets/cli@2.27.11': 127 | resolution: {integrity: sha512-1QislpE+nvJgSZZo9+Lj3Lno5pKBgN46dAV8IVxKJy9wX8AOrs9nn5pYVZuDpoxWJJCALmbfOsHkyxujgetQSg==} 128 | hasBin: true 129 | 130 | '@changesets/config@3.0.5': 131 | resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} 132 | 133 | '@changesets/errors@0.2.0': 134 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 135 | 136 | '@changesets/get-dependents-graph@2.1.2': 137 | resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} 138 | 139 | '@changesets/get-release-plan@4.0.6': 140 | resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} 141 | 142 | '@changesets/get-version-range-type@0.4.0': 143 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 144 | 145 | '@changesets/git@3.0.2': 146 | resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} 147 | 148 | '@changesets/logger@0.1.1': 149 | resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 150 | 151 | '@changesets/parse@0.4.0': 152 | resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} 153 | 154 | '@changesets/pre@2.0.1': 155 | resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} 156 | 157 | '@changesets/read@0.6.2': 158 | resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} 159 | 160 | '@changesets/should-skip-package@0.1.1': 161 | resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} 162 | 163 | '@changesets/types@4.1.0': 164 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 165 | 166 | '@changesets/types@6.0.0': 167 | resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} 168 | 169 | '@changesets/write@0.3.2': 170 | resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} 171 | 172 | '@esbuild/aix-ppc64@0.25.1': 173 | resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} 174 | engines: {node: '>=18'} 175 | cpu: [ppc64] 176 | os: [aix] 177 | 178 | '@esbuild/android-arm64@0.25.1': 179 | resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} 180 | engines: {node: '>=18'} 181 | cpu: [arm64] 182 | os: [android] 183 | 184 | '@esbuild/android-arm@0.25.1': 185 | resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} 186 | engines: {node: '>=18'} 187 | cpu: [arm] 188 | os: [android] 189 | 190 | '@esbuild/android-x64@0.25.1': 191 | resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} 192 | engines: {node: '>=18'} 193 | cpu: [x64] 194 | os: [android] 195 | 196 | '@esbuild/darwin-arm64@0.25.1': 197 | resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} 198 | engines: {node: '>=18'} 199 | cpu: [arm64] 200 | os: [darwin] 201 | 202 | '@esbuild/darwin-x64@0.25.1': 203 | resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} 204 | engines: {node: '>=18'} 205 | cpu: [x64] 206 | os: [darwin] 207 | 208 | '@esbuild/freebsd-arm64@0.25.1': 209 | resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} 210 | engines: {node: '>=18'} 211 | cpu: [arm64] 212 | os: [freebsd] 213 | 214 | '@esbuild/freebsd-x64@0.25.1': 215 | resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} 216 | engines: {node: '>=18'} 217 | cpu: [x64] 218 | os: [freebsd] 219 | 220 | '@esbuild/linux-arm64@0.25.1': 221 | resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} 222 | engines: {node: '>=18'} 223 | cpu: [arm64] 224 | os: [linux] 225 | 226 | '@esbuild/linux-arm@0.25.1': 227 | resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} 228 | engines: {node: '>=18'} 229 | cpu: [arm] 230 | os: [linux] 231 | 232 | '@esbuild/linux-ia32@0.25.1': 233 | resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} 234 | engines: {node: '>=18'} 235 | cpu: [ia32] 236 | os: [linux] 237 | 238 | '@esbuild/linux-loong64@0.25.1': 239 | resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} 240 | engines: {node: '>=18'} 241 | cpu: [loong64] 242 | os: [linux] 243 | 244 | '@esbuild/linux-mips64el@0.25.1': 245 | resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} 246 | engines: {node: '>=18'} 247 | cpu: [mips64el] 248 | os: [linux] 249 | 250 | '@esbuild/linux-ppc64@0.25.1': 251 | resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} 252 | engines: {node: '>=18'} 253 | cpu: [ppc64] 254 | os: [linux] 255 | 256 | '@esbuild/linux-riscv64@0.25.1': 257 | resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} 258 | engines: {node: '>=18'} 259 | cpu: [riscv64] 260 | os: [linux] 261 | 262 | '@esbuild/linux-s390x@0.25.1': 263 | resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} 264 | engines: {node: '>=18'} 265 | cpu: [s390x] 266 | os: [linux] 267 | 268 | '@esbuild/linux-x64@0.25.1': 269 | resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} 270 | engines: {node: '>=18'} 271 | cpu: [x64] 272 | os: [linux] 273 | 274 | '@esbuild/netbsd-arm64@0.25.1': 275 | resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} 276 | engines: {node: '>=18'} 277 | cpu: [arm64] 278 | os: [netbsd] 279 | 280 | '@esbuild/netbsd-x64@0.25.1': 281 | resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} 282 | engines: {node: '>=18'} 283 | cpu: [x64] 284 | os: [netbsd] 285 | 286 | '@esbuild/openbsd-arm64@0.25.1': 287 | resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} 288 | engines: {node: '>=18'} 289 | cpu: [arm64] 290 | os: [openbsd] 291 | 292 | '@esbuild/openbsd-x64@0.25.1': 293 | resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} 294 | engines: {node: '>=18'} 295 | cpu: [x64] 296 | os: [openbsd] 297 | 298 | '@esbuild/sunos-x64@0.25.1': 299 | resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} 300 | engines: {node: '>=18'} 301 | cpu: [x64] 302 | os: [sunos] 303 | 304 | '@esbuild/win32-arm64@0.25.1': 305 | resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} 306 | engines: {node: '>=18'} 307 | cpu: [arm64] 308 | os: [win32] 309 | 310 | '@esbuild/win32-ia32@0.25.1': 311 | resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} 312 | engines: {node: '>=18'} 313 | cpu: [ia32] 314 | os: [win32] 315 | 316 | '@esbuild/win32-x64@0.25.1': 317 | resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} 318 | engines: {node: '>=18'} 319 | cpu: [x64] 320 | os: [win32] 321 | 322 | '@jridgewell/sourcemap-codec@1.5.0': 323 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 324 | 325 | '@manypkg/find-root@1.1.0': 326 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 327 | 328 | '@manypkg/get-packages@1.1.3': 329 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 330 | 331 | '@nodelib/fs.scandir@2.1.5': 332 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 333 | engines: {node: '>= 8'} 334 | 335 | '@nodelib/fs.stat@2.0.5': 336 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 337 | engines: {node: '>= 8'} 338 | 339 | '@nodelib/fs.walk@1.2.8': 340 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 341 | engines: {node: '>= 8'} 342 | 343 | '@rollup/rollup-android-arm-eabi@4.37.0': 344 | resolution: {integrity: sha512-l7StVw6WAa8l3vA1ov80jyetOAEo1FtHvZDbzXDO/02Sq/QVvqlHkYoFwDJPIMj0GKiistsBudfx5tGFnwYWDQ==} 345 | cpu: [arm] 346 | os: [android] 347 | 348 | '@rollup/rollup-android-arm64@4.37.0': 349 | resolution: {integrity: sha512-6U3SlVyMxezt8Y+/iEBcbp945uZjJwjZimu76xoG7tO1av9VO691z8PkhzQ85ith2I8R2RddEPeSfcbyPfD4hA==} 350 | cpu: [arm64] 351 | os: [android] 352 | 353 | '@rollup/rollup-darwin-arm64@4.37.0': 354 | resolution: {integrity: sha512-+iTQ5YHuGmPt10NTzEyMPbayiNTcOZDWsbxZYR1ZnmLnZxG17ivrPSWFO9j6GalY0+gV3Jtwrrs12DBscxnlYA==} 355 | cpu: [arm64] 356 | os: [darwin] 357 | 358 | '@rollup/rollup-darwin-x64@4.37.0': 359 | resolution: {integrity: sha512-m8W2UbxLDcmRKVjgl5J/k4B8d7qX2EcJve3Sut7YGrQoPtCIQGPH5AMzuFvYRWZi0FVS0zEY4c8uttPfX6bwYQ==} 360 | cpu: [x64] 361 | os: [darwin] 362 | 363 | '@rollup/rollup-freebsd-arm64@4.37.0': 364 | resolution: {integrity: sha512-FOMXGmH15OmtQWEt174v9P1JqqhlgYge/bUjIbiVD1nI1NeJ30HYT9SJlZMqdo1uQFyt9cz748F1BHghWaDnVA==} 365 | cpu: [arm64] 366 | os: [freebsd] 367 | 368 | '@rollup/rollup-freebsd-x64@4.37.0': 369 | resolution: {integrity: sha512-SZMxNttjPKvV14Hjck5t70xS3l63sbVwl98g3FlVVx2YIDmfUIy29jQrsw06ewEYQ8lQSuY9mpAPlmgRD2iSsA==} 370 | cpu: [x64] 371 | os: [freebsd] 372 | 373 | '@rollup/rollup-linux-arm-gnueabihf@4.37.0': 374 | resolution: {integrity: sha512-hhAALKJPidCwZcj+g+iN+38SIOkhK2a9bqtJR+EtyxrKKSt1ynCBeqrQy31z0oWU6thRZzdx53hVgEbRkuI19w==} 375 | cpu: [arm] 376 | os: [linux] 377 | 378 | '@rollup/rollup-linux-arm-musleabihf@4.37.0': 379 | resolution: {integrity: sha512-jUb/kmn/Gd8epbHKEqkRAxq5c2EwRt0DqhSGWjPFxLeFvldFdHQs/n8lQ9x85oAeVb6bHcS8irhTJX2FCOd8Ag==} 380 | cpu: [arm] 381 | os: [linux] 382 | 383 | '@rollup/rollup-linux-arm64-gnu@4.37.0': 384 | resolution: {integrity: sha512-oNrJxcQT9IcbcmKlkF+Yz2tmOxZgG9D9GRq+1OE6XCQwCVwxixYAa38Z8qqPzQvzt1FCfmrHX03E0pWoXm1DqA==} 385 | cpu: [arm64] 386 | os: [linux] 387 | 388 | '@rollup/rollup-linux-arm64-musl@4.37.0': 389 | resolution: {integrity: sha512-pfxLBMls+28Ey2enpX3JvjEjaJMBX5XlPCZNGxj4kdJyHduPBXtxYeb8alo0a7bqOoWZW2uKynhHxF/MWoHaGQ==} 390 | cpu: [arm64] 391 | os: [linux] 392 | 393 | '@rollup/rollup-linux-loongarch64-gnu@4.37.0': 394 | resolution: {integrity: sha512-yCE0NnutTC/7IGUq/PUHmoeZbIwq3KRh02e9SfFh7Vmc1Z7atuJRYWhRME5fKgT8aS20mwi1RyChA23qSyRGpA==} 395 | cpu: [loong64] 396 | os: [linux] 397 | 398 | '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': 399 | resolution: {integrity: sha512-NxcICptHk06E2Lh3a4Pu+2PEdZ6ahNHuK7o6Np9zcWkrBMuv21j10SQDJW3C9Yf/A/P7cutWoC/DptNLVsZ0VQ==} 400 | cpu: [ppc64] 401 | os: [linux] 402 | 403 | '@rollup/rollup-linux-riscv64-gnu@4.37.0': 404 | resolution: {integrity: sha512-PpWwHMPCVpFZLTfLq7EWJWvrmEuLdGn1GMYcm5MV7PaRgwCEYJAwiN94uBuZev0/J/hFIIJCsYw4nLmXA9J7Pw==} 405 | cpu: [riscv64] 406 | os: [linux] 407 | 408 | '@rollup/rollup-linux-riscv64-musl@4.37.0': 409 | resolution: {integrity: sha512-DTNwl6a3CfhGTAOYZ4KtYbdS8b+275LSLqJVJIrPa5/JuIufWWZ/QFvkxp52gpmguN95eujrM68ZG+zVxa8zHA==} 410 | cpu: [riscv64] 411 | os: [linux] 412 | 413 | '@rollup/rollup-linux-s390x-gnu@4.37.0': 414 | resolution: {integrity: sha512-hZDDU5fgWvDdHFuExN1gBOhCuzo/8TMpidfOR+1cPZJflcEzXdCy1LjnklQdW8/Et9sryOPJAKAQRw8Jq7Tg+A==} 415 | cpu: [s390x] 416 | os: [linux] 417 | 418 | '@rollup/rollup-linux-x64-gnu@4.37.0': 419 | resolution: {integrity: sha512-pKivGpgJM5g8dwj0ywBwe/HeVAUSuVVJhUTa/URXjxvoyTT/AxsLTAbkHkDHG7qQxLoW2s3apEIl26uUe08LVQ==} 420 | cpu: [x64] 421 | os: [linux] 422 | 423 | '@rollup/rollup-linux-x64-musl@4.37.0': 424 | resolution: {integrity: sha512-E2lPrLKE8sQbY/2bEkVTGDEk4/49UYRVWgj90MY8yPjpnGBQ+Xi1Qnr7b7UIWw1NOggdFQFOLZ8+5CzCiz143w==} 425 | cpu: [x64] 426 | os: [linux] 427 | 428 | '@rollup/rollup-win32-arm64-msvc@4.37.0': 429 | resolution: {integrity: sha512-Jm7biMazjNzTU4PrQtr7VS8ibeys9Pn29/1bm4ph7CP2kf21950LgN+BaE2mJ1QujnvOc6p54eWWiVvn05SOBg==} 430 | cpu: [arm64] 431 | os: [win32] 432 | 433 | '@rollup/rollup-win32-ia32-msvc@4.37.0': 434 | resolution: {integrity: sha512-e3/1SFm1OjefWICB2Ucstg2dxYDkDTZGDYgwufcbsxTHyqQps1UQf33dFEChBNmeSsTOyrjw2JJq0zbG5GF6RA==} 435 | cpu: [ia32] 436 | os: [win32] 437 | 438 | '@rollup/rollup-win32-x64-msvc@4.37.0': 439 | resolution: {integrity: sha512-LWbXUBwn/bcLx2sSsqy7pK5o+Nr+VCoRoAohfJ5C/aBio9nfJmGQqHAhU6pwxV/RmyTk5AqdySma7uwWGlmeuA==} 440 | cpu: [x64] 441 | os: [win32] 442 | 443 | '@types/estree@1.0.6': 444 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 445 | 446 | '@types/estree@1.0.7': 447 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 448 | 449 | '@types/node@12.20.55': 450 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 451 | 452 | '@types/node@22.10.5': 453 | resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==} 454 | 455 | '@vitest/expect@3.0.9': 456 | resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} 457 | 458 | '@vitest/mocker@3.0.9': 459 | resolution: {integrity: sha512-ryERPIBOnvevAkTq+L1lD+DTFBRcjueL9lOUfXsLfwP92h4e+Heb+PjiqS3/OURWPtywfafK0kj++yDFjWUmrA==} 460 | peerDependencies: 461 | msw: ^2.4.9 462 | vite: ^5.0.0 || ^6.0.0 463 | peerDependenciesMeta: 464 | msw: 465 | optional: true 466 | vite: 467 | optional: true 468 | 469 | '@vitest/pretty-format@3.0.9': 470 | resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} 471 | 472 | '@vitest/runner@3.0.9': 473 | resolution: {integrity: sha512-NX9oUXgF9HPfJSwl8tUZCMP1oGx2+Sf+ru6d05QjzQz4OwWg0psEzwY6VexP2tTHWdOkhKHUIZH+fS6nA7jfOw==} 474 | 475 | '@vitest/snapshot@3.0.9': 476 | resolution: {integrity: sha512-AiLUiuZ0FuA+/8i19mTYd+re5jqjEc2jZbgJ2up0VY0Ddyyxg/uUtBDpIFAy4uzKaQxOW8gMgBdAJJ2ydhu39A==} 477 | 478 | '@vitest/spy@3.0.9': 479 | resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} 480 | 481 | '@vitest/utils@3.0.9': 482 | resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} 483 | 484 | ansi-colors@4.1.3: 485 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 486 | engines: {node: '>=6'} 487 | 488 | ansi-regex@5.0.1: 489 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 490 | engines: {node: '>=8'} 491 | 492 | argparse@1.0.10: 493 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 494 | 495 | array-union@2.1.0: 496 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 497 | engines: {node: '>=8'} 498 | 499 | assertion-error@2.0.1: 500 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 501 | engines: {node: '>=12'} 502 | 503 | benchmark@2.1.4: 504 | resolution: {integrity: sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==} 505 | 506 | better-path-resolve@1.0.0: 507 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 508 | engines: {node: '>=4'} 509 | 510 | braces@3.0.3: 511 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 512 | engines: {node: '>=8'} 513 | 514 | cac@6.7.14: 515 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 516 | engines: {node: '>=8'} 517 | 518 | chai@5.2.0: 519 | resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} 520 | engines: {node: '>=12'} 521 | 522 | chalk@5.4.1: 523 | resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 524 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 525 | 526 | chardet@0.7.0: 527 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 528 | 529 | check-error@2.1.1: 530 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 531 | engines: {node: '>= 16'} 532 | 533 | ci-info@3.9.0: 534 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 535 | engines: {node: '>=8'} 536 | 537 | cross-spawn@7.0.6: 538 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 539 | engines: {node: '>= 8'} 540 | 541 | debug@4.4.0: 542 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 543 | engines: {node: '>=6.0'} 544 | peerDependencies: 545 | supports-color: '*' 546 | peerDependenciesMeta: 547 | supports-color: 548 | optional: true 549 | 550 | deep-eql@5.0.2: 551 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 552 | engines: {node: '>=6'} 553 | 554 | detect-indent@6.1.0: 555 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 556 | engines: {node: '>=8'} 557 | 558 | dir-glob@3.0.1: 559 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 560 | engines: {node: '>=8'} 561 | 562 | duplexer@0.1.2: 563 | resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} 564 | 565 | enquirer@2.4.1: 566 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 567 | engines: {node: '>=8.6'} 568 | 569 | es-module-lexer@1.6.0: 570 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 571 | 572 | esbuild@0.25.1: 573 | resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} 574 | engines: {node: '>=18'} 575 | hasBin: true 576 | 577 | escalade@3.2.0: 578 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 579 | engines: {node: '>=6'} 580 | 581 | esprima@4.0.1: 582 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 583 | engines: {node: '>=4'} 584 | hasBin: true 585 | 586 | estree-walker@3.0.3: 587 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 588 | 589 | expect-type@1.2.0: 590 | resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} 591 | engines: {node: '>=12.0.0'} 592 | 593 | extendable-error@0.1.7: 594 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 595 | 596 | external-editor@3.1.0: 597 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 598 | engines: {node: '>=4'} 599 | 600 | fast-glob@3.3.3: 601 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 602 | engines: {node: '>=8.6.0'} 603 | 604 | fastq@1.18.0: 605 | resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} 606 | 607 | fill-range@7.1.1: 608 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 609 | engines: {node: '>=8'} 610 | 611 | find-up@4.1.0: 612 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 613 | engines: {node: '>=8'} 614 | 615 | fs-extra@7.0.1: 616 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 617 | engines: {node: '>=6 <7 || >=8'} 618 | 619 | fs-extra@8.1.0: 620 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 621 | engines: {node: '>=6 <7 || >=8'} 622 | 623 | fsevents@2.3.3: 624 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 625 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 626 | os: [darwin] 627 | 628 | glob-parent@5.1.2: 629 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 630 | engines: {node: '>= 6'} 631 | 632 | globby@11.1.0: 633 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 634 | engines: {node: '>=10'} 635 | 636 | graceful-fs@4.2.11: 637 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 638 | 639 | gzip-size@7.0.0: 640 | resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} 641 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 642 | 643 | human-id@1.0.2: 644 | resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} 645 | 646 | iconv-lite@0.4.24: 647 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 648 | engines: {node: '>=0.10.0'} 649 | 650 | ignore@5.3.2: 651 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 652 | engines: {node: '>= 4'} 653 | 654 | is-extglob@2.1.1: 655 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 656 | engines: {node: '>=0.10.0'} 657 | 658 | is-glob@4.0.3: 659 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 660 | engines: {node: '>=0.10.0'} 661 | 662 | is-number@7.0.0: 663 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 664 | engines: {node: '>=0.12.0'} 665 | 666 | is-subdir@1.2.0: 667 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 668 | engines: {node: '>=4'} 669 | 670 | is-windows@1.0.2: 671 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 672 | engines: {node: '>=0.10.0'} 673 | 674 | isexe@2.0.0: 675 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 676 | 677 | js-yaml@3.14.1: 678 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 679 | hasBin: true 680 | 681 | jsonfile@4.0.0: 682 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 683 | 684 | locate-path@5.0.0: 685 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 686 | engines: {node: '>=8'} 687 | 688 | lodash.startcase@4.4.0: 689 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 690 | 691 | lodash@4.17.21: 692 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 693 | 694 | loupe@3.1.3: 695 | resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 696 | 697 | magic-string@0.30.17: 698 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 699 | 700 | merge2@1.4.1: 701 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 702 | engines: {node: '>= 8'} 703 | 704 | micromatch@4.0.8: 705 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 706 | engines: {node: '>=8.6'} 707 | 708 | minimist@1.2.8: 709 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 710 | 711 | mri@1.2.0: 712 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 713 | engines: {node: '>=4'} 714 | 715 | ms@2.1.3: 716 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 717 | 718 | nanoid@3.3.8: 719 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 720 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 721 | hasBin: true 722 | 723 | os-tmpdir@1.0.2: 724 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 725 | engines: {node: '>=0.10.0'} 726 | 727 | outdent@0.5.0: 728 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 729 | 730 | p-filter@2.1.0: 731 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 732 | engines: {node: '>=8'} 733 | 734 | p-limit@2.3.0: 735 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 736 | engines: {node: '>=6'} 737 | 738 | p-locate@4.1.0: 739 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 740 | engines: {node: '>=8'} 741 | 742 | p-map@2.1.0: 743 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 744 | engines: {node: '>=6'} 745 | 746 | p-try@2.2.0: 747 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 748 | engines: {node: '>=6'} 749 | 750 | package-manager-detector@0.2.8: 751 | resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} 752 | 753 | path-exists@4.0.0: 754 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 755 | engines: {node: '>=8'} 756 | 757 | path-key@3.1.1: 758 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 759 | engines: {node: '>=8'} 760 | 761 | path-type@4.0.0: 762 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 763 | engines: {node: '>=8'} 764 | 765 | pathe@2.0.3: 766 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 767 | 768 | pathval@2.0.0: 769 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 770 | engines: {node: '>= 14.16'} 771 | 772 | picocolors@1.1.1: 773 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 774 | 775 | picomatch@2.3.1: 776 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 777 | engines: {node: '>=8.6'} 778 | 779 | pify@4.0.1: 780 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 781 | engines: {node: '>=6'} 782 | 783 | platform@1.3.6: 784 | resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} 785 | 786 | postcss@8.5.3: 787 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 788 | engines: {node: ^10 || ^12 || >=14} 789 | 790 | prettier@2.8.8: 791 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 792 | engines: {node: '>=10.13.0'} 793 | hasBin: true 794 | 795 | prettier@3.5.3: 796 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 797 | engines: {node: '>=14'} 798 | hasBin: true 799 | 800 | pretty-bytes@6.1.1: 801 | resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} 802 | engines: {node: ^14.13.1 || >=16.0.0} 803 | 804 | queue-microtask@1.2.3: 805 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 806 | 807 | read-yaml-file@1.1.0: 808 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 809 | engines: {node: '>=6'} 810 | 811 | regenerator-runtime@0.14.1: 812 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 813 | 814 | resolve-from@5.0.0: 815 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 816 | engines: {node: '>=8'} 817 | 818 | reusify@1.0.4: 819 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 820 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 821 | 822 | rollup@4.37.0: 823 | resolution: {integrity: sha512-iAtQy/L4QFU+rTJ1YUjXqJOJzuwEghqWzCEYD2FEghT7Gsy1VdABntrO4CLopA5IkflTyqNiLNwPcOJ3S7UKLg==} 824 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 825 | hasBin: true 826 | 827 | run-parallel@1.2.0: 828 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 829 | 830 | safer-buffer@2.1.2: 831 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 832 | 833 | semver@7.6.3: 834 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 835 | engines: {node: '>=10'} 836 | hasBin: true 837 | 838 | shebang-command@2.0.0: 839 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 840 | engines: {node: '>=8'} 841 | 842 | shebang-regex@3.0.0: 843 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 844 | engines: {node: '>=8'} 845 | 846 | siginfo@2.0.0: 847 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 848 | 849 | signal-exit@4.1.0: 850 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 851 | engines: {node: '>=14'} 852 | 853 | slash@3.0.0: 854 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 855 | engines: {node: '>=8'} 856 | 857 | source-map-js@1.2.1: 858 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 859 | engines: {node: '>=0.10.0'} 860 | 861 | spawndamnit@3.0.1: 862 | resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} 863 | 864 | sprintf-js@1.0.3: 865 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 866 | 867 | stackback@0.0.2: 868 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 869 | 870 | std-env@3.8.1: 871 | resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} 872 | 873 | strip-ansi@6.0.1: 874 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 875 | engines: {node: '>=8'} 876 | 877 | strip-bom@3.0.0: 878 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 879 | engines: {node: '>=4'} 880 | 881 | term-size@2.2.1: 882 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 883 | engines: {node: '>=8'} 884 | 885 | tinybench@2.9.0: 886 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 887 | 888 | tinyexec@0.3.2: 889 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 890 | 891 | tinyexec@1.0.1: 892 | resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} 893 | 894 | tinypool@1.0.2: 895 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 896 | engines: {node: ^18.0.0 || >=20.0.0} 897 | 898 | tinyrainbow@2.0.0: 899 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 900 | engines: {node: '>=14.0.0'} 901 | 902 | tinyspy@3.0.2: 903 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 904 | engines: {node: '>=14.0.0'} 905 | 906 | tmp@0.0.33: 907 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 908 | engines: {node: '>=0.6.0'} 909 | 910 | to-regex-range@5.0.1: 911 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 912 | engines: {node: '>=8.0'} 913 | 914 | typescript@4.9.5: 915 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 916 | engines: {node: '>=4.2.0'} 917 | hasBin: true 918 | 919 | undici-types@6.20.0: 920 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 921 | 922 | universalify@0.1.2: 923 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 924 | engines: {node: '>= 4.0.0'} 925 | 926 | vite-node@3.0.9: 927 | resolution: {integrity: sha512-w3Gdx7jDcuT9cNn9jExXgOyKmf5UOTb6WMHz8LGAm54eS1Elf5OuBhCxl6zJxGhEeIkgsE1WbHuoL0mj/UXqXg==} 928 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 929 | hasBin: true 930 | 931 | vite@6.2.3: 932 | resolution: {integrity: sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==} 933 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 934 | hasBin: true 935 | peerDependencies: 936 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 937 | jiti: '>=1.21.0' 938 | less: '*' 939 | lightningcss: ^1.21.0 940 | sass: '*' 941 | sass-embedded: '*' 942 | stylus: '*' 943 | sugarss: '*' 944 | terser: ^5.16.0 945 | tsx: ^4.8.1 946 | yaml: ^2.4.2 947 | peerDependenciesMeta: 948 | '@types/node': 949 | optional: true 950 | jiti: 951 | optional: true 952 | less: 953 | optional: true 954 | lightningcss: 955 | optional: true 956 | sass: 957 | optional: true 958 | sass-embedded: 959 | optional: true 960 | stylus: 961 | optional: true 962 | sugarss: 963 | optional: true 964 | terser: 965 | optional: true 966 | tsx: 967 | optional: true 968 | yaml: 969 | optional: true 970 | 971 | vitest@3.0.9: 972 | resolution: {integrity: sha512-BbcFDqNyBlfSpATmTtXOAOj71RNKDDvjBM/uPfnxxVGrG+FSH2RQIwgeEngTaTkuU/h0ScFvf+tRcKfYXzBybQ==} 973 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 974 | hasBin: true 975 | peerDependencies: 976 | '@edge-runtime/vm': '*' 977 | '@types/debug': ^4.1.12 978 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 979 | '@vitest/browser': 3.0.9 980 | '@vitest/ui': 3.0.9 981 | happy-dom: '*' 982 | jsdom: '*' 983 | peerDependenciesMeta: 984 | '@edge-runtime/vm': 985 | optional: true 986 | '@types/debug': 987 | optional: true 988 | '@types/node': 989 | optional: true 990 | '@vitest/browser': 991 | optional: true 992 | '@vitest/ui': 993 | optional: true 994 | happy-dom: 995 | optional: true 996 | jsdom: 997 | optional: true 998 | 999 | which@2.0.2: 1000 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1001 | engines: {node: '>= 8'} 1002 | hasBin: true 1003 | 1004 | why-is-node-running@2.3.0: 1005 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1006 | engines: {node: '>=8'} 1007 | hasBin: true 1008 | 1009 | yargs-parser@21.1.1: 1010 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1011 | engines: {node: '>=12'} 1012 | 1013 | snapshots: 1014 | 1015 | '@babel/runtime@7.26.0': 1016 | dependencies: 1017 | regenerator-runtime: 0.14.1 1018 | 1019 | '@biomejs/biome@1.9.4': 1020 | optionalDependencies: 1021 | '@biomejs/cli-darwin-arm64': 1.9.4 1022 | '@biomejs/cli-darwin-x64': 1.9.4 1023 | '@biomejs/cli-linux-arm64': 1.9.4 1024 | '@biomejs/cli-linux-arm64-musl': 1.9.4 1025 | '@biomejs/cli-linux-x64': 1.9.4 1026 | '@biomejs/cli-linux-x64-musl': 1.9.4 1027 | '@biomejs/cli-win32-arm64': 1.9.4 1028 | '@biomejs/cli-win32-x64': 1.9.4 1029 | 1030 | '@biomejs/cli-darwin-arm64@1.9.4': 1031 | optional: true 1032 | 1033 | '@biomejs/cli-darwin-x64@1.9.4': 1034 | optional: true 1035 | 1036 | '@biomejs/cli-linux-arm64-musl@1.9.4': 1037 | optional: true 1038 | 1039 | '@biomejs/cli-linux-arm64@1.9.4': 1040 | optional: true 1041 | 1042 | '@biomejs/cli-linux-x64-musl@1.9.4': 1043 | optional: true 1044 | 1045 | '@biomejs/cli-linux-x64@1.9.4': 1046 | optional: true 1047 | 1048 | '@biomejs/cli-win32-arm64@1.9.4': 1049 | optional: true 1050 | 1051 | '@biomejs/cli-win32-x64@1.9.4': 1052 | optional: true 1053 | 1054 | '@bomb.sh/args@0.3.1': {} 1055 | 1056 | '@bomb.sh/tools@0.0.5': 1057 | dependencies: 1058 | '@biomejs/biome': 1.9.4 1059 | '@bomb.sh/args': 0.3.1 1060 | esbuild: 0.25.1 1061 | escalade: 3.2.0 1062 | tinyexec: 1.0.1 1063 | 1064 | '@changesets/apply-release-plan@7.0.7': 1065 | dependencies: 1066 | '@changesets/config': 3.0.5 1067 | '@changesets/get-version-range-type': 0.4.0 1068 | '@changesets/git': 3.0.2 1069 | '@changesets/should-skip-package': 0.1.1 1070 | '@changesets/types': 6.0.0 1071 | '@manypkg/get-packages': 1.1.3 1072 | detect-indent: 6.1.0 1073 | fs-extra: 7.0.1 1074 | lodash.startcase: 4.4.0 1075 | outdent: 0.5.0 1076 | prettier: 2.8.8 1077 | resolve-from: 5.0.0 1078 | semver: 7.6.3 1079 | 1080 | '@changesets/assemble-release-plan@6.0.5': 1081 | dependencies: 1082 | '@changesets/errors': 0.2.0 1083 | '@changesets/get-dependents-graph': 2.1.2 1084 | '@changesets/should-skip-package': 0.1.1 1085 | '@changesets/types': 6.0.0 1086 | '@manypkg/get-packages': 1.1.3 1087 | semver: 7.6.3 1088 | 1089 | '@changesets/changelog-git@0.2.0': 1090 | dependencies: 1091 | '@changesets/types': 6.0.0 1092 | 1093 | '@changesets/cli@2.27.11': 1094 | dependencies: 1095 | '@changesets/apply-release-plan': 7.0.7 1096 | '@changesets/assemble-release-plan': 6.0.5 1097 | '@changesets/changelog-git': 0.2.0 1098 | '@changesets/config': 3.0.5 1099 | '@changesets/errors': 0.2.0 1100 | '@changesets/get-dependents-graph': 2.1.2 1101 | '@changesets/get-release-plan': 4.0.6 1102 | '@changesets/git': 3.0.2 1103 | '@changesets/logger': 0.1.1 1104 | '@changesets/pre': 2.0.1 1105 | '@changesets/read': 0.6.2 1106 | '@changesets/should-skip-package': 0.1.1 1107 | '@changesets/types': 6.0.0 1108 | '@changesets/write': 0.3.2 1109 | '@manypkg/get-packages': 1.1.3 1110 | ansi-colors: 4.1.3 1111 | ci-info: 3.9.0 1112 | enquirer: 2.4.1 1113 | external-editor: 3.1.0 1114 | fs-extra: 7.0.1 1115 | mri: 1.2.0 1116 | p-limit: 2.3.0 1117 | package-manager-detector: 0.2.8 1118 | picocolors: 1.1.1 1119 | resolve-from: 5.0.0 1120 | semver: 7.6.3 1121 | spawndamnit: 3.0.1 1122 | term-size: 2.2.1 1123 | 1124 | '@changesets/config@3.0.5': 1125 | dependencies: 1126 | '@changesets/errors': 0.2.0 1127 | '@changesets/get-dependents-graph': 2.1.2 1128 | '@changesets/logger': 0.1.1 1129 | '@changesets/types': 6.0.0 1130 | '@manypkg/get-packages': 1.1.3 1131 | fs-extra: 7.0.1 1132 | micromatch: 4.0.8 1133 | 1134 | '@changesets/errors@0.2.0': 1135 | dependencies: 1136 | extendable-error: 0.1.7 1137 | 1138 | '@changesets/get-dependents-graph@2.1.2': 1139 | dependencies: 1140 | '@changesets/types': 6.0.0 1141 | '@manypkg/get-packages': 1.1.3 1142 | picocolors: 1.1.1 1143 | semver: 7.6.3 1144 | 1145 | '@changesets/get-release-plan@4.0.6': 1146 | dependencies: 1147 | '@changesets/assemble-release-plan': 6.0.5 1148 | '@changesets/config': 3.0.5 1149 | '@changesets/pre': 2.0.1 1150 | '@changesets/read': 0.6.2 1151 | '@changesets/types': 6.0.0 1152 | '@manypkg/get-packages': 1.1.3 1153 | 1154 | '@changesets/get-version-range-type@0.4.0': {} 1155 | 1156 | '@changesets/git@3.0.2': 1157 | dependencies: 1158 | '@changesets/errors': 0.2.0 1159 | '@manypkg/get-packages': 1.1.3 1160 | is-subdir: 1.2.0 1161 | micromatch: 4.0.8 1162 | spawndamnit: 3.0.1 1163 | 1164 | '@changesets/logger@0.1.1': 1165 | dependencies: 1166 | picocolors: 1.1.1 1167 | 1168 | '@changesets/parse@0.4.0': 1169 | dependencies: 1170 | '@changesets/types': 6.0.0 1171 | js-yaml: 3.14.1 1172 | 1173 | '@changesets/pre@2.0.1': 1174 | dependencies: 1175 | '@changesets/errors': 0.2.0 1176 | '@changesets/types': 6.0.0 1177 | '@manypkg/get-packages': 1.1.3 1178 | fs-extra: 7.0.1 1179 | 1180 | '@changesets/read@0.6.2': 1181 | dependencies: 1182 | '@changesets/git': 3.0.2 1183 | '@changesets/logger': 0.1.1 1184 | '@changesets/parse': 0.4.0 1185 | '@changesets/types': 6.0.0 1186 | fs-extra: 7.0.1 1187 | p-filter: 2.1.0 1188 | picocolors: 1.1.1 1189 | 1190 | '@changesets/should-skip-package@0.1.1': 1191 | dependencies: 1192 | '@changesets/types': 6.0.0 1193 | '@manypkg/get-packages': 1.1.3 1194 | 1195 | '@changesets/types@4.1.0': {} 1196 | 1197 | '@changesets/types@6.0.0': {} 1198 | 1199 | '@changesets/write@0.3.2': 1200 | dependencies: 1201 | '@changesets/types': 6.0.0 1202 | fs-extra: 7.0.1 1203 | human-id: 1.0.2 1204 | prettier: 2.8.8 1205 | 1206 | '@esbuild/aix-ppc64@0.25.1': 1207 | optional: true 1208 | 1209 | '@esbuild/android-arm64@0.25.1': 1210 | optional: true 1211 | 1212 | '@esbuild/android-arm@0.25.1': 1213 | optional: true 1214 | 1215 | '@esbuild/android-x64@0.25.1': 1216 | optional: true 1217 | 1218 | '@esbuild/darwin-arm64@0.25.1': 1219 | optional: true 1220 | 1221 | '@esbuild/darwin-x64@0.25.1': 1222 | optional: true 1223 | 1224 | '@esbuild/freebsd-arm64@0.25.1': 1225 | optional: true 1226 | 1227 | '@esbuild/freebsd-x64@0.25.1': 1228 | optional: true 1229 | 1230 | '@esbuild/linux-arm64@0.25.1': 1231 | optional: true 1232 | 1233 | '@esbuild/linux-arm@0.25.1': 1234 | optional: true 1235 | 1236 | '@esbuild/linux-ia32@0.25.1': 1237 | optional: true 1238 | 1239 | '@esbuild/linux-loong64@0.25.1': 1240 | optional: true 1241 | 1242 | '@esbuild/linux-mips64el@0.25.1': 1243 | optional: true 1244 | 1245 | '@esbuild/linux-ppc64@0.25.1': 1246 | optional: true 1247 | 1248 | '@esbuild/linux-riscv64@0.25.1': 1249 | optional: true 1250 | 1251 | '@esbuild/linux-s390x@0.25.1': 1252 | optional: true 1253 | 1254 | '@esbuild/linux-x64@0.25.1': 1255 | optional: true 1256 | 1257 | '@esbuild/netbsd-arm64@0.25.1': 1258 | optional: true 1259 | 1260 | '@esbuild/netbsd-x64@0.25.1': 1261 | optional: true 1262 | 1263 | '@esbuild/openbsd-arm64@0.25.1': 1264 | optional: true 1265 | 1266 | '@esbuild/openbsd-x64@0.25.1': 1267 | optional: true 1268 | 1269 | '@esbuild/sunos-x64@0.25.1': 1270 | optional: true 1271 | 1272 | '@esbuild/win32-arm64@0.25.1': 1273 | optional: true 1274 | 1275 | '@esbuild/win32-ia32@0.25.1': 1276 | optional: true 1277 | 1278 | '@esbuild/win32-x64@0.25.1': 1279 | optional: true 1280 | 1281 | '@jridgewell/sourcemap-codec@1.5.0': {} 1282 | 1283 | '@manypkg/find-root@1.1.0': 1284 | dependencies: 1285 | '@babel/runtime': 7.26.0 1286 | '@types/node': 12.20.55 1287 | find-up: 4.1.0 1288 | fs-extra: 8.1.0 1289 | 1290 | '@manypkg/get-packages@1.1.3': 1291 | dependencies: 1292 | '@babel/runtime': 7.26.0 1293 | '@changesets/types': 4.1.0 1294 | '@manypkg/find-root': 1.1.0 1295 | fs-extra: 8.1.0 1296 | globby: 11.1.0 1297 | read-yaml-file: 1.1.0 1298 | 1299 | '@nodelib/fs.scandir@2.1.5': 1300 | dependencies: 1301 | '@nodelib/fs.stat': 2.0.5 1302 | run-parallel: 1.2.0 1303 | 1304 | '@nodelib/fs.stat@2.0.5': {} 1305 | 1306 | '@nodelib/fs.walk@1.2.8': 1307 | dependencies: 1308 | '@nodelib/fs.scandir': 2.1.5 1309 | fastq: 1.18.0 1310 | 1311 | '@rollup/rollup-android-arm-eabi@4.37.0': 1312 | optional: true 1313 | 1314 | '@rollup/rollup-android-arm64@4.37.0': 1315 | optional: true 1316 | 1317 | '@rollup/rollup-darwin-arm64@4.37.0': 1318 | optional: true 1319 | 1320 | '@rollup/rollup-darwin-x64@4.37.0': 1321 | optional: true 1322 | 1323 | '@rollup/rollup-freebsd-arm64@4.37.0': 1324 | optional: true 1325 | 1326 | '@rollup/rollup-freebsd-x64@4.37.0': 1327 | optional: true 1328 | 1329 | '@rollup/rollup-linux-arm-gnueabihf@4.37.0': 1330 | optional: true 1331 | 1332 | '@rollup/rollup-linux-arm-musleabihf@4.37.0': 1333 | optional: true 1334 | 1335 | '@rollup/rollup-linux-arm64-gnu@4.37.0': 1336 | optional: true 1337 | 1338 | '@rollup/rollup-linux-arm64-musl@4.37.0': 1339 | optional: true 1340 | 1341 | '@rollup/rollup-linux-loongarch64-gnu@4.37.0': 1342 | optional: true 1343 | 1344 | '@rollup/rollup-linux-powerpc64le-gnu@4.37.0': 1345 | optional: true 1346 | 1347 | '@rollup/rollup-linux-riscv64-gnu@4.37.0': 1348 | optional: true 1349 | 1350 | '@rollup/rollup-linux-riscv64-musl@4.37.0': 1351 | optional: true 1352 | 1353 | '@rollup/rollup-linux-s390x-gnu@4.37.0': 1354 | optional: true 1355 | 1356 | '@rollup/rollup-linux-x64-gnu@4.37.0': 1357 | optional: true 1358 | 1359 | '@rollup/rollup-linux-x64-musl@4.37.0': 1360 | optional: true 1361 | 1362 | '@rollup/rollup-win32-arm64-msvc@4.37.0': 1363 | optional: true 1364 | 1365 | '@rollup/rollup-win32-ia32-msvc@4.37.0': 1366 | optional: true 1367 | 1368 | '@rollup/rollup-win32-x64-msvc@4.37.0': 1369 | optional: true 1370 | 1371 | '@types/estree@1.0.6': {} 1372 | 1373 | '@types/estree@1.0.7': {} 1374 | 1375 | '@types/node@12.20.55': {} 1376 | 1377 | '@types/node@22.10.5': 1378 | dependencies: 1379 | undici-types: 6.20.0 1380 | optional: true 1381 | 1382 | '@vitest/expect@3.0.9': 1383 | dependencies: 1384 | '@vitest/spy': 3.0.9 1385 | '@vitest/utils': 3.0.9 1386 | chai: 5.2.0 1387 | tinyrainbow: 2.0.0 1388 | 1389 | '@vitest/mocker@3.0.9(vite@6.2.3(@types/node@22.10.5))': 1390 | dependencies: 1391 | '@vitest/spy': 3.0.9 1392 | estree-walker: 3.0.3 1393 | magic-string: 0.30.17 1394 | optionalDependencies: 1395 | vite: 6.2.3(@types/node@22.10.5) 1396 | 1397 | '@vitest/pretty-format@3.0.9': 1398 | dependencies: 1399 | tinyrainbow: 2.0.0 1400 | 1401 | '@vitest/runner@3.0.9': 1402 | dependencies: 1403 | '@vitest/utils': 3.0.9 1404 | pathe: 2.0.3 1405 | 1406 | '@vitest/snapshot@3.0.9': 1407 | dependencies: 1408 | '@vitest/pretty-format': 3.0.9 1409 | magic-string: 0.30.17 1410 | pathe: 2.0.3 1411 | 1412 | '@vitest/spy@3.0.9': 1413 | dependencies: 1414 | tinyspy: 3.0.2 1415 | 1416 | '@vitest/utils@3.0.9': 1417 | dependencies: 1418 | '@vitest/pretty-format': 3.0.9 1419 | loupe: 3.1.3 1420 | tinyrainbow: 2.0.0 1421 | 1422 | ansi-colors@4.1.3: {} 1423 | 1424 | ansi-regex@5.0.1: {} 1425 | 1426 | argparse@1.0.10: 1427 | dependencies: 1428 | sprintf-js: 1.0.3 1429 | 1430 | array-union@2.1.0: {} 1431 | 1432 | assertion-error@2.0.1: {} 1433 | 1434 | benchmark@2.1.4: 1435 | dependencies: 1436 | lodash: 4.17.21 1437 | platform: 1.3.6 1438 | 1439 | better-path-resolve@1.0.0: 1440 | dependencies: 1441 | is-windows: 1.0.2 1442 | 1443 | braces@3.0.3: 1444 | dependencies: 1445 | fill-range: 7.1.1 1446 | 1447 | cac@6.7.14: {} 1448 | 1449 | chai@5.2.0: 1450 | dependencies: 1451 | assertion-error: 2.0.1 1452 | check-error: 2.1.1 1453 | deep-eql: 5.0.2 1454 | loupe: 3.1.3 1455 | pathval: 2.0.0 1456 | 1457 | chalk@5.4.1: {} 1458 | 1459 | chardet@0.7.0: {} 1460 | 1461 | check-error@2.1.1: {} 1462 | 1463 | ci-info@3.9.0: {} 1464 | 1465 | cross-spawn@7.0.6: 1466 | dependencies: 1467 | path-key: 3.1.1 1468 | shebang-command: 2.0.0 1469 | which: 2.0.2 1470 | 1471 | debug@4.4.0: 1472 | dependencies: 1473 | ms: 2.1.3 1474 | 1475 | deep-eql@5.0.2: {} 1476 | 1477 | detect-indent@6.1.0: {} 1478 | 1479 | dir-glob@3.0.1: 1480 | dependencies: 1481 | path-type: 4.0.0 1482 | 1483 | duplexer@0.1.2: {} 1484 | 1485 | enquirer@2.4.1: 1486 | dependencies: 1487 | ansi-colors: 4.1.3 1488 | strip-ansi: 6.0.1 1489 | 1490 | es-module-lexer@1.6.0: {} 1491 | 1492 | esbuild@0.25.1: 1493 | optionalDependencies: 1494 | '@esbuild/aix-ppc64': 0.25.1 1495 | '@esbuild/android-arm': 0.25.1 1496 | '@esbuild/android-arm64': 0.25.1 1497 | '@esbuild/android-x64': 0.25.1 1498 | '@esbuild/darwin-arm64': 0.25.1 1499 | '@esbuild/darwin-x64': 0.25.1 1500 | '@esbuild/freebsd-arm64': 0.25.1 1501 | '@esbuild/freebsd-x64': 0.25.1 1502 | '@esbuild/linux-arm': 0.25.1 1503 | '@esbuild/linux-arm64': 0.25.1 1504 | '@esbuild/linux-ia32': 0.25.1 1505 | '@esbuild/linux-loong64': 0.25.1 1506 | '@esbuild/linux-mips64el': 0.25.1 1507 | '@esbuild/linux-ppc64': 0.25.1 1508 | '@esbuild/linux-riscv64': 0.25.1 1509 | '@esbuild/linux-s390x': 0.25.1 1510 | '@esbuild/linux-x64': 0.25.1 1511 | '@esbuild/netbsd-arm64': 0.25.1 1512 | '@esbuild/netbsd-x64': 0.25.1 1513 | '@esbuild/openbsd-arm64': 0.25.1 1514 | '@esbuild/openbsd-x64': 0.25.1 1515 | '@esbuild/sunos-x64': 0.25.1 1516 | '@esbuild/win32-arm64': 0.25.1 1517 | '@esbuild/win32-ia32': 0.25.1 1518 | '@esbuild/win32-x64': 0.25.1 1519 | 1520 | escalade@3.2.0: {} 1521 | 1522 | esprima@4.0.1: {} 1523 | 1524 | estree-walker@3.0.3: 1525 | dependencies: 1526 | '@types/estree': 1.0.7 1527 | 1528 | expect-type@1.2.0: {} 1529 | 1530 | extendable-error@0.1.7: {} 1531 | 1532 | external-editor@3.1.0: 1533 | dependencies: 1534 | chardet: 0.7.0 1535 | iconv-lite: 0.4.24 1536 | tmp: 0.0.33 1537 | 1538 | fast-glob@3.3.3: 1539 | dependencies: 1540 | '@nodelib/fs.stat': 2.0.5 1541 | '@nodelib/fs.walk': 1.2.8 1542 | glob-parent: 5.1.2 1543 | merge2: 1.4.1 1544 | micromatch: 4.0.8 1545 | 1546 | fastq@1.18.0: 1547 | dependencies: 1548 | reusify: 1.0.4 1549 | 1550 | fill-range@7.1.1: 1551 | dependencies: 1552 | to-regex-range: 5.0.1 1553 | 1554 | find-up@4.1.0: 1555 | dependencies: 1556 | locate-path: 5.0.0 1557 | path-exists: 4.0.0 1558 | 1559 | fs-extra@7.0.1: 1560 | dependencies: 1561 | graceful-fs: 4.2.11 1562 | jsonfile: 4.0.0 1563 | universalify: 0.1.2 1564 | 1565 | fs-extra@8.1.0: 1566 | dependencies: 1567 | graceful-fs: 4.2.11 1568 | jsonfile: 4.0.0 1569 | universalify: 0.1.2 1570 | 1571 | fsevents@2.3.3: 1572 | optional: true 1573 | 1574 | glob-parent@5.1.2: 1575 | dependencies: 1576 | is-glob: 4.0.3 1577 | 1578 | globby@11.1.0: 1579 | dependencies: 1580 | array-union: 2.1.0 1581 | dir-glob: 3.0.1 1582 | fast-glob: 3.3.3 1583 | ignore: 5.3.2 1584 | merge2: 1.4.1 1585 | slash: 3.0.0 1586 | 1587 | graceful-fs@4.2.11: {} 1588 | 1589 | gzip-size@7.0.0: 1590 | dependencies: 1591 | duplexer: 0.1.2 1592 | 1593 | human-id@1.0.2: {} 1594 | 1595 | iconv-lite@0.4.24: 1596 | dependencies: 1597 | safer-buffer: 2.1.2 1598 | 1599 | ignore@5.3.2: {} 1600 | 1601 | is-extglob@2.1.1: {} 1602 | 1603 | is-glob@4.0.3: 1604 | dependencies: 1605 | is-extglob: 2.1.1 1606 | 1607 | is-number@7.0.0: {} 1608 | 1609 | is-subdir@1.2.0: 1610 | dependencies: 1611 | better-path-resolve: 1.0.0 1612 | 1613 | is-windows@1.0.2: {} 1614 | 1615 | isexe@2.0.0: {} 1616 | 1617 | js-yaml@3.14.1: 1618 | dependencies: 1619 | argparse: 1.0.10 1620 | esprima: 4.0.1 1621 | 1622 | jsonfile@4.0.0: 1623 | optionalDependencies: 1624 | graceful-fs: 4.2.11 1625 | 1626 | locate-path@5.0.0: 1627 | dependencies: 1628 | p-locate: 4.1.0 1629 | 1630 | lodash.startcase@4.4.0: {} 1631 | 1632 | lodash@4.17.21: {} 1633 | 1634 | loupe@3.1.3: {} 1635 | 1636 | magic-string@0.30.17: 1637 | dependencies: 1638 | '@jridgewell/sourcemap-codec': 1.5.0 1639 | 1640 | merge2@1.4.1: {} 1641 | 1642 | micromatch@4.0.8: 1643 | dependencies: 1644 | braces: 3.0.3 1645 | picomatch: 2.3.1 1646 | 1647 | minimist@1.2.8: {} 1648 | 1649 | mri@1.2.0: {} 1650 | 1651 | ms@2.1.3: {} 1652 | 1653 | nanoid@3.3.8: {} 1654 | 1655 | os-tmpdir@1.0.2: {} 1656 | 1657 | outdent@0.5.0: {} 1658 | 1659 | p-filter@2.1.0: 1660 | dependencies: 1661 | p-map: 2.1.0 1662 | 1663 | p-limit@2.3.0: 1664 | dependencies: 1665 | p-try: 2.2.0 1666 | 1667 | p-locate@4.1.0: 1668 | dependencies: 1669 | p-limit: 2.3.0 1670 | 1671 | p-map@2.1.0: {} 1672 | 1673 | p-try@2.2.0: {} 1674 | 1675 | package-manager-detector@0.2.8: {} 1676 | 1677 | path-exists@4.0.0: {} 1678 | 1679 | path-key@3.1.1: {} 1680 | 1681 | path-type@4.0.0: {} 1682 | 1683 | pathe@2.0.3: {} 1684 | 1685 | pathval@2.0.0: {} 1686 | 1687 | picocolors@1.1.1: {} 1688 | 1689 | picomatch@2.3.1: {} 1690 | 1691 | pify@4.0.1: {} 1692 | 1693 | platform@1.3.6: {} 1694 | 1695 | postcss@8.5.3: 1696 | dependencies: 1697 | nanoid: 3.3.8 1698 | picocolors: 1.1.1 1699 | source-map-js: 1.2.1 1700 | 1701 | prettier@2.8.8: {} 1702 | 1703 | prettier@3.5.3: {} 1704 | 1705 | pretty-bytes@6.1.1: {} 1706 | 1707 | queue-microtask@1.2.3: {} 1708 | 1709 | read-yaml-file@1.1.0: 1710 | dependencies: 1711 | graceful-fs: 4.2.11 1712 | js-yaml: 3.14.1 1713 | pify: 4.0.1 1714 | strip-bom: 3.0.0 1715 | 1716 | regenerator-runtime@0.14.1: {} 1717 | 1718 | resolve-from@5.0.0: {} 1719 | 1720 | reusify@1.0.4: {} 1721 | 1722 | rollup@4.37.0: 1723 | dependencies: 1724 | '@types/estree': 1.0.6 1725 | optionalDependencies: 1726 | '@rollup/rollup-android-arm-eabi': 4.37.0 1727 | '@rollup/rollup-android-arm64': 4.37.0 1728 | '@rollup/rollup-darwin-arm64': 4.37.0 1729 | '@rollup/rollup-darwin-x64': 4.37.0 1730 | '@rollup/rollup-freebsd-arm64': 4.37.0 1731 | '@rollup/rollup-freebsd-x64': 4.37.0 1732 | '@rollup/rollup-linux-arm-gnueabihf': 4.37.0 1733 | '@rollup/rollup-linux-arm-musleabihf': 4.37.0 1734 | '@rollup/rollup-linux-arm64-gnu': 4.37.0 1735 | '@rollup/rollup-linux-arm64-musl': 4.37.0 1736 | '@rollup/rollup-linux-loongarch64-gnu': 4.37.0 1737 | '@rollup/rollup-linux-powerpc64le-gnu': 4.37.0 1738 | '@rollup/rollup-linux-riscv64-gnu': 4.37.0 1739 | '@rollup/rollup-linux-riscv64-musl': 4.37.0 1740 | '@rollup/rollup-linux-s390x-gnu': 4.37.0 1741 | '@rollup/rollup-linux-x64-gnu': 4.37.0 1742 | '@rollup/rollup-linux-x64-musl': 4.37.0 1743 | '@rollup/rollup-win32-arm64-msvc': 4.37.0 1744 | '@rollup/rollup-win32-ia32-msvc': 4.37.0 1745 | '@rollup/rollup-win32-x64-msvc': 4.37.0 1746 | fsevents: 2.3.3 1747 | 1748 | run-parallel@1.2.0: 1749 | dependencies: 1750 | queue-microtask: 1.2.3 1751 | 1752 | safer-buffer@2.1.2: {} 1753 | 1754 | semver@7.6.3: {} 1755 | 1756 | shebang-command@2.0.0: 1757 | dependencies: 1758 | shebang-regex: 3.0.0 1759 | 1760 | shebang-regex@3.0.0: {} 1761 | 1762 | siginfo@2.0.0: {} 1763 | 1764 | signal-exit@4.1.0: {} 1765 | 1766 | slash@3.0.0: {} 1767 | 1768 | source-map-js@1.2.1: {} 1769 | 1770 | spawndamnit@3.0.1: 1771 | dependencies: 1772 | cross-spawn: 7.0.6 1773 | signal-exit: 4.1.0 1774 | 1775 | sprintf-js@1.0.3: {} 1776 | 1777 | stackback@0.0.2: {} 1778 | 1779 | std-env@3.8.1: {} 1780 | 1781 | strip-ansi@6.0.1: 1782 | dependencies: 1783 | ansi-regex: 5.0.1 1784 | 1785 | strip-bom@3.0.0: {} 1786 | 1787 | term-size@2.2.1: {} 1788 | 1789 | tinybench@2.9.0: {} 1790 | 1791 | tinyexec@0.3.2: {} 1792 | 1793 | tinyexec@1.0.1: {} 1794 | 1795 | tinypool@1.0.2: {} 1796 | 1797 | tinyrainbow@2.0.0: {} 1798 | 1799 | tinyspy@3.0.2: {} 1800 | 1801 | tmp@0.0.33: 1802 | dependencies: 1803 | os-tmpdir: 1.0.2 1804 | 1805 | to-regex-range@5.0.1: 1806 | dependencies: 1807 | is-number: 7.0.0 1808 | 1809 | typescript@4.9.5: {} 1810 | 1811 | undici-types@6.20.0: 1812 | optional: true 1813 | 1814 | universalify@0.1.2: {} 1815 | 1816 | vite-node@3.0.9(@types/node@22.10.5): 1817 | dependencies: 1818 | cac: 6.7.14 1819 | debug: 4.4.0 1820 | es-module-lexer: 1.6.0 1821 | pathe: 2.0.3 1822 | vite: 6.2.3(@types/node@22.10.5) 1823 | transitivePeerDependencies: 1824 | - '@types/node' 1825 | - jiti 1826 | - less 1827 | - lightningcss 1828 | - sass 1829 | - sass-embedded 1830 | - stylus 1831 | - sugarss 1832 | - supports-color 1833 | - terser 1834 | - tsx 1835 | - yaml 1836 | 1837 | vite@6.2.3(@types/node@22.10.5): 1838 | dependencies: 1839 | esbuild: 0.25.1 1840 | postcss: 8.5.3 1841 | rollup: 4.37.0 1842 | optionalDependencies: 1843 | '@types/node': 22.10.5 1844 | fsevents: 2.3.3 1845 | 1846 | vitest@3.0.9(@types/node@22.10.5): 1847 | dependencies: 1848 | '@vitest/expect': 3.0.9 1849 | '@vitest/mocker': 3.0.9(vite@6.2.3(@types/node@22.10.5)) 1850 | '@vitest/pretty-format': 3.0.9 1851 | '@vitest/runner': 3.0.9 1852 | '@vitest/snapshot': 3.0.9 1853 | '@vitest/spy': 3.0.9 1854 | '@vitest/utils': 3.0.9 1855 | chai: 5.2.0 1856 | debug: 4.4.0 1857 | expect-type: 1.2.0 1858 | magic-string: 0.30.17 1859 | pathe: 2.0.3 1860 | std-env: 3.8.1 1861 | tinybench: 2.9.0 1862 | tinyexec: 0.3.2 1863 | tinypool: 1.0.2 1864 | tinyrainbow: 2.0.0 1865 | vite: 6.2.3(@types/node@22.10.5) 1866 | vite-node: 3.0.9(@types/node@22.10.5) 1867 | why-is-node-running: 2.3.0 1868 | optionalDependencies: 1869 | '@types/node': 22.10.5 1870 | transitivePeerDependencies: 1871 | - jiti 1872 | - less 1873 | - lightningcss 1874 | - msw 1875 | - sass 1876 | - sass-embedded 1877 | - stylus 1878 | - sugarss 1879 | - supports-color 1880 | - terser 1881 | - tsx 1882 | - yaml 1883 | 1884 | which@2.0.2: 1885 | dependencies: 1886 | isexe: 2.0.0 1887 | 1888 | why-is-node-running@2.3.0: 1889 | dependencies: 1890 | siginfo: 2.0.0 1891 | stackback: 0.0.2 1892 | 1893 | yargs-parser@21.1.1: {} 1894 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | onlyBuiltDependencies: 2 | - esbuild 3 | -------------------------------------------------------------------------------- /scripts/bench.js: -------------------------------------------------------------------------------- 1 | import { parseArgs } from 'node:util' 2 | import benchmark from "benchmark"; 3 | import minimist from 'minimist'; 4 | import mri from 'mri'; 5 | import yargs from 'yargs-parser'; 6 | import { parse as ultraflag } from "../dist/index.js"; 7 | 8 | const bench = new benchmark.Suite(); 9 | const args = ['--a=1', '-b', '--bool', '--no-boop', '--multi=foo', '--multi=baz', '-xyz']; 10 | 11 | bench 12 | .add('args ', () => ultraflag(args)) 13 | .add('minimist ', () => minimist(args)) 14 | .add('mri ', () => mri(args)) 15 | .add('node:util ', () => parseArgs({ args, strict: false, allowNegative: true, options: { bool: { type: 'boolean', short: 'b' }, boop: { type: 'boolean' }, multi: { type: 'string' }} })) 16 | .add('yargs-parser', () => yargs(args)) 17 | .on('cycle', e => console.log(String(e.target))) 18 | .run(); 19 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | Aliases, 3 | Args, 4 | BooleanType, 5 | Collectable, 6 | NestedMapping, 7 | ParseOptions, 8 | StringType, 9 | Values, 10 | } from "./types.js"; 11 | export { ParseOptions, Args } from "./types.js"; 12 | 13 | const BOOL_RE = /^(true|false)$/; 14 | const QUOTED_RE = /^('|").*\1$/; 15 | 16 | const set = (obj: NestedMapping, key: string, value: any, type?: string) => { 17 | if (key.includes(".")) { 18 | const parts = key.split("."); 19 | for (let i = 0; i < parts.length - 1; i++) { 20 | const k = parts[i]; 21 | const tmp = {}; 22 | set(obj, k, tmp); 23 | obj = tmp; 24 | } 25 | key = parts[parts.length - 1]; 26 | } 27 | if (type === "array" && obj[key] !== undefined) { 28 | if (Array.isArray(obj[key])) { 29 | (obj[key] as any[]).push(value); 30 | } else { 31 | obj[key] = [obj[key], value]; 32 | } 33 | } else { 34 | obj[key] = type === "array" ? [value] : value; 35 | } 36 | }; 37 | 38 | const type = ( 39 | key: string, 40 | opts: Record<"boolean" | "string" | "array", string[]>, 41 | ): "boolean" | "string" | "array" | undefined => { 42 | if (opts.array && opts.array.length > 0 && opts.array.includes(key)) 43 | return "array"; 44 | if (opts.string && opts.string.length > 0 && opts.string.includes(key)) 45 | return "string"; 46 | if (opts.boolean && opts.boolean.length > 0 && opts.boolean.includes(key)) 47 | return "boolean"; 48 | return; 49 | }; 50 | 51 | const defaultValue = (type?: "boolean" | "string" | "array") => { 52 | if (type === "string") return ""; 53 | if (type === "array") return []; 54 | return true; 55 | }; 56 | 57 | const coerce = (value?: string, type?: "string" | "boolean" | "array") => { 58 | if (type === "string") return value; 59 | if (type === "boolean") return value === undefined ? true : value === "true"; 60 | 61 | if (!value) return value; 62 | if (value.length > 3 && BOOL_RE.test(value)) return value === "true"; 63 | if (value.length > 2 && QUOTED_RE.test(value)) return value.slice(1, -1); 64 | if ((value[0] === "." && /\d/.test(value[1])) || /\d/.test(value[0])) 65 | return Number(value); 66 | return value; 67 | }; 68 | 69 | export function parse< 70 | TArgs extends Values< 71 | TBooleans, 72 | TStrings, 73 | TCollectable, 74 | undefined, 75 | TDefaults, 76 | TAliases 77 | >, 78 | TBooleans extends BooleanType = undefined, 79 | TStrings extends StringType = undefined, 80 | TCollectable extends Collectable = undefined, 81 | TDefaults extends Record | undefined = undefined, 82 | TAliases extends Aliases | undefined = undefined, 83 | TAliasArgNames extends string = string, 84 | TAliasNames extends string = string, 85 | >( 86 | argv: string[], 87 | { 88 | default: defaults, 89 | alias: aliases, 90 | ...types 91 | }: ParseOptions = {}, 92 | ): Args { 93 | const obj = { ...defaults, _: [] } as unknown as Args; 94 | if (argv.length === 0) return obj; 95 | 96 | for (let i = 0; i < argv.length; i++) { 97 | const curr = argv[i]; 98 | const next = argv[i + 1]; 99 | 100 | let t: "string" | "boolean" | "array" | undefined; 101 | let key = ""; 102 | let value: string | undefined; 103 | 104 | if (curr.length > 1 && curr[0] === "-") { 105 | if (curr[1] !== "-" && curr.length > 2 && !curr.includes("=")) { 106 | if (curr.includes(".")) { 107 | key = curr.slice(1, 2); 108 | value = curr.slice(2); 109 | } else { 110 | const keys = curr.slice(1, -1); 111 | for (let key of keys) { 112 | if ( 113 | aliases && 114 | (aliases as Record)[key] !== undefined 115 | ) { 116 | key = aliases[key as keyof typeof aliases] as string; 117 | } 118 | set(obj, key, defaultValue(t), t); 119 | } 120 | key = curr.slice(-1); 121 | if (next && next[0] !== "-") { 122 | value = next; 123 | i++; 124 | } 125 | } 126 | } else if (!curr.includes("=") && next && next[0] !== "-") { 127 | key = curr.replace(/^-{1,2}/, ""); 128 | t = type(key, types as any); 129 | // treat boolean as flag without parameter 130 | if (t === "boolean") { 131 | value = "true"; 132 | } else { 133 | value = next; 134 | i++; 135 | } 136 | } else { 137 | const eq = curr.indexOf("="); 138 | if (eq === -1) { 139 | key = curr.replace(/^-{1,2}/, ""); 140 | } else { 141 | key = curr.slice(0, eq).replace(/^-{1,2}/, ""); 142 | value = curr.slice(eq + 1); 143 | } 144 | t = type(key, types as any); 145 | } 146 | 147 | if ((!t || t === "boolean") && key.length > 3 && key.startsWith("no-")) { 148 | set(obj, key.slice(3), false); 149 | } else { 150 | if (aliases && (aliases as Record)[key] !== undefined) { 151 | key = aliases[key as keyof typeof aliases] as string; 152 | } 153 | set(obj, key, coerce(value, t) ?? defaultValue(t), t); 154 | } 155 | } else if (curr) { 156 | (obj as any)._.push(coerce(curr)); 157 | continue; 158 | } 159 | } 160 | 161 | return obj; 162 | } 163 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | /** Combines recursively all intersection types and returns a new single type. */ 2 | type Id = TRecord extends Record 3 | ? TRecord extends infer InferredRecord 4 | ? { [Key in keyof InferredRecord]: Id } 5 | : never 6 | : TRecord; 7 | 8 | /** Converts a union type `A | B | C` into an intersection type `A & B & C`. */ 9 | type UnionToIntersection = ( 10 | TValue extends unknown 11 | ? (args: TValue) => unknown 12 | : never 13 | ) extends (args: infer R) => unknown 14 | ? R extends Record 15 | ? R 16 | : never 17 | : never; 18 | 19 | export type BooleanType = boolean | string | undefined; 20 | export type StringType = string | undefined; 21 | export type ArgType = StringType | BooleanType; 22 | 23 | export type Collectable = string | undefined; 24 | export type Negatable = string | undefined; 25 | 26 | type UseTypes< 27 | TBooleans extends BooleanType, 28 | TStrings extends StringType, 29 | TCollectable extends Collectable, 30 | > = undefined extends (false extends TBooleans ? undefined : TBooleans) & 31 | TCollectable & 32 | TStrings 33 | ? false 34 | : true; 35 | 36 | /** 37 | * Creates a record with all available flags with the corresponding type and 38 | * default type. 39 | */ 40 | export type Values< 41 | TBooleans extends BooleanType, 42 | TStrings extends StringType, 43 | TCollectable extends Collectable, 44 | TNegatable extends Negatable, 45 | TDefault extends Record | undefined, 46 | TAliases extends Aliases | undefined, 47 | > = UseTypes extends true 48 | ? Record & 49 | AddAliases< 50 | SpreadDefaults< 51 | CollectValues & 52 | RecursiveRequired> & 53 | CollectUnknownValues, 54 | DedotRecord 55 | >, 56 | TAliases 57 | > 58 | : // deno-lint-ignore no-explicit-any 59 | Record; 60 | 61 | export type Aliases< 62 | TArgNames = string, 63 | TAliasNames extends string = string, 64 | > = Partial< 65 | Record, TAliasNames | ReadonlyArray> 66 | >; 67 | 68 | type AddAliases = { 69 | [TArgName in keyof TArgs as AliasNames]: TArgs[TArgName]; 70 | }; 71 | 72 | type AliasNames< 73 | TArgName, 74 | TAliases extends Aliases | undefined, 75 | > = TArgName extends keyof TAliases 76 | ? string extends TAliases[TArgName] 77 | ? TArgName 78 | : TAliases[TArgName] extends string 79 | ? TArgName | TAliases[TArgName] 80 | : TAliases[TArgName] extends Array 81 | ? TArgName | TAliases[TArgName][number] 82 | : TArgName 83 | : TArgName; 84 | 85 | /** 86 | * Spreads all default values of Record `TDefaults` into Record `TArgs` 87 | * and makes default values required. 88 | * 89 | * **Example:** 90 | * `SpreadValues<{ foo?: boolean, bar?: number }, { foo: number }>` 91 | * 92 | * **Result:** `{ foo: boolean | number, bar?: number }` 93 | */ 94 | type SpreadDefaults = TDefaults extends undefined 95 | ? TArgs 96 | : TArgs extends Record 97 | ? Omit & { 98 | [Default in keyof TDefaults]: Default extends keyof TArgs 99 | ? 100 | | (TArgs[Default] & TDefaults[Default]) 101 | | TDefaults[Default] extends Record 102 | ? NonNullable> 103 | : TDefaults[Default] | NonNullable 104 | : unknown; 105 | } 106 | : never; 107 | 108 | /** 109 | * Defines the Record for the `default` option to add 110 | * auto-suggestion support for IDE's. 111 | */ 112 | type Defaults = Id< 113 | UnionToIntersection< 114 | Record & 115 | // Dedotted auto suggestions: { foo: { bar: unknown } } 116 | MapTypes & 117 | MapTypes & 118 | // Flat auto suggestions: { "foo.bar": unknown } 119 | MapDefaults & 120 | MapDefaults 121 | > 122 | >; 123 | 124 | type MapDefaults = Partial< 125 | Record 126 | >; 127 | 128 | type RecursiveRequired = TRecord extends Record 129 | ? { 130 | [Key in keyof TRecord]-?: RecursiveRequired; 131 | } 132 | : TRecord; 133 | 134 | /** Same as `MapTypes` but also supports collectable options. */ 135 | type CollectValues< 136 | TArgNames extends ArgType, 137 | TType, 138 | TCollectable extends Collectable, 139 | TNegatable extends Negatable = undefined, 140 | > = UnionToIntersection< 141 | Extract extends string 142 | ? (Exclude extends never 143 | ? Record 144 | : MapTypes, TType, TNegatable>) & 145 | (Extract extends never 146 | ? Record 147 | : RecursiveRequired< 148 | MapTypes< 149 | Extract, 150 | Array, 151 | TNegatable 152 | > 153 | >) 154 | : MapTypes 155 | >; 156 | 157 | /** Same as `Record` but also supports dotted and negatable options. */ 158 | type MapTypes< 159 | TArgNames extends ArgType, 160 | TType, 161 | TNegatable extends Negatable = undefined, 162 | > = undefined extends TArgNames 163 | ? Record 164 | : TArgNames extends `${infer Name}.${infer Rest}` 165 | ? { 166 | [Key in Name]?: MapTypes< 167 | Rest, 168 | TType, 169 | TNegatable extends `${Name}.${infer Negate}` ? Negate : undefined 170 | >; 171 | } 172 | : TArgNames extends string 173 | ? Partial< 174 | Record< 175 | TArgNames, 176 | TNegatable extends TArgNames ? TType | false : TType 177 | > 178 | > 179 | : Record; 180 | 181 | type CollectUnknownValues< 182 | TBooleans extends BooleanType, 183 | TStrings extends StringType, 184 | TCollectable extends Collectable, 185 | TNegatable extends Negatable, 186 | > = UnionToIntersection< 187 | TCollectable extends TBooleans & TStrings 188 | ? Record 189 | : DedotRecord< 190 | // Unknown collectable & non-negatable args. 191 | Record< 192 | Exclude< 193 | Extract, string>, 194 | Extract 195 | >, 196 | Array 197 | > & 198 | // Unknown collectable & negatable args. 199 | Record< 200 | Exclude< 201 | Extract, string>, 202 | Extract 203 | >, 204 | Array | false 205 | > 206 | > 207 | >; 208 | 209 | /** Converts `{ "foo.bar.baz": unknown }` into `{ foo: { bar: { baz: unknown } } }`. */ 210 | type DedotRecord = Record extends TRecord 211 | ? TRecord 212 | : TRecord extends Record 213 | ? UnionToIntersection< 214 | ValueOf<{ 215 | [Key in keyof TRecord]: Key extends string 216 | ? Dedot 217 | : never; 218 | }> 219 | > 220 | : TRecord; 221 | 222 | type Dedot< 223 | TKey extends string, 224 | TValue, 225 | > = TKey extends `${infer Name}.${infer Rest}` 226 | ? { [Key in Name]: Dedot } 227 | : { [Key in TKey]: TValue }; 228 | 229 | type ValueOf = TValue[keyof TValue]; 230 | 231 | /** The value returned from `parse`. */ 232 | export type Args< 233 | // deno-lint-ignore no-explicit-any 234 | TArgs extends Record = Record, 235 | > = Id< 236 | TArgs & { 237 | /** Contains all the arguments that didn't have an option associated with 238 | * them. */ 239 | _: Array; 240 | } 241 | >; 242 | 243 | /** The options for the `parse` call. */ 244 | export interface ParseOptions< 245 | TBooleans extends BooleanType = BooleanType, 246 | TStrings extends StringType = StringType, 247 | TCollectable extends Collectable = Collectable, 248 | TDefault extends Record | undefined = 249 | | Record 250 | | undefined, 251 | TAliases extends Aliases | undefined = Aliases | undefined, 252 | > { 253 | /** 254 | * An object mapping string names to strings or arrays of string argument 255 | * names to use as aliases. 256 | */ 257 | alias?: TAliases; 258 | 259 | /** 260 | * A boolean, string or array of strings to always treat as booleans. If 261 | * `true` will treat all double hyphenated arguments without equal signs as 262 | * `boolean` (e.g. affects `--foo`, not `-f` or `--foo=bar`). 263 | * All `boolean` arguments will be set to `false` by default. 264 | */ 265 | boolean?: TBooleans | ReadonlyArray>; 266 | 267 | /** An object mapping string argument names to default values. */ 268 | default?: TDefault & Defaults; 269 | 270 | /** A string or array of strings argument names to always treat as strings. */ 271 | string?: TStrings | ReadonlyArray>; 272 | 273 | /** 274 | * A string or array of strings argument names to always treat as arrays. 275 | * Array options can be used multiple times. All values will be 276 | * collected into one array. If a non-array option is used multiple 277 | * times, the last value is used. 278 | * All Collectable arguments will be set to `[]` by default. 279 | */ 280 | array?: TCollectable | ReadonlyArray>; 281 | } 282 | 283 | export interface NestedMapping { 284 | [key: string]: NestedMapping | unknown; 285 | } 286 | -------------------------------------------------------------------------------- /test/flags.test.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect, it, test } from "vitest"; 2 | import { parse } from "../src"; 3 | 4 | describe("flags", () => { 5 | it("a b c", () => { 6 | const input = ["a", "b", "c"]; 7 | const output = { _: ["a", "b", "c"] }; 8 | expect(parse(input)).toEqual(output); 9 | }); 10 | 11 | it("-a -b -c", () => { 12 | const input = ["-a", "-b", "-c"]; 13 | const output = { _: [], a: true, b: true, c: true }; 14 | expect(parse(input)).toEqual(output); 15 | }); 16 | 17 | it("-a 1 -b 2 -c 3 -d -e", () => { 18 | const input = ["-a", "1", "-b", "2", "-c", "3", "-d", "-e"]; 19 | const output = { _: [], a: 1, b: 2, c: 3, d: true, e: true }; 20 | expect(parse(input)).toEqual(output); 21 | }); 22 | 23 | it("-a=1 -b 2 -c=3 -d -e", () => { 24 | const input = ["-a", "1", "-b", "2", "-c", "3", "-d", "-e"]; 25 | const output = { _: [], a: 1, b: 2, c: 3, d: true, e: true }; 26 | expect(parse(input)).toEqual(output); 27 | }); 28 | 29 | it(`-a aaa bbb -b ccc ddd -c 3 -d -e`, () => { 30 | const input = [ 31 | "-a", 32 | "aaa", 33 | "bbb", 34 | "-b", 35 | "ccc", 36 | "ddd", 37 | "-c", 38 | "3", 39 | "-d", 40 | "-e", 41 | ]; 42 | const output = { 43 | _: ["bbb", "ddd"], 44 | a: "aaa", 45 | b: "ccc", 46 | c: 3, 47 | d: true, 48 | e: true, 49 | }; 50 | expect(parse(input)).toEqual(output); 51 | }); 52 | 53 | it(`-a "aaa bbb" -b "ccc ddd" -c 3 -d -e`, () => { 54 | const input = [`-a`, `"aaa bbb"`, `-b`, `"ccc ddd"`, `-c`, `3`, `-d`, `-e`]; 55 | const output = { 56 | _: [], 57 | a: "aaa bbb", 58 | b: "ccc ddd", 59 | c: 3, 60 | d: true, 61 | e: true, 62 | }; 63 | expect(parse(input)).toEqual(output); 64 | }); 65 | 66 | it("comprehensive", () => { 67 | const input = [ 68 | "--name=meowmers", 69 | "bare", 70 | "-cats", 71 | "woo", 72 | "-h", 73 | "awesome", 74 | "--multi=quux", 75 | "--key", 76 | "value", 77 | "-b", 78 | "--bool", 79 | "--no-meep", 80 | "--multi=baz", 81 | "-f=abc=def", 82 | ]; 83 | const output = { 84 | c: true, 85 | a: true, 86 | t: true, 87 | f: "abc=def", 88 | s: "woo", 89 | h: "awesome", 90 | b: true, 91 | bool: true, 92 | key: "value", 93 | multi: "baz", 94 | meep: false, 95 | name: "meowmers", 96 | _: ["bare"], 97 | }; 98 | expect(parse(input)).toEqual(output); 99 | }); 100 | }); 101 | 102 | describe("dotted", () => { 103 | it("-a.a1 1 -b.b1 2 -c.c1 3 -d -e", () => { 104 | const input = ["-a.a1", "1", "-b.b1", "2", "-c.c1", "3", "-d", "-e"]; 105 | const output = { 106 | _: [1, 2, 3], 107 | a: ".a1", 108 | b: ".b1", 109 | c: ".c1", 110 | d: true, 111 | e: true, 112 | }; 113 | expect(parse(input)).toEqual(output); 114 | }); 115 | 116 | it("--a.a1 1 --b.b1 2 --c.c1 3 -d -e", () => { 117 | const input = ["--a.a1", "1", "--b.b1", "2", "--c.c1", "3", "-d", "-e"]; 118 | const output = { 119 | _: [], 120 | a: { a1: 1 }, 121 | b: { b1: 2 }, 122 | c: { c1: 3 }, 123 | d: true, 124 | e: true, 125 | }; 126 | expect(parse(input)).toEqual(output); 127 | }); 128 | 129 | it("--a.a1.a2 1 --b.b1.b2 2 --c.c1.c2 3 -d -e", () => { 130 | const input = [ 131 | "--a.a1.a2", 132 | "1", 133 | "--b.b1.b2", 134 | "2", 135 | "--c.c1.c2", 136 | "3", 137 | "-d", 138 | "-e", 139 | ]; 140 | const output = { 141 | _: [], 142 | a: { a1: { a2: 1 } }, 143 | b: { b1: { b2: 2 } }, 144 | c: { c1: { c2: 3 } }, 145 | d: true, 146 | e: true, 147 | }; 148 | expect(parse(input)).toEqual(output); 149 | }); 150 | }); 151 | 152 | describe("negated", () => { 153 | it("supports unknown", () => { 154 | const input = ["--no-bundle", "--watch"]; 155 | const output = { 156 | _: [], 157 | bundle: false, 158 | watch: true, 159 | }; 160 | expect(parse(input)).toEqual(output); 161 | }); 162 | 163 | it("ignores strings", () => { 164 | const input = ["--no-bundle", "--watch"]; 165 | const opts = { 166 | string: ['no-bundle'] 167 | } 168 | const output = { 169 | _: [], 170 | 'no-bundle': '', 171 | watch: true, 172 | }; 173 | expect(parse(input, opts)).toEqual(output); 174 | }); 175 | 176 | it("ignores arrays", () => { 177 | const input = ["--no-bundle", '1', "--watch"]; 178 | const opts = { 179 | array: ['no-bundle'] 180 | } 181 | const output = { 182 | _: [], 183 | 'no-bundle': [1], 184 | watch: true, 185 | }; 186 | expect(parse(input, opts)).toEqual(output); 187 | }); 188 | }); 189 | 190 | describe("aliases", () => { 191 | it("works", () => { 192 | const input = ["-h"]; 193 | const output = { 194 | _: [], 195 | help: true 196 | }; 197 | const result = parse(input, { alias: { h: 'help' } }); 198 | expect(result).toEqual(output); 199 | }); 200 | 201 | it("ignores strings", () => { 202 | const input = ["--no-bundle", "--watch"]; 203 | const opts = { 204 | string: ['no-bundle'] 205 | } 206 | const output = { 207 | _: [], 208 | 'no-bundle': '', 209 | watch: true, 210 | }; 211 | expect(parse(input, opts)).toEqual(output); 212 | }); 213 | 214 | it("ignores arrays", () => { 215 | const input = ["--no-bundle", '1', "--watch"]; 216 | const opts = { 217 | array: ['no-bundle'] 218 | } 219 | const output = { 220 | _: [], 221 | 'no-bundle': [1], 222 | watch: true, 223 | }; 224 | expect(parse(input, opts)).toEqual(output); 225 | }); 226 | }); 227 | 228 | describe("special cases", () => { 229 | it("just a hyphen", () => { 230 | const input = ["-"]; 231 | const output = { 232 | _: ['-'], 233 | }; 234 | const result = parse(input); 235 | expect(result).toEqual(output); 236 | }); 237 | 238 | it("just a hyphen", () => { 239 | const input = ["-"]; 240 | const output = { 241 | _: ['-'], 242 | }; 243 | const result = parse(input); 244 | expect(result).toEqual(output); 245 | }); 246 | 247 | it("string after boolean should be treated as positional", () => { 248 | const input = ["--get", "http://my-url.com"]; 249 | const opts = { 250 | boolean: ['get'] 251 | } 252 | const output = { 253 | "_": ["http://my-url.com"], 254 | "get": true, 255 | }; 256 | const result = parse(input, opts); 257 | expect(result).toEqual(output); 258 | }); 259 | }); 260 | 261 | describe("boolean flags", () => { 262 | it("should handle long-form boolean flags correctly", () => { 263 | const input = ["--add"]; 264 | const opts = { 265 | boolean: ['add'] 266 | }; 267 | const output = { _: [], add: true }; 268 | expect(parse(input, opts)).toEqual(output); 269 | }); 270 | 271 | it("should handle alias boolean flags correctly", () => { 272 | const input = ["-a"]; 273 | const opts = { 274 | boolean: ['add'], 275 | alias: { a: 'add' } 276 | }; 277 | const output = { _: [], add: true }; 278 | expect(parse(input, opts)).toEqual(output); 279 | }); 280 | }); 281 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["src"], 3 | "compilerOptions": { 4 | "declaration": true, 5 | "emitDeclarationOnly": true, 6 | "strict": true, 7 | "moduleResolution": "NodeNext", 8 | "esModuleInterop": true, 9 | "forceConsistentCasingInFileNames": true, 10 | "allowJs": true, 11 | "module": "NodeNext", 12 | "outDir": "./dist", 13 | "declarationDir": "./dist", 14 | "target": "ES2020", 15 | "jsx": "react", 16 | "jsxFactory": "h", 17 | "jsxFragmentFactory": "Fragment" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config' 2 | 3 | export default defineConfig({ 4 | test: { 5 | transformMode: { 6 | web: [/\.[jt]sx$/], 7 | }, 8 | }, 9 | }) 10 | --------------------------------------------------------------------------------