├── .nvmrc ├── .npmrc ├── .gitignore ├── assets └── cover.png ├── .github ├── dependabot.yml └── workflows │ ├── release.yml │ └── ci.yml ├── biome.json ├── register.d.ts ├── register.js ├── index.js ├── LICENSE ├── test ├── global.test.js └── index.test.js ├── package.json ├── tsconfig.json ├── index.d.ts ├── README.md └── pnpm-lock.yaml /.nvmrc: -------------------------------------------------------------------------------- 1 | v20.12.1 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | shell-emulator=true -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | dist -------------------------------------------------------------------------------- /assets/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arthurfiorette/tuple-it/HEAD/assets/cover.png -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: './' 5 | schedule: 6 | interval: 'weekly' 7 | 8 | - package-ecosystem: 'github-actions' 9 | directory: './' 10 | schedule: 11 | interval: 'monthly' 12 | -------------------------------------------------------------------------------- /biome.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json", 3 | "organizeImports": { 4 | "enabled": true 5 | }, 6 | "formatter": { 7 | "enabled": true, 8 | "indentStyle": "space" 9 | }, 10 | "linter": { 11 | "enabled": true, 12 | "rules": { 13 | "recommended": true 14 | } 15 | }, 16 | "javascript": { 17 | "formatter": { 18 | "quoteStyle": "single", 19 | "trailingComma": "none", 20 | "semicolons": "asNeeded" 21 | } 22 | }, 23 | "files": { 24 | "ignore": ["dist/**", "node_modules/**", "coverage/**"] 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /register.d.ts: -------------------------------------------------------------------------------- 1 | import type { TupleResult } from './index' 2 | 3 | declare global { 4 | interface Promise { 5 | /** 6 | * Transforms the promise into a tuple containing the result of the promise. 7 | * 8 | * @example 9 | * 10 | * ```ts 11 | * const [error, result] = await promise.tuple(); 12 | * const [error, result] = await myAsyncFn().tuple(); 13 | * const [error, result] = await Promise.all(promises).tuple(); 14 | * const [error, result] = await Promise.race(promises).tuple(); 15 | * ``` 16 | */ 17 | tuple(this: this): Promise> 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /register.js: -------------------------------------------------------------------------------- 1 | const { TupleItError } = require('./index.js') 2 | 3 | /** @param {unknown} value */ 4 | function tupleResolve(value) { 5 | return [null, value] 6 | } 7 | 8 | /** @param {unknown} error */ 9 | function tupleReject(error) { 10 | if (error instanceof Error) { 11 | return [error] 12 | } 13 | 14 | return [new TupleItError(error)] 15 | } 16 | 17 | /** @this {Promise} */ 18 | function tuple() { 19 | return this.then(tupleResolve, tupleReject) 20 | } 21 | 22 | Object.defineProperty(Promise.prototype, 'tuple', { 23 | // Prevents the property from being listed by Object.getOwnPropertyNames 24 | enumerable: false, 25 | value: tuple 26 | }) 27 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /** @param {unknown} maybePromise */ 2 | async function tuple(maybePromise) { 3 | try { 4 | // await because then is not present on non-Promise objects 5 | return [null, await maybePromise] 6 | } catch (error) { 7 | // Wrapping into TupleItError avoids the need to check 8 | // `if (error !== undefined)` in favor of a simpler `if (error)` 9 | if (error instanceof Error) { 10 | return [error] 11 | } 12 | 13 | return [new TupleItError(error)] 14 | } 15 | } 16 | 17 | class TupleItError extends Error { 18 | error 19 | 20 | constructor(error) { 21 | super('Promise rejected with a non instance of Error') 22 | this.error = error 23 | } 24 | } 25 | 26 | exports.tuple = tuple 27 | exports.t = tuple 28 | exports.TupleItError = TupleItError 29 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Publish to NPM 2 | 3 | on: 4 | release: 5 | types: [published] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | 16 | - name: Setup pnpm 17 | uses: pnpm/action-setup@v3 18 | 19 | - name: Setup node and restore cached dependencies 20 | uses: actions/setup-node@v4 21 | with: 22 | cache: 'pnpm' 23 | node-version-file: '.nvmrc' 24 | registry-url: 'https://registry.npmjs.org/' 25 | 26 | - name: Install packages 27 | run: pnpm install --frozen-lockfile 28 | 29 | - name: Test 30 | run: pnpm test 31 | 32 | - name: Publish to NPM 33 | run: pnpm publish --access public --no-git-checks 34 | env: 35 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 36 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI Flow 2 | 3 | on: 4 | push: 5 | pull_request: 6 | # Allows you to run this workflow manually from the Actions tab 7 | workflow_dispatch: 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | name: CI flow 13 | 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | 18 | - name: Setup pnpm 19 | uses: pnpm/action-setup@v3 20 | 21 | - name: Setup node and restore cached dependencies 22 | uses: actions/setup-node@v4 23 | with: 24 | cache: 'pnpm' 25 | node-version-file: '.nvmrc' 26 | 27 | - name: Install packages 28 | run: pnpm install --frozen-lockfile 29 | 30 | - name: Test 31 | run: pnpm test 32 | 33 | - name: Publish to Codecov 34 | uses: codecov/codecov-action@v4 35 | with: 36 | # Codecov backend may be unstable 37 | fail_ci_if_error: false 38 | token: ${{ secrets.CODECOV_TOKEN }} -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Arthur Fiorette 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 | -------------------------------------------------------------------------------- /test/global.test.js: -------------------------------------------------------------------------------- 1 | require('../register') 2 | 3 | const { describe, it } = require('node:test') 4 | const assert = require('node:assert') 5 | const { TupleItError } = require('../index') 6 | 7 | describe('Global prototype', async () => { 8 | it('should return a value when resolved', async () => { 9 | const testInput = 41 10 | const promise = Promise.resolve(testInput) 11 | 12 | const [err, data] = await promise.tuple() 13 | 14 | assert.strictEqual(err, null) 15 | assert.strictEqual(data, testInput) 16 | }) 17 | 18 | it('should return an error when promise is rejected', async () => { 19 | const testErr = new Error('Test') 20 | const promise = Promise.reject(testErr) 21 | 22 | const [err, data] = await promise.tuple() 23 | 24 | assert.strictEqual(err, testErr) 25 | assert.strictEqual(data, undefined) 26 | }) 27 | 28 | it('wraps non instances of Error into a TupleItError', async () => { 29 | const testErr = 'Test' 30 | const promise = Promise.reject(testErr) 31 | 32 | const [err, data] = await promise.tuple() 33 | 34 | assert.strictEqual(err instanceof TupleItError, true) 35 | //@ts-expect-error - this is a test 36 | assert.strictEqual(err.error, testErr) 37 | assert.strictEqual(data, undefined) 38 | }) 39 | }) 40 | -------------------------------------------------------------------------------- /test/index.test.js: -------------------------------------------------------------------------------- 1 | const { describe, it } = require('node:test') 2 | const assert = require('node:assert') 3 | const { tuple, t, TupleItError } = require('../index') 4 | 5 | describe('Exported functions', async () => { 6 | it('should return a value when resolved', async () => { 7 | const testInput = 41 8 | const promise = Promise.resolve(testInput) 9 | 10 | const [err, data] = await tuple(promise) 11 | 12 | assert.strictEqual(err, null) 13 | assert.strictEqual(data, testInput) 14 | }) 15 | 16 | it('should return an error when promise is rejected', async () => { 17 | const testErr = new Error('Test') 18 | const promise = Promise.reject(testErr) 19 | 20 | const [err, data] = await tuple(promise) 21 | 22 | assert.strictEqual(err, testErr) 23 | assert.strictEqual(data, undefined) 24 | }) 25 | 26 | it('wraps non instances of Error into a TupleItError', async () => { 27 | const testErr = 'Test' 28 | const promise = Promise.reject(testErr) 29 | 30 | const [err, data] = await tuple(promise) 31 | 32 | assert.strictEqual(err instanceof TupleItError, true) 33 | //@ts-expect-error - this is a test 34 | assert.strictEqual(err.error, testErr) 35 | assert.strictEqual(data, undefined) 36 | }) 37 | 38 | it('exports t and tuple', async () => { 39 | assert.strictEqual(t, tuple) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tuple-it", 3 | "version": "1.1.0", 4 | "description": "A simple Promise to [error, data] catcher.", 5 | "keywords": [ 6 | "tuple", 7 | "it", 8 | "await", 9 | "to", 10 | "js", 11 | "error", 12 | "typescript", 13 | "promise", 14 | "async" 15 | ], 16 | "homepage": "https://github.com/arthurfiorette/tuple-it#readme", 17 | "bugs": { 18 | "url": "https://github.com/arthurfiorette/tuple-it/issues" 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/arthurfiorette/tuple-it.git" 23 | }, 24 | "license": "MIT", 25 | "author": "Arthur Fiorette ", 26 | "sideEffects": ["register.js"], 27 | "type": "commonjs", 28 | "main": "index.js", 29 | "types": "index.d.ts", 30 | "files": ["index.js", "index.d.ts", "register.d.ts", "register.js"], 31 | "scripts": { 32 | "format": "biome format --write .", 33 | "lint": "biome check .", 34 | "lint:ci": "biome ci .", 35 | "lint:fix": "biome check --apply-unsafe .", 36 | "test": "c8 --reporter lcov --reporter text node --test test/**/*.test.js && tsc --noEmit" 37 | }, 38 | "devDependencies": { 39 | "@biomejs/biome": "^1.7.3", 40 | "@types/node": "^22.0.0", 41 | "c8": "^9.1.0", 42 | "typescript": "^5.4.5" 43 | }, 44 | "packageManager": "pnpm@9.0.1", 45 | "engines": { 46 | "node": ">=14" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "incremental": true, 4 | "target": "ES2022", 5 | "experimentalDecorators": true, 6 | "emitDecoratorMetadata": true, 7 | "module": "CommonJS", 8 | "moduleResolution": "Node", 9 | "declaration": true, 10 | "outDir": "dist", 11 | "declarationMap": true, 12 | "allowJs": true, 13 | "checkJs": true, 14 | "sourceMap": true, 15 | "importHelpers": true, 16 | "emitBOM": true, 17 | "newLine": "lf", 18 | "noEmit": true, 19 | "stripInternal": true, 20 | "isolatedModules": true, 21 | "allowSyntheticDefaultImports": true, 22 | "esModuleInterop": true, 23 | "forceConsistentCasingInFileNames": true, 24 | "strict": true, 25 | "noImplicitAny": true, 26 | "strictNullChecks": true, 27 | "strictFunctionTypes": true, 28 | "strictBindCallApply": true, 29 | "strictPropertyInitialization": false, 30 | "noImplicitThis": true, 31 | "useUnknownInCatchVariables": true, 32 | "alwaysStrict": true, 33 | "noUnusedLocals": true, 34 | "noUnusedParameters": true, 35 | "noImplicitReturns": true, 36 | "noFallthroughCasesInSwitch": true, 37 | "downlevelIteration": false, 38 | "exactOptionalPropertyTypes": false, 39 | "noUncheckedIndexedAccess": true, 40 | "noImplicitOverride": true, 41 | "skipDefaultLibCheck": true, 42 | "skipLibCheck": false, 43 | "preserveWatchOutput": true 44 | }, 45 | "include": ["**/*.js", "**/*.d.ts"], 46 | "exclude": ["node_modules", "dist", "coverage"] 47 | } 48 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * TupleResult represents the result of a promise as a tuple. 3 | * 4 | * - If the promise is rejected, the tuple will contain an Error object. 5 | * - If the promise is resolved, the tuple will contain null as the first element and the result as the second element. 6 | */ 7 | export type TupleResult = [E] | [null, T] 8 | 9 | /** 10 | * Returns a promise that resolves to a tuple containing the result of the promise. 11 | * 12 | * @example 13 | * ```ts 14 | * const [error, result] = await t(promise); 15 | * ``` 16 | */ 17 | export declare function tuple( 18 | promise: Promise 19 | ): Promise> 20 | 21 | /** 22 | * Returns a promise that resolves to a tuple containing the result of the promise. 23 | * 24 | * @example 25 | * ```ts 26 | * const [error, result] = await t(promise); 27 | * ``` 28 | */ 29 | export declare function tuple( 30 | promise: PromiseLike 31 | ): PromiseLike> 32 | 33 | /** 34 | * Helper function for cases where functions may not return a promise. 35 | * 36 | * @example 37 | * 38 | * ```ts 39 | * declare function myAsyncFn(): Promise | number; 40 | * 41 | * // works even if the result is not a promise 42 | * const [error, result] = await t(myAsyncFn()); 43 | * ``` 44 | */ 45 | export declare function tuple( 46 | notPromise: T | PromiseLike 47 | ): TupleResult 48 | 49 | /** 50 | * Transforms a promise into a tuple containing the result of the promise. 51 | * 52 | * Alias for {@linkcode tuple}. 53 | */ 54 | export declare const t: typeof tuple 55 | 56 | /** Error thrown when a rejected promise is not an instance of {@linkcode Error}. */ 57 | export declare class TupleItError extends Error { 58 | /** The error that caused the promise to be rejected. */ 59 | error: E 60 | 61 | /** Creates a new instance of TupleItError. */ 62 | constructor(error: E) 63 | } 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [!CAUTION] 2 | > This package was deprecated in favor of [`npm install try`](https://github.com/arthurfiorette/try) 3 | 4 |
5 | License 6 | Bundlephobia 7 | Codecov 8 | Downloads 9 | Bundlephobia 10 | Last commit 11 | Stars 12 |
13 | 14 |
15 |
16 | 17 | 18 | 19 |
20 |
21 | 22 |

23 | Tuple it! 24 |

25 | 26 |

27 | A simple Promise to [error, data] catcher. 28 |

29 | 30 |
31 |
32 | 33 | - [Introduction](#introduction) 34 | - [How to Use](#how-to-use) 35 | - [Avoiding Global Scope Pollution](#avoiding-global-scope-pollution) 36 | - [The `TupleItError` Class](#the-tupleiterror-class) 37 | - [Promisable Objects](#promisable-objects) 38 | - [Typescript Support](#typescript-support) 39 | - [License](#license) 40 | - [Credits](#credits) 41 | 42 |
43 | 44 | ## Introduction 45 | 46 | **TupleIt** is a handy utility designed to simplify error handling with `async`/`await` operations in JavaScript. 47 | 48 | It wraps the `await` statement in a `[error, data]` tuple, allowing you to easily discern whether a promise was rejected or resolved without resorting to nested `try`/`catch` blocks. 49 | 50 | This not only enhances code readability but also mitigates one of the most common mistakes in JavaScript development - mishandling promise rejections. 51 | 52 |
53 | 54 | ## How to Use 55 | 56 | > [!CAUTION] 57 | > Extending the `Promise` prototype in a library is considered a horrible practice. 58 | 59 | **TupleIt** provides an import `tuple-it/register` to extend the `Promise` prototype: 60 | 61 | ```typescript 62 | import 'tuple-it/register' 63 | ``` 64 | 65 | Now, you can use the `.tuple()` method on any `Promise` object: 66 | 67 | ```typescript 68 | async function work(promise: Promise) { 69 | const [error, data] = await promise.tuple() 70 | 71 | if (error) { 72 | console.log('Operation failed!') 73 | return false 74 | } 75 | 76 | console.log('Operation succeeded!') 77 | return true 78 | } 79 | ``` 80 | 81 |
82 | 83 | ## Avoiding Global Scope Pollution 84 | 85 | If you're developing a library, it's advised not to pollute the global scope. Instead, you can import the `t` function directly (an alias for `tuple`): 86 | 87 | ```typescript 88 | import { t } from 'tuple-it' 89 | 90 | const [error, data] = await t(someAsyncFunction()) 91 | ``` 92 | 93 |
94 | 95 | ## The `TupleItError` Class 96 | 97 | Occasionally, promises might reject with non-error objects, which is a poor practice but still happens. **TupleIt** will wrap any non-`Error` object into a `TupleItError` object if it's not an instance of `Error`: 98 | 99 | ```typescript 100 | import { TupleItError } from 'tuple-it' 101 | 102 | async function someAsyncFunction() { 103 | throw 'Please avoid throwing strings!' 104 | } 105 | 106 | const [error, data] = await someAsyncFunction().tuple() 107 | 108 | if (error instanceof TupleItError) { 109 | console.error(error.error) // Logs the original object that was thrown. 110 | } 111 | ``` 112 | 113 |
114 | 115 | ## Promisable Objects 116 | 117 | In some cases, functions may return either values or promises for performance optimization. **TupleIt** handles this scenario seamlessly: 118 | 119 | ```typescript 120 | import { t } from 'tuple-it' 121 | 122 | function someFunction() { 123 | if (Math.random() > 0.5) { 124 | return 'Hello, World!' 125 | } else { 126 | return Promise.resolve('Hello, World!') 127 | } 128 | } 129 | 130 | // Works the same way! 131 | const [error, data] = await t(someFunction()) 132 | ``` 133 | 134 |
135 | 136 | ## Typescript Support 137 | 138 | Typescript is fully supported: 139 | 140 | ```ts 141 | import 'tuple-it/register' 142 | import { t } from 'tuple-it' 143 | 144 | // Custom error type (Defaults to Error) 145 | const [customError, data] = await promise.then() 146 | 147 | // Custom data type 148 | const [error, customData] = await t(promise) 149 | 150 | // Custom data and error types 151 | const [customError, customData] = await t(promise) 152 | ``` 153 | 154 |
155 | 156 | ## License 157 | 158 | This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. 159 | 160 |
161 | 162 | ## Credits 163 | 164 | **TupleIt** draws heavy inspiration from [`await-to-js`](https://github.com/scopsy/await-to-js). 165 | 166 |
167 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@biomejs/biome': 12 | specifier: ^1.7.3 13 | version: 1.8.3 14 | '@types/node': 15 | specifier: ^22.0.0 16 | version: 22.0.0 17 | c8: 18 | specifier: ^9.1.0 19 | version: 9.1.0 20 | typescript: 21 | specifier: ^5.4.5 22 | version: 5.5.4 23 | 24 | packages: 25 | 26 | '@bcoe/v8-coverage@0.2.3': 27 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 28 | 29 | '@biomejs/biome@1.8.3': 30 | resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==} 31 | engines: {node: '>=14.21.3'} 32 | hasBin: true 33 | 34 | '@biomejs/cli-darwin-arm64@1.8.3': 35 | resolution: {integrity: sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==} 36 | engines: {node: '>=14.21.3'} 37 | cpu: [arm64] 38 | os: [darwin] 39 | 40 | '@biomejs/cli-darwin-x64@1.8.3': 41 | resolution: {integrity: sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==} 42 | engines: {node: '>=14.21.3'} 43 | cpu: [x64] 44 | os: [darwin] 45 | 46 | '@biomejs/cli-linux-arm64-musl@1.8.3': 47 | resolution: {integrity: sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==} 48 | engines: {node: '>=14.21.3'} 49 | cpu: [arm64] 50 | os: [linux] 51 | 52 | '@biomejs/cli-linux-arm64@1.8.3': 53 | resolution: {integrity: sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==} 54 | engines: {node: '>=14.21.3'} 55 | cpu: [arm64] 56 | os: [linux] 57 | 58 | '@biomejs/cli-linux-x64-musl@1.8.3': 59 | resolution: {integrity: sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==} 60 | engines: {node: '>=14.21.3'} 61 | cpu: [x64] 62 | os: [linux] 63 | 64 | '@biomejs/cli-linux-x64@1.8.3': 65 | resolution: {integrity: sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==} 66 | engines: {node: '>=14.21.3'} 67 | cpu: [x64] 68 | os: [linux] 69 | 70 | '@biomejs/cli-win32-arm64@1.8.3': 71 | resolution: {integrity: sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==} 72 | engines: {node: '>=14.21.3'} 73 | cpu: [arm64] 74 | os: [win32] 75 | 76 | '@biomejs/cli-win32-x64@1.8.3': 77 | resolution: {integrity: sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==} 78 | engines: {node: '>=14.21.3'} 79 | cpu: [x64] 80 | os: [win32] 81 | 82 | '@istanbuljs/schema@0.1.3': 83 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 84 | engines: {node: '>=8'} 85 | 86 | '@jridgewell/resolve-uri@3.1.2': 87 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 88 | engines: {node: '>=6.0.0'} 89 | 90 | '@jridgewell/sourcemap-codec@1.4.15': 91 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 92 | 93 | '@jridgewell/trace-mapping@0.3.25': 94 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 95 | 96 | '@types/istanbul-lib-coverage@2.0.6': 97 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 98 | 99 | '@types/node@22.0.0': 100 | resolution: {integrity: sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw==} 101 | 102 | ansi-regex@5.0.1: 103 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 104 | engines: {node: '>=8'} 105 | 106 | ansi-styles@4.3.0: 107 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 108 | engines: {node: '>=8'} 109 | 110 | balanced-match@1.0.2: 111 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 112 | 113 | brace-expansion@1.1.11: 114 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 115 | 116 | c8@9.1.0: 117 | resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} 118 | engines: {node: '>=14.14.0'} 119 | hasBin: true 120 | 121 | cliui@8.0.1: 122 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 123 | engines: {node: '>=12'} 124 | 125 | color-convert@2.0.1: 126 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 127 | engines: {node: '>=7.0.0'} 128 | 129 | color-name@1.1.4: 130 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 131 | 132 | concat-map@0.0.1: 133 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 134 | 135 | convert-source-map@2.0.0: 136 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 137 | 138 | cross-spawn@7.0.3: 139 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 140 | engines: {node: '>= 8'} 141 | 142 | emoji-regex@8.0.0: 143 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 144 | 145 | escalade@3.1.2: 146 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 147 | engines: {node: '>=6'} 148 | 149 | find-up@5.0.0: 150 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 151 | engines: {node: '>=10'} 152 | 153 | foreground-child@3.1.1: 154 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 155 | engines: {node: '>=14'} 156 | 157 | fs.realpath@1.0.0: 158 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 159 | 160 | get-caller-file@2.0.5: 161 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 162 | engines: {node: 6.* || 8.* || >= 10.*} 163 | 164 | glob@7.2.3: 165 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 166 | deprecated: Glob versions prior to v9 are no longer supported 167 | 168 | has-flag@4.0.0: 169 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 170 | engines: {node: '>=8'} 171 | 172 | html-escaper@2.0.2: 173 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 174 | 175 | inflight@1.0.6: 176 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 177 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 178 | 179 | inherits@2.0.4: 180 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 181 | 182 | is-fullwidth-code-point@3.0.0: 183 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 184 | engines: {node: '>=8'} 185 | 186 | isexe@2.0.0: 187 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 188 | 189 | istanbul-lib-coverage@3.2.2: 190 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 191 | engines: {node: '>=8'} 192 | 193 | istanbul-lib-report@3.0.1: 194 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 195 | engines: {node: '>=10'} 196 | 197 | istanbul-reports@3.1.7: 198 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 199 | engines: {node: '>=8'} 200 | 201 | locate-path@6.0.0: 202 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 203 | engines: {node: '>=10'} 204 | 205 | lru-cache@6.0.0: 206 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 207 | engines: {node: '>=10'} 208 | 209 | make-dir@4.0.0: 210 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 211 | engines: {node: '>=10'} 212 | 213 | minimatch@3.1.2: 214 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 215 | 216 | once@1.4.0: 217 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 218 | 219 | p-limit@3.1.0: 220 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 221 | engines: {node: '>=10'} 222 | 223 | p-locate@5.0.0: 224 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 225 | engines: {node: '>=10'} 226 | 227 | path-exists@4.0.0: 228 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 229 | engines: {node: '>=8'} 230 | 231 | path-is-absolute@1.0.1: 232 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 233 | engines: {node: '>=0.10.0'} 234 | 235 | path-key@3.1.1: 236 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 237 | engines: {node: '>=8'} 238 | 239 | require-directory@2.1.1: 240 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 241 | engines: {node: '>=0.10.0'} 242 | 243 | semver@7.6.0: 244 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 245 | engines: {node: '>=10'} 246 | hasBin: true 247 | 248 | shebang-command@2.0.0: 249 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 250 | engines: {node: '>=8'} 251 | 252 | shebang-regex@3.0.0: 253 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 254 | engines: {node: '>=8'} 255 | 256 | signal-exit@4.1.0: 257 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 258 | engines: {node: '>=14'} 259 | 260 | string-width@4.2.3: 261 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 262 | engines: {node: '>=8'} 263 | 264 | strip-ansi@6.0.1: 265 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 266 | engines: {node: '>=8'} 267 | 268 | supports-color@7.2.0: 269 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 270 | engines: {node: '>=8'} 271 | 272 | test-exclude@6.0.0: 273 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 274 | engines: {node: '>=8'} 275 | 276 | typescript@5.5.4: 277 | resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 278 | engines: {node: '>=14.17'} 279 | hasBin: true 280 | 281 | undici-types@6.11.1: 282 | resolution: {integrity: sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ==} 283 | 284 | v8-to-istanbul@9.2.0: 285 | resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} 286 | engines: {node: '>=10.12.0'} 287 | 288 | which@2.0.2: 289 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 290 | engines: {node: '>= 8'} 291 | hasBin: true 292 | 293 | wrap-ansi@7.0.0: 294 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 295 | engines: {node: '>=10'} 296 | 297 | wrappy@1.0.2: 298 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 299 | 300 | y18n@5.0.8: 301 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 302 | engines: {node: '>=10'} 303 | 304 | yallist@4.0.0: 305 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 306 | 307 | yargs-parser@21.1.1: 308 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 309 | engines: {node: '>=12'} 310 | 311 | yargs@17.7.2: 312 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 313 | engines: {node: '>=12'} 314 | 315 | yocto-queue@0.1.0: 316 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 317 | engines: {node: '>=10'} 318 | 319 | snapshots: 320 | 321 | '@bcoe/v8-coverage@0.2.3': {} 322 | 323 | '@biomejs/biome@1.8.3': 324 | optionalDependencies: 325 | '@biomejs/cli-darwin-arm64': 1.8.3 326 | '@biomejs/cli-darwin-x64': 1.8.3 327 | '@biomejs/cli-linux-arm64': 1.8.3 328 | '@biomejs/cli-linux-arm64-musl': 1.8.3 329 | '@biomejs/cli-linux-x64': 1.8.3 330 | '@biomejs/cli-linux-x64-musl': 1.8.3 331 | '@biomejs/cli-win32-arm64': 1.8.3 332 | '@biomejs/cli-win32-x64': 1.8.3 333 | 334 | '@biomejs/cli-darwin-arm64@1.8.3': 335 | optional: true 336 | 337 | '@biomejs/cli-darwin-x64@1.8.3': 338 | optional: true 339 | 340 | '@biomejs/cli-linux-arm64-musl@1.8.3': 341 | optional: true 342 | 343 | '@biomejs/cli-linux-arm64@1.8.3': 344 | optional: true 345 | 346 | '@biomejs/cli-linux-x64-musl@1.8.3': 347 | optional: true 348 | 349 | '@biomejs/cli-linux-x64@1.8.3': 350 | optional: true 351 | 352 | '@biomejs/cli-win32-arm64@1.8.3': 353 | optional: true 354 | 355 | '@biomejs/cli-win32-x64@1.8.3': 356 | optional: true 357 | 358 | '@istanbuljs/schema@0.1.3': {} 359 | 360 | '@jridgewell/resolve-uri@3.1.2': {} 361 | 362 | '@jridgewell/sourcemap-codec@1.4.15': {} 363 | 364 | '@jridgewell/trace-mapping@0.3.25': 365 | dependencies: 366 | '@jridgewell/resolve-uri': 3.1.2 367 | '@jridgewell/sourcemap-codec': 1.4.15 368 | 369 | '@types/istanbul-lib-coverage@2.0.6': {} 370 | 371 | '@types/node@22.0.0': 372 | dependencies: 373 | undici-types: 6.11.1 374 | 375 | ansi-regex@5.0.1: {} 376 | 377 | ansi-styles@4.3.0: 378 | dependencies: 379 | color-convert: 2.0.1 380 | 381 | balanced-match@1.0.2: {} 382 | 383 | brace-expansion@1.1.11: 384 | dependencies: 385 | balanced-match: 1.0.2 386 | concat-map: 0.0.1 387 | 388 | c8@9.1.0: 389 | dependencies: 390 | '@bcoe/v8-coverage': 0.2.3 391 | '@istanbuljs/schema': 0.1.3 392 | find-up: 5.0.0 393 | foreground-child: 3.1.1 394 | istanbul-lib-coverage: 3.2.2 395 | istanbul-lib-report: 3.0.1 396 | istanbul-reports: 3.1.7 397 | test-exclude: 6.0.0 398 | v8-to-istanbul: 9.2.0 399 | yargs: 17.7.2 400 | yargs-parser: 21.1.1 401 | 402 | cliui@8.0.1: 403 | dependencies: 404 | string-width: 4.2.3 405 | strip-ansi: 6.0.1 406 | wrap-ansi: 7.0.0 407 | 408 | color-convert@2.0.1: 409 | dependencies: 410 | color-name: 1.1.4 411 | 412 | color-name@1.1.4: {} 413 | 414 | concat-map@0.0.1: {} 415 | 416 | convert-source-map@2.0.0: {} 417 | 418 | cross-spawn@7.0.3: 419 | dependencies: 420 | path-key: 3.1.1 421 | shebang-command: 2.0.0 422 | which: 2.0.2 423 | 424 | emoji-regex@8.0.0: {} 425 | 426 | escalade@3.1.2: {} 427 | 428 | find-up@5.0.0: 429 | dependencies: 430 | locate-path: 6.0.0 431 | path-exists: 4.0.0 432 | 433 | foreground-child@3.1.1: 434 | dependencies: 435 | cross-spawn: 7.0.3 436 | signal-exit: 4.1.0 437 | 438 | fs.realpath@1.0.0: {} 439 | 440 | get-caller-file@2.0.5: {} 441 | 442 | glob@7.2.3: 443 | dependencies: 444 | fs.realpath: 1.0.0 445 | inflight: 1.0.6 446 | inherits: 2.0.4 447 | minimatch: 3.1.2 448 | once: 1.4.0 449 | path-is-absolute: 1.0.1 450 | 451 | has-flag@4.0.0: {} 452 | 453 | html-escaper@2.0.2: {} 454 | 455 | inflight@1.0.6: 456 | dependencies: 457 | once: 1.4.0 458 | wrappy: 1.0.2 459 | 460 | inherits@2.0.4: {} 461 | 462 | is-fullwidth-code-point@3.0.0: {} 463 | 464 | isexe@2.0.0: {} 465 | 466 | istanbul-lib-coverage@3.2.2: {} 467 | 468 | istanbul-lib-report@3.0.1: 469 | dependencies: 470 | istanbul-lib-coverage: 3.2.2 471 | make-dir: 4.0.0 472 | supports-color: 7.2.0 473 | 474 | istanbul-reports@3.1.7: 475 | dependencies: 476 | html-escaper: 2.0.2 477 | istanbul-lib-report: 3.0.1 478 | 479 | locate-path@6.0.0: 480 | dependencies: 481 | p-locate: 5.0.0 482 | 483 | lru-cache@6.0.0: 484 | dependencies: 485 | yallist: 4.0.0 486 | 487 | make-dir@4.0.0: 488 | dependencies: 489 | semver: 7.6.0 490 | 491 | minimatch@3.1.2: 492 | dependencies: 493 | brace-expansion: 1.1.11 494 | 495 | once@1.4.0: 496 | dependencies: 497 | wrappy: 1.0.2 498 | 499 | p-limit@3.1.0: 500 | dependencies: 501 | yocto-queue: 0.1.0 502 | 503 | p-locate@5.0.0: 504 | dependencies: 505 | p-limit: 3.1.0 506 | 507 | path-exists@4.0.0: {} 508 | 509 | path-is-absolute@1.0.1: {} 510 | 511 | path-key@3.1.1: {} 512 | 513 | require-directory@2.1.1: {} 514 | 515 | semver@7.6.0: 516 | dependencies: 517 | lru-cache: 6.0.0 518 | 519 | shebang-command@2.0.0: 520 | dependencies: 521 | shebang-regex: 3.0.0 522 | 523 | shebang-regex@3.0.0: {} 524 | 525 | signal-exit@4.1.0: {} 526 | 527 | string-width@4.2.3: 528 | dependencies: 529 | emoji-regex: 8.0.0 530 | is-fullwidth-code-point: 3.0.0 531 | strip-ansi: 6.0.1 532 | 533 | strip-ansi@6.0.1: 534 | dependencies: 535 | ansi-regex: 5.0.1 536 | 537 | supports-color@7.2.0: 538 | dependencies: 539 | has-flag: 4.0.0 540 | 541 | test-exclude@6.0.0: 542 | dependencies: 543 | '@istanbuljs/schema': 0.1.3 544 | glob: 7.2.3 545 | minimatch: 3.1.2 546 | 547 | typescript@5.5.4: {} 548 | 549 | undici-types@6.11.1: {} 550 | 551 | v8-to-istanbul@9.2.0: 552 | dependencies: 553 | '@jridgewell/trace-mapping': 0.3.25 554 | '@types/istanbul-lib-coverage': 2.0.6 555 | convert-source-map: 2.0.0 556 | 557 | which@2.0.2: 558 | dependencies: 559 | isexe: 2.0.0 560 | 561 | wrap-ansi@7.0.0: 562 | dependencies: 563 | ansi-styles: 4.3.0 564 | string-width: 4.2.3 565 | strip-ansi: 6.0.1 566 | 567 | wrappy@1.0.2: {} 568 | 569 | y18n@5.0.8: {} 570 | 571 | yallist@4.0.0: {} 572 | 573 | yargs-parser@21.1.1: {} 574 | 575 | yargs@17.7.2: 576 | dependencies: 577 | cliui: 8.0.1 578 | escalade: 3.1.2 579 | get-caller-file: 2.0.5 580 | require-directory: 2.1.1 581 | string-width: 4.2.3 582 | y18n: 5.0.8 583 | yargs-parser: 21.1.1 584 | 585 | yocto-queue@0.1.0: {} 586 | --------------------------------------------------------------------------------