├── .codecov.yml ├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .nvmrc ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── biome.json ├── demo ├── .gitignore ├── index.html ├── package.json ├── postcss.config.cjs ├── src │ ├── main.ts │ ├── style.css │ └── vite-env.d.ts ├── tailwind.config.cjs ├── tsconfig.json └── vite.config.ts ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── src ├── bep53.ts └── index.ts ├── test ├── bep53.ts ├── decode.spec.ts └── encode.spec.ts ├── tsconfig.json ├── vercel.json └── vitest.config.ts /.codecov.yml: -------------------------------------------------------------------------------- 1 | coverage: 2 | range: "50..100" 3 | status: 4 | project: no 5 | patch: no 6 | comment: 7 | require_changes: yes 8 | behavior: once 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | indent_size = 2 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | demo/public 3 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "env": { 4 | "node": true 5 | }, 6 | "extends": ["@ctrl/eslint-config-biome"], 7 | "rules": { 8 | "@typescript-eslint/restrict-template-expressions": "off" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | 15 | - uses: pnpm/action-setup@v3 16 | with: 17 | version: 8 18 | 19 | - uses: actions/setup-node@v4 20 | with: 21 | node-version: 20 22 | cache: "pnpm" 23 | 24 | - name: install 25 | run: pnpm install 26 | 27 | - name: lint 28 | run: pnpm run lint 29 | 30 | - name: test 31 | run: pnpm run test:ci 32 | 33 | - name: coverage 34 | uses: codecov/codecov-action@v4 35 | with: 36 | token: ${{ secrets.CODECOV_TOKEN }} 37 | 38 | publish: 39 | needs: build 40 | runs-on: ubuntu-latest 41 | if: github.ref_name == 'master' 42 | permissions: 43 | contents: write # to be able to publish a GitHub release 44 | issues: write # to be able to comment on released issues 45 | pull-requests: write # to be able to comment on released pull requests 46 | id-token: write # to enable use of OIDC for npm provenance 47 | steps: 48 | - uses: actions/checkout@v4 49 | with: 50 | fetch-depth: 0 51 | 52 | - uses: pnpm/action-setup@v3 53 | with: 54 | version: 8 55 | 56 | - uses: actions/setup-node@v4 57 | with: 58 | node-version: 20 59 | cache: "pnpm" 60 | 61 | - name: install 62 | run: pnpm install 63 | 64 | - name: release 65 | run: npx semantic-release 66 | env: 67 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 68 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 69 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Coverage directory 12 | coverage 13 | 14 | # node-waf configuration 15 | .lock-wscript 16 | 17 | # Compiled binary addons (http://nodejs.org/api/addons.html) 18 | build/Release 19 | 20 | # Dependency directories 21 | node_modules 22 | jspm_packages 23 | 24 | # Optional npm cache directory 25 | .npm 26 | 27 | # Optional REPL history 28 | .node_repl_history 29 | .vscode/* 30 | !.vscode/launch.json 31 | !.vscode/settings.json 32 | 33 | # build 34 | build 35 | docs 36 | dist 37 | .rpt2_cache 38 | yarn.lock 39 | public 40 | junit.xml 41 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 20 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "biomejs.biome", 3 | "[javascript][typescript][javascriptreact][typescriptreact]": { 4 | "editor.formatOnSave": true, 5 | "editor.defaultFormatter": "biomejs.biome", 6 | "editor.codeActionsOnSave": { 7 | "quickfix.biome": "explicit", 8 | "source.fixAll.eslint": "explicit" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Scott Cooper 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # magnet-link [![npm](https://badgen.net/npm/v/@ctrl/magnet-link)](https://www.npmjs.com/package/@ctrl/magnet-link) [![coverage](https://badgen.net/codecov/c/github/scttcper/magnet-link)](https://codecov.io/gh/scttcper/magnet-link) 2 | 3 | > Parse a magnet URI into an object 4 | 5 | Port of [webtorrent/magnet-uri](https://github.com/webtorrent/magnet-uri) by [feross](https://github.com/feross) that uses fewer dependencies in typescript 6 | 7 | __Demo__: https://magnet-link.vercel.app 8 | 9 | ### Install 10 | ```console 11 | npm install @ctrl/magnet-link 12 | ``` 13 | 14 | ### Use 15 | 16 | #### Encode 17 | ```ts 18 | import { magnetDecode } from '@ctrl/magnet-link'; 19 | 20 | const uri = 'magnet:?xt=urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36&dn=Leaves+of+Grass+by+Walt+Whitman.epub&tr=udp%3A%2F%2Ftracker.example4.com%3A80&tr=udp%3A%2F%2Ftracker.example5.com%3A80&tr=udp%3A%2F%2Ftracker.example3.com%3A6969&tr=udp%3A%2F%2Ftracker.example2.com%3A80&tr=udp%3A%2F%2Ftracker.example1.com%3A1337'; 21 | const parsed = magnetDecode(uri); 22 | console.log(parsed.dn) // "Leaves of Grass by Walt Whitman.epub" 23 | console.log(parsed.infoHash) // "d2474e86c95b19b8bcfdb92bc12c9d44667cfa36" 24 | ``` 25 | The entire parsed object 26 | ```json 27 | { 28 | "xt": "urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36", 29 | "dn": "Leaves of Grass by Walt Whitman.epub", 30 | "tr": [ 31 | "udp://tracker.example1.com:1337", 32 | "udp://tracker.example2.com:80", 33 | "udp://tracker.example3.com:6969", 34 | "udp://tracker.example4.com:80", 35 | "udp://tracker.example5.com:80" 36 | ], 37 | "name": "Leaves of Grass by Walt Whitman.epub", 38 | "infoHash": "d2474e86c95b19b8bcfdb92bc12c9d44667cfa36", 39 | "announce": [ 40 | "udp://tracker.example1.com:1337", 41 | "udp://tracker.example2.com:80", 42 | "udp://tracker.example3.com:6969", 43 | "udp://tracker.example4.com:80", 44 | "udp://tracker.example5.com:80" 45 | ] 46 | } 47 | ``` 48 | 49 | #### Decode 50 | 51 | ```ts 52 | import { magnetEncode } from '@ctrl/magnet-link'; 53 | 54 | // convert object to magnet uri 55 | const uri = magnetEncode({ 56 | xt: [ 57 | 'urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1', 58 | 'urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY', 59 | 'urn:btih:QHQXPYWMACKDWKP47RRVIV7VOURXFE5Q', 60 | ], 61 | xl: '10826029', 62 | dn: 'mediawiki-1.15.1.tar.gz', 63 | tr: [ 64 | 'udp://tracker.openbittorrent.com:80/announce', 65 | ], 66 | as: 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz', 67 | xs: [ 68 | 'http://cache.example.org/XRX2PEFXOOEJFRVUCX6HMZMKS5TWG4K5', 69 | 'dchub://example.org', 70 | ], 71 | }); 72 | 73 | 74 | You can also use convenience key names like name (dn), infoHash (xt), infoHashIntArray (xt), announce (tr), and keywords (kt). 75 | ``` 76 | 77 | ### See Also 78 | - magnet uri spec http://www.bittorrent.org/beps/bep_0053.html 79 | - more spec http://www.bittorrent.org/beps/bep_0009.html 80 | - magnet-uri https://github.com/webtorrent/magnet-uri 81 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@biomejs/biome/configuration_schema.json", 3 | "files": { 4 | "ignoreUnknown": true, 5 | "ignore": ["dist/*", "package.json"] 6 | }, 7 | "extends": ["./node_modules/@ctrl/eslint-config-biome/biome.json"] 8 | } 9 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | @ctrl/magnet-link 7 | 8 | 9 | 10 |
11 |
12 |
13 |

14 | magnet-link 15 |

16 |

17 | Parse a magnet URI into an object 18 |

19 |
20 |
21 | 45 |
46 |
47 |

Install

48 |
npm install @ctrl/magnet-link
60 |
61 | 62 |
63 |

Demo

64 |
65 | 66 | 87 | 88 | 107 |
108 |
109 |
110 |
111 | 112 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo-app", 3 | "version": "0.0.0", 4 | "type": "module", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build --emptyOutDir", 8 | "serve": "vite preview" 9 | }, 10 | "devDependencies": { 11 | "@tailwindcss/forms": "0.5.7", 12 | "autoprefixer": "10.4.18", 13 | "postcss": "8.4.35", 14 | "tailwindcss": "3.4.1", 15 | "typescript": "5.4.2", 16 | "vite": "5.1.5" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /demo/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /demo/src/main.ts: -------------------------------------------------------------------------------- 1 | import { magnetDecode, magnetEncode } from '../../src/index.js'; 2 | 3 | (window as any).magnetDecode = magnetDecode; 4 | (window as any).magnetEncode = magnetEncode; 5 | 6 | const input = document.querySelector('#input')!; 7 | const output = document.querySelector('#output')!; 8 | 9 | input.addEventListener('input', event => inputChange((event.target as HTMLInputElement).value)); 10 | output.addEventListener('input', event => outputChange((event.target as HTMLInputElement).value)); 11 | 12 | function inputChange(str: string): void { 13 | output.value = JSON.stringify(magnetDecode(str), null, 4); 14 | } 15 | 16 | function outputChange(str: string): void { 17 | input.value = magnetEncode(JSON.parse(str)); 18 | } 19 | -------------------------------------------------------------------------------- /demo/src/style.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /demo/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/triple-slash-reference 2 | /// 3 | -------------------------------------------------------------------------------- /demo/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires */ 2 | const colors = require('tailwindcss/colors'); 3 | 4 | module.exports = { 5 | mode: 'jit', 6 | content: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'], 7 | darkMode: 'media', 8 | theme: { 9 | extend: { 10 | colors: { 11 | gray: colors.slate, 12 | }, 13 | }, 14 | }, 15 | variants: { 16 | extend: {}, 17 | }, 18 | plugins: [require('@tailwindcss/forms')], 19 | }; 20 | -------------------------------------------------------------------------------- /demo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "lib": ["ESNext", "DOM"], 6 | "moduleResolution": "Node", 7 | "strict": true, 8 | "sourceMap": true, 9 | "resolveJsonModule": true, 10 | "esModuleInterop": true, 11 | "noEmit": true, 12 | "noUnusedLocals": true, 13 | "noUnusedParameters": true, 14 | "noImplicitReturns": true 15 | }, 16 | "include": ["./src"] 17 | } 18 | -------------------------------------------------------------------------------- /demo/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | 3 | export default defineConfig({ 4 | build: { 5 | outDir: '../dist', 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@ctrl/magnet-link", 3 | "version": "0.0.0-placeholder", 4 | "description": "Parse a magnet URI into an object", 5 | "author": "Scott Cooper ", 6 | "homepage": "https://magnet-link.vercel.app", 7 | "license": "MIT", 8 | "repository": "scttcper/magnet-link", 9 | "keywords": [ 10 | "torrent", 11 | "magnet", 12 | "link", 13 | "magnet-uri" 14 | ], 15 | "type": "module", 16 | "exports": "./dist/src/index.js", 17 | "types": "./dist/src/index.d.ts", 18 | "files": [ 19 | "dist/src" 20 | ], 21 | "sideEffects": false, 22 | "scripts": { 23 | "dev": "npm run demo:watch", 24 | "demo:build": "npm run build --workspace=demo", 25 | "demo:watch": "npm run dev --workspace=demo", 26 | "lint": "pnpm run '/^(lint:biome|lint:eslint)$/'", 27 | "lint:biome": "biome check .", 28 | "lint:eslint": "eslint --ext .ts,.tsx .", 29 | "lint:fix": "pnpm run '/^(lint:biome|lint:eslint):fix$/'", 30 | "lint:eslint:fix": "eslint --ext .ts,.tsx . --fix", 31 | "lint:biome:fix": "biome check . --apply", 32 | "prepare": "npm run build", 33 | "build": "tsc", 34 | "test": "vitest run", 35 | "test:watch": "vitest", 36 | "test:ci": "vitest run --coverage --reporter=default --reporter=junit --outputFile=./junit.xml" 37 | }, 38 | "dependencies": { 39 | "rfc4648": "^1.5.3", 40 | "uint8array-extras": "^1.1.0" 41 | }, 42 | "devDependencies": { 43 | "@biomejs/biome": "1.6.0", 44 | "@ctrl/eslint-config-biome": "2.1.1", 45 | "@sindresorhus/tsconfig": "5.0.0", 46 | "@types/node": "20.11.25", 47 | "@vitest/coverage-v8": "1.3.1", 48 | "typescript": "5.4.2", 49 | "vitest": "1.3.1" 50 | }, 51 | "workspaces": [ 52 | "demo" 53 | ], 54 | "publishConfig": { 55 | "access": "public", 56 | "provenance": true 57 | }, 58 | "release": { 59 | "branches": [ 60 | "master" 61 | ] 62 | }, 63 | "engines": { 64 | "node": ">=18" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | rfc4648: 12 | specifier: ^1.5.3 13 | version: 1.5.3 14 | uint8array-extras: 15 | specifier: ^1.1.0 16 | version: 1.1.0 17 | devDependencies: 18 | '@biomejs/biome': 19 | specifier: 1.6.0 20 | version: 1.6.0 21 | '@ctrl/eslint-config-biome': 22 | specifier: 2.1.1 23 | version: 2.1.1(typescript@5.4.2) 24 | '@sindresorhus/tsconfig': 25 | specifier: 5.0.0 26 | version: 5.0.0 27 | '@types/node': 28 | specifier: 20.11.25 29 | version: 20.11.25 30 | '@vitest/coverage-v8': 31 | specifier: 1.3.1 32 | version: 1.3.1(vitest@1.3.1) 33 | typescript: 34 | specifier: 5.4.2 35 | version: 5.4.2 36 | vitest: 37 | specifier: 1.3.1 38 | version: 1.3.1(@types/node@20.11.25) 39 | 40 | demo: 41 | devDependencies: 42 | '@tailwindcss/forms': 43 | specifier: 0.5.7 44 | version: 0.5.7(tailwindcss@3.4.1) 45 | autoprefixer: 46 | specifier: 10.4.18 47 | version: 10.4.18(postcss@8.4.35) 48 | postcss: 49 | specifier: 8.4.35 50 | version: 8.4.35 51 | tailwindcss: 52 | specifier: 3.4.1 53 | version: 3.4.1 54 | typescript: 55 | specifier: 5.4.2 56 | version: 5.4.2 57 | vite: 58 | specifier: 5.1.5 59 | version: 5.1.5(@types/node@20.11.25) 60 | 61 | packages: 62 | 63 | /@aashutoshrathi/word-wrap@1.2.6: 64 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 65 | engines: {node: '>=0.10.0'} 66 | dev: true 67 | 68 | /@alloc/quick-lru@5.2.0: 69 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 70 | engines: {node: '>=10'} 71 | dev: true 72 | 73 | /@ampproject/remapping@2.3.0: 74 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 75 | engines: {node: '>=6.0.0'} 76 | dependencies: 77 | '@jridgewell/gen-mapping': 0.3.5 78 | '@jridgewell/trace-mapping': 0.3.25 79 | dev: true 80 | 81 | /@babel/helper-string-parser@7.23.4: 82 | resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} 83 | engines: {node: '>=6.9.0'} 84 | dev: true 85 | 86 | /@babel/helper-validator-identifier@7.22.20: 87 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 88 | engines: {node: '>=6.9.0'} 89 | dev: true 90 | 91 | /@babel/parser@7.24.0: 92 | resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} 93 | engines: {node: '>=6.0.0'} 94 | hasBin: true 95 | dependencies: 96 | '@babel/types': 7.24.0 97 | dev: true 98 | 99 | /@babel/types@7.24.0: 100 | resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} 101 | engines: {node: '>=6.9.0'} 102 | dependencies: 103 | '@babel/helper-string-parser': 7.23.4 104 | '@babel/helper-validator-identifier': 7.22.20 105 | to-fast-properties: 2.0.0 106 | dev: true 107 | 108 | /@bcoe/v8-coverage@0.2.3: 109 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 110 | dev: true 111 | 112 | /@biomejs/biome@1.6.0: 113 | resolution: {integrity: sha512-hvP8K1+CV8qc9eNdXtPwzScVxFSHB448CPKSqX6+8IW8G7bbhBVKGC80BowExJN5+vu+kzsj4xkWa780MAOlJw==} 114 | engines: {node: '>=14.*'} 115 | hasBin: true 116 | requiresBuild: true 117 | optionalDependencies: 118 | '@biomejs/cli-darwin-arm64': 1.6.0 119 | '@biomejs/cli-darwin-x64': 1.6.0 120 | '@biomejs/cli-linux-arm64': 1.6.0 121 | '@biomejs/cli-linux-arm64-musl': 1.6.0 122 | '@biomejs/cli-linux-x64': 1.6.0 123 | '@biomejs/cli-linux-x64-musl': 1.6.0 124 | '@biomejs/cli-win32-arm64': 1.6.0 125 | '@biomejs/cli-win32-x64': 1.6.0 126 | dev: true 127 | 128 | /@biomejs/cli-darwin-arm64@1.6.0: 129 | resolution: {integrity: sha512-K1Fjqye5pt+Ua+seC7V/2bFjfnqOaEOcQbBQSiiefB/VPNOb6lA5NFIfJ1PskTA3JrMXE1k7iqKQn56qrKFS6A==} 130 | engines: {node: '>=14.*'} 131 | cpu: [arm64] 132 | os: [darwin] 133 | requiresBuild: true 134 | dev: true 135 | optional: true 136 | 137 | /@biomejs/cli-darwin-x64@1.6.0: 138 | resolution: {integrity: sha512-CjEALu6vN9RbcfhaBDoj481mesUIsUjxgQn+/kiMCea+Paypqslhez1I7OwRBJnkzz+Pa+PXdABd7S30eyy6+Q==} 139 | engines: {node: '>=14.*'} 140 | cpu: [x64] 141 | os: [darwin] 142 | requiresBuild: true 143 | dev: true 144 | optional: true 145 | 146 | /@biomejs/cli-linux-arm64-musl@1.6.0: 147 | resolution: {integrity: sha512-prww6AUuJ+IO/GziN3WjtGM/DNOVuPFxqWrK97wKTZygEDdA+o1qHUN2HeCkSyk084xnzbMSbls5xscAKAn43A==} 148 | engines: {node: '>=14.*'} 149 | cpu: [arm64] 150 | os: [linux] 151 | requiresBuild: true 152 | dev: true 153 | optional: true 154 | 155 | /@biomejs/cli-linux-arm64@1.6.0: 156 | resolution: {integrity: sha512-32LVrC7dAgQT39YZ0ieO/VzzpAflozs9mW5K0oKNef7S4ocCdk89E98eXApxOdei0JTf3vfseDCl1AUIp6MwJw==} 157 | engines: {node: '>=14.*'} 158 | cpu: [arm64] 159 | os: [linux] 160 | requiresBuild: true 161 | dev: true 162 | optional: true 163 | 164 | /@biomejs/cli-linux-x64-musl@1.6.0: 165 | resolution: {integrity: sha512-NwitWeUKCy8G/rr+rgHPYirnrsOjJEJBWODdaRzweeFNcJjvO6de6AmNdSJzsewzLEaxjOWyoXU03MdzbGz/6Q==} 166 | engines: {node: '>=14.*'} 167 | cpu: [x64] 168 | os: [linux] 169 | requiresBuild: true 170 | dev: true 171 | optional: true 172 | 173 | /@biomejs/cli-linux-x64@1.6.0: 174 | resolution: {integrity: sha512-b6mWu9Cu4w5B3K46wq9SlxKEZEEL6II/6HFNAuZ4YL8mOeQ0FTMU+wNMJFKkmkSE2zvim3xwW3PknmbLKbe3Mg==} 175 | engines: {node: '>=14.*'} 176 | cpu: [x64] 177 | os: [linux] 178 | requiresBuild: true 179 | dev: true 180 | optional: true 181 | 182 | /@biomejs/cli-win32-arm64@1.6.0: 183 | resolution: {integrity: sha512-DlNOL6mG+76iZS1gL/UiuMme7jnt+auzo2+u0aUq6UXYsb75juchwlnVLy2UV5CQjVBRB8+RM+KVoXRZ8NlBjQ==} 184 | engines: {node: '>=14.*'} 185 | cpu: [arm64] 186 | os: [win32] 187 | requiresBuild: true 188 | dev: true 189 | optional: true 190 | 191 | /@biomejs/cli-win32-x64@1.6.0: 192 | resolution: {integrity: sha512-sXBcXIOGuG8/XcHqmnkhLIs0oy6Dp+TkH4Alr4WH/P8mNsp5GcStI/ZwbEiEoxA0P3Fi+oUppQ6srxaY2rSCHg==} 193 | engines: {node: '>=14.*'} 194 | cpu: [x64] 195 | os: [win32] 196 | requiresBuild: true 197 | dev: true 198 | optional: true 199 | 200 | /@ctrl/eslint-config-biome@2.1.1(typescript@5.4.2): 201 | resolution: {integrity: sha512-7GbEtpIZ54/HEgHFMEJQJrbRVs+MHQL5uA+U/FEjCdKXICe2D2dvNy7MOdSgX5+5uBFEvP00O4mxCUuMnXxyBg==} 202 | dependencies: 203 | '@typescript-eslint/eslint-plugin': 7.1.1(@typescript-eslint/parser@7.1.1)(eslint@8.57.0)(typescript@5.4.2) 204 | '@typescript-eslint/parser': 7.1.1(eslint@8.57.0)(typescript@5.4.2) 205 | eslint: 8.57.0 206 | eslint-config-xo: 0.44.0(eslint@8.57.0) 207 | eslint-config-xo-typescript: 4.0.0(@typescript-eslint/eslint-plugin@7.1.1)(@typescript-eslint/parser@7.1.1)(eslint@8.57.0)(typescript@5.4.2) 208 | eslint-plugin-simple-import-sort: 12.0.0(eslint@8.57.0) 209 | transitivePeerDependencies: 210 | - supports-color 211 | - typescript 212 | dev: true 213 | 214 | /@esbuild/aix-ppc64@0.19.12: 215 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 216 | engines: {node: '>=12'} 217 | cpu: [ppc64] 218 | os: [aix] 219 | requiresBuild: true 220 | dev: true 221 | optional: true 222 | 223 | /@esbuild/android-arm64@0.19.12: 224 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 225 | engines: {node: '>=12'} 226 | cpu: [arm64] 227 | os: [android] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/android-arm@0.19.12: 233 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 234 | engines: {node: '>=12'} 235 | cpu: [arm] 236 | os: [android] 237 | requiresBuild: true 238 | dev: true 239 | optional: true 240 | 241 | /@esbuild/android-x64@0.19.12: 242 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 243 | engines: {node: '>=12'} 244 | cpu: [x64] 245 | os: [android] 246 | requiresBuild: true 247 | dev: true 248 | optional: true 249 | 250 | /@esbuild/darwin-arm64@0.19.12: 251 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 252 | engines: {node: '>=12'} 253 | cpu: [arm64] 254 | os: [darwin] 255 | requiresBuild: true 256 | dev: true 257 | optional: true 258 | 259 | /@esbuild/darwin-x64@0.19.12: 260 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 261 | engines: {node: '>=12'} 262 | cpu: [x64] 263 | os: [darwin] 264 | requiresBuild: true 265 | dev: true 266 | optional: true 267 | 268 | /@esbuild/freebsd-arm64@0.19.12: 269 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 270 | engines: {node: '>=12'} 271 | cpu: [arm64] 272 | os: [freebsd] 273 | requiresBuild: true 274 | dev: true 275 | optional: true 276 | 277 | /@esbuild/freebsd-x64@0.19.12: 278 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 279 | engines: {node: '>=12'} 280 | cpu: [x64] 281 | os: [freebsd] 282 | requiresBuild: true 283 | dev: true 284 | optional: true 285 | 286 | /@esbuild/linux-arm64@0.19.12: 287 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 288 | engines: {node: '>=12'} 289 | cpu: [arm64] 290 | os: [linux] 291 | requiresBuild: true 292 | dev: true 293 | optional: true 294 | 295 | /@esbuild/linux-arm@0.19.12: 296 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 297 | engines: {node: '>=12'} 298 | cpu: [arm] 299 | os: [linux] 300 | requiresBuild: true 301 | dev: true 302 | optional: true 303 | 304 | /@esbuild/linux-ia32@0.19.12: 305 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 306 | engines: {node: '>=12'} 307 | cpu: [ia32] 308 | os: [linux] 309 | requiresBuild: true 310 | dev: true 311 | optional: true 312 | 313 | /@esbuild/linux-loong64@0.19.12: 314 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 315 | engines: {node: '>=12'} 316 | cpu: [loong64] 317 | os: [linux] 318 | requiresBuild: true 319 | dev: true 320 | optional: true 321 | 322 | /@esbuild/linux-mips64el@0.19.12: 323 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 324 | engines: {node: '>=12'} 325 | cpu: [mips64el] 326 | os: [linux] 327 | requiresBuild: true 328 | dev: true 329 | optional: true 330 | 331 | /@esbuild/linux-ppc64@0.19.12: 332 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 333 | engines: {node: '>=12'} 334 | cpu: [ppc64] 335 | os: [linux] 336 | requiresBuild: true 337 | dev: true 338 | optional: true 339 | 340 | /@esbuild/linux-riscv64@0.19.12: 341 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 342 | engines: {node: '>=12'} 343 | cpu: [riscv64] 344 | os: [linux] 345 | requiresBuild: true 346 | dev: true 347 | optional: true 348 | 349 | /@esbuild/linux-s390x@0.19.12: 350 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 351 | engines: {node: '>=12'} 352 | cpu: [s390x] 353 | os: [linux] 354 | requiresBuild: true 355 | dev: true 356 | optional: true 357 | 358 | /@esbuild/linux-x64@0.19.12: 359 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 360 | engines: {node: '>=12'} 361 | cpu: [x64] 362 | os: [linux] 363 | requiresBuild: true 364 | dev: true 365 | optional: true 366 | 367 | /@esbuild/netbsd-x64@0.19.12: 368 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 369 | engines: {node: '>=12'} 370 | cpu: [x64] 371 | os: [netbsd] 372 | requiresBuild: true 373 | dev: true 374 | optional: true 375 | 376 | /@esbuild/openbsd-x64@0.19.12: 377 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 378 | engines: {node: '>=12'} 379 | cpu: [x64] 380 | os: [openbsd] 381 | requiresBuild: true 382 | dev: true 383 | optional: true 384 | 385 | /@esbuild/sunos-x64@0.19.12: 386 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 387 | engines: {node: '>=12'} 388 | cpu: [x64] 389 | os: [sunos] 390 | requiresBuild: true 391 | dev: true 392 | optional: true 393 | 394 | /@esbuild/win32-arm64@0.19.12: 395 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 396 | engines: {node: '>=12'} 397 | cpu: [arm64] 398 | os: [win32] 399 | requiresBuild: true 400 | dev: true 401 | optional: true 402 | 403 | /@esbuild/win32-ia32@0.19.12: 404 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 405 | engines: {node: '>=12'} 406 | cpu: [ia32] 407 | os: [win32] 408 | requiresBuild: true 409 | dev: true 410 | optional: true 411 | 412 | /@esbuild/win32-x64@0.19.12: 413 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 414 | engines: {node: '>=12'} 415 | cpu: [x64] 416 | os: [win32] 417 | requiresBuild: true 418 | dev: true 419 | optional: true 420 | 421 | /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): 422 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 423 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 424 | peerDependencies: 425 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 426 | dependencies: 427 | eslint: 8.57.0 428 | eslint-visitor-keys: 3.4.3 429 | dev: true 430 | 431 | /@eslint-community/regexpp@4.10.0: 432 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 433 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 434 | dev: true 435 | 436 | /@eslint/eslintrc@2.1.4: 437 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 438 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 439 | dependencies: 440 | ajv: 6.12.6 441 | debug: 4.3.4 442 | espree: 9.6.1 443 | globals: 13.24.0 444 | ignore: 5.3.1 445 | import-fresh: 3.3.0 446 | js-yaml: 4.1.0 447 | minimatch: 3.1.2 448 | strip-json-comments: 3.1.1 449 | transitivePeerDependencies: 450 | - supports-color 451 | dev: true 452 | 453 | /@eslint/js@8.57.0: 454 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} 455 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 456 | dev: true 457 | 458 | /@humanwhocodes/config-array@0.11.14: 459 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 460 | engines: {node: '>=10.10.0'} 461 | dependencies: 462 | '@humanwhocodes/object-schema': 2.0.2 463 | debug: 4.3.4 464 | minimatch: 3.1.2 465 | transitivePeerDependencies: 466 | - supports-color 467 | dev: true 468 | 469 | /@humanwhocodes/module-importer@1.0.1: 470 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 471 | engines: {node: '>=12.22'} 472 | dev: true 473 | 474 | /@humanwhocodes/object-schema@2.0.2: 475 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} 476 | dev: true 477 | 478 | /@isaacs/cliui@8.0.2: 479 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 480 | engines: {node: '>=12'} 481 | dependencies: 482 | string-width: 5.1.2 483 | string-width-cjs: /string-width@4.2.3 484 | strip-ansi: 7.1.0 485 | strip-ansi-cjs: /strip-ansi@6.0.1 486 | wrap-ansi: 8.1.0 487 | wrap-ansi-cjs: /wrap-ansi@7.0.0 488 | dev: true 489 | 490 | /@istanbuljs/schema@0.1.3: 491 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 492 | engines: {node: '>=8'} 493 | dev: true 494 | 495 | /@jest/schemas@29.6.3: 496 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 497 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 498 | dependencies: 499 | '@sinclair/typebox': 0.27.8 500 | dev: true 501 | 502 | /@jridgewell/gen-mapping@0.3.5: 503 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 504 | engines: {node: '>=6.0.0'} 505 | dependencies: 506 | '@jridgewell/set-array': 1.2.1 507 | '@jridgewell/sourcemap-codec': 1.4.15 508 | '@jridgewell/trace-mapping': 0.3.25 509 | dev: true 510 | 511 | /@jridgewell/resolve-uri@3.1.2: 512 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 513 | engines: {node: '>=6.0.0'} 514 | dev: true 515 | 516 | /@jridgewell/set-array@1.2.1: 517 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 518 | engines: {node: '>=6.0.0'} 519 | dev: true 520 | 521 | /@jridgewell/sourcemap-codec@1.4.15: 522 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 523 | dev: true 524 | 525 | /@jridgewell/trace-mapping@0.3.25: 526 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 527 | dependencies: 528 | '@jridgewell/resolve-uri': 3.1.2 529 | '@jridgewell/sourcemap-codec': 1.4.15 530 | dev: true 531 | 532 | /@nodelib/fs.scandir@2.1.5: 533 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 534 | engines: {node: '>= 8'} 535 | dependencies: 536 | '@nodelib/fs.stat': 2.0.5 537 | run-parallel: 1.2.0 538 | dev: true 539 | 540 | /@nodelib/fs.stat@2.0.5: 541 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 542 | engines: {node: '>= 8'} 543 | dev: true 544 | 545 | /@nodelib/fs.walk@1.2.8: 546 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 547 | engines: {node: '>= 8'} 548 | dependencies: 549 | '@nodelib/fs.scandir': 2.1.5 550 | fastq: 1.17.1 551 | dev: true 552 | 553 | /@pkgjs/parseargs@0.11.0: 554 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 555 | engines: {node: '>=14'} 556 | requiresBuild: true 557 | dev: true 558 | optional: true 559 | 560 | /@rollup/rollup-android-arm-eabi@4.12.1: 561 | resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} 562 | cpu: [arm] 563 | os: [android] 564 | requiresBuild: true 565 | dev: true 566 | optional: true 567 | 568 | /@rollup/rollup-android-arm64@4.12.1: 569 | resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} 570 | cpu: [arm64] 571 | os: [android] 572 | requiresBuild: true 573 | dev: true 574 | optional: true 575 | 576 | /@rollup/rollup-darwin-arm64@4.12.1: 577 | resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} 578 | cpu: [arm64] 579 | os: [darwin] 580 | requiresBuild: true 581 | dev: true 582 | optional: true 583 | 584 | /@rollup/rollup-darwin-x64@4.12.1: 585 | resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} 586 | cpu: [x64] 587 | os: [darwin] 588 | requiresBuild: true 589 | dev: true 590 | optional: true 591 | 592 | /@rollup/rollup-linux-arm-gnueabihf@4.12.1: 593 | resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} 594 | cpu: [arm] 595 | os: [linux] 596 | requiresBuild: true 597 | dev: true 598 | optional: true 599 | 600 | /@rollup/rollup-linux-arm64-gnu@4.12.1: 601 | resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} 602 | cpu: [arm64] 603 | os: [linux] 604 | requiresBuild: true 605 | dev: true 606 | optional: true 607 | 608 | /@rollup/rollup-linux-arm64-musl@4.12.1: 609 | resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} 610 | cpu: [arm64] 611 | os: [linux] 612 | requiresBuild: true 613 | dev: true 614 | optional: true 615 | 616 | /@rollup/rollup-linux-riscv64-gnu@4.12.1: 617 | resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} 618 | cpu: [riscv64] 619 | os: [linux] 620 | requiresBuild: true 621 | dev: true 622 | optional: true 623 | 624 | /@rollup/rollup-linux-x64-gnu@4.12.1: 625 | resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} 626 | cpu: [x64] 627 | os: [linux] 628 | requiresBuild: true 629 | dev: true 630 | optional: true 631 | 632 | /@rollup/rollup-linux-x64-musl@4.12.1: 633 | resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} 634 | cpu: [x64] 635 | os: [linux] 636 | requiresBuild: true 637 | dev: true 638 | optional: true 639 | 640 | /@rollup/rollup-win32-arm64-msvc@4.12.1: 641 | resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} 642 | cpu: [arm64] 643 | os: [win32] 644 | requiresBuild: true 645 | dev: true 646 | optional: true 647 | 648 | /@rollup/rollup-win32-ia32-msvc@4.12.1: 649 | resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} 650 | cpu: [ia32] 651 | os: [win32] 652 | requiresBuild: true 653 | dev: true 654 | optional: true 655 | 656 | /@rollup/rollup-win32-x64-msvc@4.12.1: 657 | resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} 658 | cpu: [x64] 659 | os: [win32] 660 | requiresBuild: true 661 | dev: true 662 | optional: true 663 | 664 | /@sinclair/typebox@0.27.8: 665 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 666 | dev: true 667 | 668 | /@sindresorhus/tsconfig@5.0.0: 669 | resolution: {integrity: sha512-LvvySslVPhAwo7dT+iovKXKCmJD82yYAsH/3D5BSyT3YP9Dvhdlhy0eQr0DBE0CxeFO6Wdbco3+nB+c2QYcAaA==} 670 | engines: {node: '>=18'} 671 | dev: true 672 | 673 | /@tailwindcss/forms@0.5.7(tailwindcss@3.4.1): 674 | resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==} 675 | peerDependencies: 676 | tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' 677 | dependencies: 678 | mini-svg-data-uri: 1.4.4 679 | tailwindcss: 3.4.1 680 | dev: true 681 | 682 | /@types/estree@1.0.5: 683 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 684 | dev: true 685 | 686 | /@types/istanbul-lib-coverage@2.0.6: 687 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 688 | dev: true 689 | 690 | /@types/json-schema@7.0.15: 691 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 692 | dev: true 693 | 694 | /@types/node@20.11.25: 695 | resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} 696 | dependencies: 697 | undici-types: 5.26.5 698 | dev: true 699 | 700 | /@types/semver@7.5.8: 701 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} 702 | dev: true 703 | 704 | /@typescript-eslint/eslint-plugin@7.1.1(@typescript-eslint/parser@7.1.1)(eslint@8.57.0)(typescript@5.4.2): 705 | resolution: {integrity: sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==} 706 | engines: {node: ^16.0.0 || >=18.0.0} 707 | peerDependencies: 708 | '@typescript-eslint/parser': ^7.0.0 709 | eslint: ^8.56.0 710 | typescript: '*' 711 | peerDependenciesMeta: 712 | typescript: 713 | optional: true 714 | dependencies: 715 | '@eslint-community/regexpp': 4.10.0 716 | '@typescript-eslint/parser': 7.1.1(eslint@8.57.0)(typescript@5.4.2) 717 | '@typescript-eslint/scope-manager': 7.1.1 718 | '@typescript-eslint/type-utils': 7.1.1(eslint@8.57.0)(typescript@5.4.2) 719 | '@typescript-eslint/utils': 7.1.1(eslint@8.57.0)(typescript@5.4.2) 720 | '@typescript-eslint/visitor-keys': 7.1.1 721 | debug: 4.3.4 722 | eslint: 8.57.0 723 | graphemer: 1.4.0 724 | ignore: 5.3.1 725 | natural-compare: 1.4.0 726 | semver: 7.6.0 727 | ts-api-utils: 1.3.0(typescript@5.4.2) 728 | typescript: 5.4.2 729 | transitivePeerDependencies: 730 | - supports-color 731 | dev: true 732 | 733 | /@typescript-eslint/parser@7.1.1(eslint@8.57.0)(typescript@5.4.2): 734 | resolution: {integrity: sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==} 735 | engines: {node: ^16.0.0 || >=18.0.0} 736 | peerDependencies: 737 | eslint: ^8.56.0 738 | typescript: '*' 739 | peerDependenciesMeta: 740 | typescript: 741 | optional: true 742 | dependencies: 743 | '@typescript-eslint/scope-manager': 7.1.1 744 | '@typescript-eslint/types': 7.1.1 745 | '@typescript-eslint/typescript-estree': 7.1.1(typescript@5.4.2) 746 | '@typescript-eslint/visitor-keys': 7.1.1 747 | debug: 4.3.4 748 | eslint: 8.57.0 749 | typescript: 5.4.2 750 | transitivePeerDependencies: 751 | - supports-color 752 | dev: true 753 | 754 | /@typescript-eslint/scope-manager@7.1.1: 755 | resolution: {integrity: sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==} 756 | engines: {node: ^16.0.0 || >=18.0.0} 757 | dependencies: 758 | '@typescript-eslint/types': 7.1.1 759 | '@typescript-eslint/visitor-keys': 7.1.1 760 | dev: true 761 | 762 | /@typescript-eslint/type-utils@7.1.1(eslint@8.57.0)(typescript@5.4.2): 763 | resolution: {integrity: sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==} 764 | engines: {node: ^16.0.0 || >=18.0.0} 765 | peerDependencies: 766 | eslint: ^8.56.0 767 | typescript: '*' 768 | peerDependenciesMeta: 769 | typescript: 770 | optional: true 771 | dependencies: 772 | '@typescript-eslint/typescript-estree': 7.1.1(typescript@5.4.2) 773 | '@typescript-eslint/utils': 7.1.1(eslint@8.57.0)(typescript@5.4.2) 774 | debug: 4.3.4 775 | eslint: 8.57.0 776 | ts-api-utils: 1.3.0(typescript@5.4.2) 777 | typescript: 5.4.2 778 | transitivePeerDependencies: 779 | - supports-color 780 | dev: true 781 | 782 | /@typescript-eslint/types@7.1.1: 783 | resolution: {integrity: sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==} 784 | engines: {node: ^16.0.0 || >=18.0.0} 785 | dev: true 786 | 787 | /@typescript-eslint/typescript-estree@7.1.1(typescript@5.4.2): 788 | resolution: {integrity: sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==} 789 | engines: {node: ^16.0.0 || >=18.0.0} 790 | peerDependencies: 791 | typescript: '*' 792 | peerDependenciesMeta: 793 | typescript: 794 | optional: true 795 | dependencies: 796 | '@typescript-eslint/types': 7.1.1 797 | '@typescript-eslint/visitor-keys': 7.1.1 798 | debug: 4.3.4 799 | globby: 11.1.0 800 | is-glob: 4.0.3 801 | minimatch: 9.0.3 802 | semver: 7.6.0 803 | ts-api-utils: 1.3.0(typescript@5.4.2) 804 | typescript: 5.4.2 805 | transitivePeerDependencies: 806 | - supports-color 807 | dev: true 808 | 809 | /@typescript-eslint/utils@7.1.1(eslint@8.57.0)(typescript@5.4.2): 810 | resolution: {integrity: sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==} 811 | engines: {node: ^16.0.0 || >=18.0.0} 812 | peerDependencies: 813 | eslint: ^8.56.0 814 | dependencies: 815 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 816 | '@types/json-schema': 7.0.15 817 | '@types/semver': 7.5.8 818 | '@typescript-eslint/scope-manager': 7.1.1 819 | '@typescript-eslint/types': 7.1.1 820 | '@typescript-eslint/typescript-estree': 7.1.1(typescript@5.4.2) 821 | eslint: 8.57.0 822 | semver: 7.6.0 823 | transitivePeerDependencies: 824 | - supports-color 825 | - typescript 826 | dev: true 827 | 828 | /@typescript-eslint/visitor-keys@7.1.1: 829 | resolution: {integrity: sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==} 830 | engines: {node: ^16.0.0 || >=18.0.0} 831 | dependencies: 832 | '@typescript-eslint/types': 7.1.1 833 | eslint-visitor-keys: 3.4.3 834 | dev: true 835 | 836 | /@ungap/structured-clone@1.2.0: 837 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 838 | dev: true 839 | 840 | /@vitest/coverage-v8@1.3.1(vitest@1.3.1): 841 | resolution: {integrity: sha512-UuBnkSJUNE9rdHjDCPyJ4fYuMkoMtnghes1XohYa4At0MS3OQSAo97FrbwSLRshYsXThMZy1+ybD/byK5llyIg==} 842 | peerDependencies: 843 | vitest: 1.3.1 844 | dependencies: 845 | '@ampproject/remapping': 2.3.0 846 | '@bcoe/v8-coverage': 0.2.3 847 | debug: 4.3.4 848 | istanbul-lib-coverage: 3.2.2 849 | istanbul-lib-report: 3.0.1 850 | istanbul-lib-source-maps: 4.0.1 851 | istanbul-reports: 3.1.7 852 | magic-string: 0.30.8 853 | magicast: 0.3.3 854 | picocolors: 1.0.0 855 | std-env: 3.7.0 856 | test-exclude: 6.0.0 857 | v8-to-istanbul: 9.2.0 858 | vitest: 1.3.1(@types/node@20.11.25) 859 | transitivePeerDependencies: 860 | - supports-color 861 | dev: true 862 | 863 | /@vitest/expect@1.3.1: 864 | resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} 865 | dependencies: 866 | '@vitest/spy': 1.3.1 867 | '@vitest/utils': 1.3.1 868 | chai: 4.4.1 869 | dev: true 870 | 871 | /@vitest/runner@1.3.1: 872 | resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} 873 | dependencies: 874 | '@vitest/utils': 1.3.1 875 | p-limit: 5.0.0 876 | pathe: 1.1.2 877 | dev: true 878 | 879 | /@vitest/snapshot@1.3.1: 880 | resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} 881 | dependencies: 882 | magic-string: 0.30.8 883 | pathe: 1.1.2 884 | pretty-format: 29.7.0 885 | dev: true 886 | 887 | /@vitest/spy@1.3.1: 888 | resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} 889 | dependencies: 890 | tinyspy: 2.2.1 891 | dev: true 892 | 893 | /@vitest/utils@1.3.1: 894 | resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} 895 | dependencies: 896 | diff-sequences: 29.6.3 897 | estree-walker: 3.0.3 898 | loupe: 2.3.7 899 | pretty-format: 29.7.0 900 | dev: true 901 | 902 | /acorn-jsx@5.3.2(acorn@8.11.3): 903 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 904 | peerDependencies: 905 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 906 | dependencies: 907 | acorn: 8.11.3 908 | dev: true 909 | 910 | /acorn-walk@8.3.2: 911 | resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} 912 | engines: {node: '>=0.4.0'} 913 | dev: true 914 | 915 | /acorn@8.11.3: 916 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 917 | engines: {node: '>=0.4.0'} 918 | hasBin: true 919 | dev: true 920 | 921 | /ajv@6.12.6: 922 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 923 | dependencies: 924 | fast-deep-equal: 3.1.3 925 | fast-json-stable-stringify: 2.1.0 926 | json-schema-traverse: 0.4.1 927 | uri-js: 4.4.1 928 | dev: true 929 | 930 | /ansi-regex@5.0.1: 931 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 932 | engines: {node: '>=8'} 933 | dev: true 934 | 935 | /ansi-regex@6.0.1: 936 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 937 | engines: {node: '>=12'} 938 | dev: true 939 | 940 | /ansi-styles@4.3.0: 941 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 942 | engines: {node: '>=8'} 943 | dependencies: 944 | color-convert: 2.0.1 945 | dev: true 946 | 947 | /ansi-styles@5.2.0: 948 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 949 | engines: {node: '>=10'} 950 | dev: true 951 | 952 | /ansi-styles@6.2.1: 953 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 954 | engines: {node: '>=12'} 955 | dev: true 956 | 957 | /any-promise@1.3.0: 958 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 959 | dev: true 960 | 961 | /anymatch@3.1.3: 962 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 963 | engines: {node: '>= 8'} 964 | dependencies: 965 | normalize-path: 3.0.0 966 | picomatch: 2.3.1 967 | dev: true 968 | 969 | /arg@5.0.2: 970 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 971 | dev: true 972 | 973 | /argparse@2.0.1: 974 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 975 | dev: true 976 | 977 | /array-union@2.1.0: 978 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 979 | engines: {node: '>=8'} 980 | dev: true 981 | 982 | /assertion-error@1.1.0: 983 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 984 | dev: true 985 | 986 | /autoprefixer@10.4.18(postcss@8.4.35): 987 | resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} 988 | engines: {node: ^10 || ^12 || >=14} 989 | hasBin: true 990 | peerDependencies: 991 | postcss: ^8.1.0 992 | dependencies: 993 | browserslist: 4.23.0 994 | caniuse-lite: 1.0.30001596 995 | fraction.js: 4.3.7 996 | normalize-range: 0.1.2 997 | picocolors: 1.0.0 998 | postcss: 8.4.35 999 | postcss-value-parser: 4.2.0 1000 | dev: true 1001 | 1002 | /balanced-match@1.0.2: 1003 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1004 | dev: true 1005 | 1006 | /binary-extensions@2.2.0: 1007 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1008 | engines: {node: '>=8'} 1009 | dev: true 1010 | 1011 | /brace-expansion@1.1.11: 1012 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1013 | dependencies: 1014 | balanced-match: 1.0.2 1015 | concat-map: 0.0.1 1016 | dev: true 1017 | 1018 | /brace-expansion@2.0.1: 1019 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1020 | dependencies: 1021 | balanced-match: 1.0.2 1022 | dev: true 1023 | 1024 | /braces@3.0.2: 1025 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1026 | engines: {node: '>=8'} 1027 | dependencies: 1028 | fill-range: 7.0.1 1029 | dev: true 1030 | 1031 | /browserslist@4.23.0: 1032 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 1033 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1034 | hasBin: true 1035 | dependencies: 1036 | caniuse-lite: 1.0.30001596 1037 | electron-to-chromium: 1.4.699 1038 | node-releases: 2.0.14 1039 | update-browserslist-db: 1.0.13(browserslist@4.23.0) 1040 | dev: true 1041 | 1042 | /cac@6.7.14: 1043 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1044 | engines: {node: '>=8'} 1045 | dev: true 1046 | 1047 | /callsites@3.1.0: 1048 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1049 | engines: {node: '>=6'} 1050 | dev: true 1051 | 1052 | /camelcase-css@2.0.1: 1053 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 1054 | engines: {node: '>= 6'} 1055 | dev: true 1056 | 1057 | /caniuse-lite@1.0.30001596: 1058 | resolution: {integrity: sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==} 1059 | dev: true 1060 | 1061 | /chai@4.4.1: 1062 | resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} 1063 | engines: {node: '>=4'} 1064 | dependencies: 1065 | assertion-error: 1.1.0 1066 | check-error: 1.0.3 1067 | deep-eql: 4.1.3 1068 | get-func-name: 2.0.2 1069 | loupe: 2.3.7 1070 | pathval: 1.1.1 1071 | type-detect: 4.0.8 1072 | dev: true 1073 | 1074 | /chalk@4.1.2: 1075 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1076 | engines: {node: '>=10'} 1077 | dependencies: 1078 | ansi-styles: 4.3.0 1079 | supports-color: 7.2.0 1080 | dev: true 1081 | 1082 | /check-error@1.0.3: 1083 | resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} 1084 | dependencies: 1085 | get-func-name: 2.0.2 1086 | dev: true 1087 | 1088 | /chokidar@3.6.0: 1089 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 1090 | engines: {node: '>= 8.10.0'} 1091 | dependencies: 1092 | anymatch: 3.1.3 1093 | braces: 3.0.2 1094 | glob-parent: 5.1.2 1095 | is-binary-path: 2.1.0 1096 | is-glob: 4.0.3 1097 | normalize-path: 3.0.0 1098 | readdirp: 3.6.0 1099 | optionalDependencies: 1100 | fsevents: 2.3.3 1101 | dev: true 1102 | 1103 | /color-convert@2.0.1: 1104 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1105 | engines: {node: '>=7.0.0'} 1106 | dependencies: 1107 | color-name: 1.1.4 1108 | dev: true 1109 | 1110 | /color-name@1.1.4: 1111 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1112 | dev: true 1113 | 1114 | /commander@4.1.1: 1115 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1116 | engines: {node: '>= 6'} 1117 | dev: true 1118 | 1119 | /concat-map@0.0.1: 1120 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1121 | dev: true 1122 | 1123 | /confusing-browser-globals@1.0.11: 1124 | resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} 1125 | dev: true 1126 | 1127 | /convert-source-map@2.0.0: 1128 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1129 | dev: true 1130 | 1131 | /cross-spawn@7.0.3: 1132 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1133 | engines: {node: '>= 8'} 1134 | dependencies: 1135 | path-key: 3.1.1 1136 | shebang-command: 2.0.0 1137 | which: 2.0.2 1138 | dev: true 1139 | 1140 | /cssesc@3.0.0: 1141 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1142 | engines: {node: '>=4'} 1143 | hasBin: true 1144 | dev: true 1145 | 1146 | /debug@4.3.4: 1147 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1148 | engines: {node: '>=6.0'} 1149 | peerDependencies: 1150 | supports-color: '*' 1151 | peerDependenciesMeta: 1152 | supports-color: 1153 | optional: true 1154 | dependencies: 1155 | ms: 2.1.2 1156 | dev: true 1157 | 1158 | /deep-eql@4.1.3: 1159 | resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 1160 | engines: {node: '>=6'} 1161 | dependencies: 1162 | type-detect: 4.0.8 1163 | dev: true 1164 | 1165 | /deep-is@0.1.4: 1166 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1167 | dev: true 1168 | 1169 | /didyoumean@1.2.2: 1170 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1171 | dev: true 1172 | 1173 | /diff-sequences@29.6.3: 1174 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 1175 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1176 | dev: true 1177 | 1178 | /dir-glob@3.0.1: 1179 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1180 | engines: {node: '>=8'} 1181 | dependencies: 1182 | path-type: 4.0.0 1183 | dev: true 1184 | 1185 | /dlv@1.1.3: 1186 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1187 | dev: true 1188 | 1189 | /doctrine@3.0.0: 1190 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1191 | engines: {node: '>=6.0.0'} 1192 | dependencies: 1193 | esutils: 2.0.3 1194 | dev: true 1195 | 1196 | /eastasianwidth@0.2.0: 1197 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1198 | dev: true 1199 | 1200 | /electron-to-chromium@1.4.699: 1201 | resolution: {integrity: sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==} 1202 | dev: true 1203 | 1204 | /emoji-regex@8.0.0: 1205 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1206 | dev: true 1207 | 1208 | /emoji-regex@9.2.2: 1209 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1210 | dev: true 1211 | 1212 | /esbuild@0.19.12: 1213 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 1214 | engines: {node: '>=12'} 1215 | hasBin: true 1216 | requiresBuild: true 1217 | optionalDependencies: 1218 | '@esbuild/aix-ppc64': 0.19.12 1219 | '@esbuild/android-arm': 0.19.12 1220 | '@esbuild/android-arm64': 0.19.12 1221 | '@esbuild/android-x64': 0.19.12 1222 | '@esbuild/darwin-arm64': 0.19.12 1223 | '@esbuild/darwin-x64': 0.19.12 1224 | '@esbuild/freebsd-arm64': 0.19.12 1225 | '@esbuild/freebsd-x64': 0.19.12 1226 | '@esbuild/linux-arm': 0.19.12 1227 | '@esbuild/linux-arm64': 0.19.12 1228 | '@esbuild/linux-ia32': 0.19.12 1229 | '@esbuild/linux-loong64': 0.19.12 1230 | '@esbuild/linux-mips64el': 0.19.12 1231 | '@esbuild/linux-ppc64': 0.19.12 1232 | '@esbuild/linux-riscv64': 0.19.12 1233 | '@esbuild/linux-s390x': 0.19.12 1234 | '@esbuild/linux-x64': 0.19.12 1235 | '@esbuild/netbsd-x64': 0.19.12 1236 | '@esbuild/openbsd-x64': 0.19.12 1237 | '@esbuild/sunos-x64': 0.19.12 1238 | '@esbuild/win32-arm64': 0.19.12 1239 | '@esbuild/win32-ia32': 0.19.12 1240 | '@esbuild/win32-x64': 0.19.12 1241 | dev: true 1242 | 1243 | /escalade@3.1.2: 1244 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 1245 | engines: {node: '>=6'} 1246 | dev: true 1247 | 1248 | /escape-string-regexp@4.0.0: 1249 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1250 | engines: {node: '>=10'} 1251 | dev: true 1252 | 1253 | /eslint-config-xo-typescript@4.0.0(@typescript-eslint/eslint-plugin@7.1.1)(@typescript-eslint/parser@7.1.1)(eslint@8.57.0)(typescript@5.4.2): 1254 | resolution: {integrity: sha512-pmSWzVpvzEjZHG7S/rN34cFXAoe6YbvWFBQSitEXD5CcT2SULfykYl8hcYXss37r5N3SmJYAiO6VlcfkPiDRxg==} 1255 | engines: {node: '>=18'} 1256 | peerDependencies: 1257 | '@typescript-eslint/eslint-plugin': '>=7.0.2' 1258 | '@typescript-eslint/parser': '>=7.0.2' 1259 | eslint: '>=8.56.0' 1260 | typescript: '>=5.0.0' 1261 | dependencies: 1262 | '@typescript-eslint/eslint-plugin': 7.1.1(@typescript-eslint/parser@7.1.1)(eslint@8.57.0)(typescript@5.4.2) 1263 | '@typescript-eslint/parser': 7.1.1(eslint@8.57.0)(typescript@5.4.2) 1264 | eslint: 8.57.0 1265 | typescript: 5.4.2 1266 | dev: true 1267 | 1268 | /eslint-config-xo@0.44.0(eslint@8.57.0): 1269 | resolution: {integrity: sha512-YG4gdaor0mJJi8UBeRJqDPO42MedTWYMaUyucF5bhm2pi/HS98JIxfFQmTLuyj6hGpQlAazNfyVnn7JuDn+Sew==} 1270 | engines: {node: '>=18'} 1271 | peerDependencies: 1272 | eslint: '>=8.56.0' 1273 | dependencies: 1274 | confusing-browser-globals: 1.0.11 1275 | eslint: 8.57.0 1276 | dev: true 1277 | 1278 | /eslint-plugin-simple-import-sort@12.0.0(eslint@8.57.0): 1279 | resolution: {integrity: sha512-8o0dVEdAkYap0Cn5kNeklaKcT1nUsa3LITWEuFk3nJifOoD+5JQGoyDUW2W/iPWwBsNBJpyJS9y4je/BgxLcyQ==} 1280 | peerDependencies: 1281 | eslint: '>=5.0.0' 1282 | dependencies: 1283 | eslint: 8.57.0 1284 | dev: true 1285 | 1286 | /eslint-scope@7.2.2: 1287 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1288 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1289 | dependencies: 1290 | esrecurse: 4.3.0 1291 | estraverse: 5.3.0 1292 | dev: true 1293 | 1294 | /eslint-visitor-keys@3.4.3: 1295 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1296 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1297 | dev: true 1298 | 1299 | /eslint@8.57.0: 1300 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} 1301 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1302 | hasBin: true 1303 | dependencies: 1304 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) 1305 | '@eslint-community/regexpp': 4.10.0 1306 | '@eslint/eslintrc': 2.1.4 1307 | '@eslint/js': 8.57.0 1308 | '@humanwhocodes/config-array': 0.11.14 1309 | '@humanwhocodes/module-importer': 1.0.1 1310 | '@nodelib/fs.walk': 1.2.8 1311 | '@ungap/structured-clone': 1.2.0 1312 | ajv: 6.12.6 1313 | chalk: 4.1.2 1314 | cross-spawn: 7.0.3 1315 | debug: 4.3.4 1316 | doctrine: 3.0.0 1317 | escape-string-regexp: 4.0.0 1318 | eslint-scope: 7.2.2 1319 | eslint-visitor-keys: 3.4.3 1320 | espree: 9.6.1 1321 | esquery: 1.5.0 1322 | esutils: 2.0.3 1323 | fast-deep-equal: 3.1.3 1324 | file-entry-cache: 6.0.1 1325 | find-up: 5.0.0 1326 | glob-parent: 6.0.2 1327 | globals: 13.24.0 1328 | graphemer: 1.4.0 1329 | ignore: 5.3.1 1330 | imurmurhash: 0.1.4 1331 | is-glob: 4.0.3 1332 | is-path-inside: 3.0.3 1333 | js-yaml: 4.1.0 1334 | json-stable-stringify-without-jsonify: 1.0.1 1335 | levn: 0.4.1 1336 | lodash.merge: 4.6.2 1337 | minimatch: 3.1.2 1338 | natural-compare: 1.4.0 1339 | optionator: 0.9.3 1340 | strip-ansi: 6.0.1 1341 | text-table: 0.2.0 1342 | transitivePeerDependencies: 1343 | - supports-color 1344 | dev: true 1345 | 1346 | /espree@9.6.1: 1347 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1348 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1349 | dependencies: 1350 | acorn: 8.11.3 1351 | acorn-jsx: 5.3.2(acorn@8.11.3) 1352 | eslint-visitor-keys: 3.4.3 1353 | dev: true 1354 | 1355 | /esquery@1.5.0: 1356 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1357 | engines: {node: '>=0.10'} 1358 | dependencies: 1359 | estraverse: 5.3.0 1360 | dev: true 1361 | 1362 | /esrecurse@4.3.0: 1363 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1364 | engines: {node: '>=4.0'} 1365 | dependencies: 1366 | estraverse: 5.3.0 1367 | dev: true 1368 | 1369 | /estraverse@5.3.0: 1370 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1371 | engines: {node: '>=4.0'} 1372 | dev: true 1373 | 1374 | /estree-walker@3.0.3: 1375 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 1376 | dependencies: 1377 | '@types/estree': 1.0.5 1378 | dev: true 1379 | 1380 | /esutils@2.0.3: 1381 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1382 | engines: {node: '>=0.10.0'} 1383 | dev: true 1384 | 1385 | /execa@8.0.1: 1386 | resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} 1387 | engines: {node: '>=16.17'} 1388 | dependencies: 1389 | cross-spawn: 7.0.3 1390 | get-stream: 8.0.1 1391 | human-signals: 5.0.0 1392 | is-stream: 3.0.0 1393 | merge-stream: 2.0.0 1394 | npm-run-path: 5.3.0 1395 | onetime: 6.0.0 1396 | signal-exit: 4.1.0 1397 | strip-final-newline: 3.0.0 1398 | dev: true 1399 | 1400 | /fast-deep-equal@3.1.3: 1401 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1402 | dev: true 1403 | 1404 | /fast-glob@3.3.2: 1405 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1406 | engines: {node: '>=8.6.0'} 1407 | dependencies: 1408 | '@nodelib/fs.stat': 2.0.5 1409 | '@nodelib/fs.walk': 1.2.8 1410 | glob-parent: 5.1.2 1411 | merge2: 1.4.1 1412 | micromatch: 4.0.5 1413 | dev: true 1414 | 1415 | /fast-json-stable-stringify@2.1.0: 1416 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1417 | dev: true 1418 | 1419 | /fast-levenshtein@2.0.6: 1420 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1421 | dev: true 1422 | 1423 | /fastq@1.17.1: 1424 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1425 | dependencies: 1426 | reusify: 1.0.4 1427 | dev: true 1428 | 1429 | /file-entry-cache@6.0.1: 1430 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1431 | engines: {node: ^10.12.0 || >=12.0.0} 1432 | dependencies: 1433 | flat-cache: 3.2.0 1434 | dev: true 1435 | 1436 | /fill-range@7.0.1: 1437 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1438 | engines: {node: '>=8'} 1439 | dependencies: 1440 | to-regex-range: 5.0.1 1441 | dev: true 1442 | 1443 | /find-up@5.0.0: 1444 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1445 | engines: {node: '>=10'} 1446 | dependencies: 1447 | locate-path: 6.0.0 1448 | path-exists: 4.0.0 1449 | dev: true 1450 | 1451 | /flat-cache@3.2.0: 1452 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 1453 | engines: {node: ^10.12.0 || >=12.0.0} 1454 | dependencies: 1455 | flatted: 3.3.1 1456 | keyv: 4.5.4 1457 | rimraf: 3.0.2 1458 | dev: true 1459 | 1460 | /flatted@3.3.1: 1461 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 1462 | dev: true 1463 | 1464 | /foreground-child@3.1.1: 1465 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1466 | engines: {node: '>=14'} 1467 | dependencies: 1468 | cross-spawn: 7.0.3 1469 | signal-exit: 4.1.0 1470 | dev: true 1471 | 1472 | /fraction.js@4.3.7: 1473 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 1474 | dev: true 1475 | 1476 | /fs.realpath@1.0.0: 1477 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1478 | dev: true 1479 | 1480 | /fsevents@2.3.3: 1481 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1482 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1483 | os: [darwin] 1484 | requiresBuild: true 1485 | dev: true 1486 | optional: true 1487 | 1488 | /function-bind@1.1.2: 1489 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1490 | dev: true 1491 | 1492 | /get-func-name@2.0.2: 1493 | resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 1494 | dev: true 1495 | 1496 | /get-stream@8.0.1: 1497 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 1498 | engines: {node: '>=16'} 1499 | dev: true 1500 | 1501 | /glob-parent@5.1.2: 1502 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1503 | engines: {node: '>= 6'} 1504 | dependencies: 1505 | is-glob: 4.0.3 1506 | dev: true 1507 | 1508 | /glob-parent@6.0.2: 1509 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1510 | engines: {node: '>=10.13.0'} 1511 | dependencies: 1512 | is-glob: 4.0.3 1513 | dev: true 1514 | 1515 | /glob@10.3.10: 1516 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1517 | engines: {node: '>=16 || 14 >=14.17'} 1518 | hasBin: true 1519 | dependencies: 1520 | foreground-child: 3.1.1 1521 | jackspeak: 2.3.6 1522 | minimatch: 9.0.3 1523 | minipass: 7.0.4 1524 | path-scurry: 1.10.1 1525 | dev: true 1526 | 1527 | /glob@7.2.3: 1528 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1529 | dependencies: 1530 | fs.realpath: 1.0.0 1531 | inflight: 1.0.6 1532 | inherits: 2.0.4 1533 | minimatch: 3.1.2 1534 | once: 1.4.0 1535 | path-is-absolute: 1.0.1 1536 | dev: true 1537 | 1538 | /globals@13.24.0: 1539 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1540 | engines: {node: '>=8'} 1541 | dependencies: 1542 | type-fest: 0.20.2 1543 | dev: true 1544 | 1545 | /globby@11.1.0: 1546 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1547 | engines: {node: '>=10'} 1548 | dependencies: 1549 | array-union: 2.1.0 1550 | dir-glob: 3.0.1 1551 | fast-glob: 3.3.2 1552 | ignore: 5.3.1 1553 | merge2: 1.4.1 1554 | slash: 3.0.0 1555 | dev: true 1556 | 1557 | /graphemer@1.4.0: 1558 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1559 | dev: true 1560 | 1561 | /has-flag@4.0.0: 1562 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1563 | engines: {node: '>=8'} 1564 | dev: true 1565 | 1566 | /hasown@2.0.2: 1567 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1568 | engines: {node: '>= 0.4'} 1569 | dependencies: 1570 | function-bind: 1.1.2 1571 | dev: true 1572 | 1573 | /html-escaper@2.0.2: 1574 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1575 | dev: true 1576 | 1577 | /human-signals@5.0.0: 1578 | resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} 1579 | engines: {node: '>=16.17.0'} 1580 | dev: true 1581 | 1582 | /ignore@5.3.1: 1583 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1584 | engines: {node: '>= 4'} 1585 | dev: true 1586 | 1587 | /import-fresh@3.3.0: 1588 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1589 | engines: {node: '>=6'} 1590 | dependencies: 1591 | parent-module: 1.0.1 1592 | resolve-from: 4.0.0 1593 | dev: true 1594 | 1595 | /imurmurhash@0.1.4: 1596 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1597 | engines: {node: '>=0.8.19'} 1598 | dev: true 1599 | 1600 | /inflight@1.0.6: 1601 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1602 | dependencies: 1603 | once: 1.4.0 1604 | wrappy: 1.0.2 1605 | dev: true 1606 | 1607 | /inherits@2.0.4: 1608 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1609 | dev: true 1610 | 1611 | /is-binary-path@2.1.0: 1612 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1613 | engines: {node: '>=8'} 1614 | dependencies: 1615 | binary-extensions: 2.2.0 1616 | dev: true 1617 | 1618 | /is-core-module@2.13.1: 1619 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1620 | dependencies: 1621 | hasown: 2.0.2 1622 | dev: true 1623 | 1624 | /is-extglob@2.1.1: 1625 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1626 | engines: {node: '>=0.10.0'} 1627 | dev: true 1628 | 1629 | /is-fullwidth-code-point@3.0.0: 1630 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1631 | engines: {node: '>=8'} 1632 | dev: true 1633 | 1634 | /is-glob@4.0.3: 1635 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1636 | engines: {node: '>=0.10.0'} 1637 | dependencies: 1638 | is-extglob: 2.1.1 1639 | dev: true 1640 | 1641 | /is-number@7.0.0: 1642 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1643 | engines: {node: '>=0.12.0'} 1644 | dev: true 1645 | 1646 | /is-path-inside@3.0.3: 1647 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1648 | engines: {node: '>=8'} 1649 | dev: true 1650 | 1651 | /is-stream@3.0.0: 1652 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1653 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1654 | dev: true 1655 | 1656 | /isexe@2.0.0: 1657 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1658 | dev: true 1659 | 1660 | /istanbul-lib-coverage@3.2.2: 1661 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1662 | engines: {node: '>=8'} 1663 | dev: true 1664 | 1665 | /istanbul-lib-report@3.0.1: 1666 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1667 | engines: {node: '>=10'} 1668 | dependencies: 1669 | istanbul-lib-coverage: 3.2.2 1670 | make-dir: 4.0.0 1671 | supports-color: 7.2.0 1672 | dev: true 1673 | 1674 | /istanbul-lib-source-maps@4.0.1: 1675 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1676 | engines: {node: '>=10'} 1677 | dependencies: 1678 | debug: 4.3.4 1679 | istanbul-lib-coverage: 3.2.2 1680 | source-map: 0.6.1 1681 | transitivePeerDependencies: 1682 | - supports-color 1683 | dev: true 1684 | 1685 | /istanbul-reports@3.1.7: 1686 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1687 | engines: {node: '>=8'} 1688 | dependencies: 1689 | html-escaper: 2.0.2 1690 | istanbul-lib-report: 3.0.1 1691 | dev: true 1692 | 1693 | /jackspeak@2.3.6: 1694 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1695 | engines: {node: '>=14'} 1696 | dependencies: 1697 | '@isaacs/cliui': 8.0.2 1698 | optionalDependencies: 1699 | '@pkgjs/parseargs': 0.11.0 1700 | dev: true 1701 | 1702 | /jiti@1.21.0: 1703 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1704 | hasBin: true 1705 | dev: true 1706 | 1707 | /js-tokens@8.0.3: 1708 | resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} 1709 | dev: true 1710 | 1711 | /js-yaml@4.1.0: 1712 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1713 | hasBin: true 1714 | dependencies: 1715 | argparse: 2.0.1 1716 | dev: true 1717 | 1718 | /json-buffer@3.0.1: 1719 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1720 | dev: true 1721 | 1722 | /json-schema-traverse@0.4.1: 1723 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1724 | dev: true 1725 | 1726 | /json-stable-stringify-without-jsonify@1.0.1: 1727 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1728 | dev: true 1729 | 1730 | /jsonc-parser@3.2.1: 1731 | resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} 1732 | dev: true 1733 | 1734 | /keyv@4.5.4: 1735 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1736 | dependencies: 1737 | json-buffer: 3.0.1 1738 | dev: true 1739 | 1740 | /levn@0.4.1: 1741 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1742 | engines: {node: '>= 0.8.0'} 1743 | dependencies: 1744 | prelude-ls: 1.2.1 1745 | type-check: 0.4.0 1746 | dev: true 1747 | 1748 | /lilconfig@2.1.0: 1749 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1750 | engines: {node: '>=10'} 1751 | dev: true 1752 | 1753 | /lilconfig@3.1.1: 1754 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 1755 | engines: {node: '>=14'} 1756 | dev: true 1757 | 1758 | /lines-and-columns@1.2.4: 1759 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1760 | dev: true 1761 | 1762 | /local-pkg@0.5.0: 1763 | resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} 1764 | engines: {node: '>=14'} 1765 | dependencies: 1766 | mlly: 1.6.1 1767 | pkg-types: 1.0.3 1768 | dev: true 1769 | 1770 | /locate-path@6.0.0: 1771 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1772 | engines: {node: '>=10'} 1773 | dependencies: 1774 | p-locate: 5.0.0 1775 | dev: true 1776 | 1777 | /lodash.merge@4.6.2: 1778 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1779 | dev: true 1780 | 1781 | /loupe@2.3.7: 1782 | resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} 1783 | dependencies: 1784 | get-func-name: 2.0.2 1785 | dev: true 1786 | 1787 | /lru-cache@10.2.0: 1788 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1789 | engines: {node: 14 || >=16.14} 1790 | dev: true 1791 | 1792 | /lru-cache@6.0.0: 1793 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1794 | engines: {node: '>=10'} 1795 | dependencies: 1796 | yallist: 4.0.0 1797 | dev: true 1798 | 1799 | /magic-string@0.30.8: 1800 | resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} 1801 | engines: {node: '>=12'} 1802 | dependencies: 1803 | '@jridgewell/sourcemap-codec': 1.4.15 1804 | dev: true 1805 | 1806 | /magicast@0.3.3: 1807 | resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} 1808 | dependencies: 1809 | '@babel/parser': 7.24.0 1810 | '@babel/types': 7.24.0 1811 | source-map-js: 1.0.2 1812 | dev: true 1813 | 1814 | /make-dir@4.0.0: 1815 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 1816 | engines: {node: '>=10'} 1817 | dependencies: 1818 | semver: 7.6.0 1819 | dev: true 1820 | 1821 | /merge-stream@2.0.0: 1822 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1823 | dev: true 1824 | 1825 | /merge2@1.4.1: 1826 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1827 | engines: {node: '>= 8'} 1828 | dev: true 1829 | 1830 | /micromatch@4.0.5: 1831 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1832 | engines: {node: '>=8.6'} 1833 | dependencies: 1834 | braces: 3.0.2 1835 | picomatch: 2.3.1 1836 | dev: true 1837 | 1838 | /mimic-fn@4.0.0: 1839 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1840 | engines: {node: '>=12'} 1841 | dev: true 1842 | 1843 | /mini-svg-data-uri@1.4.4: 1844 | resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} 1845 | hasBin: true 1846 | dev: true 1847 | 1848 | /minimatch@3.1.2: 1849 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1850 | dependencies: 1851 | brace-expansion: 1.1.11 1852 | dev: true 1853 | 1854 | /minimatch@9.0.3: 1855 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1856 | engines: {node: '>=16 || 14 >=14.17'} 1857 | dependencies: 1858 | brace-expansion: 2.0.1 1859 | dev: true 1860 | 1861 | /minipass@7.0.4: 1862 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1863 | engines: {node: '>=16 || 14 >=14.17'} 1864 | dev: true 1865 | 1866 | /mlly@1.6.1: 1867 | resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} 1868 | dependencies: 1869 | acorn: 8.11.3 1870 | pathe: 1.1.2 1871 | pkg-types: 1.0.3 1872 | ufo: 1.4.0 1873 | dev: true 1874 | 1875 | /ms@2.1.2: 1876 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1877 | dev: true 1878 | 1879 | /mz@2.7.0: 1880 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1881 | dependencies: 1882 | any-promise: 1.3.0 1883 | object-assign: 4.1.1 1884 | thenify-all: 1.6.0 1885 | dev: true 1886 | 1887 | /nanoid@3.3.7: 1888 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1889 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1890 | hasBin: true 1891 | dev: true 1892 | 1893 | /natural-compare@1.4.0: 1894 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1895 | dev: true 1896 | 1897 | /node-releases@2.0.14: 1898 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 1899 | dev: true 1900 | 1901 | /normalize-path@3.0.0: 1902 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1903 | engines: {node: '>=0.10.0'} 1904 | dev: true 1905 | 1906 | /normalize-range@0.1.2: 1907 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1908 | engines: {node: '>=0.10.0'} 1909 | dev: true 1910 | 1911 | /npm-run-path@5.3.0: 1912 | resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} 1913 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1914 | dependencies: 1915 | path-key: 4.0.0 1916 | dev: true 1917 | 1918 | /object-assign@4.1.1: 1919 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1920 | engines: {node: '>=0.10.0'} 1921 | dev: true 1922 | 1923 | /object-hash@3.0.0: 1924 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1925 | engines: {node: '>= 6'} 1926 | dev: true 1927 | 1928 | /once@1.4.0: 1929 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1930 | dependencies: 1931 | wrappy: 1.0.2 1932 | dev: true 1933 | 1934 | /onetime@6.0.0: 1935 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1936 | engines: {node: '>=12'} 1937 | dependencies: 1938 | mimic-fn: 4.0.0 1939 | dev: true 1940 | 1941 | /optionator@0.9.3: 1942 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 1943 | engines: {node: '>= 0.8.0'} 1944 | dependencies: 1945 | '@aashutoshrathi/word-wrap': 1.2.6 1946 | deep-is: 0.1.4 1947 | fast-levenshtein: 2.0.6 1948 | levn: 0.4.1 1949 | prelude-ls: 1.2.1 1950 | type-check: 0.4.0 1951 | dev: true 1952 | 1953 | /p-limit@3.1.0: 1954 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1955 | engines: {node: '>=10'} 1956 | dependencies: 1957 | yocto-queue: 0.1.0 1958 | dev: true 1959 | 1960 | /p-limit@5.0.0: 1961 | resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} 1962 | engines: {node: '>=18'} 1963 | dependencies: 1964 | yocto-queue: 1.0.0 1965 | dev: true 1966 | 1967 | /p-locate@5.0.0: 1968 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1969 | engines: {node: '>=10'} 1970 | dependencies: 1971 | p-limit: 3.1.0 1972 | dev: true 1973 | 1974 | /parent-module@1.0.1: 1975 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1976 | engines: {node: '>=6'} 1977 | dependencies: 1978 | callsites: 3.1.0 1979 | dev: true 1980 | 1981 | /path-exists@4.0.0: 1982 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1983 | engines: {node: '>=8'} 1984 | dev: true 1985 | 1986 | /path-is-absolute@1.0.1: 1987 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1988 | engines: {node: '>=0.10.0'} 1989 | dev: true 1990 | 1991 | /path-key@3.1.1: 1992 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1993 | engines: {node: '>=8'} 1994 | dev: true 1995 | 1996 | /path-key@4.0.0: 1997 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1998 | engines: {node: '>=12'} 1999 | dev: true 2000 | 2001 | /path-parse@1.0.7: 2002 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2003 | dev: true 2004 | 2005 | /path-scurry@1.10.1: 2006 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 2007 | engines: {node: '>=16 || 14 >=14.17'} 2008 | dependencies: 2009 | lru-cache: 10.2.0 2010 | minipass: 7.0.4 2011 | dev: true 2012 | 2013 | /path-type@4.0.0: 2014 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2015 | engines: {node: '>=8'} 2016 | dev: true 2017 | 2018 | /pathe@1.1.2: 2019 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 2020 | dev: true 2021 | 2022 | /pathval@1.1.1: 2023 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 2024 | dev: true 2025 | 2026 | /picocolors@1.0.0: 2027 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2028 | dev: true 2029 | 2030 | /picomatch@2.3.1: 2031 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2032 | engines: {node: '>=8.6'} 2033 | dev: true 2034 | 2035 | /pify@2.3.0: 2036 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 2037 | engines: {node: '>=0.10.0'} 2038 | dev: true 2039 | 2040 | /pirates@4.0.6: 2041 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2042 | engines: {node: '>= 6'} 2043 | dev: true 2044 | 2045 | /pkg-types@1.0.3: 2046 | resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 2047 | dependencies: 2048 | jsonc-parser: 3.2.1 2049 | mlly: 1.6.1 2050 | pathe: 1.1.2 2051 | dev: true 2052 | 2053 | /postcss-import@15.1.0(postcss@8.4.35): 2054 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 2055 | engines: {node: '>=14.0.0'} 2056 | peerDependencies: 2057 | postcss: ^8.0.0 2058 | dependencies: 2059 | postcss: 8.4.35 2060 | postcss-value-parser: 4.2.0 2061 | read-cache: 1.0.0 2062 | resolve: 1.22.8 2063 | dev: true 2064 | 2065 | /postcss-js@4.0.1(postcss@8.4.35): 2066 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 2067 | engines: {node: ^12 || ^14 || >= 16} 2068 | peerDependencies: 2069 | postcss: ^8.4.21 2070 | dependencies: 2071 | camelcase-css: 2.0.1 2072 | postcss: 8.4.35 2073 | dev: true 2074 | 2075 | /postcss-load-config@4.0.2(postcss@8.4.35): 2076 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 2077 | engines: {node: '>= 14'} 2078 | peerDependencies: 2079 | postcss: '>=8.0.9' 2080 | ts-node: '>=9.0.0' 2081 | peerDependenciesMeta: 2082 | postcss: 2083 | optional: true 2084 | ts-node: 2085 | optional: true 2086 | dependencies: 2087 | lilconfig: 3.1.1 2088 | postcss: 8.4.35 2089 | yaml: 2.4.1 2090 | dev: true 2091 | 2092 | /postcss-nested@6.0.1(postcss@8.4.35): 2093 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 2094 | engines: {node: '>=12.0'} 2095 | peerDependencies: 2096 | postcss: ^8.2.14 2097 | dependencies: 2098 | postcss: 8.4.35 2099 | postcss-selector-parser: 6.0.15 2100 | dev: true 2101 | 2102 | /postcss-selector-parser@6.0.15: 2103 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 2104 | engines: {node: '>=4'} 2105 | dependencies: 2106 | cssesc: 3.0.0 2107 | util-deprecate: 1.0.2 2108 | dev: true 2109 | 2110 | /postcss-value-parser@4.2.0: 2111 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2112 | dev: true 2113 | 2114 | /postcss@8.4.35: 2115 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} 2116 | engines: {node: ^10 || ^12 || >=14} 2117 | dependencies: 2118 | nanoid: 3.3.7 2119 | picocolors: 1.0.0 2120 | source-map-js: 1.0.2 2121 | dev: true 2122 | 2123 | /prelude-ls@1.2.1: 2124 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2125 | engines: {node: '>= 0.8.0'} 2126 | dev: true 2127 | 2128 | /pretty-format@29.7.0: 2129 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 2130 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2131 | dependencies: 2132 | '@jest/schemas': 29.6.3 2133 | ansi-styles: 5.2.0 2134 | react-is: 18.2.0 2135 | dev: true 2136 | 2137 | /punycode@2.3.1: 2138 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2139 | engines: {node: '>=6'} 2140 | dev: true 2141 | 2142 | /queue-microtask@1.2.3: 2143 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2144 | dev: true 2145 | 2146 | /react-is@18.2.0: 2147 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 2148 | dev: true 2149 | 2150 | /read-cache@1.0.0: 2151 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 2152 | dependencies: 2153 | pify: 2.3.0 2154 | dev: true 2155 | 2156 | /readdirp@3.6.0: 2157 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2158 | engines: {node: '>=8.10.0'} 2159 | dependencies: 2160 | picomatch: 2.3.1 2161 | dev: true 2162 | 2163 | /resolve-from@4.0.0: 2164 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2165 | engines: {node: '>=4'} 2166 | dev: true 2167 | 2168 | /resolve@1.22.8: 2169 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2170 | hasBin: true 2171 | dependencies: 2172 | is-core-module: 2.13.1 2173 | path-parse: 1.0.7 2174 | supports-preserve-symlinks-flag: 1.0.0 2175 | dev: true 2176 | 2177 | /reusify@1.0.4: 2178 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2179 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2180 | dev: true 2181 | 2182 | /rfc4648@1.5.3: 2183 | resolution: {integrity: sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ==} 2184 | dev: false 2185 | 2186 | /rimraf@3.0.2: 2187 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2188 | hasBin: true 2189 | dependencies: 2190 | glob: 7.2.3 2191 | dev: true 2192 | 2193 | /rollup@4.12.1: 2194 | resolution: {integrity: sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==} 2195 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 2196 | hasBin: true 2197 | dependencies: 2198 | '@types/estree': 1.0.5 2199 | optionalDependencies: 2200 | '@rollup/rollup-android-arm-eabi': 4.12.1 2201 | '@rollup/rollup-android-arm64': 4.12.1 2202 | '@rollup/rollup-darwin-arm64': 4.12.1 2203 | '@rollup/rollup-darwin-x64': 4.12.1 2204 | '@rollup/rollup-linux-arm-gnueabihf': 4.12.1 2205 | '@rollup/rollup-linux-arm64-gnu': 4.12.1 2206 | '@rollup/rollup-linux-arm64-musl': 4.12.1 2207 | '@rollup/rollup-linux-riscv64-gnu': 4.12.1 2208 | '@rollup/rollup-linux-x64-gnu': 4.12.1 2209 | '@rollup/rollup-linux-x64-musl': 4.12.1 2210 | '@rollup/rollup-win32-arm64-msvc': 4.12.1 2211 | '@rollup/rollup-win32-ia32-msvc': 4.12.1 2212 | '@rollup/rollup-win32-x64-msvc': 4.12.1 2213 | fsevents: 2.3.3 2214 | dev: true 2215 | 2216 | /run-parallel@1.2.0: 2217 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2218 | dependencies: 2219 | queue-microtask: 1.2.3 2220 | dev: true 2221 | 2222 | /semver@7.6.0: 2223 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 2224 | engines: {node: '>=10'} 2225 | hasBin: true 2226 | dependencies: 2227 | lru-cache: 6.0.0 2228 | dev: true 2229 | 2230 | /shebang-command@2.0.0: 2231 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2232 | engines: {node: '>=8'} 2233 | dependencies: 2234 | shebang-regex: 3.0.0 2235 | dev: true 2236 | 2237 | /shebang-regex@3.0.0: 2238 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2239 | engines: {node: '>=8'} 2240 | dev: true 2241 | 2242 | /siginfo@2.0.0: 2243 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 2244 | dev: true 2245 | 2246 | /signal-exit@4.1.0: 2247 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 2248 | engines: {node: '>=14'} 2249 | dev: true 2250 | 2251 | /slash@3.0.0: 2252 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2253 | engines: {node: '>=8'} 2254 | dev: true 2255 | 2256 | /source-map-js@1.0.2: 2257 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2258 | engines: {node: '>=0.10.0'} 2259 | dev: true 2260 | 2261 | /source-map@0.6.1: 2262 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2263 | engines: {node: '>=0.10.0'} 2264 | dev: true 2265 | 2266 | /stackback@0.0.2: 2267 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 2268 | dev: true 2269 | 2270 | /std-env@3.7.0: 2271 | resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} 2272 | dev: true 2273 | 2274 | /string-width@4.2.3: 2275 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2276 | engines: {node: '>=8'} 2277 | dependencies: 2278 | emoji-regex: 8.0.0 2279 | is-fullwidth-code-point: 3.0.0 2280 | strip-ansi: 6.0.1 2281 | dev: true 2282 | 2283 | /string-width@5.1.2: 2284 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2285 | engines: {node: '>=12'} 2286 | dependencies: 2287 | eastasianwidth: 0.2.0 2288 | emoji-regex: 9.2.2 2289 | strip-ansi: 7.1.0 2290 | dev: true 2291 | 2292 | /strip-ansi@6.0.1: 2293 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2294 | engines: {node: '>=8'} 2295 | dependencies: 2296 | ansi-regex: 5.0.1 2297 | dev: true 2298 | 2299 | /strip-ansi@7.1.0: 2300 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2301 | engines: {node: '>=12'} 2302 | dependencies: 2303 | ansi-regex: 6.0.1 2304 | dev: true 2305 | 2306 | /strip-final-newline@3.0.0: 2307 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 2308 | engines: {node: '>=12'} 2309 | dev: true 2310 | 2311 | /strip-json-comments@3.1.1: 2312 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2313 | engines: {node: '>=8'} 2314 | dev: true 2315 | 2316 | /strip-literal@2.0.0: 2317 | resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} 2318 | dependencies: 2319 | js-tokens: 8.0.3 2320 | dev: true 2321 | 2322 | /sucrase@3.35.0: 2323 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 2324 | engines: {node: '>=16 || 14 >=14.17'} 2325 | hasBin: true 2326 | dependencies: 2327 | '@jridgewell/gen-mapping': 0.3.5 2328 | commander: 4.1.1 2329 | glob: 10.3.10 2330 | lines-and-columns: 1.2.4 2331 | mz: 2.7.0 2332 | pirates: 4.0.6 2333 | ts-interface-checker: 0.1.13 2334 | dev: true 2335 | 2336 | /supports-color@7.2.0: 2337 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2338 | engines: {node: '>=8'} 2339 | dependencies: 2340 | has-flag: 4.0.0 2341 | dev: true 2342 | 2343 | /supports-preserve-symlinks-flag@1.0.0: 2344 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2345 | engines: {node: '>= 0.4'} 2346 | dev: true 2347 | 2348 | /tailwindcss@3.4.1: 2349 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} 2350 | engines: {node: '>=14.0.0'} 2351 | hasBin: true 2352 | dependencies: 2353 | '@alloc/quick-lru': 5.2.0 2354 | arg: 5.0.2 2355 | chokidar: 3.6.0 2356 | didyoumean: 1.2.2 2357 | dlv: 1.1.3 2358 | fast-glob: 3.3.2 2359 | glob-parent: 6.0.2 2360 | is-glob: 4.0.3 2361 | jiti: 1.21.0 2362 | lilconfig: 2.1.0 2363 | micromatch: 4.0.5 2364 | normalize-path: 3.0.0 2365 | object-hash: 3.0.0 2366 | picocolors: 1.0.0 2367 | postcss: 8.4.35 2368 | postcss-import: 15.1.0(postcss@8.4.35) 2369 | postcss-js: 4.0.1(postcss@8.4.35) 2370 | postcss-load-config: 4.0.2(postcss@8.4.35) 2371 | postcss-nested: 6.0.1(postcss@8.4.35) 2372 | postcss-selector-parser: 6.0.15 2373 | resolve: 1.22.8 2374 | sucrase: 3.35.0 2375 | transitivePeerDependencies: 2376 | - ts-node 2377 | dev: true 2378 | 2379 | /test-exclude@6.0.0: 2380 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 2381 | engines: {node: '>=8'} 2382 | dependencies: 2383 | '@istanbuljs/schema': 0.1.3 2384 | glob: 7.2.3 2385 | minimatch: 3.1.2 2386 | dev: true 2387 | 2388 | /text-table@0.2.0: 2389 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2390 | dev: true 2391 | 2392 | /thenify-all@1.6.0: 2393 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2394 | engines: {node: '>=0.8'} 2395 | dependencies: 2396 | thenify: 3.3.1 2397 | dev: true 2398 | 2399 | /thenify@3.3.1: 2400 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2401 | dependencies: 2402 | any-promise: 1.3.0 2403 | dev: true 2404 | 2405 | /tinybench@2.6.0: 2406 | resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} 2407 | dev: true 2408 | 2409 | /tinypool@0.8.2: 2410 | resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} 2411 | engines: {node: '>=14.0.0'} 2412 | dev: true 2413 | 2414 | /tinyspy@2.2.1: 2415 | resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} 2416 | engines: {node: '>=14.0.0'} 2417 | dev: true 2418 | 2419 | /to-fast-properties@2.0.0: 2420 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 2421 | engines: {node: '>=4'} 2422 | dev: true 2423 | 2424 | /to-regex-range@5.0.1: 2425 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2426 | engines: {node: '>=8.0'} 2427 | dependencies: 2428 | is-number: 7.0.0 2429 | dev: true 2430 | 2431 | /ts-api-utils@1.3.0(typescript@5.4.2): 2432 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} 2433 | engines: {node: '>=16'} 2434 | peerDependencies: 2435 | typescript: '>=4.2.0' 2436 | dependencies: 2437 | typescript: 5.4.2 2438 | dev: true 2439 | 2440 | /ts-interface-checker@0.1.13: 2441 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2442 | dev: true 2443 | 2444 | /type-check@0.4.0: 2445 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2446 | engines: {node: '>= 0.8.0'} 2447 | dependencies: 2448 | prelude-ls: 1.2.1 2449 | dev: true 2450 | 2451 | /type-detect@4.0.8: 2452 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 2453 | engines: {node: '>=4'} 2454 | dev: true 2455 | 2456 | /type-fest@0.20.2: 2457 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2458 | engines: {node: '>=10'} 2459 | dev: true 2460 | 2461 | /typescript@5.4.2: 2462 | resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} 2463 | engines: {node: '>=14.17'} 2464 | hasBin: true 2465 | dev: true 2466 | 2467 | /ufo@1.4.0: 2468 | resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} 2469 | dev: true 2470 | 2471 | /uint8array-extras@1.1.0: 2472 | resolution: {integrity: sha512-CVaBSyOmGoFHu+zOVPbetXEXykOd8KHVBHLlqvmaMWpwcq3rewj18xVNbU5uzf48hclnNQhfNaNany2cMHFK/g==} 2473 | engines: {node: '>=18'} 2474 | dev: false 2475 | 2476 | /undici-types@5.26.5: 2477 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2478 | dev: true 2479 | 2480 | /update-browserslist-db@1.0.13(browserslist@4.23.0): 2481 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 2482 | hasBin: true 2483 | peerDependencies: 2484 | browserslist: '>= 4.21.0' 2485 | dependencies: 2486 | browserslist: 4.23.0 2487 | escalade: 3.1.2 2488 | picocolors: 1.0.0 2489 | dev: true 2490 | 2491 | /uri-js@4.4.1: 2492 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2493 | dependencies: 2494 | punycode: 2.3.1 2495 | dev: true 2496 | 2497 | /util-deprecate@1.0.2: 2498 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2499 | dev: true 2500 | 2501 | /v8-to-istanbul@9.2.0: 2502 | resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} 2503 | engines: {node: '>=10.12.0'} 2504 | dependencies: 2505 | '@jridgewell/trace-mapping': 0.3.25 2506 | '@types/istanbul-lib-coverage': 2.0.6 2507 | convert-source-map: 2.0.0 2508 | dev: true 2509 | 2510 | /vite-node@1.3.1(@types/node@20.11.25): 2511 | resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} 2512 | engines: {node: ^18.0.0 || >=20.0.0} 2513 | hasBin: true 2514 | dependencies: 2515 | cac: 6.7.14 2516 | debug: 4.3.4 2517 | pathe: 1.1.2 2518 | picocolors: 1.0.0 2519 | vite: 5.1.5(@types/node@20.11.25) 2520 | transitivePeerDependencies: 2521 | - '@types/node' 2522 | - less 2523 | - lightningcss 2524 | - sass 2525 | - stylus 2526 | - sugarss 2527 | - supports-color 2528 | - terser 2529 | dev: true 2530 | 2531 | /vite@5.1.5(@types/node@20.11.25): 2532 | resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} 2533 | engines: {node: ^18.0.0 || >=20.0.0} 2534 | hasBin: true 2535 | peerDependencies: 2536 | '@types/node': ^18.0.0 || >=20.0.0 2537 | less: '*' 2538 | lightningcss: ^1.21.0 2539 | sass: '*' 2540 | stylus: '*' 2541 | sugarss: '*' 2542 | terser: ^5.4.0 2543 | peerDependenciesMeta: 2544 | '@types/node': 2545 | optional: true 2546 | less: 2547 | optional: true 2548 | lightningcss: 2549 | optional: true 2550 | sass: 2551 | optional: true 2552 | stylus: 2553 | optional: true 2554 | sugarss: 2555 | optional: true 2556 | terser: 2557 | optional: true 2558 | dependencies: 2559 | '@types/node': 20.11.25 2560 | esbuild: 0.19.12 2561 | postcss: 8.4.35 2562 | rollup: 4.12.1 2563 | optionalDependencies: 2564 | fsevents: 2.3.3 2565 | dev: true 2566 | 2567 | /vitest@1.3.1(@types/node@20.11.25): 2568 | resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} 2569 | engines: {node: ^18.0.0 || >=20.0.0} 2570 | hasBin: true 2571 | peerDependencies: 2572 | '@edge-runtime/vm': '*' 2573 | '@types/node': ^18.0.0 || >=20.0.0 2574 | '@vitest/browser': 1.3.1 2575 | '@vitest/ui': 1.3.1 2576 | happy-dom: '*' 2577 | jsdom: '*' 2578 | peerDependenciesMeta: 2579 | '@edge-runtime/vm': 2580 | optional: true 2581 | '@types/node': 2582 | optional: true 2583 | '@vitest/browser': 2584 | optional: true 2585 | '@vitest/ui': 2586 | optional: true 2587 | happy-dom: 2588 | optional: true 2589 | jsdom: 2590 | optional: true 2591 | dependencies: 2592 | '@types/node': 20.11.25 2593 | '@vitest/expect': 1.3.1 2594 | '@vitest/runner': 1.3.1 2595 | '@vitest/snapshot': 1.3.1 2596 | '@vitest/spy': 1.3.1 2597 | '@vitest/utils': 1.3.1 2598 | acorn-walk: 8.3.2 2599 | chai: 4.4.1 2600 | debug: 4.3.4 2601 | execa: 8.0.1 2602 | local-pkg: 0.5.0 2603 | magic-string: 0.30.8 2604 | pathe: 1.1.2 2605 | picocolors: 1.0.0 2606 | std-env: 3.7.0 2607 | strip-literal: 2.0.0 2608 | tinybench: 2.6.0 2609 | tinypool: 0.8.2 2610 | vite: 5.1.5(@types/node@20.11.25) 2611 | vite-node: 1.3.1(@types/node@20.11.25) 2612 | why-is-node-running: 2.2.2 2613 | transitivePeerDependencies: 2614 | - less 2615 | - lightningcss 2616 | - sass 2617 | - stylus 2618 | - sugarss 2619 | - supports-color 2620 | - terser 2621 | dev: true 2622 | 2623 | /which@2.0.2: 2624 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2625 | engines: {node: '>= 8'} 2626 | hasBin: true 2627 | dependencies: 2628 | isexe: 2.0.0 2629 | dev: true 2630 | 2631 | /why-is-node-running@2.2.2: 2632 | resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} 2633 | engines: {node: '>=8'} 2634 | hasBin: true 2635 | dependencies: 2636 | siginfo: 2.0.0 2637 | stackback: 0.0.2 2638 | dev: true 2639 | 2640 | /wrap-ansi@7.0.0: 2641 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2642 | engines: {node: '>=10'} 2643 | dependencies: 2644 | ansi-styles: 4.3.0 2645 | string-width: 4.2.3 2646 | strip-ansi: 6.0.1 2647 | dev: true 2648 | 2649 | /wrap-ansi@8.1.0: 2650 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2651 | engines: {node: '>=12'} 2652 | dependencies: 2653 | ansi-styles: 6.2.1 2654 | string-width: 5.1.2 2655 | strip-ansi: 7.1.0 2656 | dev: true 2657 | 2658 | /wrappy@1.0.2: 2659 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2660 | dev: true 2661 | 2662 | /yallist@4.0.0: 2663 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2664 | dev: true 2665 | 2666 | /yaml@2.4.1: 2667 | resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} 2668 | engines: {node: '>= 14'} 2669 | hasBin: true 2670 | dev: true 2671 | 2672 | /yocto-queue@0.1.0: 2673 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2674 | engines: {node: '>=10'} 2675 | dev: true 2676 | 2677 | /yocto-queue@1.0.0: 2678 | resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 2679 | engines: {node: '>=12.20'} 2680 | dev: true 2681 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'demo' 3 | -------------------------------------------------------------------------------- /src/bep53.ts: -------------------------------------------------------------------------------- 1 | export function composeRange(range: number[]) { 2 | return range 3 | .reduce((acc, cur, idx, arr) => { 4 | if (idx === 0 || cur !== arr[idx - 1] + 1) { 5 | acc.push([]); 6 | } 7 | 8 | acc[acc.length - 1].push(`${cur}`); 9 | return acc; 10 | }, []) 11 | .map(cur => (cur.length > 1 ? `${cur[0]}-${cur[cur.length - 1]}` : `${cur[0]}`)); 12 | } 13 | 14 | export function parseRange(range: string[]) { 15 | const generateRange = (start: number, end = start) => 16 | Array.from({ length: end - start + 1 }, (_, idx) => idx + start); 17 | 18 | return range.reduce((acc, cur) => { 19 | const r = cur.split('-').map(cur => parseInt(cur, 10)); 20 | return acc.concat(generateRange(r[0], r[1])); 21 | }, []); 22 | } 23 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { base32 } from 'rfc4648'; 2 | import { hexToUint8Array, uint8ArrayToHex } from 'uint8array-extras'; 3 | 4 | import * as bep53Range from './bep53.js'; 5 | 6 | export interface MagnetData { 7 | /** 8 | * Is the info-hash hex encoded, for a total of 40 characters. For compatability with existing links in the wild, clients should also support the 32 character base32 encoded info-hash. 9 | * 10 | * *or* 11 | * 12 | * Is the multihash formatted, hex encoded full infohash for torrents in the new metadata format. 'btmh' and 'btih' exact topics may exist in the same magnet if they describe the same hybrid torrent. 13 | * @link http://www.bittorrent.org/beps/bep_0009.html 14 | */ 15 | xt?: string | string[]; 16 | /** 17 | * Parsed xt= parameter see xt 18 | */ 19 | infoHash?: string; 20 | infoHashIntArray?: Uint8Array; 21 | infoHashV2?: string; 22 | infoHashV2IntArray?: Uint8Array; 23 | /** 24 | * The display name that may be used by the client to display while waiting for metadata 25 | */ 26 | name?: string | string[]; 27 | /** 28 | * The display name that may be used by the client to display while waiting for metadata 29 | */ 30 | dn?: string | string[]; 31 | /** 32 | * Tracker url, if there is one. If there are multiple trackers, multiple tr entries may be included 33 | */ 34 | tr?: string | string[]; 35 | /** 36 | * Tracker url, if there is one. If there are multiple trackers, multiple tr entries may be included 37 | */ 38 | announce?: string[]; 39 | /** 40 | * An array of where the actual torrent file can be downloaded 41 | */ 42 | xs?: string | string[]; 43 | /** 44 | * An array of where the actual torrent file can be downloaded 45 | */ 46 | as?: string | string[]; 47 | /** 48 | * An array of where the actual torrent file can be downloaded 49 | */ 50 | ws?: string | string[]; 51 | /** 52 | * "keyword topic": a more general search, specifying search terms rather than a particular file 53 | */ 54 | kt?: string[]; 55 | 56 | so?: string[] | number[]; 57 | 'x.pe'?: string | string[]; 58 | 59 | /** 60 | * "keyword topic": a more general search, specifying search terms rather than a particular file 61 | */ 62 | keywords?: string | string[]; 63 | /** 64 | * File index 65 | */ 66 | ix?: number | number[]; 67 | /** 68 | * Size in bytes 69 | */ 70 | xl?: string; 71 | /** 72 | * Combined as= and ws= parameters if they exist 73 | */ 74 | urlList?: string[]; 75 | 76 | peerAddresses?: string[]; 77 | 78 | publicKey?: string; 79 | publicKeyIntArray?: Uint8Array; 80 | } 81 | 82 | const start = 'magnet:?'; 83 | 84 | export function magnetDecode(uri: string): MagnetData { 85 | // Support 'stream-magnet:' as well 86 | const data = uri.substr(uri.indexOf(start) + start.length); 87 | 88 | const params = data && data.length >= 0 ? data.split('&') : []; 89 | 90 | const result: Partial = {}; 91 | params.forEach(param => { 92 | const keyval = param.split('='); 93 | 94 | // This keyval is invalid, skip it 95 | if (keyval.length !== 2) { 96 | return; 97 | } 98 | 99 | const key = keyval[0] as keyof MagnetData; 100 | const val = parseQueryParamValue(key, keyval[1]); 101 | 102 | if (val === undefined) { 103 | return; 104 | } 105 | 106 | const r = result[key]; 107 | 108 | if (!r) { 109 | result[key] = val as any; 110 | return result; 111 | } 112 | 113 | // If there are repeated parameters, return an array of values 114 | if (r && Array.isArray(r)) { 115 | (r as any[]).push(val); 116 | return; 117 | } 118 | 119 | result[key] = [r, val] as any; 120 | // eslint-disable-next-line no-useless-return 121 | return; 122 | }); 123 | 124 | if (result.xt) { 125 | let m; 126 | const xts = Array.isArray(result.xt) ? result.xt : [result.xt]; 127 | xts.forEach((xt: any) => { 128 | if ((m = xt.match(/^urn:btih:(.{40})/))) { 129 | result.infoHash = m[1].toLowerCase(); 130 | } else if ((m = xt.match(/^urn:btih:(.{32})/))) { 131 | const decodedStr = base32.parse(m[1]); 132 | result.infoHash = uint8ArrayToHex(decodedStr); 133 | } else if ((m = xt.match(/^urn:btmh:1220(.{64})/))) { 134 | result.infoHashV2 = m[1].toLowerCase(); 135 | } 136 | }); 137 | } 138 | 139 | if (result.xs) { 140 | let m; 141 | const xss = Array.isArray(result.xs) ? result.xs : [result.xs]; 142 | xss.forEach(xs => { 143 | if ((m = /^urn:btpk:(.{64})/.exec(xs))) { 144 | result.publicKey = m[1]?.toLowerCase(); 145 | } 146 | }); 147 | } 148 | 149 | if (result.infoHash) { 150 | result.infoHashIntArray = hexToUint8Array(result.infoHash); 151 | } 152 | 153 | if (result.infoHashV2) { 154 | result.infoHashV2IntArray = hexToUint8Array(result.infoHashV2); 155 | } 156 | 157 | if (result.publicKey) { 158 | result.publicKeyIntArray = hexToUint8Array(result.publicKey); 159 | } 160 | 161 | if (result.dn) { 162 | result.name = result.dn; 163 | } 164 | 165 | if (result.kt) { 166 | result.keywords = result.kt; 167 | } 168 | 169 | if (typeof result.tr === 'string') { 170 | result.announce = [result.tr]; 171 | } else if (Array.isArray(result.tr)) { 172 | result.announce = result.tr; 173 | } else { 174 | result.announce = []; 175 | } 176 | 177 | result.urlList = []; 178 | if (typeof result.as === 'string' || Array.isArray(result.as)) { 179 | result.urlList = result.urlList.concat(result.as); 180 | } 181 | 182 | if (typeof result.ws === 'string' || Array.isArray(result.ws)) { 183 | result.urlList = result.urlList.concat(result.ws); 184 | } 185 | 186 | result.peerAddresses = []; 187 | if (typeof result['x.pe'] === 'string' || Array.isArray(result['x.pe'])) { 188 | result.peerAddresses = result.peerAddresses.concat(result['x.pe']); 189 | } 190 | 191 | result.announce = [...new Set(result.announce)].sort((a, b) => a.localeCompare(b)); 192 | result.urlList = [...new Set(result.urlList)].sort((a, b) => a.localeCompare(b)); 193 | result.peerAddresses = [...new Set(result.peerAddresses)]; 194 | 195 | return result; 196 | } 197 | 198 | /** 199 | * Specific query parameters have expected formats, this attempts to parse them in the correct way 200 | */ 201 | function parseQueryParamValue(key: string, val: string): string | number | string[] | number[] { 202 | // Clean up torrent name 203 | if (key === 'dn') { 204 | return decodeURIComponent(val).replace(/\+/g, ' '); 205 | } 206 | 207 | // Address tracker (tr), exact source (xs), and acceptable source (as) are encoded 208 | // URIs, so decode them 209 | if (key === 'tr' || key === 'xs' || key === 'as' || key === 'ws') { 210 | return decodeURIComponent(val); 211 | } 212 | 213 | // Return keywords as an array 214 | if (key === 'kt') { 215 | return decodeURIComponent(val).split('+'); 216 | } 217 | 218 | // bep53 219 | if (key === 'so') { 220 | return bep53Range.parseRange(decodeURIComponent(val).split(',')); 221 | } 222 | 223 | // Cast file index (ix) to a number 224 | if (key === 'ix') { 225 | return Number(val); 226 | } 227 | 228 | return val; 229 | } 230 | 231 | export function magnetEncode(data: MagnetData): string { 232 | const obj: any = { ...data }; // Shallow clone object 233 | 234 | // Deduplicate xt by using a set 235 | let xts = new Set(); 236 | if (obj.xt && typeof obj.xt === 'string') { 237 | xts.add(obj.xt); 238 | } 239 | 240 | if (obj.xt && Array.isArray(obj.xt)) { 241 | xts = new Set(obj.xt); 242 | } 243 | 244 | if (obj.infoHashIntArray) { 245 | xts.add(`urn:btih:${uint8ArrayToHex(obj.infoHashIntArray)}`); 246 | } 247 | 248 | if (obj.infoHash) { 249 | xts.add(`urn:btih:${obj.infoHash}`); 250 | } 251 | 252 | if (obj.infoHashV2IntArray) { 253 | xts.add((obj.xt = `urn:btmh:1220${uint8ArrayToHex(obj.infoHashV2IntArray)}`)); 254 | } 255 | 256 | if (obj.infoHashV2) { 257 | xts.add(`urn:btmh:1220${obj.infoHashV2}`); 258 | } 259 | 260 | const xtsDeduped = Array.from(xts); 261 | if (xtsDeduped.length === 1) { 262 | obj.xt = xtsDeduped[0]; 263 | } 264 | 265 | if (xtsDeduped.length > 1) { 266 | obj.xt = xtsDeduped; 267 | } 268 | 269 | // Support using convenience names, in addition to spec names 270 | // (example: `infoHash` for `xt`, `name` for `dn`) 271 | if (obj.infoHash) { 272 | obj.xt = `urn:btih:${obj.infoHash as string}`; 273 | } 274 | 275 | if (obj.publicKeyIntArray) { 276 | obj.xs = `urn:btpk:${uint8ArrayToHex(obj.publicKeyIntArray)}`; 277 | } 278 | 279 | if (obj.publicKey) { 280 | obj.xs = `urn:btpk:${obj.publicKey}`; 281 | } 282 | 283 | if (obj.name) { 284 | obj.dn = obj.name; 285 | } 286 | 287 | if (obj.keywords) { 288 | obj.kt = obj.keywords; 289 | } 290 | 291 | if (obj.announce) { 292 | obj.tr = obj.announce; 293 | } 294 | 295 | if (obj.urlList) { 296 | obj.ws = obj.urlList; 297 | delete obj.as; 298 | } 299 | 300 | if (obj.peerAddresses) { 301 | obj['x.pe'] = obj.peerAddresses; 302 | } 303 | 304 | return Object.keys(obj) 305 | .filter(key => key.length === 2 || key === 'x.pe') 306 | .reduce((prev, key, i) => { 307 | let acc = prev; 308 | 309 | const values = Array.isArray(obj[key]) ? obj[key] : [obj[key]]; 310 | values.forEach((val: string, j: number) => { 311 | if ((i > 0 || j > 0) && ((key !== 'kt' && key !== 'so') || j === 0)) { 312 | acc += '&'; 313 | } 314 | 315 | if (key === 'dn') { 316 | val = encodeURIComponent(val).replace(/%20/g, '+'); 317 | } 318 | 319 | if (key === 'tr' || key === 'as' || key === 'ws') { 320 | val = encodeURIComponent(val); 321 | } 322 | 323 | // Don't URI encode BEP46 keys 324 | if (key === 'xs' && !val.startsWith('urn:btpk:')) { 325 | val = encodeURIComponent(val); 326 | } 327 | 328 | if (key === 'kt') { 329 | val = encodeURIComponent(val); 330 | } 331 | 332 | if (key === 'so') { 333 | return; 334 | } 335 | 336 | if (key === 'kt' && j > 0) { 337 | acc += `+${val}`; 338 | } else { 339 | acc += `${key}=${val}`; 340 | } 341 | }); 342 | if (key === 'so') { 343 | acc += `${key}=${bep53Range.composeRange(values)}`; 344 | } 345 | 346 | return acc; 347 | }, `${start}`); 348 | } 349 | -------------------------------------------------------------------------------- /test/bep53.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from 'vitest'; 2 | 3 | import { composeRange, parseRange } from '../src/bep53.js'; 4 | 5 | test('parse: a number', () => { 6 | const range = parseRange(['1']); 7 | 8 | expect(range).toEqual([1]); 9 | }); 10 | 11 | test('parse: one range', () => { 12 | const range = parseRange(['1-3']); 13 | 14 | expect(range).toEqual([1, 2, 3]); 15 | }); 16 | 17 | test('parse: multiple ranges', () => { 18 | const range = parseRange(['1-3', '11-13']); 19 | 20 | expect(range).toEqual([1, 2, 3, 11, 12, 13]); 21 | }); 22 | 23 | test('parse: multiple ranges between a number', () => { 24 | const range = parseRange(['1-3', '6', '11-13']); 25 | 26 | expect(range).toEqual([1, 2, 3, 6, 11, 12, 13]); 27 | }); 28 | 29 | test('compose: a number', () => { 30 | const range = composeRange([1]); 31 | 32 | expect(range).toEqual(['1']); 33 | }); 34 | 35 | test('compose: one range', () => { 36 | const range = composeRange([1, 2, 3]); 37 | 38 | expect(range).toEqual(['1-3']); 39 | }); 40 | 41 | test('compose: multiple ranges', () => { 42 | const range = composeRange([1, 2, 3, 11, 12, 13]); 43 | 44 | expect(range).toEqual(['1-3', '11-13']); 45 | }); 46 | 47 | test('compose: multiple ranges between a number', () => { 48 | const range = composeRange([1, 2, 3, 6, 11, 12, 13]); 49 | 50 | expect(range).toEqual(['1-3', '6', '11-13']); 51 | }); 52 | -------------------------------------------------------------------------------- /test/decode.spec.ts: -------------------------------------------------------------------------------- 1 | import { hexToUint8Array } from 'uint8array-extras'; 2 | import { expect, test } from 'vitest'; 3 | 4 | import { MagnetData, magnetDecode } from '../src/index.js'; 5 | 6 | const leavesOfGrass = 7 | 'magnet:?xt=urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36&dn=Leaves+of+Grass+by+Walt+Whitman.epub&tr=udp%3A%2F%2Ftracker.example4.com%3A80&tr=udp%3A%2F%2Ftracker.example5.com%3A80&tr=udp%3A%2F%2Ftracker.example3.com%3A6969&tr=udp%3A%2F%2Ftracker.example2.com%3A80&tr=udp%3A%2F%2Ftracker.example1.com%3A1337'; 8 | 9 | const empty: ReturnType = { announce: [], peerAddresses: [], urlList: [] }; 10 | 11 | test('should decode', () => { 12 | const result: MagnetData = { 13 | announce: [ 14 | 'udp://tracker.example1.com:1337', 15 | 'udp://tracker.example2.com:80', 16 | 'udp://tracker.example3.com:6969', 17 | 'udp://tracker.example4.com:80', 18 | 'udp://tracker.example5.com:80', 19 | ], 20 | dn: 'Leaves of Grass by Walt Whitman.epub', 21 | infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 22 | infoHashIntArray: hexToUint8Array('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36'), 23 | name: 'Leaves of Grass by Walt Whitman.epub', 24 | peerAddresses: [], 25 | tr: [ 26 | 'udp://tracker.example4.com:80', 27 | 'udp://tracker.example5.com:80', 28 | 'udp://tracker.example3.com:6969', 29 | 'udp://tracker.example2.com:80', 30 | 'udp://tracker.example1.com:1337', 31 | ], 32 | urlList: [], 33 | xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 34 | }; 35 | expect(magnetDecode(leavesOfGrass)).toEqual(result); 36 | }); 37 | 38 | test('should decode empty magnet URIs return empty object', () => { 39 | const empty1 = ''; 40 | const empty2 = 'magnet:'; 41 | const empty3 = 'magnet:?'; 42 | 43 | expect(magnetDecode(empty1)).toEqual(empty); 44 | expect(magnetDecode(empty2)).toEqual(empty); 45 | expect(magnetDecode(empty3)).toEqual(empty); 46 | }); 47 | 48 | test('empty string as keys is okay', () => { 49 | const uri = 'magnet:?a=&b=&c='; 50 | const blank = { a: '', b: '', c: '' }; 51 | expect(magnetDecode(uri)).toEqual({ ...blank, ...empty }); 52 | }); 53 | 54 | test('should decode invalid magnet URIs return empty object', () => { 55 | const invalid1 = 'magnet:?xt=urn:btih:==='; 56 | const invalid2 = 'magnet:?xt'; 57 | const invalid3 = 'magnet:?xt=?dn='; 58 | 59 | expect(magnetDecode(invalid1)).toEqual(empty); 60 | expect(magnetDecode(invalid2)).toEqual(empty); 61 | expect(magnetDecode(invalid3)).toEqual(empty); 62 | }); 63 | 64 | test('should decode invalid magnet URIs return only valid keys (ignoring invalid ones)', () => { 65 | const invalid1 = 'magnet:?a=a&==='; 66 | const invalid2 = 'magnet:?a==&b=b'; 67 | const invalid3 = 'magnet:?a=b=&c=c&d==='; 68 | 69 | expect(magnetDecode(invalid1)).toEqual({ a: 'a', ...empty }); 70 | expect(magnetDecode(invalid2)).toEqual({ b: 'b', ...empty }); 71 | expect(magnetDecode(invalid3)).toEqual({ c: 'c', ...empty }); 72 | }); 73 | 74 | test('should decode extracts 40-char hex BitTorrent info_hash', () => { 75 | const result = magnetDecode('magnet:?xt=urn:btih:aad050ee1bb22e196939547b134535824dabf0ce'); 76 | expect(result.infoHash).toBe('aad050ee1bb22e196939547b134535824dabf0ce'); 77 | }); 78 | 79 | test('should decode extracts 32-char base32 BitTorrent info_hash', () => { 80 | const result = magnetDecode('magnet:?xt=urn:btih:64DZYZWMUAVLIWJUXGDIK4QGAAIN7SL6'); 81 | expect(result.infoHash).toBe('f7079c66cca02ab45934b9868572060010dfc97e'); 82 | }); 83 | 84 | test('should decode extracts keywords', () => { 85 | const result = magnetDecode( 86 | 'magnet:?xt=urn:btih:64DZYZWMUAVLIWJUXGDIK4QGAAIN7SL6&kt=joe+blow+mp3', 87 | ); 88 | expect(result.keywords).toEqual(['joe', 'blow', 'mp3']); 89 | }); 90 | 91 | test('should decode complicated magnet uri (multiple xt params, and as, xs)', () => { 92 | const result = magnetDecode( 93 | 'magnet:?xt=urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1&xt=urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY&xt=urn:btih:QHQXPYWMACKDWKP47RRVIV7VOURXFE5Q&xl=10826029&dn=mediawiki-1.15.1.tar.gz&tr=udp%3A%2F%2Ftracker.example4.com%3A80%2Fannounce&as=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz&xs=http%3A%2F%2Fcache.example.org%2FXRX2PEFXOOEJFRVUCX6HMZMKS5TWG4K5&xs=dchub://example.org', 94 | ); 95 | expect(result.infoHash).toBe('81e177e2cc00943b29fcfc635457f575237293b0'); 96 | expect(result.xt).toEqual([ 97 | 'urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1', 98 | 'urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY', 99 | 'urn:btih:QHQXPYWMACKDWKP47RRVIV7VOURXFE5Q', 100 | ]); 101 | expect(result.xl).toBe('10826029'); 102 | expect(result.dn).toBe('mediawiki-1.15.1.tar.gz'); 103 | 104 | const announce = 'udp://tracker.example4.com:80/announce'; 105 | expect(result.tr).toBe(announce); 106 | expect(result.announce).toEqual([announce]); 107 | expect(result.as).toBe('http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz'); 108 | expect(result.urlList).toEqual([ 109 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz', 110 | ]); 111 | expect(result.xs).toEqual([ 112 | 'http://cache.example.org/XRX2PEFXOOEJFRVUCX6HMZMKS5TWG4K5', 113 | 'dchub://example.org', 114 | ]); 115 | }); 116 | 117 | test('should decode multiple as, ws params', () => { 118 | const result = magnetDecode( 119 | 'magnet:?xt=urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1&as=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz&as=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz1&ws=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz2&ws=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz3', 120 | ); 121 | expect(result.urlList).toEqual([ 122 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz', 123 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz1', 124 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz2', 125 | 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz3', 126 | ]); 127 | }); 128 | 129 | test('should decode dedupe repeated trackers', () => { 130 | const result = magnetDecode( 131 | 'magnet:?xt=urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1&tr=udp%3A%2F%2Ftracker.example4.com%3A80&tr=udp%3A%2F%2Ftracker.example4.com%3A80&tr=udp%3A%2F%2Ftracker.example5.com%3A80&tr=udp%3A%2F%2Ftracker.example3.com%3A6969&tr=udp%3A%2F%2Ftracker.example2.com%3A80&tr=udp%3A%2F%2Ftracker.example1.com%3A1337', 132 | ); 133 | const announce = [ 134 | 'udp://tracker.example1.com:1337', 135 | 'udp://tracker.example2.com:80', 136 | 'udp://tracker.example3.com:6969', 137 | 'udp://tracker.example4.com:80', 138 | 'udp://tracker.example5.com:80', 139 | ]; 140 | expect(result.announce).toEqual(announce); 141 | }); 142 | 143 | test('Cast file index (ix) to a number', () => { 144 | const result = magnetDecode(`${leavesOfGrass}&ix=1`); 145 | expect(typeof result.ix).toBe('number'); 146 | expect(result.ix).toBe(1); 147 | }); 148 | 149 | test('should decode bittorrent v2 magnet links', () => { 150 | const result = magnetDecode( 151 | 'magnet:?xt=urn:btmh:1220caf1e1c30e81cb361b9ee167c4aa64228a7fa4fa9f6105232b28ad099f3a302e&dn=bittorrent-v2-test', 152 | ); 153 | expect(result.xt).toBe( 154 | 'urn:btmh:1220caf1e1c30e81cb361b9ee167c4aa64228a7fa4fa9f6105232b28ad099f3a302e', 155 | ); 156 | }); 157 | 158 | test('should decode hybrid bittorent v2 magnet links', () => { 159 | // https://blog.libtorrent.org/2020/09/bittorrent-v2/ 160 | const result = magnetDecode( 161 | 'magnet:?xt=urn:btih:631a31dd0a46257d5078c0dee4e66e26f73e42ac&xt=urn:btmh:1220d8dd32ac93357c368556af3ac1d95c9d76bd0dff6fa9833ecdac3d53134efabb&dn=bittorrent-v1-v2-hybrid-test', 162 | ); 163 | expect(result.xt).toEqual([ 164 | 'urn:btih:631a31dd0a46257d5078c0dee4e66e26f73e42ac', 165 | 'urn:btmh:1220d8dd32ac93357c368556af3ac1d95c9d76bd0dff6fa9833ecdac3d53134efabb', 166 | ]); 167 | expect(result.dn).toBe('bittorrent-v1-v2-hybrid-test'); 168 | }); 169 | 170 | test('decode: Extracts public key from xs', () => { 171 | const key = '9a36edf0988ddc1a0fc02d4e8652cce87a71aaac71fce936e650a597c0fb72e0'; 172 | const result = magnetDecode(`magnet:?xs=urn:btpk:${key}`); 173 | expect(result.publicKey).toBe(key); 174 | expect(result.publicKeyIntArray).toEqual(hexToUint8Array(key)); 175 | }); 176 | 177 | // Select specific file indices for download (BEP53) http://www.bittorrent.org/beps/bep_0053.html 178 | test('decode: select-only', () => { 179 | const result = magnetDecode('magnet:?xt=urn:btih:64DZYZWMUAVLIWJUXGDIK4QGAAIN7SL6&so=0,2,4,6-8'); 180 | expect(result.so).toEqual([0, 2, 4, 6, 7, 8]); 181 | }); 182 | 183 | // Peer address expressed as hostname:port (BEP09) http://bittorrent.org/beps/bep_0009.html 184 | test('decode: peer-address single value', () => { 185 | const result = magnetDecode( 186 | 'magnet:?xt=urn:btih:64DZYZWMUAVLIWJUXGDIK4QGAAIN7SL6&x.pe=123.213.32.10:47450', 187 | ); 188 | const peerAddresses = ['123.213.32.10:47450']; 189 | expect(result['x.pe'], peerAddresses[0]); 190 | expect(result.peerAddresses).toEqual(peerAddresses); 191 | }); 192 | 193 | test('decode: peer-address multiple values', () => { 194 | const result = magnetDecode( 195 | 'magnet:?xt=urn:btih:64DZYZWMUAVLIWJUXGDIK4QGAAIN7SL6&x.pe=123.213.32.10:47450&x.pe=[2001:db8::2]:55013', 196 | ); 197 | const peerAddresses = ['123.213.32.10:47450', '[2001:db8::2]:55013']; 198 | expect(result['x.pe']).toEqual(peerAddresses); 199 | expect(result.peerAddresses).toEqual(peerAddresses); 200 | }); 201 | 202 | test('decode: peer-address remove duplicates', () => { 203 | const result = magnetDecode( 204 | 'magnet:?xt=urn:btih:64DZYZWMUAVLIWJUXGDIK4QGAAIN7SL6&x.pe=123.213.32.10:47450&x.pe=[2001:db8::2]:55013&x.pe=123.213.32.10:47450', 205 | ); 206 | 207 | // raw value is *not* deduped 208 | expect(result['x.pe']).toEqual([ 209 | '123.213.32.10:47450', 210 | '[2001:db8::2]:55013', 211 | '123.213.32.10:47450', 212 | ]); 213 | 214 | // friendly value is deduped 215 | expect(result.peerAddresses).toEqual(['123.213.32.10:47450', '[2001:db8::2]:55013']); 216 | }); 217 | -------------------------------------------------------------------------------- /test/encode.spec.ts: -------------------------------------------------------------------------------- 1 | import { hexToUint8Array } from 'uint8array-extras'; 2 | import { expect, test } from 'vitest'; 3 | 4 | import { MagnetData, magnetDecode, magnetEncode } from '../src/index.js'; 5 | 6 | test('should encode', () => { 7 | expect( 8 | magnetEncode({ 9 | xt: [ 10 | 'urn:btmh:1220caf1e1c30e81cb361b9ee167c4aa64228a7fa4fa9f6105232b28ad099f3a302e', 11 | 'urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1', 12 | 'urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY', 13 | 'urn:btih:QHQXPYWMACKDWKP47RRVIV7VOURXFE5Q', 14 | ], 15 | xl: '10826029', 16 | dn: 'mediawiki-1.15.1.tar.gz', 17 | tr: ['udp://tracker.example4.com:80/announce'], 18 | as: 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz', 19 | xs: ['http://cache.example.org/XRX2PEFXOOEJFRVUCX6HMZMKS5TWG4K5', 'dchub://example.org'], 20 | }), 21 | ).toBe( 22 | 'magnet:?xt=urn:btmh:1220caf1e1c30e81cb361b9ee167c4aa64228a7fa4fa9f6105232b28ad099f3a302e&xt=urn:ed2k:354B15E68FB8F36D7CD88FF94116CDC1&xt=urn:tree:tiger:7N5OAMRNGMSSEUE3ORHOKWN4WWIQ5X4EBOOTLJY&xt=urn:btih:QHQXPYWMACKDWKP47RRVIV7VOURXFE5Q&xl=10826029&dn=mediawiki-1.15.1.tar.gz&tr=udp%3A%2F%2Ftracker.example4.com%3A80%2Fannounce&as=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz&xs=http%3A%2F%2Fcache.example.org%2FXRX2PEFXOOEJFRVUCX6HMZMKS5TWG4K5&xs=dchub%3A%2F%2Fexample.org', 23 | ); 24 | }); 25 | 26 | test('should encode simple magnet uri using convenience names', () => { 27 | const obj: MagnetData = { 28 | xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 29 | dn: 'Leaves of Grass by Walt Whitman.epub', 30 | name: 'Leaves of Grass by Walt Whitman.epub', 31 | peerAddresses: [], 32 | infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 33 | infoHashIntArray: hexToUint8Array('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36'), 34 | tr: [ 35 | 'udp://tracker.example1.com:1337', 36 | 'udp://tracker.example2.com:80', 37 | 'udp://tracker.example3.com:6969', 38 | 'udp://tracker.example4.com:80', 39 | 'udp://tracker.example5.com:80', 40 | ], 41 | announce: [ 42 | 'udp://tracker.example1.com:1337', 43 | 'udp://tracker.example2.com:80', 44 | 'udp://tracker.example3.com:6969', 45 | 'udp://tracker.example4.com:80', 46 | 'udp://tracker.example5.com:80', 47 | ], 48 | urlList: ['http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz'], 49 | ws: 'http://download.wikimedia.org/mediawiki/1.15/mediawiki-1.15.1.tar.gz', 50 | kt: ['hey', 'hey2'], 51 | keywords: ['hey', 'hey2'], 52 | }; 53 | 54 | const result = magnetEncode(obj); 55 | 56 | expect(result).toBe( 57 | 'magnet:?xt=urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36&dn=Leaves+of+Grass+by+Walt+Whitman.epub&tr=udp%3A%2F%2Ftracker.example1.com%3A1337&tr=udp%3A%2F%2Ftracker.example2.com%3A80&tr=udp%3A%2F%2Ftracker.example3.com%3A6969&tr=udp%3A%2F%2Ftracker.example4.com%3A80&tr=udp%3A%2F%2Ftracker.example5.com%3A80&ws=http%3A%2F%2Fdownload.wikimedia.org%2Fmediawiki%2F1.15%2Fmediawiki-1.15.1.tar.gz&kt=hey+hey2', 58 | ); 59 | 60 | expect(magnetDecode(result)).toEqual(obj); 61 | }); 62 | 63 | // Peer address expressed as hostname:port (BEP09) http://bittorrent.org/beps/bep_0009.html 64 | test('encode: peer-address single value', () => { 65 | const obj = { 66 | xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 67 | 'x.pe': '123.213.32.10:47450', 68 | }; 69 | const result = magnetEncode(obj); 70 | expect(result).toEqual( 71 | 'magnet:?xt=urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36&x.pe=123.213.32.10:47450', 72 | ); 73 | expect(magnetDecode(result)).toEqual({ 74 | xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 75 | 'x.pe': '123.213.32.10:47450', 76 | infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 77 | infoHashIntArray: hexToUint8Array('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36'), 78 | urlList: [], 79 | announce: [], 80 | peerAddresses: ['123.213.32.10:47450'], 81 | }); 82 | }); 83 | 84 | test('encode: peer-address multiple values', () => { 85 | const obj = { 86 | xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 87 | 'x.pe': ['123.213.32.10:47450', '[2001:db8::2]:55013'], 88 | }; 89 | const result = magnetEncode(obj); 90 | expect(result).toBe( 91 | 'magnet:?xt=urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36&x.pe=123.213.32.10:47450&x.pe=[2001:db8::2]:55013', 92 | ); 93 | expect(magnetDecode(result)).toEqual({ 94 | xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 95 | 'x.pe': ['123.213.32.10:47450', '[2001:db8::2]:55013'], 96 | infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 97 | infoHashIntArray: hexToUint8Array('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36'), 98 | urlList: [], 99 | announce: [], 100 | peerAddresses: ['123.213.32.10:47450', '[2001:db8::2]:55013'], 101 | }); 102 | }); 103 | 104 | // Select specific file indices for download (BEP53) http://www.bittorrent.org/beps/bep_0053.html 105 | test('encode: select-only', () => { 106 | const obj = { 107 | xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 108 | so: [0, 2, 4, 6, 7, 8], 109 | }; 110 | const result = magnetEncode(obj); 111 | expect(result).toBe('magnet:?xt=urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36&so=0,2,4,6-8'); 112 | expect(magnetDecode(result)).toEqual({ 113 | xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 114 | infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 115 | infoHashIntArray: hexToUint8Array('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36'), 116 | peerAddresses: [], 117 | urlList: [], 118 | announce: [], 119 | so: [0, 2, 4, 6, 7, 8], 120 | }); 121 | }); 122 | 123 | test('encode: using infoHashV2IntArray', () => { 124 | const obj = { 125 | infoHashV2IntArray: hexToUint8Array( 126 | 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 127 | ), 128 | }; 129 | const result = magnetEncode(obj); 130 | expect(result).toBe( 131 | 'magnet:?xt=urn:btmh:1220d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 132 | ); 133 | expect(magnetDecode(result)).toEqual({ 134 | infoHashV2: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 135 | infoHashV2IntArray: hexToUint8Array( 136 | 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 137 | ), 138 | xt: 'urn:btmh:1220d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 139 | urlList: [], 140 | announce: [], 141 | peerAddresses: [], 142 | }); 143 | }); 144 | 145 | test('encode: using publicKey', () => { 146 | const publicKey = '9a36edf0988ddc1a0fc02d4e8652cce87a71aaac71fce936e650a597c0fb72e0'; 147 | const obj = { 148 | publicKey, 149 | }; 150 | const result = magnetEncode(obj); 151 | expect(result).toBe( 152 | 'magnet:?xs=urn:btpk:9a36edf0988ddc1a0fc02d4e8652cce87a71aaac71fce936e650a597c0fb72e0', 153 | ); 154 | }); 155 | 156 | test('encode: using publicKeyIntArray', () => { 157 | const publicKeyIntArray = hexToUint8Array( 158 | '9a36edf0988ddc1a0fc02d4e8652cce87a71aaac71fce936e650a597c0fb72e0', 159 | ); 160 | const obj = { 161 | publicKeyIntArray, 162 | }; 163 | const result = magnetEncode(obj); 164 | expect(result).toBe( 165 | 'magnet:?xs=urn:btpk:9a36edf0988ddc1a0fc02d4e8652cce87a71aaac71fce936e650a597c0fb72e0', 166 | ); 167 | }); 168 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@sindresorhus/tsconfig", 3 | "compilerOptions": { 4 | "lib": ["ES2020", "DOM"], 5 | "outDir": "dist", 6 | "noUncheckedIndexedAccess": false, 7 | "noImplicitReturns": false 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "github": { 3 | "silent": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config'; 2 | 3 | export default defineConfig({ 4 | test: { 5 | coverage: { 6 | reporter: ['text', 'json', 'html'], 7 | provider: 'v8', 8 | }, 9 | }, 10 | }); 11 | --------------------------------------------------------------------------------