diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..4fc56f1 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug Report +about: Report a bug or an issue you've found with `@bsv/sdk`. +title: "[BUG]" +labels: bug +assignees: '' + +--- + +## Bug Description + +Briefly describe the bug/issue you've encountered. + +## Steps to Reproduce + +1. Step 1 +2. Step 2 +3. ... + +## Expected Behavior + +What should have happened if the bug hadn't occurred? + +## Actual Behavior + +What actually happened? + +## Stack Traces or Screenshots + +If applicable, add screenshots or stack traces to help explain the issue. + +## Environment + +- OS: [e.g. MacOS, Windows] +- Node version: [e.g. 12.20] +- `@bsv/sdk` version: [e.g. 1.2.3] + +## Additional Information + +Provide any additional context or information about the bug. diff --git a/.github/ISSUE_TEMPLATE/discussion.md b/.github/ISSUE_TEMPLATE/discussion.md new file mode 100644 index 0000000..52aa083 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/discussion.md @@ -0,0 +1,24 @@ +--- +name: Discussion +about: Propose a discussion or seek clarification about a feature or topic. +title: "[DISCUSSION]" +labels: discussion +assignees: '' + +--- + +## Summary + +Briefly describe the topic you'd like to discuss. + +## Motivation + +Why do you believe this to be important? + +## Description + +Provide a detailed description or elaborate on your topic. + +## Additional References + +Provide any additional articles, links, or context that would help facilitate the discussion. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..c6182f7 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,25 @@ +## Description of Changes + +Provide a brief description of the changes you've made. + +## Linked Issues / Tickets + +Reference any related issues or tickets, e.g. "Closes #123". + +## Testing Procedure + +Describe the tests you've added or any testing steps you've taken. + +- [ ] I have added new unit tests +- [ ] All tests pass locally +- [ ] I have tested manually in my local environment + +## Checklist + +- [ ] I have performed a self-review of my own code +- [ ] I have made corresponding changes to the documentation +- [ ] My changes generate no new warnings +- [ ] I have updated `CHANGELOG.md` with my changes +- [ ] I have run `npm run doc` and `npm run lint` one final time before requesting a review +- [ ] I have fixed all linter errors to ensure these changes are compliant with `ts-standard` +- [ ] I have run `npm version patch` so that my changes will trigger a new version to be released when they are merged diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml new file mode 100644 index 0000000..bd58f14 --- /dev/null +++ b/.github/workflows/push.yaml @@ -0,0 +1,71 @@ +name: Build and Test + +on: + push: + branches: + - master + pull_request: + +permissions: + id-token: write # Required for OIDC + contents: read + +jobs: + test: + name: Build & Test + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [20, 22, 24] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + registry-url: 'https://registry.npmjs.org' + - run: npm ci + - run: npm run lint:ci --if-present + - run: npm run test:coverage --if-present + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./coverage/lcov.info + flags: unittests + name: codecov-umbrella + fail_ci_if_error: false + publish: + name: Publish + needs: test + runs-on: ubuntu-latest + if: github.event_name == 'push' && github.ref == 'refs/heads/master' + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '24' + registry-url: 'https://registry.npmjs.org' + - run: npm ci + - run: npm run build + - name: Check if version already published + id: check-version + run: | + PACKAGE_NAME=$(node -p "require('./package.json').name") + PACKAGE_VERSION=$(node -p "require('./package.json').version") + + echo "Package: $PACKAGE_NAME@$PACKAGE_VERSION" + + # Check if this version exists on npm + if npm view "$PACKAGE_NAME@$PACKAGE_VERSION" version 2>/dev/null; then + echo "Version $PACKAGE_VERSION already published" + echo "should_publish=false" >> $GITHUB_OUTPUT + else + echo "Version $PACKAGE_VERSION not yet published" + echo "should_publish=true" >> $GITHUB_OUTPUT + fi + - name: Publish to npm + if: steps.check-version.outputs.should_publish == 'true' + run: npm publish + - name: Skip publishing + if: steps.check-version.outputs.should_publish == 'false' + run: echo "Skipping publish - version already exists on npm" diff --git a/README.md b/README.md new file mode 100644 index 0000000..4cf312d --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# @bsv/simple + +A high-level TypeScript library that makes BSV blockchain development simple. Build wallets, send payments, create tokens, issue credentials, and more — in just a few lines of code. + +## What is @bsv/simple? + +`@bsv/simple` wraps the low-level `@bsv/sdk` into a clean, modular API. Instead of manually constructing locking scripts, managing key derivation, and handling transaction internalization, you call methods like `wallet.pay()`, `wallet.createToken()`, and `wallet.inscribeText()`. + +## What can you build? + +| Feature | Description | +|---------|-------------| +| **Payments** | Send BSV to any identity key via BRC-29 peer-to-peer payments | +| **Multi-Output Transactions** | Combine P2PKH payments, OP_RETURN data, and PushDrop tokens in a single transaction | +| **Encrypted Tokens** | Create, transfer, and redeem PushDrop tokens with encrypted payloads | +| **Inscriptions** | Write text, JSON, or file hashes permanently to the blockchain | +| **MessageBox P2P** | Send and receive payments and tokens peer-to-peer via MessageBox | +| **Certification** | Issue and manage BSV certificates with a standalone Certifier | +| **Verifiable Credentials** | W3C-compatible VCs backed by BSV certificates, with on-chain revocation | +| **DIDs** | Generate and resolve `did:bsv:` Decentralized Identifiers | +| **Overlay Networks** | Broadcast to and query SHIP/SLAP overlay services | +| **Server Wallet** | Run a backend wallet for automated operations and funding flows | + +## Browser vs Server + +The library has two entry points: + +- **`@bsv/simple`** (default) — Browser-safe. Uses `WalletClient` from `@bsv/sdk` to connect to the user's wallet on the client side. Will not pull in any server-only dependencies. +- **`@bsv/simple/server`** — Uses `@bsv/wallet-toolbox` to run a server-side wallet from a private key. Used for agents, or servers receiving payments. + +Both entry points provide the same API surface — the only difference is how they connect to the underlying wallet. + +## A taste of the API + +```typescript +import { createWallet } from '@bsv/simple/browser' + +// Connect to the user's wallet +const wallet = await createWallet() + +// Send a payment +await wallet.pay({ to: recipientKey, satoshis: 1000, memo: 'Coffee' }) + +// Create an encrypted token +await wallet.createToken({ data: { type: 'loyalty', points: 50 }, basket: 'rewards' }) + +// Inscribe text on-chain +await wallet.inscribeText('Hello BSV!') + +// Get your DID +const did = wallet.getDID() +// { id: 'did:bsv:02abc...', ... } +``` + +## Next Steps + +- [Quick Start](docs/quick-start.md) — Get running in 5 minutes +- [Installation](docs/installation.md) — Detailed setup instructions +- [Architecture](docs/architecture.md) — How the library is built diff --git a/docs/README.md b/docs/README.md index e0bf2df..d21bc06 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,7 +10,7 @@ A high-level TypeScript library that makes BSV blockchain development simple. Bu | Feature | Description | |---------|-------------| -| **Payments** | Send BSV to any identity key with optional memos and change recovery | +| **Payments** | Send BSV to any identity key via BRC-29 peer-to-peer payments | | **Multi-Output Transactions** | Combine P2PKH payments, OP_RETURN data, and PushDrop tokens in a single transaction | | **Encrypted Tokens** | Create, transfer, and redeem PushDrop tokens with encrypted payloads | | **Inscriptions** | Write text, JSON, or file hashes permanently to the blockchain | @@ -25,8 +25,8 @@ A high-level TypeScript library that makes BSV blockchain development simple. Bu The library has two entry points: -- **`@bsv/simple/browser`** — Uses `WalletClient` from `@bsv/sdk` to connect to the user's browser wallet extension (MetaNet Client). No private keys in the browser. -- **`@bsv/simple/server`** — Uses `@bsv/wallet-toolbox` to run a wallet from a private key on the server. Used for automated operations, payment processing, and funding flows. +- **`@bsv/simple`** (default) — Browser-safe. Uses `WalletClient` from `@bsv/sdk` to connect to the user's wallet on the client side. Will not pull in any server-only dependencies. +- **`@bsv/simple/server`** — Uses `@bsv/wallet-toolbox` to run a server-side wallet from a private key. Used for agents, or servers receiving payments. Both entry points provide the same API surface — the only difference is how they connect to the underlying wallet. @@ -57,3 +57,44 @@ const did = wallet.getDID() - [Quick Start](quick-start.md) — Get running in 5 minutes - [Installation](installation.md) — Detailed setup instructions - [Architecture](architecture.md) — How the library is built + +# Table of Contents + +* [Introduction](README.md) +* [Quick Start](quick-start.md) +* [Installation](installation.md) +* [Architecture](architecture.md) + +## Guides + +* [Browser Wallet](guides/browser-wallet.md) +* [Server Wallet](guides/server-wallet.md) +* [Payments](guides/payments.md) +* [Tokens](guides/tokens.md) +* [Inscriptions](guides/inscriptions.md) +* [MessageBox & P2P](guides/messagebox.md) +* [Certification](guides/certification.md) +* [DID (Decentralized Identity)](guides/did.md) +* [Verifiable Credentials](guides/credentials.md) +* [Overlay Networks](guides/overlay.md) +* [Next.js Integration](guides/nextjs-integration.md) + +## API Reference + +* [WalletCore](api-reference/wallet-core.md) +* [BrowserWallet](api-reference/browser-wallet.md) +* [ServerWallet](api-reference/server-wallet.md) +* [Tokens Module](api-reference/tokens.md) +* [Inscriptions Module](api-reference/inscriptions.md) +* [MessageBox Module](api-reference/messagebox.md) +* [Certification Module](api-reference/certification.md) +* [DID Module](api-reference/did.md) +* [Credentials Module](api-reference/credentials.md) +* [Overlay Module](api-reference/overlay.md) +* [Types](api-reference/types.md) +* [Errors](api-reference/errors.md) + +## Advanced + +* [Gotchas & Pitfalls](gotchas.md) +* [MCP Server](mcp-server.md) diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md deleted file mode 100644 index f0b876a..0000000 --- a/docs/SUMMARY.md +++ /dev/null @@ -1,40 +0,0 @@ -# Table of Contents - -* [Introduction](README.md) -* [Quick Start](quick-start.md) -* [Installation](installation.md) -* [Architecture](architecture.md) - -## Guides - -* [Browser Wallet](guides/browser-wallet.md) -* [Server Wallet](guides/server-wallet.md) -* [Payments](guides/payments.md) -* [Tokens](guides/tokens.md) -* [Inscriptions](guides/inscriptions.md) -* [MessageBox & P2P](guides/messagebox.md) -* [Certification](guides/certification.md) -* [DID (Decentralized Identity)](guides/did.md) -* [Verifiable Credentials](guides/credentials.md) -* [Overlay Networks](guides/overlay.md) -* [Next.js Integration](guides/nextjs-integration.md) - -## API Reference - -* [WalletCore](api-reference/wallet-core.md) -* [BrowserWallet](api-reference/browser-wallet.md) -* [ServerWallet](api-reference/server-wallet.md) -* [Tokens Module](api-reference/tokens.md) -* [Inscriptions Module](api-reference/inscriptions.md) -* [MessageBox Module](api-reference/messagebox.md) -* [Certification Module](api-reference/certification.md) -* [DID Module](api-reference/did.md) -* [Credentials Module](api-reference/credentials.md) -* [Overlay Module](api-reference/overlay.md) -* [Types](api-reference/types.md) -* [Errors](api-reference/errors.md) - -## Advanced - -* [Gotchas & Pitfalls](gotchas.md) -* [MCP Server](mcp-server.md) diff --git a/docs/api-reference/browser-wallet.md b/docs/api-reference/browser-wallet.md index 19634dc..70177aa 100644 --- a/docs/api-reference/browser-wallet.md +++ b/docs/api-reference/browser-wallet.md @@ -49,7 +49,6 @@ console.log(wallet.getIdentityKey()) // '02abc...' // With custom defaults const wallet = await createWallet({ - changeBasket: 'my-change', network: 'main', registryUrl: '/api/identity-registry' }) @@ -61,7 +60,7 @@ const wallet = await createWallet({ | Source | Methods | |--------|---------| -| [WalletCore](wallet-core.md) | `getIdentityKey()`, `getAddress()`, `getStatus()`, `getWalletInfo()`, `getClient()`, `derivePublicKey()`, `derivePaymentKey()`, `pay()`, `send()`, `fundServerWallet()`, `reinternalizeChange()` | +| [WalletCore](wallet-core.md) | `getIdentityKey()`, `getAddress()`, `getStatus()`, `getWalletInfo()`, `getClient()`, `derivePublicKey()`, `derivePaymentKey()`, `pay()`, `send()`, `fundServerWallet()` | | [Tokens](tokens.md) | `createToken()`, `listTokenDetails()`, `sendToken()`, `redeemToken()`, `sendTokenViaMessageBox()`, `listIncomingTokens()`, `acceptIncomingToken()` | | [Inscriptions](inscriptions.md) | `inscribeText()`, `inscribeJSON()`, `inscribeFileHash()`, `inscribeImageHash()` | | [MessageBox](messagebox.md) | `certifyForMessageBox()`, `getMessageBoxHandle()`, `revokeMessageBoxCertification()`, `sendMessageBoxPayment()`, `listIncomingPayments()`, `acceptIncomingPayment()`, `registerIdentityTag()`, `lookupIdentityByTag()`, `listMyTags()`, `revokeIdentityTag()` | diff --git a/docs/api-reference/messagebox.md b/docs/api-reference/messagebox.md index a4af032..dfc55dc 100644 --- a/docs/api-reference/messagebox.md +++ b/docs/api-reference/messagebox.md @@ -79,8 +79,7 @@ Remove all registered handles for this wallet from the identity registry. ```typescript async sendMessageBoxPayment( to: string, - satoshis: number, - changeBasket?: string + satoshis: number ): Promise ``` @@ -90,7 +89,6 @@ Send a payment via MessageBox P2P messaging. |-----------|------|---------|-------------| | `to` | `string` | *required* | Recipient's identity key | | `satoshis` | `number` | *required* | Amount to send | -| `changeBasket` | `string` | `defaults.changeBasket` | Reinternalize change | **Returns:** @@ -99,14 +97,12 @@ Send a payment via MessageBox P2P messaging. txid: string amount: number recipient: string - reinternalized?: ReinternalizeResult } ``` **What happens:** 1. Creates a payment token via `PeerPayClient.createPaymentToken()` 2. Sends the token to `payment_inbox` message box -3. If `changeBasket` is provided, reinternalizes change from the payment transaction ### listIncomingPayments() diff --git a/docs/api-reference/server-wallet.md b/docs/api-reference/server-wallet.md index 5dd42e7..4ac2fd7 100644 --- a/docs/api-reference/server-wallet.md +++ b/docs/api-reference/server-wallet.md @@ -116,7 +116,7 @@ The typical server wallet funding flow: ``` 1. Server: wallet.createPaymentRequest({ satoshis: 50000 }) ↓ (send PaymentRequest to client via API) -2. Client: wallet.fundServerWallet(request, 'funding', 'change') +2. Client: wallet.fundServerWallet(request, 'funding') ↓ (send tx bytes back to server via API) 3. Server: wallet.receivePayment({ tx, senderIdentityKey, ... }) ``` diff --git a/docs/api-reference/types.md b/docs/api-reference/types.md index a6b59a9..fbb02a1 100644 --- a/docs/api-reference/types.md +++ b/docs/api-reference/types.md @@ -21,7 +21,6 @@ interface WalletDefaults { network: Network description: string outputDescription: string - changeBasket?: string tokenBasket: string tokenProtocolID: [SecurityLevel, string] tokenKeyID: string @@ -37,7 +36,6 @@ interface WalletDefaults { | `network` | `'main'` | | `description` | `'BSV-Simplify transaction'` | | `outputDescription` | `'BSV-Simplify output'` | -| `changeBasket` | `undefined` | | `tokenBasket` | `'tokens'` | | `tokenProtocolID` | `[0, 'token']` | | `tokenKeyID` | `'1'` | @@ -76,7 +74,6 @@ interface TransactionResult { txid: string tx: any // AtomicBEEF bytes (number[]) outputs?: OutputInfo[] - reinternalized?: ReinternalizeResult } ``` @@ -91,15 +88,6 @@ interface OutputInfo { } ``` -### ReinternalizeResult - -```typescript -interface ReinternalizeResult { - count: number // Number of change outputs recovered - errors: string[] // Any errors encountered -} -``` - ### SendResult ```typescript @@ -125,14 +113,10 @@ interface SendOutputDetail { ```typescript interface PaymentOptions { - to: string // Recipient public key + to: string // Recipient identity key satoshis: number // Amount - memo?: string // OP_RETURN memo + memo?: string // Optional memo description?: string // Transaction description - basket?: string // Track output in basket - changeBasket?: string // Reinternalize change - derivationPrefix?: string // BRC-29 derivation prefix - derivationSuffix?: string // BRC-29 derivation suffix } ``` @@ -142,7 +126,6 @@ interface PaymentOptions { interface SendOptions { outputs: SendOutputSpec[] description?: string - changeBasket?: string } ``` diff --git a/docs/api-reference/wallet-core.md b/docs/api-reference/wallet-core.md index b7240b8..5365db8 100644 --- a/docs/api-reference/wallet-core.md +++ b/docs/api-reference/wallet-core.md @@ -1,6 +1,6 @@ # WalletCore -`WalletCore` is the abstract base class that both `BrowserWallet` and `ServerWallet` extend. It provides wallet info, key derivation, payments, multi-output sends, server wallet funding, and change reinternalization. +`WalletCore` is the abstract base class that both `BrowserWallet` and `ServerWallet` extend. It provides wallet info, key derivation, payments, multi-output sends, and server wallet funding. **Source:** `src/core/WalletCore.ts` @@ -123,26 +123,17 @@ Derive a BRC-29 payment key. Uses protocol ID `[2, '3241645161d8']`. async pay(options: PaymentOptions): Promise ``` -Send a P2PKH payment with optional OP_RETURN memo, BRC-29 derivation, and change recovery. +Send a BRC-29 payment to a counterparty via `PeerPayClient.sendPayment()`. The payment is constructed and delivered to the recipient in a single call. | Parameter | Type | Required | Description | |-----------|------|----------|-------------| -| `options.to` | `string` | Yes | Recipient's public key | +| `options.to` | `string` | Yes | Recipient's identity key | | `options.satoshis` | `number` | Yes | Amount to send | -| `options.memo` | `string` | No | OP_RETURN memo (creates second output) | +| `options.memo` | `string` | No | Optional memo | | `options.description` | `string` | No | Transaction description | -| `options.basket` | `string` | No | Track payment output in a basket | -| `options.changeBasket` | `string` | No | Reinternalize change into this basket | -| `options.derivationPrefix` | `string` | No | BRC-29 derivation prefix | -| `options.derivationSuffix` | `string` | No | BRC-29 derivation suffix | **Returns:** [`TransactionResult`](types.md#transactionresult) -**Behavior:** -- If `derivationPrefix` or `derivationSuffix` is provided, derives a payment key using BRC-29 protocol -- If `memo` is provided, adds an `OP_FALSE OP_RETURN ` output -- If `changeBasket` is provided, calls `reinternalizeChange()` after the transaction - ### send() ```typescript @@ -155,7 +146,6 @@ Create a transaction with multiple outputs of different types in a single transa |-----------|------|----------|-------------| | `options.outputs` | `SendOutputSpec[]` | Yes | Array of output specifications | | `options.description` | `string` | No | Transaction description | -| `options.changeBasket` | `string` | No | Reinternalize change into this basket | **Returns:** [`SendResult`](types.md#sendresult) (extends `TransactionResult` with `outputDetails`) @@ -185,8 +175,7 @@ Create a transaction with multiple outputs of different types in a single transa ```typescript async fundServerWallet( request: PaymentRequest, - basket?: string, - changeBasket?: string + basket?: string ): Promise ``` @@ -196,39 +185,5 @@ Fund a `ServerWallet` using a BRC-29 derived payment. |-----------|------|----------|-------------| | `request` | `PaymentRequest` | Yes | Payment request from `ServerWallet.createPaymentRequest()` | | `basket` | `string` | No | Track the funding output in a basket | -| `changeBasket` | `string` | No | Reinternalize change | **Returns:** [`TransactionResult`](types.md#transactionresult) - -### reinternalizeChange() - -```typescript -async reinternalizeChange( - tx: number[], - basket: string, - skipOutputIndexes?: number[] -): Promise -``` - -Recover orphaned change outputs from a transaction into a named basket. - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `tx` | `number[]` | *required* | AtomicBEEF transaction bytes | -| `basket` | `string` | *required* | Target basket for change outputs | -| `skipOutputIndexes` | `number[]` | `[0]` | Output indexes to skip (your payment outputs) | - -**Returns:** - -```typescript -{ - count: number // Number of outputs recovered - errors: string[] // Any errors during recovery -} -``` - -**Behavior:** -1. Parses the transaction and finds change outputs (non-zero satoshis, not in `skipOutputIndexes`) -2. **Skips the largest change output** — the wallet automatically tracks it -3. Waits for broadcast confirmation with exponential backoff (2s initial, up to 30s timeout) -4. Internalizes each remaining output using `basket insertion` protocol diff --git a/docs/architecture.md b/docs/architecture.md index 3d60e8e..7fba658 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -43,7 +43,6 @@ The same process happens for `ServerWallet.create()`, but with `ToolboxWallet` f - **Wallet info**: `getIdentityKey()`, `getAddress()`, `getStatus()`, `getWalletInfo()` - **Key derivation**: `derivePublicKey()`, `derivePaymentKey()` - **Core transaction methods**: `pay()`, `send()`, `fundServerWallet()` -- **Change recovery**: `reinternalizeChange()` Subclasses must implement `getClient(): WalletInterface` to provide the underlying wallet. @@ -94,7 +93,7 @@ json/ → JSON inscriptions revocation-utxos/ → Credential revocation locks ``` -Many methods accept a `basket` parameter to specify where outputs should be stored. The `changeBasket` parameter enables automatic recovery of change outputs into a named basket. +Many methods accept a `basket` parameter to specify where outputs should be stored. ## Dependencies @@ -102,4 +101,5 @@ Many methods accept a `basket` parameter to specify where outputs should be stor |---------|------|-------------| | `@bsv/sdk` | Core blockchain primitives, cryptography, WalletClient | Browser + Server | | `@bsv/wallet-toolbox` | ToolboxWallet, WalletSigner, StorageClient | Server only | +| `@bsv/wallet-toolbox-client` | Client-only wallet storage (browser-safe alternative) | Browser | | `@bsv/message-box-client` | PeerPayClient for P2P messaging | Browser + Server | diff --git a/docs/gotchas.md b/docs/gotchas.md index a0da0c0..93fc6dd 100644 --- a/docs/gotchas.md +++ b/docs/gotchas.md @@ -38,20 +38,7 @@ if (typeof result === 'string') throw new Error(result) `@bsv/simple` handles this check internally, but be aware if you ever use `@bsv/message-box-client` directly. -## 3. Change Outputs Are Orphaned by Default - -When `createAction` produces change, the change output exists in the wallet but isn't in any named basket. It won't appear in `listOutputs()` queries. - -**Fix:** Always pass `changeBasket` to recover change: - -```typescript -// Change is recovered automatically -await wallet.pay({ to: key, satoshis: 1000, changeBasket: 'my-change' }) -``` - -Without this, the change is still spendable by the wallet for future transactions, but you can't track or query it by basket. - -## 4. result.tx May Be Undefined +## 3. result.tx May Be Undefined `createAction()` doesn't always return transaction bytes. @@ -68,7 +55,7 @@ if (!result.tx) { } ``` -## 5. Overlay Prefix Requirements +## 4. Overlay Prefix Requirements Topics must start with `tm_`, lookup services must start with `ls_`. The library throws immediately if these prefixes are missing. @@ -90,7 +77,7 @@ await wallet.advertiseSLAP('domain.com', 'payments') await wallet.advertiseSLAP('domain.com', 'ls_payments') ``` -## 6. FileRevocationStore Crashes in Browser +## 5. FileRevocationStore Crashes in Browser `FileRevocationStore` uses Node.js `fs` and `path` modules. Importing it in browser code causes a crash. @@ -102,7 +89,7 @@ import { MemoryRevocationStore } from '@bsv/simple/browser' const { FileRevocationStore } = await import('@bsv/simple/server') ``` -## 7. Static Imports Break Next.js API Routes +## 6. Static Imports Break Next.js API Routes Using static imports for server-only code at the top of a Next.js API route can cause Turbopack bundling issues. @@ -114,7 +101,7 @@ import { ServerWallet } from '@bsv/simple/server' const { ServerWallet } = await import('@bsv/simple/server') ``` -## 8. Server Wallet Re-initializes on Every Request +## 7. Server Wallet Re-initializes on Every Request If you create the wallet inside a request handler without caching, it re-initializes on every request (slow and creates duplicate storage connections). @@ -137,15 +124,11 @@ async function getWallet() { } ``` -## 9. reinternalizeChange Skips the Largest Output - -The wallet automatically tracks one change output. `reinternalizeChange()` only recovers the *additional* orphaned outputs. If a transaction has only one change output, the method returns `{ count: 0 }`. - -## 10. Token Send/Redeem Requires Two-Step Signing +## 8. Token Send/Redeem Requires Two-Step Signing Token transfers use a `createAction` → `signAction` flow because PushDrop outputs need a custom unlocking script. Don't try to send tokens using `pay()` or raw `createAction()` — use `sendToken()` or `redeemToken()`. -## 11. next.config.ts serverExternalPackages Is Required +## 9. next.config.ts serverExternalPackages Is Required Without the `serverExternalPackages` configuration, Next.js Turbopack bundles `@bsv/wallet-toolbox`, `knex`, and database drivers for the browser, causing build failures: @@ -158,7 +141,7 @@ const nextConfig: NextConfig = { } ``` -## 12. BRC-29 Protocol ID +## 10. BRC-29 Protocol ID The payment derivation protocol ID is `[2, '3241645161d8']`. This is a `SecurityLevel` 2 protocol. Don't confuse it with other protocol IDs. diff --git a/docs/guides/browser-wallet.md b/docs/guides/browser-wallet.md index 2b2ddfd..5df48f3 100644 --- a/docs/guides/browser-wallet.md +++ b/docs/guides/browser-wallet.md @@ -17,7 +17,6 @@ This prompts the user to approve the connection. Once approved, the wallet is re ```typescript const wallet = await createWallet({ network: 'main', - changeBasket: 'my-change', // auto-recover change outputs tokenBasket: 'my-tokens', // default basket for tokens messageBoxHost: 'https://messagebox.babbage.systems', registryUrl: '/api/identity-registry' @@ -93,7 +92,6 @@ await client.listOutputs({ basket: 'my-basket', include: 'locking scripts' }) | `network` | `'main'` | Network to operate on | | `description` | `'BSV-Simplify transaction'` | Default transaction description | | `outputDescription` | `'BSV-Simplify output'` | Default output description | -| `changeBasket` | `undefined` | If set, auto-recover change outputs | | `tokenBasket` | `'tokens'` | Default basket for token operations | | `tokenProtocolID` | `[0, 'token']` | Default PushDrop protocol ID | | `tokenKeyID` | `'1'` | Default PushDrop key ID | diff --git a/docs/guides/messagebox.md b/docs/guides/messagebox.md index 214d13d..e7e0fc3 100644 --- a/docs/guides/messagebox.md +++ b/docs/guides/messagebox.md @@ -47,20 +47,17 @@ Send BSV to another wallet via MessageBox P2P: ```typescript const result = await wallet.sendMessageBoxPayment( recipientIdentityKey, - 1000, // satoshis - 'messagebox-change' // optional: basket for change recovery + 1000 // satoshis ) console.log('Amount:', result.amount) console.log('Recipient:', result.recipient) -console.log('Change recovered:', result.reinternalized?.count) ``` ### How It Works 1. Creates a payment token using `PeerPayClient.createPaymentToken()` 2. Sends the token to the recipient's `payment_inbox` via MessageBox -3. Optionally reinternalizes change outputs into the specified basket ## Receiving Payments @@ -169,7 +166,7 @@ const results = await wallet.lookupIdentityByTag('bob', REGISTRY) const bob = results[0] // Send payment -await wallet.sendMessageBoxPayment(bob.identityKey, 5000, 'change') +await wallet.sendMessageBoxPayment(bob.identityKey, 5000) // Check inbox const incoming = await wallet.listIncomingPayments() diff --git a/docs/guides/nextjs-integration.md b/docs/guides/nextjs-integration.md index 5a648d0..c2f88fe 100644 --- a/docs/guides/nextjs-integration.md +++ b/docs/guides/nextjs-integration.md @@ -62,9 +62,7 @@ export default function Page() { if (!wallet) return const result = await wallet.pay({ to: recipientKey, - satoshis: 1000, - basket: 'payments', - changeBasket: 'change' + satoshis: 1000 }) setStatus(`Sent! TXID: ${result.txid}`) } @@ -249,7 +247,7 @@ const fundServer = async () => { const { paymentRequest } = await res.json() // 2. Fund server wallet - const result = await wallet.fundServerWallet(paymentRequest, 'server-funding', 'change') + const result = await wallet.fundServerWallet(paymentRequest, 'server-funding') // 3. Send tx to server await fetch('/api/server-wallet?action=receive', { @@ -291,4 +289,3 @@ SERVER_PRIVATE_KEY=a1b2c3d4e5f6... | Build fails with "Can't resolve 'fs'" | Add `serverExternalPackages` to `next.config.ts` | | Server wallet re-initializes every request | Cache at module scope with promise pattern | | Import error for `@bsv/simple/server` | Use dynamic `await import()` in API routes | -| Change outputs disappear | Pass `changeBasket` to payment methods | diff --git a/docs/guides/payments.md b/docs/guides/payments.md index aa7773e..61418ed 100644 --- a/docs/guides/payments.md +++ b/docs/guides/payments.md @@ -13,49 +13,7 @@ const result = await wallet.pay({ console.log('TXID:', result.txid) ``` -### With a Memo - -Attach an OP_RETURN memo to the transaction: - -```typescript -const result = await wallet.pay({ - to: recipientKey, - satoshis: 1000, - memo: 'Coffee payment' -}) -``` - -This creates two outputs: the P2PKH payment and an OP_RETURN output containing the memo text. - -### With Change Recovery - -By default, change outputs from transactions are not tracked in any basket. Pass `changeBasket` to automatically recover them: - -```typescript -const result = await wallet.pay({ - to: recipientKey, - satoshis: 1000, - basket: 'my-payments', - changeBasket: 'my-change' -}) - -console.log('Change recovered:', result.reinternalized?.count) -``` - -### With BRC-29 Derivation - -For payment protocols that require key derivation: - -```typescript -const result = await wallet.pay({ - to: recipientKey, - satoshis: 5000, - derivationPrefix: 'cGF5bWVudA==', // base64('payment') - derivationSuffix: 'invoice-123' -}) -``` - -When derivation parameters are provided, the library derives a payment-specific key using the BRC-29 protocol (`[2, '3241645161d8']`), so the payment is locked to a unique derived address rather than the recipient's main address. +The `pay()` method uses `PeerPayClient.sendPayment()` from `@bsv/message-box-client` under the hood, which constructs and delivers a BRC-29 payment to the counterparty in a single call. ## Multi-Output Send @@ -88,8 +46,7 @@ const result = await wallet.send({ basket: 'receipts' } ], - description: 'Payment with receipt', - changeBasket: 'change' + description: 'Payment with receipt' }) // Check what was created @@ -112,44 +69,6 @@ The `data` array in output specs accepts multiple types: { data: ['field1', { field2: true }, [0x00]] } // Mixed types ``` -## Change Recovery - -When `createAction` produces change outputs, they exist in the wallet but aren't in any named basket. This means you can't query them via `listOutputs`. Change recovery puts them into a basket you can track. - -### Automatic (Recommended) - -Pass `changeBasket` to any payment method: - -```typescript -await wallet.pay({ to: key, satoshis: 1000, changeBasket: 'my-change' }) -await wallet.send({ outputs: [...], changeBasket: 'my-change' }) -``` - -### Manual - -If you have raw transaction bytes: - -```typescript -const result = await wallet.reinternalizeChange( - txBytes, // number[] from createAction result - 'my-change', // target basket - [0, 1] // output indexes to skip (your actual outputs) -) - -console.log(`${result.count} change outputs recovered`) -if (result.errors.length) { - console.warn('Errors:', result.errors) -} -``` - -### How It Works - -1. Parse the transaction to find all outputs -2. Skip outputs at the specified indexes (your payment/token outputs) -3. Skip the largest remaining output (the wallet auto-tracks one change output) -4. For each remaining output, call `internalizeAction` with `basket insertion` protocol -5. Wait for broadcast with exponential backoff (up to 30 seconds) - ## Funding a Server Wallet See the [Server Wallet Guide](server-wallet.md) for the complete funding flow. @@ -162,8 +81,7 @@ const { paymentRequest } = await res.json() // Fund using browser wallet const result = await wallet.fundServerWallet( paymentRequest, - 'server-funding', - 'change' + 'server-funding' ) ``` @@ -173,12 +91,8 @@ const result = await wallet.fundServerWallet( interface PaymentOptions { to: string // Recipient identity key (required) satoshis: number // Amount in satoshis (required) - memo?: string // OP_RETURN memo text + memo?: string // Optional memo description?: string // Transaction description - basket?: string // Track payment in this basket - changeBasket?: string // Recover change to this basket - derivationPrefix?: string // BRC-29 derivation prefix - derivationSuffix?: string // BRC-29 derivation suffix } ``` @@ -187,11 +101,7 @@ interface PaymentOptions { ```typescript interface TransactionResult { txid: string // Transaction ID - tx: number[] // Raw transaction bytes (AtomicBEEF) + tx: any // Raw transaction bytes (AtomicBEEF) outputs?: OutputInfo[] // Output details - reinternalized?: { // Change recovery results - count: number // Number of change outputs recovered - errors: string[] // Any errors during recovery - } } ``` diff --git a/docs/guides/server-wallet.md b/docs/guides/server-wallet.md index 69d6d97..1de6263 100644 --- a/docs/guides/server-wallet.md +++ b/docs/guides/server-wallet.md @@ -54,8 +54,7 @@ This generates a random BRC-29 derivation suffix so the server can later prove o // On the client (browser): const result = await browserWallet.fundServerWallet( paymentRequest, - 'server-funding', // basket for tracking - 'change' // basket for change recovery + 'server-funding' // basket for tracking ) ``` @@ -123,7 +122,7 @@ function getPrivateKey(): string { The server wallet has all the same methods as the browser wallet: -- `pay()`, `send()`, `reinternalizeChange()` +- `pay()`, `send()` - `createToken()`, `listTokenDetails()`, `sendToken()`, `redeemToken()` - `inscribeText()`, `inscribeJSON()`, `inscribeFileHash()`, `inscribeImageHash()` - `certifyForMessageBox()`, `sendMessageBoxPayment()`, `listIncomingPayments()`, `acceptIncomingPayment()` diff --git a/docs/installation.md b/docs/installation.md index 9f7df81..4a5b14b 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -14,9 +14,9 @@ The library provides three entry points: | Import Path | Environment | Use Case | |-------------|-------------|----------| +| `@bsv/simple` | Browser | Default browser-safe entrypoint (same as `@bsv/simple/browser`) | | `@bsv/simple/browser` | Browser | Connect to user's wallet extension | -| `@bsv/simple/server` | Node.js | Server wallet with private key | -| `@bsv/simple` | Both | All exports (use with care — includes server-only code) | +| `@bsv/simple/server` | Node.js | Server wallet with private key (includes server-only deps) | ### Browser diff --git a/docs/mcp-server.md b/docs/mcp-server.md index ab996ca..cecc225 100644 --- a/docs/mcp-server.md +++ b/docs/mcp-server.md @@ -103,7 +103,7 @@ Or for local development: Once connected, you can ask your AI assistant things like: - "Set up @bsv/simple in my Next.js project" -- "Generate a payment handler with change recovery" +- "Generate a payment handler" - "Create a token system with MessageBox transfer" - "Add verifiable credential issuance to my server" diff --git a/docs/quick-start.md b/docs/quick-start.md index aff89ed..1686564 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -72,7 +72,7 @@ console.log('Inscribed:', inscription.txid) | Guide | What you'll learn | |-------|-------------------| | [Browser Wallet](guides/browser-wallet.md) | Full wallet setup, wallet info, key derivation | -| [Payments](guides/payments.md) | Simple payments, multi-output sends, BRC-29 derivation, change recovery | +| [Payments](guides/payments.md) | Simple payments, multi-output sends, BRC-29 payments | | [Tokens](guides/tokens.md) | Create, list, send, redeem, and transfer tokens via MessageBox | | [Server Wallet](guides/server-wallet.md) | Run a backend wallet, accept funding from browser wallets | | [Next.js Integration](guides/nextjs-integration.md) | Set up a full-stack BSV app with Next.js | diff --git a/package-lock.json b/package-lock.json index 376a15f..e2d8729 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,25 +1,23 @@ { - "name": "@bsv/simplifier", - "version": "0.2.0", + "name": "@bsv/simple", + "version": "0.2.3", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@bsv/simplifier", - "version": "0.2.0", + "name": "@bsv/simple", + "version": "0.2.3", "license": "MIT", "dependencies": { - "@bsv/message-box-client": "^1.4.5", - "@bsv/sdk": "^1.10.1", - "@bsv/wallet-toolbox": "^1.8.2", - "dotenv": "^16.4.7" + "@bsv/message-box-client": "^2.0.2", + "@bsv/sdk": "^2.0.4", + "@bsv/wallet-toolbox": "^2.0.19", + "@bsv/wallet-toolbox-client": "^2.0.19" }, "devDependencies": { "@types/node": "^20.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "eslint": "^8.0.0", - "jest": "^29.0.0", + "jest": "^30.2.0", + "ts-standard": "^12.0.2", "typescript": "^5.3.0" } }, @@ -540,12 +538,12 @@ "license": "MIT" }, "node_modules/@bsv/auth-express-middleware": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@bsv/auth-express-middleware/-/auth-express-middleware-1.2.3.tgz", - "integrity": "sha512-+e+XawkibDzX7ZgjA1+LOKcPoM4Fua5hyyk3qAw8u//U86ZI7JHschDZylm6F2kCf9VjQlw/KQVlUK1SkMhKcA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@bsv/auth-express-middleware/-/auth-express-middleware-2.0.4.tgz", + "integrity": "sha512-E1OL/OsyElJTzwYNxAG2ThZLEH1Q6LCJSVx8GSazxCSmVPuQUdK0dAxW2Uscer2otq7BzEdYayRR0I7+E/8UAA==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@bsv/sdk": "^1.6.20", + "@bsv/sdk": "^2.0.4", "express": "^5.1.0" } }, @@ -827,38 +825,32 @@ } }, "node_modules/@bsv/authsocket-client": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@bsv/authsocket-client/-/authsocket-client-1.0.13.tgz", - "integrity": "sha512-lMSQZra3r9v2G1HvtDLBger5CNmB3KEA5TlU62RwufM+NXd5rg/nXK6le2Q5GnS/Ib/XoJWOtHGxtdFgqofzvQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@bsv/authsocket-client/-/authsocket-client-2.0.2.tgz", + "integrity": "sha512-da7ON4zqdShM9QFYxQzcuJoVfau1sm1dwrpsYtU3JowwDXMYYzcbvwvWzYBJS1380ijn1T50n1IAJlAaLqVNgg==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@bsv/sdk": "^2.0.1", + "@bsv/sdk": "^2.0.4", "socket.io-client": "^4.8.1" } }, - "node_modules/@bsv/authsocket-client/node_modules/@bsv/sdk": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@bsv/sdk/-/sdk-2.0.4.tgz", - "integrity": "sha512-5SUK76szpScNmpjx8iupZFWjksz4e4mjzxBbtEaz5LBDjvXeseBFRRmGpeiBnlGtnKd7GVBblW8ZfwjzFM92dg==", - "license": "SEE LICENSE IN LICENSE.txt" - }, "node_modules/@bsv/message-box-client": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@bsv/message-box-client/-/message-box-client-1.4.5.tgz", - "integrity": "sha512-B6jgUlGf8ZxaLBFdHDz2bYzmQDXuucbSVXOLXC/ef4bbx0Sb5XSQl2aQYfAhEXLOFlEYqmwkoiViiBT4y71jxA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@bsv/message-box-client/-/message-box-client-2.0.2.tgz", + "integrity": "sha512-i/pOg3BSjypZvHaLZg1Eil1EkBinEkOx1f+CGJoLwpvurmyU21xvdL5ma24txX8qWbYrqGMlkuXteIRcMcxmQg==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@bsv/authsocket-client": "^1.0.12", - "@bsv/sdk": "^1.8.8" + "@bsv/authsocket-client": "^2.0.2", + "@bsv/sdk": "^2.0.4" } }, "node_modules/@bsv/payment-express-middleware": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@bsv/payment-express-middleware/-/payment-express-middleware-1.2.3.tgz", - "integrity": "sha512-yseq4qiM1d30E0gfO41ewk5kmmpXr8nRY5sdAwoaIEBc5TrpUxKK1L4ZEk5vIf3ylh5Yr2P2T+k2YgA3CcHfAw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@bsv/payment-express-middleware/-/payment-express-middleware-2.0.1.tgz", + "integrity": "sha512-pFit3zEi6R2ixFWugXb6WgRoEFNXmmwRaV0oO3ala1gobtJIjc0WEJEASUQD6NYraEt7ql4xHDSkIWcisKO27g==", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@bsv/sdk": "^1.6.17", + "@bsv/sdk": "^2.0.4", "express": "^5.1.0" } }, @@ -1140,28 +1132,72 @@ } }, "node_modules/@bsv/sdk": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@bsv/sdk/-/sdk-1.10.4.tgz", - "integrity": "sha512-NuEXWwtuZ3WbER9wLtm33QCfhVwLyTyAzGholOeHo1imNDLLe7d2HADmf8hlSqAkNud3Y03S2poRc6aJMRWDrA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@bsv/sdk/-/sdk-2.0.4.tgz", + "integrity": "sha512-5SUK76szpScNmpjx8iupZFWjksz4e4mjzxBbtEaz5LBDjvXeseBFRRmGpeiBnlGtnKd7GVBblW8ZfwjzFM92dg==", "license": "SEE LICENSE IN LICENSE.txt" }, "node_modules/@bsv/wallet-toolbox": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@bsv/wallet-toolbox/-/wallet-toolbox-1.8.3.tgz", - "integrity": "sha512-XfoycL3Jxx6cF3kdH6nwEi0HQj48GiyHHQwVUYjSnQza14Lj234JnrX6YE6gnonLYb3+5i7ly0xKWDIh6FW4GA==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@bsv/wallet-toolbox/-/wallet-toolbox-2.0.19.tgz", + "integrity": "sha512-a3Guuz73ZEgrzAyhns4GbrGqL/9X1GokJRKBGJi1K3IEf4F1TuycfnTSNRG0mK1nfsgwh6IbmWjZ+S81U6PVbg==", "license": "SEE LICENSE IN license.md", "dependencies": { - "@bsv/auth-express-middleware": "^1.2.3", - "@bsv/payment-express-middleware": "^1.2.3", - "@bsv/sdk": "^1.10.2", + "@bsv/auth-express-middleware": "^2.0.4", + "@bsv/payment-express-middleware": "^2.0.0", + "@bsv/sdk": "^2.0.4", + "better-sqlite3": "^12.6.2", "express": "^4.21.2", "idb": "^8.0.2", "knex": "^3.1.0", "mysql2": "^3.12.0", - "sqlite3": "^5.1.7", "ws": "^8.18.3" } }, + "node_modules/@bsv/wallet-toolbox-client": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@bsv/wallet-toolbox-client/-/wallet-toolbox-client-2.0.19.tgz", + "integrity": "sha512-Qtzbi6JrHysWK/Pc0P3oZgmH7MWN3ITaq3g/YzVUWFF7WIFXgBzVCE35crcOo6ygdOsxEjaAclP4MKytlkBqQA==", + "license": "SEE LICENSE IN license.md", + "dependencies": { + "@bsv/sdk": "^2.0.0", + "idb": "^8.0.2" + } + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -1215,30 +1251,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", @@ -1249,13 +1261,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "license": "MIT", - "optional": true - }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -1272,30 +1277,6 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1318,6 +1299,109 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1436,61 +1520,61 @@ } }, "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.2.0", "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -1501,117 +1585,150 @@ } } }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "^29.7.0" + "jest-mock": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", "dev": true, "license": "MIT", "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" + "expect": "30.2.0", + "jest-snapshot": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3" + "@jest/get-type": "30.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", + "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", + "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -1622,109 +1739,148 @@ } } }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", "slash": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "write-file-atomic": "^5.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -1777,6 +1933,19 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1815,36 +1984,41 @@ "node": ">= 8" } }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "license": "ISC", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "engines": { + "node": ">=14" } }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" } }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@sinclair/typebox": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", "dev": true, "license": "MIT" }, @@ -1859,13 +2033,13 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@sinonjs/commons": "^3.0.1" } }, "node_modules/@socket.io/component-emitter": { @@ -1874,14 +2048,15 @@ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "license": "MIT" }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">= 6" + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@types/babel__core": { @@ -1929,16 +2104,6 @@ "@babel/types": "^7.28.2" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -1973,6 +2138,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.33", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", @@ -2014,217 +2186,281 @@ "dev": true, "license": "MIT" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } + "license": "ISC" }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" + "@napi-rs/wasm-runtime": "^0.2.11" }, "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=14.0.0" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC", - "optional": true + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/accepts": { "version": "1.3.8", @@ -2262,50 +2498,10 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "optional": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -2352,7 +2548,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2388,28 +2584,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "license": "ISC", - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2417,12 +2591,52 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2433,95 +2647,214 @@ "node": ">=8" } }, - "node_modules/aws-ssl-profiles": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" + "@types/babel__core": "^7.20.5" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/babel-preset-current-node-syntax": { @@ -2552,28 +2885,31 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "devOptional": true, - "license": "MIT" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", + "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -2608,6 +2944,20 @@ "node": ">=6.0.0" } }, + "node_modules/better-sqlite3": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.2.tgz", + "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": "20.x || 22.x || 23.x || 24.x || 25.x" + } + }, "node_modules/bindings": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", @@ -2668,13 +3018,16 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", + "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/braces": { @@ -2765,6 +3118,16 @@ "dev": true, "license": "MIT" }, + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -2774,56 +3137,25 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "license": "ISC", - "optional": true, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" + "node": ">= 0.4" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cacache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC", - "optional": true - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -2922,18 +3254,15 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -2947,22 +3276,12 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", "dev": true, "license": "MIT" }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3016,16 +3335,6 @@ "dev": true, "license": "MIT" }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "optional": true, - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", @@ -3041,20 +3350,6 @@ "node": ">=14" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC", - "optional": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -3098,28 +3393,6 @@ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3135,6 +3408,60 @@ "node": ">= 8" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -3208,23 +3535,52 @@ "node": ">=0.10.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", @@ -3262,16 +3618,6 @@ "node": ">=8" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3298,18 +3644,6 @@ "node": ">=6.0.0" } }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3324,6 +3658,13 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3331,9 +3672,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", "dev": true, "license": "ISC" }, @@ -3354,7 +3695,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -3366,29 +3707,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -3441,23 +3759,6 @@ "node": ">=10.0.0" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "license": "MIT", - "optional": true - }, "node_modules/error-ex": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", @@ -3468,6 +3769,75 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -3486,6 +3856,34 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", + "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.1", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -3498,6 +3896,53 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3583,116 +4028,458 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/eslint-config-standard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", + "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "peerDependencies": { + "eslint": "^8.8.0", + "eslint-plugin-react": "^7.28.0" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "debug": "^3.2.7" }, "engines": { - "node": "*" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8.10.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=0.10" + "node": ">=4" } }, - "node_modules/esrecurse": { - "version": "4.3.0", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", + "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, @@ -3757,11 +4544,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -3776,20 +4564,21 @@ } }, "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/express": { @@ -4028,6 +4817,52 @@ "dev": true, "license": "ISC" }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -4052,23 +4887,11 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -4095,25 +4918,35 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/generate-function": { @@ -4125,6 +4958,16 @@ "is-property": "^1.0.2" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4191,6 +5034,19 @@ "node": ">= 0.4" } }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -4204,6 +5060,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/getopts": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", @@ -4221,7 +5095,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -4251,30 +5125,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "devOptional": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -4291,6 +5141,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -4328,7 +5195,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/graphemer": { @@ -4338,6 +5205,19 @@ "dev": true, "license": "MIT" }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4348,6 +5228,35 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -4360,12 +5269,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC", - "optional": true + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/hasown": { "version": "2.0.2", @@ -4386,13 +5304,6 @@ "dev": true, "license": "MIT" }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause", - "optional": true - }, "node_modules/http-errors": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", @@ -4413,35 +5324,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -4452,16 +5334,6 @@ "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -4551,35 +5423,18 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "license": "ISC", - "optional": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "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.", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -4598,6 +5453,21 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", @@ -4607,16 +5477,6 @@ "node": ">= 0.10" } }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -4626,6 +5486,24 @@ "node": ">= 0.10" } }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -4633,13 +5511,18 @@ "dev": true, "license": "MIT" }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4648,59 +5531,210 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "devOptional": true, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "hasown": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", @@ -4708,6 +5742,23 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -4730,6 +5781,54 @@ "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -4743,11 +5842,115 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/istanbul-lib-coverage": { @@ -4793,15 +5996,15 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, "license": "BSD-3-Clause", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "istanbul-lib-coverage": "^3.0.0" }, "engines": { "node": ">=10" @@ -4821,23 +6024,57 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -4849,76 +6086,75 @@ } }, "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", "dev": true, "license": "MIT", "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", + "execa": "^5.1.1", + "jest-util": "30.2.0", "p-limit": "^3.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "chalk": "^4.0.0", + "chalk": "^4.1.2", "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "yargs": "^17.7.2" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -4930,215 +6166,233 @@ } }, "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", + "pretty-format": "30.2.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "@types/node": "*", + "esbuild-register": ">=3.4.0", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "esbuild-register": { + "optional": true + }, "ts-node": { "optional": true } } }, + "node_modules/jest-config/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", "dev": true, "license": "MIT", "dependencies": { - "detect-newline": "^3.0.0" + "detect-newline": "^3.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", + "@jest/types": "30.2.0", "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", "walker": "^1.0.8" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" }, "optionalDependencies": { - "fsevents": "^2.3.2" + "fsevents": "^2.3.3" } }, "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", "dev": true, "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "stack-utils": "^2.0.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.2.0", "@types/node": "*", - "jest-util": "^29.7.0" + "jest-util": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-pnp-resolver": { @@ -5160,183 +6414,219 @@ } }, "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", "dev": true, "license": "MIT", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "chalk": "^4.0.0", + "chalk": "^4.1.2", "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "node_modules/jest-runtime/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", + "@jest/types": "30.2.0", "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "^29.7.0" + "pretty-format": "30.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { @@ -5353,39 +6643,40 @@ } }, "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" + "jest-util": "30.2.0", + "string-length": "^4.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "jest-util": "^29.7.0", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "supports-color": "^8.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { @@ -5444,6 +6735,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -5478,6 +6776,22 @@ "node": ">=6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5488,16 +6802,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/knex": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", @@ -5612,6 +6916,19 @@ "dev": true, "license": "MIT" }, + "node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5647,6 +6964,19 @@ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5688,54 +7018,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "license": "ISC", - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC", - "optional": true - }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -5869,16 +7151,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz", + "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5894,122 +7176,13 @@ } }, "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp-classic": { @@ -6078,6 +7251,22 @@ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "license": "MIT" }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6085,6 +7274,13 @@ "dev": true, "license": "MIT" }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -6106,35 +7302,33 @@ "node": ">=10" } }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, - "node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" }, "engines": { - "node": ">= 10.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/node-int64": { @@ -6151,22 +7345,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -6190,21 +7368,14 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=0.10.0" } }, "node_modules/object-inspect": { @@ -6219,6 +7390,106 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -6271,7 +7542,25 @@ "word-wrap": "^1.2.5" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/p-limit": { @@ -6306,22 +7595,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6332,6 +7605,13 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6387,7 +7667,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6409,6 +7689,30 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -6451,6 +7755,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", @@ -6461,6 +7775,111 @@ "node": ">= 6" } }, + "node_modules/pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-conf/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -6530,10 +7949,21 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", @@ -6567,18 +7997,18 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -6594,40 +8024,24 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC", - "optional": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "license": "MIT", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } + "license": "MIT" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -6663,9 +8077,9 @@ } }, "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", "dev": true, "funding": [ { @@ -6796,6 +8210,63 @@ "node": ">= 10.13.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6859,26 +8330,6 @@ "node": ">=4" } }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -6895,7 +8346,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -6957,6 +8408,26 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -6977,6 +8448,41 @@ ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -7051,16 +8557,58 @@ "send": "~0.19.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC", - "optional": true - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7166,7 +8714,7 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/simple-concat": { @@ -7214,13 +8762,6 @@ "simple-concat": "^1.0.0" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true, - "license": "MIT" - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -7231,17 +8772,6 @@ "node": ">=8" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/socket.io-client": { "version": "4.8.3", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.3.tgz", @@ -7270,36 +8800,6 @@ "node": ">=10.0.0" } }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "license": "MIT", - "optional": true, - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7343,118 +8843,384 @@ "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" } }, - "node_modules/sqlite3": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", - "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", - "hasInstallScript": true, - "license": "BSD-3-Clause", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" + "escape-string-regexp": "^2.0.0" }, - "optionalDependencies": { - "node-gyp": "8.x" + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/standard-engine": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "get-stdin": "^8.0.0", + "minimist": "^1.2.6", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" }, - "peerDependencies": { - "node-gyp": "8.x" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/standard-engine/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } + "engines": { + "node": ">=6" } }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "license": "ISC", - "optional": true, + "node_modules/standard-engine/node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.1.1" + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" }, "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/standard-engine/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^2.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/standard-engine/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/standard-engine/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/standard-engine/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-engine/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-engine/node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/standard-engine/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/standard-engine/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.2.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/strip-ansi": { + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -7521,22 +9287,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "@pkgr/core": "^0.2.9" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" } }, "node_modules/tar-fs": { @@ -7551,12 +9315,6 @@ "tar-stream": "^2.1.4" } }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC" - }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -7573,127 +9331,412 @@ "node": ">=6" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/tarn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", + "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, "engines": { "node": ">=8" } }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" }, - "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-standard": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/ts-standard/-/ts-standard-12.0.2.tgz", + "integrity": "sha512-XX2wrB9fKKTfBj4yD3ABm9iShzZcS2iWcPK8XzlBvuL20+wMiLgiz/k5tXgZwTaYq5wRhbks1Y9PelhujF/9ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^8.0.1", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-config-standard-with-typescript": "^23.0.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0", + "eslint-plugin-react": "^7.28.0", + "minimist": "^1.2.6", + "pkg-conf": "^4.0.0", + "standard-engine": "^15.0.0" + }, + "bin": { + "ts-standard": "cli.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/ts-standard/node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ts-standard/node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ts-standard/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/ts-standard/node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ts-standard/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/ts-standard/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ts-standard/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/ts-standard/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/ts-standard/node_modules/eslint-config-standard-with-typescript": { + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-23.0.0.tgz", + "integrity": "sha512-iaaWifImn37Z1OXbNW1es7KI+S7D408F9ys0bpaQf2temeBWlvb0Nc5qHkOgYaRb5QxTZT32GGeN1gtswASOXA==", + "deprecated": "Please use eslint-config-love, instead.", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@typescript-eslint/parser": "^5.0.0", + "eslint-config-standard": "17.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0", + "typescript": "*" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/ts-standard/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause", "dependencies": { - "brace-expansion": "^1.1.7" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "node_modules/ts-standard/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "MIT" - }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "minimist": "^1.2.0" }, - "engines": { - "node": ">=8.0" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=0.6" + "node": ">=4" } }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, "engines": { - "node": ">=16" + "node": ">= 6" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -7755,6 +9798,84 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -7769,6 +9890,25 @@ "node": ">=14.17" } }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -7776,26 +9916,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "license": "ISC", - "optional": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -7805,6 +9925,41 @@ "node": ">= 0.8" } }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -7899,7 +10054,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -7911,14 +10066,93 @@ "node": ">= 8" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "optional": true, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/word-wrap": { @@ -7949,6 +10183,25 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7956,17 +10209,30 @@ "license": "ISC" }, "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "signal-exit": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ws": { @@ -7990,6 +10256,16 @@ } } }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/xmlhttprequest-ssl": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", diff --git a/package.json b/package.json index 1476bc5..61bf97b 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,13 @@ { "name": "@bsv/simple", - "version": "0.2.0", + "version": "0.2.3", "description": "Simplified, modular helper library for BSV blockchain development", "main": "dist/index.js", "types": "dist/index.d.ts", + "repository": { + "type": "git", + "url": "git+https://github.com/bsv-blockchain/simple.git" + }, "exports": { ".": { "types": "./dist/index.d.ts", @@ -22,7 +26,8 @@ "build": "tsc", "dev": "tsc --watch", "test": "jest", - "lint": "eslint src --ext .ts", + "lint": "ts-standard --fix src/**/*.ts", + "lint:ci": "ts-standard src/**/*.ts", "prepublishOnly": "npm run build" }, "keywords": [ @@ -38,17 +43,24 @@ "author": "", "license": "MIT", "dependencies": { - "@bsv/sdk": "^1.10.1", - "@bsv/wallet-toolbox": "^1.8.2", - "@bsv/message-box-client": "^1.4.5", - "dotenv": "^16.4.7" + "@bsv/message-box-client": "^2.0.2", + "@bsv/sdk": "^2.0.4", + "@bsv/wallet-toolbox": "^2.0.19", + "@bsv/wallet-toolbox-client": "^2.0.19" + }, + "overrides": { + "minimatch": "^10.2.1" + }, + "ts-standard": { + "project": "tsconfig.eslint.json", + "ignore": [ + "dist" + ] }, "devDependencies": { "@types/node": "^20.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "eslint": "^8.0.0", - "jest": "^29.0.0", + "jest": "^30.2.0", + "ts-standard": "^12.0.2", "typescript": "^5.3.0" }, "files": [ diff --git a/src/browser.ts b/src/browser.ts index 7ac094d..18090cb 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -44,7 +44,7 @@ export type BrowserWallet = _BrowserWallet // ============================================================================ export async function createWallet(defaults?: Partial): Promise { - const client = new WalletClient() + const client = new WalletClient('auto', 'simple') const { publicKey } = await client.getPublicKey({ identityKey: true }) const wallet = new _BrowserWallet(client, publicKey, defaults) diff --git a/src/core/WalletCore.ts b/src/core/WalletCore.ts index 64386a4..c1eb3a8 100644 --- a/src/core/WalletCore.ts +++ b/src/core/WalletCore.ts @@ -7,9 +7,9 @@ import { PushDrop, SecurityLevel, Random, - Transaction, WalletInterface } from '@bsv/sdk' +import { PeerPayClient } from '@bsv/message-box-client' import { mergeDefaults } from './defaults' import { WalletDefaults, @@ -20,7 +20,6 @@ import { SendResult, SendOutputDetail, TransactionResult, - ReinternalizeResult, PaymentRequest } from './types' @@ -28,26 +27,26 @@ export abstract class WalletCore { public readonly identityKey: string public readonly defaults: WalletDefaults - constructor(identityKey: string, defaults?: Partial) { + constructor (identityKey: string, defaults?: Partial) { this.identityKey = identityKey - this.defaults = mergeDefaults(defaults || {}) + this.defaults = mergeDefaults(defaults ?? {}) } - abstract getClient(): WalletInterface + abstract getClient (): WalletInterface // ============================================================================ // Wallet Info // ============================================================================ - getIdentityKey(): string { + getIdentityKey (): string { return this.identityKey } - getAddress(): string { + getAddress (): string { return PublicKey.fromString(this.identityKey).toAddress() } - getStatus(): WalletStatus { + getStatus (): WalletStatus { return { isConnected: true, identityKey: this.identityKey, @@ -55,7 +54,7 @@ export abstract class WalletCore { } } - getWalletInfo(): WalletInfo { + getWalletInfo (): WalletInfo { return { identityKey: this.identityKey, address: this.getAddress(), @@ -68,7 +67,7 @@ export abstract class WalletCore { // Key Derivation // ============================================================================ - async derivePublicKey( + async derivePublicKey ( protocolID: [SecurityLevel, string], keyID: string, counterparty?: string, @@ -77,15 +76,15 @@ export abstract class WalletCore { const result = await this.getClient().getPublicKey({ protocolID, keyID, - counterparty: counterparty || 'anyone', + counterparty: counterparty ?? 'anyone', forSelf: forSelf ?? false }) return result.publicKey } - async derivePaymentKey(counterparty: string, invoiceNumber?: string): Promise { + async derivePaymentKey (counterparty: string, invoiceNumber?: string): Promise { const protocolID: [SecurityLevel, string] = [2 as SecurityLevel, '3241645161d8'] - const keyID = invoiceNumber || Math.random().toString(36).substring(2) + const keyID = invoiceNumber ?? Math.random().toString(36).substring(2) const result = await this.getClient().getPublicKey({ protocolID, keyID, @@ -99,16 +98,15 @@ export abstract class WalletCore { // Multi-Output Send (core primitive) // ============================================================================ - private convertDataElement(element: string | object | number[]): number[] { + private convertDataElement (element: string | object | number[]): number[] { if (Array.isArray(element)) return element - if (typeof element === 'object' && element !== null) - return Array.from(Utils.toArray(JSON.stringify(element), 'utf8')) + if (typeof element === 'object' && element !== null) { return Array.from(Utils.toArray(JSON.stringify(element), 'utf8')) } return Array.from(Utils.toArray(String(element), 'utf8')) } - async send(options: SendOptions): Promise { + async send (options: SendOptions): Promise { try { - if (!options.outputs || options.outputs.length === 0) { + if (options.outputs == null || options.outputs.length === 0) { throw new Error('At least one output is required') } @@ -118,9 +116,9 @@ export abstract class WalletCore { for (let i = 0; i < options.outputs.length; i++) { const spec = options.outputs[i] - const desc = spec.description || this.defaults.outputDescription + const desc = spec.description ?? this.defaults.outputDescription - if (spec.data && !spec.to) { + if ((spec.data != null) && (spec.to == null)) { // OP_RETURN: data fields, no recipient const script = new Script() .writeOpCode(OP.OP_FALSE) @@ -132,17 +130,16 @@ export abstract class WalletCore { lockingScript: script.toHex(), satoshis: 0, outputDescription: desc, - ...(spec.basket ? { basket: spec.basket } : {}) + ...(spec.basket != null ? { basket: spec.basket } : {}) }) outputDetails.push({ index: i, type: 'op_return', satoshis: 0, description: desc }) - - } else if (spec.to && spec.data) { + } else if ((spec.to != null) && (spec.data != null)) { // PushDrop: data fields locked to recipient const sats = spec.satoshis ?? 1 if (sats < 1) throw new Error(`PushDrop output #${i} needs satoshis >= 1`) - const protocolID = (spec.protocolID || this.defaults.tokenProtocolID) as [SecurityLevel, string] - const keyID = spec.keyID || Utils.toBase64(Random(8)) - const basket = spec.basket || this.defaults.tokenBasket + const protocolID = (spec.protocolID ?? this.defaults.tokenProtocolID) as [SecurityLevel, string] + const keyID = spec.keyID ?? Utils.toBase64(Random(8)) + const basket = spec.basket ?? this.defaults.tokenBasket const fields = spec.data.map(el => this.convertDataElement(el)) const pushdrop = new PushDrop(client) @@ -164,8 +161,7 @@ export abstract class WalletCore { tags: ['token'] }) outputDetails.push({ index: i, type: 'pushdrop', satoshis: sats, description: desc }) - - } else if (spec.to && !spec.data) { + } else if ((spec.to != null) && (spec.data == null)) { // P2PKH: simple payment const sats = spec.satoshis ?? 0 if (sats <= 0) throw new Error(`P2PKH output #${i} needs satoshis > 0`) @@ -178,35 +174,23 @@ export abstract class WalletCore { lockingScript, satoshis: sats, outputDescription: desc, - ...(spec.basket ? { basket: spec.basket } : {}) + ...(spec.basket != null ? { basket: spec.basket } : {}) }) outputDetails.push({ index: i, type: 'p2pkh', satoshis: sats, description: desc }) - } else { throw new Error(`Output #${i}: must have 'to' (P2PKH), 'data' (OP_RETURN), or both (PushDrop)`) } } const result = await client.createAction({ - description: options.description || this.defaults.description, + description: options.description ?? this.defaults.description, outputs: actionOutputs, options: { randomizeOutputs: false } }) - let reinternalized: ReinternalizeResult | undefined - if (options.changeBasket) { - if (result.tx) { - const skipIndexes = actionOutputs.map((_: any, i: number) => i) - reinternalized = await this.reinternalizeChange(result.tx, options.changeBasket, skipIndexes) - } else { - reinternalized = { count: 0, errors: ['result.tx is missing from createAction response'] } - } - } - return { - txid: result.txid || '', + txid: result.txid ?? '', tx: result.tx, - reinternalized, outputDetails } } catch (error) { @@ -218,67 +202,22 @@ export abstract class WalletCore { // Pay (convenience wrapper around send) // ============================================================================ - async pay(options: PaymentOptions): Promise { + async pay (options: PaymentOptions): Promise { try { - const client = this.getClient() - const outputs: any[] = [] - - let recipientKey = options.to - if (options.derivationPrefix || options.derivationSuffix) { - const invoiceNumber = options.derivationPrefix && options.derivationSuffix - ? `${options.derivationPrefix}-${options.derivationSuffix}` - : options.derivationPrefix || options.derivationSuffix || undefined - recipientKey = await this.derivePaymentKey(options.to, invoiceNumber) - } - - const lockingScript = new P2PKH() - .lock(PublicKey.fromString(recipientKey).toAddress()) - .toHex() - - outputs.push({ - lockingScript, - satoshis: options.satoshis, - outputDescription: this.defaults.outputDescription, - ...(options.basket ? { basket: options.basket } : {}) + const peerPay = new PeerPayClient({ + walletClient: this.getClient() as any, + messageBoxHost: this.defaults.messageBoxHost, + enableLogging: false }) - if (options.memo) { - const memoScript = new Script() - .writeOpCode(OP.OP_FALSE) - .writeOpCode(OP.OP_RETURN) - .writeBin(Array.from(Utils.toArray(options.memo, 'utf8'))) - outputs.push({ - lockingScript: memoScript.toHex(), - satoshis: 0, - outputDescription: 'Payment memo' - }) - } - - const result = await client.createAction({ - description: options.description || this.defaults.description, - outputs, - options: { randomizeOutputs: false } + const result = await peerPay.sendPayment({ + recipient: options.to, + amount: options.satoshis }) - let reinternalized: ReinternalizeResult | undefined - if (options.changeBasket) { - if (result.tx) { - const skipIndexes = outputs.map((_: any, i: number) => i) - reinternalized = await this.reinternalizeChange(result.tx, options.changeBasket, skipIndexes) - } else { - reinternalized = { count: 0, errors: ['result.tx is missing from createAction response'] } - } - } - return { - txid: result.txid || '', - tx: result.tx, - reinternalized, - outputs: outputs.map((out, index) => ({ - index, - satoshis: out.satoshis, - lockingScript: out.lockingScript - })) + txid: result?.txid ?? '', + tx: result?.tx } } catch (error) { throw new Error(`Payment failed: ${(error as Error).message}`) @@ -289,7 +228,7 @@ export abstract class WalletCore { // Fund Server Wallet // ============================================================================ - async fundServerWallet(request: PaymentRequest, basket?: string, changeBasket?: string): Promise { + async fundServerWallet (request: PaymentRequest, basket?: string): Promise { try { const client = this.getClient() const protocolID: [SecurityLevel, string] = [2 as SecurityLevel, '3241645161d8'] @@ -310,10 +249,10 @@ export abstract class WalletCore { lockingScript, satoshis: request.satoshis, outputDescription: `Server wallet funding: ${request.satoshis} sats`, - ...(basket ? { basket } : {}) + ...(basket != null ? { basket } : {}) }] - if (request.memo) { + if (request.memo != null && request.memo !== '') { const memoScript = new Script() .writeOpCode(OP.OP_FALSE) .writeOpCode(OP.OP_RETURN) @@ -326,25 +265,14 @@ export abstract class WalletCore { } const result = await client.createAction({ - description: request.memo || `Fund server wallet (${request.satoshis} sats)`, + description: request.memo ?? `Fund server wallet (${request.satoshis} sats)`, outputs, options: { randomizeOutputs: false } }) - let reinternalized: ReinternalizeResult | undefined - if (changeBasket) { - if (result.tx) { - const skipIndexes = outputs.map((_: any, i: number) => i) - reinternalized = await this.reinternalizeChange(result.tx, changeBasket, skipIndexes) - } else { - reinternalized = { count: 0, errors: ['result.tx is missing from createAction response'] } - } - } - return { - txid: result.txid || '', + txid: result.txid ?? '', tx: result.tx, - reinternalized, outputs: outputs.map((out, index) => ({ index, satoshis: out.satoshis, @@ -355,123 +283,4 @@ export abstract class WalletCore { throw new Error(`Server wallet funding failed: ${(error as Error).message}`) } } - - // ============================================================================ - // Change Output Re-internalization - // ============================================================================ - - async reinternalizeChange( - tx: number[], - basket: string, - skipOutputIndexes: number[] = [0] - ): Promise { - if (!tx || tx.length === 0) { - return { count: 0, errors: ['No tx bytes available for reinternalization'] } - } - - interface ChangeOutput { index: number; satoshis: number } - let changeOutputs: ChangeOutput[] = [] - - try { - const transaction = Transaction.fromAtomicBEEF(tx) - const totalOutputs = transaction.outputs.length - - for (let i = 0; i < totalOutputs; i++) { - if (skipOutputIndexes.includes(i)) continue - const output = transaction.outputs[i] - const sats = output.satoshis ?? 0 - if (sats === 0) continue - changeOutputs.push({ index: i, satoshis: sats }) - } - } catch (parseError) { - return { count: 0, errors: ['Failed to parse transaction'] } - } - - if (changeOutputs.length === 0) { - return { count: 0, errors: [] } - } - - // Skip the largest change output — the wallet tracks it automatically - if (changeOutputs.length > 1) { - const largestIdx = changeOutputs.reduce((maxI, cur, i, arr) => - cur.satoshis > arr[maxI].satoshis ? i : maxI, 0) - changeOutputs.splice(largestIdx, 1) - } else { - return { count: 0, errors: [] } - } - - if (changeOutputs.length === 0) { - return { count: 0, errors: [] } - } - - // Wait for broadcast with exponential backoff - const client = this.getClient() - const MAX_WAIT_MS = 30000 - let delay = 2000 - const startTime = Date.now() - let broadcastReady = false - let probeError = '' - - while (Date.now() - startTime < MAX_WAIT_MS) { - try { - await client.internalizeAction({ - tx, - outputs: [{ - outputIndex: changeOutputs[0].index, - protocol: 'basket insertion', - insertionRemittance: { - basket, - customInstructions: 'change', - tags: ['change'] - } - }], - description: `Recover orphaned change output #${changeOutputs[0].index}` - } as any) - broadcastReady = true - break - } catch (error) { - const msg = (error as Error).message || String(error) - if (!msg.includes('sending')) { - probeError = msg - break - } - await new Promise(r => setTimeout(r, delay)) - delay = Math.min(delay * 2, 16000) - } - } - - if (!broadcastReady) { - const reason = probeError || 'Transaction broadcast did not complete within 30s timeout' - return { count: 0, errors: [reason] } - } - - // First output already recovered by probe — process remaining - let count = 1 - const errors: string[] = [] - - for (let i = 1; i < changeOutputs.length; i++) { - const { index: idx } = changeOutputs[i] - try { - await client.internalizeAction({ - tx, - outputs: [{ - outputIndex: idx, - protocol: 'basket insertion', - insertionRemittance: { - basket, - customInstructions: 'change', - tags: ['change'] - } - }], - description: `Recover orphaned change output #${idx}` - } as any) - count++ - } catch (error) { - const msg = (error as Error).message || String(error) - errors.push(`output #${idx}: ${msg}`) - } - } - - return { count, errors } - } } diff --git a/src/core/defaults.ts b/src/core/defaults.ts index 6fa7052..fed0377 100644 --- a/src/core/defaults.ts +++ b/src/core/defaults.ts @@ -5,7 +5,6 @@ export const DEFAULT_CONFIG: WalletDefaults = { network: 'main', description: 'BSV-Simplify transaction', outputDescription: 'BSV-Simplify output', - changeBasket: undefined, tokenBasket: 'tokens', tokenProtocolID: [0 as SecurityLevel, 'token'], tokenKeyID: '1', @@ -13,9 +12,9 @@ export const DEFAULT_CONFIG: WalletDefaults = { registryUrl: undefined, didBasket: 'did-chain', didResolverUrl: 'https://bsvdid-universal-resolver.nchain.systems', - didProtocolID: [0 as SecurityLevel, 'bsvdid'], + didProtocolID: [0 as SecurityLevel, 'bsvdid'] } -export function mergeDefaults(partial: Partial): WalletDefaults { +export function mergeDefaults (partial: Partial): WalletDefaults { return { ...DEFAULT_CONFIG, ...partial } } diff --git a/src/core/errors.ts b/src/core/errors.ts index d61a882..6beba69 100644 --- a/src/core/errors.ts +++ b/src/core/errors.ts @@ -1,47 +1,47 @@ export class SimpleError extends Error { - constructor(message: string, public code?: string) { + constructor (message: string, public code?: string) { super(message) this.name = 'SimpleError' } } export class WalletError extends SimpleError { - constructor(message: string) { + constructor (message: string) { super(message, 'WALLET_ERROR') this.name = 'WalletError' } } export class TransactionError extends SimpleError { - constructor(message: string) { + constructor (message: string) { super(message, 'TRANSACTION_ERROR') this.name = 'TransactionError' } } export class MessageBoxError extends SimpleError { - constructor(message: string) { + constructor (message: string) { super(message, 'MESSAGEBOX_ERROR') this.name = 'MessageBoxError' } } export class CertificationError extends SimpleError { - constructor(message: string) { + constructor (message: string) { super(message, 'CERTIFICATION_ERROR') this.name = 'CertificationError' } } export class DIDError extends SimpleError { - constructor(message: string) { + constructor (message: string) { super(message, 'DID_ERROR') this.name = 'DIDError' } } export class CredentialError extends SimpleError { - constructor(message: string) { + constructor (message: string) { super(message, 'CREDENTIAL_ERROR') this.name = 'CredentialError' } diff --git a/src/core/types.ts b/src/core/types.ts index 1d170c9..cd3c3d5 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -14,7 +14,6 @@ export interface WalletDefaults { network: Network description: string outputDescription: string - changeBasket?: string tokenBasket: string tokenProtocolID: [SecurityLevel, string] tokenKeyID: string @@ -34,7 +33,6 @@ export interface TransactionResult { txid: string tx: any outputs?: OutputInfo[] - reinternalized?: ReinternalizeResult } export interface OutputInfo { @@ -44,11 +42,6 @@ export interface OutputInfo { description?: string } -export interface ReinternalizeResult { - count: number - errors: string[] -} - // ============================================================================ // Wallet Status // ============================================================================ @@ -75,10 +68,6 @@ export interface PaymentOptions { satoshis: number memo?: string description?: string - basket?: string - changeBasket?: string - derivationPrefix?: string - derivationSuffix?: string } // ============================================================================ @@ -88,7 +77,7 @@ export interface PaymentOptions { export interface SendOutputSpec { to?: string satoshis?: number - data?: (string | object | number[])[] + data?: Array description?: string basket?: string protocolID?: [number, string] @@ -105,7 +94,6 @@ export interface SendOutputDetail { export interface SendOptions { outputs: SendOutputSpec[] description?: string - changeBasket?: string } export interface SendResult extends TransactionResult { @@ -240,7 +228,7 @@ export interface OverlayInfo { export interface OverlayBroadcastResult { success: boolean txid?: string - steak?: Record + steak?: Record code?: string description?: string } @@ -312,8 +300,8 @@ export interface DIDDocumentV2 { id: string controller?: string verificationMethod: DIDVerificationMethodV2[] - authentication: (string | DIDVerificationMethodV2)[] - assertionMethod?: (string | DIDVerificationMethodV2)[] + authentication: Array + assertionMethod?: Array service?: DIDService[] } @@ -321,7 +309,7 @@ export interface DIDVerificationMethodV2 { id: string type: string controller: string - publicKeyJwk: { kty: string; crv: string; x: string; y: string } + publicKeyJwk: { kty: string, crv: string, x: string, y: string } } export interface DIDService { @@ -392,7 +380,7 @@ export interface CredentialFieldSchema { required?: boolean placeholder?: string format?: string - options?: { value: string; label: string }[] + options?: Array<{ value: string, label: string }> helpText?: string group?: string } @@ -403,7 +391,7 @@ export interface CredentialSchemaConfig { description?: string certificateTypeBase64?: string fields: CredentialFieldSchema[] - fieldGroups?: { key: string; label: string }[] + fieldGroups?: Array<{ key: string, label: string }> validate?: (values: Record) => string | null computedFields?: (values: Record) => Record } @@ -482,11 +470,11 @@ export interface RevocationRecord { } export interface RevocationStore { - save(serialNumber: string, record: RevocationRecord): Promise - load(serialNumber: string): Promise - delete(serialNumber: string): Promise - has(serialNumber: string): Promise - findByOutpoint(outpoint: string): Promise + save: (serialNumber: string, record: RevocationRecord) => Promise + load: (serialNumber: string) => Promise + delete: (serialNumber: string) => Promise + has: (serialNumber: string) => Promise + findByOutpoint: (outpoint: string) => Promise } // ============================================================================ @@ -500,8 +488,8 @@ export interface RegistryEntry { } export interface IdentityRegistryStore { - load(): RegistryEntry[] - save(entries: RegistryEntry[]): void + load: () => RegistryEntry[] + save: (entries: RegistryEntry[]) => void } export interface IdentityRegistryConfig { diff --git a/src/index.ts b/src/index.ts index 15e7b4f..3217b59 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,10 @@ -// Browser-compatible exports +// Browser-safe default entrypoint +// Server-only exports are available via '@bsv/simple/server' + export { createWallet, Wallet, Overlay, Certifier, WalletCore } from './browser' export type { BrowserWallet } from './browser' -// DID & Credentials +// DID & Credentials (browser-safe) export { DID } from './modules/did' export { CredentialSchema, @@ -12,34 +14,12 @@ export { toVerifiablePresentation } from './modules/credentials' -// Server-only exports -export { - ServerWallet, - generatePrivateKey, - // Handler utilities - JsonFileStore, - toNextHandlers, - // Identity Registry - IdentityRegistry, - createIdentityRegistryHandler, - // DID Resolver - DIDResolverService, - createDIDResolverHandler, - // Server Wallet Manager - ServerWalletManager, - createServerWalletHandler, - // Credential Issuer Handler - createCredentialIssuerHandler -} from './server' -export { FileRevocationStore } from './modules/file-revocation-store' - // Types export type { Network, WalletDefaults, TransactionResult, OutputInfo, - ReinternalizeResult, WalletStatus, WalletInfo, PaymentOptions, diff --git a/src/modules/certification.ts b/src/modules/certification.ts index e103835..aa4c6c7 100644 --- a/src/modules/certification.ts +++ b/src/modules/certification.ts @@ -13,13 +13,13 @@ import { CertificateData } from '../core/types' // ============================================================================ export class Certifier { - private protoWallet: ProtoWallet - private pubKey: string - private certType: string - private defaultFields: Record - private includeTimestamp: boolean + private readonly protoWallet: ProtoWallet + private readonly pubKey: string + private readonly certType: string + private readonly defaultFields: Record + private readonly includeTimestamp: boolean - private constructor(config: { + private constructor (config: { privateKey: PrivateKey certificateType: string defaultFields: Record @@ -32,14 +32,14 @@ export class Certifier { this.includeTimestamp = config.includeTimestamp } - static async create(config?: { + static async create (config?: { privateKey?: string certificateType?: string defaultFields?: Record includeTimestamp?: boolean }): Promise { let key: PrivateKey - if (config?.privateKey) { + if (config?.privateKey != null) { key = new PrivateKey(config.privateKey, 'hex') } else { const bytes = Random(32) @@ -55,19 +55,19 @@ export class Certifier { }) } - getInfo(): { publicKey: string; certificateType: string } { + getInfo (): { publicKey: string, certificateType: string } { return { publicKey: this.pubKey, certificateType: this.certType } } - async certify(wallet: WalletCore, additionalFields?: Record): Promise { + async certify (wallet: WalletCore, additionalFields?: Record): Promise { try { const identityKey = wallet.getIdentityKey() const fields: Record = { ...this.defaultFields, ...additionalFields } - if (this.includeTimestamp && !fields.timestamp) { + if (this.includeTimestamp && fields.timestamp == null) { fields.timestamp = Math.floor(Date.now() / 1000).toString() } @@ -85,9 +85,9 @@ export class Certifier { subject: masterCert.subject, certifier: masterCert.certifier, revocationOutpoint: masterCert.revocationOutpoint, - fields: masterCert.fields as Record, + fields: masterCert.fields, signature: masterCert.signature as string, - keyringForSubject: masterCert.masterKeyring as Record + keyringForSubject: masterCert.masterKeyring } // Acquire certificate directly into the wallet @@ -114,9 +114,13 @@ export class Certifier { // Certificate methods that attach to a wallet // ============================================================================ -export function createCertificationMethods(core: WalletCore) { +export function createCertificationMethods (core: WalletCore): { + acquireCertificateFrom: (config: { serverUrl: string, replaceExisting?: boolean }) => Promise + listCertificatesFrom: (config: { certifiers: string[], types: string[], limit?: number }) => Promise<{ totalCertificates: number, certificates: any[] }> + relinquishCert: (args: { type: string, serialNumber: string, certifier: string }) => Promise +} { return { - async acquireCertificateFrom(config: { + async acquireCertificateFrom (config: { serverUrl: string replaceExisting?: boolean }): Promise { @@ -125,7 +129,7 @@ export function createCertificationMethods(core: WalletCore) { const infoRes = await fetch(`${config.serverUrl}?action=info`) if (!infoRes.ok) throw new Error(`Server returned ${infoRes.status}`) - const info = await infoRes.json() as { certifierPublicKey: string; certificateType: string } + const info = await infoRes.json() as { certifierPublicKey: string, certificateType: string } const { certifierPublicKey, certificateType } = info if (config.replaceExisting !== false) { @@ -134,7 +138,7 @@ export function createCertificationMethods(core: WalletCore) { types: [certificateType], limit: 100 }) - if (existing.certificates && existing.certificates.length > 0) { + if (existing.certificates.length > 0) { for (const cert of existing.certificates) { try { await client.relinquishCertificate({ @@ -154,7 +158,7 @@ export function createCertificationMethods(core: WalletCore) { }) if (!certRes.ok) { const errData = await certRes.json().catch(() => ({})) as { error?: string } - throw new Error(errData.error || `Server returned ${certRes.status}`) + throw new Error(errData.error ?? `Server returned ${certRes.status}`) } const certData = await certRes.json() as CertificateData @@ -176,11 +180,11 @@ export function createCertificationMethods(core: WalletCore) { } }, - async listCertificatesFrom(config: { + async listCertificatesFrom (config: { certifiers: string[] types: string[] limit?: number - }): Promise<{ totalCertificates: number; certificates: any[] }> { + }): Promise<{ totalCertificates: number, certificates: any[] }> { try { const result = await core.getClient().listCertificates({ certifiers: config.certifiers, @@ -189,14 +193,14 @@ export function createCertificationMethods(core: WalletCore) { }) return { totalCertificates: result.totalCertificates, - certificates: result.certificates || [] + certificates: result.certificates ?? [] } } catch (error) { throw new Error(`Failed to list certificates: ${(error as Error).message}`) } }, - async relinquishCert(args: { + async relinquishCert (args: { type: string serialNumber: string certifier: string diff --git a/src/modules/credentials.ts b/src/modules/credentials.ts index f6b6a3f..dde507d 100644 --- a/src/modules/credentials.ts +++ b/src/modules/credentials.ts @@ -20,7 +20,6 @@ import { RevocationStore } from '../core/types' import { CredentialError } from '../core/errors' -import { DID } from './did' // ============================================================================ // Constants @@ -35,13 +34,14 @@ const REVOCATION_TYPE = 'BSVHashLockRevocation2024' // ============================================================================ export class CredentialSchema { - private config: CredentialSchemaConfig + private readonly config: CredentialSchemaConfig - constructor(config: CredentialSchemaConfig) { + constructor (config: CredentialSchemaConfig) { this.config = { ...config, - certificateTypeBase64: config.certificateTypeBase64 || - Utils.toBase64(Utils.toArray(config.id, 'utf8')) + certificateTypeBase64: config.certificateTypeBase64 != null + ? config.certificateTypeBase64 + : Utils.toBase64(Utils.toArray(config.id, 'utf8')) } } @@ -49,16 +49,16 @@ export class CredentialSchema { * Validate field values against schema requirements. * Returns null if valid, or an error message string. */ - validate(values: Record): string | null { + validate (values: Record): string | null { // Check required fields for (const field of this.config.fields) { - if (field.required && !values[field.key]?.trim()) { + if (field.required === true && (values[field.key]?.trim() === '' || values[field.key]?.trim() == null)) { return `${field.label} is required` } } // Run custom validation - if (this.config.validate) { + if (this.config.validate != null) { return this.config.validate(values) } @@ -68,7 +68,7 @@ export class CredentialSchema { /** * Merge computed fields into values. */ - computeFields(values: Record): Record { + computeFields (values: Record): Record { const computed = this.config.computedFields?.(values) ?? {} return { ...values, ...computed } } @@ -76,18 +76,18 @@ export class CredentialSchema { /** * Get schema metadata. */ - getInfo(): { id: string; name: string; description?: string; certificateTypeBase64: string; fieldCount: number } { + getInfo (): { id: string, name: string, description?: string, certificateTypeBase64: string, fieldCount: number } { return { id: this.config.id, name: this.config.name, description: this.config.description, - certificateTypeBase64: this.config.certificateTypeBase64!, + certificateTypeBase64: this.config.certificateTypeBase64 as string, fieldCount: this.config.fields.length } } /** Get the full config. */ - getConfig(): CredentialSchemaConfig { + getConfig (): CredentialSchemaConfig { return this.config } } @@ -97,25 +97,25 @@ export class CredentialSchema { // ============================================================================ export class MemoryRevocationStore implements RevocationStore { - private records = new Map() + private readonly records = new Map() - async save(serialNumber: string, record: RevocationRecord): Promise { + async save (serialNumber: string, record: RevocationRecord): Promise { this.records.set(serialNumber, record) } - async load(serialNumber: string): Promise { + async load (serialNumber: string): Promise { return this.records.get(serialNumber) } - async delete(serialNumber: string): Promise { + async delete (serialNumber: string): Promise { this.records.delete(serialNumber) } - async has(serialNumber: string): Promise { + async has (serialNumber: string): Promise { return this.records.has(serialNumber) } - async findByOutpoint(outpoint: string): Promise { + async findByOutpoint (outpoint: string): Promise { for (const record of this.records.values()) { if (record.outpoint === outpoint) return true } @@ -128,15 +128,15 @@ export class MemoryRevocationStore implements RevocationStore { // ============================================================================ export class CredentialIssuer { - private protoWallet: ProtoWallet - private privateKey: PrivateKey - private pubKey: string - private schemas: Map - private revocationEnabled: boolean - private revocationWallet: any - private store: RevocationStore - - private constructor(config: { + private readonly protoWallet: ProtoWallet + private readonly privateKey: PrivateKey + private readonly pubKey: string + private readonly schemas: Map + private readonly revocationEnabled: boolean + private readonly revocationWallet: any + private readonly store: RevocationStore + + private constructor (config: { privateKey: PrivateKey schemas: Map revocationEnabled: boolean @@ -152,11 +152,11 @@ export class CredentialIssuer { this.store = config.store } - static async create(config: CredentialIssuerConfig): Promise { + static async create (config: CredentialIssuerConfig): Promise { const privateKey = new PrivateKey(config.privateKey, 'hex') const schemas = new Map() - if (config.schemas) { + if (config.schemas != null) { for (const sc of config.schemas) { schemas.set(sc.id, new CredentialSchema(sc)) } @@ -165,13 +165,15 @@ export class CredentialIssuer { const revocationEnabled = config.revocation?.enabled ?? false const revocationWallet = config.revocation?.wallet - if (revocationEnabled && !revocationWallet) { + if (revocationEnabled && revocationWallet == null) { throw new CredentialError('Revocation enabled but no wallet provided') } // Default to MemoryRevocationStore (browser-safe). // For Node.js servers, pass a FileRevocationStore via revocation.store. - const store: RevocationStore = (config.revocation as any)?.store || new MemoryRevocationStore() + const store: RevocationStore = (config.revocation as any)?.store != null + ? (config.revocation as any).store + : new MemoryRevocationStore() return new CredentialIssuer({ privateKey, @@ -185,20 +187,20 @@ export class CredentialIssuer { /** * Issue a Verifiable Credential. */ - async issue( + async issue ( subjectIdentityKey: string, schemaId: string, fields: Record ): Promise { // Lookup schema const schema = this.schemas.get(schemaId) - if (!schema) { + if (schema == null) { throw new CredentialError(`Unknown schema: ${schemaId}`) } // Validate const validationError = schema.validate(fields) - if (validationError) { + if (validationError != null) { throw new CredentialError(`Validation failed: ${validationError}`) } @@ -210,7 +212,7 @@ export class CredentialIssuer { let revocationSecret = '' let revocationBeef: number[] = [] - if (this.revocationEnabled && this.revocationWallet) { + if (this.revocationEnabled && this.revocationWallet != null) { const secretBytes = Random(32) revocationSecret = Utils.toHex(secretBytes) const hashBytes = Hash.sha256(secretBytes) @@ -232,12 +234,12 @@ export class CredentialIssuer { options: { randomizeOutputs: false } }) - if (!result.txid) { + if (result.txid == null || result.txid === '') { throw new CredentialError('Failed to create revocation UTXO: no txid returned') } - revocationOutpoint = `${result.txid}.0` - revocationBeef = result.tx ? Array.from(result.tx) : [] + revocationOutpoint = `${String(result.txid)}.0` + revocationBeef = result.tx != null ? Array.from(result.tx) : [] } // Issue MasterCertificate @@ -256,13 +258,13 @@ export class CredentialIssuer { subject: masterCert.subject, certifier: masterCert.certifier, revocationOutpoint: masterCert.revocationOutpoint, - fields: masterCert.fields as Record, + fields: masterCert.fields, signature: masterCert.signature as string, - keyringForSubject: masterCert.masterKeyring as Record + keyringForSubject: masterCert.masterKeyring } // Store revocation secret - if (this.revocationEnabled && revocationSecret) { + if (this.revocationEnabled && revocationSecret !== '') { await this.store.save(certData.serialNumber, { secret: revocationSecret, outpoint: revocationOutpoint, @@ -279,36 +281,35 @@ export class CredentialIssuer { /** * Verify a Verifiable Credential. */ - async verify(vc: VerifiableCredential): Promise { + async verify (vc: VerifiableCredential): Promise { const errors: string[] = [] // Check W3C context - if (!vc['@context'] || !vc['@context'].includes(VC_CONTEXT)) { + if (vc['@context'].length === 0 || !vc['@context'].includes(VC_CONTEXT)) { errors.push('Missing W3C VC context') } // Check type - if (!vc.type || !vc.type.includes('VerifiableCredential')) { + if (vc.type.length === 0 || !vc.type.includes('VerifiableCredential')) { errors.push('Missing VerifiableCredential type') } // Check proof - if (!vc.proof || !vc.proof.signatureValue) { + if (vc.proof?.signatureValue == null || vc.proof.signatureValue === '') { errors.push('Missing proof or signature') } // Check underlying certificate - if (!vc._bsv?.certificate) { + if (vc._bsv?.certificate == null) { errors.push('Missing BSV certificate data') } // Check revocation status let revoked = false - if (vc._bsv?.certificate) { - const cert = vc._bsv.certificate - const outpoint = cert.revocationOutpoint + if (vc._bsv?.certificate != null) { + const outpoint = vc._bsv.certificate.revocationOutpoint - if (outpoint && outpoint !== '00'.repeat(32) + '.0') { + if (outpoint != null && outpoint !== '00'.repeat(32) + '.0') { // Check if we have the secret (unspent = not revoked) const hasRecord = await this.store.findByOutpoint(outpoint) revoked = !hasRecord @@ -319,7 +320,6 @@ export class CredentialIssuer { errors.push('Credential has been revoked') } - const cert = vc._bsv?.certificate return { valid: errors.length === 0, revoked, @@ -333,13 +333,13 @@ export class CredentialIssuer { /** * Revoke a credential by spending its hash-locked UTXO. */ - async revoke(serialNumber: string): Promise<{ txid: string }> { - if (!this.revocationEnabled || !this.revocationWallet) { + async revoke (serialNumber: string): Promise<{ txid: string }> { + if (!this.revocationEnabled || this.revocationWallet == null) { throw new CredentialError('Revocation is not enabled') } const record = await this.store.load(serialNumber) - if (!record) { + if (record == null) { throw new CredentialError('Certificate already revoked or not found') } @@ -358,20 +358,20 @@ export class CredentialIssuer { options: { randomizeOutputs: false } }) - if (!result.txid) { + if (result.txid == null || result.txid === '') { throw new CredentialError('Revocation transaction failed: no txid returned') } // Only delete after successful spend await this.store.delete(serialNumber) - return { txid: result.txid } + return { txid: result.txid as string } } /** * Check if a credential has been revoked. */ - async isRevoked(serialNumber: string): Promise { + async isRevoked (serialNumber: string): Promise { const hasRecord = await this.store.has(serialNumber) return !hasRecord } @@ -379,8 +379,8 @@ export class CredentialIssuer { /** * Get issuer info. */ - getInfo(): { publicKey: string; did: string; schemas: { id: string; name: string }[] } { - const schemaList: { id: string; name: string }[] = [] + getInfo (): { publicKey: string, did: string, schemas: Array<{ id: string, name: string }> } { + const schemaList: Array<{ id: string, name: string }> = [] for (const [id, schema] of this.schemas) { const info = schema.getInfo() schemaList.push({ id, name: info.name }) @@ -401,15 +401,16 @@ export class CredentialIssuer { /** * Wrap a CertificateData into a W3C Verifiable Credential. */ -export function toVerifiableCredential( +export function toVerifiableCredential ( cert: CertificateData, issuerKey: string, options?: { credentialType?: string } ): VerifiableCredential { const now = new Date().toISOString() - const credentialType = options?.credentialType || 'BSVCertificate' + const credentialType = options?.credentialType ?? 'BSVCertificate' - const { revocationOutpoint, keyringForSubject, ...subjectFields } = cert.fields as any + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { revocationOutpoint: _rev, keyringForSubject: _kr, ...subjectRest } = cert.fields as any return { '@context': [VC_CONTEXT], @@ -442,7 +443,7 @@ export function toVerifiableCredential( /** * Wrap an array of VCs into a W3C Verifiable Presentation. */ -export function toVerifiablePresentation( +export function toVerifiablePresentation ( credentials: VerifiableCredential[], holderKey: string ): VerifiablePresentation { @@ -466,12 +467,16 @@ export function toVerifiablePresentation( // Wallet-integrated credential methods // ============================================================================ -export function createCredentialMethods(core: WalletCore) { +export function createCredentialMethods (core: WalletCore): { + acquireCredential: (config: { serverUrl: string, schemaId?: string, fields?: Record, replaceExisting?: boolean }) => Promise + listCredentials: (config: { certifiers: string[], types: string[], limit?: number }) => Promise + createPresentation: (credentials: VerifiableCredential[]) => VerifiablePresentation +} { return { /** * Acquire a Verifiable Credential from a remote issuer server. */ - async acquireCredential(config: { + async acquireCredential (config: { serverUrl: string schemaId?: string fields?: Record @@ -496,7 +501,7 @@ export function createCredentialMethods(core: WalletCore) { types: [certificateType], limit: 100 }) - if (existing.certificates && existing.certificates.length > 0) { + if (existing.certificates.length > 0) { for (const cert of existing.certificates) { try { await client.relinquishCertificate({ @@ -521,7 +526,7 @@ export function createCredentialMethods(core: WalletCore) { }) if (!certRes.ok) { const errData = await certRes.json().catch(() => ({})) as { error?: string } - throw new Error(errData.error || `Server returned ${certRes.status}`) + throw new Error(errData.error ?? `Server returned ${certRes.status}`) } const certData = await certRes.json() as CertificateData @@ -548,7 +553,7 @@ export function createCredentialMethods(core: WalletCore) { /** * List wallet certificates wrapped as Verifiable Credentials. */ - async listCredentials(config: { + async listCredentials (config: { certifiers: string[] types: string[] limit?: number @@ -560,19 +565,19 @@ export function createCredentialMethods(core: WalletCore) { limit: config.limit ?? 100 }) - const certs = result.certificates || [] + const certs = result.certificates ?? [] return certs.map((cert: any) => { - const issuerKey = cert.certifier || config.certifiers[0] + const issuerKey = (cert.certifier != null ? cert.certifier : config.certifiers[0]) as string return toVerifiableCredential( { type: cert.type, serialNumber: cert.serialNumber, subject: cert.subject, certifier: cert.certifier, - revocationOutpoint: cert.revocationOutpoint || '00'.repeat(32) + '.0', - fields: cert.fields || {}, - signature: cert.signature || '', - keyringForSubject: cert.keyringForSubject || {} + revocationOutpoint: cert.revocationOutpoint != null ? cert.revocationOutpoint : '00'.repeat(32) + '.0', + fields: cert.fields != null ? cert.fields : {}, + signature: cert.signature != null ? cert.signature : '', + keyringForSubject: cert.keyringForSubject != null ? cert.keyringForSubject : {} }, issuerKey ) @@ -585,7 +590,7 @@ export function createCredentialMethods(core: WalletCore) { /** * Wrap Verifiable Credentials into a Verifiable Presentation. */ - createPresentation(credentials: VerifiableCredential[]): VerifiablePresentation { + createPresentation (credentials: VerifiableCredential[]): VerifiablePresentation { return toVerifiablePresentation(credentials, core.getIdentityKey()) } } diff --git a/src/modules/did.ts b/src/modules/did.ts index 81ba2f3..0650008 100644 --- a/src/modules/did.ts +++ b/src/modules/did.ts @@ -40,14 +40,14 @@ const LEGACY_KEY_TYPE = 'EcdsaSecp256k1VerificationKey2019' // Utility Functions // ============================================================================ -function base64url(bytes: number[]): string { +function base64url (bytes: number[]): string { return Utils.toBase64(bytes) .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=+$/, '') } -function pubKeyToJwk(compressedHex: string): { kty: string; crv: string; x: string; y: string } { +function pubKeyToJwk (compressedHex: string): { kty: string, crv: string, x: string, y: string } { const pubKey = PublicKey.fromString(compressedHex) const xBytes = pubKey.getX().toArray('be', 32) const yBytes = pubKey.getY().toArray('be', 32) @@ -59,7 +59,7 @@ function pubKeyToJwk(compressedHex: string): { kty: string; crv: string; x: stri } } -function buildOpReturn(identityCode: string, payload: string): Script { +function buildOpReturn (identityCode: string, payload: string): Script { return new Script() .writeOpCode(OP.OP_FALSE) .writeOpCode(OP.OP_RETURN) @@ -68,11 +68,11 @@ function buildOpReturn(identityCode: string, payload: string): Script { .writeBin(Utils.toArray(payload, 'utf8')) } -function generateIdentityCode(): string { +function generateIdentityCode (): string { return Utils.toHex(Random(16)) } -function parseOpReturnSegments(scriptHex: string): string[] { +function parseOpReturnSegments (scriptHex: string): string[] { try { const script = Script.fromHex(scriptHex) const chunks = script.chunks @@ -88,8 +88,8 @@ function parseOpReturnSegments(scriptHex: string): string[] { const segments: string[] = [] for (let i = startIdx; i < chunks.length; i++) { - if (chunks[i].data) { - segments.push(new TextDecoder().decode(new Uint8Array(chunks[i].data!))) + if (chunks[i].data != null) { + segments.push(new TextDecoder().decode(new Uint8Array(chunks[i].data ?? []))) } } return segments @@ -102,12 +102,12 @@ function parseOpReturnSegments(scriptHex: string): string[] { // DID Utility Class (standalone — no wallet dependency) // ============================================================================ -export class DID { +export class DID { // eslint-disable-line @typescript-eslint/no-extraneous-class /** * Parse a did:bsv: string and extract the identifier (txid). */ - static parse(didString: string): DIDParseResult { - if (!didString || !didString.startsWith(DID_PREFIX)) { + static parse (didString: string): DIDParseResult { + if (didString === '' || !didString.startsWith(DID_PREFIX)) { throw new DIDError(`Invalid DID: must start with "${DID_PREFIX}"`) } @@ -126,7 +126,7 @@ export class DID { /** * Validate a did:bsv: string format. */ - static isValid(didString: string): boolean { + static isValid (didString: string): boolean { try { DID.parse(didString) return true @@ -138,7 +138,7 @@ export class DID { /** * Create a DID string from a transaction ID. */ - static fromTxid(txid: string): string { + static fromTxid (txid: string): string { if (!/^[0-9a-f]{64}$/.test(txid)) { throw new DIDError('Invalid txid: must be 64 lowercase hex characters') } @@ -148,7 +148,7 @@ export class DID { /** * Build a W3C DID Document (V2 spec-compliant, JsonWebKey2020). */ - static buildDocument( + static buildDocument ( txid: string, subjectPubKeyHex: string, controllerDID?: string, @@ -171,11 +171,11 @@ export class DID { authentication: [`${did}#subject-key`] } - if (controllerDID) { + if (controllerDID != null && controllerDID !== '') { doc.controller = controllerDID } - if (services && services.length > 0) { + if ((services != null) && services.length > 0) { doc.service = services } @@ -186,8 +186,8 @@ export class DID { * @deprecated Use DID.buildDocument() for spec-compliant documents. * Generate a legacy DID Document from an identity key (compressed public key hex). */ - static fromIdentityKey(identityKey: string): DIDDocument { - if (!identityKey || !/^[0-9a-fA-F]{66}$/.test(identityKey)) { + static fromIdentityKey (identityKey: string): DIDDocument { + if (identityKey === '' || !/^[0-9a-fA-F]{66}$/.test(identityKey)) { throw new DIDError('Invalid identity key: must be a 66-character hex compressed public key') } @@ -214,7 +214,7 @@ export class DID { /** * Get the certificate type used for DID persistence. */ - static getCertificateType(): string { + static getCertificateType (): string { return Utils.toBase64(Utils.toArray('did:bsv', 'utf8')) } } @@ -223,13 +223,26 @@ export class DID { // Wallet-integrated DID methods // ============================================================================ -export function createDIDMethods(core: WalletCore) { +export function createDIDMethods (core: WalletCore): ReturnType { + return _buildDIDMethods(core) +} +function _buildDIDMethods (core: WalletCore): { + createDID: (options?: DIDCreateOptions) => Promise + resolveDID: (didString: string) => Promise + _resolveFromBasket: (didString: string) => Promise + _resolveViaWhatsOnChain: (txid: string) => Promise + updateDID: (options: DIDUpdateOptions) => Promise + deactivateDID: (didString: string) => Promise<{ txid: string }> + listDIDs: () => Promise + getDID: () => DIDDocument + registerDID: (options: { persist?: boolean }) => Promise +} { /** * Build a P2PKH locking script for a tracking output (goes into basket). * Locked to the wallet's own identity key so it's recognized as spendable. */ - function buildTrackingScript(): string { + function buildTrackingScript (): string { const identityKey = core.getIdentityKey() const address = PublicKey.fromString(identityKey).toAddress() return new P2PKH().lock(address).toHex() @@ -239,7 +252,7 @@ export function createDIDMethods(core: WalletCore) { * Spend a chain UTXO using the signableTransaction flow. * Follows the same pattern as sendToken in tokens.ts. */ - async function spendChainOutput(params: { + async function spendChainOutput (params: { client: any basket: string currentOutpoint: string @@ -253,7 +266,7 @@ export function createDIDMethods(core: WalletCore) { customInstructions?: string tags?: string[] }> - }): Promise<{ txid: string; tx: any }> { + }): Promise<{ txid: string, tx: any }> { const { client, basket, currentOutpoint, chainKeyHex, description, newOutputs } = params const chainKey = PrivateKey.fromHex(chainKeyHex) @@ -265,7 +278,7 @@ export function createDIDMethods(core: WalletCore) { } as any) const beef = new Beef() - beef.mergeBeef((result as any).BEEF as number[]) + beef.mergeBeef((result).BEEF as number[]) const inputBEEF = beef.toBinary() // Create action with custom input (chain UTXO to spend) @@ -281,26 +294,26 @@ export function createDIDMethods(core: WalletCore) { options: { randomizeOutputs: false } } as any) - if (!(response as any)?.signableTransaction) { + if ((response)?.signableTransaction == null) { throw new DIDError('Expected signableTransaction for chain spend') } - const signable = (response as any).signableTransaction + const signable = (response).signableTransaction const txToSign = Transaction.fromBEEF(signable.tx) txToSign.inputs[0].unlockingScriptTemplate = new P2PKH().unlock(chainKey, 'all', false) await txToSign.sign() const unlockingScript = txToSign.inputs[0].unlockingScript?.toHex() - if (!unlockingScript) throw new DIDError('Failed to generate unlocking script') + if (unlockingScript == null || unlockingScript === '') throw new DIDError('Failed to generate unlocking script') const finalResult = await client.signAction({ reference: signable.reference, - spends: { '0': { unlockingScript } } + spends: { 0: { unlockingScript } } }) return { - txid: (finalResult as any).txid || '', - tx: (finalResult as any).tx + txid: (finalResult).txid ?? '', + tx: (finalResult).tx } } @@ -316,7 +329,7 @@ export function createDIDMethods(core: WalletCore) { * This produces a followable output-0-spend chain that external resolvers * (WhatsOnChain, Teranode Universal Resolver) can discover. */ - async createDID(options?: DIDCreateOptions): Promise { + async createDID (options?: DIDCreateOptions): Promise { try { const client = core.getClient() const basket = options?.basket ?? core.defaults.didBasket @@ -365,8 +378,8 @@ export function createDIDMethods(core: WalletCore) { options: { randomizeOutputs: false } }) - const issuanceTxid = issuanceResult.txid || '' - if (!issuanceTxid) { + const issuanceTxid = issuanceResult.txid ?? '' + if (issuanceTxid === '') { throw new DIDError('Issuance transaction did not return a txid') } @@ -394,10 +407,10 @@ export function createDIDMethods(core: WalletCore) { const outputs = listResult?.outputs ?? [] found = outputs.some((o: any) => o.outpoint === issuanceOutpoint) if (found) break - await new Promise(r => setTimeout(r, 500)) + await new Promise(resolve => setTimeout(resolve, 500)) } - if (!found) { + if (!found) { // eslint-disable-line @typescript-eslint/strict-boolean-expressions throw new DIDError('Issuance output not found in basket after retries') } @@ -451,7 +464,7 @@ export function createDIDMethods(core: WalletCore) { * Resolve a did:bsv DID to its DID Document. * Tries Teranode Universal Resolver first, falls back to WhatsOnChain. */ - async resolveDID(didString: string): Promise { + async resolveDID (didString: string): Promise { const parsed = DID.parse(didString) // Legacy pubkey-based DID — return legacy document @@ -478,7 +491,7 @@ export function createDIDMethods(core: WalletCore) { // Check local basket first — fastest resolution for our own DIDs try { const localResult = await this._resolveFromBasket(didString) - if (localResult) return localResult + if (localResult != null) return localResult } catch { // Fall through to external resolvers } @@ -486,12 +499,12 @@ export function createDIDMethods(core: WalletCore) { // Try server-side proxy (bypasses CORS for browser clients) // The proxy handles nChain → WoC fallback internally, so one call is enough. const proxyUrl = core.defaults.didProxyUrl - if (proxyUrl) { + if (proxyUrl != null && proxyUrl !== '') { try { const response = await fetch(`${proxyUrl}?did=${encodeURIComponent(didString)}`) if (response.ok) { const data: any = await response.json() - if (data.didDocument || data.didDocumentMetadata?.deactivated) { + if ((data.didDocument != null) || (data.didDocumentMetadata?.deactivated === true)) { return data as DIDResolutionResult } } @@ -502,28 +515,28 @@ export function createDIDMethods(core: WalletCore) { // No proxy configured (server-side SDK usage) — try resolvers directly const resolverUrl = core.defaults.didResolverUrl - if (resolverUrl) { + if (resolverUrl != null && resolverUrl !== '') { try { const response = await fetch(`${resolverUrl}/1.0/identifiers/${didString}`) if (response.ok) { const data: any = await response.json() return { - didDocument: data.didDocument || data, - didDocumentMetadata: data.didDocumentMetadata || {}, + didDocument: data.didDocument ?? data, + didDocumentMetadata: data.didDocumentMetadata ?? {}, didResolutionMetadata: { contentType: 'application/did+ld+json', - ...(data.didResolutionMetadata || {}) + ...(data.didResolutionMetadata ?? {}) } } } if (response.status === 410) { const data: any = await response.json().catch(() => ({})) return { - didDocument: data.didDocument || null, - didDocumentMetadata: { deactivated: true, ...(data.didDocumentMetadata || {}) }, + didDocument: data.didDocument ?? null, + didDocumentMetadata: { deactivated: true, ...(data.didDocumentMetadata ?? {}) }, didResolutionMetadata: { contentType: 'application/did+ld+json', - ...(data.didResolutionMetadata || {}) + ...(data.didResolutionMetadata ?? {}) } } } @@ -533,14 +546,14 @@ export function createDIDMethods(core: WalletCore) { } // WhatsOnChain direct fallback (server-side only — CORS-blocked in browsers) - return this._resolveViaWhatsOnChain(parsed.identifier) + return await this._resolveViaWhatsOnChain(parsed.identifier) }, /** * Resolve a DID from the local basket (for DIDs we own). * @internal */ - async _resolveFromBasket(didString: string): Promise { + async _resolveFromBasket (didString: string): Promise { const client = core.getClient() const basket = core.defaults.didBasket @@ -555,7 +568,7 @@ export function createDIDMethods(core: WalletCore) { // Find the latest state for this DID (may have multiple outputs: doc, update, deactivate) let latestCI: any = null for (const output of outputs) { - if (!(output as any).customInstructions) continue + if ((output as any).customInstructions == null) continue try { const ci = JSON.parse((output as any).customInstructions) if (ci.did !== didString) continue @@ -564,11 +577,11 @@ export function createDIDMethods(core: WalletCore) { } catch {} } - if (!latestCI) return null + if (latestCI == null) return null if (latestCI.status === 'deactivated') { // Try to reconstruct last known document - const doc = latestCI.subjectKey + const doc = (latestCI.subjectKey != null) ? DID.buildDocument(latestCI.issuanceTxid, latestCI.subjectKey, didString) : null return { @@ -579,12 +592,12 @@ export function createDIDMethods(core: WalletCore) { } // Build document from stored metadata - if (latestCI.subjectKey && latestCI.issuanceTxid) { - const services = latestCI.services || undefined + if ((latestCI.subjectKey != null) && (latestCI.issuanceTxid != null)) { + const services = latestCI.services ?? undefined const document = DID.buildDocument(latestCI.issuanceTxid, latestCI.subjectKey, didString, services) // If additional keys stored, add them - if (latestCI.additionalKeys) { + if (latestCI.additionalKeys != null) { for (let i = 0; i < latestCI.additionalKeys.length; i++) { const jwk = pubKeyToJwk(latestCI.additionalKeys[i]) document.verificationMethod.push({ @@ -610,7 +623,7 @@ export function createDIDMethods(core: WalletCore) { * Resolve a DID by following the UTXO chain on WhatsOnChain. * @internal */ - async _resolveViaWhatsOnChain(txid: string): Promise { + async _resolveViaWhatsOnChain (txid: string): Promise { const notFound: DIDResolutionResult = { didDocument: null, didDocumentMetadata: {}, @@ -632,10 +645,10 @@ export function createDIDMethods(core: WalletCore) { const wocFetch = async (url: string): Promise => { const elapsed = Date.now() - lastWocCall if (lastWocCall > 0 && elapsed < 350) { - await new Promise(r => setTimeout(r, 350 - elapsed)) + await new Promise(resolve => setTimeout(resolve, 350 - elapsed)) } lastWocCall = Date.now() - return fetch(url) + return await fetch(url) } for (let hop = 0; hop < maxHops; hop++) { @@ -646,15 +659,15 @@ export function createDIDMethods(core: WalletCore) { if (!txResp.ok) return notFound const txData: any = await txResp.json() - if (!created) { - created = txData.time ? new Date(txData.time * 1000).toISOString() : undefined + if (created == null) { + created = (txData.time != null) ? new Date(txData.time * 1000).toISOString() : undefined } // Parse OP_RETURN outputs to find BSVDID segments let segments: string[] = [] - for (const vout of txData.vout || []) { - const hex = vout?.scriptPubKey?.hex - if (!hex) continue + for (const vout of (txData.vout as any[] | null) ?? []) { + const hex = vout?.scriptPubKey?.hex as string | undefined + if (hex == null || hex === '') continue const s = parseOpReturnSegments(hex) if (s.length >= 3 && s[0] === BSVDID_MARKER) { segments = s @@ -690,7 +703,7 @@ export function createDIDMethods(core: WalletCore) { try { lastDocument = JSON.parse(payload) as DIDDocumentV2 lastDocTxid = currentTxid - updated = txData.time ? new Date(txData.time * 1000).toISOString() : undefined + updated = (txData.time != null) ? new Date(txData.time * 1000).toISOString() : undefined } catch { // Not valid JSON — skip } @@ -707,28 +720,28 @@ export function createDIDMethods(core: WalletCore) { ) if (spendResp.ok && spendResp.status !== 404) { const spendData: any = await spendResp.json() - nextTxid = spendData?.txid || null + nextTxid = spendData?.txid ?? null } } catch { /* fall through to address history */ } // Strategy 2: address history fallback (WoC spend index is unreliable) // The chain key address is random and unique to this DID, so any // other TX at that address is a chain TX — no per-TX verification needed. - if (!nextTxid) { + if (nextTxid == null) { const out0Addr = txData.vout?.[0]?.scriptPubKey?.addresses?.[0] - if (out0Addr) { + if (out0Addr != null) { try { const histResp = await wocFetch( - `https://api.whatsonchain.com/v1/bsv/main/address/${out0Addr}/history` + `https://api.whatsonchain.com/v1/bsv/main/address/${String(out0Addr)}/history` ) if (histResp.ok) { - const history = await histResp.json() as Array<{ tx_hash: string; height: number }> + const history = await histResp.json() as Array<{ tx_hash: string, height: number }> // Sort descending by height — most recent TX first. // Pick the latest chain TX to skip intermediate hops // (the main loop will parse its BSVDID markers). const candidates = history .filter(e => !visited.has(e.tx_hash)) - .sort((a, b) => (b.height || 0) - (a.height || 0)) + .sort((a, b) => (b.height !== 0 ? b.height : 0) - (a.height !== 0 ? a.height : 0)) if (candidates.length > 0) { nextTxid = candidates[0].tx_hash } @@ -737,12 +750,12 @@ export function createDIDMethods(core: WalletCore) { } } - if (!nextTxid) break + if (nextTxid == null) break currentTxid = nextTxid } - if (lastDocument) { + if (lastDocument != null) { return { didDocument: lastDocument, didDocumentMetadata: { @@ -783,7 +796,7 @@ export function createDIDMethods(core: WalletCore) { * Update a DID document by spending the current chain UTXO. * Creates a new chain UTXO (out 0) + OP_RETURN with updated document (out 1). */ - async updateDID(options: DIDUpdateOptions): Promise { + async updateDID (options: DIDUpdateOptions): Promise { try { const client = core.getClient() DID.parse(options.did) @@ -801,7 +814,7 @@ export function createDIDMethods(core: WalletCore) { let chainOutpoint: string = '' for (const output of outputs) { - if (!(output as any).customInstructions) continue + if ((output as any).customInstructions == null) continue try { const ci = JSON.parse((output as any).customInstructions) if (ci.did === options.did && ci.status === 'active') { @@ -811,12 +824,12 @@ export function createDIDMethods(core: WalletCore) { } catch {} } - if (!chainCI) { + if (chainCI == null) { throw new DIDError(`No active chain state found for ${options.did}`) } const { identityCode, subjectKey, issuanceTxid, chainKeyHex } = chainCI - if (!chainKeyHex) { + if (chainKeyHex == null || chainKeyHex === '') { throw new DIDError('Chain key not found in output metadata — cannot spend chain UTXO') } @@ -832,7 +845,7 @@ export function createDIDMethods(core: WalletCore) { ) // If additional verification keys requested, add them - if (options.additionalKeys) { + if (options.additionalKeys != null) { for (let i = 0; i < options.additionalKeys.length; i++) { const jwk = pubKeyToJwk(options.additionalKeys[i]) document.verificationMethod.push({ @@ -898,7 +911,7 @@ export function createDIDMethods(core: WalletCore) { * Out 0: OP_RETURN revocation marker (chain terminates). * Out 1: P2PKH to wallet identity key (local bookkeeping). */ - async deactivateDID(didString: string): Promise<{ txid: string }> { + async deactivateDID (didString: string): Promise<{ txid: string }> { try { const client = core.getClient() DID.parse(didString) @@ -916,7 +929,7 @@ export function createDIDMethods(core: WalletCore) { let chainOutpoint: string = '' for (const output of outputs) { - if (!(output as any).customInstructions) continue + if ((output as any).customInstructions == null) continue try { const ci = JSON.parse((output as any).customInstructions) if (ci.did === didString && ci.status === 'active') { @@ -926,12 +939,12 @@ export function createDIDMethods(core: WalletCore) { } catch {} } - if (!chainCI) { + if (chainCI == null) { throw new DIDError(`No active chain state found for ${didString}`) } const { identityCode, chainKeyHex } = chainCI - if (!chainKeyHex) { + if (chainKeyHex == null || chainKeyHex === '') { throw new DIDError('Chain key not found in output metadata — cannot spend chain UTXO') } @@ -980,7 +993,7 @@ export function createDIDMethods(core: WalletCore) { /** * List all DIDs owned by this wallet. */ - async listDIDs(): Promise { + async listDIDs (): Promise { try { const client = core.getClient() const basket = core.defaults.didBasket @@ -995,10 +1008,10 @@ export function createDIDMethods(core: WalletCore) { const didMap = new Map() for (const output of outputs) { - if (!(output as any).customInstructions) continue + if ((output as any).customInstructions == null) continue try { const ci = JSON.parse((output as any).customInstructions) - if (!ci.did || !ci.identityCode) continue + if ((ci.did == null) || (ci.identityCode == null)) continue // Skip pending issuance outputs (consumed by document TX) if (ci.status === 'pending') continue @@ -1007,11 +1020,11 @@ export function createDIDMethods(core: WalletCore) { didMap.set(ci.did, { did: ci.did, identityCode: ci.identityCode, - issuanceTxid: ci.issuanceTxid || ci.did?.replace('did:bsv:', ''), + issuanceTxid: ci.issuanceTxid ?? ci.did?.replace('did:bsv:', ''), currentOutpoint: output.outpoint, status: ci.status === 'deactivated' ? 'deactivated' : 'active', - created: ci.created || new Date().toISOString(), - updated: ci.updated || new Date().toISOString() + created: ci.created ?? new Date().toISOString(), + updated: ci.updated ?? new Date().toISOString() }) } catch {} } @@ -1026,7 +1039,7 @@ export function createDIDMethods(core: WalletCore) { * @deprecated Use createDID() for spec-compliant DIDs. * Get this wallet's legacy DID Document (identity-key based). */ - getDID(): DIDDocument { + getDID (): DIDDocument { return DID.fromIdentityKey(core.getIdentityKey()) }, @@ -1034,7 +1047,7 @@ export function createDIDMethods(core: WalletCore) { * @deprecated Use createDID() for spec-compliant DIDs. * Register a legacy DID as a BSV certificate. */ - async registerDID(options?: { persist?: boolean }): Promise { + async registerDID (options?: { persist?: boolean }): Promise { const { Certifier } = await import('./certification') const identityKey = core.getIdentityKey() const didDoc = DID.fromIdentityKey(identityKey) diff --git a/src/modules/file-revocation-store.ts b/src/modules/file-revocation-store.ts index 0c60fd4..e340aa3 100644 --- a/src/modules/file-revocation-store.ts +++ b/src/modules/file-revocation-store.ts @@ -1,37 +1,39 @@ import { RevocationRecord, RevocationStore } from '../core/types' +// eslint-disable-next-line @typescript-eslint/no-var-requires +const nodePath = require('path') as typeof import('path') +// eslint-disable-next-line @typescript-eslint/no-var-requires +const nodeFs = require('fs') as typeof import('fs') + // ============================================================================ // FileRevocationStore (Node.js server only — not browser-safe) // ============================================================================ export class FileRevocationStore implements RevocationStore { - private filePath: string + private readonly filePath: string private mutex: Promise = Promise.resolve() - constructor(filePath?: string) { - const path = require('path') - this.filePath = filePath || path.join(process.cwd(), '.revocation-secrets.json') + constructor (filePath?: string) { + this.filePath = filePath ?? nodePath.join(process.cwd(), '.revocation-secrets.json') } - private loadAll(): Record { + private loadAll (): Record { try { - const fs = require('fs') - if (fs.existsSync(this.filePath)) { - return JSON.parse(fs.readFileSync(this.filePath, 'utf-8')) + if (nodeFs.existsSync(this.filePath)) { + return JSON.parse(nodeFs.readFileSync(this.filePath, 'utf-8')) as Record } } catch {} return {} } - private saveAll(records: Record): void { - const fs = require('fs') - fs.writeFileSync(this.filePath, JSON.stringify(records, null, 2)) + private saveAll (records: Record): void { + nodeFs.writeFileSync(this.filePath, JSON.stringify(records, null, 2)) } private async withLock(fn: (records: Record) => T): Promise { const prev = this.mutex - let resolve: () => void - this.mutex = new Promise(r => { resolve = r }) + let resolveFunc: (() => void) | undefined + this.mutex = new Promise(resolve => { resolveFunc = resolve }) await prev try { const records = this.loadAll() @@ -39,33 +41,34 @@ export class FileRevocationStore implements RevocationStore { this.saveAll(records) return result } finally { - resolve!() + if (resolveFunc != null) resolveFunc() } } - async save(serialNumber: string, record: RevocationRecord): Promise { + async save (serialNumber: string, record: RevocationRecord): Promise { await this.withLock(records => { records[serialNumber] = record }) } - async load(serialNumber: string): Promise { + async load (serialNumber: string): Promise { const records = this.loadAll() return records[serialNumber] } - async delete(serialNumber: string): Promise { + async delete (serialNumber: string): Promise { await this.withLock(records => { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete records[serialNumber] }) } - async has(serialNumber: string): Promise { + async has (serialNumber: string): Promise { const records = this.loadAll() return serialNumber in records } - async findByOutpoint(outpoint: string): Promise { + async findByOutpoint (outpoint: string): Promise { const records = this.loadAll() return Object.values(records).some(r => r.outpoint === outpoint) } diff --git a/src/modules/inscriptions.ts b/src/modules/inscriptions.ts index 744bb6d..a9a4d39 100644 --- a/src/modules/inscriptions.ts +++ b/src/modules/inscriptions.ts @@ -1,19 +1,24 @@ import { WalletCore } from '../core/WalletCore' import { InscriptionResult, InscriptionType } from '../core/types' -export function createInscriptionMethods(core: WalletCore) { +export function createInscriptionMethods (core: WalletCore): { + inscribeText: (text: string, opts?: { basket?: string, description?: string }) => Promise + inscribeJSON: (data: object, opts?: { basket?: string, description?: string }) => Promise + inscribeFileHash: (hash: string, opts?: { basket?: string, description?: string }) => Promise + inscribeImageHash: (hash: string, opts?: { basket?: string, description?: string }) => Promise +} { const defaultBaskets: Record = { - 'text': 'text', - 'json': 'json', + text: 'text', + json: 'json', 'file-hash': 'hash-document', 'image-hash': 'hash-image' } return { - async inscribeText(text: string, opts?: { basket?: string; description?: string }): Promise { - const basket = opts?.basket ?? defaultBaskets['text'] + async inscribeText (text: string, opts?: { basket?: string, description?: string }): Promise { + const basket = opts?.basket ?? defaultBaskets.text const result = await core.send({ - outputs: [{ data: [text], basket, description: opts?.description ?? `Text inscription` }], + outputs: [{ data: [text], basket, description: opts?.description ?? 'Text inscription' }], description: opts?.description ?? core.defaults.description }) return { @@ -26,11 +31,11 @@ export function createInscriptionMethods(core: WalletCore) { } }, - async inscribeJSON(data: object, opts?: { basket?: string; description?: string }): Promise { - const basket = opts?.basket ?? defaultBaskets['json'] + async inscribeJSON (data: object, opts?: { basket?: string, description?: string }): Promise { + const basket = opts?.basket ?? defaultBaskets.json const jsonString = JSON.stringify(data) const result = await core.send({ - outputs: [{ data: [jsonString], basket, description: opts?.description ?? `JSON inscription` }], + outputs: [{ data: [jsonString], basket, description: opts?.description ?? 'JSON inscription' }], description: opts?.description ?? core.defaults.description }) return { @@ -43,13 +48,13 @@ export function createInscriptionMethods(core: WalletCore) { } }, - async inscribeFileHash(hash: string, opts?: { basket?: string; description?: string }): Promise { + async inscribeFileHash (hash: string, opts?: { basket?: string, description?: string }): Promise { if (!/^[a-fA-F0-9]{64}$/.test(hash)) { throw new Error('Invalid SHA-256 hash format') } const basket = opts?.basket ?? defaultBaskets['file-hash'] const result = await core.send({ - outputs: [{ data: [hash], basket, description: opts?.description ?? `File hash inscription` }], + outputs: [{ data: [hash], basket, description: opts?.description ?? 'File hash inscription' }], description: opts?.description ?? core.defaults.description }) return { @@ -62,13 +67,13 @@ export function createInscriptionMethods(core: WalletCore) { } }, - async inscribeImageHash(hash: string, opts?: { basket?: string; description?: string }): Promise { + async inscribeImageHash (hash: string, opts?: { basket?: string, description?: string }): Promise { if (!/^[a-fA-F0-9]{64}$/.test(hash)) { throw new Error('Invalid SHA-256 hash format') } const basket = opts?.basket ?? defaultBaskets['image-hash'] const result = await core.send({ - outputs: [{ data: [hash], basket, description: opts?.description ?? `Image hash inscription` }], + outputs: [{ data: [hash], basket, description: opts?.description ?? 'Image hash inscription' }], description: opts?.description ?? core.defaults.description }) return { diff --git a/src/modules/messagebox.ts b/src/modules/messagebox.ts index dee04c1..ddcaec6 100644 --- a/src/modules/messagebox.ts +++ b/src/modules/messagebox.ts @@ -1,12 +1,22 @@ import { PeerPayClient } from '@bsv/message-box-client' import { WalletCore } from '../core/WalletCore' -import { ReinternalizeResult } from '../core/types' -export function createMessageBoxMethods(core: WalletCore) { +export function createMessageBoxMethods (core: WalletCore): { + certifyForMessageBox: (handle: string, registryUrl?: string, host?: string) => Promise<{ txid: string, handle: string }> + getMessageBoxHandle: (registryUrl?: string) => Promise + revokeMessageBoxCertification: (registryUrl?: string) => Promise + sendMessageBoxPayment: (to: string, satoshis: number) => Promise + listIncomingPayments: () => Promise + acceptIncomingPayment: (payment: any, basket?: string) => Promise + registerIdentityTag: (tag: string, registryUrl?: string) => Promise<{ tag: string }> + lookupIdentityByTag: (query: string, registryUrl?: string) => Promise> + listMyTags: (registryUrl?: string) => Promise> + revokeIdentityTag: (tag: string, registryUrl?: string) => Promise +} { let peerPay: PeerPayClient | null = null - function getPeerPay(): PeerPayClient { - if (!peerPay) { + function getPeerPay (): PeerPayClient { + if (peerPay == null) { peerPay = new PeerPayClient({ walletClient: core.getClient() as any, messageBoxHost: core.defaults.messageBoxHost, @@ -17,14 +27,14 @@ export function createMessageBoxMethods(core: WalletCore) { } return { - async certifyForMessageBox(handle: string, registryUrl?: string, host?: string): Promise<{ txid: string; handle: string }> { + async certifyForMessageBox (handle: string, registryUrl?: string, host?: string): Promise<{ txid: string, handle: string }> { try { const client = getPeerPay() - const targetHost = host || core.defaults.messageBoxHost + const targetHost = host ?? core.defaults.messageBoxHost const result = await client.anointHost(targetHost) const effectiveRegistry = registryUrl ?? core.defaults.registryUrl - if (!effectiveRegistry) throw new Error('registryUrl is required') + if (effectiveRegistry == null) throw new Error('registryUrl is required') // Register handle in identity registry const res = await fetch(`${effectiveRegistry}?action=register`, { @@ -32,8 +42,8 @@ export function createMessageBoxMethods(core: WalletCore) { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tag: handle, identityKey: core.getIdentityKey() }) }) - const data = await res.json() as { success: boolean; error?: string } - if (!data.success) throw new Error(data.error || 'Registration failed') + const data = await res.json() as { success: boolean, error?: string } + if (!data.success) throw new Error(data.error ?? 'Registration failed') return { txid: result.txid, handle } } catch (error) { @@ -41,28 +51,28 @@ export function createMessageBoxMethods(core: WalletCore) { } }, - async getMessageBoxHandle(registryUrl?: string): Promise { + async getMessageBoxHandle (registryUrl?: string): Promise { try { const effectiveRegistry = registryUrl ?? core.defaults.registryUrl - if (!effectiveRegistry) return null + if (effectiveRegistry == null) return null const res = await fetch(`${effectiveRegistry}?action=list&identityKey=${encodeURIComponent(core.getIdentityKey())}`) - const data = await res.json() as { success: boolean; tags?: { tag: string }[] } - if (!data.success || !data.tags || data.tags.length === 0) return null + const data = await res.json() as { success: boolean, tags?: Array<{ tag: string }> } + if (!data.success || (data.tags == null) || data.tags.length === 0) return null return data.tags[0].tag } catch { return null } }, - async revokeMessageBoxCertification(registryUrl?: string): Promise { + async revokeMessageBoxCertification (registryUrl?: string): Promise { try { const effectiveRegistry = registryUrl ?? core.defaults.registryUrl - if (!effectiveRegistry) throw new Error('registryUrl is required') + if (effectiveRegistry == null) throw new Error('registryUrl is required') const listRes = await fetch(`${effectiveRegistry}?action=list&identityKey=${encodeURIComponent(core.getIdentityKey())}`) - const listData = await listRes.json() as { success: boolean; tags?: { tag: string }[] } - if (listData.success && listData.tags) { + const listData = await listRes.json() as { success: boolean, tags?: Array<{ tag: string }> } + if (listData.success && (listData.tags != null)) { for (const t of listData.tags) { const res = await fetch(`${effectiveRegistry}?action=revoke`, { method: 'POST', @@ -78,7 +88,7 @@ export function createMessageBoxMethods(core: WalletCore) { } }, - async sendMessageBoxPayment(to: string, satoshis: number, changeBasket?: string): Promise { + async sendMessageBoxPayment (to: string, satoshis: number): Promise { try { const client = getPeerPay() @@ -90,28 +100,17 @@ export function createMessageBoxMethods(core: WalletCore) { body: JSON.stringify(paymentToken) }) - let reinternalized: ReinternalizeResult | undefined - const effectiveChangeBasket = changeBasket ?? core.defaults.changeBasket - if (effectiveChangeBasket) { - if (paymentToken?.transaction) { - reinternalized = await core.reinternalizeChange(paymentToken.transaction, effectiveChangeBasket, [0]) - } else { - reinternalized = { count: 0, errors: ['paymentToken.transaction is missing'] } - } - } - return { - txid: paymentToken?.transaction ? 'sent' : '', + txid: paymentToken?.transaction != null ? 'sent' : '', amount: satoshis, - recipient: to, - reinternalized + recipient: to } } catch (error) { throw new Error(`MessageBox payment failed: ${(error as Error).message}`) } }, - async listIncomingPayments(): Promise { + async listIncomingPayments (): Promise { try { const client = getPeerPay() return await client.listIncomingPayments() @@ -120,11 +119,11 @@ export function createMessageBoxMethods(core: WalletCore) { } }, - async acceptIncomingPayment(payment: any, basket?: string): Promise { + async acceptIncomingPayment (payment: any, basket?: string): Promise { try { const pp = getPeerPay() - if (basket) { + if (basket != null) { const walletClient = core.getClient() await walletClient.internalizeAction({ tx: payment.token.transaction, @@ -157,64 +156,64 @@ export function createMessageBoxMethods(core: WalletCore) { } }, - async registerIdentityTag(tag: string, registryUrl?: string): Promise<{ tag: string }> { + async registerIdentityTag (tag: string, registryUrl?: string): Promise<{ tag: string }> { try { const effectiveRegistry = registryUrl ?? core.defaults.registryUrl - if (!effectiveRegistry) throw new Error('registryUrl is required') + if (effectiveRegistry == null) throw new Error('registryUrl is required') const res = await fetch(`${effectiveRegistry}?action=register`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tag, identityKey: core.getIdentityKey() }) }) - const data = await res.json() as { success: boolean; error?: string; tag?: string } - if (!data.success) throw new Error(data.error || 'Registration failed') - return { tag: data.tag || tag } + const data = await res.json() as { success: boolean, error?: string, tag?: string } + if (!data.success) throw new Error(data.error ?? 'Registration failed') + return { tag: data.tag ?? tag } } catch (error) { throw new Error(`Tag registration failed: ${(error as Error).message}`) } }, - async lookupIdentityByTag(query: string, registryUrl?: string): Promise<{ tag: string; identityKey: string }[]> { + async lookupIdentityByTag (query: string, registryUrl?: string): Promise> { try { const effectiveRegistry = registryUrl ?? core.defaults.registryUrl - if (!effectiveRegistry) throw new Error('registryUrl is required') + if (effectiveRegistry == null) throw new Error('registryUrl is required') const res = await fetch(`${effectiveRegistry}?action=lookup&query=${encodeURIComponent(query)}`) - const data = await res.json() as { success: boolean; error?: string; results?: { tag: string; identityKey: string }[] } - if (!data.success) throw new Error(data.error || 'Lookup failed') - return data.results || [] + const data = await res.json() as { success: boolean, error?: string, results?: Array<{ tag: string, identityKey: string }> } + if (!data.success) throw new Error(data.error ?? 'Lookup failed') + return data.results ?? [] } catch (error) { throw new Error(`Tag lookup failed: ${(error as Error).message}`) } }, - async listMyTags(registryUrl?: string): Promise<{ tag: string; createdAt: string }[]> { + async listMyTags (registryUrl?: string): Promise> { try { const effectiveRegistry = registryUrl ?? core.defaults.registryUrl - if (!effectiveRegistry) throw new Error('registryUrl is required') + if (effectiveRegistry == null) throw new Error('registryUrl is required') const res = await fetch(`${effectiveRegistry}?action=list&identityKey=${encodeURIComponent(core.getIdentityKey())}`) - const data = await res.json() as { success: boolean; error?: string; tags?: { tag: string; createdAt: string }[] } - if (!data.success) throw new Error(data.error || 'List failed') - return data.tags || [] + const data = await res.json() as { success: boolean, error?: string, tags?: Array<{ tag: string, createdAt: string }> } + if (!data.success) throw new Error(data.error ?? 'List failed') + return data.tags ?? [] } catch (error) { throw new Error(`Failed to list tags: ${(error as Error).message}`) } }, - async revokeIdentityTag(tag: string, registryUrl?: string): Promise { + async revokeIdentityTag (tag: string, registryUrl?: string): Promise { try { const effectiveRegistry = registryUrl ?? core.defaults.registryUrl - if (!effectiveRegistry) throw new Error('registryUrl is required') + if (effectiveRegistry == null) throw new Error('registryUrl is required') const res = await fetch(`${effectiveRegistry}?action=revoke`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tag, identityKey: core.getIdentityKey() }) }) - const data = await res.json() as { success: boolean; error?: string } - if (!data.success) throw new Error(data.error || 'Revoke failed') + const data = await res.json() as { success: boolean, error?: string } + if (!data.success) throw new Error(data.error ?? 'Revoke failed') } catch (error) { throw new Error(`Tag revocation failed: ${(error as Error).message}`) } diff --git a/src/modules/overlay.ts b/src/modules/overlay.ts index 05faa37..d7cd573 100644 --- a/src/modules/overlay.ts +++ b/src/modules/overlay.ts @@ -10,8 +10,7 @@ import type { SHIPBroadcasterConfig, LookupResolverConfig, LookupQuestion, - LookupAnswer, - STEAK + LookupAnswer } from '@bsv/sdk' import { WalletCore } from '../core/WalletCore' import { @@ -27,12 +26,12 @@ import { // ============================================================================ export class Overlay { - private topics: string[] + private readonly topics: string[] private broadcaster: TopicBroadcaster - private resolver: LookupResolver - private config: OverlayConfig + private readonly resolver: LookupResolver + private readonly config: OverlayConfig - private constructor( + private constructor ( config: OverlayConfig, broadcaster: TopicBroadcaster, resolver: LookupResolver @@ -43,8 +42,8 @@ export class Overlay { this.resolver = resolver } - static async create(config: OverlayConfig): Promise { - if (!config.topics || config.topics.length === 0) { + static async create (config: OverlayConfig): Promise { + if (config.topics.length === 0) { throw new Error('At least one topic is required') } for (const t of config.topics) { @@ -53,15 +52,15 @@ export class Overlay { } } - const network = config.network || 'mainnet' + const network = config.network ?? 'mainnet' // Build LookupResolver const resolverConfig: LookupResolverConfig = { networkPreset: network } - if (config.slapTrackers) resolverConfig.slapTrackers = config.slapTrackers - if (config.hostOverrides) resolverConfig.hostOverrides = config.hostOverrides - if (config.additionalHosts) resolverConfig.additionalHosts = config.additionalHosts + if (config.slapTrackers != null) resolverConfig.slapTrackers = config.slapTrackers + if (config.hostOverrides != null) resolverConfig.hostOverrides = config.hostOverrides + if (config.additionalHosts != null) resolverConfig.additionalHosts = config.additionalHosts const resolver = new LookupResolver(resolverConfig) @@ -82,14 +81,14 @@ export class Overlay { return new Overlay(config, broadcaster, resolver) } - getInfo(): OverlayInfo { + getInfo (): OverlayInfo { return { topics: [...this.topics], - network: this.config.network || 'mainnet' + network: this.config.network ?? 'mainnet' } } - addTopic(topic: string): void { + addTopic (topic: string): void { if (!topic.startsWith('tm_')) { throw new Error(`Topic "${topic}" must start with "tm_" prefix`) } @@ -99,7 +98,7 @@ export class Overlay { } } - removeTopic(topic: string): void { + removeTopic (topic: string): void { const index = this.topics.indexOf(topic) if (index > -1) { this.topics.splice(index, 1) @@ -109,8 +108,8 @@ export class Overlay { } } - private rebuildBroadcaster(): void { - const network = this.config.network || 'mainnet' + private rebuildBroadcaster (): void { + const network = this.config.network ?? 'mainnet' const broadcasterConfig: SHIPBroadcasterConfig = { networkPreset: network, resolver: this.resolver @@ -125,17 +124,17 @@ export class Overlay { } // Submit a pre-built Transaction to overlay topics - async broadcast(tx: Transaction, topics?: string[]): Promise { + async broadcast (tx: Transaction, topics?: string[]): Promise { let broadcaster = this.broadcaster // If per-call topics are provided, create a one-off broadcaster - if (topics && topics.length > 0) { + if ((topics != null) && topics.length > 0) { for (const t of topics) { if (!t.startsWith('tm_')) { throw new Error(`Topic "${t}" must start with "tm_" prefix`) } } - const network = this.config.network || 'mainnet' + const network = this.config.network ?? 'mainnet' broadcaster = new TopicBroadcaster(topics, { networkPreset: network, resolver: this.resolver @@ -159,15 +158,15 @@ export class Overlay { } // Query a lookup service - async query(service: string, query: unknown, timeout?: number): Promise { + async query (service: string, query: unknown, timeout?: number): Promise { const question: LookupQuestion = { service, query } - return this.resolver.query(question, timeout) + return await this.resolver.query(question, timeout) } // Convenience: query + extract parsed outputs - async lookupOutputs(service: string, query: unknown): Promise { + async lookupOutputs (service: string, query: unknown): Promise { const answer = await this.query(service, query) - if (answer.type !== 'output-list' || !answer.outputs) { + if (answer.type !== 'output-list' || answer.outputs == null) { return [] } return answer.outputs.map(o => ({ @@ -178,18 +177,23 @@ export class Overlay { } // Access raw SDK objects for advanced use - getBroadcaster(): TopicBroadcaster { return this.broadcaster } - getResolver(): LookupResolver { return this.resolver } + getBroadcaster (): TopicBroadcaster { return this.broadcaster } + getResolver (): LookupResolver { return this.resolver } } // ============================================================================ // Wallet-integrated overlay methods // ============================================================================ -export function createOverlayMethods(core: WalletCore) { +export function createOverlayMethods (core: WalletCore): { + advertiseSHIP: (domain: string, topic: string, basket?: string) => Promise + advertiseSLAP: (domain: string, service: string, basket?: string) => Promise + broadcastAction: (overlay: Overlay, actionOptions: { outputs: any[], description?: string }, topics?: string[]) => Promise<{ txid: string, broadcast: OverlayBroadcastResult }> + withRetry: (operation: () => Promise, overlay: Overlay, maxRetries?: number) => Promise +} { return { // Create a SHIP advertisement: "I host topic X at domain Y" - async advertiseSHIP(domain: string, topic: string, basket?: string): Promise { + async advertiseSHIP (domain: string, topic: string, basket?: string): Promise { if (!topic.startsWith('tm_')) { throw new Error(`Topic "${topic}" must start with "tm_" prefix`) } @@ -201,18 +205,18 @@ export function createOverlayMethods(core: WalletCore) { lockingScript: lockingScript.toHex(), satoshis: 1, outputDescription: 'SHIP token', - ...(basket ? { basket } : {}) + ...(basket != null ? { basket } : {}) }], options: { randomizeOutputs: false } }) return { - txid: result.txid || '', + txid: result.txid ?? '', tx: result.tx } }, // Create a SLAP advertisement: "I provide lookup service X at domain Y" - async advertiseSLAP(domain: string, service: string, basket?: string): Promise { + async advertiseSLAP (domain: string, service: string, basket?: string): Promise { if (!service.startsWith('ls_')) { throw new Error(`Service "${service}" must start with "ls_" prefix`) } @@ -224,36 +228,36 @@ export function createOverlayMethods(core: WalletCore) { lockingScript: lockingScript.toHex(), satoshis: 1, outputDescription: 'SLAP token', - ...(basket ? { basket } : {}) + ...(basket != null ? { basket } : {}) }], options: { randomizeOutputs: false } }) return { - txid: result.txid || '', + txid: result.txid ?? '', tx: result.tx } }, // Create action + broadcast to overlay in one step - async broadcastAction( + async broadcastAction ( overlay: Overlay, - actionOptions: { outputs: any[]; description?: string }, + actionOptions: { outputs: any[], description?: string }, topics?: string[] - ): Promise<{ txid: string; broadcast: OverlayBroadcastResult }> { + ): Promise<{ txid: string, broadcast: OverlayBroadcastResult }> { const result = await core.getClient().createAction({ - description: actionOptions.description || 'Overlay broadcast', + description: actionOptions.description ?? 'Overlay broadcast', outputs: actionOptions.outputs, options: { randomizeOutputs: false } }) - if (!result.tx) throw new Error('No tx from createAction') + if (result.tx == null) throw new Error('No tx from createAction') const tx = Transaction.fromAtomicBEEF(result.tx) const broadcastResult = await overlay.broadcast(tx, topics) - return { txid: result.txid || '', broadcast: broadcastResult } + return { txid: result.txid ?? '', broadcast: broadcastResult } }, // Double-spend retry wrapper async withRetry(operation: () => Promise, overlay: Overlay, maxRetries?: number): Promise { - return withDoubleSpendRetry(operation, overlay.getBroadcaster(), maxRetries) + return await withDoubleSpendRetry(operation, overlay.getBroadcaster(), maxRetries) } } } diff --git a/src/modules/tokens.ts b/src/modules/tokens.ts index 40b92ee..ca93389 100644 --- a/src/modules/tokens.ts +++ b/src/modules/tokens.ts @@ -20,9 +20,17 @@ import { const TOKEN_MESSAGE_BOX = 'simple_token_inbox' -export function createTokenMethods(core: WalletCore) { +export function createTokenMethods (core: WalletCore): { + createToken: (options: TokenOptions) => Promise + listTokenDetails: (basket?: string) => Promise + sendToken: (options: SendTokenOptions) => Promise + redeemToken: (options: RedeemTokenOptions) => Promise + sendTokenViaMessageBox: (options: SendTokenOptions) => Promise + listIncomingTokens: () => Promise + acceptIncomingToken: (token: any, basket?: string) => Promise +} { return { - async createToken(options: TokenOptions): Promise { + async createToken (options: TokenOptions): Promise { try { const client = core.getClient() const basket = options.basket ?? core.defaults.tokenBasket @@ -68,7 +76,7 @@ export function createTokenMethods(core: WalletCore) { }) return { - txid: result.txid || '', + txid: result.txid ?? '', tx: result.tx, basket, encrypted: true, @@ -79,7 +87,7 @@ export function createTokenMethods(core: WalletCore) { } }, - async listTokenDetails(basket?: string): Promise { + async listTokenDetails (basket?: string): Promise { const effectiveBasket = basket ?? core.defaults.tokenBasket const client = core.getClient() const result = await client.listOutputs({ @@ -101,15 +109,15 @@ export function createTokenMethods(core: WalletCore) { const decoded = PushDrop.decode(lockScript) let ci: any = {} - if ((output as any).customInstructions) { - try { ci = JSON.parse((output as any).customInstructions) } catch {} + if ((output as any).customInstructions != null) { + try { ci = JSON.parse((output as any).customInstructions as string) } catch {} } - const protocolID = ci.protocolID || defaultProtocolID - const keyID = ci.keyID || defaultKeyID - const counterparty = ci.counterparty || defaultCounterparty + const protocolID = ci.protocolID != null ? ci.protocolID : defaultProtocolID + const keyID = ci.keyID != null ? (ci.keyID as string) : defaultKeyID + const counterparty = ci.counterparty != null ? (ci.counterparty as string) : defaultCounterparty let data: any = null - if (decoded.fields[0]) { + if (decoded.fields[0] != null) { try { const { plaintext } = await client.decrypt({ ciphertext: Array.from(decoded.fields[0]), @@ -142,7 +150,7 @@ export function createTokenMethods(core: WalletCore) { details.push({ outpoint: output.outpoint, - satoshis: output.satoshis || 0, + satoshis: output.satoshis ?? 0, data, protocolID, keyID, @@ -156,7 +164,7 @@ export function createTokenMethods(core: WalletCore) { return details }, - async sendToken(options: SendTokenOptions): Promise { + async sendToken (options: SendTokenOptions): Promise { try { const client = core.getClient() const { basket, outpoint, to } = options @@ -173,15 +181,15 @@ export function createTokenMethods(core: WalletCore) { const outputs = result?.outputs ?? [] const targetOutput = outputs.find((o: any) => o.outpoint === outpoint) - if (!targetOutput) throw new Error(`Token not found: ${outpoint}`) + if (targetOutput == null) throw new Error(`Token not found: ${outpoint}`) let ci: any = {} - if ((targetOutput as any).customInstructions) { - try { ci = JSON.parse((targetOutput as any).customInstructions) } catch {} + if ((targetOutput as any).customInstructions != null) { + try { ci = JSON.parse((targetOutput as any).customInstructions as string) } catch {} } - const protocolID = ci.protocolID || defaultProtocolID - const keyID = ci.keyID || defaultKeyID - const counterparty = ci.counterparty || defaultCounterparty + const protocolID = ci.protocolID != null ? ci.protocolID : defaultProtocolID + const keyID = ci.keyID != null ? (ci.keyID as string) : defaultKeyID + const counterparty = ci.counterparty != null ? (ci.counterparty as string) : defaultCounterparty const beef = new Beef() beef.mergeBeef((result as any).BEEF as number[]) @@ -189,7 +197,7 @@ export function createTokenMethods(core: WalletCore) { const [txid, voutStr] = outpoint.split('.') const vout = Number(voutStr) const sourceTx = beef.findAtomicTransaction(txid) as Transaction - const sourceScript = sourceTx.outputs[vout].lockingScript as LockingScript + const sourceScript = sourceTx.outputs[vout].lockingScript const decoded = PushDrop.decode(sourceScript) const newKeyID = Utils.toBase64(Random(8)) @@ -226,7 +234,7 @@ export function createTokenMethods(core: WalletCore) { options: { randomizeOutputs: false } } as any) - if (!(response as any)?.signableTransaction) { + if ((response as any)?.signableTransaction == null) { throw new Error('Expected signableTransaction') } @@ -240,15 +248,15 @@ export function createTokenMethods(core: WalletCore) { await txToSign.sign() const unlockingScript = txToSign.inputs[0].unlockingScript?.toHex() - if (!unlockingScript) throw new Error('Failed to generate unlocking script') + if (unlockingScript == null || unlockingScript === '') throw new Error('Failed to generate unlocking script') const finalResult = await client.signAction({ reference: signable.reference, - spends: { '0': { unlockingScript } } + spends: { 0: { unlockingScript } } }) return { - txid: (finalResult as any).txid || '', + txid: (finalResult as any).txid ?? '', tx: (finalResult as any).tx } } catch (error) { @@ -256,7 +264,7 @@ export function createTokenMethods(core: WalletCore) { } }, - async redeemToken(options: RedeemTokenOptions): Promise { + async redeemToken (options: RedeemTokenOptions): Promise { try { const client = core.getClient() const { basket, outpoint } = options @@ -273,15 +281,15 @@ export function createTokenMethods(core: WalletCore) { const outputs = result?.outputs ?? [] const targetOutput = outputs.find((o: any) => o.outpoint === outpoint) - if (!targetOutput) throw new Error(`Token not found: ${outpoint}`) + if (targetOutput == null) throw new Error(`Token not found: ${outpoint}`) let ci: any = {} - if ((targetOutput as any).customInstructions) { - try { ci = JSON.parse((targetOutput as any).customInstructions) } catch {} + if ((targetOutput as any).customInstructions != null) { + try { ci = JSON.parse((targetOutput as any).customInstructions as string) } catch {} } - const protocolID = ci.protocolID || defaultProtocolID - const keyID = ci.keyID || defaultKeyID - const counterparty = ci.counterparty || defaultCounterparty + const protocolID = ci.protocolID != null ? ci.protocolID : defaultProtocolID + const keyID = ci.keyID != null ? (ci.keyID as string) : defaultKeyID + const counterparty = ci.counterparty != null ? (ci.counterparty as string) : defaultCounterparty const beef = new Beef() beef.mergeBeef((result as any).BEEF as number[]) @@ -299,7 +307,7 @@ export function createTokenMethods(core: WalletCore) { options: { randomizeOutputs: false } } as any) - if (!(response as any)?.signableTransaction) { + if ((response as any)?.signableTransaction == null) { throw new Error('Expected signableTransaction') } @@ -313,15 +321,15 @@ export function createTokenMethods(core: WalletCore) { await txToSign.sign() const unlockingScript = txToSign.inputs[0].unlockingScript?.toHex() - if (!unlockingScript) throw new Error('Failed to generate unlocking script') + if (unlockingScript == null || unlockingScript === '') throw new Error('Failed to generate unlocking script') const finalResult = await client.signAction({ reference: signable.reference, - spends: { '0': { unlockingScript } } + spends: { 0: { unlockingScript } } }) return { - txid: (finalResult as any).txid || '', + txid: (finalResult as any).txid ?? '', tx: (finalResult as any).tx } } catch (error) { @@ -329,7 +337,7 @@ export function createTokenMethods(core: WalletCore) { } }, - async sendTokenViaMessageBox(options: SendTokenOptions): Promise { + async sendTokenViaMessageBox (options: SendTokenOptions): Promise { try { const client = core.getClient() const { basket, outpoint, to } = options @@ -346,15 +354,15 @@ export function createTokenMethods(core: WalletCore) { const outputs = result?.outputs ?? [] const targetOutput = outputs.find((o: any) => o.outpoint === outpoint) - if (!targetOutput) throw new Error(`Token not found: ${outpoint}`) + if (targetOutput == null) throw new Error(`Token not found: ${outpoint}`) let ci: any = {} - if ((targetOutput as any).customInstructions) { - try { ci = JSON.parse((targetOutput as any).customInstructions) } catch {} + if ((targetOutput as any).customInstructions != null) { + try { ci = JSON.parse((targetOutput as any).customInstructions as string) } catch {} } - const protocolID = ci.protocolID || defaultProtocolID - const keyID = ci.keyID || defaultKeyID - const counterparty = ci.counterparty || defaultCounterparty + const protocolID = ci.protocolID != null ? ci.protocolID : defaultProtocolID + const keyID = ci.keyID != null ? (ci.keyID as string) : defaultKeyID + const counterparty = ci.counterparty != null ? (ci.counterparty as string) : defaultCounterparty const beef = new Beef() beef.mergeBeef((result as any).BEEF as number[]) @@ -362,7 +370,7 @@ export function createTokenMethods(core: WalletCore) { const [txid, voutStr] = outpoint.split('.') const vout = Number(voutStr) const sourceTx = beef.findAtomicTransaction(txid) as Transaction - const sourceScript = sourceTx.outputs[vout].lockingScript as LockingScript + const sourceScript = sourceTx.outputs[vout].lockingScript const decoded = PushDrop.decode(sourceScript) const newKeyID = Utils.toBase64(Random(8)) @@ -378,7 +386,7 @@ export function createTokenMethods(core: WalletCore) { const inputBEEF = beef.toBinary() const response = await client.createAction({ - description: `Send token via MessageBox`, + description: 'Send token via MessageBox', inputBEEF, inputs: [{ outpoint, @@ -393,7 +401,7 @@ export function createTokenMethods(core: WalletCore) { options: { randomizeOutputs: false } } as any) - if (!(response as any)?.signableTransaction) { + if ((response as any)?.signableTransaction == null) { throw new Error('Expected signableTransaction') } @@ -407,11 +415,11 @@ export function createTokenMethods(core: WalletCore) { await txToSign.sign() const unlockingScript = txToSign.inputs[0].unlockingScript?.toHex() - if (!unlockingScript) throw new Error('Failed to generate unlocking script') + if (unlockingScript == null || unlockingScript === '') throw new Error('Failed to generate unlocking script') const finalResult = await client.signAction({ reference: signable.reference, - spends: { '0': { unlockingScript } } + spends: { 0: { unlockingScript } } }) // Send via MessageBox @@ -433,7 +441,7 @@ export function createTokenMethods(core: WalletCore) { }) return { - txid: (finalResult as any).txid || '', + txid: (finalResult as any).txid ?? '', tx: (finalResult as any).tx } } catch (error) { @@ -441,7 +449,7 @@ export function createTokenMethods(core: WalletCore) { } }, - async listIncomingTokens(): Promise { + async listIncomingTokens (): Promise { try { const client = core.getClient() const peerPay = new PeerPayClient({ @@ -460,7 +468,7 @@ export function createTokenMethods(core: WalletCore) { } return { messageId: msg.messageId, - sender: body?.sender || msg.sender, + sender: (body?.sender != null ? body.sender : msg.sender) as string, transaction: body?.transaction, protocolID: body?.protocolID, keyID: body?.keyID, @@ -473,7 +481,7 @@ export function createTokenMethods(core: WalletCore) { } }, - async acceptIncomingToken(token: any, basket?: string): Promise { + async acceptIncomingToken (token: any, basket?: string): Promise { try { const client = core.getClient() const effectiveBasket = basket ?? core.defaults.tokenBasket @@ -493,7 +501,7 @@ export function createTokenMethods(core: WalletCore) { tags: ['token', 'received'] } }], - description: `Receive token from ${token.sender?.substring(0, 20)}...` + description: `Receive token from ${String(token.sender).substring(0, 20)}...` } as any) const peerPay = new PeerPayClient({ diff --git a/src/server.ts b/src/server.ts index 0c2b924..aa91a08 100644 --- a/src/server.ts +++ b/src/server.ts @@ -28,6 +28,71 @@ import { createOverlayMethods } from './modules/overlay' import { createDIDMethods } from './modules/did' import { createCredentialMethods } from './modules/credentials' +// Re-export everything from the browser entry +export * from './browser' +export type { BrowserWallet } from './browser' + +// Re-export all types (including server-only types) +export type { + Network, + WalletDefaults, + TransactionResult, + OutputInfo, + WalletStatus, + WalletInfo, + PaymentOptions, + SendOutputSpec, + SendOutputDetail, + SendOptions, + SendResult, + DerivationInfo, + PaymentDerivation, + TokenOptions, + TokenResult, + TokenDetail, + SendTokenOptions, + RedeemTokenOptions, + InscriptionType, + InscriptionOptions, + InscriptionResult, + MessageBoxConfig, + CertifierConfig, + CertificateData, + OverlayConfig, + OverlayInfo, + OverlayBroadcastResult, + OverlayOutput, + ServerWalletConfig, + PaymentRequest, + IncomingPayment, + DIDDocument, + DIDVerificationMethod, + DIDParseResult, + CredentialFieldType, + CredentialFieldSchema, + CredentialSchemaConfig, + VerifiableCredential, + VerifiablePresentation, + VerificationResult, + CredentialIssuerConfig, + RevocationRecord, + RevocationStore +} from './core/types' + +// Re-export errors +export { + SimpleError, + WalletError, + TransactionError, + MessageBoxError, + CertificationError, + DIDError, + CredentialError +} from './core/errors' + +// Server-specific exports +export { FileRevocationStore } from './modules/file-revocation-store' + // ============================================================================ // Utility: generate a random private key hex without exposing @bsv/sdk // ============================================================================ diff --git a/src/server/credential-issuer-handler.ts b/src/server/credential-issuer-handler.ts index d1d6d7e..2a482a0 100644 --- a/src/server/credential-issuer-handler.ts +++ b/src/server/credential-issuer-handler.ts @@ -9,7 +9,7 @@ */ import { join } from 'path' -import { CredentialIssuerHandlerConfig, CredentialSchemaConfig } from '../core/types' +import { CredentialIssuerHandlerConfig } from '../core/types' import { JsonFileStore } from './json-file-store' import { ServerWalletManager } from './server-wallet-manager' import { @@ -24,28 +24,30 @@ import { // Lazy issuer singleton // ============================================================================ -function createIssuerFactory(config: CredentialIssuerHandlerConfig) { +function createIssuerFactory ( + config: CredentialIssuerHandlerConfig +): () => Promise { let issuerInstance: any = null let issuerInitPromise: Promise | null = null - const envVar = config.envVar || 'CREDENTIAL_ISSUER_KEY' - const keyFile = config.keyFile || join(process.cwd(), '.credential-issuer-key.json') - const keyStore = new JsonFileStore<{ privateKey: string; publicKey: string }>(keyFile) + const envVar = config.envVar ?? 'CREDENTIAL_ISSUER_KEY' + const keyFile = config.keyFile ?? join(process.cwd(), '.credential-issuer-key.json') + const keyStore = new JsonFileStore<{ privateKey: string, publicKey: string }>(keyFile) return async () => { - if (issuerInstance) return issuerInstance - if (issuerInitPromise) return issuerInitPromise + if (issuerInstance != null) return issuerInstance + if (issuerInitPromise != null) return await issuerInitPromise issuerInitPromise = (async () => { - const { CredentialIssuer, CredentialSchema } = await import('../modules/credentials') + const { CredentialIssuer } = await import('../modules/credentials') const { generatePrivateKey } = await import('../server') const savedData = keyStore.load() - const privateKey = process.env[envVar] || savedData?.privateKey || generatePrivateKey() + const privateKey = process.env[envVar] ?? savedData?.privateKey ?? generatePrivateKey() // Prepare revocation config let revocationConfig: any = { enabled: false } - if (config.serverWalletManager) { + if (config.serverWalletManager != null) { try { const swm = config.serverWalletManager as ServerWalletManager const wallet = await swm.getWallet() @@ -54,7 +56,7 @@ function createIssuerFactory(config: CredentialIssuerHandlerConfig) { enabled: true, wallet: wallet.getClient(), store: new FileRevocationStore( - config.revocationStorePath || join(process.cwd(), '.revocation-secrets.json') + config.revocationStorePath ?? join(process.cwd(), '.revocation-secrets.json') ) } } catch { @@ -68,14 +70,14 @@ function createIssuerFactory(config: CredentialIssuerHandlerConfig) { revocation: revocationConfig }) - if (!process.env[envVar]) { + if (process.env[envVar] == null) { keyStore.save({ privateKey, publicKey: issuerInstance.getInfo().publicKey }) } return issuerInstance })() - return issuerInitPromise + return await issuerInitPromise } } @@ -83,12 +85,12 @@ function createIssuerFactory(config: CredentialIssuerHandlerConfig) { // Helper: detect legacy path-based requests // ============================================================================ -function getLegacySubPath(url: string): string | null { +function getLegacySubPath (url: string): string | null { try { const pathname = new URL(url).pathname // Match patterns like /api/credential-issuer/api/info or /api/credential-issuer/api/certify const match = pathname.match(/\/api\/([a-z]+)$/) - if (match) { + if (match != null) { const segment = match[1] if (segment === 'info' || segment === 'certify') return segment } @@ -102,11 +104,11 @@ function getLegacySubPath(url: string): string | null { // Next.js handler factory // ============================================================================ -export function createCredentialIssuerHandler(config: CredentialIssuerHandlerConfig) { +export function createCredentialIssuerHandler (config: CredentialIssuerHandlerConfig): ReturnType { const getIssuer = createIssuerFactory(config) const coreHandlers = { - async GET(req: HandlerRequest): Promise { + async GET (req: HandlerRequest): Promise { try { const legacyPath = getLegacySubPath(req.url) const params = getSearchParams(req.url) @@ -120,7 +122,7 @@ export function createCredentialIssuerHandler(config: CredentialIssuerHandlerCon return jsonResponse({ certifierPublicKey: info.publicKey, certificateType }) } - const action = params.get('action') || 'info' + const action = params.get('action') ?? 'info' if (action === 'info') { const issuer = await getIssuer() @@ -144,17 +146,17 @@ export function createCredentialIssuerHandler(config: CredentialIssuerHandlerCon if (action === 'schema') { const issuer = await getIssuer() - const id = params.get('id') || config.schemas[0]?.id + const id = params.get('id') ?? config.schemas[0]?.id const info = issuer.getInfo() const schema = info.schemas?.find((s: any) => s.id === id) - if (!schema) return jsonResponse({ success: false, error: `Schema "${id}" not found` }, 404) + if (schema == null) return jsonResponse({ success: false, error: `Schema "${String(id)}" not found` }, 404) return jsonResponse({ success: true, schema }) } if (action === 'status') { const issuer = await getIssuer() const sn = params.get('serialNumber') - if (!sn) return jsonResponse({ success: false, error: 'Missing serialNumber' }, 400) + if (sn == null || sn === '') return jsonResponse({ success: false, error: 'Missing serialNumber' }, 400) const revoked = await issuer.isRevoked(sn) return jsonResponse({ success: true, serialNumber: sn, revoked }) } @@ -171,7 +173,7 @@ export function createCredentialIssuerHandler(config: CredentialIssuerHandlerCon } }, - async POST(req: HandlerRequest): Promise { + async POST (req: HandlerRequest): Promise { try { const body = await req.json() const legacyPath = getLegacySubPath(req.url) @@ -180,11 +182,11 @@ export function createCredentialIssuerHandler(config: CredentialIssuerHandlerCon // Legacy path: POST .../api/certify if (legacyPath === 'certify') { const { identityKey, schemaId, fields } = body - if (!identityKey || !fields) { + if ((identityKey == null) || (fields == null)) { return jsonResponse({ error: 'Missing identityKey or fields' }, 400) } const issuer = await getIssuer() - const vc = await issuer.issue(identityKey, schemaId || config.schemas[0]?.id, fields) + const vc = await issuer.issue(identityKey, schemaId ?? config.schemas[0]?.id, fields) return jsonResponse(vc._bsv.certificate) } @@ -193,27 +195,27 @@ export function createCredentialIssuerHandler(config: CredentialIssuerHandlerCon // New query-param based certify — also used by acquireCredential() if (action === 'certify') { const { identityKey, schemaId, fields } = body - if (!identityKey || !fields) { + if ((identityKey == null) || (fields == null)) { return jsonResponse({ error: 'Missing identityKey or fields' }, 400) } const issuer = await getIssuer() - const vc = await issuer.issue(identityKey, schemaId || config.schemas[0]?.id, fields) + const vc = await issuer.issue(identityKey, schemaId ?? config.schemas[0]?.id, fields) return jsonResponse(vc._bsv.certificate) } if (action === 'issue') { const { subjectKey, schemaId, fields } = body - if (!subjectKey || !fields) { + if ((subjectKey == null) || (fields == null)) { return jsonResponse({ success: false, error: 'Missing subjectKey or fields' }, 400) } const issuer = await getIssuer() - const vc = await issuer.issue(subjectKey, schemaId || config.schemas[0]?.id, fields) + const vc = await issuer.issue(subjectKey, schemaId ?? config.schemas[0]?.id, fields) return jsonResponse({ success: true, credential: vc }) } if (action === 'verify') { const { credential } = body - if (!credential) return jsonResponse({ success: false, error: 'Missing credential' }, 400) + if (credential == null) return jsonResponse({ success: false, error: 'Missing credential' }, 400) const issuer = await getIssuer() const result = await issuer.verify(credential) return jsonResponse({ success: true, verification: result }) @@ -221,13 +223,13 @@ export function createCredentialIssuerHandler(config: CredentialIssuerHandlerCon if (action === 'revoke') { const { serialNumber } = body - if (!serialNumber) return jsonResponse({ success: false, error: 'Missing serialNumber' }, 400) + if (serialNumber == null || serialNumber === '') return jsonResponse({ success: false, error: 'Missing serialNumber' }, 400) const issuer = await getIssuer() const result = await issuer.revoke(serialNumber) return jsonResponse({ success: true, ...result }) } - return jsonResponse({ success: false, error: `Unknown action: ${action}` }, 400) + return jsonResponse({ success: false, error: `Unknown action: ${String(action)}` }, 400) } catch (error) { return jsonResponse({ success: false, error: `Failed: ${(error as Error).message}` }, 500) } diff --git a/src/server/did-resolver.ts b/src/server/did-resolver.ts index 5f822f8..276c07a 100644 --- a/src/server/did-resolver.ts +++ b/src/server/did-resolver.ts @@ -25,7 +25,7 @@ const BSVDID_MARKER = 'BSVDID' // OP_RETURN parser // ============================================================================ -function hexToBytes(hex: string): number[] { +function hexToBytes (hex: string): number[] { const bytes: number[] = [] for (let i = 0; i < hex.length; i += 2) { bytes.push(parseInt(hex.substring(i, i + 2), 16)) @@ -33,7 +33,7 @@ function hexToBytes(hex: string): number[] { return bytes } -function parseOpReturnSegments(hexScript: string): string[] { +function parseOpReturnSegments (hexScript: string): string[] { try { const bytes = hexToBytes(hexScript) const segments: string[] = [] @@ -84,19 +84,19 @@ function parseOpReturnSegments(hexScript: string): string[] { // ============================================================================ export class DIDResolverService { - private resolverUrl: string - private wocBaseUrl: string - private resolverTimeout: number - private maxHops: number - - constructor(config?: DIDResolverConfig) { - this.resolverUrl = config?.resolverUrl || DEFAULT_RESOLVER_URL - this.wocBaseUrl = config?.wocBaseUrl || DEFAULT_WOC_BASE - this.resolverTimeout = config?.resolverTimeout || 10_000 - this.maxHops = config?.maxHops || 100 + private readonly resolverUrl: string + private readonly wocBaseUrl: string + private readonly resolverTimeout: number + private readonly maxHops: number + + constructor (config?: DIDResolverConfig) { + this.resolverUrl = config?.resolverUrl ?? DEFAULT_RESOLVER_URL + this.wocBaseUrl = config?.wocBaseUrl ?? DEFAULT_WOC_BASE + this.resolverTimeout = config?.resolverTimeout ?? 10_000 + this.maxHops = config?.maxHops ?? 100 } - async resolve(did: string): Promise { + async resolve (did: string): Promise { const txidMatch = did.match(/^did:bsv:([0-9a-f]{64})$/i) // Try nChain Universal Resolver @@ -104,7 +104,7 @@ export class DIDResolverService { const response = await fetch( `${this.resolverUrl}/1.0/identifiers/${encodeURIComponent(did)}`, { - headers: { 'Accept': 'application/did+ld+json' }, + headers: { Accept: 'application/did+ld+json' }, signal: AbortSignal.timeout(this.resolverTimeout) } ) @@ -112,11 +112,11 @@ export class DIDResolverService { if (response.ok) { const data: any = await response.json() return { - didDocument: data.didDocument || data, - didDocumentMetadata: data.didDocumentMetadata || {}, + didDocument: data.didDocument ?? data, + didDocumentMetadata: data.didDocumentMetadata ?? {}, didResolutionMetadata: { contentType: 'application/did+ld+json', - ...(data.didResolutionMetadata || {}) + ...(data.didResolutionMetadata ?? {}) } } } @@ -124,11 +124,11 @@ export class DIDResolverService { if (response.status === 410) { const data: any = await response.json().catch(() => ({})) return { - didDocument: data.didDocument || null, - didDocumentMetadata: { deactivated: true, ...(data.didDocumentMetadata || {}) }, + didDocument: data.didDocument ?? null, + didDocumentMetadata: { deactivated: true, ...(data.didDocumentMetadata ?? {}) }, didResolutionMetadata: { contentType: 'application/did+ld+json', - ...(data.didResolutionMetadata || {}) + ...(data.didResolutionMetadata ?? {}) } } } @@ -137,8 +137,8 @@ export class DIDResolverService { } // WoC chain-following fallback - if (txidMatch) { - return this.resolveViaWoC(txidMatch[1].toLowerCase()) + if (txidMatch != null) { + return await this.resolveViaWoC(txidMatch[1].toLowerCase()) } return { @@ -148,7 +148,7 @@ export class DIDResolverService { } } - private async resolveViaWoC(txid: string): Promise { + private async resolveViaWoC (txid: string): Promise { const notFound: DIDResolutionResult = { didDocument: null, didDocumentMetadata: {}, @@ -171,15 +171,15 @@ export class DIDResolverService { if (!txResp.ok) return notFound const txData: any = await txResp.json() - if (!created) { - created = txData.time ? new Date(txData.time * 1000).toISOString() : undefined + if (created == null) { + created = (txData.time != null) ? new Date(txData.time * 1000).toISOString() : undefined } // Parse OP_RETURN outputs let segments: string[] = [] - for (const vout of txData.vout || []) { - const hex = vout?.scriptPubKey?.hex - if (!hex) continue + for (const vout of (txData.vout as any[] | null) ?? []) { + const hex = vout?.scriptPubKey?.hex as string | undefined + if (hex == null || hex === '') continue const s = parseOpReturnSegments(hex) if (s.length >= 3 && s[0] === BSVDID_MARKER) { segments = s @@ -204,7 +204,7 @@ export class DIDResolverService { try { lastDocument = JSON.parse(payload) lastDocTxid = currentTxid - updated = txData.time ? new Date(txData.time * 1000).toISOString() : undefined + updated = (txData.time != null) ? new Date(txData.time * 1000).toISOString() : undefined } catch { // Not valid JSON } @@ -219,21 +219,21 @@ export class DIDResolverService { const spendResp = await fetch(`${this.wocBaseUrl}/tx/${currentTxid}/out/0/spend`) if (spendResp.ok && spendResp.status !== 404) { const spendData: any = await spendResp.json() - nextTxid = spendData?.txid || null + nextTxid = spendData?.txid ?? null } } catch { /* fall through */ } // Strategy 2: address history fallback - if (!nextTxid) { + if (nextTxid == null) { const out0Addr = txData.vout?.[0]?.scriptPubKey?.addresses?.[0] - if (out0Addr) { + if (out0Addr != null) { try { - const histResp = await fetch(`${this.wocBaseUrl}/address/${out0Addr}/history`) + const histResp = await fetch(`${this.wocBaseUrl}/address/${String(out0Addr)}/history`) if (histResp.ok) { - const history = (await histResp.json()) as Array<{ tx_hash: string; height: number }> + const history = (await histResp.json()) as Array<{ tx_hash: string, height: number }> const candidates = history .filter(e => !visited.has(e.tx_hash)) - .sort((a, b) => (b.height || 0) - (a.height || 0)) + .sort((a, b) => (b.height !== 0 ? b.height : 0) - (a.height !== 0 ? a.height : 0)) if (candidates.length > 0) { nextTxid = candidates[0].tx_hash } @@ -242,11 +242,11 @@ export class DIDResolverService { } } - if (!nextTxid) break + if (nextTxid == null) break currentTxid = nextTxid } - if (lastDocument) { + if (lastDocument != null) { return { didDocument: lastDocument, didDocumentMetadata: { created, updated, versionId: lastDocTxid }, @@ -273,23 +273,25 @@ export class DIDResolverService { // Next.js handler factory // ============================================================================ -export function createDIDResolverHandler(config?: DIDResolverConfig) { +export function createDIDResolverHandler (config?: DIDResolverConfig): ReturnType { const resolver = new DIDResolverService(config) const coreHandlers = { - async GET(req: HandlerRequest): Promise { + async GET (req: HandlerRequest): Promise { const params = getSearchParams(req.url) const did = params.get('did') - if (!did) { + if (did == null || did === '') { return jsonResponse({ error: 'Missing "did" query parameter' }, 400) } try { const result = await resolver.resolve(did) - const status = result.didResolutionMetadata.error === 'notFound' ? 404 - : result.didResolutionMetadata.error === 'internalError' ? 502 - : 200 + const status = result.didResolutionMetadata.error === 'notFound' + ? 404 + : (result.didResolutionMetadata.error === 'internalError' + ? 502 + : 200) return jsonResponse(result, status) } catch (error) { return jsonResponse({ diff --git a/src/server/handler-types.ts b/src/server/handler-types.ts index 0933687..99951ba 100644 --- a/src/server/handler-types.ts +++ b/src/server/handler-types.ts @@ -6,7 +6,7 @@ export interface HandlerRequest { url: string method: string - json(): Promise + json: () => Promise } export interface HandlerResponse { @@ -20,7 +20,7 @@ export interface RouteHandler { } /** Extract search params from a URL string. */ -export function getSearchParams(url: string): URLSearchParams { +export function getSearchParams (url: string): URLSearchParams { try { return new URL(url).searchParams } catch { @@ -31,7 +31,7 @@ export function getSearchParams(url: string): URLSearchParams { } /** Create a JSON response object. */ -export function jsonResponse(data: any, status = 200): HandlerResponse { +export function jsonResponse (data: any, status = 200): HandlerResponse { return { status, body: data } } @@ -40,14 +40,14 @@ export function jsonResponse(data: any, status = 200): HandlerResponse { * Uses the Web-standard Response API (available in Next.js, Deno, Bun, etc.) * — no 'next/server' import needed. */ -export function toNextHandlers(handler: RouteHandler): { GET?: (req: any) => Promise; POST?: (req: any) => Promise } { - const wrapHandler = (method: 'GET' | 'POST') => { +export function toNextHandlers (handler: RouteHandler): { GET?: (req: any) => Promise, POST?: (req: any) => Promise } { + const wrapHandler = (method: 'GET' | 'POST'): ((req: any) => Promise) | undefined => { const coreFn = handler[method] - if (!coreFn) return undefined + if (coreFn == null) return undefined return async (req: any): Promise => { const result = await coreFn({ - url: req.url || req.nextUrl?.toString() || '', + url: (req.url as string | undefined) ?? req.nextUrl?.toString() ?? '', method, json: () => req.json() }) @@ -61,7 +61,7 @@ export function toNextHandlers(handler: RouteHandler): { GET?: (req: any) => Pro } return { - ...(handler.GET ? { GET: wrapHandler('GET') } : {}), - ...(handler.POST ? { POST: wrapHandler('POST') } : {}) + ...((handler.GET != null) ? { GET: wrapHandler('GET') } : {}), + ...((handler.POST != null) ? { POST: wrapHandler('POST') } : {}) } } diff --git a/src/server/identity-registry.ts b/src/server/identity-registry.ts index 4398156..fa04514 100644 --- a/src/server/identity-registry.ts +++ b/src/server/identity-registry.ts @@ -25,19 +25,19 @@ import { // ============================================================================ class FileIdentityRegistryStore implements IdentityRegistryStore { - private store: JsonFileStore + private readonly store: JsonFileStore - constructor(filePath?: string) { + constructor (filePath?: string) { this.store = new JsonFileStore( - filePath || join(process.cwd(), '.identity-registry.json') + filePath ?? join(process.cwd(), '.identity-registry.json') ) } - load(): RegistryEntry[] { - return this.store.load() || [] + load (): RegistryEntry[] { + return this.store.load() ?? [] } - save(entries: RegistryEntry[]): void { + save (entries: RegistryEntry[]): void { this.store.save(entries) } } @@ -54,42 +54,42 @@ export interface RegistryResult { } export class IdentityRegistry { - private store: IdentityRegistryStore - private validateTag?: (tag: string, identityKey: string) => string | null - private maxTagsPerIdentity: number + private readonly store: IdentityRegistryStore + private readonly validateTag?: (tag: string, identityKey: string) => string | null + private readonly maxTagsPerIdentity: number - constructor(config?: IdentityRegistryConfig) { - this.store = config?.store || new FileIdentityRegistryStore() + constructor (config?: IdentityRegistryConfig) { + this.store = config?.store ?? new FileIdentityRegistryStore() this.validateTag = config?.validateTag this.maxTagsPerIdentity = config?.maxTagsPerIdentity ?? Infinity } - lookup(query: string): { tag: string; identityKey: string }[] { + lookup (query: string): Array<{ tag: string, identityKey: string }> { const q = query.trim().toLowerCase() - if (!q) return [] + if (q === '') return [] const entries = this.store.load() return entries .filter(e => e.tag.toLowerCase().includes(q)) .map(e => ({ tag: e.tag, identityKey: e.identityKey })) } - list(identityKey: string): { tag: string; createdAt: string }[] { + list (identityKey: string): Array<{ tag: string, createdAt: string }> { const entries = this.store.load() return entries .filter(e => e.identityKey === identityKey) .map(e => ({ tag: e.tag, createdAt: e.createdAt })) } - register(tag: string, identityKey: string): RegistryResult { + register (tag: string, identityKey: string): RegistryResult { const normalizedTag = tag.trim() - if (!normalizedTag) { + if (normalizedTag === '') { return { success: false, message: 'Tag cannot be empty', tag: normalizedTag, error: 'Tag cannot be empty' } } // Custom validation - if (this.validateTag) { + if (this.validateTag != null) { const err = this.validateTag(normalizedTag, identityKey) - if (err) { + if (err != null) { return { success: false, message: err, tag: normalizedTag, error: err } } } @@ -98,10 +98,10 @@ export class IdentityRegistry { // Check tag ownership const existing = entries.find(e => e.tag.toLowerCase() === normalizedTag.toLowerCase()) - if (existing && existing.identityKey !== identityKey) { + if ((existing != null) && existing.identityKey !== identityKey) { return { success: false, message: `Tag "${normalizedTag}" is already registered to another identity`, tag: normalizedTag, error: `Tag "${normalizedTag}" is already registered to another identity` } } - if (existing && existing.identityKey === identityKey) { + if ((existing != null) && existing.identityKey === identityKey) { return { success: true, message: 'Tag already registered', tag: normalizedTag } } @@ -118,7 +118,7 @@ export class IdentityRegistry { return { success: true, message: 'Tag registered', tag: normalizedTag } } - revoke(tag: string, identityKey: string): RegistryResult { + revoke (tag: string, identityKey: string): RegistryResult { const normalizedTag = tag.trim() const entries = this.store.load() const idx = entries.findIndex( @@ -137,61 +137,61 @@ export class IdentityRegistry { // Next.js handler factory // ============================================================================ -export function createIdentityRegistryHandler(config?: IdentityRegistryConfig) { +export function createIdentityRegistryHandler (config?: IdentityRegistryConfig): ReturnType { const registry = new IdentityRegistry(config) const coreHandlers = { - async GET(req: HandlerRequest): Promise { + async GET (req: HandlerRequest): Promise { const params = getSearchParams(req.url) const action = params.get('action') try { if (action === 'lookup') { - const query = (params.get('query') || '').trim() - if (!query) return jsonResponse({ success: false, error: 'Missing query parameter' }, 400) + const query = (params.get('query') ?? '').trim() + if (query === '') return jsonResponse({ success: false, error: 'Missing query parameter' }, 400) const results = registry.lookup(query) return jsonResponse({ success: true, query, results }) } if (action === 'list') { const identityKey = params.get('identityKey') - if (!identityKey) return jsonResponse({ success: false, error: 'Missing identityKey parameter' }, 400) + if (identityKey == null || identityKey === '') return jsonResponse({ success: false, error: 'Missing identityKey parameter' }, 400) const tags = registry.list(identityKey) return jsonResponse({ success: true, tags }) } - return jsonResponse({ success: false, error: `Unknown action: ${action}` }, 400) + return jsonResponse({ success: false, error: `Unknown action: ${String(action)}` }, 400) } catch (error) { - return jsonResponse({ success: false, error: `${action} failed: ${(error as Error).message}` }, 500) + return jsonResponse({ success: false, error: `${String(action)} failed: ${(error as Error).message}` }, 500) } }, - async POST(req: HandlerRequest): Promise { + async POST (req: HandlerRequest): Promise { const params = getSearchParams(req.url) const action = params.get('action') try { const body = await req.json() - const { tag, identityKey } = body as { tag?: string; identityKey?: string } - if (!tag || !identityKey) { + const { tag, identityKey } = body as { tag?: string, identityKey?: string } + if ((tag == null || tag === '') || (identityKey == null || identityKey === '')) { return jsonResponse({ success: false, error: 'Missing required fields: tag, identityKey' }, 400) } if (action === 'register') { const result = registry.register(tag, identityKey) return jsonResponse( - result.error ? { success: false, error: result.error } : { success: true, message: result.message, tag: result.tag }, + (result.error != null) ? { success: false, error: result.error } : { success: true, message: result.message, tag: result.tag }, result.success ? 200 : 409 ) } if (action === 'revoke') { const result = registry.revoke(tag, identityKey) return jsonResponse( - result.error ? { success: false, error: result.error } : { success: true, message: result.message, tag: result.tag }, + (result.error != null) ? { success: false, error: result.error } : { success: true, message: result.message, tag: result.tag }, result.success ? 200 : 404 ) } - return jsonResponse({ success: false, error: `Unknown action: ${action}` }, 400) + return jsonResponse({ success: false, error: `Unknown action: ${String(action)}` }, 400) } catch (error) { - return jsonResponse({ success: false, error: `${action} failed: ${(error as Error).message}` }, 500) + return jsonResponse({ success: false, error: `${String(action)} failed: ${(error as Error).message}` }, 500) } } } diff --git a/src/server/json-file-store.ts b/src/server/json-file-store.ts index fdf1c75..2bbb834 100644 --- a/src/server/json-file-store.ts +++ b/src/server/json-file-store.ts @@ -6,9 +6,9 @@ import { readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs' export class JsonFileStore { - constructor(private filePath: string) {} + constructor (private readonly filePath: string) {} - load(): T | null { + load (): T | null { try { if (existsSync(this.filePath)) { return JSON.parse(readFileSync(this.filePath, 'utf-8')) @@ -19,11 +19,11 @@ export class JsonFileStore { return null } - save(data: T): void { + save (data: T): void { writeFileSync(this.filePath, JSON.stringify(data, null, 2)) } - delete(): void { + delete (): void { try { if (existsSync(this.filePath)) unlinkSync(this.filePath) } catch { @@ -31,7 +31,7 @@ export class JsonFileStore { } } - exists(): boolean { + exists (): boolean { return existsSync(this.filePath) } } diff --git a/src/server/server-wallet-manager.ts b/src/server/server-wallet-manager.ts index 8062233..633c009 100644 --- a/src/server/server-wallet-manager.ts +++ b/src/server/server-wallet-manager.ts @@ -24,36 +24,36 @@ import { // ============================================================================ export class ServerWalletManager { - private envVar: string - private keyFile: string - private network: 'main' | 'testnet' - private storageUrl: string - private defaultRequestSatoshis: number - private requestMemo: string - private store: JsonFileStore<{ privateKey: string; identityKey: string }> + private readonly envVar: string + private readonly keyFile: string + private readonly network: 'main' | 'testnet' + private readonly storageUrl: string + private readonly defaultRequestSatoshis: number + private readonly requestMemo: string + private readonly store: JsonFileStore<{ privateKey: string, identityKey: string }> private wallet: any = null private initPromise: Promise | null = null - constructor(config?: ServerWalletManagerConfig) { - this.envVar = config?.envVar || 'SERVER_PRIVATE_KEY' - this.keyFile = config?.keyFile || join(process.cwd(), '.server-wallet.json') - this.network = config?.network || 'main' - this.storageUrl = config?.storageUrl || 'https://storage.babbage.systems' - this.defaultRequestSatoshis = config?.defaultRequestSatoshis || 1000 - this.requestMemo = config?.requestMemo || 'Server wallet funding' + constructor (config?: ServerWalletManagerConfig) { + this.envVar = config?.envVar ?? 'SERVER_PRIVATE_KEY' + this.keyFile = config?.keyFile ?? join(process.cwd(), '.server-wallet.json') + this.network = config?.network ?? 'main' + this.storageUrl = config?.storageUrl ?? 'https://storage.babbage.systems' + this.defaultRequestSatoshis = config?.defaultRequestSatoshis ?? 1000 + this.requestMemo = config?.requestMemo ?? 'Server wallet funding' this.store = new JsonFileStore(this.keyFile) } - async getWallet(): Promise { - if (this.wallet) return this.wallet - if (this.initPromise) return this.initPromise + async getWallet (): Promise { + if (this.wallet != null) return this.wallet + if (this.initPromise != null) return await this.initPromise this.initPromise = (async () => { const { ServerWallet } = await import('../server') const { generatePrivateKey } = await import('../server') const savedData = this.store.load() - const privateKey = process.env[this.envVar] || savedData?.privateKey || generatePrivateKey() + const privateKey = process.env[this.envVar] ?? savedData?.privateKey ?? generatePrivateKey() this.wallet = await ServerWallet.create({ privateKey, @@ -62,25 +62,25 @@ export class ServerWalletManager { }) // Persist key if not from env - if (!process.env[this.envVar]) { + if (process.env[this.envVar] == null) { this.store.save({ privateKey, identityKey: this.wallet.getIdentityKey() }) } return this.wallet })() - return this.initPromise + return await this.initPromise } - getStatus(): { saved: boolean; identityKey: string | null } { + getStatus (): { saved: boolean, identityKey: string | null } { const data = this.store.load() return { saved: data !== null, - identityKey: data?.identityKey || null + identityKey: data?.identityKey ?? null } } - reset(): void { + reset (): void { this.wallet = null this.initPromise = null this.store.delete() @@ -91,13 +91,13 @@ export class ServerWalletManager { // Next.js handler factory // ============================================================================ -export function createServerWalletHandler(config?: ServerWalletManagerConfig) { +export function createServerWalletHandler (config?: ServerWalletManagerConfig): ReturnType { const manager = new ServerWalletManager(config) const coreHandlers = { - async GET(req: HandlerRequest): Promise { + async GET (req: HandlerRequest): Promise { const params = getSearchParams(req.url) - const action = params.get('action') || 'create' + const action = params.get('action') ?? 'create' try { if (action === 'status') { @@ -121,10 +121,11 @@ export function createServerWalletHandler(config?: ServerWalletManagerConfig) { if (action === 'request') { const wallet = await manager.getWallet() - const satoshis = parseInt(params.get('satoshis') || '') || (config?.defaultRequestSatoshis ?? 1000) + const satoshisStr = params.get('satoshis') + const satoshis = (satoshisStr != null && satoshisStr !== '') ? parseInt(satoshisStr, 10) : (config?.defaultRequestSatoshis ?? 1000) const request = wallet.createPaymentRequest({ satoshis, - memo: config?.requestMemo || 'Server wallet funding' + memo: config?.requestMemo ?? 'Server wallet funding' }) return jsonResponse({ success: true, @@ -136,12 +137,12 @@ export function createServerWalletHandler(config?: ServerWalletManagerConfig) { if (action === 'balance') { const wallet = await manager.getWallet() const client = wallet.getClient() - const basket = params.get('basket') || 'default' + const basket = params.get('basket') ?? 'default' const result = await client.listOutputs({ basket }) const outputList = result?.outputs ?? [] - const totalSatoshis = outputList.reduce((sum: number, o: any) => sum + (o.satoshis || 0), 0) + const totalSatoshis = outputList.reduce((sum: number, o: any) => sum + (o.satoshis != null ? (o.satoshis as number) : 0), 0) const spendable = outputList.filter((o: any) => o.spendable !== false) - const spendableSatoshis = spendable.reduce((sum: number, o: any) => sum + (o.satoshis || 0), 0) + const spendableSatoshis = spendable.reduce((sum: number, o: any) => sum + (o.satoshis != null ? (o.satoshis as number) : 0), 0) return jsonResponse({ success: true, basket, @@ -155,7 +156,7 @@ export function createServerWalletHandler(config?: ServerWalletManagerConfig) { if (action === 'outputs') { const wallet = await manager.getWallet() const client = wallet.getClient() - const basket = params.get('basket') || 'default' + const basket = params.get('basket') ?? 'default' const result = await client.listOutputs({ basket, include: 'locking scripts' }) const outputList = result?.outputs ?? [] return jsonResponse({ @@ -170,25 +171,25 @@ export function createServerWalletHandler(config?: ServerWalletManagerConfig) { }) } - return jsonResponse({ success: false, error: `Unknown action: ${action}` }, 400) + return jsonResponse({ success: false, error: `Unknown action: ${String(action)}` }, 400) } catch (error) { if (action === 'create') { manager.reset() } - return jsonResponse({ success: false, error: `${action} failed: ${(error as Error).message}` }, 500) + return jsonResponse({ success: false, error: `${String(action)} failed: ${(error as Error).message}` }, 500) } }, - async POST(req: HandlerRequest): Promise { + async POST (req: HandlerRequest): Promise { const params = getSearchParams(req.url) - const action = params.get('action') || 'receive' + const action = params.get('action') ?? 'receive' try { if (action === 'receive') { const wallet = await manager.getWallet() const body = await req.json() const { tx, senderIdentityKey, derivationPrefix, derivationSuffix, outputIndex } = body - if (!tx || !senderIdentityKey || !derivationPrefix || !derivationSuffix) { + if ((tx == null) || (senderIdentityKey == null) || (derivationPrefix == null) || (derivationSuffix == null)) { return jsonResponse({ success: false, error: 'Missing required fields: tx, senderIdentityKey, derivationPrefix, derivationSuffix' @@ -208,9 +209,9 @@ export function createServerWalletHandler(config?: ServerWalletManagerConfig) { serverIdentityKey: wallet.getIdentityKey() }) } - return jsonResponse({ success: false, error: `Unknown action: ${action}` }, 400) + return jsonResponse({ success: false, error: `Unknown action: ${String(action)}` }, 400) } catch (error) { - return jsonResponse({ success: false, error: `${action} failed: ${(error as Error).message}` }, 500) + return jsonResponse({ success: false, error: `${String(action)} failed: ${(error as Error).message}` }, 500) } } } diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 0000000..1607b31 --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": true + }, + "include": [ + "./src/**/*.ts" + ] +}