Mirror: A Node.js fetch shim using built-in Request, Response, and Headers (but without native fetch)

Initial Commit

kitten.sh bb7dd7ce

+8
.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/master/docs/common-questions.md)
+16
.changeset/config.json
··· 1 + { 2 + "$schema": "https://unpkg.com/@changesets/config@0.3.0/schema.json", 3 + "changelog": "../scripts/changelog.js", 4 + "commit": false, 5 + "access": "public", 6 + "baseBranch": "main", 7 + "updateInternalDependencies": "minor", 8 + "snapshot": { 9 + "prereleaseTemplate": "{tag}-{commit}", 10 + "useCalculatedVersion": true 11 + }, 12 + "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { 13 + "onlyUpdatePeerDependentsWhenOutOfRange": true, 14 + "updateInternalDependents": "out-of-range" 15 + } 16 + }
+1
.gitattributes
··· 1 + * text=auto
+76
.github/workflows/ci.yml
··· 1 + name: CI 2 + 3 + on: 4 + pull_request: 5 + pull_request_review: 6 + types: [submitted, edited] 7 + branches: changeset-release/main 8 + push: 9 + branches: 10 + - main 11 + 12 + jobs: 13 + unit: 14 + name: Unit Tests 15 + runs-on: ubuntu-latest 16 + timeout-minutes: 10 17 + strategy: 18 + matrix: 19 + node_version: [18, 20, 22] 20 + steps: 21 + - name: Checkout Repo 22 + uses: actions/checkout@v4 23 + with: 24 + fetch-depth: 0 25 + 26 + - name: Setup pnpm 27 + uses: pnpm/action-setup@v3 28 + with: 29 + version: 9 30 + run_install: false 31 + 32 + - name: Setup Node 33 + uses: actions/setup-node@v4 34 + with: 35 + node-version: ${{ matrix.node_version }} 36 + cache: 'pnpm' 37 + 38 + - name: Install Dependencies 39 + run: pnpm install --frozen-lockfile --prefer-offline 40 + 41 + - name: Unit Tests 42 + run: pnpm run test 43 + 44 + check: 45 + name: Checks 46 + runs-on: ubuntu-latest 47 + timeout-minutes: 10 48 + steps: 49 + - name: Checkout Repo 50 + uses: actions/checkout@v4 51 + with: 52 + fetch-depth: 0 53 + 54 + - name: Setup pnpm 55 + uses: pnpm/action-setup@v3 56 + with: 57 + version: 9 58 + run_install: false 59 + 60 + - name: Setup Node 61 + uses: actions/setup-node@v4 62 + with: 63 + node-version: ${{ matrix.node_version }} 64 + cache: 'pnpm' 65 + 66 + - name: Install Dependencies 67 + run: pnpm install --frozen-lockfile --prefer-offline 68 + 69 + - name: TypeScript 70 + run: pnpm run check 71 + 72 + - name: Unit Tests 73 + run: pnpm run test 74 + 75 + - name: Build 76 + run: pnpm run build
+60
.github/workflows/release.yml
··· 1 + name: Release 2 + on: 3 + push: 4 + branches: 5 + - main 6 + 7 + jobs: 8 + release: 9 + name: Release 10 + runs-on: ubuntu-20.04 11 + timeout-minutes: 20 12 + permissions: 13 + contents: write 14 + id-token: write 15 + issues: write 16 + repository-projects: write 17 + deployments: write 18 + packages: write 19 + pull-requests: write 20 + steps: 21 + - name: Checkout Repo 22 + uses: actions/checkout@v4 23 + with: 24 + fetch-depth: 0 25 + 26 + - name: Setup pnpm 27 + uses: pnpm/action-setup@v3 28 + with: 29 + version: 9 30 + run_install: false 31 + 32 + - name: Setup Node 33 + uses: actions/setup-node@v4 34 + with: 35 + node-version: 22 36 + cache: 'pnpm' 37 + 38 + - name: Install Dependencies 39 + run: pnpm install --frozen-lockfile --prefer-offline 40 + 41 + - name: PR or Publish 42 + id: changesets 43 + uses: changesets/action@v1.4.5 44 + with: 45 + version: pnpm changeset:version 46 + publish: pnpm changeset:publish 47 + env: 48 + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 49 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 50 + 51 + - name: Publish Prerelease 52 + if: steps.changesets.outputs.published != 'true' 53 + env: 54 + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 55 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 56 + run: | 57 + npm config set "//registry.npmjs.org/:_authToken" "$NPM_TOKEN" 58 + git reset --hard origin/main 59 + pnpm changeset version --no-git-tag --snapshot canary 60 + pnpm changeset publish --no-git-tag --snapshot canary --tag canary
+2
.gitignore
··· 1 + node_modules 2 + dist
+5
CHANGELOG.md
··· 1 + # minifetch 2 + 3 + ## 0.1.0 4 + 5 + Initial Release.
+24
LICENSE.md
··· 1 + MIT License 2 + 3 + Copyright (c) Phil Pluckthun, 4 + Copyright (c) 2016 - 2020 Node Fetch Team, 5 + Copyright (c) Remix Software Inc. 2020-2021, 6 + Copyright (c) Shopify Inc. 2022-2024 7 + 8 + Permission is hereby granted, free of charge, to any person obtaining a copy 9 + of this software and associated documentation files (the "Software"), to deal 10 + in the Software without restriction, including without limitation the rights 11 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 + copies of the Software, and to permit persons to whom the Software is 13 + furnished to do so, subject to the following conditions: 14 + 15 + The above copyright notice and this permission notice shall be included in all 16 + copies or substantial portions of the Software. 17 + 18 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 + SOFTWARE.
+14
README.md
··· 1 + # fetch-nodeshim 2 + 3 + A looser implementation of `fetch` that bypasses Node.js' built-in `fetch`. 4 + Some implementations (specifically ones that provide undici-based shims) 5 + or some versions of Node.js may ship with a built-in version of `undici` 6 + that's older and/or missing patches. 7 + 8 + This implementation of `fetch` uses built-ins as much as possible, 9 + using global `Request`, `Response`, and `Headers`, whether they're provided 10 + by a polyfill or by Node.js itself. 11 + However, it's a looser and more permissive implementation that calls 12 + into `node:http` and `node:https` instead. 13 + 14 + Think of it as `@remix-run/web-fetch`, but lighter.
+70
package.json
··· 1 + { 2 + "name": "fetch-nodeshim", 3 + "version": "0.1.0", 4 + "description": "A Node.js fetch shim using built-in Request, Response, and Headers (but without native fetch)", 5 + "author": "Phil Pluckthun <phil@kitten.sh>", 6 + "source": "./src/index.ts", 7 + "main": "./dist/minifetch", 8 + "module": "./dist/minifetch.mjs", 9 + "types": "./dist/minifetch.d.ts", 10 + "files": [ 11 + "LICENSE.md", 12 + "README.md", 13 + "CHANGELOG.md", 14 + "dist/" 15 + ], 16 + "scripts": { 17 + "test": "vitest test", 18 + "test:run": "vitest test --run", 19 + "check": "tsc --noEmit", 20 + "build": "rollup -c ./scripts/rollup.config.mjs", 21 + "clean": "rimraf dist node_modules/.cache", 22 + "prepublishOnly": "run-s clean build check test:run", 23 + "prepare": "node ./scripts/prepare.js || true", 24 + "changeset:version": "changeset version && pnpm install --lockfile-only", 25 + "changeset:publish": "changeset publish" 26 + }, 27 + "exports": { 28 + ".": { 29 + "types": "./dist/minifetch.d.ts", 30 + "import": "./dist/minifetch.mjs", 31 + "require": "./dist/minifetch.js", 32 + "source": "./src/index.ts" 33 + }, 34 + "./package.json": "./package.json" 35 + }, 36 + "prettier": { 37 + "singleQuote": true, 38 + "arrowParens": "avoid", 39 + "trailingComma": "es5" 40 + }, 41 + "lint-staged": { 42 + "*.{js,ts,json,md}": "prettier --write" 43 + }, 44 + "keywords": [], 45 + "license": "MIT", 46 + "devDependencies": { 47 + "@babel/plugin-transform-block-scoping": "^7.25.9", 48 + "@babel/plugin-transform-typescript": "^7.26.7", 49 + "@changesets/cli": "^2.27.1", 50 + "@changesets/get-github-info": "^0.6.0", 51 + "@rollup/plugin-babel": "^6.0.4", 52 + "@rollup/plugin-commonjs": "^28.0.2", 53 + "@rollup/plugin-node-resolve": "^16.0.0", 54 + "@rollup/plugin-terser": "^0.4.4", 55 + "@types/node": "^22.12.0", 56 + "busboy": "^0.3.1", 57 + "dotenv": "^16.4.7", 58 + "form-data": "^4.0.1", 59 + "lint-staged": "^15.4.3", 60 + "npm-run-all": "^4.1.5", 61 + "prettier": "^3.4.2", 62 + "rimraf": "^6.0.1", 63 + "rollup": "^4.32.1", 64 + "rollup-plugin-cjs-check": "^1.0.3", 65 + "rollup-plugin-dts": "^6.1.1", 66 + "typescript": "^5.7.3", 67 + "undici-types": "^7.3.0", 68 + "vitest": "^3.0.4" 69 + } 70 + }
+4200
pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + devDependencies: 11 + '@babel/plugin-transform-block-scoping': 12 + specifier: ^7.25.9 13 + version: 7.25.9(@babel/core@7.26.7) 14 + '@babel/plugin-transform-typescript': 15 + specifier: ^7.26.7 16 + version: 7.26.7(@babel/core@7.26.7) 17 + '@changesets/cli': 18 + specifier: ^2.27.1 19 + version: 2.27.12 20 + '@changesets/get-github-info': 21 + specifier: ^0.6.0 22 + version: 0.6.0 23 + '@rollup/plugin-babel': 24 + specifier: ^6.0.4 25 + version: 6.0.4(@babel/core@7.26.7)(rollup@4.32.1) 26 + '@rollup/plugin-commonjs': 27 + specifier: ^28.0.2 28 + version: 28.0.2(rollup@4.32.1) 29 + '@rollup/plugin-node-resolve': 30 + specifier: ^16.0.0 31 + version: 16.0.0(rollup@4.32.1) 32 + '@rollup/plugin-terser': 33 + specifier: ^0.4.4 34 + version: 0.4.4(rollup@4.32.1) 35 + '@types/node': 36 + specifier: ^22.12.0 37 + version: 22.12.0 38 + busboy: 39 + specifier: ^0.3.1 40 + version: 0.3.1 41 + dotenv: 42 + specifier: ^16.4.7 43 + version: 16.4.7 44 + form-data: 45 + specifier: ^4.0.1 46 + version: 4.0.1 47 + lint-staged: 48 + specifier: ^15.4.3 49 + version: 15.4.3 50 + npm-run-all: 51 + specifier: ^4.1.5 52 + version: 4.1.5 53 + prettier: 54 + specifier: ^3.4.2 55 + version: 3.4.2 56 + rimraf: 57 + specifier: ^6.0.1 58 + version: 6.0.1 59 + rollup: 60 + specifier: ^4.32.1 61 + version: 4.32.1 62 + rollup-plugin-cjs-check: 63 + specifier: ^1.0.3 64 + version: 1.0.3(rollup@4.32.1) 65 + rollup-plugin-dts: 66 + specifier: ^6.1.1 67 + version: 6.1.1(rollup@4.32.1)(typescript@5.7.3) 68 + typescript: 69 + specifier: ^5.7.3 70 + version: 5.7.3 71 + undici-types: 72 + specifier: ^7.3.0 73 + version: 7.3.0 74 + vitest: 75 + specifier: ^3.0.4 76 + version: 3.0.4(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0) 77 + 78 + packages: 79 + 80 + '@ampproject/remapping@2.3.0': 81 + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 82 + engines: {node: '>=6.0.0'} 83 + 84 + '@babel/code-frame@7.26.2': 85 + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} 86 + engines: {node: '>=6.9.0'} 87 + 88 + '@babel/compat-data@7.26.5': 89 + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} 90 + engines: {node: '>=6.9.0'} 91 + 92 + '@babel/core@7.26.7': 93 + resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==} 94 + engines: {node: '>=6.9.0'} 95 + 96 + '@babel/generator@7.26.5': 97 + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} 98 + engines: {node: '>=6.9.0'} 99 + 100 + '@babel/helper-annotate-as-pure@7.25.9': 101 + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} 102 + engines: {node: '>=6.9.0'} 103 + 104 + '@babel/helper-compilation-targets@7.26.5': 105 + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} 106 + engines: {node: '>=6.9.0'} 107 + 108 + '@babel/helper-create-class-features-plugin@7.25.9': 109 + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} 110 + engines: {node: '>=6.9.0'} 111 + peerDependencies: 112 + '@babel/core': ^7.0.0 113 + 114 + '@babel/helper-member-expression-to-functions@7.25.9': 115 + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} 116 + engines: {node: '>=6.9.0'} 117 + 118 + '@babel/helper-module-imports@7.25.9': 119 + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} 120 + engines: {node: '>=6.9.0'} 121 + 122 + '@babel/helper-module-transforms@7.26.0': 123 + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} 124 + engines: {node: '>=6.9.0'} 125 + peerDependencies: 126 + '@babel/core': ^7.0.0 127 + 128 + '@babel/helper-optimise-call-expression@7.25.9': 129 + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} 130 + engines: {node: '>=6.9.0'} 131 + 132 + '@babel/helper-plugin-utils@7.26.5': 133 + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} 134 + engines: {node: '>=6.9.0'} 135 + 136 + '@babel/helper-replace-supers@7.26.5': 137 + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} 138 + engines: {node: '>=6.9.0'} 139 + peerDependencies: 140 + '@babel/core': ^7.0.0 141 + 142 + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': 143 + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} 144 + engines: {node: '>=6.9.0'} 145 + 146 + '@babel/helper-string-parser@7.25.9': 147 + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} 148 + engines: {node: '>=6.9.0'} 149 + 150 + '@babel/helper-validator-identifier@7.25.9': 151 + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} 152 + engines: {node: '>=6.9.0'} 153 + 154 + '@babel/helper-validator-option@7.25.9': 155 + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} 156 + engines: {node: '>=6.9.0'} 157 + 158 + '@babel/helpers@7.26.7': 159 + resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==} 160 + engines: {node: '>=6.9.0'} 161 + 162 + '@babel/parser@7.26.7': 163 + resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} 164 + engines: {node: '>=6.0.0'} 165 + hasBin: true 166 + 167 + '@babel/plugin-syntax-typescript@7.25.9': 168 + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} 169 + engines: {node: '>=6.9.0'} 170 + peerDependencies: 171 + '@babel/core': ^7.0.0-0 172 + 173 + '@babel/plugin-transform-block-scoping@7.25.9': 174 + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} 175 + engines: {node: '>=6.9.0'} 176 + peerDependencies: 177 + '@babel/core': ^7.0.0-0 178 + 179 + '@babel/plugin-transform-typescript@7.26.7': 180 + resolution: {integrity: sha512-5cJurntg+AT+cgelGP9Bt788DKiAw9gIMSMU2NJrLAilnj0m8WZWUNZPSLOmadYsujHutpgElO+50foX+ib/Wg==} 181 + engines: {node: '>=6.9.0'} 182 + peerDependencies: 183 + '@babel/core': ^7.0.0-0 184 + 185 + '@babel/runtime@7.26.7': 186 + resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} 187 + engines: {node: '>=6.9.0'} 188 + 189 + '@babel/template@7.25.9': 190 + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} 191 + engines: {node: '>=6.9.0'} 192 + 193 + '@babel/traverse@7.26.7': 194 + resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==} 195 + engines: {node: '>=6.9.0'} 196 + 197 + '@babel/types@7.26.7': 198 + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} 199 + engines: {node: '>=6.9.0'} 200 + 201 + '@changesets/apply-release-plan@7.0.8': 202 + resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} 203 + 204 + '@changesets/assemble-release-plan@6.0.5': 205 + resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} 206 + 207 + '@changesets/changelog-git@0.2.0': 208 + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} 209 + 210 + '@changesets/cli@2.27.12': 211 + resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} 212 + hasBin: true 213 + 214 + '@changesets/config@3.0.5': 215 + resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} 216 + 217 + '@changesets/errors@0.2.0': 218 + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 219 + 220 + '@changesets/get-dependents-graph@2.1.2': 221 + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} 222 + 223 + '@changesets/get-github-info@0.6.0': 224 + resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} 225 + 226 + '@changesets/get-release-plan@4.0.6': 227 + resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} 228 + 229 + '@changesets/get-version-range-type@0.4.0': 230 + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 231 + 232 + '@changesets/git@3.0.2': 233 + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} 234 + 235 + '@changesets/logger@0.1.1': 236 + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 237 + 238 + '@changesets/parse@0.4.0': 239 + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} 240 + 241 + '@changesets/pre@2.0.1': 242 + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} 243 + 244 + '@changesets/read@0.6.2': 245 + resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} 246 + 247 + '@changesets/should-skip-package@0.1.1': 248 + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} 249 + 250 + '@changesets/types@4.1.0': 251 + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 252 + 253 + '@changesets/types@6.0.0': 254 + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} 255 + 256 + '@changesets/write@0.3.2': 257 + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} 258 + 259 + '@esbuild/aix-ppc64@0.24.2': 260 + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} 261 + engines: {node: '>=18'} 262 + cpu: [ppc64] 263 + os: [aix] 264 + 265 + '@esbuild/android-arm64@0.24.2': 266 + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} 267 + engines: {node: '>=18'} 268 + cpu: [arm64] 269 + os: [android] 270 + 271 + '@esbuild/android-arm@0.24.2': 272 + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} 273 + engines: {node: '>=18'} 274 + cpu: [arm] 275 + os: [android] 276 + 277 + '@esbuild/android-x64@0.24.2': 278 + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} 279 + engines: {node: '>=18'} 280 + cpu: [x64] 281 + os: [android] 282 + 283 + '@esbuild/darwin-arm64@0.24.2': 284 + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} 285 + engines: {node: '>=18'} 286 + cpu: [arm64] 287 + os: [darwin] 288 + 289 + '@esbuild/darwin-x64@0.24.2': 290 + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} 291 + engines: {node: '>=18'} 292 + cpu: [x64] 293 + os: [darwin] 294 + 295 + '@esbuild/freebsd-arm64@0.24.2': 296 + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} 297 + engines: {node: '>=18'} 298 + cpu: [arm64] 299 + os: [freebsd] 300 + 301 + '@esbuild/freebsd-x64@0.24.2': 302 + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} 303 + engines: {node: '>=18'} 304 + cpu: [x64] 305 + os: [freebsd] 306 + 307 + '@esbuild/linux-arm64@0.24.2': 308 + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} 309 + engines: {node: '>=18'} 310 + cpu: [arm64] 311 + os: [linux] 312 + 313 + '@esbuild/linux-arm@0.24.2': 314 + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} 315 + engines: {node: '>=18'} 316 + cpu: [arm] 317 + os: [linux] 318 + 319 + '@esbuild/linux-ia32@0.24.2': 320 + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} 321 + engines: {node: '>=18'} 322 + cpu: [ia32] 323 + os: [linux] 324 + 325 + '@esbuild/linux-loong64@0.24.2': 326 + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} 327 + engines: {node: '>=18'} 328 + cpu: [loong64] 329 + os: [linux] 330 + 331 + '@esbuild/linux-mips64el@0.24.2': 332 + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} 333 + engines: {node: '>=18'} 334 + cpu: [mips64el] 335 + os: [linux] 336 + 337 + '@esbuild/linux-ppc64@0.24.2': 338 + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} 339 + engines: {node: '>=18'} 340 + cpu: [ppc64] 341 + os: [linux] 342 + 343 + '@esbuild/linux-riscv64@0.24.2': 344 + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} 345 + engines: {node: '>=18'} 346 + cpu: [riscv64] 347 + os: [linux] 348 + 349 + '@esbuild/linux-s390x@0.24.2': 350 + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} 351 + engines: {node: '>=18'} 352 + cpu: [s390x] 353 + os: [linux] 354 + 355 + '@esbuild/linux-x64@0.24.2': 356 + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} 357 + engines: {node: '>=18'} 358 + cpu: [x64] 359 + os: [linux] 360 + 361 + '@esbuild/netbsd-arm64@0.24.2': 362 + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} 363 + engines: {node: '>=18'} 364 + cpu: [arm64] 365 + os: [netbsd] 366 + 367 + '@esbuild/netbsd-x64@0.24.2': 368 + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} 369 + engines: {node: '>=18'} 370 + cpu: [x64] 371 + os: [netbsd] 372 + 373 + '@esbuild/openbsd-arm64@0.24.2': 374 + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} 375 + engines: {node: '>=18'} 376 + cpu: [arm64] 377 + os: [openbsd] 378 + 379 + '@esbuild/openbsd-x64@0.24.2': 380 + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} 381 + engines: {node: '>=18'} 382 + cpu: [x64] 383 + os: [openbsd] 384 + 385 + '@esbuild/sunos-x64@0.24.2': 386 + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} 387 + engines: {node: '>=18'} 388 + cpu: [x64] 389 + os: [sunos] 390 + 391 + '@esbuild/win32-arm64@0.24.2': 392 + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} 393 + engines: {node: '>=18'} 394 + cpu: [arm64] 395 + os: [win32] 396 + 397 + '@esbuild/win32-ia32@0.24.2': 398 + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} 399 + engines: {node: '>=18'} 400 + cpu: [ia32] 401 + os: [win32] 402 + 403 + '@esbuild/win32-x64@0.24.2': 404 + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} 405 + engines: {node: '>=18'} 406 + cpu: [x64] 407 + os: [win32] 408 + 409 + '@isaacs/cliui@8.0.2': 410 + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 411 + engines: {node: '>=12'} 412 + 413 + '@jridgewell/gen-mapping@0.3.8': 414 + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 415 + engines: {node: '>=6.0.0'} 416 + 417 + '@jridgewell/resolve-uri@3.1.2': 418 + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 419 + engines: {node: '>=6.0.0'} 420 + 421 + '@jridgewell/set-array@1.2.1': 422 + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 423 + engines: {node: '>=6.0.0'} 424 + 425 + '@jridgewell/source-map@0.3.6': 426 + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 427 + 428 + '@jridgewell/sourcemap-codec@1.5.0': 429 + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 430 + 431 + '@jridgewell/trace-mapping@0.3.25': 432 + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 433 + 434 + '@manypkg/find-root@1.1.0': 435 + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 436 + 437 + '@manypkg/get-packages@1.1.3': 438 + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 439 + 440 + '@nodelib/fs.scandir@2.1.5': 441 + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 442 + engines: {node: '>= 8'} 443 + 444 + '@nodelib/fs.stat@2.0.5': 445 + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 446 + engines: {node: '>= 8'} 447 + 448 + '@nodelib/fs.walk@1.2.8': 449 + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 450 + engines: {node: '>= 8'} 451 + 452 + '@rollup/plugin-babel@6.0.4': 453 + resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} 454 + engines: {node: '>=14.0.0'} 455 + peerDependencies: 456 + '@babel/core': ^7.0.0 457 + '@types/babel__core': ^7.1.9 458 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 459 + peerDependenciesMeta: 460 + '@types/babel__core': 461 + optional: true 462 + rollup: 463 + optional: true 464 + 465 + '@rollup/plugin-commonjs@28.0.2': 466 + resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} 467 + engines: {node: '>=16.0.0 || 14 >= 14.17'} 468 + peerDependencies: 469 + rollup: ^2.68.0||^3.0.0||^4.0.0 470 + peerDependenciesMeta: 471 + rollup: 472 + optional: true 473 + 474 + '@rollup/plugin-node-resolve@16.0.0': 475 + resolution: {integrity: sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==} 476 + engines: {node: '>=14.0.0'} 477 + peerDependencies: 478 + rollup: ^2.78.0||^3.0.0||^4.0.0 479 + peerDependenciesMeta: 480 + rollup: 481 + optional: true 482 + 483 + '@rollup/plugin-terser@0.4.4': 484 + resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} 485 + engines: {node: '>=14.0.0'} 486 + peerDependencies: 487 + rollup: ^2.0.0||^3.0.0||^4.0.0 488 + peerDependenciesMeta: 489 + rollup: 490 + optional: true 491 + 492 + '@rollup/pluginutils@5.1.4': 493 + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} 494 + engines: {node: '>=14.0.0'} 495 + peerDependencies: 496 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 497 + peerDependenciesMeta: 498 + rollup: 499 + optional: true 500 + 501 + '@rollup/rollup-android-arm-eabi@4.32.1': 502 + resolution: {integrity: sha512-/pqA4DmqyCm8u5YIDzIdlLcEmuvxb0v8fZdFhVMszSpDTgbQKdw3/mB3eMUHIbubtJ6F9j+LtmyCnHTEqIHyzA==} 503 + cpu: [arm] 504 + os: [android] 505 + 506 + '@rollup/rollup-android-arm64@4.32.1': 507 + resolution: {integrity: sha512-If3PDskT77q7zgqVqYuj7WG3WC08G1kwXGVFi9Jr8nY6eHucREHkfpX79c0ACAjLj3QIWKPJR7w4i+f5EdLH5Q==} 508 + cpu: [arm64] 509 + os: [android] 510 + 511 + '@rollup/rollup-darwin-arm64@4.32.1': 512 + resolution: {integrity: sha512-zCpKHioQ9KgZToFp5Wvz6zaWbMzYQ2LJHQ+QixDKq52KKrF65ueu6Af4hLlLWHjX1Wf/0G5kSJM9PySW9IrvHA==} 513 + cpu: [arm64] 514 + os: [darwin] 515 + 516 + '@rollup/rollup-darwin-x64@4.32.1': 517 + resolution: {integrity: sha512-sFvF+t2+TyUo/ZQqUcifrJIgznx58oFZbdHS9TvHq3xhPVL9nOp+yZ6LKrO9GWTP+6DbFtoyLDbjTpR62Mbr3Q==} 518 + cpu: [x64] 519 + os: [darwin] 520 + 521 + '@rollup/rollup-freebsd-arm64@4.32.1': 522 + resolution: {integrity: sha512-NbOa+7InvMWRcY9RG+B6kKIMD/FsnQPH0MWUvDlQB1iXnF/UcKSudCXZtv4lW+C276g3w5AxPbfry5rSYvyeYA==} 523 + cpu: [arm64] 524 + os: [freebsd] 525 + 526 + '@rollup/rollup-freebsd-x64@4.32.1': 527 + resolution: {integrity: sha512-JRBRmwvHPXR881j2xjry8HZ86wIPK2CcDw0EXchE1UgU0ubWp9nvlT7cZYKc6bkypBt745b4bglf3+xJ7hXWWw==} 528 + cpu: [x64] 529 + os: [freebsd] 530 + 531 + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': 532 + resolution: {integrity: sha512-PKvszb+9o/vVdUzCCjL0sKHukEQV39tD3fepXxYrHE3sTKrRdCydI7uldRLbjLmDA3TFDmh418XH19NOsDRH8g==} 533 + cpu: [arm] 534 + os: [linux] 535 + 536 + '@rollup/rollup-linux-arm-musleabihf@4.32.1': 537 + resolution: {integrity: sha512-9WHEMV6Y89eL606ReYowXuGF1Yb2vwfKWKdD1A5h+OYnPZSJvxbEjxTRKPgi7tkP2DSnW0YLab1ooy+i/FQp/Q==} 538 + cpu: [arm] 539 + os: [linux] 540 + 541 + '@rollup/rollup-linux-arm64-gnu@4.32.1': 542 + resolution: {integrity: sha512-tZWc9iEt5fGJ1CL2LRPw8OttkCBDs+D8D3oEM8mH8S1ICZCtFJhD7DZ3XMGM8kpqHvhGUTvNUYVDnmkj4BDXnw==} 543 + cpu: [arm64] 544 + os: [linux] 545 + 546 + '@rollup/rollup-linux-arm64-musl@4.32.1': 547 + resolution: {integrity: sha512-FTYc2YoTWUsBz5GTTgGkRYYJ5NGJIi/rCY4oK/I8aKowx1ToXeoVVbIE4LGAjsauvlhjfl0MYacxClLld1VrOw==} 548 + cpu: [arm64] 549 + os: [linux] 550 + 551 + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': 552 + resolution: {integrity: sha512-F51qLdOtpS6P1zJVRzYM0v6MrBNypyPEN1GfMiz0gPu9jN8ScGaEFIZQwteSsGKg799oR5EaP7+B2jHgL+d+Kw==} 553 + cpu: [loong64] 554 + os: [linux] 555 + 556 + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': 557 + resolution: {integrity: sha512-wO0WkfSppfX4YFm5KhdCCpnpGbtgQNj/tgvYzrVYFKDpven8w2N6Gg5nB6w+wAMO3AIfSTWeTjfVe+uZ23zAlg==} 558 + cpu: [ppc64] 559 + os: [linux] 560 + 561 + '@rollup/rollup-linux-riscv64-gnu@4.32.1': 562 + resolution: {integrity: sha512-iWswS9cIXfJO1MFYtI/4jjlrGb/V58oMu4dYJIKnR5UIwbkzR0PJ09O0PDZT0oJ3LYWXBSWahNf/Mjo6i1E5/g==} 563 + cpu: [riscv64] 564 + os: [linux] 565 + 566 + '@rollup/rollup-linux-s390x-gnu@4.32.1': 567 + resolution: {integrity: sha512-RKt8NI9tebzmEthMnfVgG3i/XeECkMPS+ibVZjZ6mNekpbbUmkNWuIN2yHsb/mBPyZke4nlI4YqIdFPgKuoyQQ==} 568 + cpu: [s390x] 569 + os: [linux] 570 + 571 + '@rollup/rollup-linux-x64-gnu@4.32.1': 572 + resolution: {integrity: sha512-WQFLZ9c42ECqEjwg/GHHsouij3pzLXkFdz0UxHa/0OM12LzvX7DzedlY0SIEly2v18YZLRhCRoHZDxbBSWoGYg==} 573 + cpu: [x64] 574 + os: [linux] 575 + 576 + '@rollup/rollup-linux-x64-musl@4.32.1': 577 + resolution: {integrity: sha512-BLoiyHDOWoS3uccNSADMza6V6vCNiphi94tQlVIL5de+r6r/CCQuNnerf+1g2mnk2b6edp5dk0nhdZ7aEjOBsA==} 578 + cpu: [x64] 579 + os: [linux] 580 + 581 + '@rollup/rollup-win32-arm64-msvc@4.32.1': 582 + resolution: {integrity: sha512-w2l3UnlgYTNNU+Z6wOR8YdaioqfEnwPjIsJ66KxKAf0p+AuL2FHeTX6qvM+p/Ue3XPBVNyVSfCrfZiQh7vZHLQ==} 583 + cpu: [arm64] 584 + os: [win32] 585 + 586 + '@rollup/rollup-win32-ia32-msvc@4.32.1': 587 + resolution: {integrity: sha512-Am9H+TGLomPGkBnaPWie4F3x+yQ2rr4Bk2jpwy+iV+Gel9jLAu/KqT8k3X4jxFPW6Zf8OMnehyutsd+eHoq1WQ==} 588 + cpu: [ia32] 589 + os: [win32] 590 + 591 + '@rollup/rollup-win32-x64-msvc@4.32.1': 592 + resolution: {integrity: sha512-ar80GhdZb4DgmW3myIS9nRFYcpJRSME8iqWgzH2i44u+IdrzmiXVxeFnExQ5v4JYUSpg94bWjevMG8JHf1Da5Q==} 593 + cpu: [x64] 594 + os: [win32] 595 + 596 + '@types/estree@1.0.6': 597 + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 598 + 599 + '@types/node@12.20.55': 600 + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 601 + 602 + '@types/node@22.12.0': 603 + resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} 604 + 605 + '@types/resolve@1.20.2': 606 + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 607 + 608 + '@vitest/expect@3.0.4': 609 + resolution: {integrity: sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==} 610 + 611 + '@vitest/mocker@3.0.4': 612 + resolution: {integrity: sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==} 613 + peerDependencies: 614 + msw: ^2.4.9 615 + vite: ^5.0.0 || ^6.0.0 616 + peerDependenciesMeta: 617 + msw: 618 + optional: true 619 + vite: 620 + optional: true 621 + 622 + '@vitest/pretty-format@3.0.4': 623 + resolution: {integrity: sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==} 624 + 625 + '@vitest/runner@3.0.4': 626 + resolution: {integrity: sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==} 627 + 628 + '@vitest/snapshot@3.0.4': 629 + resolution: {integrity: sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==} 630 + 631 + '@vitest/spy@3.0.4': 632 + resolution: {integrity: sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==} 633 + 634 + '@vitest/utils@3.0.4': 635 + resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==} 636 + 637 + acorn@8.14.0: 638 + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 639 + engines: {node: '>=0.4.0'} 640 + hasBin: true 641 + 642 + ansi-colors@4.1.3: 643 + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 644 + engines: {node: '>=6'} 645 + 646 + ansi-escapes@7.0.0: 647 + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} 648 + engines: {node: '>=18'} 649 + 650 + ansi-regex@5.0.1: 651 + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 652 + engines: {node: '>=8'} 653 + 654 + ansi-regex@6.1.0: 655 + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 656 + engines: {node: '>=12'} 657 + 658 + ansi-styles@3.2.1: 659 + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 660 + engines: {node: '>=4'} 661 + 662 + ansi-styles@4.3.0: 663 + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 664 + engines: {node: '>=8'} 665 + 666 + ansi-styles@6.2.1: 667 + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 668 + engines: {node: '>=12'} 669 + 670 + argparse@1.0.10: 671 + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 672 + 673 + array-buffer-byte-length@1.0.2: 674 + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} 675 + engines: {node: '>= 0.4'} 676 + 677 + array-union@2.1.0: 678 + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 679 + engines: {node: '>=8'} 680 + 681 + arraybuffer.prototype.slice@1.0.4: 682 + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} 683 + engines: {node: '>= 0.4'} 684 + 685 + assertion-error@2.0.1: 686 + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} 687 + engines: {node: '>=12'} 688 + 689 + async-function@1.0.0: 690 + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} 691 + engines: {node: '>= 0.4'} 692 + 693 + asynckit@0.4.0: 694 + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 695 + 696 + available-typed-arrays@1.0.7: 697 + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} 698 + engines: {node: '>= 0.4'} 699 + 700 + balanced-match@1.0.2: 701 + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 702 + 703 + better-path-resolve@1.0.0: 704 + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 705 + engines: {node: '>=4'} 706 + 707 + brace-expansion@1.1.11: 708 + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 709 + 710 + brace-expansion@2.0.1: 711 + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 712 + 713 + braces@3.0.3: 714 + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 715 + engines: {node: '>=8'} 716 + 717 + browserslist@4.24.4: 718 + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 719 + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 720 + hasBin: true 721 + 722 + buffer-from@1.1.2: 723 + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 724 + 725 + busboy@0.3.1: 726 + resolution: {integrity: sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==} 727 + engines: {node: '>=4.5.0'} 728 + 729 + cac@6.7.14: 730 + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 731 + engines: {node: '>=8'} 732 + 733 + call-bind-apply-helpers@1.0.1: 734 + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} 735 + engines: {node: '>= 0.4'} 736 + 737 + call-bind@1.0.8: 738 + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} 739 + engines: {node: '>= 0.4'} 740 + 741 + call-bound@1.0.3: 742 + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} 743 + engines: {node: '>= 0.4'} 744 + 745 + caniuse-lite@1.0.30001696: 746 + resolution: {integrity: sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ==} 747 + 748 + chai@5.1.2: 749 + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} 750 + engines: {node: '>=12'} 751 + 752 + chalk@2.4.2: 753 + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 754 + engines: {node: '>=4'} 755 + 756 + chalk@5.4.1: 757 + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 758 + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 759 + 760 + chardet@0.7.0: 761 + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 762 + 763 + check-error@2.1.1: 764 + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} 765 + engines: {node: '>= 16'} 766 + 767 + ci-info@3.9.0: 768 + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 769 + engines: {node: '>=8'} 770 + 771 + cjs-module-lexer@1.4.2: 772 + resolution: {integrity: sha512-7gdnIlr/WqvlQaX6yMvhHbiEVZ07qCV22rb/brgyFGKgo76ckIsrtDp4w2NIOitmKDNgiUm+pfVSE4VMwnkXwQ==} 773 + 774 + cli-cursor@5.0.0: 775 + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} 776 + engines: {node: '>=18'} 777 + 778 + cli-truncate@4.0.0: 779 + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} 780 + engines: {node: '>=18'} 781 + 782 + color-convert@1.9.3: 783 + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 784 + 785 + color-convert@2.0.1: 786 + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 787 + engines: {node: '>=7.0.0'} 788 + 789 + color-name@1.1.3: 790 + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 791 + 792 + color-name@1.1.4: 793 + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 794 + 795 + colorette@2.0.20: 796 + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 797 + 798 + combined-stream@1.0.8: 799 + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 800 + engines: {node: '>= 0.8'} 801 + 802 + commander@13.1.0: 803 + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} 804 + engines: {node: '>=18'} 805 + 806 + commander@2.20.3: 807 + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 808 + 809 + commondir@1.0.1: 810 + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 811 + 812 + concat-map@0.0.1: 813 + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 814 + 815 + convert-source-map@2.0.0: 816 + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 817 + 818 + cross-spawn@6.0.6: 819 + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} 820 + engines: {node: '>=4.8'} 821 + 822 + cross-spawn@7.0.6: 823 + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 824 + engines: {node: '>= 8'} 825 + 826 + data-view-buffer@1.0.2: 827 + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} 828 + engines: {node: '>= 0.4'} 829 + 830 + data-view-byte-length@1.0.2: 831 + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} 832 + engines: {node: '>= 0.4'} 833 + 834 + data-view-byte-offset@1.0.1: 835 + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} 836 + engines: {node: '>= 0.4'} 837 + 838 + dataloader@1.4.0: 839 + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} 840 + 841 + debug@4.4.0: 842 + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 843 + engines: {node: '>=6.0'} 844 + peerDependencies: 845 + supports-color: '*' 846 + peerDependenciesMeta: 847 + supports-color: 848 + optional: true 849 + 850 + deep-eql@5.0.2: 851 + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} 852 + engines: {node: '>=6'} 853 + 854 + deepmerge@4.3.1: 855 + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 856 + engines: {node: '>=0.10.0'} 857 + 858 + define-data-property@1.1.4: 859 + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 860 + engines: {node: '>= 0.4'} 861 + 862 + define-properties@1.2.1: 863 + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 864 + engines: {node: '>= 0.4'} 865 + 866 + delayed-stream@1.0.0: 867 + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 868 + engines: {node: '>=0.4.0'} 869 + 870 + detect-indent@6.1.0: 871 + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 872 + engines: {node: '>=8'} 873 + 874 + dicer@0.3.0: 875 + resolution: {integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==} 876 + engines: {node: '>=4.5.0'} 877 + 878 + dir-glob@3.0.1: 879 + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 880 + engines: {node: '>=8'} 881 + 882 + dotenv@16.4.7: 883 + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} 884 + engines: {node: '>=12'} 885 + 886 + dunder-proto@1.0.1: 887 + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} 888 + engines: {node: '>= 0.4'} 889 + 890 + eastasianwidth@0.2.0: 891 + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 892 + 893 + electron-to-chromium@1.5.90: 894 + resolution: {integrity: sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug==} 895 + 896 + emoji-regex@10.4.0: 897 + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} 898 + 899 + emoji-regex@8.0.0: 900 + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 901 + 902 + emoji-regex@9.2.2: 903 + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 904 + 905 + enquirer@2.4.1: 906 + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 907 + engines: {node: '>=8.6'} 908 + 909 + environment@1.1.0: 910 + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} 911 + engines: {node: '>=18'} 912 + 913 + error-ex@1.3.2: 914 + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 915 + 916 + es-abstract@1.23.9: 917 + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} 918 + engines: {node: '>= 0.4'} 919 + 920 + es-define-property@1.0.1: 921 + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} 922 + engines: {node: '>= 0.4'} 923 + 924 + es-errors@1.3.0: 925 + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 926 + engines: {node: '>= 0.4'} 927 + 928 + es-module-lexer@1.6.0: 929 + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 930 + 931 + es-object-atoms@1.1.1: 932 + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} 933 + engines: {node: '>= 0.4'} 934 + 935 + es-set-tostringtag@2.1.0: 936 + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} 937 + engines: {node: '>= 0.4'} 938 + 939 + es-to-primitive@1.3.0: 940 + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} 941 + engines: {node: '>= 0.4'} 942 + 943 + esbuild@0.24.2: 944 + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} 945 + engines: {node: '>=18'} 946 + hasBin: true 947 + 948 + escalade@3.2.0: 949 + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 950 + engines: {node: '>=6'} 951 + 952 + escape-string-regexp@1.0.5: 953 + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 954 + engines: {node: '>=0.8.0'} 955 + 956 + esprima@4.0.1: 957 + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 958 + engines: {node: '>=4'} 959 + hasBin: true 960 + 961 + estree-walker@2.0.2: 962 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 963 + 964 + estree-walker@3.0.3: 965 + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 966 + 967 + eventemitter3@5.0.1: 968 + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 969 + 970 + execa@8.0.1: 971 + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 972 + engines: {node: '>=16.17'} 973 + 974 + expect-type@1.1.0: 975 + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} 976 + engines: {node: '>=12.0.0'} 977 + 978 + extendable-error@0.1.7: 979 + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 980 + 981 + external-editor@3.1.0: 982 + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 983 + engines: {node: '>=4'} 984 + 985 + fast-glob@3.3.3: 986 + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 987 + engines: {node: '>=8.6.0'} 988 + 989 + fastq@1.19.0: 990 + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} 991 + 992 + fdir@6.4.3: 993 + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 994 + peerDependencies: 995 + picomatch: ^3 || ^4 996 + peerDependenciesMeta: 997 + picomatch: 998 + optional: true 999 + 1000 + fill-range@7.1.1: 1001 + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1002 + engines: {node: '>=8'} 1003 + 1004 + find-up@4.1.0: 1005 + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1006 + engines: {node: '>=8'} 1007 + 1008 + for-each@0.3.4: 1009 + resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} 1010 + engines: {node: '>= 0.4'} 1011 + 1012 + foreground-child@3.3.0: 1013 + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 1014 + engines: {node: '>=14'} 1015 + 1016 + form-data@4.0.1: 1017 + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} 1018 + engines: {node: '>= 6'} 1019 + 1020 + fs-extra@7.0.1: 1021 + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 1022 + engines: {node: '>=6 <7 || >=8'} 1023 + 1024 + fs-extra@8.1.0: 1025 + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 1026 + engines: {node: '>=6 <7 || >=8'} 1027 + 1028 + fsevents@2.3.3: 1029 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1030 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1031 + os: [darwin] 1032 + 1033 + function-bind@1.1.2: 1034 + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1035 + 1036 + function.prototype.name@1.1.8: 1037 + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} 1038 + engines: {node: '>= 0.4'} 1039 + 1040 + functions-have-names@1.2.3: 1041 + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1042 + 1043 + gensync@1.0.0-beta.2: 1044 + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1045 + engines: {node: '>=6.9.0'} 1046 + 1047 + get-east-asian-width@1.3.0: 1048 + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} 1049 + engines: {node: '>=18'} 1050 + 1051 + get-intrinsic@1.2.7: 1052 + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} 1053 + engines: {node: '>= 0.4'} 1054 + 1055 + get-proto@1.0.1: 1056 + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} 1057 + engines: {node: '>= 0.4'} 1058 + 1059 + get-stream@8.0.1: 1060 + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 1061 + engines: {node: '>=16'} 1062 + 1063 + get-symbol-description@1.1.0: 1064 + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} 1065 + engines: {node: '>= 0.4'} 1066 + 1067 + glob-parent@5.1.2: 1068 + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1069 + engines: {node: '>= 6'} 1070 + 1071 + glob@11.0.1: 1072 + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} 1073 + engines: {node: 20 || >=22} 1074 + hasBin: true 1075 + 1076 + globals@11.12.0: 1077 + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1078 + engines: {node: '>=4'} 1079 + 1080 + globalthis@1.0.4: 1081 + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} 1082 + engines: {node: '>= 0.4'} 1083 + 1084 + globby@11.1.0: 1085 + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1086 + engines: {node: '>=10'} 1087 + 1088 + gopd@1.2.0: 1089 + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} 1090 + engines: {node: '>= 0.4'} 1091 + 1092 + graceful-fs@4.2.11: 1093 + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1094 + 1095 + has-bigints@1.1.0: 1096 + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} 1097 + engines: {node: '>= 0.4'} 1098 + 1099 + has-flag@3.0.0: 1100 + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1101 + engines: {node: '>=4'} 1102 + 1103 + has-property-descriptors@1.0.2: 1104 + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 1105 + 1106 + has-proto@1.2.0: 1107 + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} 1108 + engines: {node: '>= 0.4'} 1109 + 1110 + has-symbols@1.1.0: 1111 + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} 1112 + engines: {node: '>= 0.4'} 1113 + 1114 + has-tostringtag@1.0.2: 1115 + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1116 + engines: {node: '>= 0.4'} 1117 + 1118 + hasown@2.0.2: 1119 + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1120 + engines: {node: '>= 0.4'} 1121 + 1122 + hosted-git-info@2.8.9: 1123 + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 1124 + 1125 + human-id@1.0.2: 1126 + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} 1127 + 1128 + human-signals@5.0.0: 1129 + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 1130 + engines: {node: '>=16.17.0'} 1131 + 1132 + iconv-lite@0.4.24: 1133 + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1134 + engines: {node: '>=0.10.0'} 1135 + 1136 + ignore@5.3.2: 1137 + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 1138 + engines: {node: '>= 4'} 1139 + 1140 + internal-slot@1.1.0: 1141 + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} 1142 + engines: {node: '>= 0.4'} 1143 + 1144 + is-array-buffer@3.0.5: 1145 + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} 1146 + engines: {node: '>= 0.4'} 1147 + 1148 + is-arrayish@0.2.1: 1149 + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1150 + 1151 + is-async-function@2.1.1: 1152 + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} 1153 + engines: {node: '>= 0.4'} 1154 + 1155 + is-bigint@1.1.0: 1156 + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} 1157 + engines: {node: '>= 0.4'} 1158 + 1159 + is-boolean-object@1.2.1: 1160 + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} 1161 + engines: {node: '>= 0.4'} 1162 + 1163 + is-callable@1.2.7: 1164 + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1165 + engines: {node: '>= 0.4'} 1166 + 1167 + is-core-module@2.16.1: 1168 + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1169 + engines: {node: '>= 0.4'} 1170 + 1171 + is-data-view@1.0.2: 1172 + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} 1173 + engines: {node: '>= 0.4'} 1174 + 1175 + is-date-object@1.1.0: 1176 + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} 1177 + engines: {node: '>= 0.4'} 1178 + 1179 + is-extglob@2.1.1: 1180 + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1181 + engines: {node: '>=0.10.0'} 1182 + 1183 + is-finalizationregistry@1.1.1: 1184 + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} 1185 + engines: {node: '>= 0.4'} 1186 + 1187 + is-fullwidth-code-point@3.0.0: 1188 + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1189 + engines: {node: '>=8'} 1190 + 1191 + is-fullwidth-code-point@4.0.0: 1192 + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} 1193 + engines: {node: '>=12'} 1194 + 1195 + is-fullwidth-code-point@5.0.0: 1196 + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} 1197 + engines: {node: '>=18'} 1198 + 1199 + is-generator-function@1.1.0: 1200 + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} 1201 + engines: {node: '>= 0.4'} 1202 + 1203 + is-glob@4.0.3: 1204 + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1205 + engines: {node: '>=0.10.0'} 1206 + 1207 + is-map@2.0.3: 1208 + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} 1209 + engines: {node: '>= 0.4'} 1210 + 1211 + is-module@1.0.0: 1212 + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 1213 + 1214 + is-number-object@1.1.1: 1215 + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} 1216 + engines: {node: '>= 0.4'} 1217 + 1218 + is-number@7.0.0: 1219 + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1220 + engines: {node: '>=0.12.0'} 1221 + 1222 + is-reference@1.2.1: 1223 + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 1224 + 1225 + is-regex@1.2.1: 1226 + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} 1227 + engines: {node: '>= 0.4'} 1228 + 1229 + is-set@2.0.3: 1230 + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} 1231 + engines: {node: '>= 0.4'} 1232 + 1233 + is-shared-array-buffer@1.0.4: 1234 + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} 1235 + engines: {node: '>= 0.4'} 1236 + 1237 + is-stream@3.0.0: 1238 + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1239 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1240 + 1241 + is-string@1.1.1: 1242 + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} 1243 + engines: {node: '>= 0.4'} 1244 + 1245 + is-subdir@1.2.0: 1246 + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 1247 + engines: {node: '>=4'} 1248 + 1249 + is-symbol@1.1.1: 1250 + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} 1251 + engines: {node: '>= 0.4'} 1252 + 1253 + is-typed-array@1.1.15: 1254 + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} 1255 + engines: {node: '>= 0.4'} 1256 + 1257 + is-weakmap@2.0.2: 1258 + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} 1259 + engines: {node: '>= 0.4'} 1260 + 1261 + is-weakref@1.1.0: 1262 + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} 1263 + engines: {node: '>= 0.4'} 1264 + 1265 + is-weakset@2.0.4: 1266 + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} 1267 + engines: {node: '>= 0.4'} 1268 + 1269 + is-windows@1.0.2: 1270 + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 1271 + engines: {node: '>=0.10.0'} 1272 + 1273 + isarray@2.0.5: 1274 + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1275 + 1276 + isexe@2.0.0: 1277 + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1278 + 1279 + jackspeak@4.0.2: 1280 + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} 1281 + engines: {node: 20 || >=22} 1282 + 1283 + js-tokens@4.0.0: 1284 + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1285 + 1286 + js-yaml@3.14.1: 1287 + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1288 + hasBin: true 1289 + 1290 + jsesc@3.1.0: 1291 + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 1292 + engines: {node: '>=6'} 1293 + hasBin: true 1294 + 1295 + json-parse-better-errors@1.0.2: 1296 + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 1297 + 1298 + json5@2.2.3: 1299 + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1300 + engines: {node: '>=6'} 1301 + hasBin: true 1302 + 1303 + jsonfile@4.0.0: 1304 + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 1305 + 1306 + lilconfig@3.1.3: 1307 + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} 1308 + engines: {node: '>=14'} 1309 + 1310 + lint-staged@15.4.3: 1311 + resolution: {integrity: sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==} 1312 + engines: {node: '>=18.12.0'} 1313 + hasBin: true 1314 + 1315 + listr2@8.2.5: 1316 + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} 1317 + engines: {node: '>=18.0.0'} 1318 + 1319 + load-json-file@4.0.0: 1320 + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} 1321 + engines: {node: '>=4'} 1322 + 1323 + locate-path@5.0.0: 1324 + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1325 + engines: {node: '>=8'} 1326 + 1327 + lodash.startcase@4.4.0: 1328 + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 1329 + 1330 + log-update@6.1.0: 1331 + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} 1332 + engines: {node: '>=18'} 1333 + 1334 + loupe@3.1.3: 1335 + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} 1336 + 1337 + lru-cache@11.0.2: 1338 + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} 1339 + engines: {node: 20 || >=22} 1340 + 1341 + lru-cache@5.1.1: 1342 + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 1343 + 1344 + magic-string@0.30.17: 1345 + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 1346 + 1347 + math-intrinsics@1.1.0: 1348 + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} 1349 + engines: {node: '>= 0.4'} 1350 + 1351 + memorystream@0.3.1: 1352 + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} 1353 + engines: {node: '>= 0.10.0'} 1354 + 1355 + merge-stream@2.0.0: 1356 + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1357 + 1358 + merge2@1.4.1: 1359 + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1360 + engines: {node: '>= 8'} 1361 + 1362 + micromatch@4.0.8: 1363 + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1364 + engines: {node: '>=8.6'} 1365 + 1366 + mime-db@1.52.0: 1367 + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1368 + engines: {node: '>= 0.6'} 1369 + 1370 + mime-types@2.1.35: 1371 + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1372 + engines: {node: '>= 0.6'} 1373 + 1374 + mimic-fn@4.0.0: 1375 + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1376 + engines: {node: '>=12'} 1377 + 1378 + mimic-function@5.0.1: 1379 + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} 1380 + engines: {node: '>=18'} 1381 + 1382 + minimatch@10.0.1: 1383 + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 1384 + engines: {node: 20 || >=22} 1385 + 1386 + minimatch@3.1.2: 1387 + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1388 + 1389 + minipass@7.1.2: 1390 + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1391 + engines: {node: '>=16 || 14 >=14.17'} 1392 + 1393 + mri@1.2.0: 1394 + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1395 + engines: {node: '>=4'} 1396 + 1397 + ms@2.1.3: 1398 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1399 + 1400 + nanoid@3.3.8: 1401 + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} 1402 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1403 + hasBin: true 1404 + 1405 + nice-try@1.0.5: 1406 + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} 1407 + 1408 + node-fetch@2.7.0: 1409 + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 1410 + engines: {node: 4.x || >=6.0.0} 1411 + peerDependencies: 1412 + encoding: ^0.1.0 1413 + peerDependenciesMeta: 1414 + encoding: 1415 + optional: true 1416 + 1417 + node-releases@2.0.19: 1418 + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1419 + 1420 + normalize-package-data@2.5.0: 1421 + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1422 + 1423 + npm-run-all@4.1.5: 1424 + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} 1425 + engines: {node: '>= 4'} 1426 + hasBin: true 1427 + 1428 + npm-run-path@5.3.0: 1429 + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 1430 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1431 + 1432 + object-inspect@1.13.3: 1433 + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} 1434 + engines: {node: '>= 0.4'} 1435 + 1436 + object-keys@1.1.1: 1437 + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1438 + engines: {node: '>= 0.4'} 1439 + 1440 + object.assign@4.1.7: 1441 + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} 1442 + engines: {node: '>= 0.4'} 1443 + 1444 + onetime@6.0.0: 1445 + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1446 + engines: {node: '>=12'} 1447 + 1448 + onetime@7.0.0: 1449 + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} 1450 + engines: {node: '>=18'} 1451 + 1452 + os-tmpdir@1.0.2: 1453 + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 1454 + engines: {node: '>=0.10.0'} 1455 + 1456 + outdent@0.5.0: 1457 + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 1458 + 1459 + own-keys@1.0.1: 1460 + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} 1461 + engines: {node: '>= 0.4'} 1462 + 1463 + p-filter@2.1.0: 1464 + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 1465 + engines: {node: '>=8'} 1466 + 1467 + p-limit@2.3.0: 1468 + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1469 + engines: {node: '>=6'} 1470 + 1471 + p-locate@4.1.0: 1472 + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1473 + engines: {node: '>=8'} 1474 + 1475 + p-map@2.1.0: 1476 + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 1477 + engines: {node: '>=6'} 1478 + 1479 + p-try@2.2.0: 1480 + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1481 + engines: {node: '>=6'} 1482 + 1483 + package-json-from-dist@1.0.1: 1484 + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1485 + 1486 + package-manager-detector@0.2.9: 1487 + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} 1488 + 1489 + parse-json@4.0.0: 1490 + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} 1491 + engines: {node: '>=4'} 1492 + 1493 + path-exists@4.0.0: 1494 + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1495 + engines: {node: '>=8'} 1496 + 1497 + path-key@2.0.1: 1498 + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 1499 + engines: {node: '>=4'} 1500 + 1501 + path-key@3.1.1: 1502 + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1503 + engines: {node: '>=8'} 1504 + 1505 + path-key@4.0.0: 1506 + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1507 + engines: {node: '>=12'} 1508 + 1509 + path-parse@1.0.7: 1510 + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1511 + 1512 + path-scurry@2.0.0: 1513 + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 1514 + engines: {node: 20 || >=22} 1515 + 1516 + path-type@3.0.0: 1517 + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} 1518 + engines: {node: '>=4'} 1519 + 1520 + path-type@4.0.0: 1521 + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1522 + engines: {node: '>=8'} 1523 + 1524 + pathe@2.0.2: 1525 + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} 1526 + 1527 + pathval@2.0.0: 1528 + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} 1529 + engines: {node: '>= 14.16'} 1530 + 1531 + picocolors@1.1.1: 1532 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1533 + 1534 + picomatch@2.3.1: 1535 + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1536 + engines: {node: '>=8.6'} 1537 + 1538 + picomatch@4.0.2: 1539 + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1540 + engines: {node: '>=12'} 1541 + 1542 + pidtree@0.3.1: 1543 + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} 1544 + engines: {node: '>=0.10'} 1545 + hasBin: true 1546 + 1547 + pidtree@0.6.0: 1548 + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} 1549 + engines: {node: '>=0.10'} 1550 + hasBin: true 1551 + 1552 + pify@3.0.0: 1553 + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} 1554 + engines: {node: '>=4'} 1555 + 1556 + pify@4.0.1: 1557 + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 1558 + engines: {node: '>=6'} 1559 + 1560 + possible-typed-array-names@1.0.0: 1561 + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} 1562 + engines: {node: '>= 0.4'} 1563 + 1564 + postcss@8.5.1: 1565 + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} 1566 + engines: {node: ^10 || ^12 || >=14} 1567 + 1568 + prettier@2.8.8: 1569 + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 1570 + engines: {node: '>=10.13.0'} 1571 + hasBin: true 1572 + 1573 + prettier@3.4.2: 1574 + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} 1575 + engines: {node: '>=14'} 1576 + hasBin: true 1577 + 1578 + queue-microtask@1.2.3: 1579 + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1580 + 1581 + randombytes@2.1.0: 1582 + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1583 + 1584 + read-pkg@3.0.0: 1585 + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} 1586 + engines: {node: '>=4'} 1587 + 1588 + read-yaml-file@1.1.0: 1589 + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 1590 + engines: {node: '>=6'} 1591 + 1592 + reflect.getprototypeof@1.0.10: 1593 + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} 1594 + engines: {node: '>= 0.4'} 1595 + 1596 + regenerator-runtime@0.14.1: 1597 + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1598 + 1599 + regexp.prototype.flags@1.5.4: 1600 + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} 1601 + engines: {node: '>= 0.4'} 1602 + 1603 + resolve-from@5.0.0: 1604 + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1605 + engines: {node: '>=8'} 1606 + 1607 + resolve@1.22.10: 1608 + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1609 + engines: {node: '>= 0.4'} 1610 + hasBin: true 1611 + 1612 + restore-cursor@5.1.0: 1613 + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} 1614 + engines: {node: '>=18'} 1615 + 1616 + reusify@1.0.4: 1617 + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1618 + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1619 + 1620 + rfdc@1.4.1: 1621 + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} 1622 + 1623 + rimraf@6.0.1: 1624 + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} 1625 + engines: {node: 20 || >=22} 1626 + hasBin: true 1627 + 1628 + rollup-plugin-cjs-check@1.0.3: 1629 + resolution: {integrity: sha512-l8Gn8fm0YsAUuCVPmJ9CjwX5D98xyjc7iBlKfik5RGgXrV35nBwKCb+xbsK2oMrWMIRdLWsfyVUBM153e2zvYg==} 1630 + engines: {node: '>=14.0.0'} 1631 + peerDependencies: 1632 + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 1633 + 1634 + rollup-plugin-dts@6.1.1: 1635 + resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} 1636 + engines: {node: '>=16'} 1637 + peerDependencies: 1638 + rollup: ^3.29.4 || ^4 1639 + typescript: ^4.5 || ^5.0 1640 + 1641 + rollup@4.32.1: 1642 + resolution: {integrity: sha512-z+aeEsOeEa3mEbS1Tjl6sAZ8NE3+AalQz1RJGj81M+fizusbdDMoEJwdJNHfaB40Scr4qNu+welOfes7maKonA==} 1643 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1644 + hasBin: true 1645 + 1646 + run-parallel@1.2.0: 1647 + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1648 + 1649 + safe-array-concat@1.1.3: 1650 + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} 1651 + engines: {node: '>=0.4'} 1652 + 1653 + safe-buffer@5.2.1: 1654 + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1655 + 1656 + safe-push-apply@1.0.0: 1657 + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} 1658 + engines: {node: '>= 0.4'} 1659 + 1660 + safe-regex-test@1.1.0: 1661 + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} 1662 + engines: {node: '>= 0.4'} 1663 + 1664 + safer-buffer@2.1.2: 1665 + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1666 + 1667 + semver@5.7.2: 1668 + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1669 + hasBin: true 1670 + 1671 + semver@6.3.1: 1672 + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1673 + hasBin: true 1674 + 1675 + semver@7.7.0: 1676 + resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==} 1677 + engines: {node: '>=10'} 1678 + hasBin: true 1679 + 1680 + serialize-javascript@6.0.2: 1681 + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1682 + 1683 + set-function-length@1.2.2: 1684 + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1685 + engines: {node: '>= 0.4'} 1686 + 1687 + set-function-name@2.0.2: 1688 + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} 1689 + engines: {node: '>= 0.4'} 1690 + 1691 + set-proto@1.0.0: 1692 + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} 1693 + engines: {node: '>= 0.4'} 1694 + 1695 + shebang-command@1.2.0: 1696 + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 1697 + engines: {node: '>=0.10.0'} 1698 + 1699 + shebang-command@2.0.0: 1700 + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1701 + engines: {node: '>=8'} 1702 + 1703 + shebang-regex@1.0.0: 1704 + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 1705 + engines: {node: '>=0.10.0'} 1706 + 1707 + shebang-regex@3.0.0: 1708 + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1709 + engines: {node: '>=8'} 1710 + 1711 + shell-quote@1.8.2: 1712 + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} 1713 + engines: {node: '>= 0.4'} 1714 + 1715 + side-channel-list@1.0.0: 1716 + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} 1717 + engines: {node: '>= 0.4'} 1718 + 1719 + side-channel-map@1.0.1: 1720 + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} 1721 + engines: {node: '>= 0.4'} 1722 + 1723 + side-channel-weakmap@1.0.2: 1724 + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} 1725 + engines: {node: '>= 0.4'} 1726 + 1727 + side-channel@1.1.0: 1728 + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} 1729 + engines: {node: '>= 0.4'} 1730 + 1731 + siginfo@2.0.0: 1732 + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1733 + 1734 + signal-exit@4.1.0: 1735 + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1736 + engines: {node: '>=14'} 1737 + 1738 + slash@3.0.0: 1739 + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1740 + engines: {node: '>=8'} 1741 + 1742 + slice-ansi@5.0.0: 1743 + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 1744 + engines: {node: '>=12'} 1745 + 1746 + slice-ansi@7.1.0: 1747 + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} 1748 + engines: {node: '>=18'} 1749 + 1750 + smob@1.5.0: 1751 + resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} 1752 + 1753 + source-map-js@1.2.1: 1754 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1755 + engines: {node: '>=0.10.0'} 1756 + 1757 + source-map-support@0.5.21: 1758 + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1759 + 1760 + source-map@0.6.1: 1761 + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1762 + engines: {node: '>=0.10.0'} 1763 + 1764 + spawndamnit@3.0.1: 1765 + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} 1766 + 1767 + spdx-correct@3.2.0: 1768 + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1769 + 1770 + spdx-exceptions@2.5.0: 1771 + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} 1772 + 1773 + spdx-expression-parse@3.0.1: 1774 + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1775 + 1776 + spdx-license-ids@3.0.21: 1777 + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} 1778 + 1779 + sprintf-js@1.0.3: 1780 + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1781 + 1782 + stackback@0.0.2: 1783 + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1784 + 1785 + std-env@3.8.0: 1786 + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} 1787 + 1788 + streamsearch@0.1.2: 1789 + resolution: {integrity: sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==} 1790 + engines: {node: '>=0.8.0'} 1791 + 1792 + string-argv@0.3.2: 1793 + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 1794 + engines: {node: '>=0.6.19'} 1795 + 1796 + string-width@4.2.3: 1797 + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1798 + engines: {node: '>=8'} 1799 + 1800 + string-width@5.1.2: 1801 + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1802 + engines: {node: '>=12'} 1803 + 1804 + string-width@7.2.0: 1805 + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 1806 + engines: {node: '>=18'} 1807 + 1808 + string.prototype.padend@3.1.6: 1809 + resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} 1810 + engines: {node: '>= 0.4'} 1811 + 1812 + string.prototype.trim@1.2.10: 1813 + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} 1814 + engines: {node: '>= 0.4'} 1815 + 1816 + string.prototype.trimend@1.0.9: 1817 + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} 1818 + engines: {node: '>= 0.4'} 1819 + 1820 + string.prototype.trimstart@1.0.8: 1821 + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} 1822 + engines: {node: '>= 0.4'} 1823 + 1824 + strip-ansi@6.0.1: 1825 + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1826 + engines: {node: '>=8'} 1827 + 1828 + strip-ansi@7.1.0: 1829 + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1830 + engines: {node: '>=12'} 1831 + 1832 + strip-bom@3.0.0: 1833 + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1834 + engines: {node: '>=4'} 1835 + 1836 + strip-final-newline@3.0.0: 1837 + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1838 + engines: {node: '>=12'} 1839 + 1840 + supports-color@5.5.0: 1841 + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1842 + engines: {node: '>=4'} 1843 + 1844 + supports-preserve-symlinks-flag@1.0.0: 1845 + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1846 + engines: {node: '>= 0.4'} 1847 + 1848 + term-size@2.2.1: 1849 + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 1850 + engines: {node: '>=8'} 1851 + 1852 + terser@5.37.0: 1853 + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} 1854 + engines: {node: '>=10'} 1855 + hasBin: true 1856 + 1857 + tinybench@2.9.0: 1858 + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} 1859 + 1860 + tinyexec@0.3.2: 1861 + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} 1862 + 1863 + tinypool@1.0.2: 1864 + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} 1865 + engines: {node: ^18.0.0 || >=20.0.0} 1866 + 1867 + tinyrainbow@2.0.0: 1868 + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} 1869 + engines: {node: '>=14.0.0'} 1870 + 1871 + tinyspy@3.0.2: 1872 + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} 1873 + engines: {node: '>=14.0.0'} 1874 + 1875 + tmp@0.0.33: 1876 + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 1877 + engines: {node: '>=0.6.0'} 1878 + 1879 + to-regex-range@5.0.1: 1880 + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1881 + engines: {node: '>=8.0'} 1882 + 1883 + tr46@0.0.3: 1884 + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 1885 + 1886 + typed-array-buffer@1.0.3: 1887 + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} 1888 + engines: {node: '>= 0.4'} 1889 + 1890 + typed-array-byte-length@1.0.3: 1891 + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} 1892 + engines: {node: '>= 0.4'} 1893 + 1894 + typed-array-byte-offset@1.0.4: 1895 + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} 1896 + engines: {node: '>= 0.4'} 1897 + 1898 + typed-array-length@1.0.7: 1899 + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} 1900 + engines: {node: '>= 0.4'} 1901 + 1902 + typescript@5.7.3: 1903 + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 1904 + engines: {node: '>=14.17'} 1905 + hasBin: true 1906 + 1907 + unbox-primitive@1.1.0: 1908 + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 1909 + engines: {node: '>= 0.4'} 1910 + 1911 + undici-types@6.20.0: 1912 + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1913 + 1914 + undici-types@7.3.0: 1915 + resolution: {integrity: sha512-z2pHpkN2BEJl3QlQo0GtfGCyuhuBbWX60vzGwyn7ex/seM2UkvyGEfEV0Qb9pXc5StNfcJpsstgaf2YTEJa63Q==} 1916 + 1917 + universalify@0.1.2: 1918 + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 1919 + engines: {node: '>= 4.0.0'} 1920 + 1921 + update-browserslist-db@1.1.2: 1922 + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} 1923 + hasBin: true 1924 + peerDependencies: 1925 + browserslist: '>= 4.21.0' 1926 + 1927 + validate-npm-package-license@3.0.4: 1928 + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1929 + 1930 + vite-node@3.0.4: 1931 + resolution: {integrity: sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==} 1932 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1933 + hasBin: true 1934 + 1935 + vite@6.0.11: 1936 + resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} 1937 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1938 + hasBin: true 1939 + peerDependencies: 1940 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1941 + jiti: '>=1.21.0' 1942 + less: '*' 1943 + lightningcss: ^1.21.0 1944 + sass: '*' 1945 + sass-embedded: '*' 1946 + stylus: '*' 1947 + sugarss: '*' 1948 + terser: ^5.16.0 1949 + tsx: ^4.8.1 1950 + yaml: ^2.4.2 1951 + peerDependenciesMeta: 1952 + '@types/node': 1953 + optional: true 1954 + jiti: 1955 + optional: true 1956 + less: 1957 + optional: true 1958 + lightningcss: 1959 + optional: true 1960 + sass: 1961 + optional: true 1962 + sass-embedded: 1963 + optional: true 1964 + stylus: 1965 + optional: true 1966 + sugarss: 1967 + optional: true 1968 + terser: 1969 + optional: true 1970 + tsx: 1971 + optional: true 1972 + yaml: 1973 + optional: true 1974 + 1975 + vitest@3.0.4: 1976 + resolution: {integrity: sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==} 1977 + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 1978 + hasBin: true 1979 + peerDependencies: 1980 + '@edge-runtime/vm': '*' 1981 + '@types/debug': ^4.1.12 1982 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 1983 + '@vitest/browser': 3.0.4 1984 + '@vitest/ui': 3.0.4 1985 + happy-dom: '*' 1986 + jsdom: '*' 1987 + peerDependenciesMeta: 1988 + '@edge-runtime/vm': 1989 + optional: true 1990 + '@types/debug': 1991 + optional: true 1992 + '@types/node': 1993 + optional: true 1994 + '@vitest/browser': 1995 + optional: true 1996 + '@vitest/ui': 1997 + optional: true 1998 + happy-dom: 1999 + optional: true 2000 + jsdom: 2001 + optional: true 2002 + 2003 + webidl-conversions@3.0.1: 2004 + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2005 + 2006 + whatwg-url@5.0.0: 2007 + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2008 + 2009 + which-boxed-primitive@1.1.1: 2010 + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} 2011 + engines: {node: '>= 0.4'} 2012 + 2013 + which-builtin-type@1.2.1: 2014 + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} 2015 + engines: {node: '>= 0.4'} 2016 + 2017 + which-collection@1.0.2: 2018 + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} 2019 + engines: {node: '>= 0.4'} 2020 + 2021 + which-typed-array@1.1.18: 2022 + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} 2023 + engines: {node: '>= 0.4'} 2024 + 2025 + which@1.3.1: 2026 + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 2027 + hasBin: true 2028 + 2029 + which@2.0.2: 2030 + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2031 + engines: {node: '>= 8'} 2032 + hasBin: true 2033 + 2034 + why-is-node-running@2.3.0: 2035 + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} 2036 + engines: {node: '>=8'} 2037 + hasBin: true 2038 + 2039 + wrap-ansi@7.0.0: 2040 + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2041 + engines: {node: '>=10'} 2042 + 2043 + wrap-ansi@8.1.0: 2044 + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2045 + engines: {node: '>=12'} 2046 + 2047 + wrap-ansi@9.0.0: 2048 + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} 2049 + engines: {node: '>=18'} 2050 + 2051 + yallist@3.1.1: 2052 + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2053 + 2054 + yaml@2.7.0: 2055 + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} 2056 + engines: {node: '>= 14'} 2057 + hasBin: true 2058 + 2059 + snapshots: 2060 + 2061 + '@ampproject/remapping@2.3.0': 2062 + dependencies: 2063 + '@jridgewell/gen-mapping': 0.3.8 2064 + '@jridgewell/trace-mapping': 0.3.25 2065 + 2066 + '@babel/code-frame@7.26.2': 2067 + dependencies: 2068 + '@babel/helper-validator-identifier': 7.25.9 2069 + js-tokens: 4.0.0 2070 + picocolors: 1.1.1 2071 + 2072 + '@babel/compat-data@7.26.5': {} 2073 + 2074 + '@babel/core@7.26.7': 2075 + dependencies: 2076 + '@ampproject/remapping': 2.3.0 2077 + '@babel/code-frame': 7.26.2 2078 + '@babel/generator': 7.26.5 2079 + '@babel/helper-compilation-targets': 7.26.5 2080 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7) 2081 + '@babel/helpers': 7.26.7 2082 + '@babel/parser': 7.26.7 2083 + '@babel/template': 7.25.9 2084 + '@babel/traverse': 7.26.7 2085 + '@babel/types': 7.26.7 2086 + convert-source-map: 2.0.0 2087 + debug: 4.4.0 2088 + gensync: 1.0.0-beta.2 2089 + json5: 2.2.3 2090 + semver: 6.3.1 2091 + transitivePeerDependencies: 2092 + - supports-color 2093 + 2094 + '@babel/generator@7.26.5': 2095 + dependencies: 2096 + '@babel/parser': 7.26.7 2097 + '@babel/types': 7.26.7 2098 + '@jridgewell/gen-mapping': 0.3.8 2099 + '@jridgewell/trace-mapping': 0.3.25 2100 + jsesc: 3.1.0 2101 + 2102 + '@babel/helper-annotate-as-pure@7.25.9': 2103 + dependencies: 2104 + '@babel/types': 7.26.7 2105 + 2106 + '@babel/helper-compilation-targets@7.26.5': 2107 + dependencies: 2108 + '@babel/compat-data': 7.26.5 2109 + '@babel/helper-validator-option': 7.25.9 2110 + browserslist: 4.24.4 2111 + lru-cache: 5.1.1 2112 + semver: 6.3.1 2113 + 2114 + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.7)': 2115 + dependencies: 2116 + '@babel/core': 7.26.7 2117 + '@babel/helper-annotate-as-pure': 7.25.9 2118 + '@babel/helper-member-expression-to-functions': 7.25.9 2119 + '@babel/helper-optimise-call-expression': 7.25.9 2120 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.7) 2121 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 2122 + '@babel/traverse': 7.26.7 2123 + semver: 6.3.1 2124 + transitivePeerDependencies: 2125 + - supports-color 2126 + 2127 + '@babel/helper-member-expression-to-functions@7.25.9': 2128 + dependencies: 2129 + '@babel/traverse': 7.26.7 2130 + '@babel/types': 7.26.7 2131 + transitivePeerDependencies: 2132 + - supports-color 2133 + 2134 + '@babel/helper-module-imports@7.25.9': 2135 + dependencies: 2136 + '@babel/traverse': 7.26.7 2137 + '@babel/types': 7.26.7 2138 + transitivePeerDependencies: 2139 + - supports-color 2140 + 2141 + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)': 2142 + dependencies: 2143 + '@babel/core': 7.26.7 2144 + '@babel/helper-module-imports': 7.25.9 2145 + '@babel/helper-validator-identifier': 7.25.9 2146 + '@babel/traverse': 7.26.7 2147 + transitivePeerDependencies: 2148 + - supports-color 2149 + 2150 + '@babel/helper-optimise-call-expression@7.25.9': 2151 + dependencies: 2152 + '@babel/types': 7.26.7 2153 + 2154 + '@babel/helper-plugin-utils@7.26.5': {} 2155 + 2156 + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.7)': 2157 + dependencies: 2158 + '@babel/core': 7.26.7 2159 + '@babel/helper-member-expression-to-functions': 7.25.9 2160 + '@babel/helper-optimise-call-expression': 7.25.9 2161 + '@babel/traverse': 7.26.7 2162 + transitivePeerDependencies: 2163 + - supports-color 2164 + 2165 + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': 2166 + dependencies: 2167 + '@babel/traverse': 7.26.7 2168 + '@babel/types': 7.26.7 2169 + transitivePeerDependencies: 2170 + - supports-color 2171 + 2172 + '@babel/helper-string-parser@7.25.9': {} 2173 + 2174 + '@babel/helper-validator-identifier@7.25.9': {} 2175 + 2176 + '@babel/helper-validator-option@7.25.9': {} 2177 + 2178 + '@babel/helpers@7.26.7': 2179 + dependencies: 2180 + '@babel/template': 7.25.9 2181 + '@babel/types': 7.26.7 2182 + 2183 + '@babel/parser@7.26.7': 2184 + dependencies: 2185 + '@babel/types': 7.26.7 2186 + 2187 + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.7)': 2188 + dependencies: 2189 + '@babel/core': 7.26.7 2190 + '@babel/helper-plugin-utils': 7.26.5 2191 + 2192 + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.7)': 2193 + dependencies: 2194 + '@babel/core': 7.26.7 2195 + '@babel/helper-plugin-utils': 7.26.5 2196 + 2197 + '@babel/plugin-transform-typescript@7.26.7(@babel/core@7.26.7)': 2198 + dependencies: 2199 + '@babel/core': 7.26.7 2200 + '@babel/helper-annotate-as-pure': 7.25.9 2201 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.7) 2202 + '@babel/helper-plugin-utils': 7.26.5 2203 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 2204 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.7) 2205 + transitivePeerDependencies: 2206 + - supports-color 2207 + 2208 + '@babel/runtime@7.26.7': 2209 + dependencies: 2210 + regenerator-runtime: 0.14.1 2211 + 2212 + '@babel/template@7.25.9': 2213 + dependencies: 2214 + '@babel/code-frame': 7.26.2 2215 + '@babel/parser': 7.26.7 2216 + '@babel/types': 7.26.7 2217 + 2218 + '@babel/traverse@7.26.7': 2219 + dependencies: 2220 + '@babel/code-frame': 7.26.2 2221 + '@babel/generator': 7.26.5 2222 + '@babel/parser': 7.26.7 2223 + '@babel/template': 7.25.9 2224 + '@babel/types': 7.26.7 2225 + debug: 4.4.0 2226 + globals: 11.12.0 2227 + transitivePeerDependencies: 2228 + - supports-color 2229 + 2230 + '@babel/types@7.26.7': 2231 + dependencies: 2232 + '@babel/helper-string-parser': 7.25.9 2233 + '@babel/helper-validator-identifier': 7.25.9 2234 + 2235 + '@changesets/apply-release-plan@7.0.8': 2236 + dependencies: 2237 + '@changesets/config': 3.0.5 2238 + '@changesets/get-version-range-type': 0.4.0 2239 + '@changesets/git': 3.0.2 2240 + '@changesets/should-skip-package': 0.1.1 2241 + '@changesets/types': 6.0.0 2242 + '@manypkg/get-packages': 1.1.3 2243 + detect-indent: 6.1.0 2244 + fs-extra: 7.0.1 2245 + lodash.startcase: 4.4.0 2246 + outdent: 0.5.0 2247 + prettier: 2.8.8 2248 + resolve-from: 5.0.0 2249 + semver: 7.7.0 2250 + 2251 + '@changesets/assemble-release-plan@6.0.5': 2252 + dependencies: 2253 + '@changesets/errors': 0.2.0 2254 + '@changesets/get-dependents-graph': 2.1.2 2255 + '@changesets/should-skip-package': 0.1.1 2256 + '@changesets/types': 6.0.0 2257 + '@manypkg/get-packages': 1.1.3 2258 + semver: 7.7.0 2259 + 2260 + '@changesets/changelog-git@0.2.0': 2261 + dependencies: 2262 + '@changesets/types': 6.0.0 2263 + 2264 + '@changesets/cli@2.27.12': 2265 + dependencies: 2266 + '@changesets/apply-release-plan': 7.0.8 2267 + '@changesets/assemble-release-plan': 6.0.5 2268 + '@changesets/changelog-git': 0.2.0 2269 + '@changesets/config': 3.0.5 2270 + '@changesets/errors': 0.2.0 2271 + '@changesets/get-dependents-graph': 2.1.2 2272 + '@changesets/get-release-plan': 4.0.6 2273 + '@changesets/git': 3.0.2 2274 + '@changesets/logger': 0.1.1 2275 + '@changesets/pre': 2.0.1 2276 + '@changesets/read': 0.6.2 2277 + '@changesets/should-skip-package': 0.1.1 2278 + '@changesets/types': 6.0.0 2279 + '@changesets/write': 0.3.2 2280 + '@manypkg/get-packages': 1.1.3 2281 + ansi-colors: 4.1.3 2282 + ci-info: 3.9.0 2283 + enquirer: 2.4.1 2284 + external-editor: 3.1.0 2285 + fs-extra: 7.0.1 2286 + mri: 1.2.0 2287 + p-limit: 2.3.0 2288 + package-manager-detector: 0.2.9 2289 + picocolors: 1.1.1 2290 + resolve-from: 5.0.0 2291 + semver: 7.7.0 2292 + spawndamnit: 3.0.1 2293 + term-size: 2.2.1 2294 + 2295 + '@changesets/config@3.0.5': 2296 + dependencies: 2297 + '@changesets/errors': 0.2.0 2298 + '@changesets/get-dependents-graph': 2.1.2 2299 + '@changesets/logger': 0.1.1 2300 + '@changesets/types': 6.0.0 2301 + '@manypkg/get-packages': 1.1.3 2302 + fs-extra: 7.0.1 2303 + micromatch: 4.0.8 2304 + 2305 + '@changesets/errors@0.2.0': 2306 + dependencies: 2307 + extendable-error: 0.1.7 2308 + 2309 + '@changesets/get-dependents-graph@2.1.2': 2310 + dependencies: 2311 + '@changesets/types': 6.0.0 2312 + '@manypkg/get-packages': 1.1.3 2313 + picocolors: 1.1.1 2314 + semver: 7.7.0 2315 + 2316 + '@changesets/get-github-info@0.6.0': 2317 + dependencies: 2318 + dataloader: 1.4.0 2319 + node-fetch: 2.7.0 2320 + transitivePeerDependencies: 2321 + - encoding 2322 + 2323 + '@changesets/get-release-plan@4.0.6': 2324 + dependencies: 2325 + '@changesets/assemble-release-plan': 6.0.5 2326 + '@changesets/config': 3.0.5 2327 + '@changesets/pre': 2.0.1 2328 + '@changesets/read': 0.6.2 2329 + '@changesets/types': 6.0.0 2330 + '@manypkg/get-packages': 1.1.3 2331 + 2332 + '@changesets/get-version-range-type@0.4.0': {} 2333 + 2334 + '@changesets/git@3.0.2': 2335 + dependencies: 2336 + '@changesets/errors': 0.2.0 2337 + '@manypkg/get-packages': 1.1.3 2338 + is-subdir: 1.2.0 2339 + micromatch: 4.0.8 2340 + spawndamnit: 3.0.1 2341 + 2342 + '@changesets/logger@0.1.1': 2343 + dependencies: 2344 + picocolors: 1.1.1 2345 + 2346 + '@changesets/parse@0.4.0': 2347 + dependencies: 2348 + '@changesets/types': 6.0.0 2349 + js-yaml: 3.14.1 2350 + 2351 + '@changesets/pre@2.0.1': 2352 + dependencies: 2353 + '@changesets/errors': 0.2.0 2354 + '@changesets/types': 6.0.0 2355 + '@manypkg/get-packages': 1.1.3 2356 + fs-extra: 7.0.1 2357 + 2358 + '@changesets/read@0.6.2': 2359 + dependencies: 2360 + '@changesets/git': 3.0.2 2361 + '@changesets/logger': 0.1.1 2362 + '@changesets/parse': 0.4.0 2363 + '@changesets/types': 6.0.0 2364 + fs-extra: 7.0.1 2365 + p-filter: 2.1.0 2366 + picocolors: 1.1.1 2367 + 2368 + '@changesets/should-skip-package@0.1.1': 2369 + dependencies: 2370 + '@changesets/types': 6.0.0 2371 + '@manypkg/get-packages': 1.1.3 2372 + 2373 + '@changesets/types@4.1.0': {} 2374 + 2375 + '@changesets/types@6.0.0': {} 2376 + 2377 + '@changesets/write@0.3.2': 2378 + dependencies: 2379 + '@changesets/types': 6.0.0 2380 + fs-extra: 7.0.1 2381 + human-id: 1.0.2 2382 + prettier: 2.8.8 2383 + 2384 + '@esbuild/aix-ppc64@0.24.2': 2385 + optional: true 2386 + 2387 + '@esbuild/android-arm64@0.24.2': 2388 + optional: true 2389 + 2390 + '@esbuild/android-arm@0.24.2': 2391 + optional: true 2392 + 2393 + '@esbuild/android-x64@0.24.2': 2394 + optional: true 2395 + 2396 + '@esbuild/darwin-arm64@0.24.2': 2397 + optional: true 2398 + 2399 + '@esbuild/darwin-x64@0.24.2': 2400 + optional: true 2401 + 2402 + '@esbuild/freebsd-arm64@0.24.2': 2403 + optional: true 2404 + 2405 + '@esbuild/freebsd-x64@0.24.2': 2406 + optional: true 2407 + 2408 + '@esbuild/linux-arm64@0.24.2': 2409 + optional: true 2410 + 2411 + '@esbuild/linux-arm@0.24.2': 2412 + optional: true 2413 + 2414 + '@esbuild/linux-ia32@0.24.2': 2415 + optional: true 2416 + 2417 + '@esbuild/linux-loong64@0.24.2': 2418 + optional: true 2419 + 2420 + '@esbuild/linux-mips64el@0.24.2': 2421 + optional: true 2422 + 2423 + '@esbuild/linux-ppc64@0.24.2': 2424 + optional: true 2425 + 2426 + '@esbuild/linux-riscv64@0.24.2': 2427 + optional: true 2428 + 2429 + '@esbuild/linux-s390x@0.24.2': 2430 + optional: true 2431 + 2432 + '@esbuild/linux-x64@0.24.2': 2433 + optional: true 2434 + 2435 + '@esbuild/netbsd-arm64@0.24.2': 2436 + optional: true 2437 + 2438 + '@esbuild/netbsd-x64@0.24.2': 2439 + optional: true 2440 + 2441 + '@esbuild/openbsd-arm64@0.24.2': 2442 + optional: true 2443 + 2444 + '@esbuild/openbsd-x64@0.24.2': 2445 + optional: true 2446 + 2447 + '@esbuild/sunos-x64@0.24.2': 2448 + optional: true 2449 + 2450 + '@esbuild/win32-arm64@0.24.2': 2451 + optional: true 2452 + 2453 + '@esbuild/win32-ia32@0.24.2': 2454 + optional: true 2455 + 2456 + '@esbuild/win32-x64@0.24.2': 2457 + optional: true 2458 + 2459 + '@isaacs/cliui@8.0.2': 2460 + dependencies: 2461 + string-width: 5.1.2 2462 + string-width-cjs: string-width@4.2.3 2463 + strip-ansi: 7.1.0 2464 + strip-ansi-cjs: strip-ansi@6.0.1 2465 + wrap-ansi: 8.1.0 2466 + wrap-ansi-cjs: wrap-ansi@7.0.0 2467 + 2468 + '@jridgewell/gen-mapping@0.3.8': 2469 + dependencies: 2470 + '@jridgewell/set-array': 1.2.1 2471 + '@jridgewell/sourcemap-codec': 1.5.0 2472 + '@jridgewell/trace-mapping': 0.3.25 2473 + 2474 + '@jridgewell/resolve-uri@3.1.2': {} 2475 + 2476 + '@jridgewell/set-array@1.2.1': {} 2477 + 2478 + '@jridgewell/source-map@0.3.6': 2479 + dependencies: 2480 + '@jridgewell/gen-mapping': 0.3.8 2481 + '@jridgewell/trace-mapping': 0.3.25 2482 + 2483 + '@jridgewell/sourcemap-codec@1.5.0': {} 2484 + 2485 + '@jridgewell/trace-mapping@0.3.25': 2486 + dependencies: 2487 + '@jridgewell/resolve-uri': 3.1.2 2488 + '@jridgewell/sourcemap-codec': 1.5.0 2489 + 2490 + '@manypkg/find-root@1.1.0': 2491 + dependencies: 2492 + '@babel/runtime': 7.26.7 2493 + '@types/node': 12.20.55 2494 + find-up: 4.1.0 2495 + fs-extra: 8.1.0 2496 + 2497 + '@manypkg/get-packages@1.1.3': 2498 + dependencies: 2499 + '@babel/runtime': 7.26.7 2500 + '@changesets/types': 4.1.0 2501 + '@manypkg/find-root': 1.1.0 2502 + fs-extra: 8.1.0 2503 + globby: 11.1.0 2504 + read-yaml-file: 1.1.0 2505 + 2506 + '@nodelib/fs.scandir@2.1.5': 2507 + dependencies: 2508 + '@nodelib/fs.stat': 2.0.5 2509 + run-parallel: 1.2.0 2510 + 2511 + '@nodelib/fs.stat@2.0.5': {} 2512 + 2513 + '@nodelib/fs.walk@1.2.8': 2514 + dependencies: 2515 + '@nodelib/fs.scandir': 2.1.5 2516 + fastq: 1.19.0 2517 + 2518 + '@rollup/plugin-babel@6.0.4(@babel/core@7.26.7)(rollup@4.32.1)': 2519 + dependencies: 2520 + '@babel/core': 7.26.7 2521 + '@babel/helper-module-imports': 7.25.9 2522 + '@rollup/pluginutils': 5.1.4(rollup@4.32.1) 2523 + optionalDependencies: 2524 + rollup: 4.32.1 2525 + transitivePeerDependencies: 2526 + - supports-color 2527 + 2528 + '@rollup/plugin-commonjs@28.0.2(rollup@4.32.1)': 2529 + dependencies: 2530 + '@rollup/pluginutils': 5.1.4(rollup@4.32.1) 2531 + commondir: 1.0.1 2532 + estree-walker: 2.0.2 2533 + fdir: 6.4.3(picomatch@4.0.2) 2534 + is-reference: 1.2.1 2535 + magic-string: 0.30.17 2536 + picomatch: 4.0.2 2537 + optionalDependencies: 2538 + rollup: 4.32.1 2539 + 2540 + '@rollup/plugin-node-resolve@16.0.0(rollup@4.32.1)': 2541 + dependencies: 2542 + '@rollup/pluginutils': 5.1.4(rollup@4.32.1) 2543 + '@types/resolve': 1.20.2 2544 + deepmerge: 4.3.1 2545 + is-module: 1.0.0 2546 + resolve: 1.22.10 2547 + optionalDependencies: 2548 + rollup: 4.32.1 2549 + 2550 + '@rollup/plugin-terser@0.4.4(rollup@4.32.1)': 2551 + dependencies: 2552 + serialize-javascript: 6.0.2 2553 + smob: 1.5.0 2554 + terser: 5.37.0 2555 + optionalDependencies: 2556 + rollup: 4.32.1 2557 + 2558 + '@rollup/pluginutils@5.1.4(rollup@4.32.1)': 2559 + dependencies: 2560 + '@types/estree': 1.0.6 2561 + estree-walker: 2.0.2 2562 + picomatch: 4.0.2 2563 + optionalDependencies: 2564 + rollup: 4.32.1 2565 + 2566 + '@rollup/rollup-android-arm-eabi@4.32.1': 2567 + optional: true 2568 + 2569 + '@rollup/rollup-android-arm64@4.32.1': 2570 + optional: true 2571 + 2572 + '@rollup/rollup-darwin-arm64@4.32.1': 2573 + optional: true 2574 + 2575 + '@rollup/rollup-darwin-x64@4.32.1': 2576 + optional: true 2577 + 2578 + '@rollup/rollup-freebsd-arm64@4.32.1': 2579 + optional: true 2580 + 2581 + '@rollup/rollup-freebsd-x64@4.32.1': 2582 + optional: true 2583 + 2584 + '@rollup/rollup-linux-arm-gnueabihf@4.32.1': 2585 + optional: true 2586 + 2587 + '@rollup/rollup-linux-arm-musleabihf@4.32.1': 2588 + optional: true 2589 + 2590 + '@rollup/rollup-linux-arm64-gnu@4.32.1': 2591 + optional: true 2592 + 2593 + '@rollup/rollup-linux-arm64-musl@4.32.1': 2594 + optional: true 2595 + 2596 + '@rollup/rollup-linux-loongarch64-gnu@4.32.1': 2597 + optional: true 2598 + 2599 + '@rollup/rollup-linux-powerpc64le-gnu@4.32.1': 2600 + optional: true 2601 + 2602 + '@rollup/rollup-linux-riscv64-gnu@4.32.1': 2603 + optional: true 2604 + 2605 + '@rollup/rollup-linux-s390x-gnu@4.32.1': 2606 + optional: true 2607 + 2608 + '@rollup/rollup-linux-x64-gnu@4.32.1': 2609 + optional: true 2610 + 2611 + '@rollup/rollup-linux-x64-musl@4.32.1': 2612 + optional: true 2613 + 2614 + '@rollup/rollup-win32-arm64-msvc@4.32.1': 2615 + optional: true 2616 + 2617 + '@rollup/rollup-win32-ia32-msvc@4.32.1': 2618 + optional: true 2619 + 2620 + '@rollup/rollup-win32-x64-msvc@4.32.1': 2621 + optional: true 2622 + 2623 + '@types/estree@1.0.6': {} 2624 + 2625 + '@types/node@12.20.55': {} 2626 + 2627 + '@types/node@22.12.0': 2628 + dependencies: 2629 + undici-types: 6.20.0 2630 + 2631 + '@types/resolve@1.20.2': {} 2632 + 2633 + '@vitest/expect@3.0.4': 2634 + dependencies: 2635 + '@vitest/spy': 3.0.4 2636 + '@vitest/utils': 3.0.4 2637 + chai: 5.1.2 2638 + tinyrainbow: 2.0.0 2639 + 2640 + '@vitest/mocker@3.0.4(vite@6.0.11(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0))': 2641 + dependencies: 2642 + '@vitest/spy': 3.0.4 2643 + estree-walker: 3.0.3 2644 + magic-string: 0.30.17 2645 + optionalDependencies: 2646 + vite: 6.0.11(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0) 2647 + 2648 + '@vitest/pretty-format@3.0.4': 2649 + dependencies: 2650 + tinyrainbow: 2.0.0 2651 + 2652 + '@vitest/runner@3.0.4': 2653 + dependencies: 2654 + '@vitest/utils': 3.0.4 2655 + pathe: 2.0.2 2656 + 2657 + '@vitest/snapshot@3.0.4': 2658 + dependencies: 2659 + '@vitest/pretty-format': 3.0.4 2660 + magic-string: 0.30.17 2661 + pathe: 2.0.2 2662 + 2663 + '@vitest/spy@3.0.4': 2664 + dependencies: 2665 + tinyspy: 3.0.2 2666 + 2667 + '@vitest/utils@3.0.4': 2668 + dependencies: 2669 + '@vitest/pretty-format': 3.0.4 2670 + loupe: 3.1.3 2671 + tinyrainbow: 2.0.0 2672 + 2673 + acorn@8.14.0: {} 2674 + 2675 + ansi-colors@4.1.3: {} 2676 + 2677 + ansi-escapes@7.0.0: 2678 + dependencies: 2679 + environment: 1.1.0 2680 + 2681 + ansi-regex@5.0.1: {} 2682 + 2683 + ansi-regex@6.1.0: {} 2684 + 2685 + ansi-styles@3.2.1: 2686 + dependencies: 2687 + color-convert: 1.9.3 2688 + 2689 + ansi-styles@4.3.0: 2690 + dependencies: 2691 + color-convert: 2.0.1 2692 + 2693 + ansi-styles@6.2.1: {} 2694 + 2695 + argparse@1.0.10: 2696 + dependencies: 2697 + sprintf-js: 1.0.3 2698 + 2699 + array-buffer-byte-length@1.0.2: 2700 + dependencies: 2701 + call-bound: 1.0.3 2702 + is-array-buffer: 3.0.5 2703 + 2704 + array-union@2.1.0: {} 2705 + 2706 + arraybuffer.prototype.slice@1.0.4: 2707 + dependencies: 2708 + array-buffer-byte-length: 1.0.2 2709 + call-bind: 1.0.8 2710 + define-properties: 1.2.1 2711 + es-abstract: 1.23.9 2712 + es-errors: 1.3.0 2713 + get-intrinsic: 1.2.7 2714 + is-array-buffer: 3.0.5 2715 + 2716 + assertion-error@2.0.1: {} 2717 + 2718 + async-function@1.0.0: {} 2719 + 2720 + asynckit@0.4.0: {} 2721 + 2722 + available-typed-arrays@1.0.7: 2723 + dependencies: 2724 + possible-typed-array-names: 1.0.0 2725 + 2726 + balanced-match@1.0.2: {} 2727 + 2728 + better-path-resolve@1.0.0: 2729 + dependencies: 2730 + is-windows: 1.0.2 2731 + 2732 + brace-expansion@1.1.11: 2733 + dependencies: 2734 + balanced-match: 1.0.2 2735 + concat-map: 0.0.1 2736 + 2737 + brace-expansion@2.0.1: 2738 + dependencies: 2739 + balanced-match: 1.0.2 2740 + 2741 + braces@3.0.3: 2742 + dependencies: 2743 + fill-range: 7.1.1 2744 + 2745 + browserslist@4.24.4: 2746 + dependencies: 2747 + caniuse-lite: 1.0.30001696 2748 + electron-to-chromium: 1.5.90 2749 + node-releases: 2.0.19 2750 + update-browserslist-db: 1.1.2(browserslist@4.24.4) 2751 + 2752 + buffer-from@1.1.2: {} 2753 + 2754 + busboy@0.3.1: 2755 + dependencies: 2756 + dicer: 0.3.0 2757 + 2758 + cac@6.7.14: {} 2759 + 2760 + call-bind-apply-helpers@1.0.1: 2761 + dependencies: 2762 + es-errors: 1.3.0 2763 + function-bind: 1.1.2 2764 + 2765 + call-bind@1.0.8: 2766 + dependencies: 2767 + call-bind-apply-helpers: 1.0.1 2768 + es-define-property: 1.0.1 2769 + get-intrinsic: 1.2.7 2770 + set-function-length: 1.2.2 2771 + 2772 + call-bound@1.0.3: 2773 + dependencies: 2774 + call-bind-apply-helpers: 1.0.1 2775 + get-intrinsic: 1.2.7 2776 + 2777 + caniuse-lite@1.0.30001696: {} 2778 + 2779 + chai@5.1.2: 2780 + dependencies: 2781 + assertion-error: 2.0.1 2782 + check-error: 2.1.1 2783 + deep-eql: 5.0.2 2784 + loupe: 3.1.3 2785 + pathval: 2.0.0 2786 + 2787 + chalk@2.4.2: 2788 + dependencies: 2789 + ansi-styles: 3.2.1 2790 + escape-string-regexp: 1.0.5 2791 + supports-color: 5.5.0 2792 + 2793 + chalk@5.4.1: {} 2794 + 2795 + chardet@0.7.0: {} 2796 + 2797 + check-error@2.1.1: {} 2798 + 2799 + ci-info@3.9.0: {} 2800 + 2801 + cjs-module-lexer@1.4.2: {} 2802 + 2803 + cli-cursor@5.0.0: 2804 + dependencies: 2805 + restore-cursor: 5.1.0 2806 + 2807 + cli-truncate@4.0.0: 2808 + dependencies: 2809 + slice-ansi: 5.0.0 2810 + string-width: 7.2.0 2811 + 2812 + color-convert@1.9.3: 2813 + dependencies: 2814 + color-name: 1.1.3 2815 + 2816 + color-convert@2.0.1: 2817 + dependencies: 2818 + color-name: 1.1.4 2819 + 2820 + color-name@1.1.3: {} 2821 + 2822 + color-name@1.1.4: {} 2823 + 2824 + colorette@2.0.20: {} 2825 + 2826 + combined-stream@1.0.8: 2827 + dependencies: 2828 + delayed-stream: 1.0.0 2829 + 2830 + commander@13.1.0: {} 2831 + 2832 + commander@2.20.3: {} 2833 + 2834 + commondir@1.0.1: {} 2835 + 2836 + concat-map@0.0.1: {} 2837 + 2838 + convert-source-map@2.0.0: {} 2839 + 2840 + cross-spawn@6.0.6: 2841 + dependencies: 2842 + nice-try: 1.0.5 2843 + path-key: 2.0.1 2844 + semver: 5.7.2 2845 + shebang-command: 1.2.0 2846 + which: 1.3.1 2847 + 2848 + cross-spawn@7.0.6: 2849 + dependencies: 2850 + path-key: 3.1.1 2851 + shebang-command: 2.0.0 2852 + which: 2.0.2 2853 + 2854 + data-view-buffer@1.0.2: 2855 + dependencies: 2856 + call-bound: 1.0.3 2857 + es-errors: 1.3.0 2858 + is-data-view: 1.0.2 2859 + 2860 + data-view-byte-length@1.0.2: 2861 + dependencies: 2862 + call-bound: 1.0.3 2863 + es-errors: 1.3.0 2864 + is-data-view: 1.0.2 2865 + 2866 + data-view-byte-offset@1.0.1: 2867 + dependencies: 2868 + call-bound: 1.0.3 2869 + es-errors: 1.3.0 2870 + is-data-view: 1.0.2 2871 + 2872 + dataloader@1.4.0: {} 2873 + 2874 + debug@4.4.0: 2875 + dependencies: 2876 + ms: 2.1.3 2877 + 2878 + deep-eql@5.0.2: {} 2879 + 2880 + deepmerge@4.3.1: {} 2881 + 2882 + define-data-property@1.1.4: 2883 + dependencies: 2884 + es-define-property: 1.0.1 2885 + es-errors: 1.3.0 2886 + gopd: 1.2.0 2887 + 2888 + define-properties@1.2.1: 2889 + dependencies: 2890 + define-data-property: 1.1.4 2891 + has-property-descriptors: 1.0.2 2892 + object-keys: 1.1.1 2893 + 2894 + delayed-stream@1.0.0: {} 2895 + 2896 + detect-indent@6.1.0: {} 2897 + 2898 + dicer@0.3.0: 2899 + dependencies: 2900 + streamsearch: 0.1.2 2901 + 2902 + dir-glob@3.0.1: 2903 + dependencies: 2904 + path-type: 4.0.0 2905 + 2906 + dotenv@16.4.7: {} 2907 + 2908 + dunder-proto@1.0.1: 2909 + dependencies: 2910 + call-bind-apply-helpers: 1.0.1 2911 + es-errors: 1.3.0 2912 + gopd: 1.2.0 2913 + 2914 + eastasianwidth@0.2.0: {} 2915 + 2916 + electron-to-chromium@1.5.90: {} 2917 + 2918 + emoji-regex@10.4.0: {} 2919 + 2920 + emoji-regex@8.0.0: {} 2921 + 2922 + emoji-regex@9.2.2: {} 2923 + 2924 + enquirer@2.4.1: 2925 + dependencies: 2926 + ansi-colors: 4.1.3 2927 + strip-ansi: 6.0.1 2928 + 2929 + environment@1.1.0: {} 2930 + 2931 + error-ex@1.3.2: 2932 + dependencies: 2933 + is-arrayish: 0.2.1 2934 + 2935 + es-abstract@1.23.9: 2936 + dependencies: 2937 + array-buffer-byte-length: 1.0.2 2938 + arraybuffer.prototype.slice: 1.0.4 2939 + available-typed-arrays: 1.0.7 2940 + call-bind: 1.0.8 2941 + call-bound: 1.0.3 2942 + data-view-buffer: 1.0.2 2943 + data-view-byte-length: 1.0.2 2944 + data-view-byte-offset: 1.0.1 2945 + es-define-property: 1.0.1 2946 + es-errors: 1.3.0 2947 + es-object-atoms: 1.1.1 2948 + es-set-tostringtag: 2.1.0 2949 + es-to-primitive: 1.3.0 2950 + function.prototype.name: 1.1.8 2951 + get-intrinsic: 1.2.7 2952 + get-proto: 1.0.1 2953 + get-symbol-description: 1.1.0 2954 + globalthis: 1.0.4 2955 + gopd: 1.2.0 2956 + has-property-descriptors: 1.0.2 2957 + has-proto: 1.2.0 2958 + has-symbols: 1.1.0 2959 + hasown: 2.0.2 2960 + internal-slot: 1.1.0 2961 + is-array-buffer: 3.0.5 2962 + is-callable: 1.2.7 2963 + is-data-view: 1.0.2 2964 + is-regex: 1.2.1 2965 + is-shared-array-buffer: 1.0.4 2966 + is-string: 1.1.1 2967 + is-typed-array: 1.1.15 2968 + is-weakref: 1.1.0 2969 + math-intrinsics: 1.1.0 2970 + object-inspect: 1.13.3 2971 + object-keys: 1.1.1 2972 + object.assign: 4.1.7 2973 + own-keys: 1.0.1 2974 + regexp.prototype.flags: 1.5.4 2975 + safe-array-concat: 1.1.3 2976 + safe-push-apply: 1.0.0 2977 + safe-regex-test: 1.1.0 2978 + set-proto: 1.0.0 2979 + string.prototype.trim: 1.2.10 2980 + string.prototype.trimend: 1.0.9 2981 + string.prototype.trimstart: 1.0.8 2982 + typed-array-buffer: 1.0.3 2983 + typed-array-byte-length: 1.0.3 2984 + typed-array-byte-offset: 1.0.4 2985 + typed-array-length: 1.0.7 2986 + unbox-primitive: 1.1.0 2987 + which-typed-array: 1.1.18 2988 + 2989 + es-define-property@1.0.1: {} 2990 + 2991 + es-errors@1.3.0: {} 2992 + 2993 + es-module-lexer@1.6.0: {} 2994 + 2995 + es-object-atoms@1.1.1: 2996 + dependencies: 2997 + es-errors: 1.3.0 2998 + 2999 + es-set-tostringtag@2.1.0: 3000 + dependencies: 3001 + es-errors: 1.3.0 3002 + get-intrinsic: 1.2.7 3003 + has-tostringtag: 1.0.2 3004 + hasown: 2.0.2 3005 + 3006 + es-to-primitive@1.3.0: 3007 + dependencies: 3008 + is-callable: 1.2.7 3009 + is-date-object: 1.1.0 3010 + is-symbol: 1.1.1 3011 + 3012 + esbuild@0.24.2: 3013 + optionalDependencies: 3014 + '@esbuild/aix-ppc64': 0.24.2 3015 + '@esbuild/android-arm': 0.24.2 3016 + '@esbuild/android-arm64': 0.24.2 3017 + '@esbuild/android-x64': 0.24.2 3018 + '@esbuild/darwin-arm64': 0.24.2 3019 + '@esbuild/darwin-x64': 0.24.2 3020 + '@esbuild/freebsd-arm64': 0.24.2 3021 + '@esbuild/freebsd-x64': 0.24.2 3022 + '@esbuild/linux-arm': 0.24.2 3023 + '@esbuild/linux-arm64': 0.24.2 3024 + '@esbuild/linux-ia32': 0.24.2 3025 + '@esbuild/linux-loong64': 0.24.2 3026 + '@esbuild/linux-mips64el': 0.24.2 3027 + '@esbuild/linux-ppc64': 0.24.2 3028 + '@esbuild/linux-riscv64': 0.24.2 3029 + '@esbuild/linux-s390x': 0.24.2 3030 + '@esbuild/linux-x64': 0.24.2 3031 + '@esbuild/netbsd-arm64': 0.24.2 3032 + '@esbuild/netbsd-x64': 0.24.2 3033 + '@esbuild/openbsd-arm64': 0.24.2 3034 + '@esbuild/openbsd-x64': 0.24.2 3035 + '@esbuild/sunos-x64': 0.24.2 3036 + '@esbuild/win32-arm64': 0.24.2 3037 + '@esbuild/win32-ia32': 0.24.2 3038 + '@esbuild/win32-x64': 0.24.2 3039 + 3040 + escalade@3.2.0: {} 3041 + 3042 + escape-string-regexp@1.0.5: {} 3043 + 3044 + esprima@4.0.1: {} 3045 + 3046 + estree-walker@2.0.2: {} 3047 + 3048 + estree-walker@3.0.3: 3049 + dependencies: 3050 + '@types/estree': 1.0.6 3051 + 3052 + eventemitter3@5.0.1: {} 3053 + 3054 + execa@8.0.1: 3055 + dependencies: 3056 + cross-spawn: 7.0.6 3057 + get-stream: 8.0.1 3058 + human-signals: 5.0.0 3059 + is-stream: 3.0.0 3060 + merge-stream: 2.0.0 3061 + npm-run-path: 5.3.0 3062 + onetime: 6.0.0 3063 + signal-exit: 4.1.0 3064 + strip-final-newline: 3.0.0 3065 + 3066 + expect-type@1.1.0: {} 3067 + 3068 + extendable-error@0.1.7: {} 3069 + 3070 + external-editor@3.1.0: 3071 + dependencies: 3072 + chardet: 0.7.0 3073 + iconv-lite: 0.4.24 3074 + tmp: 0.0.33 3075 + 3076 + fast-glob@3.3.3: 3077 + dependencies: 3078 + '@nodelib/fs.stat': 2.0.5 3079 + '@nodelib/fs.walk': 1.2.8 3080 + glob-parent: 5.1.2 3081 + merge2: 1.4.1 3082 + micromatch: 4.0.8 3083 + 3084 + fastq@1.19.0: 3085 + dependencies: 3086 + reusify: 1.0.4 3087 + 3088 + fdir@6.4.3(picomatch@4.0.2): 3089 + optionalDependencies: 3090 + picomatch: 4.0.2 3091 + 3092 + fill-range@7.1.1: 3093 + dependencies: 3094 + to-regex-range: 5.0.1 3095 + 3096 + find-up@4.1.0: 3097 + dependencies: 3098 + locate-path: 5.0.0 3099 + path-exists: 4.0.0 3100 + 3101 + for-each@0.3.4: 3102 + dependencies: 3103 + is-callable: 1.2.7 3104 + 3105 + foreground-child@3.3.0: 3106 + dependencies: 3107 + cross-spawn: 7.0.6 3108 + signal-exit: 4.1.0 3109 + 3110 + form-data@4.0.1: 3111 + dependencies: 3112 + asynckit: 0.4.0 3113 + combined-stream: 1.0.8 3114 + mime-types: 2.1.35 3115 + 3116 + fs-extra@7.0.1: 3117 + dependencies: 3118 + graceful-fs: 4.2.11 3119 + jsonfile: 4.0.0 3120 + universalify: 0.1.2 3121 + 3122 + fs-extra@8.1.0: 3123 + dependencies: 3124 + graceful-fs: 4.2.11 3125 + jsonfile: 4.0.0 3126 + universalify: 0.1.2 3127 + 3128 + fsevents@2.3.3: 3129 + optional: true 3130 + 3131 + function-bind@1.1.2: {} 3132 + 3133 + function.prototype.name@1.1.8: 3134 + dependencies: 3135 + call-bind: 1.0.8 3136 + call-bound: 1.0.3 3137 + define-properties: 1.2.1 3138 + functions-have-names: 1.2.3 3139 + hasown: 2.0.2 3140 + is-callable: 1.2.7 3141 + 3142 + functions-have-names@1.2.3: {} 3143 + 3144 + gensync@1.0.0-beta.2: {} 3145 + 3146 + get-east-asian-width@1.3.0: {} 3147 + 3148 + get-intrinsic@1.2.7: 3149 + dependencies: 3150 + call-bind-apply-helpers: 1.0.1 3151 + es-define-property: 1.0.1 3152 + es-errors: 1.3.0 3153 + es-object-atoms: 1.1.1 3154 + function-bind: 1.1.2 3155 + get-proto: 1.0.1 3156 + gopd: 1.2.0 3157 + has-symbols: 1.1.0 3158 + hasown: 2.0.2 3159 + math-intrinsics: 1.1.0 3160 + 3161 + get-proto@1.0.1: 3162 + dependencies: 3163 + dunder-proto: 1.0.1 3164 + es-object-atoms: 1.1.1 3165 + 3166 + get-stream@8.0.1: {} 3167 + 3168 + get-symbol-description@1.1.0: 3169 + dependencies: 3170 + call-bound: 1.0.3 3171 + es-errors: 1.3.0 3172 + get-intrinsic: 1.2.7 3173 + 3174 + glob-parent@5.1.2: 3175 + dependencies: 3176 + is-glob: 4.0.3 3177 + 3178 + glob@11.0.1: 3179 + dependencies: 3180 + foreground-child: 3.3.0 3181 + jackspeak: 4.0.2 3182 + minimatch: 10.0.1 3183 + minipass: 7.1.2 3184 + package-json-from-dist: 1.0.1 3185 + path-scurry: 2.0.0 3186 + 3187 + globals@11.12.0: {} 3188 + 3189 + globalthis@1.0.4: 3190 + dependencies: 3191 + define-properties: 1.2.1 3192 + gopd: 1.2.0 3193 + 3194 + globby@11.1.0: 3195 + dependencies: 3196 + array-union: 2.1.0 3197 + dir-glob: 3.0.1 3198 + fast-glob: 3.3.3 3199 + ignore: 5.3.2 3200 + merge2: 1.4.1 3201 + slash: 3.0.0 3202 + 3203 + gopd@1.2.0: {} 3204 + 3205 + graceful-fs@4.2.11: {} 3206 + 3207 + has-bigints@1.1.0: {} 3208 + 3209 + has-flag@3.0.0: {} 3210 + 3211 + has-property-descriptors@1.0.2: 3212 + dependencies: 3213 + es-define-property: 1.0.1 3214 + 3215 + has-proto@1.2.0: 3216 + dependencies: 3217 + dunder-proto: 1.0.1 3218 + 3219 + has-symbols@1.1.0: {} 3220 + 3221 + has-tostringtag@1.0.2: 3222 + dependencies: 3223 + has-symbols: 1.1.0 3224 + 3225 + hasown@2.0.2: 3226 + dependencies: 3227 + function-bind: 1.1.2 3228 + 3229 + hosted-git-info@2.8.9: {} 3230 + 3231 + human-id@1.0.2: {} 3232 + 3233 + human-signals@5.0.0: {} 3234 + 3235 + iconv-lite@0.4.24: 3236 + dependencies: 3237 + safer-buffer: 2.1.2 3238 + 3239 + ignore@5.3.2: {} 3240 + 3241 + internal-slot@1.1.0: 3242 + dependencies: 3243 + es-errors: 1.3.0 3244 + hasown: 2.0.2 3245 + side-channel: 1.1.0 3246 + 3247 + is-array-buffer@3.0.5: 3248 + dependencies: 3249 + call-bind: 1.0.8 3250 + call-bound: 1.0.3 3251 + get-intrinsic: 1.2.7 3252 + 3253 + is-arrayish@0.2.1: {} 3254 + 3255 + is-async-function@2.1.1: 3256 + dependencies: 3257 + async-function: 1.0.0 3258 + call-bound: 1.0.3 3259 + get-proto: 1.0.1 3260 + has-tostringtag: 1.0.2 3261 + safe-regex-test: 1.1.0 3262 + 3263 + is-bigint@1.1.0: 3264 + dependencies: 3265 + has-bigints: 1.1.0 3266 + 3267 + is-boolean-object@1.2.1: 3268 + dependencies: 3269 + call-bound: 1.0.3 3270 + has-tostringtag: 1.0.2 3271 + 3272 + is-callable@1.2.7: {} 3273 + 3274 + is-core-module@2.16.1: 3275 + dependencies: 3276 + hasown: 2.0.2 3277 + 3278 + is-data-view@1.0.2: 3279 + dependencies: 3280 + call-bound: 1.0.3 3281 + get-intrinsic: 1.2.7 3282 + is-typed-array: 1.1.15 3283 + 3284 + is-date-object@1.1.0: 3285 + dependencies: 3286 + call-bound: 1.0.3 3287 + has-tostringtag: 1.0.2 3288 + 3289 + is-extglob@2.1.1: {} 3290 + 3291 + is-finalizationregistry@1.1.1: 3292 + dependencies: 3293 + call-bound: 1.0.3 3294 + 3295 + is-fullwidth-code-point@3.0.0: {} 3296 + 3297 + is-fullwidth-code-point@4.0.0: {} 3298 + 3299 + is-fullwidth-code-point@5.0.0: 3300 + dependencies: 3301 + get-east-asian-width: 1.3.0 3302 + 3303 + is-generator-function@1.1.0: 3304 + dependencies: 3305 + call-bound: 1.0.3 3306 + get-proto: 1.0.1 3307 + has-tostringtag: 1.0.2 3308 + safe-regex-test: 1.1.0 3309 + 3310 + is-glob@4.0.3: 3311 + dependencies: 3312 + is-extglob: 2.1.1 3313 + 3314 + is-map@2.0.3: {} 3315 + 3316 + is-module@1.0.0: {} 3317 + 3318 + is-number-object@1.1.1: 3319 + dependencies: 3320 + call-bound: 1.0.3 3321 + has-tostringtag: 1.0.2 3322 + 3323 + is-number@7.0.0: {} 3324 + 3325 + is-reference@1.2.1: 3326 + dependencies: 3327 + '@types/estree': 1.0.6 3328 + 3329 + is-regex@1.2.1: 3330 + dependencies: 3331 + call-bound: 1.0.3 3332 + gopd: 1.2.0 3333 + has-tostringtag: 1.0.2 3334 + hasown: 2.0.2 3335 + 3336 + is-set@2.0.3: {} 3337 + 3338 + is-shared-array-buffer@1.0.4: 3339 + dependencies: 3340 + call-bound: 1.0.3 3341 + 3342 + is-stream@3.0.0: {} 3343 + 3344 + is-string@1.1.1: 3345 + dependencies: 3346 + call-bound: 1.0.3 3347 + has-tostringtag: 1.0.2 3348 + 3349 + is-subdir@1.2.0: 3350 + dependencies: 3351 + better-path-resolve: 1.0.0 3352 + 3353 + is-symbol@1.1.1: 3354 + dependencies: 3355 + call-bound: 1.0.3 3356 + has-symbols: 1.1.0 3357 + safe-regex-test: 1.1.0 3358 + 3359 + is-typed-array@1.1.15: 3360 + dependencies: 3361 + which-typed-array: 1.1.18 3362 + 3363 + is-weakmap@2.0.2: {} 3364 + 3365 + is-weakref@1.1.0: 3366 + dependencies: 3367 + call-bound: 1.0.3 3368 + 3369 + is-weakset@2.0.4: 3370 + dependencies: 3371 + call-bound: 1.0.3 3372 + get-intrinsic: 1.2.7 3373 + 3374 + is-windows@1.0.2: {} 3375 + 3376 + isarray@2.0.5: {} 3377 + 3378 + isexe@2.0.0: {} 3379 + 3380 + jackspeak@4.0.2: 3381 + dependencies: 3382 + '@isaacs/cliui': 8.0.2 3383 + 3384 + js-tokens@4.0.0: {} 3385 + 3386 + js-yaml@3.14.1: 3387 + dependencies: 3388 + argparse: 1.0.10 3389 + esprima: 4.0.1 3390 + 3391 + jsesc@3.1.0: {} 3392 + 3393 + json-parse-better-errors@1.0.2: {} 3394 + 3395 + json5@2.2.3: {} 3396 + 3397 + jsonfile@4.0.0: 3398 + optionalDependencies: 3399 + graceful-fs: 4.2.11 3400 + 3401 + lilconfig@3.1.3: {} 3402 + 3403 + lint-staged@15.4.3: 3404 + dependencies: 3405 + chalk: 5.4.1 3406 + commander: 13.1.0 3407 + debug: 4.4.0 3408 + execa: 8.0.1 3409 + lilconfig: 3.1.3 3410 + listr2: 8.2.5 3411 + micromatch: 4.0.8 3412 + pidtree: 0.6.0 3413 + string-argv: 0.3.2 3414 + yaml: 2.7.0 3415 + transitivePeerDependencies: 3416 + - supports-color 3417 + 3418 + listr2@8.2.5: 3419 + dependencies: 3420 + cli-truncate: 4.0.0 3421 + colorette: 2.0.20 3422 + eventemitter3: 5.0.1 3423 + log-update: 6.1.0 3424 + rfdc: 1.4.1 3425 + wrap-ansi: 9.0.0 3426 + 3427 + load-json-file@4.0.0: 3428 + dependencies: 3429 + graceful-fs: 4.2.11 3430 + parse-json: 4.0.0 3431 + pify: 3.0.0 3432 + strip-bom: 3.0.0 3433 + 3434 + locate-path@5.0.0: 3435 + dependencies: 3436 + p-locate: 4.1.0 3437 + 3438 + lodash.startcase@4.4.0: {} 3439 + 3440 + log-update@6.1.0: 3441 + dependencies: 3442 + ansi-escapes: 7.0.0 3443 + cli-cursor: 5.0.0 3444 + slice-ansi: 7.1.0 3445 + strip-ansi: 7.1.0 3446 + wrap-ansi: 9.0.0 3447 + 3448 + loupe@3.1.3: {} 3449 + 3450 + lru-cache@11.0.2: {} 3451 + 3452 + lru-cache@5.1.1: 3453 + dependencies: 3454 + yallist: 3.1.1 3455 + 3456 + magic-string@0.30.17: 3457 + dependencies: 3458 + '@jridgewell/sourcemap-codec': 1.5.0 3459 + 3460 + math-intrinsics@1.1.0: {} 3461 + 3462 + memorystream@0.3.1: {} 3463 + 3464 + merge-stream@2.0.0: {} 3465 + 3466 + merge2@1.4.1: {} 3467 + 3468 + micromatch@4.0.8: 3469 + dependencies: 3470 + braces: 3.0.3 3471 + picomatch: 2.3.1 3472 + 3473 + mime-db@1.52.0: {} 3474 + 3475 + mime-types@2.1.35: 3476 + dependencies: 3477 + mime-db: 1.52.0 3478 + 3479 + mimic-fn@4.0.0: {} 3480 + 3481 + mimic-function@5.0.1: {} 3482 + 3483 + minimatch@10.0.1: 3484 + dependencies: 3485 + brace-expansion: 2.0.1 3486 + 3487 + minimatch@3.1.2: 3488 + dependencies: 3489 + brace-expansion: 1.1.11 3490 + 3491 + minipass@7.1.2: {} 3492 + 3493 + mri@1.2.0: {} 3494 + 3495 + ms@2.1.3: {} 3496 + 3497 + nanoid@3.3.8: {} 3498 + 3499 + nice-try@1.0.5: {} 3500 + 3501 + node-fetch@2.7.0: 3502 + dependencies: 3503 + whatwg-url: 5.0.0 3504 + 3505 + node-releases@2.0.19: {} 3506 + 3507 + normalize-package-data@2.5.0: 3508 + dependencies: 3509 + hosted-git-info: 2.8.9 3510 + resolve: 1.22.10 3511 + semver: 5.7.2 3512 + validate-npm-package-license: 3.0.4 3513 + 3514 + npm-run-all@4.1.5: 3515 + dependencies: 3516 + ansi-styles: 3.2.1 3517 + chalk: 2.4.2 3518 + cross-spawn: 6.0.6 3519 + memorystream: 0.3.1 3520 + minimatch: 3.1.2 3521 + pidtree: 0.3.1 3522 + read-pkg: 3.0.0 3523 + shell-quote: 1.8.2 3524 + string.prototype.padend: 3.1.6 3525 + 3526 + npm-run-path@5.3.0: 3527 + dependencies: 3528 + path-key: 4.0.0 3529 + 3530 + object-inspect@1.13.3: {} 3531 + 3532 + object-keys@1.1.1: {} 3533 + 3534 + object.assign@4.1.7: 3535 + dependencies: 3536 + call-bind: 1.0.8 3537 + call-bound: 1.0.3 3538 + define-properties: 1.2.1 3539 + es-object-atoms: 1.1.1 3540 + has-symbols: 1.1.0 3541 + object-keys: 1.1.1 3542 + 3543 + onetime@6.0.0: 3544 + dependencies: 3545 + mimic-fn: 4.0.0 3546 + 3547 + onetime@7.0.0: 3548 + dependencies: 3549 + mimic-function: 5.0.1 3550 + 3551 + os-tmpdir@1.0.2: {} 3552 + 3553 + outdent@0.5.0: {} 3554 + 3555 + own-keys@1.0.1: 3556 + dependencies: 3557 + get-intrinsic: 1.2.7 3558 + object-keys: 1.1.1 3559 + safe-push-apply: 1.0.0 3560 + 3561 + p-filter@2.1.0: 3562 + dependencies: 3563 + p-map: 2.1.0 3564 + 3565 + p-limit@2.3.0: 3566 + dependencies: 3567 + p-try: 2.2.0 3568 + 3569 + p-locate@4.1.0: 3570 + dependencies: 3571 + p-limit: 2.3.0 3572 + 3573 + p-map@2.1.0: {} 3574 + 3575 + p-try@2.2.0: {} 3576 + 3577 + package-json-from-dist@1.0.1: {} 3578 + 3579 + package-manager-detector@0.2.9: {} 3580 + 3581 + parse-json@4.0.0: 3582 + dependencies: 3583 + error-ex: 1.3.2 3584 + json-parse-better-errors: 1.0.2 3585 + 3586 + path-exists@4.0.0: {} 3587 + 3588 + path-key@2.0.1: {} 3589 + 3590 + path-key@3.1.1: {} 3591 + 3592 + path-key@4.0.0: {} 3593 + 3594 + path-parse@1.0.7: {} 3595 + 3596 + path-scurry@2.0.0: 3597 + dependencies: 3598 + lru-cache: 11.0.2 3599 + minipass: 7.1.2 3600 + 3601 + path-type@3.0.0: 3602 + dependencies: 3603 + pify: 3.0.0 3604 + 3605 + path-type@4.0.0: {} 3606 + 3607 + pathe@2.0.2: {} 3608 + 3609 + pathval@2.0.0: {} 3610 + 3611 + picocolors@1.1.1: {} 3612 + 3613 + picomatch@2.3.1: {} 3614 + 3615 + picomatch@4.0.2: {} 3616 + 3617 + pidtree@0.3.1: {} 3618 + 3619 + pidtree@0.6.0: {} 3620 + 3621 + pify@3.0.0: {} 3622 + 3623 + pify@4.0.1: {} 3624 + 3625 + possible-typed-array-names@1.0.0: {} 3626 + 3627 + postcss@8.5.1: 3628 + dependencies: 3629 + nanoid: 3.3.8 3630 + picocolors: 1.1.1 3631 + source-map-js: 1.2.1 3632 + 3633 + prettier@2.8.8: {} 3634 + 3635 + prettier@3.4.2: {} 3636 + 3637 + queue-microtask@1.2.3: {} 3638 + 3639 + randombytes@2.1.0: 3640 + dependencies: 3641 + safe-buffer: 5.2.1 3642 + 3643 + read-pkg@3.0.0: 3644 + dependencies: 3645 + load-json-file: 4.0.0 3646 + normalize-package-data: 2.5.0 3647 + path-type: 3.0.0 3648 + 3649 + read-yaml-file@1.1.0: 3650 + dependencies: 3651 + graceful-fs: 4.2.11 3652 + js-yaml: 3.14.1 3653 + pify: 4.0.1 3654 + strip-bom: 3.0.0 3655 + 3656 + reflect.getprototypeof@1.0.10: 3657 + dependencies: 3658 + call-bind: 1.0.8 3659 + define-properties: 1.2.1 3660 + es-abstract: 1.23.9 3661 + es-errors: 1.3.0 3662 + es-object-atoms: 1.1.1 3663 + get-intrinsic: 1.2.7 3664 + get-proto: 1.0.1 3665 + which-builtin-type: 1.2.1 3666 + 3667 + regenerator-runtime@0.14.1: {} 3668 + 3669 + regexp.prototype.flags@1.5.4: 3670 + dependencies: 3671 + call-bind: 1.0.8 3672 + define-properties: 1.2.1 3673 + es-errors: 1.3.0 3674 + get-proto: 1.0.1 3675 + gopd: 1.2.0 3676 + set-function-name: 2.0.2 3677 + 3678 + resolve-from@5.0.0: {} 3679 + 3680 + resolve@1.22.10: 3681 + dependencies: 3682 + is-core-module: 2.16.1 3683 + path-parse: 1.0.7 3684 + supports-preserve-symlinks-flag: 1.0.0 3685 + 3686 + restore-cursor@5.1.0: 3687 + dependencies: 3688 + onetime: 7.0.0 3689 + signal-exit: 4.1.0 3690 + 3691 + reusify@1.0.4: {} 3692 + 3693 + rfdc@1.4.1: {} 3694 + 3695 + rimraf@6.0.1: 3696 + dependencies: 3697 + glob: 11.0.1 3698 + package-json-from-dist: 1.0.1 3699 + 3700 + rollup-plugin-cjs-check@1.0.3(rollup@4.32.1): 3701 + dependencies: 3702 + '@rollup/pluginutils': 5.1.4(rollup@4.32.1) 3703 + cjs-module-lexer: 1.4.2 3704 + rollup: 4.32.1 3705 + 3706 + rollup-plugin-dts@6.1.1(rollup@4.32.1)(typescript@5.7.3): 3707 + dependencies: 3708 + magic-string: 0.30.17 3709 + rollup: 4.32.1 3710 + typescript: 5.7.3 3711 + optionalDependencies: 3712 + '@babel/code-frame': 7.26.2 3713 + 3714 + rollup@4.32.1: 3715 + dependencies: 3716 + '@types/estree': 1.0.6 3717 + optionalDependencies: 3718 + '@rollup/rollup-android-arm-eabi': 4.32.1 3719 + '@rollup/rollup-android-arm64': 4.32.1 3720 + '@rollup/rollup-darwin-arm64': 4.32.1 3721 + '@rollup/rollup-darwin-x64': 4.32.1 3722 + '@rollup/rollup-freebsd-arm64': 4.32.1 3723 + '@rollup/rollup-freebsd-x64': 4.32.1 3724 + '@rollup/rollup-linux-arm-gnueabihf': 4.32.1 3725 + '@rollup/rollup-linux-arm-musleabihf': 4.32.1 3726 + '@rollup/rollup-linux-arm64-gnu': 4.32.1 3727 + '@rollup/rollup-linux-arm64-musl': 4.32.1 3728 + '@rollup/rollup-linux-loongarch64-gnu': 4.32.1 3729 + '@rollup/rollup-linux-powerpc64le-gnu': 4.32.1 3730 + '@rollup/rollup-linux-riscv64-gnu': 4.32.1 3731 + '@rollup/rollup-linux-s390x-gnu': 4.32.1 3732 + '@rollup/rollup-linux-x64-gnu': 4.32.1 3733 + '@rollup/rollup-linux-x64-musl': 4.32.1 3734 + '@rollup/rollup-win32-arm64-msvc': 4.32.1 3735 + '@rollup/rollup-win32-ia32-msvc': 4.32.1 3736 + '@rollup/rollup-win32-x64-msvc': 4.32.1 3737 + fsevents: 2.3.3 3738 + 3739 + run-parallel@1.2.0: 3740 + dependencies: 3741 + queue-microtask: 1.2.3 3742 + 3743 + safe-array-concat@1.1.3: 3744 + dependencies: 3745 + call-bind: 1.0.8 3746 + call-bound: 1.0.3 3747 + get-intrinsic: 1.2.7 3748 + has-symbols: 1.1.0 3749 + isarray: 2.0.5 3750 + 3751 + safe-buffer@5.2.1: {} 3752 + 3753 + safe-push-apply@1.0.0: 3754 + dependencies: 3755 + es-errors: 1.3.0 3756 + isarray: 2.0.5 3757 + 3758 + safe-regex-test@1.1.0: 3759 + dependencies: 3760 + call-bound: 1.0.3 3761 + es-errors: 1.3.0 3762 + is-regex: 1.2.1 3763 + 3764 + safer-buffer@2.1.2: {} 3765 + 3766 + semver@5.7.2: {} 3767 + 3768 + semver@6.3.1: {} 3769 + 3770 + semver@7.7.0: {} 3771 + 3772 + serialize-javascript@6.0.2: 3773 + dependencies: 3774 + randombytes: 2.1.0 3775 + 3776 + set-function-length@1.2.2: 3777 + dependencies: 3778 + define-data-property: 1.1.4 3779 + es-errors: 1.3.0 3780 + function-bind: 1.1.2 3781 + get-intrinsic: 1.2.7 3782 + gopd: 1.2.0 3783 + has-property-descriptors: 1.0.2 3784 + 3785 + set-function-name@2.0.2: 3786 + dependencies: 3787 + define-data-property: 1.1.4 3788 + es-errors: 1.3.0 3789 + functions-have-names: 1.2.3 3790 + has-property-descriptors: 1.0.2 3791 + 3792 + set-proto@1.0.0: 3793 + dependencies: 3794 + dunder-proto: 1.0.1 3795 + es-errors: 1.3.0 3796 + es-object-atoms: 1.1.1 3797 + 3798 + shebang-command@1.2.0: 3799 + dependencies: 3800 + shebang-regex: 1.0.0 3801 + 3802 + shebang-command@2.0.0: 3803 + dependencies: 3804 + shebang-regex: 3.0.0 3805 + 3806 + shebang-regex@1.0.0: {} 3807 + 3808 + shebang-regex@3.0.0: {} 3809 + 3810 + shell-quote@1.8.2: {} 3811 + 3812 + side-channel-list@1.0.0: 3813 + dependencies: 3814 + es-errors: 1.3.0 3815 + object-inspect: 1.13.3 3816 + 3817 + side-channel-map@1.0.1: 3818 + dependencies: 3819 + call-bound: 1.0.3 3820 + es-errors: 1.3.0 3821 + get-intrinsic: 1.2.7 3822 + object-inspect: 1.13.3 3823 + 3824 + side-channel-weakmap@1.0.2: 3825 + dependencies: 3826 + call-bound: 1.0.3 3827 + es-errors: 1.3.0 3828 + get-intrinsic: 1.2.7 3829 + object-inspect: 1.13.3 3830 + side-channel-map: 1.0.1 3831 + 3832 + side-channel@1.1.0: 3833 + dependencies: 3834 + es-errors: 1.3.0 3835 + object-inspect: 1.13.3 3836 + side-channel-list: 1.0.0 3837 + side-channel-map: 1.0.1 3838 + side-channel-weakmap: 1.0.2 3839 + 3840 + siginfo@2.0.0: {} 3841 + 3842 + signal-exit@4.1.0: {} 3843 + 3844 + slash@3.0.0: {} 3845 + 3846 + slice-ansi@5.0.0: 3847 + dependencies: 3848 + ansi-styles: 6.2.1 3849 + is-fullwidth-code-point: 4.0.0 3850 + 3851 + slice-ansi@7.1.0: 3852 + dependencies: 3853 + ansi-styles: 6.2.1 3854 + is-fullwidth-code-point: 5.0.0 3855 + 3856 + smob@1.5.0: {} 3857 + 3858 + source-map-js@1.2.1: {} 3859 + 3860 + source-map-support@0.5.21: 3861 + dependencies: 3862 + buffer-from: 1.1.2 3863 + source-map: 0.6.1 3864 + 3865 + source-map@0.6.1: {} 3866 + 3867 + spawndamnit@3.0.1: 3868 + dependencies: 3869 + cross-spawn: 7.0.6 3870 + signal-exit: 4.1.0 3871 + 3872 + spdx-correct@3.2.0: 3873 + dependencies: 3874 + spdx-expression-parse: 3.0.1 3875 + spdx-license-ids: 3.0.21 3876 + 3877 + spdx-exceptions@2.5.0: {} 3878 + 3879 + spdx-expression-parse@3.0.1: 3880 + dependencies: 3881 + spdx-exceptions: 2.5.0 3882 + spdx-license-ids: 3.0.21 3883 + 3884 + spdx-license-ids@3.0.21: {} 3885 + 3886 + sprintf-js@1.0.3: {} 3887 + 3888 + stackback@0.0.2: {} 3889 + 3890 + std-env@3.8.0: {} 3891 + 3892 + streamsearch@0.1.2: {} 3893 + 3894 + string-argv@0.3.2: {} 3895 + 3896 + string-width@4.2.3: 3897 + dependencies: 3898 + emoji-regex: 8.0.0 3899 + is-fullwidth-code-point: 3.0.0 3900 + strip-ansi: 6.0.1 3901 + 3902 + string-width@5.1.2: 3903 + dependencies: 3904 + eastasianwidth: 0.2.0 3905 + emoji-regex: 9.2.2 3906 + strip-ansi: 7.1.0 3907 + 3908 + string-width@7.2.0: 3909 + dependencies: 3910 + emoji-regex: 10.4.0 3911 + get-east-asian-width: 1.3.0 3912 + strip-ansi: 7.1.0 3913 + 3914 + string.prototype.padend@3.1.6: 3915 + dependencies: 3916 + call-bind: 1.0.8 3917 + define-properties: 1.2.1 3918 + es-abstract: 1.23.9 3919 + es-object-atoms: 1.1.1 3920 + 3921 + string.prototype.trim@1.2.10: 3922 + dependencies: 3923 + call-bind: 1.0.8 3924 + call-bound: 1.0.3 3925 + define-data-property: 1.1.4 3926 + define-properties: 1.2.1 3927 + es-abstract: 1.23.9 3928 + es-object-atoms: 1.1.1 3929 + has-property-descriptors: 1.0.2 3930 + 3931 + string.prototype.trimend@1.0.9: 3932 + dependencies: 3933 + call-bind: 1.0.8 3934 + call-bound: 1.0.3 3935 + define-properties: 1.2.1 3936 + es-object-atoms: 1.1.1 3937 + 3938 + string.prototype.trimstart@1.0.8: 3939 + dependencies: 3940 + call-bind: 1.0.8 3941 + define-properties: 1.2.1 3942 + es-object-atoms: 1.1.1 3943 + 3944 + strip-ansi@6.0.1: 3945 + dependencies: 3946 + ansi-regex: 5.0.1 3947 + 3948 + strip-ansi@7.1.0: 3949 + dependencies: 3950 + ansi-regex: 6.1.0 3951 + 3952 + strip-bom@3.0.0: {} 3953 + 3954 + strip-final-newline@3.0.0: {} 3955 + 3956 + supports-color@5.5.0: 3957 + dependencies: 3958 + has-flag: 3.0.0 3959 + 3960 + supports-preserve-symlinks-flag@1.0.0: {} 3961 + 3962 + term-size@2.2.1: {} 3963 + 3964 + terser@5.37.0: 3965 + dependencies: 3966 + '@jridgewell/source-map': 0.3.6 3967 + acorn: 8.14.0 3968 + commander: 2.20.3 3969 + source-map-support: 0.5.21 3970 + 3971 + tinybench@2.9.0: {} 3972 + 3973 + tinyexec@0.3.2: {} 3974 + 3975 + tinypool@1.0.2: {} 3976 + 3977 + tinyrainbow@2.0.0: {} 3978 + 3979 + tinyspy@3.0.2: {} 3980 + 3981 + tmp@0.0.33: 3982 + dependencies: 3983 + os-tmpdir: 1.0.2 3984 + 3985 + to-regex-range@5.0.1: 3986 + dependencies: 3987 + is-number: 7.0.0 3988 + 3989 + tr46@0.0.3: {} 3990 + 3991 + typed-array-buffer@1.0.3: 3992 + dependencies: 3993 + call-bound: 1.0.3 3994 + es-errors: 1.3.0 3995 + is-typed-array: 1.1.15 3996 + 3997 + typed-array-byte-length@1.0.3: 3998 + dependencies: 3999 + call-bind: 1.0.8 4000 + for-each: 0.3.4 4001 + gopd: 1.2.0 4002 + has-proto: 1.2.0 4003 + is-typed-array: 1.1.15 4004 + 4005 + typed-array-byte-offset@1.0.4: 4006 + dependencies: 4007 + available-typed-arrays: 1.0.7 4008 + call-bind: 1.0.8 4009 + for-each: 0.3.4 4010 + gopd: 1.2.0 4011 + has-proto: 1.2.0 4012 + is-typed-array: 1.1.15 4013 + reflect.getprototypeof: 1.0.10 4014 + 4015 + typed-array-length@1.0.7: 4016 + dependencies: 4017 + call-bind: 1.0.8 4018 + for-each: 0.3.4 4019 + gopd: 1.2.0 4020 + is-typed-array: 1.1.15 4021 + possible-typed-array-names: 1.0.0 4022 + reflect.getprototypeof: 1.0.10 4023 + 4024 + typescript@5.7.3: {} 4025 + 4026 + unbox-primitive@1.1.0: 4027 + dependencies: 4028 + call-bound: 1.0.3 4029 + has-bigints: 1.1.0 4030 + has-symbols: 1.1.0 4031 + which-boxed-primitive: 1.1.1 4032 + 4033 + undici-types@6.20.0: {} 4034 + 4035 + undici-types@7.3.0: {} 4036 + 4037 + universalify@0.1.2: {} 4038 + 4039 + update-browserslist-db@1.1.2(browserslist@4.24.4): 4040 + dependencies: 4041 + browserslist: 4.24.4 4042 + escalade: 3.2.0 4043 + picocolors: 1.1.1 4044 + 4045 + validate-npm-package-license@3.0.4: 4046 + dependencies: 4047 + spdx-correct: 3.2.0 4048 + spdx-expression-parse: 3.0.1 4049 + 4050 + vite-node@3.0.4(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0): 4051 + dependencies: 4052 + cac: 6.7.14 4053 + debug: 4.4.0 4054 + es-module-lexer: 1.6.0 4055 + pathe: 2.0.2 4056 + vite: 6.0.11(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0) 4057 + transitivePeerDependencies: 4058 + - '@types/node' 4059 + - jiti 4060 + - less 4061 + - lightningcss 4062 + - sass 4063 + - sass-embedded 4064 + - stylus 4065 + - sugarss 4066 + - supports-color 4067 + - terser 4068 + - tsx 4069 + - yaml 4070 + 4071 + vite@6.0.11(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0): 4072 + dependencies: 4073 + esbuild: 0.24.2 4074 + postcss: 8.5.1 4075 + rollup: 4.32.1 4076 + optionalDependencies: 4077 + '@types/node': 22.12.0 4078 + fsevents: 2.3.3 4079 + terser: 5.37.0 4080 + yaml: 2.7.0 4081 + 4082 + vitest@3.0.4(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0): 4083 + dependencies: 4084 + '@vitest/expect': 3.0.4 4085 + '@vitest/mocker': 3.0.4(vite@6.0.11(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0)) 4086 + '@vitest/pretty-format': 3.0.4 4087 + '@vitest/runner': 3.0.4 4088 + '@vitest/snapshot': 3.0.4 4089 + '@vitest/spy': 3.0.4 4090 + '@vitest/utils': 3.0.4 4091 + chai: 5.1.2 4092 + debug: 4.4.0 4093 + expect-type: 1.1.0 4094 + magic-string: 0.30.17 4095 + pathe: 2.0.2 4096 + std-env: 3.8.0 4097 + tinybench: 2.9.0 4098 + tinyexec: 0.3.2 4099 + tinypool: 1.0.2 4100 + tinyrainbow: 2.0.0 4101 + vite: 6.0.11(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0) 4102 + vite-node: 3.0.4(@types/node@22.12.0)(terser@5.37.0)(yaml@2.7.0) 4103 + why-is-node-running: 2.3.0 4104 + optionalDependencies: 4105 + '@types/node': 22.12.0 4106 + transitivePeerDependencies: 4107 + - jiti 4108 + - less 4109 + - lightningcss 4110 + - msw 4111 + - sass 4112 + - sass-embedded 4113 + - stylus 4114 + - sugarss 4115 + - supports-color 4116 + - terser 4117 + - tsx 4118 + - yaml 4119 + 4120 + webidl-conversions@3.0.1: {} 4121 + 4122 + whatwg-url@5.0.0: 4123 + dependencies: 4124 + tr46: 0.0.3 4125 + webidl-conversions: 3.0.1 4126 + 4127 + which-boxed-primitive@1.1.1: 4128 + dependencies: 4129 + is-bigint: 1.1.0 4130 + is-boolean-object: 1.2.1 4131 + is-number-object: 1.1.1 4132 + is-string: 1.1.1 4133 + is-symbol: 1.1.1 4134 + 4135 + which-builtin-type@1.2.1: 4136 + dependencies: 4137 + call-bound: 1.0.3 4138 + function.prototype.name: 1.1.8 4139 + has-tostringtag: 1.0.2 4140 + is-async-function: 2.1.1 4141 + is-date-object: 1.1.0 4142 + is-finalizationregistry: 1.1.1 4143 + is-generator-function: 1.1.0 4144 + is-regex: 1.2.1 4145 + is-weakref: 1.1.0 4146 + isarray: 2.0.5 4147 + which-boxed-primitive: 1.1.1 4148 + which-collection: 1.0.2 4149 + which-typed-array: 1.1.18 4150 + 4151 + which-collection@1.0.2: 4152 + dependencies: 4153 + is-map: 2.0.3 4154 + is-set: 2.0.3 4155 + is-weakmap: 2.0.2 4156 + is-weakset: 2.0.4 4157 + 4158 + which-typed-array@1.1.18: 4159 + dependencies: 4160 + available-typed-arrays: 1.0.7 4161 + call-bind: 1.0.8 4162 + call-bound: 1.0.3 4163 + for-each: 0.3.4 4164 + gopd: 1.2.0 4165 + has-tostringtag: 1.0.2 4166 + 4167 + which@1.3.1: 4168 + dependencies: 4169 + isexe: 2.0.0 4170 + 4171 + which@2.0.2: 4172 + dependencies: 4173 + isexe: 2.0.0 4174 + 4175 + why-is-node-running@2.3.0: 4176 + dependencies: 4177 + siginfo: 2.0.0 4178 + stackback: 0.0.2 4179 + 4180 + wrap-ansi@7.0.0: 4181 + dependencies: 4182 + ansi-styles: 4.3.0 4183 + string-width: 4.2.3 4184 + strip-ansi: 6.0.1 4185 + 4186 + wrap-ansi@8.1.0: 4187 + dependencies: 4188 + ansi-styles: 6.2.1 4189 + string-width: 5.1.2 4190 + strip-ansi: 7.1.0 4191 + 4192 + wrap-ansi@9.0.0: 4193 + dependencies: 4194 + ansi-styles: 6.2.1 4195 + string-width: 7.2.0 4196 + strip-ansi: 7.1.0 4197 + 4198 + yallist@3.1.1: {} 4199 + 4200 + yaml@2.7.0: {}
+125
scripts/changelog.js
··· 1 + const { config } = require('dotenv'); 2 + const { getInfo } = require('@changesets/get-github-info'); 3 + 4 + config(); 5 + 6 + const REPO = 'kitten/fetch-nodeshim'; 7 + const SEE_LINE = /^See:\s*(.*)/i; 8 + const TRAILING_CHAR = /[.;:]$/g; 9 + const listFormatter = new Intl.ListFormat('en-US'); 10 + 11 + const getSummaryLines = cs => { 12 + let lines = cs.summary.trim().split(/\r?\n/); 13 + if (!lines.some(line => /```/.test(line))) { 14 + lines = lines.map(l => l.trim()).filter(Boolean); 15 + const size = lines.length; 16 + if (size > 0) { 17 + lines[size - 1] = lines[size - 1].replace(TRAILING_CHAR, ''); 18 + } 19 + } 20 + return lines; 21 + }; 22 + 23 + /** Creates a "(See X)" string from a template */ 24 + const templateSeeRef = links => { 25 + const humanReadableLinks = links.filter(Boolean).map(link => { 26 + if (typeof link === 'string') return link; 27 + return link.pull || link.commit; 28 + }); 29 + 30 + const size = humanReadableLinks.length; 31 + if (size === 0) return ''; 32 + 33 + const str = listFormatter.format(humanReadableLinks); 34 + return `(See ${str})`; 35 + }; 36 + 37 + const changelogFunctions = { 38 + getDependencyReleaseLine: async (changesets, dependenciesUpdated) => { 39 + if (dependenciesUpdated.length === 0) return ''; 40 + 41 + const dependenciesLinks = await Promise.all( 42 + changesets.map(async cs => { 43 + if (!cs.commit) return undefined; 44 + 45 + const lines = getSummaryLines(cs); 46 + const prLine = lines.find(line => SEE_LINE.test(line)); 47 + if (prLine) { 48 + const match = prLine.match(SEE_LINE); 49 + return (match && match[1].trim()) || undefined; 50 + } 51 + 52 + const { links } = await getInfo({ 53 + repo: REPO, 54 + commit: cs.commit, 55 + }); 56 + 57 + return links; 58 + }) 59 + ); 60 + 61 + let changesetLink = '- Updated dependencies'; 62 + 63 + const seeRef = templateSeeRef(dependenciesLinks); 64 + if (seeRef) changesetLink += ` ${seeRef}`; 65 + 66 + const detailsLinks = dependenciesUpdated.map(dep => { 67 + return ` - ${dep.name}@${dep.newVersion}`; 68 + }); 69 + 70 + return [changesetLink, ...detailsLinks].join('\n'); 71 + }, 72 + getReleaseLine: async (changeset, type) => { 73 + let pull, commit, user; 74 + 75 + const lines = getSummaryLines(changeset); 76 + const prLineIndex = lines.findIndex(line => SEE_LINE.test(line)); 77 + if (prLineIndex > -1) { 78 + const match = lines[prLineIndex].match(SEE_LINE); 79 + pull = (match && match[1].trim()) || undefined; 80 + lines.splice(prLineIndex, 1); 81 + } 82 + 83 + const [firstLine, ...futureLines] = lines; 84 + 85 + if (changeset.commit && !pull) { 86 + const { links } = await getInfo({ 87 + repo: REPO, 88 + commit: changeset.commit, 89 + }); 90 + 91 + pull = links.pull || undefined; 92 + commit = links.commit || undefined; 93 + user = links.user || undefined; 94 + } 95 + 96 + let annotation = ''; 97 + if (type === 'patch' && /^\s*fix/i.test(firstLine)) { 98 + annotation = '⚠️ '; 99 + } 100 + 101 + let str = `- ${annotation}${firstLine}`; 102 + if (futureLines.length > 0) { 103 + str += `\n${futureLines.map(l => ` ${l}`).join('\n')}`; 104 + } 105 + 106 + const endsWithParagraph = /(?<=(?:[!;?.]|```) *)$/g; 107 + if (user && !endsWithParagraph) { 108 + str += `, by ${user}`; 109 + } else { 110 + str += `\nSubmitted by ${user}`; 111 + } 112 + 113 + if (pull || commit) { 114 + const seeRef = templateSeeRef([pull || commit]); 115 + if (seeRef) str += ` ${seeRef}`; 116 + } 117 + 118 + return str; 119 + }, 120 + }; 121 + 122 + module.exports = { 123 + ...changelogFunctions, 124 + default: changelogFunctions, 125 + };
+12
scripts/prepare.js
··· 1 + const path = require('path'); 2 + const fs = require('fs'); 3 + 4 + const precommit = path.resolve(__dirname, '../.git/hooks/pre-commit'); 5 + 6 + const hook = ` 7 + #!/bin/sh 8 + pnpm exec lint-staged --quiet --relative 9 + `.trim(); 10 + 11 + fs.writeFileSync(precommit, hook); 12 + fs.chmodSync(precommit, '755');
+300
scripts/rollup.config.mjs
··· 1 + import fs from 'node:fs/promises'; 2 + import path from 'node:path/posix'; 3 + import { fileURLToPath } from 'node:url'; 4 + import { readFileSync } from 'node:fs'; 5 + import { createRequire, isBuiltin } from 'node:module'; 6 + 7 + import * as prettier from 'prettier'; 8 + import commonjs from '@rollup/plugin-commonjs'; 9 + import resolve from '@rollup/plugin-node-resolve'; 10 + import babel from '@rollup/plugin-babel'; 11 + import terser from '@rollup/plugin-terser'; 12 + import cjsCheck from 'rollup-plugin-cjs-check'; 13 + import dts from 'rollup-plugin-dts'; 14 + 15 + const __dirname = path.dirname(fileURLToPath(import.meta.url)); 16 + 17 + const normalize = name => [] 18 + .concat(name) 19 + .join(' ') 20 + .replace(/[@\s/.]+/g, ' ') 21 + .trim() 22 + .replace(/\s+/, '-') 23 + .toLowerCase(); 24 + 25 + const extension = name => { 26 + if (/\.d.ts$/.test(name)) { 27 + return '.d.ts'; 28 + } else { 29 + return path.extname(name); 30 + } 31 + }; 32 + 33 + const meta = JSON.parse(readFileSync('package.json')); 34 + const name = normalize(meta.name); 35 + 36 + const externalModules = [ 37 + ...Object.keys(meta.dependencies || {}), 38 + ...Object.keys(meta.peerDependencies || {}), 39 + ]; 40 + 41 + const moduleRe = /^(?!node:|[.{1,2}\/])(@[\w.-]+\/)?[\w.-]+/; 42 + const externalRe = new RegExp(`^(${externalModules.join('|')})($|/)`); 43 + 44 + const exports = {}; 45 + for (const key in meta.exports) { 46 + const entry = meta.exports[key]; 47 + if (typeof entry === 'object' && !!entry.source) { 48 + const entryPath = normalize(key); 49 + const entryName = normalize([name, entryPath]); 50 + exports[entryName] = { 51 + path: entryPath, 52 + ...entry, 53 + }; 54 + } 55 + } 56 + 57 + const externals = new Set(); 58 + 59 + const commonConfig = { 60 + input: Object.entries(exports).reduce((input, [exportName, entry]) => { 61 + input[exportName] = entry.source; 62 + return input; 63 + }, {}), 64 + onwarn: () => {}, 65 + external(id) { 66 + const isExternal = isBuiltin(id) || (externalModules.length && externalRe.test(id)); 67 + if (!isExternal && moduleRe.test(id)) 68 + externals.add(id); 69 + return isExternal; 70 + }, 71 + treeshake: { 72 + unknownGlobalSideEffects: false, 73 + tryCatchDeoptimization: false, 74 + moduleSideEffects: false, 75 + }, 76 + }; 77 + 78 + const commonPlugins = [ 79 + resolve({ 80 + extensions: ['.mjs', '.js', '.ts'], 81 + mainFields: ['module', 'jsnext', 'main'], 82 + preferBuiltins: false, 83 + browser: true, 84 + }), 85 + 86 + commonjs({ 87 + ignoreGlobal: true, 88 + include: /\/node_modules\//, 89 + }), 90 + ]; 91 + 92 + const commonOutput = { 93 + dir: './', 94 + exports: 'auto', 95 + sourcemap: true, 96 + sourcemapExcludeSources: false, 97 + hoistTransitiveImports: false, 98 + indent: false, 99 + freeze: false, 100 + strict: false, 101 + generatedCode: { 102 + preset: 'es5', 103 + reservedNamesAsProps: false, 104 + objectShorthand: false, 105 + constBindings: false, 106 + }, 107 + }; 108 + 109 + const outputPlugins = [ 110 + { 111 + name: 'outputPackageJsons', 112 + async writeBundle() { 113 + for (const key in exports) { 114 + const entry = exports[key]; 115 + if (entry.path) { 116 + const output = path.relative(entry.path, process.cwd()); 117 + const json = JSON.stringify({ 118 + name: key, 119 + private: true, 120 + version: '0.0.0', 121 + main: path.join(output, entry.require), 122 + module: path.join(output, entry.import), 123 + types: path.join(output, entry.types), 124 + source: path.join(output, entry.source), 125 + exports: { 126 + '.': { 127 + types: path.join(output, entry.types), 128 + import: path.join(output, entry.import), 129 + require: path.join(output, entry.require), 130 + source: path.join(output, entry.source), 131 + }, 132 + }, 133 + }, null, 2); 134 + 135 + await fs.mkdir(entry.path, { recursive: true }); 136 + await fs.writeFile(path.join(entry.path, 'package.json'), json); 137 + } 138 + } 139 + }, 140 + }, 141 + 142 + { 143 + name: 'outputBundledLicenses', 144 + async writeBundle() { 145 + const require = createRequire(import.meta.url); 146 + const rootLicense = path.join(__dirname, '../LICENSE.md'); 147 + const outputLicense = path.resolve('LICENSE.md'); 148 + if (rootLicense === outputLicense) return; 149 + const licenses = new Map(); 150 + for (const packageName of [...externals].sort()) { 151 + let license; 152 + let metaPath; 153 + let meta; 154 + try { 155 + metaPath = require.resolve(path.join(packageName, '/package.json')); 156 + meta = require(metaPath); 157 + } catch (_error) { 158 + continue; 159 + } 160 + const packagePath = path.dirname(metaPath); 161 + let licenseName = (await fs.readdir(packagePath).catch(() => [])) 162 + .find((name) => /^licen[sc]e/i.test(name)); 163 + if (!licenseName) { 164 + const match = /^SEE LICENSE IN (.*)/i.exec(meta.license || ''); 165 + licenseName = match ? match[1] : meta.license; 166 + } 167 + try { 168 + license = await fs.readFile(path.join(packagePath, licenseName), 'utf8'); 169 + } catch (_error) { 170 + license = meta.author 171 + ? `${licenseName}, Copyright (c) ${meta.author.name || meta.author}` 172 + : `${licenseName}, See license at: ${meta.repository.url || meta.repository}`; 173 + } 174 + licenses.set(packageName, license); 175 + } 176 + let output = (await fs.readFile(rootLicense, 'utf8')).trim(); 177 + for (const [packageName, licenseText] of licenses) 178 + output += `\n\n## ${packageName}\n\n${licenseText.trim()}`; 179 + await fs.writeFile(outputLicense, output); 180 + }, 181 + }, 182 + 183 + cjsCheck(), 184 + 185 + terser({ 186 + warnings: true, 187 + ecma: 2015, 188 + keep_fnames: true, 189 + ie8: false, 190 + compress: { 191 + pure_getters: true, 192 + toplevel: true, 193 + booleans_as_integers: false, 194 + keep_fnames: true, 195 + keep_fargs: true, 196 + if_return: false, 197 + ie8: false, 198 + sequences: false, 199 + loops: false, 200 + conditionals: false, 201 + join_vars: false, 202 + }, 203 + mangle: { 204 + module: true, 205 + keep_fnames: true, 206 + }, 207 + output: { 208 + beautify: true, 209 + braces: true, 210 + indent_level: 2, 211 + }, 212 + }), 213 + ]; 214 + 215 + export default [ 216 + { 217 + ...commonConfig, 218 + plugins: [ 219 + ...commonPlugins, 220 + babel({ 221 + babelrc: false, 222 + babelHelpers: 'bundled', 223 + extensions: ['mjs', 'js', 'jsx', 'ts', 'tsx'], 224 + exclude: 'node_modules/**', 225 + presets: [], 226 + plugins: [ 227 + '@babel/plugin-transform-typescript', 228 + '@babel/plugin-transform-block-scoping', 229 + ], 230 + }), 231 + ], 232 + output: [ 233 + { 234 + ...commonOutput, 235 + format: 'esm', 236 + chunkFileNames(chunk) { 237 + return `dist/chunks/[name]-chunk${extension(chunk.name) || '.mjs'}`; 238 + }, 239 + entryFileNames(chunk) { 240 + return chunk.isEntry 241 + ? path.normalize(exports[chunk.name].import) 242 + : `dist/[name].mjs`; 243 + }, 244 + plugins: outputPlugins, 245 + }, 246 + { 247 + ...commonOutput, 248 + format: 'cjs', 249 + esModule: true, 250 + externalLiveBindings: true, 251 + chunkFileNames(chunk) { 252 + return `dist/chunks/[name]-chunk${extension(chunk.name) || '.js'}`; 253 + }, 254 + entryFileNames(chunk) { 255 + return chunk.isEntry 256 + ? path.normalize(exports[chunk.name].require) 257 + : `dist/[name].js`; 258 + }, 259 + plugins: outputPlugins, 260 + }, 261 + ], 262 + }, 263 + 264 + { 265 + ...commonConfig, 266 + plugins: [ 267 + ...commonPlugins, 268 + dts(), 269 + ], 270 + output: { 271 + ...commonOutput, 272 + sourcemap: false, 273 + format: 'dts', 274 + chunkFileNames(chunk) { 275 + return `dist/chunks/[name]-chunk${extension(chunk.name) || '.d.ts'}`; 276 + }, 277 + entryFileNames(chunk) { 278 + return chunk.isEntry 279 + ? path.normalize(exports[chunk.name].types) 280 + : `dist/[name].d.ts`; 281 + }, 282 + plugins: [ 283 + { 284 + renderChunk(code, chunk) { 285 + if (chunk.fileName.endsWith('d.ts')) { 286 + return prettier.format(code, { 287 + filepath: chunk.fileName, 288 + parser: 'typescript', 289 + singleQuote: true, 290 + tabWidth: 2, 291 + printWidth: 100, 292 + trailingComma: 'es5', 293 + }); 294 + } 295 + }, 296 + }, 297 + ], 298 + }, 299 + }, 300 + ];
+1159
src/__tests__/fetch.test.ts
··· 1 + // Source: https://github.com/remix-run/web-std-io/blob/7a8596e/packages/fetch/test/main.js 2 + 3 + import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; 4 + 5 + import FormDataPolyfill from 'form-data'; 6 + import { ReadableStream } from 'node:stream/web'; 7 + import stream from 'node:stream'; 8 + import vm from 'node:vm'; 9 + 10 + import TestServer from './utils/server.js'; 11 + import { fetch } from '../fetch'; 12 + 13 + const { Uint8Array: VMUint8Array } = vm.runInNewContext('this'); 14 + 15 + async function streamToPromise<T>( 16 + stream: ReadableStream<T>, 17 + dataHandler: (data: T) => void 18 + ) { 19 + for await (const chunk of stream) { 20 + dataHandler(chunk); 21 + } 22 + } 23 + 24 + async function collectStream<T>(stream: ReadableStream<T>): Promise<T[]> { 25 + const chunks: T[] = []; 26 + for await (const chunk of stream) chunks.push(chunk); 27 + return chunks; 28 + } 29 + 30 + describe(fetch, () => { 31 + const local = new TestServer(); 32 + let baseURL: string; 33 + 34 + beforeEach(async () => { 35 + await local.start(); 36 + baseURL = `http://${local.hostname}:${local.port}/`; 37 + }); 38 + 39 + afterEach(async () => { 40 + await local.stop(); 41 + }); 42 + 43 + it('should reject with error if url is protocol relative', async () => { 44 + // [Type Error: Invalid URL] 45 + await expect(() => 46 + fetch('//example.com/') 47 + ).rejects.toThrowErrorMatchingInlineSnapshot(`[TypeError: Invalid URL]`); 48 + }); 49 + 50 + it('should reject with error if url is relative path', async () => { 51 + // [Type Error: Invalid URL] 52 + await expect(() => 53 + fetch('/some/path') 54 + ).rejects.toThrowErrorMatchingInlineSnapshot(`[TypeError: Invalid URL]`); 55 + }); 56 + 57 + it('should reject with error if protocol is unsupported', async () => { 58 + // URL scheme 'ftp' is not supported 59 + await expect( 60 + fetch('ftp://example.com/') 61 + ).rejects.toThrowErrorMatchingInlineSnapshot( 62 + `[TypeError: URL scheme "ftp:" is not supported.]` 63 + ); 64 + }); 65 + 66 + it('should reject with error on network failure', async () => { 67 + await expect(() => fetch('http://localhost:50000/')).rejects.toThrow(); 68 + }, 1_000); 69 + 70 + it('should resolve into response', async () => { 71 + const response = await fetch(new URL('hello', baseURL)); 72 + expect(response.url).toBe(`${baseURL}hello`); 73 + expect(response).toBeInstanceOf(Response); 74 + expect(response).toMatchObject({ 75 + headers: expect.any(Headers), 76 + body: expect.any(ReadableStream), 77 + bodyUsed: false, 78 + ok: true, 79 + status: 200, 80 + statusText: 'OK', 81 + }); 82 + }); 83 + 84 + it('should support https request', async () => { 85 + const response = await fetch('https://github.com/', { method: 'HEAD' }); 86 + expect(response.status).toBe(200); 87 + }, 5000); 88 + 89 + describe('response methods', () => { 90 + it('should accept plain text response', async () => { 91 + const response = await fetch(new URL('plain', baseURL)); 92 + expect(response.headers.get('content-type')).toBe('text/plain'); 93 + const text = await response.text(); 94 + expect(response.bodyUsed).toBe(true); 95 + expect(text).toBe('text'); 96 + }); 97 + 98 + it('should accept html response (like plain text)', async () => { 99 + const response = await fetch(new URL('html', baseURL)); 100 + expect(response.headers.get('content-type')).toBe('text/html'); 101 + const text = await response.text(); 102 + expect(response.bodyUsed).toBe(true); 103 + expect(text).toBe('<html></html>'); 104 + }); 105 + 106 + it('should accept json response', async () => { 107 + const response = await fetch(new URL('json', baseURL)); 108 + expect(response.headers.get('content-type')).toBe('application/json'); 109 + const text = await response.json(); 110 + expect(response.bodyUsed).toBe(true); 111 + expect(text).toEqual({ name: 'value' }); 112 + }); 113 + }); 114 + 115 + describe('request headers', () => { 116 + it('should send request with custom headers', async () => { 117 + const response = await fetch(new URL('inspect', baseURL), { 118 + headers: { 'x-custom-header': 'abc' }, 119 + }); 120 + expect(await response.json()).toMatchObject({ 121 + headers: expect.objectContaining({ 'x-custom-header': 'abc' }), 122 + }); 123 + }); 124 + 125 + it('should prefer init headers when Request is passed', async () => { 126 + const request = new Request(new URL('inspect', baseURL), { 127 + headers: { 'x-custom-header': 'abc' }, 128 + }); 129 + const response = await fetch(request, { 130 + headers: { 'x-custom-header': 'def' }, 131 + }); 132 + expect(await response.json()).toMatchObject({ 133 + headers: expect.objectContaining({ 'x-custom-header': 'def' }), 134 + }); 135 + }); 136 + 137 + it('should send request with custom User-Agent', async () => { 138 + const response = await fetch(new URL('inspect', baseURL), { 139 + headers: { 'user-agent': 'faked' }, 140 + }); 141 + expect(await response.json()).toMatchObject({ 142 + headers: expect.objectContaining({ 'user-agent': 'faked' }), 143 + }); 144 + }); 145 + 146 + it('should set default Accept header', async () => { 147 + const response = await fetch(new URL('inspect', baseURL)); 148 + expect(await response.json()).toMatchObject({ 149 + headers: expect.objectContaining({ accept: '*/*' }), 150 + }); 151 + }); 152 + 153 + it('should send custom Accept header', async () => { 154 + const response = await fetch(new URL('inspect', baseURL), { 155 + headers: { accept: 'application/json' }, 156 + }); 157 + expect(await response.json()).toMatchObject({ 158 + headers: expect.objectContaining({ accept: 'application/json' }), 159 + }); 160 + }); 161 + 162 + it('should accept headers instance', async () => { 163 + const response = await fetch(new URL('inspect', baseURL), { 164 + headers: new Headers({ 'x-custom-header': 'abc' }), 165 + }); 166 + expect(await response.json()).toMatchObject({ 167 + headers: expect.objectContaining({ 'x-custom-header': 'abc' }), 168 + }); 169 + }); 170 + 171 + it('should accept custom "host" header', async () => { 172 + const response = await fetch(new URL('inspect', baseURL), { 173 + headers: { host: 'example.com' }, 174 + }); 175 + expect(await response.json()).toMatchObject({ 176 + headers: expect.objectContaining({ host: 'example.com' }), 177 + }); 178 + }); 179 + 180 + it('should accept custom "HoSt" header', async () => { 181 + const response = await fetch(new URL('inspect', baseURL), { 182 + headers: { HoSt: 'example.com' }, 183 + }); 184 + expect(await response.json()).toMatchObject({ 185 + headers: expect.objectContaining({ host: 'example.com' }), 186 + }); 187 + }); 188 + }); 189 + 190 + describe('redirects', () => { 191 + it.each([[301], [302], [303], [307], [308]])( 192 + 'should follow redirect code %d', 193 + async status => { 194 + const response = await fetch(new URL(`redirect/${status}`, baseURL)); 195 + expect(response.headers.get('X-Inspect')).toBe('inspect'); 196 + } 197 + ); 198 + 199 + it('should follow redirect chain', async () => { 200 + const response = await fetch(new URL('redirect/chain', baseURL)); 201 + expect(response.headers.get('X-Inspect')).toBe('inspect'); 202 + }); 203 + 204 + it.each([ 205 + ['POST', 301, 'GET'], 206 + ['PUT', 301, 'PUT'], 207 + ['POST', 302, 'GET'], 208 + ['PATCH', 302, 'PATCH'], 209 + ['PUT', 303, 'GET'], 210 + ['PATCH', 307, 'PATCH'], 211 + ])( 212 + 'should follow %s request redirect code %d with %s', 213 + async (inputMethod, code, outputMethod) => { 214 + const response = await fetch(new URL(`redirect/${code}`, baseURL), { 215 + method: inputMethod, 216 + body: 'a=1', 217 + }); 218 + expect(response.headers.get('X-Inspect')).toBe('inspect'); 219 + expect(response.url).toBe(`${baseURL}inspect`); 220 + expect(await response.json()).toMatchObject({ 221 + method: outputMethod, 222 + body: outputMethod === 'GET' ? '' : 'a=1', 223 + }); 224 + } 225 + ); 226 + 227 + it('should not follow non-GET redirect if body is a readable stream', async () => { 228 + await expect(() => 229 + fetch(new URL('redirect/307', baseURL), { 230 + method: 'POST', 231 + body: stream.Readable.from('tada'), 232 + }) 233 + ).rejects.toThrowErrorMatchingInlineSnapshot( 234 + `[Error: Cannot follow redirect with a streamed body]` 235 + ); 236 + }); 237 + 238 + it('should not follow non HTTP(s) redirect', async () => { 239 + await expect(() => 240 + fetch(new URL('redirect/301/file', baseURL)) 241 + ).rejects.toThrowErrorMatchingInlineSnapshot( 242 + `[Error: URL scheme must be a HTTP(S) scheme]` 243 + ); 244 + }); 245 + 246 + it('should support redirect mode, manual flag', async () => { 247 + const response = await fetch(new URL('redirect/301', baseURL), { 248 + redirect: 'manual', 249 + }); 250 + expect(response.status).toBe(301); 251 + expect(response.headers.get('location')).toBe(`${baseURL}inspect`); 252 + }); 253 + 254 + it('should support redirect mode, manual flag, broken Location header', async () => { 255 + const response = await fetch(new URL('redirect/bad-location', baseURL), { 256 + redirect: 'manual', 257 + }); 258 + expect(response.status).toBe(301); 259 + expect(response.headers.get('location')).toBe( 260 + `${baseURL}redirect/%C3%A2%C2%98%C2%83` 261 + ); 262 + }); 263 + 264 + it('should support redirect mode, error flag', async () => { 265 + await expect(() => 266 + fetch(new URL('redirect/301', baseURL), { 267 + redirect: 'error', 268 + }) 269 + ).rejects.toThrowErrorMatchingInlineSnapshot( 270 + `[Error: URI requested responds with a redirect, redirect mode is set to error]` 271 + ); 272 + }); 273 + 274 + it('should support redirect mode, manual flag when there is no redirect', async () => { 275 + const response = await fetch(new URL('hello', baseURL), { 276 + redirect: 'manual', 277 + }); 278 + expect(response.status).toBe(200); 279 + expect(response.headers.has('location')).toBe(false); 280 + }); 281 + 282 + it('should follow redirect code 301 and keep existing headers', async () => { 283 + const response = await fetch(new URL('inspect', baseURL), { 284 + headers: new Headers({ 'x-custom-header': 'abc' }), 285 + }); 286 + expect(await response.json()).toMatchObject({ 287 + headers: expect.objectContaining({ 288 + 'x-custom-header': 'abc', 289 + }), 290 + }); 291 + }); 292 + 293 + it.each([['follow'], ['manual']] as const)( 294 + 'should treat broken redirect as ordinary response (%s)', 295 + async redirect => { 296 + const response = await fetch(new URL('redirect/no-location', baseURL), { 297 + redirect, 298 + }); 299 + expect(response.status).toBe(301); 300 + expect(response.headers.has('location')).toBe(false); 301 + } 302 + ); 303 + 304 + it('should throw a TypeError on an invalid redirect option', async () => { 305 + await expect(() => 306 + fetch(new URL('redirect/no-location', baseURL), { 307 + // @ts-ignore: Intentionally invalid 308 + redirect: 'foobar', 309 + }) 310 + ).rejects.toThrowErrorMatchingInlineSnapshot( 311 + `[TypeError: Request constructor: foobar is not an accepted type. Expected one of follow, manual, error.]` 312 + ); 313 + }); 314 + 315 + it('should set redirected property on response when redirect', async () => { 316 + const response = await fetch(new URL('redirect/301', baseURL)); 317 + expect(response.redirected).toBe(true); 318 + }); 319 + 320 + it('should not set redirected property on response without redirect', async () => { 321 + const response = await fetch(new URL('hello', baseURL)); 322 + expect(response.redirected).toBe(false); 323 + }); 324 + 325 + it('should follow redirect after empty chunked transfer-encoding', async () => { 326 + const response = await fetch(new URL('redirect/chunked', baseURL)); 327 + expect(response.status).toBe(200); 328 + expect(response.ok).toBe(true); 329 + }); 330 + }); 331 + 332 + describe('error handling', () => { 333 + it('should handle client-error response', async () => { 334 + const response = await fetch(new URL('error/400', baseURL)); 335 + expect(response.headers.get('content-type')).toBe('text/plain'); 336 + expect(response.status).toBe(400); 337 + expect(response.statusText).toBe('Bad Request'); 338 + expect(response.ok).toBe(false); 339 + expect(await response.text()).toBe('client error'); 340 + }); 341 + 342 + it('should handle server-error response', async () => { 343 + const response = await fetch(new URL('error/500', baseURL)); 344 + expect(response.headers.get('content-type')).toBe('text/plain'); 345 + expect(response.status).toBe(500); 346 + expect(response.statusText).toBe('Internal Server Error'); 347 + expect(response.ok).toBe(false); 348 + expect(await response.text()).toBe('server error'); 349 + }); 350 + 351 + it('should handle network-error response', async () => { 352 + await expect(() => 353 + fetch(new URL('error/reset', baseURL)) 354 + ).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: socket hang up]`); 355 + }); 356 + 357 + it('should handle premature close properly', async () => { 358 + const response = await fetch(new URL('redirect/301/rn', baseURL)); 359 + expect(response.status).toBe(403); 360 + }); 361 + 362 + it('should handle network-error partial response', async () => { 363 + const response = await fetch(new URL('error/premature', baseURL)); 364 + expect(response.status).toBe(200); 365 + expect(response.ok).toBe(true); 366 + await expect(() => 367 + response.text() 368 + ).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: aborted]`); 369 + }); 370 + 371 + it('should handle network-error in chunked response', async () => { 372 + const response = await fetch(new URL('error/premature/chunked', baseURL)); 373 + expect(response.status).toBe(200); 374 + expect(response.ok).toBe(true); 375 + await expect(() => 376 + collectStream(response.body!) 377 + ).rejects.toMatchInlineSnapshot(`[Error: aborted]`); 378 + }); 379 + 380 + it('should handle network-error in chunked response in consumeBody', async () => { 381 + const response = await fetch(new URL('error/premature/chunked', baseURL)); 382 + expect(response.status).toBe(200); 383 + expect(response.ok).toBe(true); 384 + await expect(() => 385 + response.text() 386 + ).rejects.toThrowErrorMatchingInlineSnapshot(`[Error: aborted]`); 387 + }); 388 + }); 389 + 390 + describe('responses', () => { 391 + it('should handle chunked response with more than 1 chunk in the final packet', async () => { 392 + const response = await fetch(new URL('chunked/multiple-ending', baseURL)); 393 + expect(response.ok).toBe(true); 394 + expect(await response.text()).toBe('foobar'); 395 + }); 396 + 397 + it('should handle chunked response with final chunk and EOM in separate packets', async () => { 398 + const response = await fetch(new URL('chunked/split-ending', baseURL)); 399 + expect(response.ok).toBe(true); 400 + expect(await response.text()).toBe('foobar'); 401 + }); 402 + 403 + it('should reject invalid json response', async () => { 404 + const response = await fetch(new URL('error/json', baseURL)); 405 + expect(response.headers.get('content-type')).toBe('application/json'); 406 + await expect(() => response.json()).rejects.toThrow(/Unexpected token/); 407 + }); 408 + 409 + it('should reject decoding body twice', async () => { 410 + const response = await fetch(new URL('plain', baseURL)); 411 + expect(response.headers.get('Content-Type')).toBe('text/plain'); 412 + await response.text(); 413 + expect(response.bodyUsed).toBe(true); 414 + await expect(() => response.text()).rejects.toThrow(/Body is unusable/); 415 + }); 416 + 417 + it('should handle response with no status text', async () => { 418 + const response = await fetch(new URL('no-status-text', baseURL)); 419 + expect(response.statusText).toBe(''); 420 + }); 421 + 422 + it('should allow piping response body as stream', async () => { 423 + const response = await fetch(new URL('hello', baseURL)); 424 + const onResult = vi.fn(data => { 425 + expect(Buffer.from(data).toString()).toBe('world'); 426 + }); 427 + await streamToPromise(response.body!, onResult); 428 + expect(onResult).toHaveBeenCalledOnce(); 429 + }); 430 + 431 + it('should allow cloning response body to two streams', async () => { 432 + const response = await fetch(new URL('hello', baseURL)); 433 + const clone = response.clone(); 434 + const onResult = vi.fn(data => { 435 + expect(Buffer.from(data).toString()).toBe('world'); 436 + }); 437 + await Promise.all([ 438 + streamToPromise(response.body!, onResult), 439 + streamToPromise(clone.body!, onResult), 440 + ]); 441 + expect(onResult).toHaveBeenCalledTimes(2); 442 + }); 443 + 444 + describe('no content', () => { 445 + it('should handle no content response', async () => { 446 + const response = await fetch(new URL('no-content', baseURL)); 447 + expect(response.status).toBe(204); 448 + expect(response.statusText).toBe('No Content'); 449 + expect(response.ok).toBe(true); 450 + expect(await response.text()).toBe(''); 451 + }); 452 + 453 + it('should reject when trying to parse no content response as json', async () => { 454 + const response = await fetch(new URL('no-content', baseURL)); 455 + expect(response.status).toBe(204); 456 + expect(response.statusText).toBe('No Content'); 457 + expect(response.ok).toBe(true); 458 + await expect(() => 459 + response.json() 460 + ).rejects.toThrowErrorMatchingInlineSnapshot( 461 + `[SyntaxError: Unexpected end of JSON input]` 462 + ); 463 + }); 464 + 465 + it('should handle no content response with gzip encoding', async () => { 466 + const response = await fetch(new URL('no-content/gzip', baseURL)); 467 + expect(response.status).toBe(204); 468 + expect(response.statusText).toBe('No Content'); 469 + expect(response.headers.get('Content-Encoding')).toBe('gzip'); 470 + expect(response.ok).toBe(true); 471 + expect(await response.text()).toBe(''); 472 + }); 473 + 474 + it('should handle 304 response', async () => { 475 + const response = await fetch(new URL('not-modified', baseURL)); 476 + expect(response.status).toBe(304); 477 + expect(response.statusText).toBe('Not Modified'); 478 + expect(response.ok).toBe(false); 479 + expect(await response.text()).toBe(''); 480 + }); 481 + 482 + it('should handle 304 response with gzip encoding', async () => { 483 + const response = await fetch(new URL('not-modified/gzip', baseURL)); 484 + expect(response.status).toBe(304); 485 + expect(response.statusText).toBe('Not Modified'); 486 + expect(response.headers.get('Content-Encoding')).toBe('gzip'); 487 + expect(response.ok).toBe(false); 488 + expect(await response.text()).toBe(''); 489 + }); 490 + }); 491 + }); 492 + 493 + describe('content encoding', () => { 494 + it('should decompress gzip response', async () => { 495 + const response = await fetch(new URL('gzip', baseURL)); 496 + expect(response.headers.get('content-type')).toBe('text/plain'); 497 + expect(response.headers.get('content-encoding')).toBe('gzip'); 498 + expect(await response.text()).toBe('hello world'); 499 + }); 500 + 501 + it('should decompress slightly invalid gzip response', async () => { 502 + const response = await fetch(new URL('gzip-truncated', baseURL)); 503 + expect(response.headers.get('content-type')).toBe('text/plain'); 504 + expect(response.headers.get('content-encoding')).toBe('gzip'); 505 + expect(await response.text()).toBe('hello world'); 506 + }); 507 + 508 + it('should make capitalised Content-Encoding lowercase', async () => { 509 + const response = await fetch(new URL('gzip-capital', baseURL)); 510 + expect(response.headers.get('content-type')).toBe('text/plain'); 511 + expect(response.headers.get('content-encoding')).toBe('gzip'); 512 + expect(await response.text()).toBe('hello world'); 513 + }); 514 + 515 + it('should decompress deflate response', async () => { 516 + const response = await fetch(new URL('deflate', baseURL)); 517 + expect(response.headers.get('content-type')).toBe('text/plain'); 518 + expect(response.headers.get('content-encoding')).toBe('deflate'); 519 + expect(await response.text()).toBe('hello world'); 520 + }); 521 + 522 + it('should decompress deflate raw response from old apache server', async () => { 523 + const response = await fetch(new URL('deflate-raw', baseURL)); 524 + expect(response.headers.get('content-type')).toBe('text/plain'); 525 + expect(response.headers.get('content-encoding')).toBe('deflate'); 526 + expect(await response.text()).toBe('hello world'); 527 + }); 528 + 529 + it('should decompress brotli response', async () => { 530 + const response = await fetch(new URL('brotli', baseURL)); 531 + expect(response.headers.get('content-type')).toBe('text/plain'); 532 + expect(response.headers.get('content-encoding')).toBe('br'); 533 + expect(await response.text()).toBe('hello world'); 534 + }); 535 + 536 + it('should skip decompression if unsupported', async () => { 537 + const response = await fetch(new URL('sdch', baseURL)); 538 + expect(response.headers.get('content-type')).toBe('text/plain'); 539 + expect(response.headers.get('content-encoding')).toBe('sdch'); 540 + expect(await response.text()).toBe('fake sdch string'); 541 + }); 542 + 543 + it('should reject if response compression is invalid', async () => { 544 + const response = await fetch( 545 + new URL('invalid-content-encoding', baseURL) 546 + ); 547 + expect(response.headers.get('content-type')).toBe('text/plain'); 548 + expect(response.headers.get('content-encoding')).toBe('gzip'); 549 + await expect(() => 550 + response.text() 551 + ).rejects.toThrowErrorMatchingInlineSnapshot( 552 + `[Error: incorrect header check]` 553 + ); 554 + }); 555 + 556 + it('should handle errors on invalid body stream even if it is not used', async () => { 557 + const response = await fetch( 558 + new URL('invalid-content-encoding', baseURL) 559 + ); 560 + expect(response.headers.get('content-type')).toBe('text/plain'); 561 + expect(response.headers.get('content-encoding')).toBe('gzip'); 562 + await new Promise(resolve => setTimeout(resolve, 20)); 563 + }); 564 + 565 + it('should reject when invalid body stream is used later', async () => { 566 + const response = await fetch( 567 + new URL('invalid-content-encoding', baseURL) 568 + ); 569 + expect(response.headers.get('content-type')).toBe('text/plain'); 570 + expect(response.headers.get('content-encoding')).toBe('gzip'); 571 + await new Promise(resolve => setTimeout(resolve, 20)); 572 + await expect(() => 573 + response.text() 574 + ).rejects.toThrowErrorMatchingInlineSnapshot( 575 + `[Error: incorrect header check]` 576 + ); 577 + }); 578 + }); 579 + 580 + describe('AbortController', () => { 581 + let controller: AbortController; 582 + 583 + beforeEach(() => { 584 + controller = new AbortController(); 585 + }); 586 + 587 + it('should support request cancellation with signal', async () => { 588 + const response$ = fetch(new URL('timeout', baseURL), { 589 + method: 'POST', 590 + signal: controller.signal, 591 + headers: { 592 + 'Content-Type': 'application/json', 593 + body: JSON.stringify({ hello: 'world' }), 594 + }, 595 + }); 596 + setTimeout(() => controller.abort(), 100); 597 + await expect(response$).rejects.toThrowErrorMatchingInlineSnapshot( 598 + `[AbortError: The operation was aborted]` 599 + ); 600 + }); 601 + 602 + it('should support multiple request cancellation with signal', async () => { 603 + const fetches = [ 604 + fetch(new URL('timeout', baseURL), { signal: controller.signal }), 605 + fetch(new URL('timeout', baseURL), { 606 + method: 'POST', 607 + signal: controller.signal, 608 + headers: { 609 + 'Content-Type': 'application/json', 610 + body: JSON.stringify({ hello: 'world' }), 611 + }, 612 + }), 613 + ]; 614 + setTimeout(() => controller.abort(), 100); 615 + await expect(fetches[0]).rejects.toThrowErrorMatchingInlineSnapshot( 616 + `[AbortError: The operation was aborted]` 617 + ); 618 + await expect(fetches[1]).rejects.toThrowErrorMatchingInlineSnapshot( 619 + `[AbortError: The operation was aborted]` 620 + ); 621 + }); 622 + 623 + it('should reject immediately if signal has already been aborted', async () => { 624 + controller.abort(); 625 + await expect(() => { 626 + return fetch(new URL('timeout', baseURL), { 627 + signal: controller.signal, 628 + }); 629 + }).rejects.toThrowErrorMatchingInlineSnapshot( 630 + `[AbortError: The operation was aborted]` 631 + ); 632 + }); 633 + 634 + it('should allow redirects to be aborted', async () => { 635 + const request = new Request(new URL('redirect/slow', baseURL), { 636 + signal: controller.signal, 637 + }); 638 + setTimeout(() => controller.abort(), 20); 639 + await expect(() => 640 + fetch(request) 641 + ).rejects.toThrowErrorMatchingInlineSnapshot( 642 + `[AbortError: The operation was aborted]` 643 + ); 644 + }); 645 + 646 + it('should allow redirected response body to be aborted', async () => { 647 + const response = await fetch(new URL('redirect/slow-stream', baseURL), { 648 + signal: controller.signal, 649 + }); 650 + expect(response.headers.get('content-type')).toBe('text/plain'); 651 + const text$ = response.text(); 652 + controller.abort(); 653 + await expect(text$).rejects.toThrowErrorMatchingInlineSnapshot( 654 + `[AbortError: This operation was aborted]` 655 + ); 656 + }); 657 + 658 + it('should reject response body when aborted before stream completes', async () => { 659 + const response = await fetch(new URL('slow', baseURL), { 660 + signal: controller.signal, 661 + }); 662 + const text$ = response.text(); 663 + controller.abort(); 664 + await expect(text$).rejects.toThrowErrorMatchingInlineSnapshot( 665 + `[AbortError: This operation was aborted]` 666 + ); 667 + }); 668 + 669 + it('should reject response body methods immediately with AbortError when aborted before stream is disturbed', async () => { 670 + const response$ = fetch(new URL('slow', baseURL), { 671 + signal: controller.signal, 672 + }); 673 + controller.abort(); 674 + await expect(response$).rejects.toThrowErrorMatchingInlineSnapshot( 675 + `[AbortError: The operation was aborted]` 676 + ); 677 + }); 678 + 679 + it('should emit error event to response body with an AbortError when aborted before underlying stream is closed', async () => { 680 + const response = await fetch(new URL('slow', baseURL), { 681 + signal: controller.signal, 682 + }); 683 + const done$ = expect(() => 684 + response.arrayBuffer() 685 + ).rejects.toThrowErrorMatchingInlineSnapshot( 686 + `[AbortError: This operation was aborted]` 687 + ); 688 + controller.abort(); 689 + await done$; 690 + }); 691 + 692 + it('should cancel request body of type Stream with AbortError when aborted', async () => { 693 + const body = new stream.Readable({ objectMode: true }); 694 + body._read = () => {}; 695 + const response$ = fetch(new URL('slow', baseURL), { 696 + signal: controller.signal, 697 + method: 'POST', 698 + body, 699 + }); 700 + const bodyError$ = new Promise(resolve => { 701 + body.on('error', error => { 702 + expect(error).toMatchInlineSnapshot( 703 + `[AbortError: The operation was aborted]` 704 + ); 705 + resolve(null); 706 + }); 707 + }); 708 + controller.abort(); 709 + await bodyError$; 710 + await expect(response$).rejects.toMatchInlineSnapshot( 711 + `[AbortError: The operation was aborted]` 712 + ); 713 + }); 714 + 715 + it('should throw a TypeError if a signal is not of type AbortSignal or EventTarget', async () => { 716 + const url = new URL('inspect', baseURL); 717 + await Promise.all([ 718 + expect(() => 719 + fetch(url, { signal: {} as any }) 720 + ).rejects.toThrowErrorMatchingInlineSnapshot( 721 + `[TypeError: The "signal" argument must be an instance of AbortSignal. Received an instance of Object]` 722 + ), 723 + expect(() => 724 + fetch(url, { signal: Object.create(null) as any }) 725 + ).rejects.toThrowErrorMatchingInlineSnapshot( 726 + `[TypeError: The "signal" argument must be an instance of AbortSignal. Received [Object: null prototype] {}]` 727 + ), 728 + ]); 729 + }); 730 + 731 + it('should gracefully handle a nullish signal', async () => { 732 + const url = new URL('inspect', baseURL); 733 + await Promise.all([ 734 + expect(fetch(url, { signal: null })).resolves.toMatchObject({ 735 + ok: true, 736 + }), 737 + expect(fetch(url, { signal: undefined })).resolves.toMatchObject({ 738 + ok: true, 739 + }), 740 + ]); 741 + }); 742 + }); 743 + 744 + describe('request body', () => { 745 + it('should allow POST request with empty body', async () => { 746 + const response = await fetch(new URL('inspect', baseURL), { 747 + method: 'POST', 748 + }); 749 + const inspect = await response.json(); 750 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 751 + expect(inspect).not.toHaveProperty('headers.content-type'); 752 + expect(inspect).toMatchObject({ 753 + method: 'POST', 754 + headers: { 755 + 'content-length': '0', 756 + }, 757 + }); 758 + }); 759 + 760 + it('should allow POST request with string body', async () => { 761 + const response = await fetch(new URL('inspect', baseURL), { 762 + method: 'POST', 763 + body: 'a=1', 764 + }); 765 + const inspect = await response.json(); 766 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 767 + expect(inspect).toMatchObject({ 768 + method: 'POST', 769 + body: 'a=1', 770 + headers: { 771 + 'content-type': 'text/plain;charset=UTF-8', 772 + 'content-length': '3', 773 + }, 774 + }); 775 + }); 776 + 777 + it('should allow POST request with Buffer body', async () => { 778 + const response = await fetch(new URL('inspect', baseURL), { 779 + method: 'POST', 780 + body: Buffer.from('a=1', 'utf8'), 781 + }); 782 + const inspect = await response.json(); 783 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 784 + expect(inspect).not.toHaveProperty('headers.content-type'); 785 + expect(inspect).toMatchObject({ 786 + method: 'POST', 787 + body: 'a=1', 788 + headers: { 789 + 'content-length': '3', 790 + }, 791 + }); 792 + }); 793 + 794 + it('should allow POST request with ArrayBuffer body', async () => { 795 + const response = await fetch(new URL('inspect', baseURL), { 796 + method: 'POST', 797 + body: new TextEncoder().encode('Hello, world!\n').buffer, 798 + }); 799 + const inspect = await response.json(); 800 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 801 + expect(inspect).not.toHaveProperty('headers.content-type'); 802 + expect(inspect).toMatchObject({ 803 + method: 'POST', 804 + body: 'Hello, world!\n', 805 + headers: { 806 + 'content-length': '14', 807 + }, 808 + }); 809 + }); 810 + 811 + it('should allow POST request with ArrayBuffer body from a VM context', async () => { 812 + const response = await fetch(new URL('inspect', baseURL), { 813 + method: 'POST', 814 + body: new VMUint8Array(Buffer.from('Hello, world!\n')).buffer, 815 + }); 816 + const inspect = await response.json(); 817 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 818 + expect(inspect).not.toHaveProperty('headers.content-type'); 819 + expect(inspect).toMatchObject({ 820 + method: 'POST', 821 + body: 'Hello, world!\n', 822 + headers: { 823 + 'content-length': '14', 824 + }, 825 + }); 826 + }); 827 + 828 + it('should allow POST request with ArrayBufferView (Uint8Array) body', async () => { 829 + const response = await fetch(new URL('inspect', baseURL), { 830 + method: 'POST', 831 + body: new TextEncoder().encode('Hello, world!\n'), 832 + }); 833 + const inspect = await response.json(); 834 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 835 + expect(inspect).not.toHaveProperty('headers.content-type'); 836 + expect(inspect).toMatchObject({ 837 + method: 'POST', 838 + body: 'Hello, world!\n', 839 + headers: { 840 + 'content-length': '14', 841 + }, 842 + }); 843 + }); 844 + 845 + it('should allow POST request with ArrayBufferView (DataView) body', async () => { 846 + const response = await fetch(new URL('inspect', baseURL), { 847 + method: 'POST', 848 + body: new DataView(new TextEncoder().encode('Hello, world!\n').buffer), 849 + }); 850 + const inspect = await response.json(); 851 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 852 + expect(inspect).not.toHaveProperty('headers.content-type'); 853 + expect(inspect).toMatchObject({ 854 + method: 'POST', 855 + body: 'Hello, world!\n', 856 + headers: { 857 + 'content-length': '14', 858 + }, 859 + }); 860 + }); 861 + 862 + it('should allow POST request with ArrayBufferView (Uint8Array) body from a VM context', async () => { 863 + const response = await fetch(new URL('inspect', baseURL), { 864 + method: 'POST', 865 + body: new VMUint8Array(new TextEncoder().encode('Hello, world!\n')), 866 + }); 867 + const inspect = await response.json(); 868 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 869 + expect(inspect).not.toHaveProperty('headers.content-type'); 870 + expect(inspect).toMatchObject({ 871 + method: 'POST', 872 + body: 'Hello, world!\n', 873 + headers: { 874 + 'content-length': '14', 875 + }, 876 + }); 877 + }); 878 + 879 + it('should allow POST request with ArrayBufferView (Uint8Array, offset, length) body', async () => { 880 + const response = await fetch(new URL('inspect', baseURL), { 881 + method: 'POST', 882 + body: new TextEncoder().encode('Hello, world!\n').subarray(7, 13), 883 + }); 884 + const inspect = await response.json(); 885 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 886 + expect(inspect).not.toHaveProperty('headers.content-type'); 887 + expect(inspect).toMatchObject({ 888 + method: 'POST', 889 + body: 'world!', 890 + headers: { 891 + 'content-length': '6', 892 + }, 893 + }); 894 + }); 895 + 896 + it('should allow POST request with blob body without type', async () => { 897 + const response = await fetch(new URL('inspect', baseURL), { 898 + method: 'POST', 899 + body: new Blob(['a=1']), 900 + }); 901 + const inspect = await response.json(); 902 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 903 + expect(inspect).not.toHaveProperty('headers.content-type'); 904 + expect(inspect).toMatchObject({ 905 + method: 'POST', 906 + body: 'a=1', 907 + headers: { 908 + 'content-length': '3', 909 + }, 910 + }); 911 + }); 912 + 913 + it('should allow POST request with blob body with type', async () => { 914 + const response = await fetch(new URL('inspect', baseURL), { 915 + method: 'POST', 916 + body: new Blob(['a=1'], { 917 + type: 'text/plain;charset=utf-8', 918 + }), 919 + }); 920 + const inspect = await response.json(); 921 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 922 + expect(inspect).toMatchObject({ 923 + method: 'POST', 924 + body: 'a=1', 925 + headers: { 926 + 'content-type': 'text/plain;charset=utf-8', 927 + 'content-length': '3', 928 + }, 929 + }); 930 + }); 931 + 932 + it('should preserve blob body on roundtrip', async () => { 933 + const body = new Blob(['a=1']); 934 + let response = await fetch(new URL('inspect', baseURL), { 935 + method: 'POST', 936 + body, 937 + }); 938 + expect(await response.json()).toMatchObject({ body: 'a=1' }); 939 + response = await fetch(new URL('inspect', baseURL), { 940 + method: 'POST', 941 + body: new Blob(['a=1']), 942 + }); 943 + expect(await response.json()).toMatchObject({ body: 'a=1' }); 944 + }); 945 + 946 + it('should allow POST request with readable stream as body', async () => { 947 + const response = await fetch(new URL('inspect', baseURL), { 948 + method: 'POST', 949 + body: stream.Readable.from('a=1'), 950 + }); 951 + const inspect = await response.json(); 952 + expect(inspect).not.toHaveProperty('headers.content-type'); 953 + expect(inspect).not.toHaveProperty('headers.content-length'); 954 + expect(inspect).toMatchObject({ 955 + method: 'POST', 956 + body: 'a=1', 957 + headers: { 958 + 'transfer-encoding': 'chunked', 959 + }, 960 + }); 961 + }); 962 + 963 + it('should allow POST request with FormData as body', async () => { 964 + const form = new FormData(); 965 + form.append('a', '1'); 966 + 967 + const response = await fetch(new URL('multipart', baseURL), { 968 + method: 'POST', 969 + body: form, 970 + }); 971 + const inspect = await response.json(); 972 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 973 + expect(inspect).toMatchObject({ 974 + method: 'POST', 975 + body: 'a=1', 976 + headers: { 977 + 'content-type': expect.stringMatching( 978 + /^multipart\/form-data; boundary=/ 979 + ), 980 + 'content-length': '109', 981 + }, 982 + }); 983 + }); 984 + 985 + it('should allow POST request with form-data using stream as body', async () => { 986 + const form = new FormDataPolyfill(); 987 + form.append('my_field', stream.Readable.from('dummy')); 988 + 989 + const response = await fetch(new URL('multipart', baseURL), { 990 + method: 'POST', 991 + body: form, 992 + }); 993 + const inspect = await response.json(); 994 + expect(inspect).not.toHaveProperty('headers.content-length'); 995 + expect(inspect).toMatchObject({ 996 + method: 'POST', 997 + body: 'my_field=undefined', 998 + headers: { 999 + 'transfer-encoding': 'chunked', 1000 + 'content-type': expect.stringMatching( 1001 + /^multipart\/form-data; boundary=/ 1002 + ), 1003 + }, 1004 + }); 1005 + }); 1006 + 1007 + it('should allow POST request with URLSearchParams as body', async () => { 1008 + const params = new URLSearchParams(); 1009 + params.set('key1', 'value1'); 1010 + params.set('key2', 'value2'); 1011 + 1012 + const response = await fetch(new URL('multipart', baseURL), { 1013 + method: 'POST', 1014 + body: params, 1015 + }); 1016 + const inspect = await response.json(); 1017 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 1018 + expect(inspect).toMatchObject({ 1019 + method: 'POST', 1020 + body: 'key1=value1key2=value2', 1021 + headers: { 1022 + 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8', 1023 + 'content-length': '23', 1024 + }, 1025 + }); 1026 + }); 1027 + 1028 + it('should allow POST request with extended URLSearchParams as body', async () => { 1029 + class CustomSearchParameters extends URLSearchParams {} 1030 + const params = new CustomSearchParameters(); 1031 + params.set('key1', 'value1'); 1032 + params.set('key2', 'value2'); 1033 + 1034 + const response = await fetch(new URL('multipart', baseURL), { 1035 + method: 'POST', 1036 + body: params, 1037 + }); 1038 + const inspect = await response.json(); 1039 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 1040 + expect(inspect).toMatchObject({ 1041 + method: 'POST', 1042 + body: 'key1=value1key2=value2', 1043 + headers: { 1044 + 'content-type': 'application/x-www-form-urlencoded;charset=UTF-8', 1045 + 'content-length': '23', 1046 + }, 1047 + }); 1048 + }); 1049 + 1050 + it('should allow POST request with invalid body', async () => { 1051 + const response = await fetch(new URL('inspect', baseURL), { 1052 + method: 'POST', 1053 + body: { a: 1 } as any, 1054 + }); 1055 + const inspect = await response.json(); 1056 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 1057 + expect(inspect).toMatchObject({ 1058 + method: 'POST', 1059 + body: '[object Object]', 1060 + headers: { 1061 + 'content-type': 'text/plain;charset=UTF-8', 1062 + 'content-length': expect.any(String), 1063 + }, 1064 + }); 1065 + }); 1066 + 1067 + it('should overwrite Content-Length if possible', async () => { 1068 + const response = await fetch(new URL('inspect', baseURL), { 1069 + method: 'POST', 1070 + body: new Blob(['a=1']), 1071 + headers: { 1072 + 'Content-Length': '1000', 1073 + }, 1074 + }); 1075 + const inspect = await response.json(); 1076 + expect(inspect).not.toHaveProperty('headers.transfer-encoding'); 1077 + expect(inspect).not.toHaveProperty('headers.content-type'); 1078 + expect(inspect).toMatchObject({ 1079 + method: 'POST', 1080 + body: 'a=1', 1081 + headers: { 1082 + 'content-length': '3', 1083 + }, 1084 + }); 1085 + }); 1086 + 1087 + it.each([['PUT'], ['DELETE'], ['PATCH']])( 1088 + 'should allow %s request', 1089 + async method => { 1090 + const response = await fetch(new URL('inspect', baseURL), { 1091 + method, 1092 + body: 'a=1', 1093 + }); 1094 + const inspect = await response.json(); 1095 + expect(inspect).toMatchObject({ 1096 + method, 1097 + body: 'a=1', 1098 + }); 1099 + } 1100 + ); 1101 + 1102 + it('should allow HEAD requests', async () => { 1103 + const response = await fetch(new URL('inspect', baseURL), { 1104 + method: 'HEAD', 1105 + }); 1106 + expect(response.status).toBe(200); 1107 + expect(await response.text()).toBe(''); 1108 + }); 1109 + 1110 + it('should allow HEAD requests with Content-Encoding header', async () => { 1111 + const response = await fetch(new URL('error/404', baseURL), { 1112 + method: 'HEAD', 1113 + }); 1114 + expect(response.status).toBe(404); 1115 + expect(response.headers.get('Content-Encoding')).toBe('gzip'); 1116 + expect(await response.text()).toBe(''); 1117 + }); 1118 + 1119 + it('should allow OPTIONS request', async () => { 1120 + const response = await fetch(new URL('options', baseURL), { 1121 + method: 'OPTIONS', 1122 + }); 1123 + expect(response.status).toBe(200); 1124 + expect(response.headers.get('Allow')).toBe('GET, HEAD, OPTIONS'); 1125 + expect(await response.text()).toBe('hello world'); 1126 + }); 1127 + 1128 + it('should support fetch with Request instance', async () => { 1129 + const request = new Request(new URL('hello', baseURL)); 1130 + const response = await fetch(request); 1131 + expect(response.url).toBe(request.url); 1132 + expect(response.ok).toBe(true); 1133 + expect(response.status).toBe(200); 1134 + }); 1135 + }); 1136 + 1137 + describe('request URL', () => { 1138 + it('should keep `?` sign in URL when no params are given', async () => { 1139 + const response = await fetch(new URL('question?', baseURL)); 1140 + expect(response.url).toBe(`${baseURL}question?`); 1141 + }); 1142 + 1143 + it('if params are given, do not modify anything', async () => { 1144 + const response = await fetch(new URL('question?a=1', baseURL)); 1145 + expect(response.url).toBe(`${baseURL}question?a=1`); 1146 + }); 1147 + 1148 + it('should preserve the hash (#) symbol', async () => { 1149 + const response = await fetch(new URL('question?#', baseURL)); 1150 + expect(response.url).toBe(`${baseURL}question?#`); 1151 + }); 1152 + 1153 + it('should encode URLs as UTF-8', async () => { 1154 + const url = new URL('möbius', baseURL); 1155 + const res = await fetch(url); 1156 + expect(res.url).to.equal(`${baseURL}m%C3%B6bius`); 1157 + }); 1158 + }); 1159 + });
+480
src/__tests__/utils/server.js
··· 1 + // See: https://github.com/remix-run/web-std-io/blob/7a8596e/packages/fetch/test/utils/server.js 2 + 3 + import http from 'http'; 4 + import zlib from 'zlib'; 5 + import Busboy from 'busboy'; 6 + import {once} from 'events'; 7 + 8 + export default class TestServer { 9 + constructor() { 10 + this.server = http.createServer(this.router); 11 + // Node 8 default keepalive timeout is 5000ms 12 + // make it shorter here as we want to close server quickly at the end of tests 13 + this.server.keepAliveTimeout = 1000; 14 + this.server.on('error', err => { 15 + console.log(err.stack); 16 + }); 17 + this.server.on('connection', socket => { 18 + socket.setTimeout(1500); 19 + }); 20 + } 21 + 22 + async start() { 23 + this.server.listen(0, 'localhost'); 24 + return once(this.server, 'listening'); 25 + } 26 + 27 + async stop() { 28 + this.server.close(); 29 + return once(this.server, 'close'); 30 + } 31 + 32 + get port() { 33 + return this.server.address().port; 34 + } 35 + 36 + get hostname() { 37 + return 'localhost'; 38 + } 39 + 40 + mockResponse(responseHandler) { 41 + this.server.nextResponseHandler = responseHandler; 42 + return `http://${this.hostname}:${this.port}/mocked`; 43 + } 44 + 45 + router(request, res) { 46 + const p = request.url; 47 + 48 + if (p === '/mocked') { 49 + if (this.nextResponseHandler) { 50 + this.nextResponseHandler(res); 51 + this.nextResponseHandler = undefined; 52 + } else { 53 + throw new Error('No mocked response. Use ’TestServer.mockResponse()’.'); 54 + } 55 + } 56 + 57 + if (p === '/hello') { 58 + res.statusCode = 200; 59 + res.setHeader('Content-Type', 'text/plain'); 60 + res.end('world'); 61 + } 62 + 63 + if (p.includes('question')) { 64 + res.statusCode = 200; 65 + res.setHeader('Content-Type', 'text/plain'); 66 + res.end('ok'); 67 + } 68 + 69 + if (p === '/plain') { 70 + res.statusCode = 200; 71 + res.setHeader('Content-Type', 'text/plain'); 72 + res.end('text'); 73 + } 74 + 75 + if (p === '/no-status-text') { 76 + res.writeHead(200, '', {}).end(); 77 + } 78 + 79 + if (p === '/options') { 80 + res.statusCode = 200; 81 + res.setHeader('Allow', 'GET, HEAD, OPTIONS'); 82 + res.end('hello world'); 83 + } 84 + 85 + if (p === '/html') { 86 + res.statusCode = 200; 87 + res.setHeader('Content-Type', 'text/html'); 88 + res.end('<html></html>'); 89 + } 90 + 91 + if (p === '/json') { 92 + res.statusCode = 200; 93 + res.setHeader('Content-Type', 'application/json'); 94 + res.end(JSON.stringify({ 95 + name: 'value' 96 + })); 97 + } 98 + 99 + if (p === '/gzip') { 100 + res.statusCode = 200; 101 + res.setHeader('Content-Type', 'text/plain'); 102 + res.setHeader('Content-Encoding', 'gzip'); 103 + zlib.gzip('hello world', (err, buffer) => { 104 + if (err) { 105 + throw err; 106 + } 107 + 108 + res.end(buffer); 109 + }); 110 + } 111 + 112 + if (p === '/gzip-truncated') { 113 + res.statusCode = 200; 114 + res.setHeader('Content-Type', 'text/plain'); 115 + res.setHeader('Content-Encoding', 'gzip'); 116 + zlib.gzip('hello world', (err, buffer) => { 117 + if (err) { 118 + throw err; 119 + } 120 + 121 + // Truncate the CRC checksum and size check at the end of the stream 122 + res.end(buffer.slice(0, -8)); 123 + }); 124 + } 125 + 126 + if (p === '/gzip-capital') { 127 + res.statusCode = 200; 128 + res.setHeader('Content-Type', 'text/plain'); 129 + res.setHeader('Content-Encoding', 'GZip'); 130 + zlib.gzip('hello world', (err, buffer) => { 131 + if (err) { 132 + throw err; 133 + } 134 + 135 + res.end(buffer); 136 + }); 137 + } 138 + 139 + if (p === '/deflate') { 140 + res.statusCode = 200; 141 + res.setHeader('Content-Type', 'text/plain'); 142 + res.setHeader('Content-Encoding', 'deflate'); 143 + zlib.deflate('hello world', (err, buffer) => { 144 + if (err) { 145 + throw err; 146 + } 147 + 148 + res.end(buffer); 149 + }); 150 + } 151 + 152 + if (p === '/brotli') { 153 + res.statusCode = 200; 154 + res.setHeader('Content-Type', 'text/plain'); 155 + if (typeof zlib.createBrotliDecompress === 'function') { 156 + res.setHeader('Content-Encoding', 'br'); 157 + zlib.brotliCompress('hello world', (err, buffer) => { 158 + if (err) { 159 + throw err; 160 + } 161 + 162 + res.end(buffer); 163 + }); 164 + } 165 + } 166 + 167 + if (p === '/deflate-raw') { 168 + res.statusCode = 200; 169 + res.setHeader('Content-Type', 'text/plain'); 170 + res.setHeader('Content-Encoding', 'deflate'); 171 + zlib.deflateRaw('hello world', (err, buffer) => { 172 + if (err) { 173 + throw err; 174 + } 175 + 176 + res.end(buffer); 177 + }); 178 + } 179 + 180 + if (p === '/sdch') { 181 + res.statusCode = 200; 182 + res.setHeader('Content-Type', 'text/plain'); 183 + res.setHeader('Content-Encoding', 'sdch'); 184 + res.end('fake sdch string'); 185 + } 186 + 187 + if (p === '/invalid-content-encoding') { 188 + res.statusCode = 200; 189 + res.setHeader('Content-Type', 'text/plain'); 190 + res.setHeader('Content-Encoding', 'gzip'); 191 + res.end('fake gzip string'); 192 + } 193 + 194 + if (p === '/timeout') { 195 + setTimeout(() => { 196 + res.statusCode = 200; 197 + res.setHeader('Content-Type', 'text/plain'); 198 + res.end('text'); 199 + }, 1000); 200 + } 201 + 202 + if (p === '/slow') { 203 + res.statusCode = 200; 204 + res.setHeader('Content-Type', 'text/plain'); 205 + res.write('test'); 206 + setTimeout(() => { 207 + res.end('test'); 208 + }, 1000); 209 + } 210 + 211 + if (p === '/cookie') { 212 + res.statusCode = 200; 213 + res.setHeader('Set-Cookie', ['a=1', 'b=1']); 214 + res.end('cookie'); 215 + } 216 + 217 + if (p === '/size/chunk') { 218 + res.statusCode = 200; 219 + res.setHeader('Content-Type', 'text/plain'); 220 + setTimeout(() => { 221 + res.write('test'); 222 + }, 10); 223 + setTimeout(() => { 224 + res.end('test'); 225 + }, 20); 226 + } 227 + 228 + if (p === '/size/long') { 229 + res.statusCode = 200; 230 + res.setHeader('Content-Type', 'text/plain'); 231 + res.end('testtest'); 232 + } 233 + 234 + if (p === '/redirect/301') { 235 + res.statusCode = 301; 236 + res.setHeader('Location', '/inspect'); 237 + res.end(); 238 + } 239 + 240 + if (p === '/redirect/301/file') { 241 + res.statusCode = 301; 242 + res.setHeader('Location', 'file://inspect'); 243 + res.end(); 244 + } 245 + 246 + if (p === '/redirect/301/rn') { 247 + res.statusCode = 301 248 + res.setHeader('Location', '/403') 249 + res.write('301 Permanently moved.\r\n'); 250 + res.end(); 251 + } 252 + 253 + if (p === '/403') { 254 + res.statusCode = 403; 255 + res.write('403 Forbidden'); 256 + res.end(); 257 + } 258 + 259 + if (p === '/redirect/302') { 260 + res.statusCode = 302; 261 + res.setHeader('Location', '/inspect'); 262 + res.end(); 263 + } 264 + 265 + if (p === '/redirect/303') { 266 + res.statusCode = 303; 267 + res.setHeader('Location', '/inspect'); 268 + res.end(); 269 + } 270 + 271 + if (p === '/redirect/307') { 272 + res.statusCode = 307; 273 + res.setHeader('Location', '/inspect'); 274 + res.end(); 275 + } 276 + 277 + if (p === '/redirect/308') { 278 + res.statusCode = 308; 279 + res.setHeader('Location', '/inspect'); 280 + res.end(); 281 + } 282 + 283 + if (p === '/redirect/chain') { 284 + res.statusCode = 301; 285 + res.setHeader('Location', '/redirect/301'); 286 + res.end(); 287 + } 288 + 289 + if (p === '/redirect/no-location') { 290 + res.statusCode = 301; 291 + res.end(); 292 + } 293 + 294 + if (p === '/redirect/slow') { 295 + res.statusCode = 301; 296 + res.setHeader('Location', '/redirect/301'); 297 + setTimeout(() => { 298 + res.end(); 299 + }, 1000); 300 + } 301 + 302 + if (p === '/redirect/slow-chain') { 303 + res.statusCode = 301; 304 + res.setHeader('Location', '/redirect/slow'); 305 + setTimeout(() => { 306 + res.end(); 307 + }, 10); 308 + } 309 + 310 + if (p === '/redirect/slow-stream') { 311 + res.statusCode = 301; 312 + res.setHeader('Location', '/slow'); 313 + res.end(); 314 + } 315 + 316 + if (p === '/redirect/bad-location') { 317 + res.socket.write('HTTP/1.1 301\r\nLocation: ☃\r\nContent-Length: 0\r\n'); 318 + res.socket.end('\r\n'); 319 + } 320 + 321 + if (p === '/redirect/chunked') { 322 + res.writeHead(301, { 323 + Location: '/inspect', 324 + 'Transfer-Encoding': 'chunked' 325 + }); 326 + setTimeout(() => res.end(), 10); 327 + } 328 + 329 + if (p === '/error/400') { 330 + res.statusCode = 400; 331 + res.setHeader('Content-Type', 'text/plain'); 332 + res.end('client error'); 333 + } 334 + 335 + if (p === '/error/404') { 336 + res.statusCode = 404; 337 + res.setHeader('Content-Encoding', 'gzip'); 338 + res.end(); 339 + } 340 + 341 + if (p === '/error/500') { 342 + res.statusCode = 500; 343 + res.setHeader('Content-Type', 'text/plain'); 344 + res.end('server error'); 345 + } 346 + 347 + if (p === '/error/reset') { 348 + res.destroy(); 349 + } 350 + 351 + if (p === '/error/premature') { 352 + res.writeHead(200, {'content-length': 50}); 353 + res.write('foo'); 354 + setTimeout(() => { 355 + res.destroy(); 356 + }, 100); 357 + } 358 + 359 + if (p === '/error/premature/chunked') { 360 + res.writeHead(200, { 361 + 'Content-Type': 'application/json', 362 + 'Transfer-Encoding': 'chunked' 363 + }); 364 + 365 + res.write(`${JSON.stringify({data: 'hi'})}\n`); 366 + 367 + setTimeout(() => { 368 + res.write(`${JSON.stringify({data: 'bye'})}\n`); 369 + }, 50); 370 + 371 + setTimeout(() => { 372 + res.destroy(); 373 + }, 100); 374 + } 375 + 376 + if (p === '/chunked/split-ending') { 377 + res.socket.write('HTTP/1.1 200\r\nTransfer-Encoding: chunked\r\n\r\n'); 378 + res.socket.write('3\r\nfoo\r\n3\r\nbar\r\n'); 379 + 380 + setTimeout(() => { 381 + res.socket.write('0\r\n'); 382 + }, 10); 383 + 384 + setTimeout(() => { 385 + res.socket.end('\r\n'); 386 + }, 20); 387 + } 388 + 389 + if (p === '/chunked/multiple-ending') { 390 + res.socket.write('HTTP/1.1 200\r\nTransfer-Encoding: chunked\r\n\r\n'); 391 + res.socket.write('3\r\nfoo\r\n3\r\nbar\r\n0\r\n\r\n'); 392 + res.end(); 393 + } 394 + 395 + if (p === '/error/json') { 396 + res.statusCode = 200; 397 + res.setHeader('Content-Type', 'application/json'); 398 + res.end('invalid json'); 399 + } 400 + 401 + if (p === '/no-content') { 402 + res.statusCode = 204; 403 + res.end(); 404 + } 405 + 406 + if (p === '/no-content/gzip') { 407 + res.statusCode = 204; 408 + res.setHeader('Content-Encoding', 'gzip'); 409 + res.end(); 410 + } 411 + 412 + if (p === '/no-content/brotli') { 413 + res.statusCode = 204; 414 + res.setHeader('Content-Encoding', 'br'); 415 + res.end(); 416 + } 417 + 418 + if (p === '/not-modified') { 419 + res.statusCode = 304; 420 + res.end(); 421 + } 422 + 423 + if (p === '/not-modified/gzip') { 424 + res.statusCode = 304; 425 + res.setHeader('Content-Encoding', 'gzip'); 426 + res.end(); 427 + } 428 + 429 + if (p === '/inspect') { 430 + res.statusCode = 200; 431 + res.setHeader('Content-Type', 'application/json'); 432 + res.setHeader('X-Inspect', 'inspect'); 433 + let body = ''; 434 + request.on('data', c => { 435 + body += c; 436 + }); 437 + request.on('end', () => { 438 + res.end(JSON.stringify({ 439 + inspect: true, 440 + method: request.method, 441 + url: request.url, 442 + headers: request.headers, 443 + body 444 + })); 445 + }); 446 + } 447 + 448 + if (p === '/multipart') { 449 + res.statusCode = 200; 450 + res.setHeader('Content-Type', 'application/json'); 451 + const busboy = new Busboy({headers: request.headers}); 452 + let body = ''; 453 + busboy.on('file', async (fieldName, file, fileName) => { 454 + body += `${fieldName}=${fileName}`; 455 + // consume file data 456 + // eslint-disable-next-line no-empty, no-unused-vars 457 + for await (const c of file) { } 458 + }); 459 + 460 + busboy.on('field', (fieldName, value) => { 461 + body += `${fieldName}=${value}`; 462 + }); 463 + busboy.on('finish', () => { 464 + res.end(JSON.stringify({ 465 + method: request.method, 466 + url: request.url, 467 + headers: request.headers, 468 + body 469 + })); 470 + }); 471 + request.pipe(busboy); 472 + } 473 + 474 + if (p === '/m%C3%B6bius') { 475 + res.statusCode = 200; 476 + res.setHeader('Content-Type', 'text/plain'); 477 + res.end('ok'); 478 + } 479 + } 480 + }
+197
src/body.ts
··· 1 + import { Readable } from 'node:stream'; 2 + import { isAnyArrayBuffer } from 'node:util/types'; 3 + import { randomBytes } from 'node:crypto'; 4 + 5 + export type BodyInit = 6 + | Exclude<RequestInit['body'], undefined | null> 7 + | FormDataPolyfill 8 + | Readable; 9 + 10 + export interface BodyState { 11 + contentLength: number | null; 12 + contentType: string | null; 13 + body: Readable | ReadableStream | Uint8Array | null; 14 + } 15 + 16 + interface FormDataPolyfill extends Readable { 17 + getBoundary(): string; 18 + getLengthSync(): number; 19 + hasKnownLength(): number; 20 + } 21 + 22 + const CRLF = '\r\n'; 23 + const CRLF_LENGTH = 2; 24 + const BOUNDARY = '-'.repeat(2); 25 + 26 + const isReadable = (object: any): object is Readable => 27 + Readable.isReadable(object); 28 + 29 + const isIterable = ( 30 + object: any 31 + ): object is AsyncIterable<any> | Iterable<any> => 32 + typeof object[Symbol.asyncIterator] === 'function' || 33 + typeof object[Symbol.iterator] === 'function'; 34 + 35 + const isMultipartFormDataStream = (object: any): object is FormDataPolyfill => 36 + typeof object.getBoundary === 'function' && 37 + typeof object.hasKnownLength === 'function' && 38 + typeof object.getLengthSync === 'function' && 39 + Readable.isReadable(object); 40 + 41 + const isFormData = (object: any): object is FormData => 42 + typeof object === 'object' && 43 + typeof object.append === 'function' && 44 + typeof object.set === 'function' && 45 + typeof object.get === 'function' && 46 + typeof object.getAll === 'function' && 47 + typeof object.delete === 'function' && 48 + typeof object.keys === 'function' && 49 + typeof object.values === 'function' && 50 + typeof object.entries === 'function' && 51 + typeof object.constructor === 'function' && 52 + object[Symbol.toStringTag] === 'FormData'; 53 + 54 + const isURLSearchParameters = (object: any): object is URLSearchParams => 55 + typeof object === 'object' && 56 + typeof object.append === 'function' && 57 + typeof object.delete === 'function' && 58 + typeof object.get === 'function' && 59 + typeof object.getAll === 'function' && 60 + typeof object.has === 'function' && 61 + typeof object.set === 'function' && 62 + typeof object.sort === 'function' && 63 + object[Symbol.toStringTag] === 'URLSearchParams'; 64 + 65 + const isReadableStream = (object: any): object is ReadableStream => 66 + typeof object === 'object' && 67 + typeof object.getReader === 'function' && 68 + typeof object.cancel === 'function' && 69 + typeof object.tee === 'function'; 70 + 71 + const isBlob = (object: any): object is Blob => { 72 + if ( 73 + typeof object === 'object' && 74 + typeof object.arrayBuffer === 'function' && 75 + typeof object.type === 'string' && 76 + typeof object.stream === 'function' && 77 + typeof object.constructor === 'function' 78 + ) { 79 + const tag = object[Symbol.toStringTag]; 80 + return tag.startsWith('Blob') || tag.startsWith('File'); 81 + } else { 82 + return false; 83 + } 84 + }; 85 + 86 + const makeFormBoundary = (): string => 87 + `formdata-${randomBytes(8).toString('hex')}`; 88 + 89 + const getFormHeader = ( 90 + boundary: string, 91 + name: string, 92 + field: File | Blob | string 93 + ): string => { 94 + let header = `${BOUNDARY}${boundary}${CRLF}`; 95 + header += `Content-Disposition: form-data; name="${name}"`; 96 + if (isBlob(field)) { 97 + header += `; filename="${(field as File).name ?? 'blob'}"${CRLF}`; 98 + header += `Content-Type: ${field.type || 'application/octet-stream'}`; 99 + } 100 + return `${header}${CRLF}${CRLF}`; 101 + }; 102 + 103 + const getFormFooter = (boundary: string) => 104 + `${BOUNDARY}${boundary}${BOUNDARY}${CRLF}${CRLF}`; 105 + 106 + export const getFormDataLength = (form: FormData, boundary: string) => { 107 + let length = Buffer.byteLength(getFormFooter(boundary)); 108 + for (const [name, value] of form) 109 + length += 110 + Buffer.byteLength(getFormHeader(boundary, name, value)) + 111 + (isBlob(value) ? value.size : Buffer.byteLength(`${value}`)) + 112 + CRLF_LENGTH; 113 + return length; 114 + }; 115 + 116 + async function* generatorOfFormData( 117 + form: FormData, 118 + boundary: string 119 + ): AsyncGenerator<ArrayBufferLike> { 120 + const encoder = new TextEncoder(); 121 + for (const [name, value] of form) { 122 + if (isBlob(value)) { 123 + yield encoder.encode(getFormHeader(boundary, name, value)); 124 + yield* value.stream(); 125 + yield encoder.encode(CRLF); 126 + } else { 127 + yield encoder.encode(getFormHeader(boundary, name, value) + value + CRLF); 128 + } 129 + } 130 + yield encoder.encode(getFormFooter(boundary)); 131 + } 132 + 133 + const encoder = new TextEncoder(); 134 + 135 + export const extractBody = (object: BodyInit | null): BodyState => { 136 + let type: string | null = null; 137 + let body: Readable | ReadableStream | Uint8Array | null; 138 + let size: number | null = null; 139 + if (object == null) { 140 + body = null; 141 + size = 0; 142 + } else if (typeof object === 'string') { 143 + const bytes = encoder.encode(`${object}`); 144 + type = 'text/plain;charset=UTF-8'; 145 + size = bytes.byteLength; 146 + body = bytes; 147 + } else if (isURLSearchParameters(object)) { 148 + const bytes = encoder.encode(object.toString()); 149 + body = bytes; 150 + size = bytes.byteLength; 151 + type = 'application/x-www-form-urlencoded;charset=UTF-8'; 152 + } else if (isBlob(object)) { 153 + size = object.size; 154 + type = object.type || null; 155 + body = object.stream(); 156 + } else if (object instanceof Uint8Array) { 157 + body = object; 158 + size = object.byteLength; 159 + } else if (isAnyArrayBuffer(object)) { 160 + const bytes = new Uint8Array(object); 161 + body = bytes; 162 + size = bytes.byteLength; 163 + } else if (ArrayBuffer.isView(object)) { 164 + const bytes = new Uint8Array( 165 + object.buffer, 166 + object.byteOffset, 167 + object.byteLength 168 + ); 169 + body = bytes; 170 + size = bytes.byteLength; 171 + } else if (isReadableStream(object)) { 172 + body = object; 173 + } else if (isFormData(object)) { 174 + const boundary = makeFormBoundary(); 175 + type = `multipart/form-data; boundary=${boundary}`; 176 + size = getFormDataLength(object, boundary); 177 + body = Readable.from(generatorOfFormData(object, boundary)); 178 + } else if (isMultipartFormDataStream(object)) { 179 + type = `multipart/form-data; boundary=${object.getBoundary()}`; 180 + size = object.hasKnownLength() ? object.getLengthSync() : null; 181 + body = object as Readable; 182 + } else if (isReadable(object)) { 183 + body = object as Readable; 184 + } else if (isIterable(object)) { 185 + body = Readable.from(object); 186 + } else { 187 + const bytes = encoder.encode(`${object}`); 188 + type = 'text/plain;charset=UTF-8'; 189 + body = bytes; 190 + size = bytes.byteLength; 191 + } 192 + return { 193 + contentLength: size, 194 + contentType: type, 195 + body, 196 + }; 197 + };
+70
src/encoding.ts
··· 1 + import { PassThrough, Transform, TransformCallback } from 'node:stream'; 2 + import * as zlib from 'node:zlib'; 3 + 4 + /** @see https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 */ 5 + type Encoding = 'gzip' | 'x-gzip' | 'deflate' | 'x-deflate' | 'br' | {}; 6 + 7 + /** @see https://github.com/nodejs/undici/pull/2650 */ 8 + class InflateStream extends Transform { 9 + _opts?: zlib.ZlibOptions; 10 + _inflate?: Transform; 11 + 12 + constructor(opts?: zlib.ZlibOptions) { 13 + super(); 14 + this._opts = opts; 15 + } 16 + 17 + _transform( 18 + chunk: Buffer, 19 + encoding: BufferEncoding, 20 + callback: TransformCallback 21 + ) { 22 + if (!this._inflate) { 23 + if (chunk.length === 0) { 24 + callback(); 25 + return; 26 + } 27 + this._inflate = 28 + (chunk[0] & 0x0f) === 0x08 29 + ? zlib.createInflate(this._opts) 30 + : zlib.createInflateRaw(this._opts); 31 + this._inflate.on('data', this.push.bind(this)); 32 + this._inflate.on('end', () => this.push(null)); 33 + this._inflate.on('error', err => this.destroy(err)); 34 + } 35 + this._inflate.write(chunk, encoding, callback); 36 + } 37 + 38 + _final(callback: TransformCallback) { 39 + if (this._inflate) { 40 + this._inflate.end(); 41 + this._inflate = undefined; 42 + } 43 + callback(); 44 + } 45 + } 46 + 47 + export const createContentDecoder = (encoding: Encoding | {}) => { 48 + // See: https://github.com/nodejs/undici/blob/008187b/lib/web/fetch/index.js#L2138-L2160 49 + switch (encoding) { 50 + case 'br': 51 + return zlib.createBrotliDecompress({ 52 + flush: zlib.constants.BROTLI_OPERATION_FLUSH, 53 + finishFlush: zlib.constants.BROTLI_OPERATION_FLUSH, 54 + }); 55 + case 'gzip': 56 + case 'x-gzip': 57 + return zlib.createGunzip({ 58 + flush: zlib.constants.Z_SYNC_FLUSH, 59 + finishFlush: zlib.constants.Z_SYNC_FLUSH, 60 + }); 61 + case 'deflate': 62 + case 'x-deflate': 63 + return new InflateStream({ 64 + flush: zlib.constants.Z_SYNC_FLUSH, 65 + finishFlush: zlib.constants.Z_SYNC_FLUSH, 66 + }); 67 + default: 68 + return new PassThrough(); 69 + } 70 + };
+262
src/fetch.ts
··· 1 + import { Stream, Readable, pipeline } from 'node:stream'; 2 + import * as https from 'node:https'; 3 + import * as http from 'node:http'; 4 + import * as url from 'node:url'; 5 + 6 + import { extractBody } from './body'; 7 + import { createContentDecoder } from './encoding'; 8 + 9 + /** Maximum allowed redirects (matching Chromium's limit) */ 10 + const MAX_REDIRECTS = 20; 11 + 12 + /** Convert Node.js raw headers array to Headers */ 13 + const headersOfRawHeaders = (rawHeaders: readonly string[]): Headers => { 14 + const headers = new Headers(); 15 + for (let i = 0; i < rawHeaders.length; i += 2) 16 + headers.set(rawHeaders[i], rawHeaders[i + 1]); 17 + return headers; 18 + }; 19 + 20 + /** Assign Headers to a Node.js OutgoingMessage (request) */ 21 + const assignOutgoingMessageHeaders = ( 22 + outgoing: http.OutgoingMessage, 23 + headers: Headers 24 + ) => { 25 + if (typeof outgoing.setHeaders === 'function') { 26 + outgoing.setHeaders(headers); 27 + } else { 28 + for (const [key, value] of headers) outgoing.setHeader(key, value); 29 + } 30 + }; 31 + 32 + /** Normalize methods and disallow special methods */ 33 + const toRedirectOption = ( 34 + redirect: string | undefined 35 + ): 'follow' | 'manual' | 'error' => { 36 + switch (redirect) { 37 + case 'follow': 38 + case 'manual': 39 + case 'error': 40 + return redirect; 41 + case undefined: 42 + return 'follow'; 43 + default: 44 + throw new TypeError( 45 + `Request constructor: ${redirect} is not an accepted type. Expected one of follow, manual, error.` 46 + ); 47 + } 48 + }; 49 + 50 + /** Normalize methods and disallow special methods */ 51 + const methodToHttpOption = (method: string | undefined): string => { 52 + switch (method) { 53 + case 'CONNECT': 54 + case 'TRACE': 55 + case 'TRACK': 56 + throw new TypeError( 57 + `Failed to construct 'Request': '${method}' HTTP method is unsupported.` 58 + ); 59 + default: 60 + return method ? method.toUpperCase() : 'GET'; 61 + } 62 + }; 63 + 64 + /** Convert URL to Node.js HTTP request options and disallow unsupported protocols */ 65 + const urlToHttpOptions = (input: URL) => { 66 + const _url = new URL(input); 67 + switch (_url.protocol) { 68 + // TODO: 'file:' and 'data:' support 69 + case 'http:': 70 + case 'https:': 71 + return url.urlToHttpOptions(_url); 72 + default: 73 + throw new TypeError(`URL scheme "${_url.protocol}" is not supported.`); 74 + } 75 + }; 76 + 77 + /** Returns if `input` is a Request object */ 78 + const isRequest = (input: any): input is Request => 79 + input != null && typeof input === 'object' && 'body' in input; 80 + 81 + /** Returns if status `code` is a redirect code */ 82 + const isRedirectCode = ( 83 + code: number | undefined 84 + ): code is 301 | 302 | 303 | 307 | 308 => 85 + code === 301 || code === 302 || code === 303 || code === 307 || code === 308; 86 + 87 + function createResponse( 88 + body: ConstructorParameters<typeof Response>[0] | null, 89 + init: ResponseInit, 90 + params: { 91 + url: string; 92 + redirected: boolean; 93 + type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect'; 94 + } 95 + ) { 96 + const response = new Response(body, init); 97 + Object.defineProperty(response, 'url', { value: params.url }); 98 + if (params.type !== 'default') 99 + Object.defineProperty(response, 'type', { value: params.type }); 100 + if (params.redirected) 101 + Object.defineProperty(response, 'redirected', { value: params.redirected }); 102 + return response; 103 + } 104 + 105 + export async function fetch( 106 + input: string | URL | Request, 107 + requestInit?: RequestInit 108 + ): Promise<Response> { 109 + const initFromRequest = isRequest(input); 110 + const initUrl = initFromRequest ? input.url : input; 111 + const initBody = initFromRequest ? input.body : requestInit?.body || null; 112 + const signal = initFromRequest 113 + ? input.signal 114 + : requestInit?.signal || undefined; 115 + const redirect = toRedirectOption( 116 + initFromRequest ? input.redirect : requestInit?.redirect 117 + ); 118 + 119 + let requestUrl = new URL(initUrl); 120 + let requestBody = extractBody(initBody); 121 + let redirects = 0; 122 + 123 + const requestHeaders = new Headers( 124 + requestInit?.headers || (initFromRequest ? input.headers : undefined) 125 + ); 126 + const requestOptions = { 127 + ...urlToHttpOptions(requestUrl), 128 + method: methodToHttpOption( 129 + initFromRequest ? input.method : requestInit?.method 130 + ), 131 + signal, 132 + } satisfies http.RequestOptions; 133 + 134 + function _fetch( 135 + resolve: (response: Response | Promise<Response>) => void, 136 + reject: (reason?: any) => void 137 + ) { 138 + const method = requestOptions.method; 139 + const protocol = requestOptions.protocol === 'https:' ? https : http; 140 + const outgoing = protocol.request(requestOptions); 141 + 142 + outgoing.on('response', incoming => { 143 + incoming.setTimeout(0); // Forcefully disable timeout 144 + 145 + const init = { 146 + status: incoming.statusCode, 147 + statusText: incoming.statusMessage, 148 + headers: headersOfRawHeaders(incoming.rawHeaders), 149 + } satisfies ResponseInit; 150 + 151 + if (isRedirectCode(init.status)) { 152 + const location = init.headers.get('Location'); 153 + const locationURL = 154 + location != null ? new URL(location, requestUrl) : null; 155 + if (redirect === 'error') { 156 + // TODO: do we need a special Error instance here? 157 + reject( 158 + new Error( 159 + 'URI requested responds with a redirect, redirect mode is set to error' 160 + ) 161 + ); 162 + return; 163 + } else if (redirect === 'manual' && locationURL !== null) { 164 + init.headers.set('Location', locationURL.toString()); 165 + } else if (redirect === 'follow' && locationURL !== null) { 166 + if (++redirects > MAX_REDIRECTS) { 167 + reject(new Error(`maximum redirect reached at: ${requestUrl}`)); 168 + return; 169 + } else if ( 170 + locationURL.protocol !== 'http:' && 171 + locationURL.protocol !== 'https:' 172 + ) { 173 + // TODO: do we need a special Error instance here? 174 + reject(new Error('URL scheme must be a HTTP(S) scheme')); 175 + return; 176 + } 177 + 178 + if ( 179 + init.status === 303 || 180 + ((init.status === 301 || init.status === 302) && method === 'POST') 181 + ) { 182 + requestBody = extractBody(null); 183 + requestOptions.method = 'GET'; 184 + requestHeaders.delete('Content-Length'); 185 + } else if ( 186 + requestBody.body != null && 187 + requestBody.contentLength == null 188 + ) { 189 + reject(new Error('Cannot follow redirect with a streamed body')); 190 + return; 191 + } else { 192 + requestBody = extractBody(initBody); 193 + } 194 + 195 + Object.assign( 196 + requestOptions, 197 + urlToHttpOptions((requestUrl = locationURL)) 198 + ); 199 + return _fetch(resolve, reject); 200 + } 201 + } 202 + 203 + const destroy = (reason?: any) => { 204 + signal?.removeEventListener('abort', destroy); 205 + if (reason) { 206 + incoming.destroy(signal?.aborted ? signal.reason : reason); 207 + reject(signal?.aborted ? signal.reason : reason); 208 + } 209 + }; 210 + 211 + signal?.addEventListener('abort', destroy); 212 + 213 + let body: Readable | null = incoming; 214 + const encoding = init.headers.get('Content-Encoding')?.toLowerCase(); 215 + if (method === 'HEAD' || init.status === 204 || init.status === 304) { 216 + body = null; 217 + } else if (encoding != null) { 218 + init.headers.set('Content-Encoding', encoding); 219 + body = pipeline(body, createContentDecoder(encoding), destroy); 220 + } 221 + 222 + resolve( 223 + createResponse(body, init, { 224 + type: 'default', 225 + url: requestUrl.toString(), 226 + redirected: redirects > 0, 227 + }) 228 + ); 229 + }); 230 + 231 + outgoing.on('error', reject); 232 + 233 + if (!requestHeaders.has('Accept')) requestHeaders.set('Accept', '*/*'); 234 + if (requestBody.contentType) 235 + requestHeaders.set('Content-Type', requestBody.contentType); 236 + 237 + if (requestBody.body == null && (method === 'POST' || method === 'PUT')) { 238 + requestHeaders.set('Content-Length', '0'); 239 + } else if (requestBody.body != null && requestBody.contentLength != null) { 240 + requestHeaders.set('Content-Length', `${requestBody.contentLength}`); 241 + } 242 + 243 + assignOutgoingMessageHeaders(outgoing, requestHeaders); 244 + 245 + if (requestBody.body == null) { 246 + outgoing.end(); 247 + } else if (requestBody.body instanceof Uint8Array) { 248 + outgoing.write(requestBody.body); 249 + outgoing.end(); 250 + } else { 251 + const body = 252 + requestBody.body instanceof Stream 253 + ? requestBody.body 254 + : Readable.fromWeb(requestBody.body); 255 + pipeline(body, outgoing, error => { 256 + if (error) reject(error); 257 + }); 258 + } 259 + } 260 + 261 + return await new Promise(_fetch); 262 + }
+1
src/index.ts
··· 1 + export { fetch, fetch as default } from './fetch';
+24
tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "baseUrl": "./", 4 + "rootDir": ".", 5 + "forceConsistentCasingInFileNames": true, 6 + "importsNotUsedAsValues": "remove", 7 + "noEmit": true, 8 + "esModuleInterop": true, 9 + "noUnusedLocals": true, 10 + "allowJs": true, 11 + "lib": ["es2016"], 12 + "jsx": "react-jsx", 13 + "module": "es2022", 14 + "moduleResolution": "node", 15 + "resolveJsonModule": true, 16 + "target": "esnext", 17 + "strict": true, 18 + "noImplicitAny": false, 19 + "noUnusedParameters": true, 20 + "skipLibCheck": true, 21 + "isolatedModules": true 22 + }, 23 + "include": ["src", "packages"] 24 + }