├── .changeset ├── README.md └── config.json ├── .editorconfig ├── .github └── workflows │ ├── lint.yml │ ├── release.yml │ ├── test-Windows.yaml │ └── test-macOS.yaml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── biome.json ├── package.json ├── pnpm-lock.yaml ├── src ├── actions.ts ├── constants.ts ├── helpers.ts ├── index.ts └── types.ts ├── tests ├── cli.test.ts └── helpers.test.ts ├── tsconfig.json └── vitest.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@3.0.3/schema.json", 3 | "changelog": "@changesets/cli/changelog", 4 | "commit": false, 5 | "fixed": [], 6 | "linked": [], 7 | "access": "public", 8 | "baseBranch": "master", 9 | "updateInternalDependencies": "patch", 10 | "ignore": [] 11 | } 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_size = 2 6 | end_of_line = lf 7 | indent_style = space 8 | insert_final_newline = true 9 | trim_trailing_whitespace = false 10 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | lint: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: Checkout Repo 10 | uses: actions/checkout@v4 11 | 12 | - uses: pnpm/action-setup@v4 13 | with: 14 | version: 9 15 | 16 | - name: Setup Node.js 18.x 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: 18.x 20 | 21 | - name: Install Dependencies 22 | run: pnpm i 23 | 24 | - name: Lint 25 | run: pnpm check -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | concurrency: ${{ github.workflow }}-${{ github.ref }} 9 | 10 | jobs: 11 | release: 12 | name: Release 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout Repo 16 | uses: actions/checkout@v4 17 | 18 | - name: Setup Node.js 20.x 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: 20.x 22 | 23 | - uses: pnpm/action-setup@v4 24 | with: 25 | version: 9 26 | 27 | - name: Install Dependencies 28 | run: pnpm install 29 | 30 | - name: Build 31 | run: pnpm run build 32 | 33 | - name: Create Release Pull Request or Publish to npm 34 | id: changesets 35 | uses: changesets/action@v1 36 | with: 37 | publish: pnpm changeset:publish 38 | version: pnpm changeset:version 39 | env: 40 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 41 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 42 | -------------------------------------------------------------------------------- /.github/workflows/test-Windows.yaml: -------------------------------------------------------------------------------- 1 | name: Unit Test(Windows) 2 | on: 3 | pull_request: 4 | branches: [master] 5 | jobs: 6 | ut-windows: 7 | # The type of runner that the job will run on 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | node-version: [18.x] 12 | os: [windows-latest] # windows-latest 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | with: 18 | fetch-depth: 25 19 | 20 | - name: Setup Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | 25 | - uses: pnpm/action-setup@v4 26 | with: 27 | version: 9 28 | 29 | - name: Install Dependencies 30 | run: pnpm install 31 | 32 | - name: Build 33 | run: pnpm run build 34 | 35 | - name: Test 36 | run: pnpm run test 37 | -------------------------------------------------------------------------------- /.github/workflows/test-macOS.yaml: -------------------------------------------------------------------------------- 1 | name: Unit Test(macOS) 2 | on: 3 | pull_request: 4 | branches: [master] 5 | jobs: 6 | ut-mac: 7 | # The type of runner that the job will run on 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | node-version: [18.x] 12 | os: [macos-latest] # macos-latest 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | with: 18 | fetch-depth: 25 19 | 20 | - name: Setup Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | 25 | - uses: pnpm/action-setup@v4 26 | with: 27 | version: 9 28 | 29 | - name: Install Dependencies 30 | run: pnpm install 31 | 32 | - name: Build 33 | run: pnpm run build 34 | 35 | - name: Test 36 | run: pnpm run test 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # TODO 2 | TODO.md 3 | 4 | # package lock 5 | package-lock.json 6 | yarn.lock 7 | 8 | # Output of 'npm pack' 9 | *.tgz 10 | 11 | # Dependency directories 12 | node_modules/ 13 | jspm_packages/ 14 | 15 | # VisualStudioCode Or idea 16 | .vscode/* 17 | .idea/** 18 | 19 | # Local History for Visual Studio Code 20 | .history/ 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | lib-cov 24 | 25 | # Runtime data 26 | pids 27 | *.pid 28 | *.seed 29 | *.pid.lock 30 | 31 | # Logs 32 | logs 33 | *.log 34 | npm-debug.log* 35 | yarn-debug.log* 36 | yarn-error.log* 37 | lerna-debug.log* 38 | .pnpm-debug.log* 39 | 40 | # Others 41 | *.seed 42 | *.csv 43 | *.dat 44 | *.out 45 | *.gz 46 | .DS_Store 47 | results 48 | dist 49 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # nrm 2 | 3 | ## 2.0.1 4 | 5 | ### Patch Changes 6 | 7 | - 19eff3c: Added delete multiple registry. Thanks @chouchouji 8 | 9 | ## 2.0.0 10 | 11 | ### Major Changes 12 | 13 | - 8e68916: Migrate to Typescript and vitet. Thanks @chouchouji 14 | 15 | ## 1.5.0 16 | 17 | ### Minor Changes 18 | 19 | - 9f04e63: Added set registry locally. Thanks @chouchouji 20 | 21 | ### Patch Changes 22 | 23 | - 6f54e36: Optimize package files Thanks @chouchouji 24 | 25 | ## 1.4.0 26 | 27 | ### Minor Changes 28 | 29 | - 3bb88bd: Added select npm registry by keyboard 30 | 31 | ## 1.3.1 32 | 33 | ### Patch Changes 34 | 35 | - a808f9f: Updated tencent npm mirror registry 36 | 37 | ## 1.3.0 38 | 39 | ### Minor Changes 40 | 41 | - 1aa79c3: Added huawei registry. (thanks @icemanpro) 42 | - d9ebd7e: Fixed `punycode` DeprecationWarning, replace node-fetch@2.6.6 with undici. 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Wang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | nrm -- npm registry manager 2 | === 3 | 4 |

5 | version 6 | stars 7 | license 8 |

9 | 10 | `nrm` can help you switch different npm registries easily and quickly. It supports 11 | `npm`, `cnpm`, `taobao`, `yarn`, `tencent`, `npmMirror` and `huawei`. 12 | 13 | 14 | ## Install 15 | 16 | ``` 17 | # npm 18 | npm install -g nrm 19 | 20 | # yarn 21 | yarn global add nrm 22 | 23 | # pnpm 24 | pnpm add -g nrm 25 | ``` 26 | 27 | ## Example 28 | ``` 29 | $ nrm ls 30 | 31 | * npm ---------- https://registry.npmjs.org/ 32 | yarn --------- https://registry.yarnpkg.com/ 33 | tencent ------ https://mirrors.tencent.com/npm/ 34 | cnpm --------- https://r.cnpmjs.org/ 35 | taobao ------- https://registry.npmmirror.com/ 36 | npmMirror ---- https://skimdb.npmjs.com/registry/ 37 | huawei ------- https://repo.huaweicloud.com/repository/npm/ 38 | 39 | ``` 40 | 41 | ``` 42 | $ nrm use taobao 43 | 44 | SUCCESS The registry has been changed to 'taobao'. 45 | ``` 46 | 47 | ## Usage 48 | 49 | > [!TIP] 50 | > The lowest node version is ***18*** from ***v1.4.0***. 51 | 52 | ``` 53 | Usage: nrm [options] [command] 54 | 55 | Commands: 56 | 57 | ls List all the registries 58 | current Show current registry name 59 | -u --show-url Show the registry URL instead of the name 60 | use [registry] Change registry to registry 61 | -l --local Switch local registry 62 | add [home] Add one custom registry 63 | login [value] Set authorize information for a registry with a base64 encoded string or username and password 64 | -a --always-auth Set is always auth 65 | -u --username Your user name for this registry 66 | -p --password Your password for this registry 67 | -e --email Your email for this registry 68 | set-hosted-repo Set hosted npm repository for a custom registry to publish packages 69 | set-scope Associating a scope with a registry 70 | del-scope Remove a scope 71 | set Set custom registry attribute 72 | -a --attr Set custom registry attribute 73 | -v --value Set custom registry value 74 | del [registry] Delete one custom registry 75 | rename Set custom registry name 76 | home [browser] Open the homepage of registry with optional browser 77 | publish [|] Publish package to current registry if current registry is a custom registry. The field 'repository' of current custom registry is required running this command. If you're not using custom registry, this command will run npm publish directly 78 | -t --tag [tag] Add tag 79 | -a --access Set access 80 | -o --otp [otpcode] Set otpcode 81 | -dr --dry-run Set is dry run 82 | test [registry] Show the response time for one or all registries 83 | help [command] Display help for command 84 | 85 | Options: 86 | 87 | -h --help output usage information 88 | -V --version output the version number 89 | ``` 90 | 91 | ## Registries 92 | 93 | * [npm](https://www.npmjs.org) 94 | * [yarn](https://yarnpkg.com) 95 | * [tencent](https://mirrors.tencent.com) 96 | * [cnpm](http://cnpmjs.org) 97 | * [npmMirror](https://skimdb.npmjs.com/) 98 | * [taobao](https://npmmirror.com) 99 | * [huawei](https://www.huaweicloud.com/special/npm-jingxiang.html) 100 | 101 | ## How to configure yarn to use private registry ? 102 | 103 | just add .yarnrc in your project’s directory and write there: 104 | `registry "http://your.registry"` 105 | 106 | Or you can configure it in your HOME directory's .yarnrc 107 | 108 | ## Related Projects 109 | 110 | * [verdaccio--A lightweight private npm proxy registry](https://verdaccio.org/) 111 | 112 | ## TODO 113 | 114 | 1. Add more registries: github, [sonatype](https://help.sonatype.com/repomanager3/formats/npm-registry) 115 | 116 | ## Notice 117 | 118 | When you are using preset registries the `publish` command will proxy to the npm official registry. 119 | 120 | When you are using a custom registry you will need to run the `set-hosted-repo` to set a url to publish packages to your hosted registry. 121 | 122 | ## Maintainer is wanted 123 | 124 | If you find nrm is useful and are an experienced node.js developer, then you can help maintain nrm. 125 | 126 | If you have the interest, you can reach me through email: pana.wang@outlook.com 127 | 128 | ## Contributors 129 | 130 | 131 | 132 | 133 | 134 | ## LICENSE 135 | 136 | [MIT](LICENSE) 137 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", 3 | "vcs": { 4 | "enabled": false, 5 | "clientKind": "git", 6 | "useIgnoreFile": true 7 | }, 8 | "files": { 9 | "ignoreUnknown": true, 10 | "ignore": ["dist", "*.json"] 11 | }, 12 | "formatter": { 13 | "enabled": true, 14 | "lineWidth": 80, 15 | "useEditorconfig": true 16 | }, 17 | "organizeImports": { 18 | "enabled": true 19 | }, 20 | "linter": { 21 | "enabled": true, 22 | "rules": { 23 | "recommended": true, 24 | "suspicious": { 25 | "noExplicitAny": "off" 26 | } 27 | } 28 | }, 29 | "javascript": { 30 | "formatter": { 31 | "quoteStyle": "single" 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nrm", 3 | "version": "2.0.1", 4 | "description": "npm registry manager can help you switch different npm registries easily and quickly", 5 | "bin": { 6 | "nrm": "dist/index.js" 7 | }, 8 | "type": "commonjs", 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/Pana/nrm.git" 12 | }, 13 | "files": [ 14 | "dist" 15 | ], 16 | "scripts": { 17 | "clean": "rimraf node_modules dist", 18 | "test": "pnpm build && vitest run", 19 | "dev": "tsc --watch", 20 | "build": "rimraf dist && tsc && rimraf dist/types.js", 21 | "test:watch": "vitest", 22 | "changeset:version": "changeset version", 23 | "changeset:publish": "changeset publish", 24 | "check": "biome check --write --verbose" 25 | }, 26 | "keywords": [ 27 | "npm", 28 | "registry" 29 | ], 30 | "author": "Pana", 31 | "license": "MIT", 32 | "bugs": { 33 | "url": "https://github.com/Pana/nrm/issues" 34 | }, 35 | "homepage": "https://github.com/Pana/nrm", 36 | "dependencies": { 37 | "@inquirer/checkbox": "^4.0.3", 38 | "@inquirer/select": "^4.0.2", 39 | "chalk": "4.1.2", 40 | "commander": "^8.3.0", 41 | "ini": "4.1.3", 42 | "open": "8.4.2", 43 | "undici": "5.28.2" 44 | }, 45 | "devDependencies": { 46 | "@biomejs/biome": "1.9.4", 47 | "@changesets/cli": "^2.27.8", 48 | "@types/ini": "^4.1.1", 49 | "@types/node": "18", 50 | "coffee": "^5.4.0", 51 | "mock-fs": "^5.4.1", 52 | "rimraf": "^6.0.1", 53 | "strip-ansi": "^7.1.0", 54 | "typescript": "^5.7.2", 55 | "vitest": "2.1.6" 56 | }, 57 | "engines": { 58 | "node": ">=18" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@inquirer/checkbox': 12 | specifier: ^4.0.3 13 | version: 4.0.3(@types/node@18.19.67) 14 | '@inquirer/select': 15 | specifier: ^4.0.2 16 | version: 4.0.2(@types/node@18.19.67) 17 | chalk: 18 | specifier: 4.1.2 19 | version: 4.1.2 20 | commander: 21 | specifier: ^8.3.0 22 | version: 8.3.0 23 | ini: 24 | specifier: 4.1.3 25 | version: 4.1.3 26 | open: 27 | specifier: 8.4.2 28 | version: 8.4.2 29 | undici: 30 | specifier: 5.28.2 31 | version: 5.28.2 32 | devDependencies: 33 | '@biomejs/biome': 34 | specifier: 1.9.4 35 | version: 1.9.4 36 | '@changesets/cli': 37 | specifier: ^2.27.8 38 | version: 2.27.10 39 | '@types/ini': 40 | specifier: ^4.1.1 41 | version: 4.1.1 42 | '@types/node': 43 | specifier: '18' 44 | version: 18.19.67 45 | coffee: 46 | specifier: ^5.4.0 47 | version: 5.5.1 48 | mock-fs: 49 | specifier: ^5.4.1 50 | version: 5.4.1 51 | rimraf: 52 | specifier: ^6.0.1 53 | version: 6.0.1 54 | strip-ansi: 55 | specifier: ^7.1.0 56 | version: 7.1.0 57 | typescript: 58 | specifier: ^5.7.2 59 | version: 5.7.2 60 | vitest: 61 | specifier: 2.1.6 62 | version: 2.1.6(@types/node@18.19.67) 63 | 64 | packages: 65 | 66 | '@babel/runtime@7.26.0': 67 | resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} 68 | engines: {node: '>=6.9.0'} 69 | 70 | '@biomejs/biome@1.9.4': 71 | resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} 72 | engines: {node: '>=14.21.3'} 73 | hasBin: true 74 | 75 | '@biomejs/cli-darwin-arm64@1.9.4': 76 | resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} 77 | engines: {node: '>=14.21.3'} 78 | cpu: [arm64] 79 | os: [darwin] 80 | 81 | '@biomejs/cli-darwin-x64@1.9.4': 82 | resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} 83 | engines: {node: '>=14.21.3'} 84 | cpu: [x64] 85 | os: [darwin] 86 | 87 | '@biomejs/cli-linux-arm64-musl@1.9.4': 88 | resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} 89 | engines: {node: '>=14.21.3'} 90 | cpu: [arm64] 91 | os: [linux] 92 | libc: [musl] 93 | 94 | '@biomejs/cli-linux-arm64@1.9.4': 95 | resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} 96 | engines: {node: '>=14.21.3'} 97 | cpu: [arm64] 98 | os: [linux] 99 | libc: [glibc] 100 | 101 | '@biomejs/cli-linux-x64-musl@1.9.4': 102 | resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} 103 | engines: {node: '>=14.21.3'} 104 | cpu: [x64] 105 | os: [linux] 106 | libc: [musl] 107 | 108 | '@biomejs/cli-linux-x64@1.9.4': 109 | resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} 110 | engines: {node: '>=14.21.3'} 111 | cpu: [x64] 112 | os: [linux] 113 | libc: [glibc] 114 | 115 | '@biomejs/cli-win32-arm64@1.9.4': 116 | resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} 117 | engines: {node: '>=14.21.3'} 118 | cpu: [arm64] 119 | os: [win32] 120 | 121 | '@biomejs/cli-win32-x64@1.9.4': 122 | resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} 123 | engines: {node: '>=14.21.3'} 124 | cpu: [x64] 125 | os: [win32] 126 | 127 | '@changesets/apply-release-plan@7.0.6': 128 | resolution: {integrity: sha512-TKhVLtiwtQOgMAC0fCJfmv93faiViKSDqr8oMEqrnNs99gtSC1sZh/aEMS9a+dseU1ESZRCK+ofLgGY7o0fw/Q==} 129 | 130 | '@changesets/assemble-release-plan@6.0.5': 131 | resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} 132 | 133 | '@changesets/changelog-git@0.2.0': 134 | resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} 135 | 136 | '@changesets/cli@2.27.10': 137 | resolution: {integrity: sha512-PfeXjvs9OfQJV8QSFFHjwHX3QnUL9elPEQ47SgkiwzLgtKGyuikWjrdM+lO9MXzOE22FO9jEGkcs4b+B6D6X0Q==} 138 | hasBin: true 139 | 140 | '@changesets/config@3.0.4': 141 | resolution: {integrity: sha512-+DiIwtEBpvvv1z30f8bbOsUQGuccnZl9KRKMM/LxUHuDu5oEjmN+bJQ1RIBKNJjfYMQn8RZzoPiX0UgPaLQyXw==} 142 | 143 | '@changesets/errors@0.2.0': 144 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 145 | 146 | '@changesets/get-dependents-graph@2.1.2': 147 | resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} 148 | 149 | '@changesets/get-release-plan@4.0.5': 150 | resolution: {integrity: sha512-E6wW7JoSMcctdVakut0UB76FrrN3KIeJSXvB+DHMFo99CnC3ZVnNYDCVNClMlqAhYGmLmAj77QfApaI3ca4Fkw==} 151 | 152 | '@changesets/get-version-range-type@0.4.0': 153 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 154 | 155 | '@changesets/git@3.0.2': 156 | resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} 157 | 158 | '@changesets/logger@0.1.1': 159 | resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 160 | 161 | '@changesets/parse@0.4.0': 162 | resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} 163 | 164 | '@changesets/pre@2.0.1': 165 | resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} 166 | 167 | '@changesets/read@0.6.2': 168 | resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} 169 | 170 | '@changesets/should-skip-package@0.1.1': 171 | resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} 172 | 173 | '@changesets/types@4.1.0': 174 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 175 | 176 | '@changesets/types@6.0.0': 177 | resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} 178 | 179 | '@changesets/write@0.3.2': 180 | resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} 181 | 182 | '@esbuild/aix-ppc64@0.24.0': 183 | resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} 184 | engines: {node: '>=18'} 185 | cpu: [ppc64] 186 | os: [aix] 187 | 188 | '@esbuild/android-arm64@0.24.0': 189 | resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} 190 | engines: {node: '>=18'} 191 | cpu: [arm64] 192 | os: [android] 193 | 194 | '@esbuild/android-arm@0.24.0': 195 | resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} 196 | engines: {node: '>=18'} 197 | cpu: [arm] 198 | os: [android] 199 | 200 | '@esbuild/android-x64@0.24.0': 201 | resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} 202 | engines: {node: '>=18'} 203 | cpu: [x64] 204 | os: [android] 205 | 206 | '@esbuild/darwin-arm64@0.24.0': 207 | resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} 208 | engines: {node: '>=18'} 209 | cpu: [arm64] 210 | os: [darwin] 211 | 212 | '@esbuild/darwin-x64@0.24.0': 213 | resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} 214 | engines: {node: '>=18'} 215 | cpu: [x64] 216 | os: [darwin] 217 | 218 | '@esbuild/freebsd-arm64@0.24.0': 219 | resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} 220 | engines: {node: '>=18'} 221 | cpu: [arm64] 222 | os: [freebsd] 223 | 224 | '@esbuild/freebsd-x64@0.24.0': 225 | resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} 226 | engines: {node: '>=18'} 227 | cpu: [x64] 228 | os: [freebsd] 229 | 230 | '@esbuild/linux-arm64@0.24.0': 231 | resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} 232 | engines: {node: '>=18'} 233 | cpu: [arm64] 234 | os: [linux] 235 | 236 | '@esbuild/linux-arm@0.24.0': 237 | resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} 238 | engines: {node: '>=18'} 239 | cpu: [arm] 240 | os: [linux] 241 | 242 | '@esbuild/linux-ia32@0.24.0': 243 | resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} 244 | engines: {node: '>=18'} 245 | cpu: [ia32] 246 | os: [linux] 247 | 248 | '@esbuild/linux-loong64@0.24.0': 249 | resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} 250 | engines: {node: '>=18'} 251 | cpu: [loong64] 252 | os: [linux] 253 | 254 | '@esbuild/linux-mips64el@0.24.0': 255 | resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} 256 | engines: {node: '>=18'} 257 | cpu: [mips64el] 258 | os: [linux] 259 | 260 | '@esbuild/linux-ppc64@0.24.0': 261 | resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} 262 | engines: {node: '>=18'} 263 | cpu: [ppc64] 264 | os: [linux] 265 | 266 | '@esbuild/linux-riscv64@0.24.0': 267 | resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} 268 | engines: {node: '>=18'} 269 | cpu: [riscv64] 270 | os: [linux] 271 | 272 | '@esbuild/linux-s390x@0.24.0': 273 | resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} 274 | engines: {node: '>=18'} 275 | cpu: [s390x] 276 | os: [linux] 277 | 278 | '@esbuild/linux-x64@0.24.0': 279 | resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} 280 | engines: {node: '>=18'} 281 | cpu: [x64] 282 | os: [linux] 283 | 284 | '@esbuild/netbsd-x64@0.24.0': 285 | resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} 286 | engines: {node: '>=18'} 287 | cpu: [x64] 288 | os: [netbsd] 289 | 290 | '@esbuild/openbsd-arm64@0.24.0': 291 | resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} 292 | engines: {node: '>=18'} 293 | cpu: [arm64] 294 | os: [openbsd] 295 | 296 | '@esbuild/openbsd-x64@0.24.0': 297 | resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} 298 | engines: {node: '>=18'} 299 | cpu: [x64] 300 | os: [openbsd] 301 | 302 | '@esbuild/sunos-x64@0.24.0': 303 | resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} 304 | engines: {node: '>=18'} 305 | cpu: [x64] 306 | os: [sunos] 307 | 308 | '@esbuild/win32-arm64@0.24.0': 309 | resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} 310 | engines: {node: '>=18'} 311 | cpu: [arm64] 312 | os: [win32] 313 | 314 | '@esbuild/win32-ia32@0.24.0': 315 | resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} 316 | engines: {node: '>=18'} 317 | cpu: [ia32] 318 | os: [win32] 319 | 320 | '@esbuild/win32-x64@0.24.0': 321 | resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} 322 | engines: {node: '>=18'} 323 | cpu: [x64] 324 | os: [win32] 325 | 326 | '@fastify/busboy@2.1.1': 327 | resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} 328 | engines: {node: '>=14'} 329 | 330 | '@inquirer/checkbox@4.0.3': 331 | resolution: {integrity: sha512-CEt9B4e8zFOGtc/LYeQx5m8nfqQeG/4oNNv0PUvXGG0mys+wR/WbJ3B4KfSQ4Fcr3AQfpiuFOi3fVvmPfvNbxw==} 332 | engines: {node: '>=18'} 333 | peerDependencies: 334 | '@types/node': '>=18' 335 | 336 | '@inquirer/core@10.1.0': 337 | resolution: {integrity: sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==} 338 | engines: {node: '>=18'} 339 | 340 | '@inquirer/core@10.1.1': 341 | resolution: {integrity: sha512-rmZVXy9iZvO3ZStEe/ayuuwIJ23LSF13aPMlLMTQARX6lGUBDHGV8UB5i9MRrfy0+mZwt5/9bdy8llszSD3NQA==} 342 | engines: {node: '>=18'} 343 | 344 | '@inquirer/figures@1.0.8': 345 | resolution: {integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==} 346 | engines: {node: '>=18'} 347 | 348 | '@inquirer/select@4.0.2': 349 | resolution: {integrity: sha512-uSWUzaSYAEj0hlzxa1mUB6VqrKaYx0QxGBLZzU4xWFxaSyGaXxsSE4OSOwdU24j0xl8OajgayqFXW0l2bkl2kg==} 350 | engines: {node: '>=18'} 351 | peerDependencies: 352 | '@types/node': '>=18' 353 | 354 | '@inquirer/type@3.0.1': 355 | resolution: {integrity: sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==} 356 | engines: {node: '>=18'} 357 | peerDependencies: 358 | '@types/node': '>=18' 359 | 360 | '@isaacs/cliui@8.0.2': 361 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 362 | engines: {node: '>=12'} 363 | 364 | '@jridgewell/sourcemap-codec@1.5.0': 365 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 366 | 367 | '@manypkg/find-root@1.1.0': 368 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 369 | 370 | '@manypkg/get-packages@1.1.3': 371 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 372 | 373 | '@nodelib/fs.scandir@2.1.5': 374 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 375 | engines: {node: '>= 8'} 376 | 377 | '@nodelib/fs.stat@2.0.5': 378 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 379 | engines: {node: '>= 8'} 380 | 381 | '@nodelib/fs.walk@1.2.8': 382 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 383 | engines: {node: '>= 8'} 384 | 385 | '@rollup/rollup-android-arm-eabi@4.27.4': 386 | resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} 387 | cpu: [arm] 388 | os: [android] 389 | 390 | '@rollup/rollup-android-arm64@4.27.4': 391 | resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} 392 | cpu: [arm64] 393 | os: [android] 394 | 395 | '@rollup/rollup-darwin-arm64@4.27.4': 396 | resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} 397 | cpu: [arm64] 398 | os: [darwin] 399 | 400 | '@rollup/rollup-darwin-x64@4.27.4': 401 | resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} 402 | cpu: [x64] 403 | os: [darwin] 404 | 405 | '@rollup/rollup-freebsd-arm64@4.27.4': 406 | resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} 407 | cpu: [arm64] 408 | os: [freebsd] 409 | 410 | '@rollup/rollup-freebsd-x64@4.27.4': 411 | resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} 412 | cpu: [x64] 413 | os: [freebsd] 414 | 415 | '@rollup/rollup-linux-arm-gnueabihf@4.27.4': 416 | resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} 417 | cpu: [arm] 418 | os: [linux] 419 | libc: [glibc] 420 | 421 | '@rollup/rollup-linux-arm-musleabihf@4.27.4': 422 | resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} 423 | cpu: [arm] 424 | os: [linux] 425 | libc: [musl] 426 | 427 | '@rollup/rollup-linux-arm64-gnu@4.27.4': 428 | resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} 429 | cpu: [arm64] 430 | os: [linux] 431 | libc: [glibc] 432 | 433 | '@rollup/rollup-linux-arm64-musl@4.27.4': 434 | resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} 435 | cpu: [arm64] 436 | os: [linux] 437 | libc: [musl] 438 | 439 | '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': 440 | resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} 441 | cpu: [ppc64] 442 | os: [linux] 443 | libc: [glibc] 444 | 445 | '@rollup/rollup-linux-riscv64-gnu@4.27.4': 446 | resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} 447 | cpu: [riscv64] 448 | os: [linux] 449 | libc: [glibc] 450 | 451 | '@rollup/rollup-linux-s390x-gnu@4.27.4': 452 | resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} 453 | cpu: [s390x] 454 | os: [linux] 455 | libc: [glibc] 456 | 457 | '@rollup/rollup-linux-x64-gnu@4.27.4': 458 | resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} 459 | cpu: [x64] 460 | os: [linux] 461 | libc: [glibc] 462 | 463 | '@rollup/rollup-linux-x64-musl@4.27.4': 464 | resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} 465 | cpu: [x64] 466 | os: [linux] 467 | libc: [musl] 468 | 469 | '@rollup/rollup-win32-arm64-msvc@4.27.4': 470 | resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} 471 | cpu: [arm64] 472 | os: [win32] 473 | 474 | '@rollup/rollup-win32-ia32-msvc@4.27.4': 475 | resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} 476 | cpu: [ia32] 477 | os: [win32] 478 | 479 | '@rollup/rollup-win32-x64-msvc@4.27.4': 480 | resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} 481 | cpu: [x64] 482 | os: [win32] 483 | 484 | '@types/estree@1.0.6': 485 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 486 | 487 | '@types/ini@4.1.1': 488 | resolution: {integrity: sha512-MIyNUZipBTbyUNnhvuXJTY7B6qNI78meck9Jbv3wk0OgNwRyOOVEKDutAkOs1snB/tx0FafyR6/SN4Ps0hZPeg==} 489 | 490 | '@types/node@12.20.55': 491 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 492 | 493 | '@types/node@18.19.67': 494 | resolution: {integrity: sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==} 495 | 496 | '@vitest/expect@2.1.6': 497 | resolution: {integrity: sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==} 498 | 499 | '@vitest/mocker@2.1.6': 500 | resolution: {integrity: sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==} 501 | peerDependencies: 502 | msw: ^2.4.9 503 | vite: ^5.0.0 || ^6.0.0 504 | peerDependenciesMeta: 505 | msw: 506 | optional: true 507 | vite: 508 | optional: true 509 | 510 | '@vitest/pretty-format@2.1.6': 511 | resolution: {integrity: sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==} 512 | 513 | '@vitest/runner@2.1.6': 514 | resolution: {integrity: sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==} 515 | 516 | '@vitest/snapshot@2.1.6': 517 | resolution: {integrity: sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==} 518 | 519 | '@vitest/spy@2.1.6': 520 | resolution: {integrity: sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==} 521 | 522 | '@vitest/utils@2.1.6': 523 | resolution: {integrity: sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==} 524 | 525 | ansi-colors@4.1.3: 526 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 527 | engines: {node: '>=6'} 528 | 529 | ansi-escapes@4.3.2: 530 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 531 | engines: {node: '>=8'} 532 | 533 | ansi-regex@5.0.1: 534 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 535 | engines: {node: '>=8'} 536 | 537 | ansi-regex@6.1.0: 538 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 539 | engines: {node: '>=12'} 540 | 541 | ansi-styles@4.3.0: 542 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 543 | engines: {node: '>=8'} 544 | 545 | ansi-styles@6.2.1: 546 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 547 | engines: {node: '>=12'} 548 | 549 | argparse@1.0.10: 550 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 551 | 552 | array-union@2.1.0: 553 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 554 | engines: {node: '>=8'} 555 | 556 | assertion-error@2.0.1: 557 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 558 | engines: {node: '>=12'} 559 | 560 | balanced-match@1.0.2: 561 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 562 | 563 | better-path-resolve@1.0.0: 564 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 565 | engines: {node: '>=4'} 566 | 567 | brace-expansion@2.0.1: 568 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 569 | 570 | braces@3.0.3: 571 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 572 | engines: {node: '>=8'} 573 | 574 | cac@6.7.14: 575 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 576 | engines: {node: '>=8'} 577 | 578 | chai@5.1.2: 579 | resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} 580 | engines: {node: '>=12'} 581 | 582 | chalk@4.1.2: 583 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 584 | engines: {node: '>=10'} 585 | 586 | chardet@0.7.0: 587 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 588 | 589 | check-error@2.1.1: 590 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 591 | engines: {node: '>= 16'} 592 | 593 | ci-info@3.9.0: 594 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 595 | engines: {node: '>=8'} 596 | 597 | cli-width@4.1.0: 598 | resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} 599 | engines: {node: '>= 12'} 600 | 601 | coffee@5.5.1: 602 | resolution: {integrity: sha512-ZKt9b/Iq0jhe7tYpDMXJggx8l/+YIcQFi2C+LvJRQ7lUSJnzayir1BGbsoHELKKyV+zevWMCsfmGAI1fREyRbw==} 603 | engines: {node: '>= 6.0.0'} 604 | 605 | color-convert@2.0.1: 606 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 607 | engines: {node: '>=7.0.0'} 608 | 609 | color-name@1.1.4: 610 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 611 | 612 | commander@8.3.0: 613 | resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} 614 | engines: {node: '>= 12'} 615 | 616 | core-util-is@1.0.3: 617 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 618 | 619 | cross-spawn@6.0.6: 620 | resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} 621 | engines: {node: '>=4.8'} 622 | 623 | cross-spawn@7.0.6: 624 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 625 | engines: {node: '>= 8'} 626 | 627 | debug@4.3.7: 628 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 629 | engines: {node: '>=6.0'} 630 | peerDependencies: 631 | supports-color: '*' 632 | peerDependenciesMeta: 633 | supports-color: 634 | optional: true 635 | 636 | deep-eql@5.0.2: 637 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 638 | engines: {node: '>=6'} 639 | 640 | define-lazy-prop@2.0.0: 641 | resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} 642 | engines: {node: '>=8'} 643 | 644 | detect-indent@6.1.0: 645 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 646 | engines: {node: '>=8'} 647 | 648 | dir-glob@3.0.1: 649 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 650 | engines: {node: '>=8'} 651 | 652 | eastasianwidth@0.2.0: 653 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 654 | 655 | emoji-regex@8.0.0: 656 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 657 | 658 | emoji-regex@9.2.2: 659 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 660 | 661 | enquirer@2.4.1: 662 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 663 | engines: {node: '>=8.6'} 664 | 665 | es-module-lexer@1.5.4: 666 | resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} 667 | 668 | esbuild@0.24.0: 669 | resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} 670 | engines: {node: '>=18'} 671 | hasBin: true 672 | 673 | esprima@4.0.1: 674 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 675 | engines: {node: '>=4'} 676 | hasBin: true 677 | 678 | estree-walker@3.0.3: 679 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 680 | 681 | expect-type@1.1.0: 682 | resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} 683 | engines: {node: '>=12.0.0'} 684 | 685 | extendable-error@0.1.7: 686 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 687 | 688 | external-editor@3.1.0: 689 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 690 | engines: {node: '>=4'} 691 | 692 | fast-glob@3.3.2: 693 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 694 | engines: {node: '>=8.6.0'} 695 | 696 | fastq@1.17.1: 697 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 698 | 699 | fill-range@7.1.1: 700 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 701 | engines: {node: '>=8'} 702 | 703 | find-up@4.1.0: 704 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 705 | engines: {node: '>=8'} 706 | 707 | foreground-child@3.3.0: 708 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 709 | engines: {node: '>=14'} 710 | 711 | fs-extra@7.0.1: 712 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 713 | engines: {node: '>=6 <7 || >=8'} 714 | 715 | fs-extra@8.1.0: 716 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 717 | engines: {node: '>=6 <7 || >=8'} 718 | 719 | fsevents@2.3.3: 720 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 721 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 722 | os: [darwin] 723 | 724 | glob-parent@5.1.2: 725 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 726 | engines: {node: '>= 6'} 727 | 728 | glob@11.0.0: 729 | resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} 730 | engines: {node: 20 || >=22} 731 | hasBin: true 732 | 733 | globby@11.1.0: 734 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 735 | engines: {node: '>=10'} 736 | 737 | graceful-fs@4.2.11: 738 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 739 | 740 | has-flag@4.0.0: 741 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 742 | engines: {node: '>=8'} 743 | 744 | human-id@1.0.2: 745 | resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} 746 | 747 | iconv-lite@0.4.24: 748 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 749 | engines: {node: '>=0.10.0'} 750 | 751 | ignore@5.3.2: 752 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 753 | engines: {node: '>= 4'} 754 | 755 | ini@4.1.3: 756 | resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} 757 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 758 | 759 | is-class-hotfix@0.0.6: 760 | resolution: {integrity: sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==} 761 | 762 | is-docker@2.2.1: 763 | resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} 764 | engines: {node: '>=8'} 765 | hasBin: true 766 | 767 | is-extglob@2.1.1: 768 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 769 | engines: {node: '>=0.10.0'} 770 | 771 | is-fullwidth-code-point@3.0.0: 772 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 773 | engines: {node: '>=8'} 774 | 775 | is-glob@4.0.3: 776 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 777 | engines: {node: '>=0.10.0'} 778 | 779 | is-number@7.0.0: 780 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 781 | engines: {node: '>=0.12.0'} 782 | 783 | is-subdir@1.2.0: 784 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 785 | engines: {node: '>=4'} 786 | 787 | is-type-of@1.4.0: 788 | resolution: {integrity: sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==} 789 | 790 | is-windows@1.0.2: 791 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 792 | engines: {node: '>=0.10.0'} 793 | 794 | is-wsl@2.2.0: 795 | resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} 796 | engines: {node: '>=8'} 797 | 798 | isexe@2.0.0: 799 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 800 | 801 | isstream@0.1.2: 802 | resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} 803 | 804 | jackspeak@4.0.2: 805 | resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} 806 | engines: {node: 20 || >=22} 807 | 808 | js-yaml@3.14.1: 809 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 810 | hasBin: true 811 | 812 | jsonfile@4.0.0: 813 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 814 | 815 | locate-path@5.0.0: 816 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 817 | engines: {node: '>=8'} 818 | 819 | lodash.startcase@4.4.0: 820 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 821 | 822 | loupe@3.1.2: 823 | resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} 824 | 825 | lru-cache@11.0.2: 826 | resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} 827 | engines: {node: 20 || >=22} 828 | 829 | magic-string@0.30.14: 830 | resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} 831 | 832 | merge2@1.4.1: 833 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 834 | engines: {node: '>= 8'} 835 | 836 | micromatch@4.0.8: 837 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 838 | engines: {node: '>=8.6'} 839 | 840 | minimatch@10.0.1: 841 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 842 | engines: {node: 20 || >=22} 843 | 844 | minipass@7.1.2: 845 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 846 | engines: {node: '>=16 || 14 >=14.17'} 847 | 848 | mock-fs@5.4.1: 849 | resolution: {integrity: sha512-sz/Q8K1gXXXHR+qr0GZg2ysxCRr323kuN10O7CtQjraJsFDJ4SJ+0I5MzALz7aRp9lHk8Cc/YdsT95h9Ka1aFw==} 850 | engines: {node: '>=12.0.0'} 851 | 852 | mri@1.2.0: 853 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 854 | engines: {node: '>=4'} 855 | 856 | ms@2.1.3: 857 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 858 | 859 | mute-stream@2.0.0: 860 | resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} 861 | engines: {node: ^18.17.0 || >=20.5.0} 862 | 863 | nanoid@3.3.8: 864 | resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 865 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 866 | hasBin: true 867 | 868 | nice-try@1.0.5: 869 | resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 870 | 871 | open@8.4.2: 872 | resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} 873 | engines: {node: '>=12'} 874 | 875 | os-tmpdir@1.0.2: 876 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 877 | engines: {node: '>=0.10.0'} 878 | 879 | outdent@0.5.0: 880 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 881 | 882 | p-filter@2.1.0: 883 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 884 | engines: {node: '>=8'} 885 | 886 | p-limit@2.3.0: 887 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 888 | engines: {node: '>=6'} 889 | 890 | p-locate@4.1.0: 891 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 892 | engines: {node: '>=8'} 893 | 894 | p-map@2.1.0: 895 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 896 | engines: {node: '>=6'} 897 | 898 | p-try@2.2.0: 899 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 900 | engines: {node: '>=6'} 901 | 902 | package-json-from-dist@1.0.1: 903 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 904 | 905 | package-manager-detector@0.2.6: 906 | resolution: {integrity: sha512-9vPH3qooBlYRJdmdYP00nvjZOulm40r5dhtal8st18ctf+6S1k7pi5yIHLvI4w5D70x0Y+xdVD9qITH0QO/A8A==} 907 | 908 | path-exists@4.0.0: 909 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 910 | engines: {node: '>=8'} 911 | 912 | path-key@2.0.1: 913 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 914 | engines: {node: '>=4'} 915 | 916 | path-key@3.1.1: 917 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 918 | engines: {node: '>=8'} 919 | 920 | path-scurry@2.0.0: 921 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 922 | engines: {node: 20 || >=22} 923 | 924 | path-type@4.0.0: 925 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 926 | engines: {node: '>=8'} 927 | 928 | pathe@1.1.2: 929 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 930 | 931 | pathval@2.0.0: 932 | resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 933 | engines: {node: '>= 14.16'} 934 | 935 | picocolors@1.1.1: 936 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 937 | 938 | picomatch@2.3.1: 939 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 940 | engines: {node: '>=8.6'} 941 | 942 | pify@4.0.1: 943 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 944 | engines: {node: '>=6'} 945 | 946 | postcss@8.4.49: 947 | resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} 948 | engines: {node: ^10 || ^12 || >=14} 949 | 950 | prettier@2.8.8: 951 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 952 | engines: {node: '>=10.13.0'} 953 | hasBin: true 954 | 955 | queue-microtask@1.2.3: 956 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 957 | 958 | read-yaml-file@1.1.0: 959 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 960 | engines: {node: '>=6'} 961 | 962 | regenerator-runtime@0.14.1: 963 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 964 | 965 | resolve-from@5.0.0: 966 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 967 | engines: {node: '>=8'} 968 | 969 | reusify@1.0.4: 970 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 971 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 972 | 973 | rimraf@6.0.1: 974 | resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} 975 | engines: {node: 20 || >=22} 976 | hasBin: true 977 | 978 | rollup@4.27.4: 979 | resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} 980 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 981 | hasBin: true 982 | 983 | run-parallel@1.2.0: 984 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 985 | 986 | safer-buffer@2.1.2: 987 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 988 | 989 | semver@5.7.2: 990 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 991 | hasBin: true 992 | 993 | semver@7.6.3: 994 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 995 | engines: {node: '>=10'} 996 | hasBin: true 997 | 998 | shebang-command@1.2.0: 999 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1000 | engines: {node: '>=0.10.0'} 1001 | 1002 | shebang-command@2.0.0: 1003 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1004 | engines: {node: '>=8'} 1005 | 1006 | shebang-regex@1.0.0: 1007 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1008 | engines: {node: '>=0.10.0'} 1009 | 1010 | shebang-regex@3.0.0: 1011 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1012 | engines: {node: '>=8'} 1013 | 1014 | siginfo@2.0.0: 1015 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1016 | 1017 | signal-exit@4.1.0: 1018 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1019 | engines: {node: '>=14'} 1020 | 1021 | slash@3.0.0: 1022 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1023 | engines: {node: '>=8'} 1024 | 1025 | source-map-js@1.2.1: 1026 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1027 | engines: {node: '>=0.10.0'} 1028 | 1029 | spawndamnit@3.0.1: 1030 | resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} 1031 | 1032 | sprintf-js@1.0.3: 1033 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1034 | 1035 | stackback@0.0.2: 1036 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1037 | 1038 | std-env@3.8.0: 1039 | resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 1040 | 1041 | string-width@4.2.3: 1042 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1043 | engines: {node: '>=8'} 1044 | 1045 | string-width@5.1.2: 1046 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1047 | engines: {node: '>=12'} 1048 | 1049 | strip-ansi@6.0.1: 1050 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1051 | engines: {node: '>=8'} 1052 | 1053 | strip-ansi@7.1.0: 1054 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1055 | engines: {node: '>=12'} 1056 | 1057 | strip-bom@3.0.0: 1058 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1059 | engines: {node: '>=4'} 1060 | 1061 | supports-color@7.2.0: 1062 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1063 | engines: {node: '>=8'} 1064 | 1065 | term-size@2.2.1: 1066 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 1067 | engines: {node: '>=8'} 1068 | 1069 | tinybench@2.9.0: 1070 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1071 | 1072 | tinyexec@0.3.1: 1073 | resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} 1074 | 1075 | tinypool@1.0.2: 1076 | resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1077 | engines: {node: ^18.0.0 || >=20.0.0} 1078 | 1079 | tinyrainbow@1.2.0: 1080 | resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} 1081 | engines: {node: '>=14.0.0'} 1082 | 1083 | tinyspy@3.0.2: 1084 | resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1085 | engines: {node: '>=14.0.0'} 1086 | 1087 | tmp@0.0.33: 1088 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 1089 | engines: {node: '>=0.6.0'} 1090 | 1091 | to-regex-range@5.0.1: 1092 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1093 | engines: {node: '>=8.0'} 1094 | 1095 | type-fest@0.21.3: 1096 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 1097 | engines: {node: '>=10'} 1098 | 1099 | typescript@5.7.2: 1100 | resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} 1101 | engines: {node: '>=14.17'} 1102 | hasBin: true 1103 | 1104 | undici-types@5.26.5: 1105 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1106 | 1107 | undici@5.28.2: 1108 | resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} 1109 | engines: {node: '>=14.0'} 1110 | 1111 | universalify@0.1.2: 1112 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1113 | engines: {node: '>= 4.0.0'} 1114 | 1115 | vite-node@2.1.6: 1116 | resolution: {integrity: sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==} 1117 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1118 | hasBin: true 1119 | 1120 | vite@6.0.1: 1121 | resolution: {integrity: sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==} 1122 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1123 | hasBin: true 1124 | peerDependencies: 1125 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1126 | jiti: '>=1.21.0' 1127 | less: '*' 1128 | lightningcss: ^1.21.0 1129 | sass: '*' 1130 | sass-embedded: '*' 1131 | stylus: '*' 1132 | sugarss: '*' 1133 | terser: ^5.16.0 1134 | tsx: ^4.8.1 1135 | yaml: ^2.4.2 1136 | peerDependenciesMeta: 1137 | '@types/node': 1138 | optional: true 1139 | jiti: 1140 | optional: true 1141 | less: 1142 | optional: true 1143 | lightningcss: 1144 | optional: true 1145 | sass: 1146 | optional: true 1147 | sass-embedded: 1148 | optional: true 1149 | stylus: 1150 | optional: true 1151 | sugarss: 1152 | optional: true 1153 | terser: 1154 | optional: true 1155 | tsx: 1156 | optional: true 1157 | yaml: 1158 | optional: true 1159 | 1160 | vitest@2.1.6: 1161 | resolution: {integrity: sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ==} 1162 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1163 | hasBin: true 1164 | peerDependencies: 1165 | '@edge-runtime/vm': '*' 1166 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1167 | '@vitest/browser': 2.1.6 1168 | '@vitest/ui': 2.1.6 1169 | happy-dom: '*' 1170 | jsdom: '*' 1171 | peerDependenciesMeta: 1172 | '@edge-runtime/vm': 1173 | optional: true 1174 | '@types/node': 1175 | optional: true 1176 | '@vitest/browser': 1177 | optional: true 1178 | '@vitest/ui': 1179 | optional: true 1180 | happy-dom: 1181 | optional: true 1182 | jsdom: 1183 | optional: true 1184 | 1185 | which@1.3.1: 1186 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 1187 | hasBin: true 1188 | 1189 | which@2.0.2: 1190 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1191 | engines: {node: '>= 8'} 1192 | hasBin: true 1193 | 1194 | why-is-node-running@2.3.0: 1195 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 1196 | engines: {node: '>=8'} 1197 | hasBin: true 1198 | 1199 | wrap-ansi@6.2.0: 1200 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 1201 | engines: {node: '>=8'} 1202 | 1203 | wrap-ansi@7.0.0: 1204 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1205 | engines: {node: '>=10'} 1206 | 1207 | wrap-ansi@8.1.0: 1208 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1209 | engines: {node: '>=12'} 1210 | 1211 | yoctocolors-cjs@2.1.2: 1212 | resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} 1213 | engines: {node: '>=18'} 1214 | 1215 | snapshots: 1216 | 1217 | '@babel/runtime@7.26.0': 1218 | dependencies: 1219 | regenerator-runtime: 0.14.1 1220 | 1221 | '@biomejs/biome@1.9.4': 1222 | optionalDependencies: 1223 | '@biomejs/cli-darwin-arm64': 1.9.4 1224 | '@biomejs/cli-darwin-x64': 1.9.4 1225 | '@biomejs/cli-linux-arm64': 1.9.4 1226 | '@biomejs/cli-linux-arm64-musl': 1.9.4 1227 | '@biomejs/cli-linux-x64': 1.9.4 1228 | '@biomejs/cli-linux-x64-musl': 1.9.4 1229 | '@biomejs/cli-win32-arm64': 1.9.4 1230 | '@biomejs/cli-win32-x64': 1.9.4 1231 | 1232 | '@biomejs/cli-darwin-arm64@1.9.4': 1233 | optional: true 1234 | 1235 | '@biomejs/cli-darwin-x64@1.9.4': 1236 | optional: true 1237 | 1238 | '@biomejs/cli-linux-arm64-musl@1.9.4': 1239 | optional: true 1240 | 1241 | '@biomejs/cli-linux-arm64@1.9.4': 1242 | optional: true 1243 | 1244 | '@biomejs/cli-linux-x64-musl@1.9.4': 1245 | optional: true 1246 | 1247 | '@biomejs/cli-linux-x64@1.9.4': 1248 | optional: true 1249 | 1250 | '@biomejs/cli-win32-arm64@1.9.4': 1251 | optional: true 1252 | 1253 | '@biomejs/cli-win32-x64@1.9.4': 1254 | optional: true 1255 | 1256 | '@changesets/apply-release-plan@7.0.6': 1257 | dependencies: 1258 | '@changesets/config': 3.0.4 1259 | '@changesets/get-version-range-type': 0.4.0 1260 | '@changesets/git': 3.0.2 1261 | '@changesets/should-skip-package': 0.1.1 1262 | '@changesets/types': 6.0.0 1263 | '@manypkg/get-packages': 1.1.3 1264 | detect-indent: 6.1.0 1265 | fs-extra: 7.0.1 1266 | lodash.startcase: 4.4.0 1267 | outdent: 0.5.0 1268 | prettier: 2.8.8 1269 | resolve-from: 5.0.0 1270 | semver: 7.6.3 1271 | 1272 | '@changesets/assemble-release-plan@6.0.5': 1273 | dependencies: 1274 | '@changesets/errors': 0.2.0 1275 | '@changesets/get-dependents-graph': 2.1.2 1276 | '@changesets/should-skip-package': 0.1.1 1277 | '@changesets/types': 6.0.0 1278 | '@manypkg/get-packages': 1.1.3 1279 | semver: 7.6.3 1280 | 1281 | '@changesets/changelog-git@0.2.0': 1282 | dependencies: 1283 | '@changesets/types': 6.0.0 1284 | 1285 | '@changesets/cli@2.27.10': 1286 | dependencies: 1287 | '@changesets/apply-release-plan': 7.0.6 1288 | '@changesets/assemble-release-plan': 6.0.5 1289 | '@changesets/changelog-git': 0.2.0 1290 | '@changesets/config': 3.0.4 1291 | '@changesets/errors': 0.2.0 1292 | '@changesets/get-dependents-graph': 2.1.2 1293 | '@changesets/get-release-plan': 4.0.5 1294 | '@changesets/git': 3.0.2 1295 | '@changesets/logger': 0.1.1 1296 | '@changesets/pre': 2.0.1 1297 | '@changesets/read': 0.6.2 1298 | '@changesets/should-skip-package': 0.1.1 1299 | '@changesets/types': 6.0.0 1300 | '@changesets/write': 0.3.2 1301 | '@manypkg/get-packages': 1.1.3 1302 | ansi-colors: 4.1.3 1303 | ci-info: 3.9.0 1304 | enquirer: 2.4.1 1305 | external-editor: 3.1.0 1306 | fs-extra: 7.0.1 1307 | mri: 1.2.0 1308 | p-limit: 2.3.0 1309 | package-manager-detector: 0.2.6 1310 | picocolors: 1.1.1 1311 | resolve-from: 5.0.0 1312 | semver: 7.6.3 1313 | spawndamnit: 3.0.1 1314 | term-size: 2.2.1 1315 | 1316 | '@changesets/config@3.0.4': 1317 | dependencies: 1318 | '@changesets/errors': 0.2.0 1319 | '@changesets/get-dependents-graph': 2.1.2 1320 | '@changesets/logger': 0.1.1 1321 | '@changesets/types': 6.0.0 1322 | '@manypkg/get-packages': 1.1.3 1323 | fs-extra: 7.0.1 1324 | micromatch: 4.0.8 1325 | 1326 | '@changesets/errors@0.2.0': 1327 | dependencies: 1328 | extendable-error: 0.1.7 1329 | 1330 | '@changesets/get-dependents-graph@2.1.2': 1331 | dependencies: 1332 | '@changesets/types': 6.0.0 1333 | '@manypkg/get-packages': 1.1.3 1334 | picocolors: 1.1.1 1335 | semver: 7.6.3 1336 | 1337 | '@changesets/get-release-plan@4.0.5': 1338 | dependencies: 1339 | '@changesets/assemble-release-plan': 6.0.5 1340 | '@changesets/config': 3.0.4 1341 | '@changesets/pre': 2.0.1 1342 | '@changesets/read': 0.6.2 1343 | '@changesets/types': 6.0.0 1344 | '@manypkg/get-packages': 1.1.3 1345 | 1346 | '@changesets/get-version-range-type@0.4.0': {} 1347 | 1348 | '@changesets/git@3.0.2': 1349 | dependencies: 1350 | '@changesets/errors': 0.2.0 1351 | '@manypkg/get-packages': 1.1.3 1352 | is-subdir: 1.2.0 1353 | micromatch: 4.0.8 1354 | spawndamnit: 3.0.1 1355 | 1356 | '@changesets/logger@0.1.1': 1357 | dependencies: 1358 | picocolors: 1.1.1 1359 | 1360 | '@changesets/parse@0.4.0': 1361 | dependencies: 1362 | '@changesets/types': 6.0.0 1363 | js-yaml: 3.14.1 1364 | 1365 | '@changesets/pre@2.0.1': 1366 | dependencies: 1367 | '@changesets/errors': 0.2.0 1368 | '@changesets/types': 6.0.0 1369 | '@manypkg/get-packages': 1.1.3 1370 | fs-extra: 7.0.1 1371 | 1372 | '@changesets/read@0.6.2': 1373 | dependencies: 1374 | '@changesets/git': 3.0.2 1375 | '@changesets/logger': 0.1.1 1376 | '@changesets/parse': 0.4.0 1377 | '@changesets/types': 6.0.0 1378 | fs-extra: 7.0.1 1379 | p-filter: 2.1.0 1380 | picocolors: 1.1.1 1381 | 1382 | '@changesets/should-skip-package@0.1.1': 1383 | dependencies: 1384 | '@changesets/types': 6.0.0 1385 | '@manypkg/get-packages': 1.1.3 1386 | 1387 | '@changesets/types@4.1.0': {} 1388 | 1389 | '@changesets/types@6.0.0': {} 1390 | 1391 | '@changesets/write@0.3.2': 1392 | dependencies: 1393 | '@changesets/types': 6.0.0 1394 | fs-extra: 7.0.1 1395 | human-id: 1.0.2 1396 | prettier: 2.8.8 1397 | 1398 | '@esbuild/aix-ppc64@0.24.0': 1399 | optional: true 1400 | 1401 | '@esbuild/android-arm64@0.24.0': 1402 | optional: true 1403 | 1404 | '@esbuild/android-arm@0.24.0': 1405 | optional: true 1406 | 1407 | '@esbuild/android-x64@0.24.0': 1408 | optional: true 1409 | 1410 | '@esbuild/darwin-arm64@0.24.0': 1411 | optional: true 1412 | 1413 | '@esbuild/darwin-x64@0.24.0': 1414 | optional: true 1415 | 1416 | '@esbuild/freebsd-arm64@0.24.0': 1417 | optional: true 1418 | 1419 | '@esbuild/freebsd-x64@0.24.0': 1420 | optional: true 1421 | 1422 | '@esbuild/linux-arm64@0.24.0': 1423 | optional: true 1424 | 1425 | '@esbuild/linux-arm@0.24.0': 1426 | optional: true 1427 | 1428 | '@esbuild/linux-ia32@0.24.0': 1429 | optional: true 1430 | 1431 | '@esbuild/linux-loong64@0.24.0': 1432 | optional: true 1433 | 1434 | '@esbuild/linux-mips64el@0.24.0': 1435 | optional: true 1436 | 1437 | '@esbuild/linux-ppc64@0.24.0': 1438 | optional: true 1439 | 1440 | '@esbuild/linux-riscv64@0.24.0': 1441 | optional: true 1442 | 1443 | '@esbuild/linux-s390x@0.24.0': 1444 | optional: true 1445 | 1446 | '@esbuild/linux-x64@0.24.0': 1447 | optional: true 1448 | 1449 | '@esbuild/netbsd-x64@0.24.0': 1450 | optional: true 1451 | 1452 | '@esbuild/openbsd-arm64@0.24.0': 1453 | optional: true 1454 | 1455 | '@esbuild/openbsd-x64@0.24.0': 1456 | optional: true 1457 | 1458 | '@esbuild/sunos-x64@0.24.0': 1459 | optional: true 1460 | 1461 | '@esbuild/win32-arm64@0.24.0': 1462 | optional: true 1463 | 1464 | '@esbuild/win32-ia32@0.24.0': 1465 | optional: true 1466 | 1467 | '@esbuild/win32-x64@0.24.0': 1468 | optional: true 1469 | 1470 | '@fastify/busboy@2.1.1': {} 1471 | 1472 | '@inquirer/checkbox@4.0.3(@types/node@18.19.67)': 1473 | dependencies: 1474 | '@inquirer/core': 10.1.1(@types/node@18.19.67) 1475 | '@inquirer/figures': 1.0.8 1476 | '@inquirer/type': 3.0.1(@types/node@18.19.67) 1477 | '@types/node': 18.19.67 1478 | ansi-escapes: 4.3.2 1479 | yoctocolors-cjs: 2.1.2 1480 | 1481 | '@inquirer/core@10.1.0(@types/node@18.19.67)': 1482 | dependencies: 1483 | '@inquirer/figures': 1.0.8 1484 | '@inquirer/type': 3.0.1(@types/node@18.19.67) 1485 | ansi-escapes: 4.3.2 1486 | cli-width: 4.1.0 1487 | mute-stream: 2.0.0 1488 | signal-exit: 4.1.0 1489 | strip-ansi: 6.0.1 1490 | wrap-ansi: 6.2.0 1491 | yoctocolors-cjs: 2.1.2 1492 | transitivePeerDependencies: 1493 | - '@types/node' 1494 | 1495 | '@inquirer/core@10.1.1(@types/node@18.19.67)': 1496 | dependencies: 1497 | '@inquirer/figures': 1.0.8 1498 | '@inquirer/type': 3.0.1(@types/node@18.19.67) 1499 | ansi-escapes: 4.3.2 1500 | cli-width: 4.1.0 1501 | mute-stream: 2.0.0 1502 | signal-exit: 4.1.0 1503 | strip-ansi: 6.0.1 1504 | wrap-ansi: 6.2.0 1505 | yoctocolors-cjs: 2.1.2 1506 | transitivePeerDependencies: 1507 | - '@types/node' 1508 | 1509 | '@inquirer/figures@1.0.8': {} 1510 | 1511 | '@inquirer/select@4.0.2(@types/node@18.19.67)': 1512 | dependencies: 1513 | '@inquirer/core': 10.1.0(@types/node@18.19.67) 1514 | '@inquirer/figures': 1.0.8 1515 | '@inquirer/type': 3.0.1(@types/node@18.19.67) 1516 | '@types/node': 18.19.67 1517 | ansi-escapes: 4.3.2 1518 | yoctocolors-cjs: 2.1.2 1519 | 1520 | '@inquirer/type@3.0.1(@types/node@18.19.67)': 1521 | dependencies: 1522 | '@types/node': 18.19.67 1523 | 1524 | '@isaacs/cliui@8.0.2': 1525 | dependencies: 1526 | string-width: 5.1.2 1527 | string-width-cjs: string-width@4.2.3 1528 | strip-ansi: 7.1.0 1529 | strip-ansi-cjs: strip-ansi@6.0.1 1530 | wrap-ansi: 8.1.0 1531 | wrap-ansi-cjs: wrap-ansi@7.0.0 1532 | 1533 | '@jridgewell/sourcemap-codec@1.5.0': {} 1534 | 1535 | '@manypkg/find-root@1.1.0': 1536 | dependencies: 1537 | '@babel/runtime': 7.26.0 1538 | '@types/node': 12.20.55 1539 | find-up: 4.1.0 1540 | fs-extra: 8.1.0 1541 | 1542 | '@manypkg/get-packages@1.1.3': 1543 | dependencies: 1544 | '@babel/runtime': 7.26.0 1545 | '@changesets/types': 4.1.0 1546 | '@manypkg/find-root': 1.1.0 1547 | fs-extra: 8.1.0 1548 | globby: 11.1.0 1549 | read-yaml-file: 1.1.0 1550 | 1551 | '@nodelib/fs.scandir@2.1.5': 1552 | dependencies: 1553 | '@nodelib/fs.stat': 2.0.5 1554 | run-parallel: 1.2.0 1555 | 1556 | '@nodelib/fs.stat@2.0.5': {} 1557 | 1558 | '@nodelib/fs.walk@1.2.8': 1559 | dependencies: 1560 | '@nodelib/fs.scandir': 2.1.5 1561 | fastq: 1.17.1 1562 | 1563 | '@rollup/rollup-android-arm-eabi@4.27.4': 1564 | optional: true 1565 | 1566 | '@rollup/rollup-android-arm64@4.27.4': 1567 | optional: true 1568 | 1569 | '@rollup/rollup-darwin-arm64@4.27.4': 1570 | optional: true 1571 | 1572 | '@rollup/rollup-darwin-x64@4.27.4': 1573 | optional: true 1574 | 1575 | '@rollup/rollup-freebsd-arm64@4.27.4': 1576 | optional: true 1577 | 1578 | '@rollup/rollup-freebsd-x64@4.27.4': 1579 | optional: true 1580 | 1581 | '@rollup/rollup-linux-arm-gnueabihf@4.27.4': 1582 | optional: true 1583 | 1584 | '@rollup/rollup-linux-arm-musleabihf@4.27.4': 1585 | optional: true 1586 | 1587 | '@rollup/rollup-linux-arm64-gnu@4.27.4': 1588 | optional: true 1589 | 1590 | '@rollup/rollup-linux-arm64-musl@4.27.4': 1591 | optional: true 1592 | 1593 | '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': 1594 | optional: true 1595 | 1596 | '@rollup/rollup-linux-riscv64-gnu@4.27.4': 1597 | optional: true 1598 | 1599 | '@rollup/rollup-linux-s390x-gnu@4.27.4': 1600 | optional: true 1601 | 1602 | '@rollup/rollup-linux-x64-gnu@4.27.4': 1603 | optional: true 1604 | 1605 | '@rollup/rollup-linux-x64-musl@4.27.4': 1606 | optional: true 1607 | 1608 | '@rollup/rollup-win32-arm64-msvc@4.27.4': 1609 | optional: true 1610 | 1611 | '@rollup/rollup-win32-ia32-msvc@4.27.4': 1612 | optional: true 1613 | 1614 | '@rollup/rollup-win32-x64-msvc@4.27.4': 1615 | optional: true 1616 | 1617 | '@types/estree@1.0.6': {} 1618 | 1619 | '@types/ini@4.1.1': {} 1620 | 1621 | '@types/node@12.20.55': {} 1622 | 1623 | '@types/node@18.19.67': 1624 | dependencies: 1625 | undici-types: 5.26.5 1626 | 1627 | '@vitest/expect@2.1.6': 1628 | dependencies: 1629 | '@vitest/spy': 2.1.6 1630 | '@vitest/utils': 2.1.6 1631 | chai: 5.1.2 1632 | tinyrainbow: 1.2.0 1633 | 1634 | '@vitest/mocker@2.1.6(vite@6.0.1(@types/node@18.19.67))': 1635 | dependencies: 1636 | '@vitest/spy': 2.1.6 1637 | estree-walker: 3.0.3 1638 | magic-string: 0.30.14 1639 | optionalDependencies: 1640 | vite: 6.0.1(@types/node@18.19.67) 1641 | 1642 | '@vitest/pretty-format@2.1.6': 1643 | dependencies: 1644 | tinyrainbow: 1.2.0 1645 | 1646 | '@vitest/runner@2.1.6': 1647 | dependencies: 1648 | '@vitest/utils': 2.1.6 1649 | pathe: 1.1.2 1650 | 1651 | '@vitest/snapshot@2.1.6': 1652 | dependencies: 1653 | '@vitest/pretty-format': 2.1.6 1654 | magic-string: 0.30.14 1655 | pathe: 1.1.2 1656 | 1657 | '@vitest/spy@2.1.6': 1658 | dependencies: 1659 | tinyspy: 3.0.2 1660 | 1661 | '@vitest/utils@2.1.6': 1662 | dependencies: 1663 | '@vitest/pretty-format': 2.1.6 1664 | loupe: 3.1.2 1665 | tinyrainbow: 1.2.0 1666 | 1667 | ansi-colors@4.1.3: {} 1668 | 1669 | ansi-escapes@4.3.2: 1670 | dependencies: 1671 | type-fest: 0.21.3 1672 | 1673 | ansi-regex@5.0.1: {} 1674 | 1675 | ansi-regex@6.1.0: {} 1676 | 1677 | ansi-styles@4.3.0: 1678 | dependencies: 1679 | color-convert: 2.0.1 1680 | 1681 | ansi-styles@6.2.1: {} 1682 | 1683 | argparse@1.0.10: 1684 | dependencies: 1685 | sprintf-js: 1.0.3 1686 | 1687 | array-union@2.1.0: {} 1688 | 1689 | assertion-error@2.0.1: {} 1690 | 1691 | balanced-match@1.0.2: {} 1692 | 1693 | better-path-resolve@1.0.0: 1694 | dependencies: 1695 | is-windows: 1.0.2 1696 | 1697 | brace-expansion@2.0.1: 1698 | dependencies: 1699 | balanced-match: 1.0.2 1700 | 1701 | braces@3.0.3: 1702 | dependencies: 1703 | fill-range: 7.1.1 1704 | 1705 | cac@6.7.14: {} 1706 | 1707 | chai@5.1.2: 1708 | dependencies: 1709 | assertion-error: 2.0.1 1710 | check-error: 2.1.1 1711 | deep-eql: 5.0.2 1712 | loupe: 3.1.2 1713 | pathval: 2.0.0 1714 | 1715 | chalk@4.1.2: 1716 | dependencies: 1717 | ansi-styles: 4.3.0 1718 | supports-color: 7.2.0 1719 | 1720 | chardet@0.7.0: {} 1721 | 1722 | check-error@2.1.1: {} 1723 | 1724 | ci-info@3.9.0: {} 1725 | 1726 | cli-width@4.1.0: {} 1727 | 1728 | coffee@5.5.1: 1729 | dependencies: 1730 | cross-spawn: 6.0.6 1731 | debug: 4.3.7 1732 | is-type-of: 1.4.0 1733 | transitivePeerDependencies: 1734 | - supports-color 1735 | 1736 | color-convert@2.0.1: 1737 | dependencies: 1738 | color-name: 1.1.4 1739 | 1740 | color-name@1.1.4: {} 1741 | 1742 | commander@8.3.0: {} 1743 | 1744 | core-util-is@1.0.3: {} 1745 | 1746 | cross-spawn@6.0.6: 1747 | dependencies: 1748 | nice-try: 1.0.5 1749 | path-key: 2.0.1 1750 | semver: 5.7.2 1751 | shebang-command: 1.2.0 1752 | which: 1.3.1 1753 | 1754 | cross-spawn@7.0.6: 1755 | dependencies: 1756 | path-key: 3.1.1 1757 | shebang-command: 2.0.0 1758 | which: 2.0.2 1759 | 1760 | debug@4.3.7: 1761 | dependencies: 1762 | ms: 2.1.3 1763 | 1764 | deep-eql@5.0.2: {} 1765 | 1766 | define-lazy-prop@2.0.0: {} 1767 | 1768 | detect-indent@6.1.0: {} 1769 | 1770 | dir-glob@3.0.1: 1771 | dependencies: 1772 | path-type: 4.0.0 1773 | 1774 | eastasianwidth@0.2.0: {} 1775 | 1776 | emoji-regex@8.0.0: {} 1777 | 1778 | emoji-regex@9.2.2: {} 1779 | 1780 | enquirer@2.4.1: 1781 | dependencies: 1782 | ansi-colors: 4.1.3 1783 | strip-ansi: 6.0.1 1784 | 1785 | es-module-lexer@1.5.4: {} 1786 | 1787 | esbuild@0.24.0: 1788 | optionalDependencies: 1789 | '@esbuild/aix-ppc64': 0.24.0 1790 | '@esbuild/android-arm': 0.24.0 1791 | '@esbuild/android-arm64': 0.24.0 1792 | '@esbuild/android-x64': 0.24.0 1793 | '@esbuild/darwin-arm64': 0.24.0 1794 | '@esbuild/darwin-x64': 0.24.0 1795 | '@esbuild/freebsd-arm64': 0.24.0 1796 | '@esbuild/freebsd-x64': 0.24.0 1797 | '@esbuild/linux-arm': 0.24.0 1798 | '@esbuild/linux-arm64': 0.24.0 1799 | '@esbuild/linux-ia32': 0.24.0 1800 | '@esbuild/linux-loong64': 0.24.0 1801 | '@esbuild/linux-mips64el': 0.24.0 1802 | '@esbuild/linux-ppc64': 0.24.0 1803 | '@esbuild/linux-riscv64': 0.24.0 1804 | '@esbuild/linux-s390x': 0.24.0 1805 | '@esbuild/linux-x64': 0.24.0 1806 | '@esbuild/netbsd-x64': 0.24.0 1807 | '@esbuild/openbsd-arm64': 0.24.0 1808 | '@esbuild/openbsd-x64': 0.24.0 1809 | '@esbuild/sunos-x64': 0.24.0 1810 | '@esbuild/win32-arm64': 0.24.0 1811 | '@esbuild/win32-ia32': 0.24.0 1812 | '@esbuild/win32-x64': 0.24.0 1813 | 1814 | esprima@4.0.1: {} 1815 | 1816 | estree-walker@3.0.3: 1817 | dependencies: 1818 | '@types/estree': 1.0.6 1819 | 1820 | expect-type@1.1.0: {} 1821 | 1822 | extendable-error@0.1.7: {} 1823 | 1824 | external-editor@3.1.0: 1825 | dependencies: 1826 | chardet: 0.7.0 1827 | iconv-lite: 0.4.24 1828 | tmp: 0.0.33 1829 | 1830 | fast-glob@3.3.2: 1831 | dependencies: 1832 | '@nodelib/fs.stat': 2.0.5 1833 | '@nodelib/fs.walk': 1.2.8 1834 | glob-parent: 5.1.2 1835 | merge2: 1.4.1 1836 | micromatch: 4.0.8 1837 | 1838 | fastq@1.17.1: 1839 | dependencies: 1840 | reusify: 1.0.4 1841 | 1842 | fill-range@7.1.1: 1843 | dependencies: 1844 | to-regex-range: 5.0.1 1845 | 1846 | find-up@4.1.0: 1847 | dependencies: 1848 | locate-path: 5.0.0 1849 | path-exists: 4.0.0 1850 | 1851 | foreground-child@3.3.0: 1852 | dependencies: 1853 | cross-spawn: 7.0.6 1854 | signal-exit: 4.1.0 1855 | 1856 | fs-extra@7.0.1: 1857 | dependencies: 1858 | graceful-fs: 4.2.11 1859 | jsonfile: 4.0.0 1860 | universalify: 0.1.2 1861 | 1862 | fs-extra@8.1.0: 1863 | dependencies: 1864 | graceful-fs: 4.2.11 1865 | jsonfile: 4.0.0 1866 | universalify: 0.1.2 1867 | 1868 | fsevents@2.3.3: 1869 | optional: true 1870 | 1871 | glob-parent@5.1.2: 1872 | dependencies: 1873 | is-glob: 4.0.3 1874 | 1875 | glob@11.0.0: 1876 | dependencies: 1877 | foreground-child: 3.3.0 1878 | jackspeak: 4.0.2 1879 | minimatch: 10.0.1 1880 | minipass: 7.1.2 1881 | package-json-from-dist: 1.0.1 1882 | path-scurry: 2.0.0 1883 | 1884 | globby@11.1.0: 1885 | dependencies: 1886 | array-union: 2.1.0 1887 | dir-glob: 3.0.1 1888 | fast-glob: 3.3.2 1889 | ignore: 5.3.2 1890 | merge2: 1.4.1 1891 | slash: 3.0.0 1892 | 1893 | graceful-fs@4.2.11: {} 1894 | 1895 | has-flag@4.0.0: {} 1896 | 1897 | human-id@1.0.2: {} 1898 | 1899 | iconv-lite@0.4.24: 1900 | dependencies: 1901 | safer-buffer: 2.1.2 1902 | 1903 | ignore@5.3.2: {} 1904 | 1905 | ini@4.1.3: {} 1906 | 1907 | is-class-hotfix@0.0.6: {} 1908 | 1909 | is-docker@2.2.1: {} 1910 | 1911 | is-extglob@2.1.1: {} 1912 | 1913 | is-fullwidth-code-point@3.0.0: {} 1914 | 1915 | is-glob@4.0.3: 1916 | dependencies: 1917 | is-extglob: 2.1.1 1918 | 1919 | is-number@7.0.0: {} 1920 | 1921 | is-subdir@1.2.0: 1922 | dependencies: 1923 | better-path-resolve: 1.0.0 1924 | 1925 | is-type-of@1.4.0: 1926 | dependencies: 1927 | core-util-is: 1.0.3 1928 | is-class-hotfix: 0.0.6 1929 | isstream: 0.1.2 1930 | 1931 | is-windows@1.0.2: {} 1932 | 1933 | is-wsl@2.2.0: 1934 | dependencies: 1935 | is-docker: 2.2.1 1936 | 1937 | isexe@2.0.0: {} 1938 | 1939 | isstream@0.1.2: {} 1940 | 1941 | jackspeak@4.0.2: 1942 | dependencies: 1943 | '@isaacs/cliui': 8.0.2 1944 | 1945 | js-yaml@3.14.1: 1946 | dependencies: 1947 | argparse: 1.0.10 1948 | esprima: 4.0.1 1949 | 1950 | jsonfile@4.0.0: 1951 | optionalDependencies: 1952 | graceful-fs: 4.2.11 1953 | 1954 | locate-path@5.0.0: 1955 | dependencies: 1956 | p-locate: 4.1.0 1957 | 1958 | lodash.startcase@4.4.0: {} 1959 | 1960 | loupe@3.1.2: {} 1961 | 1962 | lru-cache@11.0.2: {} 1963 | 1964 | magic-string@0.30.14: 1965 | dependencies: 1966 | '@jridgewell/sourcemap-codec': 1.5.0 1967 | 1968 | merge2@1.4.1: {} 1969 | 1970 | micromatch@4.0.8: 1971 | dependencies: 1972 | braces: 3.0.3 1973 | picomatch: 2.3.1 1974 | 1975 | minimatch@10.0.1: 1976 | dependencies: 1977 | brace-expansion: 2.0.1 1978 | 1979 | minipass@7.1.2: {} 1980 | 1981 | mock-fs@5.4.1: {} 1982 | 1983 | mri@1.2.0: {} 1984 | 1985 | ms@2.1.3: {} 1986 | 1987 | mute-stream@2.0.0: {} 1988 | 1989 | nanoid@3.3.8: {} 1990 | 1991 | nice-try@1.0.5: {} 1992 | 1993 | open@8.4.2: 1994 | dependencies: 1995 | define-lazy-prop: 2.0.0 1996 | is-docker: 2.2.1 1997 | is-wsl: 2.2.0 1998 | 1999 | os-tmpdir@1.0.2: {} 2000 | 2001 | outdent@0.5.0: {} 2002 | 2003 | p-filter@2.1.0: 2004 | dependencies: 2005 | p-map: 2.1.0 2006 | 2007 | p-limit@2.3.0: 2008 | dependencies: 2009 | p-try: 2.2.0 2010 | 2011 | p-locate@4.1.0: 2012 | dependencies: 2013 | p-limit: 2.3.0 2014 | 2015 | p-map@2.1.0: {} 2016 | 2017 | p-try@2.2.0: {} 2018 | 2019 | package-json-from-dist@1.0.1: {} 2020 | 2021 | package-manager-detector@0.2.6: {} 2022 | 2023 | path-exists@4.0.0: {} 2024 | 2025 | path-key@2.0.1: {} 2026 | 2027 | path-key@3.1.1: {} 2028 | 2029 | path-scurry@2.0.0: 2030 | dependencies: 2031 | lru-cache: 11.0.2 2032 | minipass: 7.1.2 2033 | 2034 | path-type@4.0.0: {} 2035 | 2036 | pathe@1.1.2: {} 2037 | 2038 | pathval@2.0.0: {} 2039 | 2040 | picocolors@1.1.1: {} 2041 | 2042 | picomatch@2.3.1: {} 2043 | 2044 | pify@4.0.1: {} 2045 | 2046 | postcss@8.4.49: 2047 | dependencies: 2048 | nanoid: 3.3.8 2049 | picocolors: 1.1.1 2050 | source-map-js: 1.2.1 2051 | 2052 | prettier@2.8.8: {} 2053 | 2054 | queue-microtask@1.2.3: {} 2055 | 2056 | read-yaml-file@1.1.0: 2057 | dependencies: 2058 | graceful-fs: 4.2.11 2059 | js-yaml: 3.14.1 2060 | pify: 4.0.1 2061 | strip-bom: 3.0.0 2062 | 2063 | regenerator-runtime@0.14.1: {} 2064 | 2065 | resolve-from@5.0.0: {} 2066 | 2067 | reusify@1.0.4: {} 2068 | 2069 | rimraf@6.0.1: 2070 | dependencies: 2071 | glob: 11.0.0 2072 | package-json-from-dist: 1.0.1 2073 | 2074 | rollup@4.27.4: 2075 | dependencies: 2076 | '@types/estree': 1.0.6 2077 | optionalDependencies: 2078 | '@rollup/rollup-android-arm-eabi': 4.27.4 2079 | '@rollup/rollup-android-arm64': 4.27.4 2080 | '@rollup/rollup-darwin-arm64': 4.27.4 2081 | '@rollup/rollup-darwin-x64': 4.27.4 2082 | '@rollup/rollup-freebsd-arm64': 4.27.4 2083 | '@rollup/rollup-freebsd-x64': 4.27.4 2084 | '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 2085 | '@rollup/rollup-linux-arm-musleabihf': 4.27.4 2086 | '@rollup/rollup-linux-arm64-gnu': 4.27.4 2087 | '@rollup/rollup-linux-arm64-musl': 4.27.4 2088 | '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 2089 | '@rollup/rollup-linux-riscv64-gnu': 4.27.4 2090 | '@rollup/rollup-linux-s390x-gnu': 4.27.4 2091 | '@rollup/rollup-linux-x64-gnu': 4.27.4 2092 | '@rollup/rollup-linux-x64-musl': 4.27.4 2093 | '@rollup/rollup-win32-arm64-msvc': 4.27.4 2094 | '@rollup/rollup-win32-ia32-msvc': 4.27.4 2095 | '@rollup/rollup-win32-x64-msvc': 4.27.4 2096 | fsevents: 2.3.3 2097 | 2098 | run-parallel@1.2.0: 2099 | dependencies: 2100 | queue-microtask: 1.2.3 2101 | 2102 | safer-buffer@2.1.2: {} 2103 | 2104 | semver@5.7.2: {} 2105 | 2106 | semver@7.6.3: {} 2107 | 2108 | shebang-command@1.2.0: 2109 | dependencies: 2110 | shebang-regex: 1.0.0 2111 | 2112 | shebang-command@2.0.0: 2113 | dependencies: 2114 | shebang-regex: 3.0.0 2115 | 2116 | shebang-regex@1.0.0: {} 2117 | 2118 | shebang-regex@3.0.0: {} 2119 | 2120 | siginfo@2.0.0: {} 2121 | 2122 | signal-exit@4.1.0: {} 2123 | 2124 | slash@3.0.0: {} 2125 | 2126 | source-map-js@1.2.1: {} 2127 | 2128 | spawndamnit@3.0.1: 2129 | dependencies: 2130 | cross-spawn: 7.0.6 2131 | signal-exit: 4.1.0 2132 | 2133 | sprintf-js@1.0.3: {} 2134 | 2135 | stackback@0.0.2: {} 2136 | 2137 | std-env@3.8.0: {} 2138 | 2139 | string-width@4.2.3: 2140 | dependencies: 2141 | emoji-regex: 8.0.0 2142 | is-fullwidth-code-point: 3.0.0 2143 | strip-ansi: 6.0.1 2144 | 2145 | string-width@5.1.2: 2146 | dependencies: 2147 | eastasianwidth: 0.2.0 2148 | emoji-regex: 9.2.2 2149 | strip-ansi: 7.1.0 2150 | 2151 | strip-ansi@6.0.1: 2152 | dependencies: 2153 | ansi-regex: 5.0.1 2154 | 2155 | strip-ansi@7.1.0: 2156 | dependencies: 2157 | ansi-regex: 6.1.0 2158 | 2159 | strip-bom@3.0.0: {} 2160 | 2161 | supports-color@7.2.0: 2162 | dependencies: 2163 | has-flag: 4.0.0 2164 | 2165 | term-size@2.2.1: {} 2166 | 2167 | tinybench@2.9.0: {} 2168 | 2169 | tinyexec@0.3.1: {} 2170 | 2171 | tinypool@1.0.2: {} 2172 | 2173 | tinyrainbow@1.2.0: {} 2174 | 2175 | tinyspy@3.0.2: {} 2176 | 2177 | tmp@0.0.33: 2178 | dependencies: 2179 | os-tmpdir: 1.0.2 2180 | 2181 | to-regex-range@5.0.1: 2182 | dependencies: 2183 | is-number: 7.0.0 2184 | 2185 | type-fest@0.21.3: {} 2186 | 2187 | typescript@5.7.2: {} 2188 | 2189 | undici-types@5.26.5: {} 2190 | 2191 | undici@5.28.2: 2192 | dependencies: 2193 | '@fastify/busboy': 2.1.1 2194 | 2195 | universalify@0.1.2: {} 2196 | 2197 | vite-node@2.1.6(@types/node@18.19.67): 2198 | dependencies: 2199 | cac: 6.7.14 2200 | debug: 4.3.7 2201 | es-module-lexer: 1.5.4 2202 | pathe: 1.1.2 2203 | vite: 6.0.1(@types/node@18.19.67) 2204 | transitivePeerDependencies: 2205 | - '@types/node' 2206 | - jiti 2207 | - less 2208 | - lightningcss 2209 | - sass 2210 | - sass-embedded 2211 | - stylus 2212 | - sugarss 2213 | - supports-color 2214 | - terser 2215 | - tsx 2216 | - yaml 2217 | 2218 | vite@6.0.1(@types/node@18.19.67): 2219 | dependencies: 2220 | esbuild: 0.24.0 2221 | postcss: 8.4.49 2222 | rollup: 4.27.4 2223 | optionalDependencies: 2224 | '@types/node': 18.19.67 2225 | fsevents: 2.3.3 2226 | 2227 | vitest@2.1.6(@types/node@18.19.67): 2228 | dependencies: 2229 | '@vitest/expect': 2.1.6 2230 | '@vitest/mocker': 2.1.6(vite@6.0.1(@types/node@18.19.67)) 2231 | '@vitest/pretty-format': 2.1.6 2232 | '@vitest/runner': 2.1.6 2233 | '@vitest/snapshot': 2.1.6 2234 | '@vitest/spy': 2.1.6 2235 | '@vitest/utils': 2.1.6 2236 | chai: 5.1.2 2237 | debug: 4.3.7 2238 | expect-type: 1.1.0 2239 | magic-string: 0.30.14 2240 | pathe: 1.1.2 2241 | std-env: 3.8.0 2242 | tinybench: 2.9.0 2243 | tinyexec: 0.3.1 2244 | tinypool: 1.0.2 2245 | tinyrainbow: 1.2.0 2246 | vite: 6.0.1(@types/node@18.19.67) 2247 | vite-node: 2.1.6(@types/node@18.19.67) 2248 | why-is-node-running: 2.3.0 2249 | optionalDependencies: 2250 | '@types/node': 18.19.67 2251 | transitivePeerDependencies: 2252 | - jiti 2253 | - less 2254 | - lightningcss 2255 | - msw 2256 | - sass 2257 | - sass-embedded 2258 | - stylus 2259 | - sugarss 2260 | - supports-color 2261 | - terser 2262 | - tsx 2263 | - yaml 2264 | 2265 | which@1.3.1: 2266 | dependencies: 2267 | isexe: 2.0.0 2268 | 2269 | which@2.0.2: 2270 | dependencies: 2271 | isexe: 2.0.0 2272 | 2273 | why-is-node-running@2.3.0: 2274 | dependencies: 2275 | siginfo: 2.0.0 2276 | stackback: 0.0.2 2277 | 2278 | wrap-ansi@6.2.0: 2279 | dependencies: 2280 | ansi-styles: 4.3.0 2281 | string-width: 4.2.3 2282 | strip-ansi: 6.0.1 2283 | 2284 | wrap-ansi@7.0.0: 2285 | dependencies: 2286 | ansi-styles: 4.3.0 2287 | string-width: 4.2.3 2288 | strip-ansi: 6.0.1 2289 | 2290 | wrap-ansi@8.1.0: 2291 | dependencies: 2292 | ansi-styles: 6.2.1 2293 | string-width: 5.1.2 2294 | strip-ansi: 7.1.0 2295 | 2296 | yoctocolors-cjs@2.1.2: {} 2297 | -------------------------------------------------------------------------------- /src/actions.ts: -------------------------------------------------------------------------------- 1 | import checkbox from '@inquirer/checkbox'; 2 | import select from '@inquirer/select'; 3 | import chalk from 'chalk'; 4 | import open from 'open'; 5 | import { fetch } from 'undici'; 6 | import { 7 | ALWAYS_AUTH, 8 | AUTH, 9 | EMAIL, 10 | HOME, 11 | NPMRC, 12 | NRMRC, 13 | REGISTRY, 14 | REPOSITORY, 15 | } from './constants'; 16 | import { 17 | exit, 18 | geneDashLine, 19 | getCurrentRegistry, 20 | getRegistries, 21 | isInternalRegistry, 22 | isLowerCaseEqual, 23 | isRegistryNotFound, 24 | printMessages, 25 | printSuccess, 26 | readFile, 27 | writeFile, 28 | } from './helpers'; 29 | 30 | export async function onList() { 31 | const currentRegistry = await getCurrentRegistry(); 32 | const registries = await getRegistries(); 33 | 34 | const keys = Object.keys(registries); 35 | const length = Math.max(...keys.map((key) => key.length)) + 3; 36 | 37 | const messages = keys.map((key) => { 38 | const registry = registries[key]; 39 | const prefix = isLowerCaseEqual(registry[REGISTRY], currentRegistry) 40 | ? chalk.green.bold('* ') 41 | : ' '; 42 | return prefix + key + geneDashLine(key, length) + registry[REGISTRY]; 43 | }); 44 | 45 | printMessages(messages); 46 | } 47 | 48 | export async function onCurrent({ showUrl }: { showUrl: boolean }) { 49 | const currentRegistry = await getCurrentRegistry(); 50 | const registries = await getRegistries(); 51 | 52 | const matchedRegistry = Object.entries(registries).find(([_name, registry]) => 53 | isLowerCaseEqual(registry[REGISTRY], currentRegistry), 54 | ); 55 | 56 | // not find equal registry 57 | if (!matchedRegistry) { 58 | printMessages([ 59 | `Your current registry(${currentRegistry}) is not included in the nrm registries.`, 60 | `Use the ${chalk.green( 61 | 'nrm add [home]', 62 | )} command to add your registry.`, 63 | ]); 64 | return; 65 | } 66 | 67 | const [name, registry] = matchedRegistry; 68 | printMessages([ 69 | `You are using ${chalk.green( 70 | showUrl ? registry[REGISTRY] : name, 71 | )} registry.`, 72 | ]); 73 | } 74 | 75 | export async function onUse(name: string) { 76 | const registries = await getRegistries(); 77 | let alias = name; 78 | 79 | // if alias is undefined, select the registry alias from list 80 | if (alias === undefined) { 81 | alias = await select({ 82 | message: 'Please select the registry you want to use', 83 | choices: Object.keys(registries), 84 | pageSize: 10, 85 | }); 86 | } 87 | 88 | if (await isRegistryNotFound(alias)) { 89 | return; 90 | } 91 | 92 | const registry = registries[alias]; 93 | const npmrc = await readFile(NPMRC); 94 | await writeFile(NPMRC, Object.assign(npmrc, registry)); 95 | 96 | printSuccess(`The registry has been changed to '${alias}'.`); 97 | } 98 | 99 | export async function onDelete(name: string | undefined) { 100 | const customRegistries = await readFile(NRMRC); 101 | 102 | const deleteKeys: string[] = []; 103 | if (name) { 104 | deleteKeys.push(name); 105 | } 106 | 107 | const choices = Object.keys(customRegistries); 108 | if (name === undefined && !choices.length) { 109 | printMessages(['No any custom registries can be deleted.']); 110 | return; 111 | } 112 | 113 | if (name === undefined) { 114 | const selectedKeys = await checkbox({ 115 | message: 'Please select the registries you want to delete', 116 | choices, 117 | }); 118 | deleteKeys.push(...selectedKeys); 119 | } 120 | 121 | for (const key of deleteKeys) { 122 | if ( 123 | (await isRegistryNotFound(key)) || 124 | (await isInternalRegistry(key, 'delete')) 125 | ) { 126 | continue; 127 | } 128 | 129 | const registry = customRegistries[key]; 130 | delete customRegistries[key]; 131 | await writeFile(NRMRC, customRegistries); 132 | printSuccess(`The registry '${key}' has been deleted successfully.`); 133 | 134 | const currentRegistry = await getCurrentRegistry(); 135 | if (currentRegistry === registry[REGISTRY]) { 136 | await onUse('npm'); 137 | } 138 | } 139 | } 140 | 141 | export async function onAdd(name: string, url: string, home?: string) { 142 | const registries = await getRegistries(); 143 | const registryNames = Object.keys(registries); 144 | const registryUrls = registryNames.map((name) => registries[name][REGISTRY]); 145 | if ( 146 | registryNames.includes(name) || 147 | registryUrls.some((eachUrl) => isLowerCaseEqual(eachUrl, url)) 148 | ) { 149 | return exit( 150 | 'The registry name or url is already included in the nrm registries. Please make sure that the name and url are unique.', 151 | ); 152 | } 153 | 154 | const newRegistry: Record = {}; 155 | newRegistry[REGISTRY] = /\/$/.test(url) ? url : `${url}/`; 156 | if (home) { 157 | newRegistry[HOME] = home; 158 | } 159 | const customRegistries = await readFile(NRMRC); 160 | const newCustomRegistries = Object.assign(customRegistries, { 161 | [name]: newRegistry, 162 | }); 163 | await writeFile(NRMRC, newCustomRegistries); 164 | printSuccess( 165 | `Add registry ${name} success, run ${chalk.green( 166 | `nrm use ${name}`, 167 | )} command to use ${name} registry.`, 168 | ); 169 | } 170 | 171 | export async function onLogin( 172 | name: string, 173 | base64: string, 174 | { 175 | alwaysAuth, 176 | username, 177 | password, 178 | email, 179 | }: { alwaysAuth: boolean; username: string; password: string; email: string }, 180 | ) { 181 | if ( 182 | (await isRegistryNotFound(name)) || 183 | (await isInternalRegistry(name, 'set authorization information of')) 184 | ) { 185 | return; 186 | } 187 | 188 | const customRegistries = await readFile(NRMRC); 189 | const registry = customRegistries[name]; 190 | if (base64) { 191 | registry[AUTH] = base64; 192 | } else if (username && password) { 193 | registry[AUTH] = Buffer.from(`${username}:${password}`).toString('base64'); 194 | } else { 195 | return exit( 196 | 'Authorization information in base64 format or username & password is required', 197 | ); 198 | } 199 | 200 | if (alwaysAuth) { 201 | registry[ALWAYS_AUTH] = true; 202 | } 203 | 204 | if (email) { 205 | registry[EMAIL] = email; 206 | } 207 | 208 | Object.assign(customRegistries, { [name]: registry }); 209 | await writeFile(NRMRC, customRegistries); 210 | printSuccess( 211 | `Set the authorization information of the registry '${name}' success.`, 212 | ); 213 | 214 | const currentRegistry = await getCurrentRegistry(); 215 | if (currentRegistry === registry[REGISTRY]) { 216 | const npmrc = await readFile(NPMRC); 217 | await writeFile( 218 | NPMRC, 219 | Object.assign(npmrc, { 220 | [AUTH]: registry[AUTH], 221 | [ALWAYS_AUTH]: registry[ALWAYS_AUTH], 222 | [EMAIL]: registry[EMAIL], 223 | }), 224 | ); 225 | } 226 | } 227 | 228 | export async function onSetRepository(name: string, repo: string) { 229 | if ( 230 | (await isRegistryNotFound(name)) || 231 | (await isInternalRegistry(name, 'set repository of')) 232 | ) { 233 | return; 234 | } 235 | 236 | const customRegistries = await readFile(NRMRC); 237 | const registry = customRegistries[name]; 238 | registry[REPOSITORY] = repo; 239 | await writeFile(NRMRC, customRegistries); 240 | printSuccess(`Set the ${REPOSITORY} of registry '${name}' successfully.`); 241 | 242 | const currentRegistry = await getCurrentRegistry(); 243 | if (currentRegistry && registry[REGISTRY] === currentRegistry) { 244 | const npmrc = await readFile(NPMRC); 245 | Object.assign(npmrc, { [REPOSITORY]: repo }); 246 | await writeFile(NPMRC, npmrc); 247 | printSuccess('Set repository attribute of npmrc successfully'); 248 | } 249 | } 250 | 251 | export async function onSetScope(scopeName: string, url: string) { 252 | const scopeRegistryKey = `${scopeName}:${REGISTRY}`; 253 | const npmrc = await readFile(NPMRC); 254 | Object.assign(npmrc, { [scopeRegistryKey]: url }); 255 | await writeFile(NPMRC, npmrc); 256 | printSuccess(`Set scope '${scopeRegistryKey}=${url}' success.`); 257 | } 258 | 259 | export async function onDeleteScope(scopeName: string) { 260 | const scopeRegistryKey = `${scopeName}:${REGISTRY}`; 261 | const npmrc = await readFile(NPMRC); 262 | if (npmrc[scopeRegistryKey]) { 263 | delete npmrc[scopeRegistryKey]; 264 | await writeFile(NPMRC, npmrc); 265 | printSuccess(`Delete scope '${scopeRegistryKey}' success.`); 266 | } 267 | } 268 | 269 | export async function onSetAttribute( 270 | name: string, 271 | { attr, value }: { attr: string; value: string }, 272 | ) { 273 | if ( 274 | (await isRegistryNotFound(name)) || 275 | (await isInternalRegistry(name, 'set attribute of')) 276 | ) { 277 | return; 278 | } 279 | 280 | if (REPOSITORY === attr) { 281 | return exit( 282 | `Use the ${chalk.green( 283 | 'nrm set-hosted-repo ', 284 | )} command to set repository.`, 285 | ); 286 | } 287 | const customRegistries = await readFile(NRMRC); 288 | const registry = customRegistries[name]; 289 | Object.assign(registry, { [attr]: value }); 290 | await writeFile(NRMRC, customRegistries); 291 | printSuccess( 292 | `Set attribute '${attr}=${value}' of the registry '${name}' successfully.`, 293 | ); 294 | 295 | const currentRegistry = await getCurrentRegistry(); 296 | if (currentRegistry === registry[REGISTRY]) { 297 | const npmrc = await readFile(NPMRC); 298 | await writeFile(NPMRC, Object.assign(npmrc, { [attr]: value })); 299 | } 300 | } 301 | 302 | export async function onRename(name: string, newName: string) { 303 | if ( 304 | (await isRegistryNotFound(name)) || 305 | (await isInternalRegistry(name, 'rename')) 306 | ) { 307 | return; 308 | } 309 | 310 | if (name === newName) { 311 | return exit('The names cannot be the same.'); 312 | } 313 | 314 | if (!(await isRegistryNotFound(newName, false))) { 315 | return exit(`The new registry name '${newName}' is already exist.`); 316 | } 317 | const customRegistries = await readFile(NRMRC); 318 | customRegistries[newName] = JSON.parse( 319 | JSON.stringify(customRegistries[name]), 320 | ); 321 | delete customRegistries[name]; 322 | await writeFile(NRMRC, customRegistries); 323 | printSuccess(`The registry '${name}' has been renamed to '${newName}'.`); 324 | } 325 | 326 | export async function onHome(name: string, browser?: string) { 327 | if (await isRegistryNotFound(name)) { 328 | return; 329 | } 330 | 331 | const registries = await getRegistries(); 332 | if (!registries[name][HOME]) { 333 | return exit(`The homepage of registry '${name}' is not found.`); 334 | } 335 | open( 336 | registries[name][HOME], 337 | browser ? { app: { name: browser } } : undefined, 338 | ); 339 | } 340 | 341 | export async function onTest(target?: string) { 342 | const registries = await getRegistries(); 343 | const timeout = 5000; 344 | 345 | if (target && (await isRegistryNotFound(target))) { 346 | exit(); 347 | } 348 | 349 | const sources = target ? { [target]: registries[target] } : registries; 350 | 351 | const results = await Promise.all( 352 | Object.keys(sources).map(async (name) => { 353 | const { registry } = sources[name]; 354 | const start = Date.now(); 355 | let status = false; 356 | let isTimeout = false; 357 | try { 358 | const response = await fetch(`${registry}nrm`, { 359 | signal: AbortSignal.timeout(timeout), 360 | }); 361 | status = response.ok; 362 | } catch (error: any) { 363 | isTimeout = error.name === 'TimeoutError'; 364 | } 365 | return { 366 | name, 367 | registry, 368 | success: status, 369 | time: Date.now() - start, 370 | isTimeout, 371 | }; 372 | }), 373 | ); 374 | 375 | const [fastest] = results 376 | .filter((each) => each.success) 377 | .map((each) => each.time) 378 | .sort((a, b) => a - b); 379 | 380 | const messages: string[] = []; 381 | const currentRegistry = await getCurrentRegistry(); 382 | const errorMsg = chalk.red( 383 | ' (Fetch error, if this is your private registry, please ignore)', 384 | ); 385 | const timeoutMsg = chalk.yellow(` (Fetch timeout over ${timeout} ms)`); 386 | const length = Math.max(...Object.keys(sources).map((key) => key.length)) + 3; 387 | 388 | for (const { registry, success, time, name, isTimeout } of results) { 389 | const isFastest = time === fastest; 390 | const prefix = registry === currentRegistry ? chalk.green('* ') : ' '; 391 | let suffix = 392 | isFastest && !target 393 | ? chalk.bgGreenBright(`${time} ms`) 394 | : isTimeout 395 | ? 'timeout' 396 | : `${time} ms`; 397 | if (!success) { 398 | suffix += isTimeout ? timeoutMsg : errorMsg; 399 | } 400 | messages.push(prefix + name + geneDashLine(name, length) + suffix); 401 | } 402 | 403 | printMessages(messages); 404 | 405 | return messages; 406 | } 407 | -------------------------------------------------------------------------------- /src/constants.ts: -------------------------------------------------------------------------------- 1 | import os from 'node:os'; 2 | import path from 'node:path'; 3 | import type { RegistryConfig } from './types.js'; 4 | 5 | export const REGISTRIES: RegistryConfig = { 6 | npm: { 7 | home: 'https://www.npmjs.org', 8 | registry: 'https://registry.npmjs.org/', 9 | }, 10 | yarn: { 11 | home: 'https://yarnpkg.com', 12 | registry: 'https://registry.yarnpkg.com/', 13 | }, 14 | tencent: { 15 | home: 'https://mirrors.tencent.com/npm/', 16 | registry: 'https://mirrors.tencent.com/npm/', 17 | }, 18 | cnpm: { 19 | home: 'https://cnpmjs.org', 20 | registry: 'https://r.cnpmjs.org/', 21 | }, 22 | taobao: { 23 | home: 'https://npmmirror.com', 24 | registry: 'https://registry.npmmirror.com/', 25 | }, 26 | npmMirror: { 27 | home: 'https://skimdb.npmjs.com/', 28 | registry: 'https://skimdb.npmjs.com/registry/', 29 | }, 30 | huawei: { 31 | home: 'https://www.huaweicloud.com/special/npm-jingxiang.html', 32 | registry: 'https://repo.huaweicloud.com/repository/npm/', 33 | }, 34 | }; 35 | 36 | export const HOME = 'home'; 37 | export const AUTH = '_auth'; 38 | export const EMAIL = 'email'; 39 | export const REGISTRY = 'registry'; 40 | export const REPOSITORY = 'repository'; 41 | export const ALWAYS_AUTH = 'always-auth'; 42 | export const REGISTRY_ATTRS = [REGISTRY, HOME, AUTH, ALWAYS_AUTH]; 43 | export const NRMRC = path.join(os.homedir(), '.nrmrc'); 44 | export const NPMRC = path.join(os.homedir(), '.npmrc'); 45 | -------------------------------------------------------------------------------- /src/helpers.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | import process from 'node:process'; 3 | import chalk from 'chalk'; 4 | import ini from 'ini'; 5 | import { NPMRC, NRMRC, REGISTRIES, REGISTRY } from './constants.js'; 6 | import type { Registry } from './types.js'; 7 | 8 | export async function readFile( 9 | file: fs.PathLike, 10 | ): Promise> { 11 | return new Promise((resolve) => { 12 | if (!fs.existsSync(file)) { 13 | resolve({}); 14 | } else { 15 | try { 16 | const content = ini.parse(fs.readFileSync(file, 'utf-8')); 17 | resolve(content); 18 | } catch (error: any) { 19 | exit(error); 20 | } 21 | } 22 | }); 23 | } 24 | 25 | export async function writeFile( 26 | path: fs.PathOrFileDescriptor, 27 | content: Record, 28 | ) { 29 | return new Promise((resolve) => { 30 | try { 31 | fs.writeFileSync(path, ini.stringify(content)); 32 | resolve(); 33 | } catch (error: any) { 34 | exit(error); 35 | } 36 | }); 37 | } 38 | 39 | export function padding(message = '', before = 1, after = 1) { 40 | return ( 41 | new Array(before).fill(' ').join('') + 42 | message + 43 | new Array(after).fill(' ').join('') 44 | ); 45 | } 46 | 47 | export function printSuccess(message: string) { 48 | console.log(`${chalk.bgGreenBright(padding('SUCCESS'))} ${message}`); 49 | } 50 | 51 | export function printError(error: string) { 52 | console.error(`${chalk.bgRed(padding('ERROR'))} ${chalk.red(error)}`); 53 | } 54 | 55 | export function printMessages(messages: string[]) { 56 | console.log(messages.join('\n')); 57 | } 58 | 59 | export function geneDashLine(message: string, length: number) { 60 | const finalMessage = new Array(Math.max(2, length - message.length + 2)).join( 61 | '-', 62 | ); 63 | return padding(chalk.dim(finalMessage)); 64 | } 65 | 66 | export function isLowerCaseEqual(str1: string, str2: string) { 67 | if (str1 && str2) { 68 | return str1.toLowerCase() === str2.toLowerCase(); 69 | } 70 | 71 | return !str1 && !str2; 72 | } 73 | 74 | export async function getCurrentRegistry(): Promise { 75 | const npmrc = await readFile(NPMRC); 76 | return npmrc[REGISTRY]; 77 | } 78 | 79 | export async function getRegistries(): Promise> { 80 | const customRegistries = await readFile(NRMRC); 81 | return Object.assign({}, REGISTRIES, customRegistries); 82 | } 83 | 84 | export async function isRegistryNotFound(name: string, printErr = true) { 85 | const registries = await getRegistries(); 86 | if (!Object.keys(registries).includes(name)) { 87 | printErr && printError(`The registry '${name}' is not found.`); 88 | return true; 89 | } 90 | return false; 91 | } 92 | 93 | export async function isInternalRegistry(name: string, handle?: string) { 94 | if (Object.keys(REGISTRIES).includes(name)) { 95 | handle && printError(`You cannot ${handle} the nrm internal registry.`); 96 | return true; 97 | } 98 | 99 | return false; 100 | } 101 | 102 | export function exit(error?: string) { 103 | error && printError(error); 104 | process.exit(1); 105 | } 106 | 107 | export function isUnicodeSupported() { 108 | if (process.platform !== 'win32') { 109 | return process.env.TERM !== 'linux'; 110 | } 111 | 112 | return ( 113 | Boolean(process.env.WT_SESSION) || 114 | Boolean(process.env.TERMINUS_SUBLIME) || 115 | process.env.ConEmuTask === '{cmd::Cmder}' || 116 | process.env.TERM_PROGRAM === 'Terminus-Sublime' || 117 | process.env.TERM_PROGRAM === 'vscode' || 118 | process.env.TERM === 'xterm-256color' || 119 | process.env.TERM === 'alacritty' || 120 | process.env.TERMINAL_EMULATOR === 'JetBrains-JediTerm' 121 | ); 122 | } 123 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { Command } from 'commander'; 4 | import packageJson from '../package.json'; 5 | import { 6 | onAdd, 7 | onCurrent, 8 | onDelete, 9 | onDeleteScope, 10 | onHome, 11 | onList, 12 | onLogin, 13 | onRename, 14 | onSetAttribute, 15 | onSetRepository, 16 | onSetScope, 17 | onTest, 18 | onUse, 19 | } from './actions.js'; 20 | 21 | const program = new Command(); 22 | 23 | const { name, version, description } = packageJson; 24 | program.name(name).description(description).version(version); 25 | 26 | program.command('ls').description('List all the registries').action(onList); 27 | 28 | program 29 | .command('current') 30 | .option('-u, --show-url', 'Show the registry URL instead of the name') 31 | .description('Show current registry name or URL') 32 | .action(onCurrent); 33 | 34 | program 35 | .command('use [name]') 36 | .description('Change current registry') 37 | .action(onUse); 38 | 39 | program 40 | .command('add [home]') 41 | .description('Add custom registry') 42 | .action(onAdd); 43 | 44 | program 45 | .command('login [base64]') 46 | .option('-a, --always-auth', 'Set is always auth') 47 | .option('-u, --username ', 'Your user name for this registry') 48 | .option('-p, --password ', 'Your password for this registry') 49 | .option('-e, --email ', 'Your email for this registry') 50 | .description( 51 | 'Set authorize information for a custom registry with a base64 encoded string or username and password', 52 | ) 53 | .action(onLogin); 54 | 55 | program 56 | .command('set-hosted-repo ') 57 | .description( 58 | 'Set hosted npm repository for a custom registry to publish package', 59 | ) 60 | .action(onSetRepository); 61 | 62 | program 63 | .command('set-scope ') 64 | .description('Associating a scope with a registry') 65 | .action(onSetScope); 66 | 67 | program 68 | .command('del-scope ') 69 | .description('Remove a scope') 70 | .action(onDeleteScope); 71 | 72 | program 73 | .command('set ') 74 | .requiredOption('-a,--attr ', 'Set a custom registry attribute') 75 | .requiredOption('-v,--value ', 'Set a custom registry value') 76 | .description('Set a custom registry attribute') 77 | .action(onSetAttribute); 78 | 79 | program 80 | .command('rename ') 81 | .description('Change custom registry name') 82 | .action(onRename); 83 | 84 | program 85 | .command('del [name]') 86 | .description('Delete custom registry') 87 | .action(onDelete); 88 | 89 | program 90 | .command('home [browser]') 91 | .description('Open the homepage of registry with optional browser') 92 | .action(onHome); 93 | 94 | program 95 | .command('test [registry]') 96 | .description('Show response time for specific or all registries') 97 | .action(() => { 98 | onTest(); 99 | }); // ignore return value to pass typescript check 100 | 101 | program.parse(process.argv); 102 | 103 | if (process.argv.length === 2) { 104 | program.outputHelp(); 105 | } 106 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | export interface Registry { 2 | home: string; 3 | registry: string; 4 | } 5 | 6 | export type RegistryAlias = 7 | | 'npm' 8 | | 'yarn' 9 | | 'tencent' 10 | | 'cnpm' 11 | | 'taobao' 12 | | 'npmMirror' 13 | | 'huawei'; 14 | 15 | export type RegistryConfig = Record; 16 | -------------------------------------------------------------------------------- /tests/cli.test.ts: -------------------------------------------------------------------------------- 1 | import { spawn } from 'node:child_process'; 2 | import chalk from 'chalk'; 3 | import coffee from 'coffee'; 4 | import open from 'open'; 5 | import stripAnsi from 'strip-ansi'; 6 | import { 7 | afterAll, 8 | afterEach, 9 | beforeAll, 10 | beforeEach, 11 | describe, 12 | expect, 13 | it, 14 | vi, 15 | } from 'vitest'; 16 | 17 | import { unlink } from 'node:fs/promises'; 18 | import { onHome, onTest } from '../src/actions'; 19 | import { NPMRC, NRMRC, REGISTRIES } from '../src/constants'; 20 | import { isUnicodeSupported, readFile, writeFile } from '../src/helpers'; 21 | 22 | 23 | const isWin = process.platform === 'win32'; 24 | 25 | const shouldUseMain = isUnicodeSupported(); 26 | 27 | const pointer = shouldUseMain ? '❯' : '>'; 28 | const radioOff = shouldUseMain ? '◯' : '( )'; 29 | const radioOn = shouldUseMain ? '◉' : '(*)'; 30 | 31 | vi.setConfig({ 32 | testTimeout: 20000, 33 | }); 34 | vi.mock('open', () => { 35 | return { 36 | default: vi.fn(() => console.log('browser opened')), 37 | }; 38 | }); 39 | 40 | vi.mock('undici', () => { 41 | return { 42 | fetch: vi.fn((url) => { 43 | return new Promise((resolve) => { 44 | setTimeout( 45 | () => resolve({ ok: !url.includes('error.com') }), 46 | (Math.random() + 1) * 1000, 47 | ); 48 | }); 49 | }), 50 | }; 51 | }); 52 | 53 | vi.stubGlobal('__NRM_VERSION__', null); 54 | vi.stubGlobal('__REGISTRY__', null); 55 | beforeAll(async () => { 56 | const { stdout } = await coffee.spawn('nrm', ['-V'], { shell: isWin }).end(); 57 | global.__NRM_VERSION__ = stdout ? stdout : null; 58 | await coffee.spawn('npm', ['link'], { shell: isWin }).end(); 59 | }); 60 | 61 | afterAll(async () => { 62 | await coffee.spawn('npm', ['unlink', 'nrm', '-g'], { shell: isWin }).end(); 63 | 64 | if (global.__NRM_VERSION__ !== null) { 65 | await coffee 66 | .spawn('npm', [`install -g nrm@${global.__NRM_VERSION__}`], { 67 | shell: isWin, 68 | }) 69 | .end(); 70 | } 71 | }); 72 | 73 | it('nrm ls', async () => { 74 | await coffee 75 | .spawn('nrm', ['use', 'cnpm'], { shell: isWin }) 76 | .expect('stdout', /The registry has been changed to 'cnpm'/g) 77 | .expect('code', 0) 78 | .end(); 79 | 80 | const { stdout, code } = await coffee 81 | .spawn('nrm', ['ls'], { shell: isWin }) 82 | .end(); 83 | 84 | const match = `${chalk.green.bold('* ')}cnpm`; 85 | 86 | expect(stdout.includes(match)).toBe(true); 87 | expect(code).toBe(0); 88 | }); 89 | 90 | it('nrm use ', async () => { 91 | await coffee 92 | .spawn('nrm', ['use', 'cnpm'], { shell: isWin }) 93 | .expect('stdout', /The registry has been changed to 'cnpm'/g) 94 | .expect('code', 0) 95 | .end(); 96 | }); 97 | 98 | it('nrm use local', async () => { 99 | await coffee 100 | .spawn('nrm', ['use', 'cnpm', 'local'], { shell: isWin }) 101 | .expect('stdout', /The registry has been changed to 'cnpm'/g) 102 | .expect('code', 0) 103 | .end(); 104 | 105 | const npmrc = await readFile(NPMRC); 106 | 107 | expect(npmrc.registry).toBe(REGISTRIES.cnpm.registry); 108 | 109 | await coffee 110 | .spawn('nrm', ['current'], { shell: isWin }) 111 | .expect('stdout', /cnpm/g) 112 | .expect('code', 0) 113 | .end(); 114 | }); 115 | 116 | it('nrm use local with user config', async () => { 117 | await writeFile(NPMRC, { abc: '123' }); 118 | 119 | await coffee 120 | .spawn('nrm', ['use', 'cnpm', 'local'], { shell: isWin }) 121 | .expect('stdout', /The registry has been changed to 'cnpm'/g) 122 | .expect('code', 0) 123 | .end(); 124 | 125 | const npmrc = await readFile(NPMRC); 126 | 127 | expect(npmrc.registry).toBe(REGISTRIES.cnpm.registry); 128 | expect(npmrc.abc).toBe('123'); 129 | 130 | await coffee 131 | .spawn('nrm', ['current'], { shell: isWin }) 132 | .expect('stdout', /cnpm/g) 133 | .expect('code', 0) 134 | .end(); 135 | }); 136 | 137 | it('nrm use without argument', async () => { 138 | const { stdout } = spawn('nrm', ['use'], { shell: isWin }); 139 | 140 | const message = await new Promise((resolve) => { 141 | stdout.on('data', (data) => { 142 | resolve(stripAnsi(data.toString()).trim()); 143 | }); 144 | }); 145 | 146 | expect( 147 | message, 148 | ).toBe(`? Please select the registry you want to use (Use arrow keys) 149 | ${pointer} npm 150 | yarn 151 | tencent 152 | cnpm 153 | taobao 154 | npmMirror 155 | huawei`); 156 | }); 157 | 158 | it('nrm current', async () => { 159 | await coffee 160 | .spawn('nrm', ['use', 'cnpm'], { shell: isWin }) 161 | .expect('stdout', /The registry has been changed to 'cnpm'/g) 162 | .expect('code', 0) 163 | .end(); 164 | 165 | await coffee 166 | .spawn('nrm', ['current'], { shell: isWin }) 167 | .expect('stdout', /cnpm/g) 168 | .expect('code', 0) 169 | .end(); 170 | }); 171 | 172 | describe('nrm command which needs to add a custom registry', () => { 173 | const customName = 'customName'; 174 | const url = 'https://registry.error.com/'; 175 | let __REGISTRY__ = ''; 176 | beforeEach(async () => { 177 | __REGISTRY__ = customName; 178 | 179 | await coffee 180 | .spawn('nrm', ['add', `${__REGISTRY__}`, `${url}`], { shell: isWin }) 181 | .expect('stdout', /success/g) 182 | .expect('code', 0) 183 | .end(); 184 | }); 185 | 186 | afterEach(async () => { 187 | await coffee 188 | .spawn('nrm', ['del', `${__REGISTRY__}`], { shell: isWin }) 189 | .expect('stdout', /has been deleted successfully/g) 190 | .expect('code', 0) 191 | .end(); 192 | }); 193 | 194 | it('nrm rename', async () => { 195 | const newName = 'newName'; 196 | __REGISTRY__ = newName; 197 | const match = new RegExp( 198 | `The registry '${customName}' has been renamed to '${newName}'`, 199 | 'g', 200 | ); 201 | 202 | await coffee 203 | .spawn('nrm', ['rename', `${customName}`, `${newName}`], { shell: isWin }) 204 | .expect('stdout', match) 205 | .expect('code', 0) 206 | .end(); 207 | }); 208 | 209 | it('nrm set ', async () => { 210 | const attr = 'attr'; 211 | const value = 'value'; 212 | 213 | await coffee 214 | .spawn( 215 | 'nrm', 216 | ['set', `${__REGISTRY__}`, '-a', `${attr}`, '-v', `${value}`], 217 | { shell: isWin }, 218 | ) 219 | .expect('stdout', /successfully/g) 220 | .expect('code', 0) 221 | .end(); 222 | }); 223 | 224 | it('nrm test [registry]', async () => { 225 | const results = await onTest(); 226 | expect(results.every((ele) => /\d+\sms/.test(ele))).toBe(true); 227 | expect(results.some((ele) => ele.includes('*'))).toBe(true); 228 | expect(results.some((ele) => ele.includes('please ignore'))).toBe(true); 229 | }); 230 | 231 | it('nrm set-scope , del-scope ', async () => { 232 | const scopeName = 'nrm'; 233 | const url = 'https://scope.example.org'; 234 | 235 | await coffee 236 | .spawn('nrm', ['set-scope', `${scopeName}`, `${url}`], { shell: isWin }) 237 | .expect('stdout', /success/g) 238 | .expect('code', 0) 239 | .end(); 240 | 241 | await coffee 242 | .spawn('nrm', ['del-scope', `${scopeName}`], { shell: isWin }) 243 | .expect('stdout', /success/g) 244 | .expect('code', 0) 245 | .end(); 246 | }); 247 | 248 | it('nrm set-hosted-repo ', async () => { 249 | const repo = 'repo'; 250 | const match = new RegExp( 251 | `Set the repository of registry '${__REGISTRY__}' successfully`, 252 | 'g', 253 | ); 254 | 255 | await coffee 256 | .spawn('nrm', ['set-hosted-repo', `${__REGISTRY__}`, `${repo}`], { 257 | shell: isWin, 258 | }) 259 | .expect('stdout', match) 260 | .expect('code', 0) 261 | .end(); 262 | }); 263 | 264 | it('login [base64]', async () => { 265 | const username = 'username'; 266 | const password = 'password'; 267 | 268 | await coffee 269 | .spawn( 270 | 'nrm', 271 | ['login', `${__REGISTRY__}`, '-u', `${username}`, '-p', `${password}`], 272 | { shell: isWin }, 273 | ) 274 | .expect('stdout', /success/g) 275 | .expect('code', 0) 276 | .end(); 277 | 278 | await coffee 279 | .spawn('nrm', ['login', `${__REGISTRY__}`], { shell: isWin }) 280 | .expect( 281 | 'stderr', 282 | /Authorization information in base64 format or username & password is required/g, 283 | ) 284 | .end(); 285 | }); 286 | }); 287 | 288 | it('nrm home [browser]', async () => { 289 | await onHome('cnpm'); 290 | expect(open).toHaveBeenCalled(); 291 | }); 292 | 293 | describe('nrm delete without argument (use keyword to select delete)', () => { 294 | const registries = [ 295 | { name: 'test', url: 'http://localhost:3000' }, 296 | { name: 'test1', url: 'http://localhost:3001' }, 297 | { name: 'test2', url: 'http://localhost:3002' }, 298 | ]; 299 | beforeEach(async () => { 300 | for (const registry of registries) { 301 | await coffee 302 | .spawn('nrm', ['add', `${registry.name}`, `${registry.url}`], { 303 | shell: isWin, 304 | }) 305 | .expect('stdout', /success/g) 306 | .expect('code', 0) 307 | .end(); 308 | } 309 | }); 310 | 311 | afterEach(async () => { 312 | await unlink(NRMRC); 313 | }); 314 | 315 | it('nrm delete', async () => { 316 | const { stdout } = spawn('nrm', ['del'], { shell: isWin }); 317 | 318 | const message = await new Promise((resolve) => { 319 | stdout.on('data', (data) => { 320 | resolve(stripAnsi(data.toString()).trim()); 321 | }); 322 | }); 323 | 324 | expect(message).toMatchInlineSnapshot(` 325 | "? Please select the registries you want to delete (Press to select, 326 | to toggle all, to invert selection, and to proceed) 327 | ${pointer}${radioOff} test 328 | ${radioOff} test1 329 | ${radioOff} test2" 330 | `); 331 | }); 332 | 333 | it('nrm delete (with keyword input)', async () => { 334 | const { stdout, stdin } = spawn('nrm', ['del'], { shell: isWin }); 335 | stdin.write('\u001b[B'); 336 | 337 | const message = await new Promise((resolve) => { 338 | const m: string[] = []; 339 | stdout.on('data', (data) => { 340 | m.push(stripAnsi(data.toString()).trim()); 341 | // get the last output 342 | if (m.length === 2) { 343 | resolve(m[m.length - 1]); 344 | } 345 | }); 346 | }); 347 | 348 | expect(message).toMatchInlineSnapshot(` 349 | "? Please select the registries you want to delete (Press to select, 350 | to toggle all, to invert selection, and to proceed) 351 | ${radioOff} test 352 | ${pointer}${radioOff} test1 353 | ${radioOff} test2" 354 | `); 355 | }); 356 | }); 357 | -------------------------------------------------------------------------------- /tests/helpers.test.ts: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | import chalk from 'chalk'; 3 | import ini from 'ini'; 4 | import mockFs from 'mock-fs'; 5 | import { afterAll, beforeAll, expect, it } from 'vitest'; 6 | import { NPMRC, NRMRC, REGISTRY } from '../src/constants'; 7 | import { 8 | geneDashLine, 9 | getCurrentRegistry, 10 | getRegistries, 11 | isInternalRegistry, 12 | isLowerCaseEqual, 13 | isRegistryNotFound, 14 | readFile, 15 | writeFile, 16 | } from '../src/helpers'; 17 | 18 | beforeAll(() => { 19 | mockFs({ 20 | [NPMRC]: '', 21 | [NRMRC]: '', 22 | }); 23 | }); 24 | 25 | afterAll(() => { 26 | mockFs.restore(); 27 | }); 28 | 29 | it('geneDashLine', () => { 30 | const result1 = geneDashLine('taobao', 10); 31 | const result2 = geneDashLine('taobao', 1); 32 | expect(result1).toBe(` ${chalk.dim('-----')} `); 33 | expect(result2).toBe(` ${chalk.dim('-')} `); 34 | }); 35 | 36 | it('getCurrentRegistry', async () => { 37 | const registry = ' https://registry.npmjs.org/'; 38 | fs.writeFileSync(NPMRC, ini.stringify({ [REGISTRY]: registry })); 39 | const currentRegistry = await getCurrentRegistry(); 40 | expect(currentRegistry).toBe(registry); 41 | }); 42 | 43 | it('getRegistries', async () => { 44 | const name = 'fake name'; 45 | const registry = 'https://registry.example.com/'; 46 | fs.writeFileSync(NRMRC, ini.stringify({ [name]: { registry } })); 47 | const registries = await getRegistries(); 48 | expect(Object.keys(registries).includes(name)).toBe(true); 49 | }); 50 | 51 | it('readFile', async () => { 52 | const content = 'hello nrm'; 53 | fs.writeFileSync(NRMRC, ini.stringify({ content: content })); 54 | const result1 = await readFile(NRMRC); 55 | const result2 = await readFile('file not exist'); 56 | expect(result1.content).toBe(content); 57 | expect(result2).toEqual(Object.create(null)); 58 | }); 59 | 60 | it('writeFile', async () => { 61 | const content = { nrm: 'nrm is great' }; 62 | await writeFile(NRMRC, { content }); 63 | const result = await readFile(NRMRC); 64 | expect(result.content).toEqual(content); 65 | }); 66 | 67 | it('isLowerCaseEqual', () => { 68 | const result1 = isLowerCaseEqual('taobao', 'TAOBAO'); 69 | const result2 = isLowerCaseEqual('jd', 'tb'); 70 | const result3 = isLowerCaseEqual('taobao', ''); 71 | const result4 = isLowerCaseEqual('', ''); 72 | expect(result1).toBe(true); 73 | expect(result2).toBe(false); 74 | expect(result3).toBe(false); 75 | expect(result4).toBe(true); 76 | }); 77 | 78 | it('isRegistryNotFound', async () => { 79 | const unknown = 'unknown'; 80 | const name = 'custom name'; 81 | const registry = 'https://registry.example.com/'; 82 | fs.writeFileSync(NRMRC, ini.stringify({ [name]: registry })); 83 | const result1 = await isRegistryNotFound(unknown, false); 84 | const result2 = await isRegistryNotFound(name, false); 85 | expect(result1).toBe(true); 86 | expect(result2).toBe(false); 87 | }); 88 | 89 | it('isInternalRegistry', async () => { 90 | const name = 'custom name'; 91 | const registry = 'https://registry.example.com/'; 92 | fs.writeFileSync(NRMRC, ini.stringify({ [name]: registry })); 93 | const result1 = await isInternalRegistry(name); 94 | const result2 = await isInternalRegistry('npm'); 95 | expect(result1).toBe(false); 96 | expect(result2).toBe(true); 97 | }); 98 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "strict": true, 5 | "declaration": false, 6 | "skipLibCheck": true, 7 | "esModuleInterop": true, 8 | "downlevelIteration": true, 9 | "resolveJsonModule": true, 10 | "lib": ["esnext"], 11 | "module": "CommonJS", 12 | "moduleResolution": "node", 13 | "outDir": "./dist", 14 | "rootDir": "./src" 15 | }, 16 | "include": ["src"], 17 | "exclude": ["node_modules"] 18 | } 19 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | environment: 'node', 6 | }, 7 | }); 8 | --------------------------------------------------------------------------------