From f7c0c785cb88235cb6c8efafbdd20be4c3512f17 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 27 Jul 2026 14:46:39 +0530 Subject: [PATCH 01/40] feat: add obligation escrow commands and types - Introduced new commands for managing BoE obligations, including accept, reject, transfer, and return functionalities. - Added types for obligation registry and escrow commands to enhance type safety and clarity. - Implemented shared utilities for prompting user inputs across obligation escrow commands. - Enhanced transaction handling with detailed logging and error management for better user experience. --- README.md | 364 +++++++++++++++++- src/commands/helpers.ts | 74 ++++ .../accept-return-to-issuer.ts | 51 +++ src/commands/obligation-escrow/accept.ts | 49 +++ src/commands/obligation-escrow/discharge.ts | 50 +++ .../endorse-transfer-owner.ts | 55 +++ src/commands/obligation-escrow/index.ts | 11 + .../nominate-transfer-owner.ts | 55 +++ .../reject-return-to-issuer.ts | 51 +++ .../reject-transfer-holder.ts | 50 +++ .../reject-transfer-owner-holder.ts | 50 +++ .../reject-transfer-owner.ts | 50 +++ src/commands/obligation-escrow/reject.ts | 49 +++ .../obligation-escrow/return-to-issuer.ts | 50 +++ src/commands/obligation-escrow/runTx.ts | 93 +++++ src/commands/obligation-escrow/shared.ts | 40 ++ src/commands/obligation-escrow/status.ts | 59 +++ .../obligation-escrow/transfer-holder.ts | 58 +++ .../transfer-owner-holder.ts | 65 ++++ src/commands/obligation-registry/deploy.ts | 145 +++++++ src/commands/obligation-registry/index.ts | 11 + src/commands/obligation-registry/mint.ts | 161 ++++++++ src/commands/verify-obligation.ts | 139 +++++++ src/types.ts | 33 ++ src/utils/index.ts | 3 + src/utils/obligation-document.ts | 68 ++++ .../accept-return-to-issuer.test.ts | 121 ++++++ .../commands/obligation-escrow/accept.test.ts | 85 ++++ .../obligation-escrow/discharge.test.ts | 92 +++++ .../endorse-transfer-owner.test.ts | 95 +++++ .../nominate-transfer-owner.test.ts | 95 +++++ .../reject-return-to-issuer.test.ts | 121 ++++++ .../reject-transfer-holder.test.ts | 92 +++++ .../reject-transfer-owner-holder.test.ts | 92 +++++ .../reject-transfer-owner.test.ts | 92 +++++ .../commands/obligation-escrow/reject.test.ts | 89 +++++ .../return-to-issuer.test.ts | 68 ++++ .../commands/obligation-escrow/status.test.ts | 71 ++++ .../obligation-escrow/transfer-holder.test.ts | 95 +++++ .../transfer-owner-holder.test.ts | 101 +++++ .../obligation-registry/deploy.test.ts | 135 +++++++ .../commands/obligation-registry/mint.test.ts | 158 ++++++++ tests/commands/verify-obligation.test.ts | 102 +++++ .../obligation/w3c-obligation-record.json | 116 ++++++ 44 files changed, 3703 insertions(+), 1 deletion(-) create mode 100644 src/commands/obligation-escrow/accept-return-to-issuer.ts create mode 100644 src/commands/obligation-escrow/accept.ts create mode 100644 src/commands/obligation-escrow/discharge.ts create mode 100644 src/commands/obligation-escrow/endorse-transfer-owner.ts create mode 100644 src/commands/obligation-escrow/index.ts create mode 100644 src/commands/obligation-escrow/nominate-transfer-owner.ts create mode 100644 src/commands/obligation-escrow/reject-return-to-issuer.ts create mode 100644 src/commands/obligation-escrow/reject-transfer-holder.ts create mode 100644 src/commands/obligation-escrow/reject-transfer-owner-holder.ts create mode 100644 src/commands/obligation-escrow/reject-transfer-owner.ts create mode 100644 src/commands/obligation-escrow/reject.ts create mode 100644 src/commands/obligation-escrow/return-to-issuer.ts create mode 100644 src/commands/obligation-escrow/runTx.ts create mode 100644 src/commands/obligation-escrow/shared.ts create mode 100644 src/commands/obligation-escrow/status.ts create mode 100644 src/commands/obligation-escrow/transfer-holder.ts create mode 100644 src/commands/obligation-escrow/transfer-owner-holder.ts create mode 100644 src/commands/obligation-registry/deploy.ts create mode 100644 src/commands/obligation-registry/index.ts create mode 100644 src/commands/obligation-registry/mint.ts create mode 100644 src/commands/verify-obligation.ts create mode 100644 src/utils/obligation-document.ts create mode 100644 tests/commands/obligation-escrow/accept-return-to-issuer.test.ts create mode 100644 tests/commands/obligation-escrow/accept.test.ts create mode 100644 tests/commands/obligation-escrow/discharge.test.ts create mode 100644 tests/commands/obligation-escrow/endorse-transfer-owner.test.ts create mode 100644 tests/commands/obligation-escrow/nominate-transfer-owner.test.ts create mode 100644 tests/commands/obligation-escrow/reject-return-to-issuer.test.ts create mode 100644 tests/commands/obligation-escrow/reject-transfer-holder.test.ts create mode 100644 tests/commands/obligation-escrow/reject-transfer-owner-holder.test.ts create mode 100644 tests/commands/obligation-escrow/reject-transfer-owner.test.ts create mode 100644 tests/commands/obligation-escrow/reject.test.ts create mode 100644 tests/commands/obligation-escrow/return-to-issuer.test.ts create mode 100644 tests/commands/obligation-escrow/status.test.ts create mode 100644 tests/commands/obligation-escrow/transfer-holder.test.ts create mode 100644 tests/commands/obligation-escrow/transfer-owner-holder.test.ts create mode 100644 tests/commands/obligation-registry/deploy.test.ts create mode 100644 tests/commands/obligation-registry/mint.test.ts create mode 100644 tests/commands/verify-obligation.test.ts create mode 100644 tests/fixtures/obligation/w3c-obligation-record.json diff --git a/README.md b/README.md index c846ef5..fa3c3dd 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ A comprehensive command-line interface for managing W3C Verifiable Credentials, - ✅ **Token Registry**: Mint tokens to blockchain-based token registries - ✅ **Document Store**: Deploy and manage document store contracts - ✅ **Title Escrow**: Complete transferable records management (holder/beneficiary transfers) +- ✅ **Obligation Registry (BoE)**: Deploy/mint obligation registries, manage ObligationEscrow lifecycle, and verify BoE documents via a dedicated pipeline - ✅ **Credential Status**: Create and update W3C credential status lists - ✅ **W3C Standards**: Compliant with latest W3C DID and Verifiable Credentials specifications - ✅ **Multi-Network Support**: Ethereum, Polygon, XDC, Stability, and Astron networks @@ -38,6 +39,7 @@ This CLI leverages the TrustVC package: - [Setup](#setup) - [Project Structure](#project-structure) - [License](#license) +- [Obligation Registry user guide](#obligation-registry-user-guide) ## Prerequisites @@ -188,6 +190,37 @@ trustvc title-escrow reject-transfer-owner trustvc title-escrow reject-transfer-owner-holder ``` +### Obligation Registry & Escrow (BoE) + +```sh +# Deploy Obligation Registry (TrustVCToken + factory) +trustvc obligation-registry deploy + +# Mint a BoE tokenId to obligationRegistry +trustvc obligation-registry mint + +# Lifecycle +trustvc obligation-escrow accept +trustvc obligation-escrow reject +trustvc obligation-escrow discharge +trustvc obligation-escrow status + +# Transfers (mirror title-escrow) +trustvc obligation-escrow transfer-holder +trustvc obligation-escrow nominate-transfer-owner +trustvc obligation-escrow endorse-transfer-owner +trustvc obligation-escrow transfer-owner-holder +trustvc obligation-escrow reject-transfer-holder +trustvc obligation-escrow reject-transfer-owner +trustvc obligation-escrow reject-transfer-owner-holder +trustvc obligation-escrow return-to-issuer +trustvc obligation-escrow accept-return-to-issuer +trustvc obligation-escrow reject-return-to-issuer + +# Verify via obligation pipeline (not classic verify) +trustvc verify-obligation +``` + ## How It Works ### W3C Credentials @@ -224,6 +257,8 @@ trustvc title-escrow reject-transfer-owner-holder - **Title Escrow**: Provides comprehensive transferable records management including holder transfers, beneficiary nominations, endorsements, returns, and rejections using smart contracts. +- **Obligation Registry (BoE)**: Separate command trees for electronic Bill of Exchange flows — `obligation-registry` (deploy/mint), `obligation-escrow` (accept/reject/discharge, transfers, return), and `verify-obligation` (dedicated BoE verify pipeline). Do not use classic `token-registry` / `title-escrow` / `verify` for obligation documents. See [Obligation Registry user guide](#obligation-registry-user-guide). + ## Commands ### Available Commands @@ -275,12 +310,27 @@ trustvc title-escrow reject-transfer-owner-holder | | [`reject-transfer-owner`](#title-escrow-reject-transfer-owner) | Reject owner transfer | | | [`reject-transfer-owner-holder`](#title-escrow-reject-transfer-owner-holder) | Reject full transfer | | | `title-escrow reject-transfer-owner-holder` | Alternative: `reject-transfer-owner-holder` | +| **Obligation / BoE**| [`obligation-registry deploy`](#obligation-registry-deploy) | Deploy Obligation Registry | +| | [`obligation-registry mint`](#obligation-registry-mint) | Mint BoE token to obligationRegistry | +| | [`obligation-escrow accept`](#obligation-escrow-accept) | Accept obligation | +| | [`obligation-escrow reject`](#obligation-escrow-reject) | Reject obligation | +| | [`obligation-escrow discharge`](#obligation-escrow-discharge) | Discharge obligation | +| | [`obligation-escrow status`](#obligation-escrow-status) | Read obligation / escrow status | +| | [`obligation-escrow transfer-holder`](#obligation-escrow-transfer-holder) | Transfer BoE holder | +| | `obligation-escrow nominate-transfer-owner` | Nominate BoE beneficiary | +| | `obligation-escrow endorse-transfer-owner` | Endorse BoE beneficiary change | +| | `obligation-escrow transfer-owner-holder` | Endorse full BoE ownership transfer | +| | `obligation-escrow return-to-issuer` | Return BoE to issuer | +| | `obligation-escrow accept-return-to-issuer` | Accept returned BoE | +| | `obligation-escrow reject-return-to-issuer` | Reject returned BoE | +| | `obligation-escrow reject-transfer-*` | Reject BoE transfer requests | +| | [`verify-obligation`](#verify-obligation) | Verify BoE via obligation pipeline | --- ### Wallet/Private Key Options -All title-escrow, token registry, document-store, and transaction commands require a wallet or private key to sign transactions. You can provide your private key in one of the following ways: +All title-escrow, obligation-registry, obligation-escrow, token registry, document-store, and transaction commands require a wallet or private key to sign transactions. You can provide your private key in one of the following ways: **Select wallet/private key option:** @@ -1342,6 +1392,196 @@ Transaction receipt confirming rejection. +
+

obligation-registry deploy

+ +Deploys an Obligation Registry (`TrustVCToken` + `ObligationEscrowFactory`) for electronic Bill of Exchange (BoE) flows. + +**Do not use** `token-registry deploy` for BoE documents. + +**Usage:** + +```sh +trustvc obligation-registry deploy +``` + +**Interactive Prompts:** + +- Network selection +- Registry name and symbol +- Optionally reuse an existing ObligationEscrowFactory address +- Wallet/private key option +- Dry-run confirmation before broadcasting + +**Output:** +Deployed obligation registry (and factory) addresses plus transaction receipt. + +
+ +
+

obligation-registry mint

+ +Mints a BoE tokenId to an Obligation Registry and creates the linked ObligationEscrow. + +**Do not use** classic `mint` / `token-registry mint` for BoE documents. + +**Usage:** + +```sh +trustvc obligation-registry mint +``` + +**Interactive Prompts:** + +- Path to signed BoE / obligation document + - _Network, obligationRegistry address, token ID, and document ID are extracted from the document_ +- Holder and beneficiary (drawer/drawee) addresses as required +- Wallet/private key option +- Dry-run confirmation before broadcasting + +**Output:** +Transaction receipt confirming mint. + +
+ +
+

obligation-escrow accept

+ +Accepts an obligation on the ObligationEscrow (drawee acceptance). + +**Usage:** + +```sh +trustvc obligation-escrow accept +``` + +**Interactive Prompts:** + +- Path to BoE / obligation document + - _Network, obligationRegistry, token ID, and document ID are extracted from the document_ +- Wallet/private key option +- Remark (optional) + +**Output:** +Transaction receipt confirming acceptance. + +
+ +
+

obligation-escrow reject

+ +Rejects an obligation on the ObligationEscrow. + +**Usage:** + +```sh +trustvc obligation-escrow reject +``` + +**Interactive Prompts:** + +- Path to BoE / obligation document +- Wallet/private key option +- Remark (optional) + +**Output:** +Transaction receipt confirming rejection. + +
+ +
+

obligation-escrow discharge

+ +Discharges an accepted obligation on the ObligationEscrow. + +**Usage:** + +```sh +trustvc obligation-escrow discharge +``` + +**Interactive Prompts:** + +- Path to BoE / obligation document +- Wallet/private key option +- Remark (optional) + +**Output:** +Transaction receipt confirming discharge. + +
+ +
+

obligation-escrow status

+ +Reads on-chain obligation / escrow status for a BoE document (read-only; no wallet required for the status call itself beyond network connectivity). + +**Usage:** + +```sh +trustvc obligation-escrow status +``` + +**Interactive Prompts:** + +- Path to BoE / obligation document + - _Network, obligationRegistry, and token ID are extracted from the document_ + +**Output:** +Obligation and escrow status fields from the chain. + +
+ +
+

obligation-escrow transfer-holder

+ +Transfers the holder of a BoE obligation record. Transfer, nominate, endorse, return, and reject variants mirror `title-escrow` but operate on ObligationEscrow via `obligation-escrow `. + +**Usage:** + +```sh +trustvc obligation-escrow transfer-holder +# Also: +# nominate-transfer-owner, endorse-transfer-owner, transfer-owner-holder +# return-to-issuer, accept-return-to-issuer, reject-return-to-issuer +# reject-transfer-holder, reject-transfer-owner, reject-transfer-owner-holder +``` + +**Interactive Prompts:** + +- Path to BoE / obligation document +- New address(es) where applicable +- Wallet/private key option +- Remark (optional) + +**Output:** +Transaction receipt confirming the escrow action. + +
+ +
+

verify-obligation

+ +Verifies a BoE / obligation document using the dedicated obligation verify pipeline (`verifyObligationDocument`). + +**Do not use** classic `verify` for BoE documents — it targets ETR / classic transferable records and will skip or mis-handle ObligationRecords. + +**Usage:** + +```sh +trustvc verify-obligation +``` + +**Interactive Prompts:** + +- Path to signed BoE / obligation document +- Network selection when needed for on-chain checks + +**Output:** +Verification fragments and overall validity (VALID / INVALID / SKIPPED outcomes as applicable). + +
+ ## Configuration ### Custom RPC Endpoints @@ -1428,12 +1668,31 @@ src/commands/ │ ├── reject-transfer-holder.ts # Reject holder transfer │ ├── reject-transfer-owner.ts # Reject owner transfer │ └── reject-transfer-owner-holder.ts # Reject full transfer +├── obligation-registry/ +│ ├── deploy.ts # Deploy Obligation Registry +│ └── mint.ts # Mint BoE token to obligationRegistry +├── obligation-escrow/ +│ ├── accept.ts # Accept obligation +│ ├── reject.ts # Reject obligation +│ ├── discharge.ts # Discharge obligation +│ ├── status.ts # Read obligation / escrow status +│ ├── transfer-holder.ts # Transfer BoE holder +│ ├── nominate-transfer-owner.ts # Nominate BoE beneficiary +│ ├── endorse-transfer-owner.ts # Endorse BoE beneficiary change +│ ├── transfer-owner-holder.ts # Endorse full BoE transfer +│ ├── return-to-issuer.ts # Return BoE to issuer +│ ├── accept-return-to-issuer.ts # Accept returned BoE +│ ├── reject-return-to-issuer.ts # Reject returned BoE +│ ├── reject-transfer-holder.ts # Reject BoE holder transfer +│ ├── reject-transfer-owner.ts # Reject BoE owner transfer +│ └── reject-transfer-owner-holder.ts # Reject full BoE transfer ├── transaction/ │ └── cancel.ts # Cancel a pending transaction ├── wallet/ │ ├── create.ts # Create encrypted wallet │ ├── encrypt.ts # Encrypt private key to wallet │ └── decrypt.ts # Decrypt wallet file +├── verify-obligation.ts # Verify BoE via obligation pipeline └── w3c/ ├── did.ts # Generate DID ├── key-pair.ts # Generate key pairs @@ -1444,6 +1703,109 @@ src/commands/ └── verify.ts # Verify W3C or OA document ``` +## Obligation Registry user guide + +User guide for electronic Bill of Exchange (BoE) / obligation flows with **`trustvc-cli`**. + +Classic transferable records (eBL / Token Registry + Title Escrow) use different commands. This section covers **only** Obligation Registry. + +For library / SDK details, see the TrustVC README [§7c Obligation Registry (BoE)](https://github.com/TrustVC/trustvc#c-obligation-registry-boe). + +### Who this is for + +Operators and integrators who: + +- Deploy an Obligation Registry on a supported network +- Mint a signed BoE credential on-chain +- Accept, reject, discharge, transfer, or return the obligation +- Verify a BoE document + +You do **not** need to call the TypeScript SDK directly — the CLI wraps it with interactive prompts. + +### Before you start + +1. **Install the CLI** — `npm install -g @trustvc/trustvc-cli` or `npx @trustvc/trustvc-cli ` +2. **Node.js 22+** +3. **A wallet** — encrypted wallet file (recommended), private key, or key file +4. **A signed BoE document** — W3C VC with `credentialStatus.obligationRegistry` (not `tokenRegistry`) +5. **Network access** — select network in prompts, or set a custom RPC (e.g. `export SEPOLIA_RPC=…`) + +### Classic vs Obligation — pick the right commands + +| Task | Classic ETR | Obligation / BoE | +|------|-------------|------------------| +| Deploy registry | `token-registry deploy` | `obligation-registry deploy` | +| Mint | `mint` / `token-registry mint` | `obligation-registry mint` | +| Escrow actions | `title-escrow …` | `obligation-escrow …` | +| Verify | `verify` | `verify-obligation` | + +Using classic commands on a BoE document will fail or skip obligation checks. Using obligation commands on a classic eBL document will fail extraction (missing `obligationRegistry`). + +### Typical workflow + +``` +1. Deploy Obligation Registry +2. Put the registry address into your BoE credential status, then sign the credential +3. Mint (issuer wallet) +4. Accept or reject (holder) ──► optional transfers / discharge / return +5. Verify with verify-obligation +``` + +Signing/building the VC is usually done with TrustVC library tools or your app (`ObligationDocumentBuilder`). The CLI focuses on **on-chain** steps and **verify**. + +### Step-by-step + +**1. Deploy** — `trustvc obligation-registry deploy` (network, name/symbol, optional factory reuse, wallet, dry-run). + +**2. Mint** — `trustvc obligation-registry mint` with a signed BoE JSON that already references your registry (registry, network, token ID, document ID are extracted). + +**3. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. + +**4. Status** — `trustvc obligation-escrow status` reads `Issued` / `Accepted` / `Rejected` / `Discharged`, registration, and termination reason. + +**5. Transfers (optional)** — `obligation-escrow transfer-holder`, nominate/endorse/return variants mirror `title-escrow`. + +**6. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted. + +**7. Return to issuer (optional)** — requires **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). + +**8. Verify** — `trustvc verify-obligation` (not classic `verify`). + +### Who can run what + +| Action | Typical role | +|--------|----------------| +| `obligation-registry deploy` | Deployer / issuer org | +| `obligation-registry mint` | Issuer (registry minter) | +| `obligation-escrow accept` / `reject` | Holder (roles split) | +| `obligation-escrow discharge` | Beneficiary | +| Transfer / nominate / endorse | Current holder or beneficiary per Title Escrow–style rules | +| `return-to-issuer` | Dual role (beneficiary == holder) | +| `accept-return-to-issuer` / `reject-return-to-issuer` | Issuer | +| `obligation-escrow status` | Anyone with network access + document | +| `verify-obligation` | Anyone with the document (+ RPC when on-chain checks run) | + +### What the CLI reads from your document + +For mint, escrow, and related flows, the CLI extracts: + +- Network +- `obligationRegistry` address +- Token ID +- Document ID (remark encryption key when remarks are set) + +If extraction fails with a message about classic transferable records / `tokenRegistry`, you are using the wrong document type or command family. + +### Things to know (not bugs) + +1. **Wrong command family** — BoE → `obligation-*` / `verify-obligation`. Classic eBL → `token-registry` / `title-escrow` / `verify`. +2. **Accept / reject need split roles** — `beneficiary != holder`. +3. **Return needs dual role** — `beneficiary == holder`. +4. **`terminationReason` is not set by return alone** — set on reject / discharge / burn (accept-return). +5. **Deploy + mint do not create the VC** — you still need a signed BoE file; mint only puts the token on-chain. + +Per-command prompts and outputs are in [Detailed Command Reference](#detailed-command-reference) above (`obligation-registry deploy`, `obligation-registry mint`, `obligation-escrow *`, `verify-obligation`). + ## License Apache-2.0 diff --git a/src/commands/helpers.ts b/src/commands/helpers.ts index b11785e..1bab3a3 100644 --- a/src/commands/helpers.ts +++ b/src/commands/helpers.ts @@ -7,12 +7,15 @@ import { v4SupportInterfaceIds, v5SupportInterfaceIds, DocumentStore__factory, + obligationRegistryContracts, } from '@trustvc/trustvc'; import { encrypt } from '@trustvc/trustvc'; // Internal utilities import { ConnectedSigner } from '../utils'; +const { TrustVCToken__factory, ObligationEscrow__factory } = obligationRegistryContracts; + // Contract factories from TrustVC v5 const { TitleEscrow__factory, TradeTrustToken__factory, TDocDeployer__factory } = v5Contracts; @@ -27,6 +30,11 @@ interface ConnectToTDocDeployerContractArgs { wallet: Wallet | HDNodeWallet | ConnectedSigner | Signer; } +interface ConnectToObligationRegistryArgs { + address: string; + wallet: Wallet | HDNodeWallet | ConnectedSigner | Signer; +} + /** * Connects to a token registry contract instance. * @@ -419,3 +427,69 @@ export async function waitForTransaction(tx: any | string, provider: Provider, c throw new Error('Provider required for transaction hash'); } } + +/** + * Connects to a TrustVCToken (obligation registry) contract instance. + */ +export const connectToObligationRegistry = async ({ + address, + wallet, +}: ConnectToObligationRegistryArgs) => { + try { + signale.info(`Connecting to obligation registry at: ${address}`); + const registry = new ethers.Contract(address, TrustVCToken__factory.abi, wallet as any); + if (!registry) { + throw new Error(`Failed to connect to obligation registry at address: ${address}`); + } + signale.success(`Successfully connected to obligation registry`); + return registry; + } catch (error) { + signale.error( + `Error in connectToObligationRegistry: ${error instanceof Error ? error.message : String(error)}`, + ); + throw error; + } +}; + +interface ConnectToObligationEscrowArgs { + tokenId: string; + address: string; + wallet: Wallet | HDNodeWallet | ConnectedSigner | Signer; +} + +/** + * Resolves ObligationEscrow via ownerOf(tokenId) on the obligation registry and connects. + */ +export const connectToObligationEscrow = async ({ + tokenId, + address, + wallet, +}: ConnectToObligationEscrowArgs) => { + try { + signale.info(`Connecting to obligation registry at: ${address}`); + const registry = new ethers.Contract(address, TrustVCToken__factory.abi, wallet as any); + + signale.info(`Fetching obligation escrow address for tokenId: ${tokenId}`); + const escrowAddress = await registry.ownerOf(tokenId); + signale.info(`Obligation escrow address: ${escrowAddress}`); + + if (!escrowAddress || escrowAddress === ZeroAddress) { + throw new Error( + `Invalid obligation escrow address for tokenId: ${tokenId}. Address: ${escrowAddress}`, + ); + } + + signale.info(`Connecting to obligation escrow at: ${escrowAddress}`); + const escrow = new ethers.Contract(escrowAddress, ObligationEscrow__factory.abi, wallet as any); + if (!escrow) { + throw new Error(`Failed to connect to obligation escrow at address: ${escrowAddress}`); + } + signale.success(`Successfully connected to obligation escrow`); + return escrow; + } catch (error) { + signale.error( + `Error in connectToObligationEscrow: ${error instanceof Error ? error.message : String(error)}`, + ); + throw error; + } +}; diff --git a/src/commands/obligation-escrow/accept-return-to-issuer.ts b/src/commands/obligation-escrow/accept-return-to-issuer.ts new file mode 100644 index 0000000..a4ec7f0 --- /dev/null +++ b/src/commands/obligation-escrow/accept-return-to-issuer.ts @@ -0,0 +1,51 @@ +import { error, info, success } from 'signale'; +import { acceptReturnedObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'accept-return-to-issuer'; +export const describe = 'Issuer accepts a returned BoE obligation (burn / shred)'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await acceptReturnedHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const acceptReturnedHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Accepting returned obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + // acceptReturned burns the title, which lives on the TrustVCToken registry, not the escrow. + populate: ({ registry }, encryptedRemark) => + registry.burn.populateTransaction(args.tokenId, encryptedRemark), + sdk: acceptReturnedObligationRegistry as any, + sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Return accepted (burned)`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/accept.ts b/src/commands/obligation-escrow/accept.ts new file mode 100644 index 0000000..b908318 --- /dev/null +++ b/src/commands/obligation-escrow/accept.ts @@ -0,0 +1,49 @@ +import { error, info, success } from 'signale'; +import { acceptObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'accept'; +export const describe = 'Holder accepts an issued BoE obligation (Issued → Accepted)'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await acceptHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const acceptHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Accepting obligation token ${args.tokenId} on ${args.obligationRegistryAddress}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => escrow.accept.populateTransaction(encryptedRemark), + sdk: acceptObligationRegistry as any, + sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Obligation ${args.tokenId} accepted`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/discharge.ts b/src/commands/obligation-escrow/discharge.ts new file mode 100644 index 0000000..a8b7f3a --- /dev/null +++ b/src/commands/obligation-escrow/discharge.ts @@ -0,0 +1,50 @@ +import { error, info, success } from 'signale'; +import { dischargeObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'discharge'; +export const describe = 'Beneficiary discharges an accepted BoE obligation (terminal Discharged)'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await dischargeHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const dischargeHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Discharging obligation token ${args.tokenId} on ${args.obligationRegistryAddress}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.discharge.populateTransaction(encryptedRemark), + sdk: dischargeObligationRegistry as any, + sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Obligation ${args.tokenId} discharged`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/endorse-transfer-owner.ts b/src/commands/obligation-escrow/endorse-transfer-owner.ts new file mode 100644 index 0000000..d275c11 --- /dev/null +++ b/src/commands/obligation-escrow/endorse-transfer-owner.ts @@ -0,0 +1,55 @@ +import { error, info, success } from 'signale'; +import { transferBeneficiaryObligationRegistry } from '@trustvc/trustvc'; +import { ObligationEscrowNominateBeneficiaryCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + promptAddress, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'endorse-transfer-owner'; +export const describe = 'Endorse / transfer beneficiary (owner) of a BoE obligation'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await endorseHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = async (): Promise => { + const base = await promptBaseObligationEscrowInputs(); + const newBeneficiary = await promptAddress('new beneficiary', 'endorsed owner'); + return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; +}; + +export const endorseHandler = async (args: ObligationEscrowNominateBeneficiaryCommand) => { + try { + info(`Transferring beneficiary to ${args.newBeneficiary} for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.transferBeneficiary.populateTransaction(args.newBeneficiary, encryptedRemark), + sdk: transferBeneficiaryObligationRegistry as any, + sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Beneficiary transferred to ${args.newBeneficiary}`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/index.ts b/src/commands/obligation-escrow/index.ts new file mode 100644 index 0000000..28969ed --- /dev/null +++ b/src/commands/obligation-escrow/index.ts @@ -0,0 +1,11 @@ +import { Argv } from 'yargs'; + +export const command = 'obligation-escrow '; + +export const describe = + 'Invoke ObligationEscrow lifecycle / transfer functions for BoE obligation records'; + +export const builder = (yargs: Argv): Argv => + yargs.commandDir(__dirname, { extensions: ['ts', 'js'] }); + +export const handler = (): void => {}; diff --git a/src/commands/obligation-escrow/nominate-transfer-owner.ts b/src/commands/obligation-escrow/nominate-transfer-owner.ts new file mode 100644 index 0000000..0d94a55 --- /dev/null +++ b/src/commands/obligation-escrow/nominate-transfer-owner.ts @@ -0,0 +1,55 @@ +import { error, info, success } from 'signale'; +import { nominateObligationRegistry } from '@trustvc/trustvc'; +import { ObligationEscrowNominateBeneficiaryCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + promptAddress, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'nominate-transfer-owner'; +export const describe = 'Nominate a new beneficiary (owner) for a BoE obligation'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await nominateHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = async (): Promise => { + const base = await promptBaseObligationEscrowInputs(); + const newBeneficiary = await promptAddress('new beneficiary', 'nominee'); + return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; +}; + +export const nominateHandler = async (args: ObligationEscrowNominateBeneficiaryCommand) => { + try { + info(`Nominating beneficiary ${args.newBeneficiary} for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.nominate.populateTransaction(args.newBeneficiary, encryptedRemark), + sdk: nominateObligationRegistry as any, + sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Nominated ${args.newBeneficiary}`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/reject-return-to-issuer.ts b/src/commands/obligation-escrow/reject-return-to-issuer.ts new file mode 100644 index 0000000..113d537 --- /dev/null +++ b/src/commands/obligation-escrow/reject-return-to-issuer.ts @@ -0,0 +1,51 @@ +import { error, info, success } from 'signale'; +import { rejectReturnedObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'reject-return-to-issuer'; +export const describe = 'Issuer rejects a returned BoE obligation (restore to escrow)'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await rejectReturnedHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const rejectReturnedHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Rejecting returned obligation ${args.tokenId} (restore)`); + const transaction = await runObligationEscrowTx({ + args, + // rejectReturned restores the title, which lives on the TrustVCToken registry, not the escrow. + populate: ({ registry }, encryptedRemark) => + registry.restore.populateTransaction(args.tokenId, encryptedRemark), + sdk: rejectReturnedObligationRegistry as any, + sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Return rejected (restored to escrow)`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/reject-transfer-holder.ts b/src/commands/obligation-escrow/reject-transfer-holder.ts new file mode 100644 index 0000000..d4fc2ff --- /dev/null +++ b/src/commands/obligation-escrow/reject-transfer-holder.ts @@ -0,0 +1,50 @@ +import { error, info, success } from 'signale'; +import { rejectTransferHolderObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'reject-transfer-holder'; +export const describe = 'Reject a pending holder transfer on a BoE obligation'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await rejectTransferHolderHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const rejectTransferHolderHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Rejecting holder transfer for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.rejectTransferHolder.populateTransaction(encryptedRemark), + sdk: rejectTransferHolderObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Holder transfer rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/reject-transfer-owner-holder.ts b/src/commands/obligation-escrow/reject-transfer-owner-holder.ts new file mode 100644 index 0000000..85a0883 --- /dev/null +++ b/src/commands/obligation-escrow/reject-transfer-owner-holder.ts @@ -0,0 +1,50 @@ +import { error, info, success } from 'signale'; +import { rejectTransferOwnersObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'reject-transfer-owner-holder'; +export const describe = 'Reject a pending joint owner+holder transfer on a BoE obligation'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await rejectTransferOwnersHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const rejectTransferOwnersHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Rejecting owners transfer for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.rejectTransferOwners.populateTransaction(encryptedRemark), + sdk: rejectTransferOwnersObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Owners transfer rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/reject-transfer-owner.ts b/src/commands/obligation-escrow/reject-transfer-owner.ts new file mode 100644 index 0000000..c6e4b99 --- /dev/null +++ b/src/commands/obligation-escrow/reject-transfer-owner.ts @@ -0,0 +1,50 @@ +import { error, info, success } from 'signale'; +import { rejectTransferBeneficiaryObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'reject-transfer-owner'; +export const describe = 'Reject a pending beneficiary transfer on a BoE obligation'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await rejectTransferOwnerHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const rejectTransferOwnerHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Rejecting beneficiary transfer for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.rejectTransferBeneficiary.populateTransaction(encryptedRemark), + sdk: rejectTransferBeneficiaryObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Beneficiary transfer rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/reject.ts b/src/commands/obligation-escrow/reject.ts new file mode 100644 index 0000000..ef23c1d --- /dev/null +++ b/src/commands/obligation-escrow/reject.ts @@ -0,0 +1,49 @@ +import { error, info, success } from 'signale'; +import { rejectObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'reject'; +export const describe = 'Holder rejects an issued BoE obligation (terminal Rejected)'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await rejectHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const rejectHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Rejecting obligation token ${args.tokenId} on ${args.obligationRegistryAddress}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => escrow.reject.populateTransaction(encryptedRemark), + sdk: rejectObligationRegistry as any, + sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Obligation ${args.tokenId} rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/return-to-issuer.ts b/src/commands/obligation-escrow/return-to-issuer.ts new file mode 100644 index 0000000..236dbc1 --- /dev/null +++ b/src/commands/obligation-escrow/return-to-issuer.ts @@ -0,0 +1,50 @@ +import { error, info, success } from 'signale'; +import { returnToIssuerObligationRegistry } from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'return-to-issuer'; +export const describe = 'Return a BoE obligation to the issuer (requires dual role)'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await returnToIssuerHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const returnToIssuerHandler = async (args: BaseObligationEscrowCommand) => { + try { + info(`Returning obligation ${args.tokenId} to issuer`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.returnToIssuer.populateTransaction(encryptedRemark), + sdk: returnToIssuerObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Returned to issuer`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/runTx.ts b/src/commands/obligation-escrow/runTx.ts new file mode 100644 index 0000000..4270e9d --- /dev/null +++ b/src/commands/obligation-escrow/runTx.ts @@ -0,0 +1,93 @@ +import signale from 'signale'; +import { BytesLike, TransactionReceipt } from 'ethers'; +import { CHAIN_ID } from '@trustvc/trustvc'; +import { + canEstimateGasPrice, + getGasFees, + getSupportedNetwork, + getWalletOrSigner, + performDryRunWithConfirmation, +} from '../../utils'; +import { + connectToObligationEscrow, + connectToObligationRegistry, + validateAndEncryptRemark, +} from '../helpers'; +import { BaseObligationEscrowCommand } from '../../types'; + +type PopulateFn = ( + contracts: { escrow: any; registry: any }, + encryptedRemark: BytesLike, +) => Promise; + +type SdkCall = ( + contractOptions: { obligationRegistry: string; tokenId: string }, + wallet: any, + params: Record, + txOptions: Record, +) => Promise<{ hash: string; wait: () => Promise }>; + +/** + * Shared dry-run + gas + SDK send for obligation-escrow write methods that take remarks. + */ +export const runObligationEscrowTx = async (opts: { + args: BaseObligationEscrowCommand; + populate: PopulateFn; + sdk: SdkCall; + sdkParams: Record; +}): Promise => { + const { args, populate, sdk, sdkParams } = opts; + const { obligationRegistryAddress, tokenId, remark, encryptionKey, network, ...rest } = args; + const wallet = await getWalletOrSigner({ network, ...rest }); + const networkId = getSupportedNetwork(network).networkId; + + const shouldProceed = await performDryRunWithConfirmation({ + network, + getTransactionCallback: async () => { + const escrow = await connectToObligationEscrow({ + tokenId, + address: obligationRegistryAddress, + wallet, + }); + const registry = await connectToObligationRegistry({ + address: obligationRegistryAddress, + wallet, + }); + const encryptedRemark = validateAndEncryptRemark(remark, encryptionKey); + const tx = await populate({ escrow, registry }, encryptedRemark); + return { ...tx, from: await wallet.getAddress() }; + }, + }); + + if (!shouldProceed) { + process.exit(0); + } + + const contractOptions = { obligationRegistry: obligationRegistryAddress, tokenId }; + let transaction; + + if (canEstimateGasPrice(network)) { + if (!wallet.provider) { + throw new Error('Provider is required for gas estimation'); + } + const gasFees = await getGasFees({ provider: wallet.provider, ...rest }); + transaction = await sdk(contractOptions, wallet, sdkParams, { + chainId: networkId as unknown as CHAIN_ID, + maxFeePerGas: gasFees.maxFeePerGas?.toString(), + maxPriorityFeePerGas: gasFees.maxPriorityFeePerGas?.toString(), + id: encryptionKey, + }); + } else { + transaction = await sdk(contractOptions, wallet, sdkParams, { + chainId: networkId as unknown as CHAIN_ID, + id: encryptionKey, + }); + } + + signale.await(`Waiting for transaction ${transaction.hash} to be mined`); + const receipt = (await transaction.wait()) as unknown as TransactionReceipt; + if (!receipt) { + throw new Error('Transaction receipt not found'); + } + return receipt; +}; diff --git a/src/commands/obligation-escrow/shared.ts b/src/commands/obligation-escrow/shared.ts new file mode 100644 index 0000000..15fd7f4 --- /dev/null +++ b/src/commands/obligation-escrow/shared.ts @@ -0,0 +1,40 @@ +import { + promptWalletSelection, + promptAndReadDocument, + promptRemark, + extractObligationDocumentInfo, + verifyDocumentSignature, +} from '../../utils'; +import { BaseObligationEscrowCommand } from '../../types'; + +/** + * Shared prompt flow for obligation-escrow commands that only need document + wallet + remark. + */ +export const promptBaseObligationEscrowInputs = async (): Promise => { + const document = await promptAndReadDocument(); + await verifyDocumentSignature(document); + const { obligationRegistry, tokenId, network, documentId } = + await extractObligationDocumentInfo(document); + const { encryptedWalletPath, key, keyFile } = await promptWalletSelection(); + const remark = await promptRemark('v5'); + + const baseResult = { + network, + obligationRegistryAddress: obligationRegistry, + tokenId, + remark, + encryptionKey: documentId, + maxPriorityFeePerGasScale: 1, + }; + + if (encryptedWalletPath) { + return { ...baseResult, encryptedWalletPath } as BaseObligationEscrowCommand; + } + if (keyFile) { + return { ...baseResult, keyFile } as BaseObligationEscrowCommand; + } + if (key) { + return { ...baseResult, key } as BaseObligationEscrowCommand; + } + return baseResult as BaseObligationEscrowCommand; +}; diff --git a/src/commands/obligation-escrow/status.ts b/src/commands/obligation-escrow/status.ts new file mode 100644 index 0000000..dfe904b --- /dev/null +++ b/src/commands/obligation-escrow/status.ts @@ -0,0 +1,59 @@ +import { error, info, success } from 'signale'; +import { + DocumentStatus, + ObligationEscrowTerminationReason, + getObligationEscrowTerminationReason, + getObligationRegistryStatus, + isObligationRegistryRegistered, +} from '@trustvc/trustvc'; +import { BaseObligationEscrowCommand } from '../../types'; +import { getErrorMessage, getWalletOrSigner } from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; + +export const command = 'status'; +export const describe = 'Read BoE obligation escrow status / registration / termination reason'; + +const STATUS_LABEL: Record = { + [DocumentStatus.Issued]: 'Issued', + [DocumentStatus.Accepted]: 'Accepted', + [DocumentStatus.Rejected]: 'Rejected', + [DocumentStatus.Discharged]: 'Discharged', +}; + +const REASON_LABEL: Record = { + [ObligationEscrowTerminationReason.None]: 'None', + [ObligationEscrowTerminationReason.ReturnToIssuer]: 'ReturnToIssuer', + [ObligationEscrowTerminationReason.Rejected]: 'Rejected', + [ObligationEscrowTerminationReason.Discharged]: 'Discharged', +}; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await statusHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = promptBaseObligationEscrowInputs; + +export const statusHandler = async (args: BaseObligationEscrowCommand) => { + try { + const { obligationRegistryAddress, tokenId, network, ...rest } = args; + const wallet = await getWalletOrSigner({ network, ...rest }); + const opts = { obligationRegistry: obligationRegistryAddress }; + + const status = await getObligationRegistryStatus(opts, wallet, { tokenId }); + const registered = await isObligationRegistryRegistered(opts, wallet, { tokenId }); + const reason = await getObligationEscrowTerminationReason(opts, wallet, { tokenId }); + + success(`Obligation ${tokenId} on ${obligationRegistryAddress}`); + info(` Status: ${STATUS_LABEL[status] ?? status} (${status})`); + info(` Registered: ${registered}`); + info(` Termination reason: ${REASON_LABEL[reason] ?? reason} (${reason})`); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/transfer-holder.ts b/src/commands/obligation-escrow/transfer-holder.ts new file mode 100644 index 0000000..74d7146 --- /dev/null +++ b/src/commands/obligation-escrow/transfer-holder.ts @@ -0,0 +1,58 @@ +import { error, info, success, warn } from 'signale'; +import { transferHolderObligationRegistry } from '@trustvc/trustvc'; +import { ObligationEscrowTransferHolderCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + promptAddress, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'transfer-holder'; +export const describe = 'Transfer the holder of a BoE obligation record'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await changeHolderHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = async (): Promise => { + const base = await promptBaseObligationEscrowInputs(); + const newHolder = await promptAddress('new holder', 'new holder'); + return { ...base, newHolder } as ObligationEscrowTransferHolderCommand; +}; + +export const changeHolderHandler = async (args: ObligationEscrowTransferHolderCommand) => { + try { + info( + `Changing holder of obligation ${args.tokenId} on ${args.obligationRegistryAddress} to ${args.newHolder}`, + ); + warn('Only the current holder can transfer the holder role.'); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.transferHolder.populateTransaction(args.newHolder, encryptedRemark), + sdk: transferHolderObligationRegistry as any, + sdkParams: { holderAddress: args.newHolder, remarks: args.remark }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Holder changed to ${args.newHolder}`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-escrow/transfer-owner-holder.ts b/src/commands/obligation-escrow/transfer-owner-holder.ts new file mode 100644 index 0000000..db39e7f --- /dev/null +++ b/src/commands/obligation-escrow/transfer-owner-holder.ts @@ -0,0 +1,65 @@ +import { error, info, success } from 'signale'; +import { transferOwnersObligationRegistry } from '@trustvc/trustvc'; +import { ObligationEscrowEndorseTransferOfOwnersCommand } from '../../types'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + promptAddress, + TransactionReceiptFees, +} from '../../utils'; +import { promptBaseObligationEscrowInputs } from './shared'; +import { runObligationEscrowTx } from './runTx'; + +export const command = 'transfer-owner-holder'; +export const describe = 'Transfer both beneficiary and holder of a BoE obligation'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await transferOwnersHandler(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = + async (): Promise => { + const base = await promptBaseObligationEscrowInputs(); + const newOwner = await promptAddress('new beneficiary', 'new owner'); + const newHolder = await promptAddress('new holder', 'new holder'); + return { ...base, newOwner, newHolder } as ObligationEscrowEndorseTransferOfOwnersCommand; + }; + +export const transferOwnersHandler = async ( + args: ObligationEscrowEndorseTransferOfOwnersCommand, +) => { + try { + info( + `Transferring owners of obligation ${args.tokenId} to owner ${args.newOwner} / holder ${args.newHolder}`, + ); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.transferOwners.populateTransaction(args.newOwner, args.newHolder, encryptedRemark), + sdk: transferOwnersObligationRegistry as any, + sdkParams: { + newBeneficiaryAddress: args.newOwner, + newHolderAddress: args.newHolder, + remarks: args.remark, + }, + }); + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Owners transferred`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-registry/deploy.ts b/src/commands/obligation-registry/deploy.ts new file mode 100644 index 0000000..ee14fbe --- /dev/null +++ b/src/commands/obligation-registry/deploy.ts @@ -0,0 +1,145 @@ +import { error, info, success } from 'signale'; +import { CHAIN_ID, deployObligationRegistry } from '@trustvc/trustvc'; +import { input, confirm } from '@inquirer/prompts'; +import { + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + promptWalletSelection, + promptNetworkSelection, + getWalletOrSigner, + getSupportedNetwork, + performDryRunWithConfirmation, + promptAddress, + supportedNetwork, +} from '../../utils'; +import { TransactionReceipt } from 'ethers'; + +export const command = 'deploy'; + +export const describe = 'Deploys an Obligation Registry (TrustVCToken + ObligationEscrowFactory)'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + + await deployObligationRegistryContract(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +type DeployObligationRegistryCommand = { + registryName: string; + registrySymbol: string; + escrowFactoryAddress?: string; + network: string; + encryptedWalletPath?: string; + key?: string; + keyFile?: string; + maxPriorityFeePerGasScale: number; +}; + +export const promptForInputs = async (): Promise => { + const network = await promptNetworkSelection(); + + const registryName = await input({ + message: 'Enter the name of the obligation registry:', + required: true, + validate: (value: string) => { + if (!value || value.trim() === '') { + return 'Registry name is required'; + } + return true; + }, + }); + + const registrySymbol = await input({ + message: 'Enter the symbol of the obligation registry:', + required: true, + validate: (value: string) => { + if (!value || value.trim() === '') { + return 'Registry symbol is required'; + } + return true; + }, + }); + + const reuseFactory = await confirm({ + message: 'Reuse an existing ObligationEscrowFactory address?', + default: false, + }); + + const escrowFactoryAddress = reuseFactory + ? await promptAddress('ObligationEscrowFactory', 'optional', true) + : undefined; + + const { encryptedWalletPath, key, keyFile } = await promptWalletSelection(); + + const baseResult = { + network, + registryName, + registrySymbol, + escrowFactoryAddress, + maxPriorityFeePerGasScale: 1, + }; + + if (encryptedWalletPath) { + return { ...baseResult, encryptedWalletPath } as DeployObligationRegistryCommand; + } + if (keyFile) { + return { ...baseResult, keyFile } as DeployObligationRegistryCommand; + } + if (key) { + return { ...baseResult, key } as DeployObligationRegistryCommand; + } + return baseResult as DeployObligationRegistryCommand; +}; + +export const deployObligationRegistryContract = async ({ + network, + registryName, + registrySymbol, + escrowFactoryAddress, + ...rest +}: DeployObligationRegistryCommand) => { + try { + const wallet = await getWalletOrSigner({ network, ...rest }); + const chainId = supportedNetwork[network as NetworkCmdName].networkId; + + const shouldProceed = await performDryRunWithConfirmation({ + network, + getTransactionCallback: async () => ({ + to: await wallet.getAddress(), + data: '0x', + from: await wallet.getAddress(), + value: 0n, + }), + }); + + if (!shouldProceed) { + process.exit(0); + } + + info(`Deploying obligation registry ${registryName}`); + + const result = await deployObligationRegistry(registryName, registrySymbol, wallet, { + chainId: getSupportedNetwork(network).networkId as unknown as CHAIN_ID, + escrowFactoryAddress, + }); + + displayTransactionPrice(result.receipt as any, network as NetworkCmdName); + + const { hash } = result.receipt as unknown as TransactionReceipt; + success(`Obligation registry ${registryName} deployed at ${result.obligationRegistry}`); + info(`ObligationEscrowFactory: ${result.obligationEscrowFactoryAddress}`); + info(`Find more details at ${getEtherscanAddress({ network })}/tx/${hash}`); + info(`Chain ID used: ${chainId}`); + + return result.obligationRegistry; + } catch (e) { + error(getErrorMessage(e)); + } +}; diff --git a/src/commands/obligation-registry/index.ts b/src/commands/obligation-registry/index.ts new file mode 100644 index 0000000..0ac0d6c --- /dev/null +++ b/src/commands/obligation-registry/index.ts @@ -0,0 +1,11 @@ +import { Argv } from 'yargs'; + +export const command = 'obligation-registry '; + +export const describe = + 'Invoke a function over an Obligation Registry (BoE / TrustVCToken) smart contract'; + +export const builder = (yargs: Argv): Argv => + yargs.commandDir(__dirname, { extensions: ['ts', 'js'] }); + +export const handler = (): void => {}; diff --git a/src/commands/obligation-registry/mint.ts b/src/commands/obligation-registry/mint.ts new file mode 100644 index 0000000..f3cca8d --- /dev/null +++ b/src/commands/obligation-registry/mint.ts @@ -0,0 +1,161 @@ +import signale, { error, info, success } from 'signale'; +import { ObligationRegistryMintCommand } from '../../types'; +import { + addAddressPrefix, + displayTransactionPrice, + getErrorMessage, + getEtherscanAddress, + NetworkCmdName, + promptWalletSelection, + getWalletOrSigner, + canEstimateGasPrice, + getGasFees, + extractObligationDocumentInfo, + promptAndReadDocument, + promptRemark, + promptAddress, + performDryRunWithConfirmation, + verifyDocumentSignature, +} from '../../utils'; +import { connectToObligationRegistry, validateAndEncryptRemark } from '../helpers'; +import { TransactionReceipt } from 'ethers'; +import { mintObligationRegistry } from '@trustvc/trustvc'; + +export const command = 'mint'; + +export const describe = 'Mint a tokenId to an Obligation Registry deployed on the blockchain'; + +export const handler = async (): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + + await mintObligationToken(answers); + } catch (err: unknown) { + error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptForInputs = async (): Promise => { + const document = await promptAndReadDocument(); + await verifyDocumentSignature(document); + + const { obligationRegistry, tokenId, network, documentId } = + await extractObligationDocumentInfo(document); + + const beneficiary = await promptAddress('beneficiary', 'initial recipient'); + const holder = await promptAddress('holder', 'initial holder'); + const { encryptedWalletPath, key, keyFile } = await promptWalletSelection(); + const remark = await promptRemark('v5'); + const encryptionKey = documentId; + + const baseResult = { + network, + address: obligationRegistry, + tokenId, + beneficiary, + holder, + remark, + encryptionKey, + maxPriorityFeePerGasScale: 1, + }; + + if (encryptedWalletPath) { + return { ...baseResult, encryptedWalletPath } as ObligationRegistryMintCommand; + } + if (keyFile) { + return { ...baseResult, keyFile } as ObligationRegistryMintCommand; + } + if (key) { + return { ...baseResult, key } as ObligationRegistryMintCommand; + } + return baseResult as ObligationRegistryMintCommand; +}; + +export const mintObligationToken = async (args: ObligationRegistryMintCommand) => { + try { + info( + `Issuing ${args.tokenId} to recipient ${args.beneficiary} and holder ${args.holder} in obligation registry ${args.address}`, + ); + + const transaction = await mintToObligationRegistry({ + ...args, + tokenId: addAddressPrefix(args.tokenId), + }); + + displayTransactionPrice(transaction as any, args.network as NetworkCmdName); + success( + `Token ${args.tokenId} minted on obligation registry ${args.address} (beneficiary ${args.beneficiary}, holder ${args.holder})`, + ); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + return args.address; + } catch (e) { + error(getErrorMessage(e)); + } +}; + +const mintToObligationRegistry = async ({ + address, + beneficiary, + holder, + tokenId, + remark, + encryptionKey, + network, + ...rest +}: ObligationRegistryMintCommand): Promise => { + const wallet = await getWalletOrSigner({ network, ...rest }); + + const shouldProceed = await performDryRunWithConfirmation({ + network, + getTransactionCallback: async () => { + const registry = await connectToObligationRegistry({ address, wallet }); + const encryptedRemark = validateAndEncryptRemark(remark, encryptionKey); + const tx = await registry.mint.populateTransaction( + beneficiary, + holder, + tokenId, + encryptedRemark, + ); + return { ...tx, from: await wallet.getAddress() }; + }, + }); + + if (!shouldProceed) { + process.exit(0); + } + + let transaction; + if (canEstimateGasPrice(network)) { + if (!wallet.provider) { + throw new Error('Provider is required for gas estimation'); + } + const gasFees = await getGasFees({ provider: wallet.provider, ...rest }); + transaction = await mintObligationRegistry( + { obligationRegistry: address }, + wallet, + { beneficiaryAddress: beneficiary, holderAddress: holder, tokenId, remarks: remark }, + { + id: encryptionKey, + maxFeePerGas: gasFees.maxFeePerGas?.toString(), + maxPriorityFeePerGas: gasFees.maxPriorityFeePerGas?.toString(), + }, + ); + } else { + transaction = await mintObligationRegistry( + { obligationRegistry: address }, + wallet, + { beneficiaryAddress: beneficiary, holderAddress: holder, tokenId, remarks: remark }, + { id: encryptionKey }, + ); + } + + signale.await(`Waiting for transaction ${transaction.hash} to be mined`); + const receipt = (await transaction.wait()) as unknown as TransactionReceipt; + if (!receipt) { + throw new Error('Transaction receipt not found'); + } + return receipt; +}; diff --git a/src/commands/verify-obligation.ts b/src/commands/verify-obligation.ts new file mode 100644 index 0000000..4781b58 --- /dev/null +++ b/src/commands/verify-obligation.ts @@ -0,0 +1,139 @@ +import { input } from '@inquirer/prompts'; +import { + getChainId, + getObligationDocumentStatus, + isObligationRecord, + isWrappedV2Document, + isWrappedV3Document, + SignedVerifiableCredential, + SUPPORTED_CHAINS, + CHAIN_ID, + VerificationFragment, + verifyObligationDocument, +} from '@trustvc/trustvc'; +import signale from 'signale'; +import { + CaptureConsoleWarnAsync, + getSupportedNetworkNameFromId, + promptNetworkSelection, + readJsonFile, + supportedNetwork, + NetworkCmdName, +} from '../utils'; +import { FragmentType } from '../types'; +import { getResultFromFragment, handleExpiredCredentialWarning, logResultStatus } from './verify'; + +export const command = 'verify-obligation'; +export const describe = + 'Verify a BoE / obligation document via the obligation verify pipeline (not classic verify)'; + +export const handler = async () => { + try { + const signedVC = await promptQuestions(); + if (!signedVC) return; + await verifyObligation(signedVC); + } catch (err: unknown) { + signale.error(err instanceof Error ? err.message : String(err)); + } +}; + +export const promptQuestions = async (): Promise => { + const pathToSignedVC = await input({ + message: 'Please enter the path to your obligation / BoE document:', + required: true, + validate: (value: string) => { + if (!value || value.trim() === '') { + return 'Document file path is required'; + } + return true; + }, + }); + return readJsonFile(pathToSignedVC, 'document'); +}; + +export const verifyObligation = async (signedVC: SignedVerifiableCredential) => { + const isOpenAttestation = isWrappedV2Document(signedVC) || isWrappedV3Document(signedVC); + if (isOpenAttestation) { + signale.error( + 'OpenAttestation documents are not supported by verify-obligation. Use classic `trustvc verify`.', + ); + return; + } + + if (!isObligationRecord(signedVC)) { + signale.warn( + 'Document does not look like an obligation record (missing obligationRegistry). Continuing with obligation pipeline anyway.', + ); + } + + signale.info('Verifying obligation / BoE document...'); + const { result, warnings } = await verifyObligationW3C(signedVC); + if (warnings) { + handleExpiredCredentialWarning(warnings); + } + + logResultStatus(getResultFromFragment(FragmentType.DOCUMENT_INTEGRITY, result)); + logResultStatus(getResultFromFragment(FragmentType.DOCUMENT_STATUS, result)); + logResultStatus(getResultFromFragment(FragmentType.ISSUER_IDENTITY, result)); + + const obligationStatus = getObligationDocumentStatus(result); + if (obligationStatus) { + signale.info( + `Obligation document status: registry=${obligationStatus.obligationRegistry} status=${obligationStatus.status} terminationReason=${obligationStatus.terminationReason}`, + ); + } +}; + +const resolveRpcUrl = (networkName: string): string | undefined => { + const chain = Object.values(SUPPORTED_CHAINS).find((c) => c.name === networkName); + return (chain as { rpcUrl?: string } | undefined)?.rpcUrl; +}; + +const verifyObligationW3C = async ( + signedVC: SignedVerifiableCredential, +): Promise<{ result: VerificationFragment[]; warnings: unknown[][] }> => { + const run = async (rpcProviderUrl?: string) => { + const { fragments } = await verifyObligationDocument( + signedVC, + rpcProviderUrl ? { rpcProviderUrl } : {}, + ); + return fragments; + }; + + try { + const chainId = getChainId(signedVC) as CHAIN_ID | undefined; + if (chainId !== undefined && chainId !== null) { + const chainName = getSupportedNetworkNameFromId(Number(chainId)); + const rpcProviderUrl = + resolveRpcUrl(chainName) ?? resolveRpcUrl(SUPPORTED_CHAINS[chainId]?.name); + if (rpcProviderUrl) { + return await CaptureConsoleWarnAsync(() => run(rpcProviderUrl)); + } + // Fall back to public URLs for common testnets when SUPPORTED_CHAINS has no rpcUrl + const fallback: Partial> = { + [NetworkCmdName.Amoy]: 'https://rpc-amoy.polygon.technology', + [NetworkCmdName.Sepolia]: 'https://rpc.sepolia.org', + [NetworkCmdName.Local]: 'http://127.0.0.1:8545', + }; + const cmdName = Object.entries(supportedNetwork).find( + ([, v]) => v.networkName === chainName || v.networkId === Number(chainId), + )?.[0] as NetworkCmdName | undefined; + if (cmdName && fallback[cmdName]) { + return await CaptureConsoleWarnAsync(() => run(fallback[cmdName])); + } + } + } catch (err: unknown) { + signale.warn(`${err instanceof Error ? err.message : String(err)}`); + } + + const networkName = await promptNetworkSelection(); + const rpcProviderUrl = + resolveRpcUrl(networkName) ?? + (networkName === NetworkCmdName.Amoy + ? 'https://rpc-amoy.polygon.technology' + : networkName === NetworkCmdName.Sepolia + ? 'https://rpc.sepolia.org' + : undefined); + + return await CaptureConsoleWarnAsync(() => run(rpcProviderUrl)); +}; diff --git a/src/types.ts b/src/types.ts index 9b58676..d15108d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -102,6 +102,39 @@ export type TitleEscrowNominateBeneficiaryCommand = BaseTitleEscrowCommand & { newBeneficiary: string; }; +export type ObligationRegistryMintCommand = NetworkOption & + Partial & + WalletOrSignerOption & + GasPriceScale & { + address: string; + beneficiary: string; + holder: string; + tokenId: string; + remark?: string; + encryptionKey?: string; + }; + +export type BaseObligationEscrowCommand = NetworkAndWalletSignerOption & + GasPriceScale & { + obligationRegistryAddress: string; + tokenId: string; + remark?: string; + encryptionKey?: string; + }; + +export type ObligationEscrowTransferHolderCommand = BaseObligationEscrowCommand & { + newHolder: string; +}; + +export type ObligationEscrowEndorseTransferOfOwnersCommand = BaseObligationEscrowCommand & { + newHolder: string; + newOwner: string; +}; + +export type ObligationEscrowNominateBeneficiaryCommand = BaseObligationEscrowCommand & { + newBeneficiary: string; +}; + export type EncryptWalletCommand = PrivateKeyOption & { outputFile: string; }; diff --git a/src/utils/index.ts b/src/utils/index.ts index 081f499..3d83e77 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -30,3 +30,6 @@ export * from './dryRun'; // Document Verification export * from './document-verification'; + +// Obligation / BoE document helpers +export * from './obligation-document'; diff --git a/src/utils/obligation-document.ts b/src/utils/obligation-document.ts new file mode 100644 index 0000000..c4c9ceb --- /dev/null +++ b/src/utils/obligation-document.ts @@ -0,0 +1,68 @@ +import { info } from 'signale'; +import { + getObligationRegistryAddress, + getTokenId, + getChainId, + isObligationRecord, +} from '@trustvc/trustvc'; +import { SUPPORTED_CHAINS, CHAIN_ID } from './networks'; + +/** + * Extracts obligation / BoE document fields. Fails for classic ETR (tokenRegistry-only) docs. + */ +export const extractObligationDocumentInfo = async ( + document: any, +): Promise<{ + document: any; + obligationRegistry: string; + tokenId: string; + network: string; + documentId: string; +}> => { + if (!isObligationRecord(document)) { + throw new Error( + 'Document is not an obligation / BoE record. Use classic token-registry / title-escrow commands for TransferableRecords with tokenRegistry.', + ); + } + + let obligationRegistry: string | undefined; + let tokenId: string | undefined; + let chainId: CHAIN_ID | undefined; + + try { + obligationRegistry = getObligationRegistryAddress(document); + tokenId = getTokenId(document); + chainId = getChainId(document); + } catch (err) { + throw new Error( + `Failed to extract obligation document information: ${err instanceof Error ? err.message : String(err)}`, + ); + } + + if (!obligationRegistry) { + throw new Error('Document does not contain a valid obligationRegistry address'); + } + if (!tokenId) { + throw new Error('Document does not contain a valid token ID'); + } + if (!chainId) { + throw new Error('Document does not contain a valid chain ID'); + } + + const network = SUPPORTED_CHAINS[chainId].name; + const documentId = document.id || 'N/A'; + + info(`Extracted from obligation document:`); + info(` Network: ${network} (Chain ID: ${chainId})`); + info(` Obligation Registry: ${obligationRegistry}`); + info(` Token ID: ${tokenId}`); + info(` Document ID: ${documentId}`); + + return { + document, + obligationRegistry, + tokenId, + network, + documentId, + }; +}; diff --git a/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts b/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts new file mode 100644 index 0000000..b175b05 --- /dev/null +++ b/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts @@ -0,0 +1,121 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + acceptReturnedHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/accept-return-to-issuer'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + acceptReturnedObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +const { burnPopulateTransaction, escrowAcceptReturned } = vi.hoisted(() => ({ + burnPopulateTransaction: vi.fn().mockResolvedValue({ to: '0xRegistry', data: '0xburn' }), + escrowAcceptReturned: vi.fn(), +})); + +vi.mock('../../../src/commands/helpers', () => ({ + connectToObligationEscrow: vi.fn().mockResolvedValue({ + // The escrow contract intentionally has no acceptReturned method: burning + // a returned title happens on the registry, not the escrow. + acceptReturned: escrowAcceptReturned, + }), + connectToObligationRegistry: vi.fn().mockResolvedValue({ + burn: { populateTransaction: burnPopulateTransaction }, + }), + validateAndEncryptRemark: vi.fn().mockReturnValue('0xencrypted'), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getWalletOrSigner: vi.fn().mockResolvedValue({ + getAddress: vi.fn().mockResolvedValue('0xFrom'), + provider: {}, + }), + getSupportedNetwork: vi.fn().mockReturnValue({ networkId: 80002 }), + canEstimateGasPrice: vi.fn().mockReturnValue(false), + performDryRunWithConfirmation: vi.fn(async ({ getTransactionCallback }) => { + await getTransactionCallback(); + return true; + }), + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/accept-return-to-issuer', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs uses shared obligation prompts', async () => { + const result = await promptForInputs(); + expect(result.obligationRegistryAddress).toBe('0xRegistry'); + }); + + it('dry-run populates burn() on the registry contract, not the escrow', async () => { + const trustvc = await import('@trustvc/trustvc'); + (trustvc.acceptReturnedObligationRegistry as MockedFunction).mockResolvedValue({ + hash: '0xaccept-return', + wait: vi.fn().mockResolvedValue({ hash: '0xaccept-return' }), + }); + + await acceptReturnedHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + + expect(burnPopulateTransaction).toHaveBeenCalledWith('0x1', '0xencrypted'); + expect(escrowAcceptReturned).not.toHaveBeenCalled(); + expect(trustvc.acceptReturnedObligationRegistry).toHaveBeenCalled(); + }); +}); diff --git a/tests/commands/obligation-escrow/accept.test.ts b/tests/commands/obligation-escrow/accept.test.ts new file mode 100644 index 0000000..231bf3a --- /dev/null +++ b/tests/commands/obligation-escrow/accept.test.ts @@ -0,0 +1,85 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { acceptHandler, promptForInputs } from '../../../src/commands/obligation-escrow/accept'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + acceptObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xaccept' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/accept', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs uses shared obligation prompts', async () => { + const result = await promptForInputs(); + expect(result.obligationRegistryAddress).toBe('0xRegistry'); + }); + + it('acceptHandler runs SDK via runObligationEscrowTx', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await acceptHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalled(); + }); +}); diff --git a/tests/commands/obligation-escrow/discharge.test.ts b/tests/commands/obligation-escrow/discharge.test.ts new file mode 100644 index 0000000..e60089e --- /dev/null +++ b/tests/commands/obligation-escrow/discharge.test.ts @@ -0,0 +1,92 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + dischargeHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/discharge'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + dischargeObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xdischarge' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/discharge', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs uses shared obligation prompts', async () => { + const result = await promptForInputs(); + expect(result.obligationRegistryAddress).toBe('0xRegistry'); + }); + + it('dischargeHandler runs SDK via runObligationEscrowTx', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await dischargeHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ tokenId: '0x1' }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-escrow/endorse-transfer-owner.test.ts b/tests/commands/obligation-escrow/endorse-transfer-owner.test.ts new file mode 100644 index 0000000..deb6ba8 --- /dev/null +++ b/tests/commands/obligation-escrow/endorse-transfer-owner.test.ts @@ -0,0 +1,95 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + endorseHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/endorse-transfer-owner'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + transferBeneficiaryObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xendorse' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + promptAddress: vi.fn().mockResolvedValue('0xEndorsee0000000000000000000000000000001'), + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/endorse-transfer-owner', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs includes newBeneficiary', async () => { + const result = await promptForInputs(); + expect(result.newBeneficiary).toBe('0xEndorsee0000000000000000000000000000001'); + }); + + it('endorseHandler calls runObligationEscrowTx with beneficiary params', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await endorseHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + newBeneficiary: '0xEndorsee0000000000000000000000000000001', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ + newBeneficiaryAddress: '0xEndorsee0000000000000000000000000000001', + }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-escrow/nominate-transfer-owner.test.ts b/tests/commands/obligation-escrow/nominate-transfer-owner.test.ts new file mode 100644 index 0000000..a3da87a --- /dev/null +++ b/tests/commands/obligation-escrow/nominate-transfer-owner.test.ts @@ -0,0 +1,95 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + nominateHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/nominate-transfer-owner'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + nominateObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xnominate' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + promptAddress: vi.fn().mockResolvedValue('0xNominee00000000000000000000000000000001'), + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/nominate-transfer-owner', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs includes newBeneficiary', async () => { + const result = await promptForInputs(); + expect(result.newBeneficiary).toBe('0xNominee00000000000000000000000000000001'); + }); + + it('nominateHandler calls runObligationEscrowTx with nominee params', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await nominateHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + newBeneficiary: '0xNominee00000000000000000000000000000001', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ + newBeneficiaryAddress: '0xNominee00000000000000000000000000000001', + }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-escrow/reject-return-to-issuer.test.ts b/tests/commands/obligation-escrow/reject-return-to-issuer.test.ts new file mode 100644 index 0000000..83c6c2c --- /dev/null +++ b/tests/commands/obligation-escrow/reject-return-to-issuer.test.ts @@ -0,0 +1,121 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + rejectReturnedHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/reject-return-to-issuer'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + rejectReturnedObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +const { restorePopulateTransaction, escrowRejectReturned } = vi.hoisted(() => ({ + restorePopulateTransaction: vi.fn().mockResolvedValue({ to: '0xRegistry', data: '0xrestore' }), + escrowRejectReturned: vi.fn(), +})); + +vi.mock('../../../src/commands/helpers', () => ({ + connectToObligationEscrow: vi.fn().mockResolvedValue({ + // The escrow contract intentionally has no rejectReturned method: restoring + // a returned title happens on the registry, not the escrow. + rejectReturned: escrowRejectReturned, + }), + connectToObligationRegistry: vi.fn().mockResolvedValue({ + restore: { populateTransaction: restorePopulateTransaction }, + }), + validateAndEncryptRemark: vi.fn().mockReturnValue('0xencrypted'), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getWalletOrSigner: vi.fn().mockResolvedValue({ + getAddress: vi.fn().mockResolvedValue('0xFrom'), + provider: {}, + }), + getSupportedNetwork: vi.fn().mockReturnValue({ networkId: 80002 }), + canEstimateGasPrice: vi.fn().mockReturnValue(false), + performDryRunWithConfirmation: vi.fn(async ({ getTransactionCallback }) => { + await getTransactionCallback(); + return true; + }), + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/reject-return-to-issuer', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs uses shared obligation prompts', async () => { + const result = await promptForInputs(); + expect(result.obligationRegistryAddress).toBe('0xRegistry'); + }); + + it('dry-run populates restore() on the registry contract, not the escrow', async () => { + const trustvc = await import('@trustvc/trustvc'); + (trustvc.rejectReturnedObligationRegistry as MockedFunction).mockResolvedValue({ + hash: '0xreject-return', + wait: vi.fn().mockResolvedValue({ hash: '0xreject-return' }), + }); + + await rejectReturnedHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + + expect(restorePopulateTransaction).toHaveBeenCalledWith('0x1', '0xencrypted'); + expect(escrowRejectReturned).not.toHaveBeenCalled(); + expect(trustvc.rejectReturnedObligationRegistry).toHaveBeenCalled(); + }); +}); diff --git a/tests/commands/obligation-escrow/reject-transfer-holder.test.ts b/tests/commands/obligation-escrow/reject-transfer-holder.test.ts new file mode 100644 index 0000000..e596fe2 --- /dev/null +++ b/tests/commands/obligation-escrow/reject-transfer-holder.test.ts @@ -0,0 +1,92 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + rejectTransferHolderHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/reject-transfer-holder'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + rejectTransferHolderObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xreject-transfer-holder' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/reject-transfer-holder', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs uses shared obligation prompts', async () => { + const result = await promptForInputs(); + expect(result.obligationRegistryAddress).toBe('0xRegistry'); + }); + + it('rejectTransferHolderHandler runs SDK via runObligationEscrowTx', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await rejectTransferHolderHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ remarks: undefined }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-escrow/reject-transfer-owner-holder.test.ts b/tests/commands/obligation-escrow/reject-transfer-owner-holder.test.ts new file mode 100644 index 0000000..d01c1e2 --- /dev/null +++ b/tests/commands/obligation-escrow/reject-transfer-owner-holder.test.ts @@ -0,0 +1,92 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + rejectTransferOwnersHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/reject-transfer-owner-holder'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + rejectTransferOwnersObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xreject-transfer-owner-holder' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/reject-transfer-owner-holder', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs uses shared obligation prompts', async () => { + const result = await promptForInputs(); + expect(result.obligationRegistryAddress).toBe('0xRegistry'); + }); + + it('rejectTransferOwnersHandler runs SDK via runObligationEscrowTx', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await rejectTransferOwnersHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ remarks: undefined }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-escrow/reject-transfer-owner.test.ts b/tests/commands/obligation-escrow/reject-transfer-owner.test.ts new file mode 100644 index 0000000..9ef97d3 --- /dev/null +++ b/tests/commands/obligation-escrow/reject-transfer-owner.test.ts @@ -0,0 +1,92 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + rejectTransferOwnerHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/reject-transfer-owner'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + rejectTransferBeneficiaryObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xreject-transfer-owner' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/reject-transfer-owner', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs uses shared obligation prompts', async () => { + const result = await promptForInputs(); + expect(result.obligationRegistryAddress).toBe('0xRegistry'); + }); + + it('rejectTransferOwnerHandler runs SDK via runObligationEscrowTx', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await rejectTransferOwnerHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ remarks: undefined }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-escrow/reject.test.ts b/tests/commands/obligation-escrow/reject.test.ts new file mode 100644 index 0000000..e03034b --- /dev/null +++ b/tests/commands/obligation-escrow/reject.test.ts @@ -0,0 +1,89 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { rejectHandler, promptForInputs } from '../../../src/commands/obligation-escrow/reject'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + rejectObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + remark: 'ok', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xreject' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/reject', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs uses shared obligation prompts', async () => { + const result = await promptForInputs(); + expect(result.obligationRegistryAddress).toBe('0xRegistry'); + }); + + it('rejectHandler runs SDK via runObligationEscrowTx', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await rejectHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ tokenId: '0x1' }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-escrow/return-to-issuer.test.ts b/tests/commands/obligation-escrow/return-to-issuer.test.ts new file mode 100644 index 0000000..bd13c7b --- /dev/null +++ b/tests/commands/obligation-escrow/return-to-issuer.test.ts @@ -0,0 +1,68 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { returnToIssuerHandler } from '../../../src/commands/obligation-escrow/return-to-issuer'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + returnToIssuerObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xreturn' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/return-to-issuer', () => { + beforeEach(() => vi.clearAllMocks()); + + it('returnToIssuerHandler invokes runObligationEscrowTx', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await returnToIssuerHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalled(); + }); +}); diff --git a/tests/commands/obligation-escrow/status.test.ts b/tests/commands/obligation-escrow/status.test.ts new file mode 100644 index 0000000..103f7b1 --- /dev/null +++ b/tests/commands/obligation-escrow/status.test.ts @@ -0,0 +1,71 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { statusHandler } from '../../../src/commands/obligation-escrow/status'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + getObligationRegistryStatus: vi.fn().mockResolvedValue(0), + isObligationRegistryRegistered: vi.fn().mockResolvedValue(true), + getObligationEscrowTerminationReason: vi.fn().mockResolvedValue(0), + }; +}); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getWalletOrSigner: vi.fn().mockResolvedValue({ provider: {} }), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/status', () => { + beforeEach(() => vi.clearAllMocks()); + + it('reads status, registration, and termination reason', async () => { + const trustvc = await import('@trustvc/trustvc'); + await statusHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(trustvc.getObligationRegistryStatus as MockedFunction).toHaveBeenCalledWith( + { obligationRegistry: '0xRegistry' }, + expect.anything(), + { tokenId: '0x1' }, + ); + expect(trustvc.isObligationRegistryRegistered).toHaveBeenCalled(); + expect(trustvc.getObligationEscrowTerminationReason).toHaveBeenCalled(); + }); +}); diff --git a/tests/commands/obligation-escrow/transfer-holder.test.ts b/tests/commands/obligation-escrow/transfer-holder.test.ts new file mode 100644 index 0000000..4a5c7f6 --- /dev/null +++ b/tests/commands/obligation-escrow/transfer-holder.test.ts @@ -0,0 +1,95 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + changeHolderHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/transfer-holder'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + transferHolderObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xtransfer' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + promptAddress: vi.fn().mockResolvedValue('0xNewHolder000000000000000000000000000001'), + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/transfer-holder', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs includes newHolder', async () => { + const result = await promptForInputs(); + expect(result.newHolder).toBe('0xNewHolder000000000000000000000000000001'); + }); + + it('changeHolderHandler calls runObligationEscrowTx with holder params', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await changeHolderHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + newHolder: '0xNewHolder000000000000000000000000000001', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ + holderAddress: '0xNewHolder000000000000000000000000000001', + }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-escrow/transfer-owner-holder.test.ts b/tests/commands/obligation-escrow/transfer-owner-holder.test.ts new file mode 100644 index 0000000..05f89fb --- /dev/null +++ b/tests/commands/obligation-escrow/transfer-owner-holder.test.ts @@ -0,0 +1,101 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + transferOwnersHandler, + promptForInputs, +} from '../../../src/commands/obligation-escrow/transfer-owner-holder'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + transferOwnersObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ + promptBaseObligationEscrowInputs: vi.fn().mockResolvedValue({ + network: 'amoy', + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + encryptionKey: 'doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }), +})); + +vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ + runObligationEscrowTx: vi.fn().mockResolvedValue({ hash: '0xtransfer-owner-holder' }), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + promptAddress: vi + .fn() + .mockResolvedValueOnce('0xNewOwner000000000000000000000000000001') + .mockResolvedValueOnce('0xNewHolder00000000000000000000000000001'), + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-escrow/transfer-owner-holder', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptForInputs includes newOwner and newHolder', async () => { + const result = await promptForInputs(); + expect(result.newOwner).toBe('0xNewOwner000000000000000000000000000001'); + expect(result.newHolder).toBe('0xNewHolder00000000000000000000000000001'); + }); + + it('transferOwnersHandler calls runObligationEscrowTx with owner+holder params', async () => { + const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); + await transferOwnersHandler({ + network: NetworkCmdName.Amoy, + obligationRegistryAddress: '0xRegistry', + tokenId: '0x1', + newOwner: '0xNewOwner000000000000000000000000000001', + newHolder: '0xNewHolder00000000000000000000000000001', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect.objectContaining({ + sdkParams: expect.objectContaining({ + newBeneficiaryAddress: '0xNewOwner000000000000000000000000000001', + newHolderAddress: '0xNewHolder00000000000000000000000000001', + }), + }), + ); + }); +}); diff --git a/tests/commands/obligation-registry/deploy.test.ts b/tests/commands/obligation-registry/deploy.test.ts new file mode 100644 index 0000000..557c5bc --- /dev/null +++ b/tests/commands/obligation-registry/deploy.test.ts @@ -0,0 +1,135 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + handler, + deployObligationRegistryContract, + promptForInputs, +} from '../../../src/commands/obligation-registry/deploy'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@inquirer/prompts', () => ({ + select: vi.fn(), + input: vi.fn(), + confirm: vi.fn(), + password: vi.fn(), +})); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + deployObligationRegistry: vi.fn(), + }; +}); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + promptNetworkSelection: vi.fn().mockResolvedValue('amoy'), + promptWalletSelection: vi.fn().mockResolvedValue({ key: '0xabc' }), + promptAddress: vi.fn(), + getWalletOrSigner: vi.fn().mockResolvedValue({ + getAddress: vi.fn().mockResolvedValue('0xWallet'), + provider: {}, + }), + performDryRunWithConfirmation: vi.fn().mockResolvedValue(true), + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + getSupportedNetwork: vi.fn().mockReturnValue({ networkId: 80002 }), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + supportedNetwork: { + amoy: { networkId: 80002 }, + }, + }; +}); + +describe('obligation-registry/deploy', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + describe('promptForInputs', () => { + it('collects registry name, symbol, and wallet', async () => { + const { input, confirm } = await import('@inquirer/prompts'); + (input as MockedFunction) + .mockResolvedValueOnce('My BoE Registry') + .mockResolvedValueOnce('BOE'); + (confirm as MockedFunction).mockResolvedValueOnce(false); + + const result = await promptForInputs(); + expect(result.registryName).toBe('My BoE Registry'); + expect(result.registrySymbol).toBe('BOE'); + expect(result.network).toBe(NetworkCmdName.Amoy); + expect(result.key).toBe('0xabc'); + }); + }); + + describe('deployObligationRegistryContract', () => { + it('deploys via SDK and returns registry address', async () => { + const trustvc = await import('@trustvc/trustvc'); + const deployMock = trustvc.deployObligationRegistry as MockedFunction; + deployMock.mockResolvedValue({ + receipt: { hash: '0xhash', logs: [] }, + obligationRegistry: '0xRegistry', + obligationEscrowFactoryAddress: '0xFactory', + }); + + const address = await deployObligationRegistryContract({ + network: NetworkCmdName.Amoy, + registryName: 'My BoE Registry', + registrySymbol: 'BOE', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + + expect(deployMock).toHaveBeenCalled(); + expect(address).toBe('0xRegistry'); + }); + }); + + describe('handler', () => { + it('runs without throwing when prompts succeed', async () => { + const { input, confirm } = await import('@inquirer/prompts'); + (input as MockedFunction) + .mockResolvedValueOnce('My BoE Registry') + .mockResolvedValueOnce('BOE'); + (confirm as MockedFunction).mockResolvedValueOnce(false); + + const trustvc = await import('@trustvc/trustvc'); + (trustvc.deployObligationRegistry as MockedFunction).mockResolvedValue({ + receipt: { hash: '0xhash', logs: [] }, + obligationRegistry: '0xRegistry', + obligationEscrowFactoryAddress: '0xFactory', + }); + + await expect(handler()).resolves.toBeUndefined(); + }); + }); +}); diff --git a/tests/commands/obligation-registry/mint.test.ts b/tests/commands/obligation-registry/mint.test.ts new file mode 100644 index 0000000..a66070f --- /dev/null +++ b/tests/commands/obligation-registry/mint.test.ts @@ -0,0 +1,158 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { + handler, + mintObligationToken, + promptForInputs, +} from '../../../src/commands/obligation-registry/mint'; +import { NetworkCmdName } from '../../../src/utils'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@inquirer/prompts', () => ({ + select: vi.fn(), + input: vi.fn(), + confirm: vi.fn(), + password: vi.fn(), +})); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + mintObligationRegistry: vi.fn(), + isObligationRecord: vi.fn(() => true), + getObligationRegistryAddress: vi.fn(() => '0x71D28767662cB233F887aD2Bb65d048d760bA694'), + getTokenId: vi.fn(() => '0x23f719b016c88ba1ef2e10c0718d7d0f0026b1dc6e219629f81e2f0f811c4e3e'), + getChainId: vi.fn(() => 80002), + }; +}); + +vi.mock('../../../src/commands/helpers', () => ({ + connectToObligationRegistry: vi.fn().mockResolvedValue({ + mint: { + populateTransaction: vi.fn().mockResolvedValue({ to: '0xRegistry', data: '0x' }), + }, + }), + validateAndEncryptRemark: vi.fn((r?: string) => r || '0x'), +})); + +vi.mock('../../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + const { default: obligationFixture } = + await import('../../fixtures/obligation/w3c-obligation-record.json'); + return { + ...actual, + promptAndReadDocument: vi.fn().mockResolvedValue(obligationFixture), + verifyDocumentSignature: vi.fn().mockResolvedValue(undefined), + extractObligationDocumentInfo: vi.fn().mockResolvedValue({ + document: obligationFixture, + obligationRegistry: '0x71D28767662cB233F887aD2Bb65d048d760bA694', + tokenId: '0x23f719b016c88ba1ef2e10c0718d7d0f0026b1dc6e219629f81e2f0f811c4e3e', + network: 'amoy', + documentId: 'urn:uuid:obligation-test-doc-id', + }), + promptAddress: vi.fn(), + promptWalletSelection: vi.fn().mockResolvedValue({ key: '0xabc' }), + promptRemark: vi.fn().mockResolvedValue('issued'), + getWalletOrSigner: vi.fn().mockResolvedValue({ + getAddress: vi.fn().mockResolvedValue('0xWallet'), + provider: {}, + }), + performDryRunWithConfirmation: vi.fn().mockResolvedValue(true), + canEstimateGasPrice: vi.fn().mockReturnValue(false), + displayTransactionPrice: vi.fn(), + getEtherscanAddress: vi.fn().mockReturnValue('https://amoy.polygonscan.com'), + addAddressPrefix: (v: string) => (v.startsWith('0x') ? v : `0x${v}`), + getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), + }; +}); + +describe('obligation-registry/mint', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('promptForInputs builds mint command from obligation document', async () => { + const utils = await import('../../../src/utils'); + (utils.promptAddress as MockedFunction) + .mockResolvedValueOnce('0xBeneficiary000000000000000000000000000001') + .mockResolvedValueOnce('0xHolder0000000000000000000000000000000002'); + + const result = await promptForInputs(); + expect(result.address).toBe('0x71D28767662cB233F887aD2Bb65d048d760bA694'); + expect(result.beneficiary).toBe('0xBeneficiary000000000000000000000000000001'); + expect(result.holder).toBe('0xHolder0000000000000000000000000000000002'); + expect(result.remark).toBe('issued'); + }); + + it('mintObligationToken calls mintObligationRegistry', async () => { + const trustvc = await import('@trustvc/trustvc'); + const mintMock = trustvc.mintObligationRegistry as MockedFunction; + mintMock.mockResolvedValue({ + hash: '0xmint', + wait: vi.fn().mockResolvedValue({ hash: '0xmint' }), + }); + + await mintObligationToken({ + network: NetworkCmdName.Amoy, + address: '0x71D28767662cB233F887aD2Bb65d048d760bA694', + tokenId: '0x23f719b016c88ba1ef2e10c0718d7d0f0026b1dc6e219629f81e2f0f811c4e3e', + beneficiary: '0xBeneficiary000000000000000000000000000001', + holder: '0xHolder0000000000000000000000000000000002', + remark: 'issued', + encryptionKey: 'urn:uuid:obligation-test-doc-id', + key: '0xabc', + maxPriorityFeePerGasScale: 1, + }); + + expect(mintMock).toHaveBeenCalledWith( + { obligationRegistry: '0x71D28767662cB233F887aD2Bb65d048d760bA694' }, + expect.anything(), + expect.objectContaining({ + beneficiaryAddress: '0xBeneficiary000000000000000000000000000001', + holderAddress: '0xHolder0000000000000000000000000000000002', + }), + expect.objectContaining({ id: 'urn:uuid:obligation-test-doc-id' }), + ); + }); + + it('handler completes mint flow', async () => { + const utils = await import('../../../src/utils'); + (utils.promptAddress as MockedFunction) + .mockResolvedValueOnce('0xBeneficiary000000000000000000000000000001') + .mockResolvedValueOnce('0xHolder0000000000000000000000000000000002'); + + const trustvc = await import('@trustvc/trustvc'); + (trustvc.mintObligationRegistry as MockedFunction).mockResolvedValue({ + hash: '0xmint', + wait: vi.fn().mockResolvedValue({ hash: '0xmint' }), + }); + + await expect(handler()).resolves.toBeUndefined(); + }); +}); diff --git a/tests/commands/verify-obligation.test.ts b/tests/commands/verify-obligation.test.ts new file mode 100644 index 0000000..6958216 --- /dev/null +++ b/tests/commands/verify-obligation.test.ts @@ -0,0 +1,102 @@ +import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { verifyObligation, promptQuestions } from '../../src/commands/verify-obligation'; +import fixture from '../fixtures/obligation/w3c-obligation-record.json'; + +vi.mock('signale', async (importOriginal) => { + const originalSignale = await importOriginal(); + return { + ...originalSignale, + Signale: class MockSignale { + await = vi.fn(); + success = vi.fn(); + error = vi.fn(); + info = vi.fn(); + warn = vi.fn(); + constructor() {} + }, + error: vi.fn(), + info: vi.fn(), + success: vi.fn(), + warn: vi.fn(), + await: vi.fn(), + default: { + await: vi.fn(), + success: vi.fn(), + error: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + }, + }; +}); + +vi.mock('@inquirer/prompts', () => ({ + input: vi.fn().mockResolvedValue('/tmp/doc.json'), + select: vi.fn(), + confirm: vi.fn(), + password: vi.fn(), +})); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + verifyObligationDocument: vi.fn().mockResolvedValue({ + valid: true, + fragments: [ + { type: 'DOCUMENT_INTEGRITY', status: 'VALID', name: 'W3CSignatureIntegrity', data: true }, + { + type: 'DOCUMENT_STATUS', + status: 'VALID', + name: 'ObligationRecords', + data: { + obligationRegistry: '0x71D28767662cB233F887aD2Bb65d048d760bA694', + status: 0, + terminationReason: 0, + }, + }, + { type: 'ISSUER_IDENTITY', status: 'VALID', name: 'W3CIssuerIdentity', data: true }, + ], + }), + getObligationDocumentStatus: vi.fn().mockReturnValue({ + obligationRegistry: '0x71D28767662cB233F887aD2Bb65d048d760bA694', + status: 0, + terminationReason: 0, + }), + isObligationRecord: vi.fn(() => true), + isWrappedV2Document: vi.fn(() => false), + isWrappedV3Document: vi.fn(() => false), + getChainId: vi.fn(() => 80002), + }; +}); + +vi.mock('../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + const { default: obligationFixture } = + await import('../fixtures/obligation/w3c-obligation-record.json'); + return { + ...actual, + readJsonFile: vi.fn().mockReturnValue(obligationFixture), + getSupportedNetworkNameFromId: vi.fn().mockReturnValue('amoy'), + promptNetworkSelection: vi.fn(), + CaptureConsoleWarnAsync: async (fn: () => Promise) => ({ + result: await fn(), + warnings: [], + }), + }; +}); + +describe('verify-obligation', () => { + beforeEach(() => vi.clearAllMocks()); + + it('promptQuestions reads document path', async () => { + const doc = await promptQuestions(); + expect(doc).toEqual(fixture); + }); + + it('verifyObligation runs obligation pipeline and logs status', async () => { + const trustvc = await import('@trustvc/trustvc'); + await verifyObligation(fixture as any); + expect(trustvc.verifyObligationDocument as MockedFunction).toHaveBeenCalled(); + expect(trustvc.getObligationDocumentStatus).toHaveBeenCalled(); + }); +}); diff --git a/tests/fixtures/obligation/w3c-obligation-record.json b/tests/fixtures/obligation/w3c-obligation-record.json new file mode 100644 index 0000000..f4d19c7 --- /dev/null +++ b/tests/fixtures/obligation/w3c-obligation-record.json @@ -0,0 +1,116 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://w3id.org/security/data-integrity/v2", + "https://trustvc.io/context/obligation-records-context.json", + "https://trustvc.io/context/bill-of-exchange.json" + ], + "type": ["VerifiableCredential"], + "issuer": "did:web:example.tradetrust.io", + "id": "urn:uuid:obligation-test-doc-id", + "credentialStatus": { + "type": "TransferableRecords", + "tokenNetwork": { + "chain": "MATIC", + "chainId": "80002" + }, + "obligationRegistry": "0x71D28767662cB233F887aD2Bb65d048d760bA694", + "tokenId": "23f719b016c88ba1ef2e10c0718d7d0f0026b1dc6e219629f81e2f0f811c4e3e" + }, + "credentialSubject": { + "documentIdentifier": "BOE-TEST-001", + "bookingReferenceNumber": "BK-TEST-77821", + "purchaseOrderNumber": "PO-TEST-2026-0912", + "houseWaybillDocumentIdentifier": "HWB-TEST-44102", + "documentaryCreditIdentifier": "LC-TEST-2026-88341", + "transportContractDocumentNumber": "BL-TEST-2026-0781", + "uniqueConsignmentReference": "UCR-TEST-2026-004812", + "contractNumber": "CTR-TEST-2026-017", + "invoiceNumber": "INV-TEST-2026-0456", + "freightForwarderReferenceNumber": "FF-TEST-99021", + "issueDate": "2026-07-01", + "documentaryCreditIssueDate": "2026-06-15", + "documentaryCreditEffectiveEndDate": "2026-10-15", + "paymentDueDate": "2026-09-29", + "buyer": { + "name": "Fairview Industries Inc.", + "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" + }, + "invoicee": { + "name": "Fairview Industries Inc.", + "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" + }, + "sellersBank": { + "name": "DBS Bank Ltd", + "address": "12 Marina Boulevard, Marina Bay Financial Centre Tower 3, Singapore 018982" + }, + "importer": { + "name": "Fairview Industries Inc.", + "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" + }, + "exporter": { + "name": "Meridian Commodities Pte Ltd", + "address": "8 Marina Boulevard, #24-01, Singapore 018981" + }, + "documentaryCreditApplicantAgentBank": { + "name": "JPMorgan Chase Bank, N.A.", + "address": "383 Madison Avenue, New York, NY 10179, USA" + }, + "documentaryCreditAvailableBank": { + "name": "DBS Bank Ltd", + "address": "12 Marina Boulevard, Marina Bay Financial Centre Tower 3, Singapore 018982" + }, + "documentaryCreditBeneficiary": { + "name": "Meridian Commodities Pte Ltd", + "address": "8 Marina Boulevard, #24-01, Singapore 018981" + }, + "documentaryCreditDrawee": { + "name": "Fairview Industries Inc.", + "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" + }, + "seller": { + "name": "Meridian Commodities Pte Ltd", + "address": "8 Marina Boulevard, #24-01, Singapore 018981" + }, + "documentaryCreditReimbursingBank": { + "name": "Citibank N.A.", + "address": "388 Greenwich Street, New York, NY 10013, USA" + }, + "payee": { + "name": "Meridian Commodities Pte Ltd", + "address": "8 Marina Boulevard, #24-01, Singapore 018981" + }, + "buyersBank": { + "name": "Bank of America, N.A.", + "address": "100 North Tryon Street, Charlotte, NC 28255, USA" + }, + "drawer": { + "name": "Meridian Commodities Pte Ltd", + "address": "8 Marina Boulevard, #24-01, Singapore 018981" + }, + "drawee": { + "name": "Fairview Industries Inc.", + "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" + }, + "guarantor": { + "name": "Trade Guarantee Insurance Co.", + "address": "1 Raffles Place, #40-00, Singapore 048616" + }, + "paymentLocation": "Singapore", + "placeOfIssue": "Singapore", + "authentication": "Authenticated by Wei Ling Tan, Director of Trade Finance, Meridian Commodities Pte Ltd", + "paymentTerm": "90 days after sight", + "documentEndorsement": "Endorsed to the order of Meridian Commodities Pte Ltd", + "paymentMethod": "TT", + "monetaryAmount": "128500.00", + "currencyQualifier": "invoice currency", + "currencyCode": "USD" + }, + "proof": { + "type": "DataIntegrityProof", + "cryptosuite": "ecdsa-sd-2023", + "proofPurpose": "assertionMethod", + "verificationMethod": "did:web:example.tradetrust.io#key-1", + "proofValue": "uTEST" + } +} From 99ffec9bd60044ab5e467538708d552d4b8944b1 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 28 Jul 2026 06:30:54 +0530 Subject: [PATCH 02/40] docs: update README for improved clarity and formatting --- README.md | 490 +++++++++++++++++++++++++++--------------------------- 1 file changed, 242 insertions(+), 248 deletions(-) diff --git a/README.md b/README.md index fa3c3dd..8f6e00d 100644 --- a/README.md +++ b/README.md @@ -18,11 +18,15 @@ A comprehensive command-line interface for managing W3C Verifiable Credentials, - ✅ **Multi-Network Support**: Ethereum, Polygon, XDC, Stability, and Astron networks - ✅ **Interactive CLI**: User-friendly prompts for all operations + + ## Powered By This CLI leverages the TrustVC package: -- [`@trustvc/trustvc`](https://github.com/TrustVC/trustvc) - Core library for W3C credentials, OpenAttestation, token registries, and blockchain operations +- `[@trustvc/trustvc](https://github.com/TrustVC/trustvc)` - Core library for W3C credentials, OpenAttestation, token registries, and blockchain operations + + ## Table of Contents @@ -41,6 +45,8 @@ This CLI leverages the TrustVC package: - [License](#license) - [Obligation Registry user guide](#obligation-registry-user-guide) + + ## Prerequisites - **Node.js 22+** — Download from [nodejs.org](https://nodejs.org) or use [nvm](https://github.com/nvm-sh/nvm): @@ -50,6 +56,8 @@ nvm install 22 nvm use 22 ``` + + ## Installation Install the CLI globally: @@ -64,8 +72,12 @@ Or run a single command without installing: npx @trustvc/trustvc-cli ``` + + ## Quick Start + + ### W3C Verifiable Credentials ```sh @@ -88,6 +100,8 @@ trustvc credential-status-create trustvc credential-status-update ``` + + ### OpenAttestation Documents ```sh @@ -110,6 +124,8 @@ trustvc oa-encrypt trustvc oa-decrypt ``` + + ### Wallet Management ```sh @@ -123,6 +139,8 @@ trustvc wallet encrypt trustvc wallet decrypt ``` + + ### Document Store ```sh @@ -145,6 +163,8 @@ trustvc document-store revoke-role trustvc document-store transfer-ownership ``` + + ### Transaction ```sh @@ -156,6 +176,8 @@ trustvc transaction cancel [options] # e.g. trustvc transaction cancel --transaction-hash 0x... --network sepolia --encrypted-wallet-path ./wallet.json ``` + + ### Token Registry & Title Escrow ```sh @@ -190,6 +212,8 @@ trustvc title-escrow reject-transfer-owner trustvc title-escrow reject-transfer-owner-holder ``` + + ### Obligation Registry & Escrow (BoE) ```sh @@ -221,113 +245,119 @@ trustvc obligation-escrow reject-return-to-issuer trustvc verify-obligation ``` + + ## How It Works + + ### W3C Credentials - **Key Pair Generation**: Uses `generateKeyPair` from `@trustvc/trustvc` to create cryptographic key pairs supporting ECDSA-SD-2023 and BBS-2023 cryptosuites in Multikey format. - - **DID Creation**: Uses `issueDID` to generate did:web identifiers, allowing self-hosted DIDs as unique identifiers in decentralized systems. - - **Credential Signing**: Uses `signW3C` to sign verifiable credentials with did:web identifiers and modern cryptosuites. - - **Credential Verification**: Uses `verifyDocument` to verify W3C verifiable credentials. - - **Credential Status**: Provides commands to create and update W3C credential status lists for managing credential revocation and suspension. + + ### OpenAttestation - **Document Signing**: Uses `signOA` to cryptographically sign OpenAttestation v2 and v3 documents with private keys. - - **Document Verification**: Uses `verifyDocument` to verify OpenAttestation documents. - - **Document Wrapping**: Uses `wrapOA` to wrap OpenAttestation documents. - - **Document Unwrapping**: Uses `unwrapOA` to unwrap OpenAttestation documents. - - **Document Encryption**: Uses `oa-encrypt` to encrypt OA documents for safe sharing; use `oa-decrypt` with the same key to recover the document. + + ### Blockchain Operations - **Token Registry**: Deploy token registry contracts and mint document hashes (tokenIds) to blockchain-based token registries across multiple networks (Ethereum, Polygon, XDC, Stability, Astron). - - **Document Store**: Deploy document store contracts and use `documentStoreIssue` and `documentStoreRevoke` to issue and revoke document hashes in deployed contracts. - - **Transaction Cancel**: Cancel a pending transaction by replacing it with a 0-value transaction to yourself (same nonce, higher gas price). Supports specifying by transaction hash or by nonce and gas price. - - **Title Escrow**: Provides comprehensive transferable records management including holder transfers, beneficiary nominations, endorsements, returns, and rejections using smart contracts. - - **Obligation Registry (BoE)**: Separate command trees for electronic Bill of Exchange flows — `obligation-registry` (deploy/mint), `obligation-escrow` (accept/reject/discharge, transfers, return), and `verify-obligation` (dedicated BoE verify pipeline). Do not use classic `token-registry` / `title-escrow` / `verify` for obligation documents. See [Obligation Registry user guide](#obligation-registry-user-guide). + + ## Commands + + ### Available Commands -| Category | Command | Description | -| ------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------- | -| **W3C Credentials** | [`key-pair-generation`](#key-pair-generation) | Generate cryptographic key pairs (ECDSA-SD-2023, BBS-2023) | -| | [`did-web`](#did-web) | Create did:web identifiers from key pairs | -| | [`w3c-sign`](#w3c-sign) | Sign W3C verifiable credentials | -| | [`verify`](#verify) | Verify W3C verifiable credentials | -| | [`credential-status-create`](#credential-status-create) | Create credential status lists | -| | [`credential-status-update`](#credential-status-update) | Update credential status (revoke/suspend) | -| **OpenAttestation** | [`oa-sign`](#oa-sign) | Sign OpenAttestation v2/v3 documents | -| | [`verify`](#verify) | Verify OpenAttestation documents | -| | [`oa-wrap`](#oa-wrap) | Wrap OpenAttestation documents | -| | [`oa-unwrap`](#oa-unwrap) | Unwrap OpenAttestation documents | -| | [`oa-encrypt`](#oa-encrypt) | Encrypt an OA document for safe sharing and storage | -| | [`oa-decrypt`](#oa-decrypt) | Decrypt an OA document encrypted with oa-encrypt | -| **Token Registry** | [`mint`](#mint) | Mint tokens to blockchain registries | -| | [`token-registry deploy`](#token-registry-deploy) | Deploy token registry contracts | -| | [`mint`](#mint) | Mint tokens to blockchain registries | -| | `token-registry mint` | Alternative: `mint` | -| **Document Store** | [`document-store deploy`](#document-store-deploy) | Deploy document store contracts | -| | [`document-store issue`](#document-store-issue) | Issue document hashes | -| | [`document-store revoke`](#document-store-revoke) | Revoke document hashes | -| | [`document-store grant-role`](#document-store-grant-role) | Grant roles to accounts | -| | [`document-store revoke-role`](#document-store-revoke-role) | Revoke roles from accounts | -| | [`document-store transfer-ownership`](#document-store-transfer-ownership) | Transfer document store ownership | -| **Transaction** | [`transaction cancel`](#transaction-cancel) | Cancel a pending transaction | -| **Wallet** | [`wallet create`](#wallet-create) | Create a new encrypted wallet file | -| | [`wallet encrypt`](#wallet-encrypt) | Encrypt a wallet using a private key | -| | [`wallet decrypt`](#wallet-decrypt) | Decrypt an encrypted wallet file | -| **Title Escrow** | [`transfer-holder`](#title-escrow-transfer-holder) | Transfer document holder | -| | `title-escrow transfer-holder` | Alternative: `transfer-holder` | -| | [`nominate-transfer-owner`](#title-escrow-nominate-transfer-owner) | Nominate new beneficiary | -| | `title-escrow nominate-transfer-owner` | Alternative: `nominate-transfer-owner` | -| | [`endorse-transfer-owner`](#title-escrow-endorse-transfer-owner) | Endorse beneficiary change | -| | `title-escrow endorse-transfer-owner` | Alternative: `endorse-transfer-owner` | -| | [`transfer-owner-holder`](#title-escrow-transfer-owner-holder) | Endorse full ownership transfer | -| | `title-escrow transfer-owner-holder` | Alternative: `transfer-owner-holder` | -| | [`return-to-issuer`](#title-escrow-return-to-issuer) | Return document to issuer | -| | `title-escrow return-to-issuer` | Alternative: `return-to-issuer` | -| | [`accept-return-to-issuer`](#title-escrow-accept-return-to-issuer) | Accept returned document | -| | `title-escrow accept-return-to-issuer` | Alternative: `accept-return-to-issuer` | -| | [`reject-return-to-issuer`](#title-escrow-reject-return-to-issuer) | Reject returned document | -| | `title-escrow reject-return-to-issuer` | Alternative: `reject-return-to-issuer` | -| | [`reject-transfer-holder`](#title-escrow-reject-transfer-holder) | Reject holder transfer | -| | `title-escrow reject-transfer-holder` | Alternative: `reject-transfer-holder` | -| | [`reject-transfer-owner`](#title-escrow-reject-transfer-owner) | Reject owner transfer | -| | [`reject-transfer-owner-holder`](#title-escrow-reject-transfer-owner-holder) | Reject full transfer | -| | `title-escrow reject-transfer-owner-holder` | Alternative: `reject-transfer-owner-holder` | -| **Obligation / BoE**| [`obligation-registry deploy`](#obligation-registry-deploy) | Deploy Obligation Registry | -| | [`obligation-registry mint`](#obligation-registry-mint) | Mint BoE token to obligationRegistry | -| | [`obligation-escrow accept`](#obligation-escrow-accept) | Accept obligation | -| | [`obligation-escrow reject`](#obligation-escrow-reject) | Reject obligation | -| | [`obligation-escrow discharge`](#obligation-escrow-discharge) | Discharge obligation | -| | [`obligation-escrow status`](#obligation-escrow-status) | Read obligation / escrow status | -| | [`obligation-escrow transfer-holder`](#obligation-escrow-transfer-holder) | Transfer BoE holder | -| | `obligation-escrow nominate-transfer-owner` | Nominate BoE beneficiary | -| | `obligation-escrow endorse-transfer-owner` | Endorse BoE beneficiary change | -| | `obligation-escrow transfer-owner-holder` | Endorse full BoE ownership transfer | -| | `obligation-escrow return-to-issuer` | Return BoE to issuer | -| | `obligation-escrow accept-return-to-issuer` | Accept returned BoE | -| | `obligation-escrow reject-return-to-issuer` | Reject returned BoE | -| | `obligation-escrow reject-transfer-*` | Reject BoE transfer requests | -| | [`verify-obligation`](#verify-obligation) | Verify BoE via obligation pipeline | + +| Category | Command | Description | +| -------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------- | +| **W3C Credentials** | `[key-pair-generation](#key-pair-generation)` | Generate cryptographic key pairs (ECDSA-SD-2023, BBS-2023) | +| | `[did-web](#did-web)` | Create did:web identifiers from key pairs | +| | `[w3c-sign](#w3c-sign)` | Sign W3C verifiable credentials | +| | `[verify](#verify)` | Verify W3C verifiable credentials | +| | `[credential-status-create](#credential-status-create)` | Create credential status lists | +| | `[credential-status-update](#credential-status-update)` | Update credential status (revoke/suspend) | +| **OpenAttestation** | `[oa-sign](#oa-sign)` | Sign OpenAttestation v2/v3 documents | +| | `[verify](#verify)` | Verify OpenAttestation documents | +| | `[oa-wrap](#oa-wrap)` | Wrap OpenAttestation documents | +| | `[oa-unwrap](#oa-unwrap)` | Unwrap OpenAttestation documents | +| | `[oa-encrypt](#oa-encrypt)` | Encrypt an OA document for safe sharing and storage | +| | `[oa-decrypt](#oa-decrypt)` | Decrypt an OA document encrypted with oa-encrypt | +| **Token Registry** | `[mint](#mint)` | Mint tokens to blockchain registries | +| | `[token-registry deploy](#token-registry-deploy)` | Deploy token registry contracts | +| | `[mint](#mint)` | Mint tokens to blockchain registries | +| | `token-registry mint` | Alternative: `mint` | +| **Document Store** | `[document-store deploy](#document-store-deploy)` | Deploy document store contracts | +| | `[document-store issue](#document-store-issue)` | Issue document hashes | +| | `[document-store revoke](#document-store-revoke)` | Revoke document hashes | +| | `[document-store grant-role](#document-store-grant-role)` | Grant roles to accounts | +| | `[document-store revoke-role](#document-store-revoke-role)` | Revoke roles from accounts | +| | `[document-store transfer-ownership](#document-store-transfer-ownership)` | Transfer document store ownership | +| **Transaction** | `[transaction cancel](#transaction-cancel)` | Cancel a pending transaction | +| **Wallet** | `[wallet create](#wallet-create)` | Create a new encrypted wallet file | +| | `[wallet encrypt](#wallet-encrypt)` | Encrypt a wallet using a private key | +| | `[wallet decrypt](#wallet-decrypt)` | Decrypt an encrypted wallet file | +| **Title Escrow** | `[transfer-holder](#title-escrow-transfer-holder)` | Transfer document holder | +| | `title-escrow transfer-holder` | Alternative: `transfer-holder` | +| | `[nominate-transfer-owner](#title-escrow-nominate-transfer-owner)` | Nominate new beneficiary | +| | `title-escrow nominate-transfer-owner` | Alternative: `nominate-transfer-owner` | +| | `[endorse-transfer-owner](#title-escrow-endorse-transfer-owner)` | Endorse beneficiary change | +| | `title-escrow endorse-transfer-owner` | Alternative: `endorse-transfer-owner` | +| | `[transfer-owner-holder](#title-escrow-transfer-owner-holder)` | Endorse full ownership transfer | +| | `title-escrow transfer-owner-holder` | Alternative: `transfer-owner-holder` | +| | `[return-to-issuer](#title-escrow-return-to-issuer)` | Return document to issuer | +| | `title-escrow return-to-issuer` | Alternative: `return-to-issuer` | +| | `[accept-return-to-issuer](#title-escrow-accept-return-to-issuer)` | Accept returned document | +| | `title-escrow accept-return-to-issuer` | Alternative: `accept-return-to-issuer` | +| | `[reject-return-to-issuer](#title-escrow-reject-return-to-issuer)` | Reject returned document | +| | `title-escrow reject-return-to-issuer` | Alternative: `reject-return-to-issuer` | +| | `[reject-transfer-holder](#title-escrow-reject-transfer-holder)` | Reject holder transfer | +| | `title-escrow reject-transfer-holder` | Alternative: `reject-transfer-holder` | +| | `[reject-transfer-owner](#title-escrow-reject-transfer-owner)` | Reject owner transfer | +| | `[reject-transfer-owner-holder](#title-escrow-reject-transfer-owner-holder)` | Reject full transfer | +| | `title-escrow reject-transfer-owner-holder` | Alternative: `reject-transfer-owner-holder` | +| **Obligation / BoE** | `[obligation-registry deploy](#obligation-registry-deploy)` | Deploy Obligation Registry | +| | `[obligation-registry mint](#obligation-registry-mint)` | Mint BoE token to obligationRegistry | +| | `[obligation-escrow accept](#obligation-escrow-accept)` | Accept obligation | +| | `[obligation-escrow reject](#obligation-escrow-reject)` | Reject obligation | +| | `[obligation-escrow discharge](#obligation-escrow-discharge)` | Discharge obligation | +| | `[obligation-escrow status](#obligation-escrow-status)` | Read obligation / escrow status | +| | `[obligation-escrow transfer-holder](#obligation-escrow-transfer-holder)` | Transfer BoE holder | +| | `obligation-escrow nominate-transfer-owner` | Nominate BoE beneficiary | +| | `obligation-escrow endorse-transfer-owner` | Endorse BoE beneficiary change | +| | `obligation-escrow transfer-owner-holder` | Endorse full BoE ownership transfer | +| | `obligation-escrow return-to-issuer` | Return BoE to issuer | +| | `obligation-escrow accept-return-to-issuer` | Accept returned BoE | +| | `obligation-escrow reject-return-to-issuer` | Reject returned BoE | +| | `obligation-escrow reject-transfer-*` | Reject BoE transfer requests | +| | `[verify-obligation](#verify-obligation)` | Verify BoE via obligation pipeline | + + + --- + + ### Wallet/Private Key Options All title-escrow, obligation-registry, obligation-escrow, token registry, document-store, and transaction commands require a wallet or private key to sign transactions. You can provide your private key in one of the following ways: @@ -341,10 +371,11 @@ All title-escrow, obligation-registry, obligation-escrow, token registry, docume --- + + ### Detailed Command Reference -
-

transaction cancel

+#### transaction cancel Cancels a pending transaction by replacing it with a 0-value transaction to yourself using the same nonce and a higher gas price (replace-by-fee). This action is irreversible. @@ -357,11 +388,9 @@ trustvc transaction cancel You will be prompted for: 1. **How to specify the pending transaction** - - **By transaction hash (recommended)** – Enter the pending transaction hash (0x...). Nonce and gas price are fetched from the network and the gas price is increased by 100% for the replacement. - - **By nonce and gas price** – Enter the pending transaction nonce and a higher gas price (wei) for the replacement. Use this when the pending transaction uses EIP-1559 (no legacy `gasPrice`) or when you prefer to set the replacement gas manually. - + - **By transaction hash (recommended)** – Enter the pending transaction hash (0x...). Nonce and gas price are fetched from the network and the gas price is increased by 100% for the replacement. + - **By nonce and gas price** – Enter the pending transaction nonce and a higher gas price (wei) for the replacement. Use this when the pending transaction uses EIP-1559 (no legacy `gasPrice`) or when you prefer to set the replacement gas manually. 2. **Network** – Select the network (e.g. Sepolia, Mainnet). - 3. **Wallet / private key** – Choose encrypted wallet file, environment variable (OA_PRIVATE_KEY), key file, or enter the private key. **With options (non-interactive):** @@ -393,10 +422,9 @@ trustvc transaction cancel \ **Note:** If the pending transaction uses EIP-1559 (maxFeePerGas / maxPriorityFeePerGas), it has no legacy `gasPrice`. In that case, specify the transaction by **nonce and gas price** and set a gas price (in wei) for the replacement. -
-
-

key-pair-generation

+ +#### key-pair-generation Generates cryptographic key pairs for modern cryptosuites (ECDSA-SD-2023, BBS-2023). @@ -420,10 +448,9 @@ Creates `keypair.json` containing: - `secretKeyMultibase`: Secret key in multibase format - `seedBase58`: Seed (if provided for BBS-2023) -
-
-

did-web

+ +#### did-web Generates a did:web identifier from an existing key pair. @@ -445,10 +472,9 @@ trustvc did-web - `wellknown.json`: DID document for hosting at `/.well-known/did.json` - `didKeyPairs.json`: Key pair information with DID references -
-
-

w3c-sign

+ +#### w3c-sign Signs a W3C verifiable credential using a did:web identifier. @@ -468,10 +494,9 @@ trustvc w3c-sign **Output:** Creates `signed_vc.json` with cryptographic proof. -
-
-

verify

+ +#### verify Verifies a W3C or OA document using respective verification methods. @@ -495,10 +520,9 @@ Verifies the document integrity, status, and issuer identity. - OpenAttestation v2 - OpenAttestation v3 -
-
-

credential-status-create

+ +#### credential-status-create Creates a new W3C credential status list for managing revocation. @@ -519,10 +543,9 @@ trustvc credential-status-create **Output:** Signed credential status list file. -
-
-

credential-status-update

+ +#### credential-status-update Updates an existing W3C credential status list to revoke or suspend credentials. @@ -542,10 +565,9 @@ trustvc credential-status-update **Output:** Updated credential status list file. -
-
-

oa-sign

+ +#### oa-sign Signs OpenAttestation v2 or v3 documents with a private key. @@ -573,10 +595,9 @@ Signed OpenAttestation documents in the specified directory. - OpenAttestation v2 - OpenAttestation v3 -
-
-

oa-wrap

+ +#### oa-wrap Wraps OpenAttestation v2 or v3 documents @@ -600,10 +621,9 @@ Wrapped OpenAttestation document(s) in the specified directory. - OpenAttestation v2 - OpenAttestation v3 -
-
-

oa-unwrap

+ +#### oa-unwrap Unwraps OpenAttestation v2 or v3 documents @@ -626,10 +646,9 @@ Unwrapped OpenAttestation document(s) in the specified directory. - OpenAttestation v2 - OpenAttestation v3 -
-
-

oa-encrypt

+ +#### oa-encrypt Encrypts an Open Attestation document for safe sharing and storage. You will be prompted for an encryption key — remember it to decrypt later. @@ -654,10 +673,9 @@ Writes an encrypted document file containing `type: "encrypted-document"` and a - OpenAttestation v2 (raw or wrapped) - OpenAttestation v3 (raw or wrapped) -
-
-

oa-decrypt

+ +#### oa-decrypt Decrypts an Open Attestation document that was encrypted using `oa-encrypt`. You will be prompted for the decryption key. @@ -677,10 +695,9 @@ trustvc oa-decrypt Writes the decrypted Open Attestation document (raw OA v2/v3 or wrapped OA v2/v3) to the specified path. Fails if the key is wrong or the file is not a valid encrypted OA document. -
-
-

mint

+ +#### mint Mints a document hash (tokenId) to a token registry smart contract. @@ -693,7 +710,7 @@ trustvc mint **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - Beneficiary address (initial recipient) - Holder address (initial holder) - Wallet/private key option @@ -710,10 +727,9 @@ Transaction receipt with hash, block number, gas used, and explorer link. - Stability (Mainnet, Testnet) - Astron (Mainnet, Testnet) -
-
-

token-registry deploy

+ +#### token-registry deploy Deploys a token registry contract on the blockchain. @@ -742,10 +758,9 @@ Transaction receipt with deployed contract address, hash, block number, gas used - Stability (Mainnet, Testnet) - Astron (Mainnet, Testnet) -
-
-

token-registry mint

+ +#### token-registry mint Alternative command for minting tokens. Functionally identical to `mint`. @@ -759,10 +774,9 @@ trustvc mint trustvc token-registry mint ``` -
-
-

document-store deploy

+ +#### document-store deploy Deploys a document store contract on the blockchain. @@ -790,10 +804,9 @@ Transaction receipt with contract address, hash, block number, gas used, and exp - Stability (Mainnet, Testnet) - Astron (Mainnet, Testnet) -
-
-

document-store issue

+ +#### document-store issue Issues a document hash to a deployed document store. @@ -811,10 +824,9 @@ trustvc document-store issue **Output:** Transaction receipt confirming the hash issuance. -
-
-

document-store revoke

+ +#### document-store revoke Revokes a document hash from a deployed document store. @@ -832,10 +844,9 @@ trustvc document-store revoke **Output:** Transaction receipt confirming the hash revocation. -
-
-

document-store grant-role

+ +#### document-store grant-role Grants a role (ISSUER_ROLE, REVOKER_ROLE, or DEFAULT_ADMIN_ROLE) to an account in a deployed document store. @@ -864,10 +875,9 @@ Transaction receipt with hash, block number, gas used, and explorer link. - Stability (Mainnet, Testnet) - Astron (Mainnet, Testnet) -
-
-

document-store revoke-role

+ +#### document-store revoke-role Revokes a role (ISSUER_ROLE, REVOKER_ROLE, or DEFAULT_ADMIN_ROLE) from an account in a deployed document store. @@ -896,10 +906,9 @@ Transaction receipt with hash, block number, gas used, and explorer link. - Stability (Mainnet, Testnet) - Astron (Mainnet, Testnet) -
-
-

document-store transfer-ownership

+ +#### document-store transfer-ownership Transfers ownership of a document store contract to a new owner. This grants DEFAULT_ADMIN_ROLE to the new owner and revokes it from the current owner. @@ -926,10 +935,9 @@ Transaction receipts for both grant and revoke operations with hashes, block num - Stability (Mainnet, Testnet) - Astron (Mainnet, Testnet) -
-
-

wallet create

+ +#### wallet create Creates a new encrypted wallet file with a randomly generated private key. @@ -974,10 +982,9 @@ Creates `wallet.json` containing the encrypted wallet in the specified directory ⚠ IMPORTANT: If you lose your password, you will not be able to recover your wallet! ``` -
-
-

wallet encrypt

+ +#### wallet encrypt Encrypts an existing private key into a secure wallet file. @@ -1028,10 +1035,9 @@ Creates `wallet.json` containing the encrypted wallet in the specified directory ⚠ IMPORTANT: If you lose your password, you will not be able to recover your wallet! ``` -
-
-

wallet decrypt

+ +#### wallet decrypt Decrypts an encrypted wallet file and displays the private key and mnemonic phrase. @@ -1085,10 +1091,9 @@ Displays the decrypted wallet information: ⚠ IMPORTANT: Store this information securely and delete it from your terminal history! ``` -
-
-

title-escrow transfer-holder

+ +#### title-escrow transfer-holder Transfers the holder of a transferable record to a new address. @@ -1108,7 +1113,7 @@ trustvc title-escrow transfer-holder **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - New holder address - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) @@ -1116,10 +1121,9 @@ trustvc title-escrow transfer-holder **Output:** Transaction receipt confirming holder transfer. -
-
-

title-escrow nominate-transfer-owner

+ +#### title-escrow nominate-transfer-owner Nominates a new beneficiary (owner) for the transferable record. @@ -1139,7 +1143,7 @@ trustvc title-escrow nominate-transfer-owner **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - New beneficiary address - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) @@ -1147,10 +1151,9 @@ trustvc title-escrow nominate-transfer-owner **Output:** Transaction receipt confirming beneficiary nomination. -
-
-

title-escrow endorse-transfer-owner

+ +#### title-escrow endorse-transfer-owner Endorses the change of beneficiary (owner) for the transferable record. @@ -1170,7 +1173,7 @@ trustvc title-escrow endorse-transfer-owner **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - New beneficiary address - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) @@ -1178,10 +1181,9 @@ trustvc title-escrow endorse-transfer-owner **Output:** Transaction receipt confirming beneficiary endorsement. -
-
-

title-escrow transfer-owner-holder

+ +#### title-escrow transfer-owner-holder Endorses the transfer of both beneficiary and holder to new addresses. @@ -1201,7 +1203,7 @@ trustvc title-escrow transfer-owner-holder **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - New beneficiary address - New holder address - Wallet/private key option @@ -1210,10 +1212,9 @@ trustvc title-escrow transfer-owner-holder **Output:** Transaction receipt confirming full ownership transfer. -
-
-

title-escrow return-to-issuer

+ +#### title-escrow return-to-issuer Returns the transferable record to the issuer. @@ -1233,17 +1234,16 @@ trustvc title-escrow return-to-issuer **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) **Output:** Transaction receipt confirming document return. -
-
-

title-escrow accept-return-to-issuer

+ +#### title-escrow accept-return-to-issuer Accepts a returned transferable record (issuer action). @@ -1263,17 +1263,16 @@ trustvc title-escrow accept-return-to-issuer **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) **Output:** Transaction receipt confirming acceptance. -
-
-

title-escrow reject-return-to-issuer

+ +#### title-escrow reject-return-to-issuer Rejects a returned transferable record (issuer action). @@ -1293,17 +1292,16 @@ trustvc title-escrow reject-return-to-issuer **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) **Output:** Transaction receipt confirming rejection. -
-
-

title-escrow reject-transfer-holder

+ +#### title-escrow reject-transfer-holder Rejects a holder transfer request. @@ -1323,17 +1321,16 @@ trustvc title-escrow reject-transfer-holder **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) **Output:** Transaction receipt confirming rejection. -
-
-

title-escrow reject-transfer-owner

+ +#### title-escrow reject-transfer-owner Rejects a beneficiary transfer request. @@ -1353,17 +1350,16 @@ trustvc title-escrow reject-transfer-owner **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) **Output:** Transaction receipt confirming rejection. -
-
-

title-escrow reject-transfer-owner-holder

+ +#### title-escrow reject-transfer-owner-holder Rejects a full ownership transfer (both beneficiary and holder). @@ -1383,17 +1379,16 @@ trustvc title-escrow reject-transfer-owner-holder **Interactive Prompts:** - Path to TT/JSON document file (or manual input) - - _Network, token registry address, token ID, and document ID are extracted from the document_ + - *Network, token registry address, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional, V5 registries only - will be encrypted with document ID as encryption key) **Output:** Transaction receipt confirming rejection. -
-
-

obligation-registry deploy

+ +#### obligation-registry deploy Deploys an Obligation Registry (`TrustVCToken` + `ObligationEscrowFactory`) for electronic Bill of Exchange (BoE) flows. @@ -1416,10 +1411,9 @@ trustvc obligation-registry deploy **Output:** Deployed obligation registry (and factory) addresses plus transaction receipt. -
-
-

obligation-registry mint

+ +#### obligation-registry mint Mints a BoE tokenId to an Obligation Registry and creates the linked ObligationEscrow. @@ -1434,7 +1428,7 @@ trustvc obligation-registry mint **Interactive Prompts:** - Path to signed BoE / obligation document - - _Network, obligationRegistry address, token ID, and document ID are extracted from the document_ + - *Network, obligationRegistry address, token ID, and document ID are extracted from the document* - Holder and beneficiary (drawer/drawee) addresses as required - Wallet/private key option - Dry-run confirmation before broadcasting @@ -1442,10 +1436,9 @@ trustvc obligation-registry mint **Output:** Transaction receipt confirming mint. -
-
-

obligation-escrow accept

+ +#### obligation-escrow accept Accepts an obligation on the ObligationEscrow (drawee acceptance). @@ -1458,17 +1451,16 @@ trustvc obligation-escrow accept **Interactive Prompts:** - Path to BoE / obligation document - - _Network, obligationRegistry, token ID, and document ID are extracted from the document_ + - *Network, obligationRegistry, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional) **Output:** Transaction receipt confirming acceptance. -
-
-

obligation-escrow reject

+ +#### obligation-escrow reject Rejects an obligation on the ObligationEscrow. @@ -1487,10 +1479,9 @@ trustvc obligation-escrow reject **Output:** Transaction receipt confirming rejection. -
-
-

obligation-escrow discharge

+ +#### obligation-escrow discharge Discharges an accepted obligation on the ObligationEscrow. @@ -1509,10 +1500,9 @@ trustvc obligation-escrow discharge **Output:** Transaction receipt confirming discharge. -
-
-

obligation-escrow status

+ +#### obligation-escrow status Reads on-chain obligation / escrow status for a BoE document (read-only; no wallet required for the status call itself beyond network connectivity). @@ -1525,15 +1515,14 @@ trustvc obligation-escrow status **Interactive Prompts:** - Path to BoE / obligation document - - _Network, obligationRegistry, and token ID are extracted from the document_ + - *Network, obligationRegistry, and token ID are extracted from the document* **Output:** Obligation and escrow status fields from the chain. -
-
-

obligation-escrow transfer-holder

+ +#### obligation-escrow transfer-holder Transfers the holder of a BoE obligation record. Transfer, nominate, endorse, return, and reject variants mirror `title-escrow` but operate on ObligationEscrow via `obligation-escrow `. @@ -1557,10 +1546,9 @@ trustvc obligation-escrow transfer-holder **Output:** Transaction receipt confirming the escrow action. -
-
-

verify-obligation

+ +#### verify-obligation Verifies a BoE / obligation document using the dedicated obligation verify pipeline (`verifyObligationDocument`). @@ -1580,10 +1568,12 @@ trustvc verify-obligation **Output:** Verification fragments and overall validity (VALID / INVALID / SKIPPED outcomes as applicable). -
+ ## Configuration + + ### Custom RPC Endpoints You can override the default RPC endpoints for any network by setting environment variables. The format is `{NETWORK_NAME}_RPC`. @@ -1621,6 +1611,8 @@ If no environment variable is set, the CLI will use the default RPC endpoint for ## Development + + ### Setup ```sh @@ -1637,6 +1629,8 @@ npm link npm test ``` + + ### Project Structure ``` @@ -1703,9 +1697,11 @@ src/commands/ └── verify.ts # Verify W3C or OA document ``` + + ## Obligation Registry user guide -User guide for electronic Bill of Exchange (BoE) / obligation flows with **`trustvc-cli`**. +User guide for electronic Bill of Exchange (BoE) / obligation flows with `trustvc-cli`. Classic transferable records (eBL / Token Registry + Title Escrow) use different commands. This section covers **only** Obligation Registry. @@ -1730,14 +1726,18 @@ You do **not** need to call the TypeScript SDK directly — the CLI wraps it wit 4. **A signed BoE document** — W3C VC with `credentialStatus.obligationRegistry` (not `tokenRegistry`) 5. **Network access** — select network in prompts, or set a custom RPC (e.g. `export SEPOLIA_RPC=…`) + + ### Classic vs Obligation — pick the right commands -| Task | Classic ETR | Obligation / BoE | -|------|-------------|------------------| -| Deploy registry | `token-registry deploy` | `obligation-registry deploy` | -| Mint | `mint` / `token-registry mint` | `obligation-registry mint` | -| Escrow actions | `title-escrow …` | `obligation-escrow …` | -| Verify | `verify` | `verify-obligation` | + +| Task | Classic ETR | Obligation / BoE | +| --------------- | ------------------------------ | ---------------------------- | +| Deploy registry | `token-registry deploy` | `obligation-registry deploy` | +| Mint | `mint` / `token-registry mint` | `obligation-registry mint` | +| Escrow actions | `title-escrow …` | `obligation-escrow …` | +| Verify | `verify` | `verify-obligation` | + Using classic commands on a BoE document will fail or skip obligation checks. Using obligation commands on a classic eBL document will fail extraction (missing `obligationRegistry`). @@ -1773,17 +1773,21 @@ Signing/building the VC is usually done with TrustVC library tools or your app ( ### Who can run what -| Action | Typical role | -|--------|----------------| -| `obligation-registry deploy` | Deployer / issuer org | -| `obligation-registry mint` | Issuer (registry minter) | -| `obligation-escrow accept` / `reject` | Holder (roles split) | -| `obligation-escrow discharge` | Beneficiary | -| Transfer / nominate / endorse | Current holder or beneficiary per Title Escrow–style rules | -| `return-to-issuer` | Dual role (beneficiary == holder) | -| `accept-return-to-issuer` / `reject-return-to-issuer` | Issuer | -| `obligation-escrow status` | Anyone with network access + document | -| `verify-obligation` | Anyone with the document (+ RPC when on-chain checks run) | + +| Action | Typical role | +| ----------------------------------------------------- | ---------------------------------------------------------- | +| `obligation-registry deploy` | Deployer / issuer org | +| `obligation-registry mint` | Issuer (registry minter) | +| `obligation-escrow accept` / `reject` | Holder (roles split) | +| `obligation-escrow discharge` | Beneficiary | +| Transfer / nominate / endorse | Current holder or beneficiary per Title Escrow–style rules | +| `return-to-issuer` | Dual role (beneficiary == holder) | +| `accept-return-to-issuer` / `reject-return-to-issuer` | Issuer | +| `obligation-escrow status` | Anyone with network access + document | +| `verify-obligation` | Anyone with the document (+ RPC when on-chain checks run) | + + + ### What the CLI reads from your document @@ -1796,16 +1800,6 @@ For mint, escrow, and related flows, the CLI extracts: If extraction fails with a message about classic transferable records / `tokenRegistry`, you are using the wrong document type or command family. -### Things to know (not bugs) - -1. **Wrong command family** — BoE → `obligation-*` / `verify-obligation`. Classic eBL → `token-registry` / `title-escrow` / `verify`. -2. **Accept / reject need split roles** — `beneficiary != holder`. -3. **Return needs dual role** — `beneficiary == holder`. -4. **`terminationReason` is not set by return alone** — set on reject / discharge / burn (accept-return). -5. **Deploy + mint do not create the VC** — you still need a signed BoE file; mint only puts the token on-chain. - -Per-command prompts and outputs are in [Detailed Command Reference](#detailed-command-reference) above (`obligation-registry deploy`, `obligation-registry mint`, `obligation-escrow *`, `verify-obligation`). - ## License -Apache-2.0 +Apache-2.0 \ No newline at end of file From 0c0bfed5edda3ddf200da9252a25f41c4032b0c8 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 28 Jul 2026 11:08:03 +0530 Subject: [PATCH 03/40] fix: update W3C obligation record with new issuer and restructure credentialSubject fields for improved clarity and accuracy --- .../obligation/w3c-obligation-record.json | 108 ++++-------------- 1 file changed, 23 insertions(+), 85 deletions(-) diff --git a/tests/fixtures/obligation/w3c-obligation-record.json b/tests/fixtures/obligation/w3c-obligation-record.json index f4d19c7..d9f4edb 100644 --- a/tests/fixtures/obligation/w3c-obligation-record.json +++ b/tests/fixtures/obligation/w3c-obligation-record.json @@ -6,7 +6,7 @@ "https://trustvc.io/context/bill-of-exchange.json" ], "type": ["VerifiableCredential"], - "issuer": "did:web:example.tradetrust.io", + "issuer": "did:web:didhost.vercel.app", "id": "urn:uuid:obligation-test-doc-id", "credentialStatus": { "type": "TransferableRecords", @@ -18,99 +18,37 @@ "tokenId": "23f719b016c88ba1ef2e10c0718d7d0f0026b1dc6e219629f81e2f0f811c4e3e" }, "credentialSubject": { - "documentIdentifier": "BOE-TEST-001", - "bookingReferenceNumber": "BK-TEST-77821", - "purchaseOrderNumber": "PO-TEST-2026-0912", - "houseWaybillDocumentIdentifier": "HWB-TEST-44102", - "documentaryCreditIdentifier": "LC-TEST-2026-88341", - "transportContractDocumentNumber": "BL-TEST-2026-0781", - "uniqueConsignmentReference": "UCR-TEST-2026-004812", - "contractNumber": "CTR-TEST-2026-017", - "invoiceNumber": "INV-TEST-2026-0456", - "freightForwarderReferenceNumber": "FF-TEST-99021", - "issueDate": "2026-07-01", - "documentaryCreditIssueDate": "2026-06-15", - "documentaryCreditEffectiveEndDate": "2026-10-15", - "paymentDueDate": "2026-09-29", - "buyer": { - "name": "Fairview Industries Inc.", - "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" - }, - "invoicee": { - "name": "Fairview Industries Inc.", - "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" - }, - "sellersBank": { - "name": "DBS Bank Ltd", - "address": "12 Marina Boulevard, Marina Bay Financial Centre Tower 3, Singapore 018982" - }, - "importer": { - "name": "Fairview Industries Inc.", - "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" - }, - "exporter": { - "name": "Meridian Commodities Pte Ltd", - "address": "8 Marina Boulevard, #24-01, Singapore 018981" - }, - "documentaryCreditApplicantAgentBank": { - "name": "JPMorgan Chase Bank, N.A.", - "address": "383 Madison Avenue, New York, NY 10179, USA" - }, - "documentaryCreditAvailableBank": { - "name": "DBS Bank Ltd", - "address": "12 Marina Boulevard, Marina Bay Financial Centre Tower 3, Singapore 018982" - }, - "documentaryCreditBeneficiary": { - "name": "Meridian Commodities Pte Ltd", - "address": "8 Marina Boulevard, #24-01, Singapore 018981" - }, - "documentaryCreditDrawee": { + "electronicDocumentIdentifier": "urn:uuid:obligation-test-doc-id", + "referenceNumber": "BOE-TEST-001", + "amountInFigures": "128500.00", + "amountInWords": "One hundred twenty-eight thousand five hundred United States Dollars only", + "currencyCode": "USD", + "blDate": "2026-06-28", + "placeOfIssue": "Singapore", + "dateOfIssue": "2026-07-06", + "tenor": "At 90 days sight", + "payee": "Meridian Commodities Pte Ltd", + "drawnUnder": "Documentary Credit No. LC-TEST-2026-88341 / Invoice No. INV-TEST-2026-0456 / B/L No. BL-TEST-2026-0781", + "drawnUnderDate": "2026-06-15", + "issuedBy": "DBS Bank Ltd", + "drawee": { "name": "Fairview Industries Inc.", - "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" - }, - "seller": { - "name": "Meridian Commodities Pte Ltd", - "address": "8 Marina Boulevard, #24-01, Singapore 018981" - }, - "documentaryCreditReimbursingBank": { - "name": "Citibank N.A.", - "address": "388 Greenwich Street, New York, NY 10013, USA" - }, - "payee": { - "name": "Meridian Commodities Pte Ltd", - "address": "8 Marina Boulevard, #24-01, Singapore 018981" - }, - "buyersBank": { - "name": "Bank of America, N.A.", - "address": "100 North Tryon Street, Charlotte, NC 28255, USA" + "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA", + "authorisedSignatoryName": "James R. Carter", + "signature": "" }, "drawer": { "name": "Meridian Commodities Pte Ltd", - "address": "8 Marina Boulevard, #24-01, Singapore 018981" - }, - "drawee": { - "name": "Fairview Industries Inc.", - "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA" - }, - "guarantor": { - "name": "Trade Guarantee Insurance Co.", - "address": "1 Raffles Place, #40-00, Singapore 048616" - }, - "paymentLocation": "Singapore", - "placeOfIssue": "Singapore", - "authentication": "Authenticated by Wei Ling Tan, Director of Trade Finance, Meridian Commodities Pte Ltd", - "paymentTerm": "90 days after sight", - "documentEndorsement": "Endorsed to the order of Meridian Commodities Pte Ltd", - "paymentMethod": "TT", - "monetaryAmount": "128500.00", - "currencyQualifier": "invoice currency", - "currencyCode": "USD" + "address": "8 Marina Boulevard, #24-01, Singapore 018981", + "authorisedSignatoryName": "Wei Ling Tan", + "signature": "" + } }, "proof": { "type": "DataIntegrityProof", "cryptosuite": "ecdsa-sd-2023", "proofPurpose": "assertionMethod", - "verificationMethod": "did:web:example.tradetrust.io#key-1", + "verificationMethod": "did:web:didhost.vercel.app#keys-1", "proofValue": "uTEST" } } From 9802e14af5607a18675fc24d725d0b0cdcdc59a2 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 28 Jul 2026 20:05:19 +0530 Subject: [PATCH 04/40] refactor: consolidate verification commands into a unified pipeline --- README.md | 48 +++----- src/commands/verify-obligation.ts | 139 ----------------------- src/commands/verify.ts | 24 +++- tests/commands/verify-obligation.test.ts | 102 ----------------- 4 files changed, 35 insertions(+), 278 deletions(-) delete mode 100644 src/commands/verify-obligation.ts delete mode 100644 tests/commands/verify-obligation.test.ts diff --git a/README.md b/README.md index 8f6e00d..6bf830e 100644 --- a/README.md +++ b/README.md @@ -241,8 +241,8 @@ trustvc obligation-escrow return-to-issuer trustvc obligation-escrow accept-return-to-issuer trustvc obligation-escrow reject-return-to-issuer -# Verify via obligation pipeline (not classic verify) -trustvc verify-obligation +# Verify BoE or ETR documents (unified pipeline — auto-detects ObligationRecords) +trustvc verify ``` @@ -277,7 +277,7 @@ trustvc verify-obligation - **Document Store**: Deploy document store contracts and use `documentStoreIssue` and `documentStoreRevoke` to issue and revoke document hashes in deployed contracts. - **Transaction Cancel**: Cancel a pending transaction by replacing it with a 0-value transaction to yourself (same nonce, higher gas price). Supports specifying by transaction hash or by nonce and gas price. - **Title Escrow**: Provides comprehensive transferable records management including holder transfers, beneficiary nominations, endorsements, returns, and rejections using smart contracts. -- **Obligation Registry (BoE)**: Separate command trees for electronic Bill of Exchange flows — `obligation-registry` (deploy/mint), `obligation-escrow` (accept/reject/discharge, transfers, return), and `verify-obligation` (dedicated BoE verify pipeline). Do not use classic `token-registry` / `title-escrow` / `verify` for obligation documents. See [Obligation Registry user guide](#obligation-registry-user-guide). +- **Obligation Registry (BoE)**: Separate command trees for electronic Bill of Exchange on-chain flows — `obligation-registry` (deploy/mint) and `obligation-escrow` (accept/reject/discharge, transfers, return). Use **`trustvc verify`** for both ETR and BoE documents (ObligationRecords vs TransferableRecords is auto-detected). Do not use classic `token-registry` / `title-escrow` for obligation documents. See [Obligation Registry user guide](#obligation-registry-user-guide). @@ -349,7 +349,6 @@ trustvc verify-obligation | | `obligation-escrow accept-return-to-issuer` | Accept returned BoE | | | `obligation-escrow reject-return-to-issuer` | Reject returned BoE | | | `obligation-escrow reject-transfer-*` | Reject BoE transfer requests | -| | `[verify-obligation](#verify-obligation)` | Verify BoE via obligation pipeline | @@ -498,7 +497,9 @@ Creates `signed_vc.json` with cryptographic proof. #### verify -Verifies a W3C or OA document using respective verification methods. +Verifies a W3C or OA document using the unified TrustVC verification pipeline. + +Works for **classic ETR** (`tokenRegistry` → TransferableRecords fragment) and **BoE** (`obligationRegistry` → ObligationRecords fragment). When the document is an obligation record, the CLI also prints enriched on-chain status when available. **Usage:** @@ -512,11 +513,11 @@ trustvc verify - [If network required but no network detected]: Select network **Output:** -Verifies the document integrity, status, and issuer identity. +Verifies document integrity, status, and issuer identity. For BoE documents, logs obligation registry status when the ObligationRecords fragment is VALID. **Supported Formats:** -- W3C Verifiable Credential +- W3C Verifiable Credential (ETR, BoE, revocable VDs) - OpenAttestation v2 - OpenAttestation v3 @@ -1548,28 +1549,6 @@ Transaction receipt confirming the escrow action. -#### verify-obligation - -Verifies a BoE / obligation document using the dedicated obligation verify pipeline (`verifyObligationDocument`). - -**Do not use** classic `verify` for BoE documents — it targets ETR / classic transferable records and will skip or mis-handle ObligationRecords. - -**Usage:** - -```sh -trustvc verify-obligation -``` - -**Interactive Prompts:** - -- Path to signed BoE / obligation document -- Network selection when needed for on-chain checks - -**Output:** -Verification fragments and overall validity (VALID / INVALID / SKIPPED outcomes as applicable). - - - ## Configuration @@ -1686,7 +1665,6 @@ src/commands/ │ ├── create.ts # Create encrypted wallet │ ├── encrypt.ts # Encrypt private key to wallet │ └── decrypt.ts # Decrypt wallet file -├── verify-obligation.ts # Verify BoE via obligation pipeline └── w3c/ ├── did.ts # Generate DID ├── key-pair.ts # Generate key pairs @@ -1736,7 +1714,7 @@ You do **not** need to call the TypeScript SDK directly — the CLI wraps it wit | Deploy registry | `token-registry deploy` | `obligation-registry deploy` | | Mint | `mint` / `token-registry mint` | `obligation-registry mint` | | Escrow actions | `title-escrow …` | `obligation-escrow …` | -| Verify | `verify` | `verify-obligation` | +| Verify | `verify` (ETR and BoE) | `verify` (same command) | Using classic commands on a BoE document will fail or skip obligation checks. Using obligation commands on a classic eBL document will fail extraction (missing `obligationRegistry`). @@ -1748,10 +1726,10 @@ Using classic commands on a BoE document will fail or skip obligation checks. Us 2. Put the registry address into your BoE credential status, then sign the credential 3. Mint (issuer wallet) 4. Accept or reject (holder) ──► optional transfers / discharge / return -5. Verify with verify-obligation +5. Verify with `trustvc verify` ``` -Signing/building the VC is usually done with TrustVC library tools or your app (`ObligationDocumentBuilder`). The CLI focuses on **on-chain** steps and **verify**. +Signing/building the VC is usually done with TrustVC library tools or your app (`DocumentBuilder` + `obligationRegistry`). The CLI focuses on **on-chain** steps and **verify**. ### Step-by-step @@ -1769,7 +1747,7 @@ Signing/building the VC is usually done with TrustVC library tools or your app ( **7. Return to issuer (optional)** — requires **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). -**8. Verify** — `trustvc verify-obligation` (not classic `verify`). +**8. Verify** — `trustvc verify` (auto-detects BoE vs ETR). ### Who can run what @@ -1784,7 +1762,7 @@ Signing/building the VC is usually done with TrustVC library tools or your app ( | `return-to-issuer` | Dual role (beneficiary == holder) | | `accept-return-to-issuer` / `reject-return-to-issuer` | Issuer | | `obligation-escrow status` | Anyone with network access + document | -| `verify-obligation` | Anyone with the document (+ RPC when on-chain checks run) | +| `verify` | Anyone with the document (+ RPC when on-chain checks run) | diff --git a/src/commands/verify-obligation.ts b/src/commands/verify-obligation.ts deleted file mode 100644 index 4781b58..0000000 --- a/src/commands/verify-obligation.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { input } from '@inquirer/prompts'; -import { - getChainId, - getObligationDocumentStatus, - isObligationRecord, - isWrappedV2Document, - isWrappedV3Document, - SignedVerifiableCredential, - SUPPORTED_CHAINS, - CHAIN_ID, - VerificationFragment, - verifyObligationDocument, -} from '@trustvc/trustvc'; -import signale from 'signale'; -import { - CaptureConsoleWarnAsync, - getSupportedNetworkNameFromId, - promptNetworkSelection, - readJsonFile, - supportedNetwork, - NetworkCmdName, -} from '../utils'; -import { FragmentType } from '../types'; -import { getResultFromFragment, handleExpiredCredentialWarning, logResultStatus } from './verify'; - -export const command = 'verify-obligation'; -export const describe = - 'Verify a BoE / obligation document via the obligation verify pipeline (not classic verify)'; - -export const handler = async () => { - try { - const signedVC = await promptQuestions(); - if (!signedVC) return; - await verifyObligation(signedVC); - } catch (err: unknown) { - signale.error(err instanceof Error ? err.message : String(err)); - } -}; - -export const promptQuestions = async (): Promise => { - const pathToSignedVC = await input({ - message: 'Please enter the path to your obligation / BoE document:', - required: true, - validate: (value: string) => { - if (!value || value.trim() === '') { - return 'Document file path is required'; - } - return true; - }, - }); - return readJsonFile(pathToSignedVC, 'document'); -}; - -export const verifyObligation = async (signedVC: SignedVerifiableCredential) => { - const isOpenAttestation = isWrappedV2Document(signedVC) || isWrappedV3Document(signedVC); - if (isOpenAttestation) { - signale.error( - 'OpenAttestation documents are not supported by verify-obligation. Use classic `trustvc verify`.', - ); - return; - } - - if (!isObligationRecord(signedVC)) { - signale.warn( - 'Document does not look like an obligation record (missing obligationRegistry). Continuing with obligation pipeline anyway.', - ); - } - - signale.info('Verifying obligation / BoE document...'); - const { result, warnings } = await verifyObligationW3C(signedVC); - if (warnings) { - handleExpiredCredentialWarning(warnings); - } - - logResultStatus(getResultFromFragment(FragmentType.DOCUMENT_INTEGRITY, result)); - logResultStatus(getResultFromFragment(FragmentType.DOCUMENT_STATUS, result)); - logResultStatus(getResultFromFragment(FragmentType.ISSUER_IDENTITY, result)); - - const obligationStatus = getObligationDocumentStatus(result); - if (obligationStatus) { - signale.info( - `Obligation document status: registry=${obligationStatus.obligationRegistry} status=${obligationStatus.status} terminationReason=${obligationStatus.terminationReason}`, - ); - } -}; - -const resolveRpcUrl = (networkName: string): string | undefined => { - const chain = Object.values(SUPPORTED_CHAINS).find((c) => c.name === networkName); - return (chain as { rpcUrl?: string } | undefined)?.rpcUrl; -}; - -const verifyObligationW3C = async ( - signedVC: SignedVerifiableCredential, -): Promise<{ result: VerificationFragment[]; warnings: unknown[][] }> => { - const run = async (rpcProviderUrl?: string) => { - const { fragments } = await verifyObligationDocument( - signedVC, - rpcProviderUrl ? { rpcProviderUrl } : {}, - ); - return fragments; - }; - - try { - const chainId = getChainId(signedVC) as CHAIN_ID | undefined; - if (chainId !== undefined && chainId !== null) { - const chainName = getSupportedNetworkNameFromId(Number(chainId)); - const rpcProviderUrl = - resolveRpcUrl(chainName) ?? resolveRpcUrl(SUPPORTED_CHAINS[chainId]?.name); - if (rpcProviderUrl) { - return await CaptureConsoleWarnAsync(() => run(rpcProviderUrl)); - } - // Fall back to public URLs for common testnets when SUPPORTED_CHAINS has no rpcUrl - const fallback: Partial> = { - [NetworkCmdName.Amoy]: 'https://rpc-amoy.polygon.technology', - [NetworkCmdName.Sepolia]: 'https://rpc.sepolia.org', - [NetworkCmdName.Local]: 'http://127.0.0.1:8545', - }; - const cmdName = Object.entries(supportedNetwork).find( - ([, v]) => v.networkName === chainName || v.networkId === Number(chainId), - )?.[0] as NetworkCmdName | undefined; - if (cmdName && fallback[cmdName]) { - return await CaptureConsoleWarnAsync(() => run(fallback[cmdName])); - } - } - } catch (err: unknown) { - signale.warn(`${err instanceof Error ? err.message : String(err)}`); - } - - const networkName = await promptNetworkSelection(); - const rpcProviderUrl = - resolveRpcUrl(networkName) ?? - (networkName === NetworkCmdName.Amoy - ? 'https://rpc-amoy.polygon.technology' - : networkName === NetworkCmdName.Sepolia - ? 'https://rpc.sepolia.org' - : undefined); - - return await CaptureConsoleWarnAsync(() => run(rpcProviderUrl)); -}; diff --git a/src/commands/verify.ts b/src/commands/verify.ts index 0220349..0d8fba6 100644 --- a/src/commands/verify.ts +++ b/src/commands/verify.ts @@ -10,7 +10,9 @@ import { import { getChainId, getDocumentData, + getObligationDocumentStatus, isDocumentRevokable, + isObligationRecord, isTransferableRecord, isWrappedV2Document, isWrappedV3Document, @@ -25,7 +27,7 @@ import type { Provider as V5Provider } from '@ethersproject/providers'; import { FragmentType } from '../types'; export const command = 'verify'; -export const describe = 'Verify a document signed using w3c or OpenAttestation'; +export const describe = 'Verify a W3C or OpenAttestation document (ETR, BoE, or revocable VC)'; export const handler = async () => { try { @@ -69,6 +71,13 @@ export const verify = async (signedVC: SignedVerifiableCredential) => { logResultStatus(getResultFromFragment(FragmentType.DOCUMENT_INTEGRITY, result)); logResultStatus(getResultFromFragment(FragmentType.DOCUMENT_STATUS, result)); logResultStatus(getResultFromFragment(FragmentType.ISSUER_IDENTITY, result)); + + const obligationStatus = getObligationDocumentStatus(result); + if (obligationStatus) { + signale.info( + `Obligation document status: registry=${obligationStatus.obligationRegistry} status=${obligationStatus.status} terminationReason=${obligationStatus.terminationReason}`, + ); + } }; // ==== Helper Functions ==== @@ -80,8 +89,13 @@ const verifyW3CDocument = async ( // To capture the console.warn from trustvc function const { result: isTransferable } = CaptureConsoleWarn(() => isTransferableRecord(signedVC)); + const isObligation = isObligationRecord(signedVC); const isRevokable = isDocumentRevokable(signedVC); - const requiresNetwork = isTransferable || isRevokable; + const requiresNetwork = isTransferable || isObligation || isRevokable; + + if (isObligation) { + signale.info('Verifying obligation / BoE document...'); + } // If the document is not transferable or revokable, verify directly // To capture the console.warn from trustvc function @@ -99,6 +113,12 @@ const verifyW3CDocument = async ( signale.warn(`${err instanceof Error ? err.message : String(err)}`); } + const networkName = await promptNetworkSelection(); + const provider = getSupportedNetwork(networkName).provider() as unknown as V5Provider; + if (provider) { + return await CaptureConsoleWarnAsync(() => verifyDocument(signedVC, { provider })); + } + // Fallback: Verify without provider return await CaptureConsoleWarnAsync(() => verifyDocument(signedVC)); }; diff --git a/tests/commands/verify-obligation.test.ts b/tests/commands/verify-obligation.test.ts deleted file mode 100644 index 6958216..0000000 --- a/tests/commands/verify-obligation.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; -import { verifyObligation, promptQuestions } from '../../src/commands/verify-obligation'; -import fixture from '../fixtures/obligation/w3c-obligation-record.json'; - -vi.mock('signale', async (importOriginal) => { - const originalSignale = await importOriginal(); - return { - ...originalSignale, - Signale: class MockSignale { - await = vi.fn(); - success = vi.fn(); - error = vi.fn(); - info = vi.fn(); - warn = vi.fn(); - constructor() {} - }, - error: vi.fn(), - info: vi.fn(), - success: vi.fn(), - warn: vi.fn(), - await: vi.fn(), - default: { - await: vi.fn(), - success: vi.fn(), - error: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - }, - }; -}); - -vi.mock('@inquirer/prompts', () => ({ - input: vi.fn().mockResolvedValue('/tmp/doc.json'), - select: vi.fn(), - confirm: vi.fn(), - password: vi.fn(), -})); - -vi.mock('@trustvc/trustvc', async () => { - const actual = await vi.importActual('@trustvc/trustvc'); - return { - ...actual, - verifyObligationDocument: vi.fn().mockResolvedValue({ - valid: true, - fragments: [ - { type: 'DOCUMENT_INTEGRITY', status: 'VALID', name: 'W3CSignatureIntegrity', data: true }, - { - type: 'DOCUMENT_STATUS', - status: 'VALID', - name: 'ObligationRecords', - data: { - obligationRegistry: '0x71D28767662cB233F887aD2Bb65d048d760bA694', - status: 0, - terminationReason: 0, - }, - }, - { type: 'ISSUER_IDENTITY', status: 'VALID', name: 'W3CIssuerIdentity', data: true }, - ], - }), - getObligationDocumentStatus: vi.fn().mockReturnValue({ - obligationRegistry: '0x71D28767662cB233F887aD2Bb65d048d760bA694', - status: 0, - terminationReason: 0, - }), - isObligationRecord: vi.fn(() => true), - isWrappedV2Document: vi.fn(() => false), - isWrappedV3Document: vi.fn(() => false), - getChainId: vi.fn(() => 80002), - }; -}); - -vi.mock('../../src/utils', async (importOriginal) => { - const actual = await importOriginal(); - const { default: obligationFixture } = - await import('../fixtures/obligation/w3c-obligation-record.json'); - return { - ...actual, - readJsonFile: vi.fn().mockReturnValue(obligationFixture), - getSupportedNetworkNameFromId: vi.fn().mockReturnValue('amoy'), - promptNetworkSelection: vi.fn(), - CaptureConsoleWarnAsync: async (fn: () => Promise) => ({ - result: await fn(), - warnings: [], - }), - }; -}); - -describe('verify-obligation', () => { - beforeEach(() => vi.clearAllMocks()); - - it('promptQuestions reads document path', async () => { - const doc = await promptQuestions(); - expect(doc).toEqual(fixture); - }); - - it('verifyObligation runs obligation pipeline and logs status', async () => { - const trustvc = await import('@trustvc/trustvc'); - await verifyObligation(fixture as any); - expect(trustvc.verifyObligationDocument as MockedFunction).toHaveBeenCalled(); - expect(trustvc.getObligationDocumentStatus).toHaveBeenCalled(); - }); -}); From 1e5f18a02a514f22a56d16411a12005234edcef3 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Thu, 30 Jul 2026 19:36:23 +0530 Subject: [PATCH 05/40] docs: enhance README with updated TrustVC library details and local development instructions --- README.md | 27 ++++++++++-- src/commands/helpers.ts | 14 ++++--- src/commands/obligation-escrow/accept.ts | 2 +- src/commands/obligation-escrow/discharge.ts | 2 +- src/commands/obligation-escrow/reject.ts | 2 +- src/commands/obligation-escrow/runTx.ts | 4 +- src/commands/obligation-escrow/status.ts | 14 +++---- src/commands/obligation-registry/mint.ts | 4 +- src/commands/verify.ts | 41 +++++++++++++++++-- .../obligation-escrow/discharge.test.ts | 2 +- .../commands/obligation-escrow/reject.test.ts | 2 +- .../commands/obligation-escrow/status.test.ts | 2 +- .../commands/obligation-registry/mint.test.ts | 2 +- .../obligation/w3c-obligation-record.json | 6 +-- 14 files changed, 90 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 6bf830e..d31da94 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,9 @@ A comprehensive command-line interface for managing W3C Verifiable Credentials, This CLI leverages the TrustVC package: -- `[@trustvc/trustvc](https://github.com/TrustVC/trustvc)` - Core library for W3C credentials, OpenAttestation, token registries, and blockchain operations +- [`@trustvc/trustvc`](https://github.com/TrustVC/trustvc) — Core library for W3C credentials, OpenAttestation, token registries, Obligation Registry (BoE), and blockchain operations + +BoE on-chain helpers are imported from the **root** package (`mintObligationRegistry`, `acceptObligationRegistry`, …). Prefer those over any older `@trustvc/trustvc/obligation-registry` path. @@ -1598,6 +1600,12 @@ If no environment variable is set, the CLI will use the default RPC endpoint for # Install dependencies npm install +# (Optional) develop against a local @trustvc/trustvc build +# From the trustvc repo: +# NODE_OPTIONS='--max-old-space-size=8192' npm run build && yalc publish +# Then in this repo: +# yalc add @trustvc/trustvc && npm install + # Build the project npm run build @@ -1685,6 +1693,19 @@ Classic transferable records (eBL / Token Registry + Title Escrow) use different For library / SDK details, see the TrustVC README [§7c Obligation Registry (BoE)](https://github.com/TrustVC/trustvc#c-obligation-registry-boe). +SDK imports use the **root** package with the `*ObligationRegistry` suffix (no clash with classic ETR helpers): + +```ts +import { + mintObligationRegistry, + acceptObligationRegistry, + DocumentBuilder, + verifyDocument, +} from '@trustvc/trustvc'; +``` + +Build BoE credentials with `DocumentBuilder.obligationCredentialStatus({ obligationRegistry, chain, chainId, rpcProviderUrl })` (credential status uses `type: 'TransferableRecords'` plus an `obligationRegistry` field — not `tokenRegistry`). On-chain minting is separate via `obligation-registry mint` / `mintObligationRegistry`. + ### Who this is for Operators and integrators who: @@ -1737,13 +1758,13 @@ Signing/building the VC is usually done with TrustVC library tools or your app ( **2. Mint** — `trustvc obligation-registry mint` with a signed BoE JSON that already references your registry (registry, network, token ID, document ID are extracted). -**3. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. +**3. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. Reject (and discharge) auto-burn the SBT on-chain in the same transaction. **4. Status** — `trustvc obligation-escrow status` reads `Issued` / `Accepted` / `Rejected` / `Discharged`, registration, and termination reason. **5. Transfers (optional)** — `obligation-escrow transfer-holder`, nominate/endorse/return variants mirror `title-escrow`. -**6. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted. +**6. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted (also auto-burns). **7. Return to issuer (optional)** — requires **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). diff --git a/src/commands/helpers.ts b/src/commands/helpers.ts index 1bab3a3..f92927f 100644 --- a/src/commands/helpers.ts +++ b/src/commands/helpers.ts @@ -7,17 +7,19 @@ import { v4SupportInterfaceIds, v5SupportInterfaceIds, DocumentStore__factory, - obligationRegistryContracts, + encrypt, } from '@trustvc/trustvc'; -import { encrypt } from '@trustvc/trustvc'; // Internal utilities import { ConnectedSigner } from '../utils'; -const { TrustVCToken__factory, ObligationEscrow__factory } = obligationRegistryContracts; - -// Contract factories from TrustVC v5 -const { TitleEscrow__factory, TradeTrustToken__factory, TDocDeployer__factory } = v5Contracts; +const { + TrustVCToken__factory, + ObligationEscrow__factory, + TitleEscrow__factory, + TradeTrustToken__factory, + TDocDeployer__factory, +} = v5Contracts; // Interface for connectToTokenRegistry function arguments interface ConnectToTokenRegistryArgs { diff --git a/src/commands/obligation-escrow/accept.ts b/src/commands/obligation-escrow/accept.ts index b908318..d3b2c61 100644 --- a/src/commands/obligation-escrow/accept.ts +++ b/src/commands/obligation-escrow/accept.ts @@ -33,7 +33,7 @@ export const acceptHandler = async (args: BaseObligationEscrowCommand) => { args, populate: ({ escrow }, encryptedRemark) => escrow.accept.populateTransaction(encryptedRemark), sdk: acceptObligationRegistry as any, - sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + sdkParams: { remarks: args.remark }, }); displayTransactionPrice( transaction as unknown as TransactionReceiptFees, diff --git a/src/commands/obligation-escrow/discharge.ts b/src/commands/obligation-escrow/discharge.ts index a8b7f3a..8ae5907 100644 --- a/src/commands/obligation-escrow/discharge.ts +++ b/src/commands/obligation-escrow/discharge.ts @@ -34,7 +34,7 @@ export const dischargeHandler = async (args: BaseObligationEscrowCommand) => { populate: ({ escrow }, encryptedRemark) => escrow.discharge.populateTransaction(encryptedRemark), sdk: dischargeObligationRegistry as any, - sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + sdkParams: { remarks: args.remark }, }); displayTransactionPrice( transaction as unknown as TransactionReceiptFees, diff --git a/src/commands/obligation-escrow/reject.ts b/src/commands/obligation-escrow/reject.ts index ef23c1d..6e5e5e2 100644 --- a/src/commands/obligation-escrow/reject.ts +++ b/src/commands/obligation-escrow/reject.ts @@ -33,7 +33,7 @@ export const rejectHandler = async (args: BaseObligationEscrowCommand) => { args, populate: ({ escrow }, encryptedRemark) => escrow.reject.populateTransaction(encryptedRemark), sdk: rejectObligationRegistry as any, - sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + sdkParams: { remarks: args.remark }, }); displayTransactionPrice( transaction as unknown as TransactionReceiptFees, diff --git a/src/commands/obligation-escrow/runTx.ts b/src/commands/obligation-escrow/runTx.ts index 4270e9d..fd5053a 100644 --- a/src/commands/obligation-escrow/runTx.ts +++ b/src/commands/obligation-escrow/runTx.ts @@ -21,7 +21,7 @@ type PopulateFn = ( ) => Promise; type SdkCall = ( - contractOptions: { obligationRegistry: string; tokenId: string }, + contractOptions: { obligationRegistryAddress: string; tokenId: string }, wallet: any, params: Record, txOptions: Record, @@ -63,7 +63,7 @@ export const runObligationEscrowTx = async (opts: { process.exit(0); } - const contractOptions = { obligationRegistry: obligationRegistryAddress, tokenId }; + const contractOptions = { obligationRegistryAddress, tokenId }; let transaction; if (canEstimateGasPrice(network)) { diff --git a/src/commands/obligation-escrow/status.ts b/src/commands/obligation-escrow/status.ts index dfe904b..2f3f7fd 100644 --- a/src/commands/obligation-escrow/status.ts +++ b/src/commands/obligation-escrow/status.ts @@ -1,6 +1,6 @@ import { error, info, success } from 'signale'; import { - DocumentStatus, + ObligationDocumentStatus, ObligationEscrowTerminationReason, getObligationEscrowTerminationReason, getObligationRegistryStatus, @@ -14,12 +14,11 @@ export const command = 'status'; export const describe = 'Read BoE obligation escrow status / registration / termination reason'; const STATUS_LABEL: Record = { - [DocumentStatus.Issued]: 'Issued', - [DocumentStatus.Accepted]: 'Accepted', - [DocumentStatus.Rejected]: 'Rejected', - [DocumentStatus.Discharged]: 'Discharged', + [ObligationDocumentStatus.Issued]: 'Issued', + [ObligationDocumentStatus.Accepted]: 'Accepted', + [ObligationDocumentStatus.Rejected]: 'Rejected', + [ObligationDocumentStatus.Discharged]: 'Discharged', }; - const REASON_LABEL: Record = { [ObligationEscrowTerminationReason.None]: 'None', [ObligationEscrowTerminationReason.ReturnToIssuer]: 'ReturnToIssuer', @@ -43,7 +42,8 @@ export const statusHandler = async (args: BaseObligationEscrowCommand) => { try { const { obligationRegistryAddress, tokenId, network, ...rest } = args; const wallet = await getWalletOrSigner({ network, ...rest }); - const opts = { obligationRegistry: obligationRegistryAddress }; + // Escrow resolution uses contractOptions.tokenId (params.tokenId is API parity only). + const opts = { obligationRegistryAddress, tokenId }; const status = await getObligationRegistryStatus(opts, wallet, { tokenId }); const registered = await isObligationRegistryRegistered(opts, wallet, { tokenId }); diff --git a/src/commands/obligation-registry/mint.ts b/src/commands/obligation-registry/mint.ts index f3cca8d..9997df1 100644 --- a/src/commands/obligation-registry/mint.ts +++ b/src/commands/obligation-registry/mint.ts @@ -134,7 +134,7 @@ const mintToObligationRegistry = async ({ } const gasFees = await getGasFees({ provider: wallet.provider, ...rest }); transaction = await mintObligationRegistry( - { obligationRegistry: address }, + { obligationRegistryAddress: address }, wallet, { beneficiaryAddress: beneficiary, holderAddress: holder, tokenId, remarks: remark }, { @@ -145,7 +145,7 @@ const mintToObligationRegistry = async ({ ); } else { transaction = await mintObligationRegistry( - { obligationRegistry: address }, + { obligationRegistryAddress: address }, wallet, { beneficiaryAddress: beneficiary, holderAddress: holder, tokenId, remarks: remark }, { id: encryptionKey }, diff --git a/src/commands/verify.ts b/src/commands/verify.ts index 0d8fba6..25d9084 100644 --- a/src/commands/verify.ts +++ b/src/commands/verify.ts @@ -10,7 +10,6 @@ import { import { getChainId, getDocumentData, - getObligationDocumentStatus, isDocumentRevokable, isObligationRecord, isTransferableRecord, @@ -26,6 +25,35 @@ import signale from 'signale'; import type { Provider as V5Provider } from '@ethersproject/providers'; import { FragmentType } from '../types'; +const OBLIGATION_RECORDS_FRAGMENT = 'ObligationRecords'; + +type ObligationDocumentStatusInfo = { + obligationRegistry: string; + status?: number; + terminationReason?: number; +}; + +/** Extract obligation registry info from a VALID ObligationRecords verify fragment. */ +export const getObligationDocumentStatus = ( + fragments: VerificationFragment[], +): ObligationDocumentStatusInfo | null => { + const fragment = fragments.find((f) => f.name === OBLIGATION_RECORDS_FRAGMENT); + if (!fragment || fragment.status !== 'VALID') return null; + + const data = ( + fragment as { + data?: { obligationRegistry?: string; status?: number; terminationReason?: number }; + } + ).data; + if (!data?.obligationRegistry) return null; + + return { + obligationRegistry: data.obligationRegistry, + status: data.status, + terminationReason: data.terminationReason, + }; +}; + export const command = 'verify'; export const describe = 'Verify a W3C or OpenAttestation document (ETR, BoE, or revocable VC)'; @@ -74,9 +102,14 @@ export const verify = async (signedVC: SignedVerifiableCredential) => { const obligationStatus = getObligationDocumentStatus(result); if (obligationStatus) { - signale.info( - `Obligation document status: registry=${obligationStatus.obligationRegistry} status=${obligationStatus.status} terminationReason=${obligationStatus.terminationReason}`, - ); + const parts = [`registry=${obligationStatus.obligationRegistry}`]; + if (obligationStatus.status !== undefined) { + parts.push(`status=${obligationStatus.status}`); + } + if (obligationStatus.terminationReason !== undefined) { + parts.push(`terminationReason=${obligationStatus.terminationReason}`); + } + signale.info(`Obligation document status: ${parts.join(' ')}`); } }; diff --git a/tests/commands/obligation-escrow/discharge.test.ts b/tests/commands/obligation-escrow/discharge.test.ts index e60089e..5a0c010 100644 --- a/tests/commands/obligation-escrow/discharge.test.ts +++ b/tests/commands/obligation-escrow/discharge.test.ts @@ -85,7 +85,7 @@ describe('obligation-escrow/discharge', () => { }); expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( expect.objectContaining({ - sdkParams: expect.objectContaining({ tokenId: '0x1' }), + sdkParams: expect.objectContaining({ remarks: undefined }), }), ); }); diff --git a/tests/commands/obligation-escrow/reject.test.ts b/tests/commands/obligation-escrow/reject.test.ts index e03034b..90d0c07 100644 --- a/tests/commands/obligation-escrow/reject.test.ts +++ b/tests/commands/obligation-escrow/reject.test.ts @@ -82,7 +82,7 @@ describe('obligation-escrow/reject', () => { }); expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( expect.objectContaining({ - sdkParams: expect.objectContaining({ tokenId: '0x1' }), + sdkParams: expect.objectContaining({ remarks: undefined }), }), ); }); diff --git a/tests/commands/obligation-escrow/status.test.ts b/tests/commands/obligation-escrow/status.test.ts index 103f7b1..e80f2cc 100644 --- a/tests/commands/obligation-escrow/status.test.ts +++ b/tests/commands/obligation-escrow/status.test.ts @@ -61,7 +61,7 @@ describe('obligation-escrow/status', () => { maxPriorityFeePerGasScale: 1, }); expect(trustvc.getObligationRegistryStatus as MockedFunction).toHaveBeenCalledWith( - { obligationRegistry: '0xRegistry' }, + { obligationRegistryAddress: '0xRegistry', tokenId: '0x1' }, expect.anything(), { tokenId: '0x1' }, ); diff --git a/tests/commands/obligation-registry/mint.test.ts b/tests/commands/obligation-registry/mint.test.ts index a66070f..02c41d9 100644 --- a/tests/commands/obligation-registry/mint.test.ts +++ b/tests/commands/obligation-registry/mint.test.ts @@ -131,7 +131,7 @@ describe('obligation-registry/mint', () => { }); expect(mintMock).toHaveBeenCalledWith( - { obligationRegistry: '0x71D28767662cB233F887aD2Bb65d048d760bA694' }, + { obligationRegistryAddress: '0x71D28767662cB233F887aD2Bb65d048d760bA694' }, expect.anything(), expect.objectContaining({ beneficiaryAddress: '0xBeneficiary000000000000000000000000000001', diff --git a/tests/fixtures/obligation/w3c-obligation-record.json b/tests/fixtures/obligation/w3c-obligation-record.json index d9f4edb..3371dfb 100644 --- a/tests/fixtures/obligation/w3c-obligation-record.json +++ b/tests/fixtures/obligation/w3c-obligation-record.json @@ -2,11 +2,11 @@ "@context": [ "https://www.w3.org/ns/credentials/v2", "https://w3id.org/security/data-integrity/v2", - "https://trustvc.io/context/obligation-records-context.json", + "https://trustvc.io/context/transferable-records-context.json", "https://trustvc.io/context/bill-of-exchange.json" ], "type": ["VerifiableCredential"], - "issuer": "did:web:didhost.vercel.app", + "issuer": "did:web:trustvc.github.io:did:1", "id": "urn:uuid:obligation-test-doc-id", "credentialStatus": { "type": "TransferableRecords", @@ -48,7 +48,7 @@ "type": "DataIntegrityProof", "cryptosuite": "ecdsa-sd-2023", "proofPurpose": "assertionMethod", - "verificationMethod": "did:web:didhost.vercel.app#keys-1", + "verificationMethod": "did:web:trustvc.github.io:did:1#multikey-1", "proofValue": "uTEST" } } From a28a14e9ecbdfa666a67d121fd6e50f5bcca8b46 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Thu, 30 Jul 2026 19:40:58 +0530 Subject: [PATCH 06/40] chore(release): add beta-boe branch for prerelease channel - Updated .releaserc.json to include a new branch 'beta-boe' for beta prereleases. - Modified release.yml to trigger workflows on pushes to the 'beta-boe' branch. --- .github/workflows/release.yml | 1 + .releaserc.json | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 51da03e..84209c1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - beta-boe jobs: test: diff --git a/.releaserc.json b/.releaserc.json index d11fc16..1d46820 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -1,5 +1,12 @@ { - "branches": ["main"], + "branches": [ + "main", + { + "name": "beta-boe", + "prerelease": "beta", + "channel": "beta" + } + ], "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", From 81a4d24daae078e92fb282330d227cc4941e3810 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Fri, 31 Jul 2026 14:31:22 +0530 Subject: [PATCH 07/40] chore(release): update to version 1.1.0 and enhance dependencies - Bumped version to 1.1.0 in package.json and package-lock.json. - Updated @trustvc/trustvc dependency to version 2.15.0-beta.3. - Added new dependencies including @account-abstraction/contracts and @digitalbazaar/ecdsa-rdfc-2019-cryptosuite. - Improved README for clarity on obligation escrow commands. --- README.md | 12 +- package-lock.json | 535 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 3 files changed, 494 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index d31da94..5a5222f 100644 --- a/README.md +++ b/README.md @@ -1600,12 +1600,6 @@ If no environment variable is set, the CLI will use the default RPC endpoint for # Install dependencies npm install -# (Optional) develop against a local @trustvc/trustvc build -# From the trustvc repo: -# NODE_OPTIONS='--max-old-space-size=8192' npm run build && yalc publish -# Then in this repo: -# yalc add @trustvc/trustvc && npm install - # Build the project npm run build @@ -1758,15 +1752,15 @@ Signing/building the VC is usually done with TrustVC library tools or your app ( **2. Mint** — `trustvc obligation-registry mint` with a signed BoE JSON that already references your registry (registry, network, token ID, document ID are extracted). -**3. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. Reject (and discharge) auto-burn the SBT on-chain in the same transaction. +**3. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. Reject only sets status to Rejected; closing requires return-to-issuer afterward. **4. Status** — `trustvc obligation-escrow status` reads `Issued` / `Accepted` / `Rejected` / `Discharged`, registration, and termination reason. **5. Transfers (optional)** — `obligation-escrow transfer-holder`, nominate/endorse/return variants mirror `title-escrow`. -**6. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted (also auto-burns). +**6. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted (sets Discharged; does not burn). -**7. Return to issuer (optional)** — requires **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). +**7. Return to issuer** — requires status **Rejected** or **Discharged** and **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). **8. Verify** — `trustvc verify` (auto-detects BoE vs ETR). diff --git a/package-lock.json b/package-lock.json index 737cc65..29c40c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@trustvc/trustvc-cli", - "version": "1.0.1", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@trustvc/trustvc-cli", - "version": "1.0.1", + "version": "1.1.0", "license": "Apache-2.0", "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "^2.14.1", + "@trustvc/trustvc": "2.15.0-beta.3", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "dotenv": "^16.0.0", @@ -134,6 +134,16 @@ "ethers": "^5.8.0" } }, + "node_modules/@account-abstraction/contracts": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@account-abstraction/contracts/-/contracts-0.8.0.tgz", + "integrity": "sha512-8krPx/gpnoT+5xAroagVCbeA7FbUigMZWXFKKPm+oghyr29Dksssdx5sI7xGv9212i4JPaDDUGFk58dpuwVgHA==", + "license": "MIT", + "dependencies": { + "@openzeppelin/contracts": "^5.1.0", + "@uniswap/v3-periphery": "^1.4.3" + } + }, "node_modules/@actions/core": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz", @@ -972,6 +982,81 @@ "node": ">=18" } }, + "node_modules/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite/-/ecdsa-rdfc-2019-cryptosuite-1.3.0.tgz", + "integrity": "sha512-Rhg++GnGWHJ29QyWTFW0tRqd/uGLADIsLVEq10zEIAY7D9ScoSLtyYzwZ/zBueBTXHXrtDUEL5SfrSvcKTLFyg==", + "license": "BSD-3-Clause", + "dependencies": { + "@digitalbazaar/ecdsa-multikey": "^1.6.0", + "jsonld": "^9.0.0", + "rdf-canonize": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite/node_modules/@digitalbazaar/http-client": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.3.0.tgz", + "integrity": "sha512-6lMpxpt9BOmqHKGs9Xm6DP4LlZTBFer/ZjHvP3FcW3IaUWYIWC7dw5RFZnvw4fP57kAVcm1dp3IF+Y50qhBvAw==", + "license": "BSD-3-Clause", + "dependencies": { + "ky": "^1.14.2", + "undici": "^6.23.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite/node_modules/canonicalize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-2.1.0.tgz", + "integrity": "sha512-F705O3xrsUtgt98j7leetNhTWPe+5S72rlL5O4jA1pKqBVQ/dT1O1D6PFxmSXvc0SUOinWS57DKx0I3CHrXJHQ==", + "license": "Apache-2.0", + "bin": { + "canonicalize": "bin/canonicalize.js" + } + }, + "node_modules/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite/node_modules/jsonld": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-9.0.0.tgz", + "integrity": "sha512-pjMIdkXfC1T2wrX9B9i2uXhGdyCmgec3qgMht+TDj+S0qX3bjWMQUfL7NeqEhuRTi8G5ESzmL9uGlST7nzSEWg==", + "license": "BSD-3-Clause", + "dependencies": { + "@digitalbazaar/http-client": "^4.2.0", + "canonicalize": "^2.1.0", + "lru-cache": "^6.0.0", + "rdf-canonize": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite/node_modules/ky": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz", + "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "node_modules/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite/node_modules/rdf-canonize": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-5.0.0.tgz", + "integrity": "sha512-g8OUrgMXAR9ys/ZuJVfBr05sPPoMA7nHIVs8VEvg9QwM5W4GR2qSFEEHjsyHF1eWlBaf8Ev40WNjQFQ+nJTO3w==", + "license": "BSD-3-Clause", + "dependencies": { + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@digitalbazaar/ecdsa-sd-2023-cryptosuite": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/ecdsa-sd-2023-cryptosuite/-/ecdsa-sd-2023-cryptosuite-3.4.1.tgz", @@ -2936,6 +3021,18 @@ "yarn": "1.x" } }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@noble/curves": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.2.0.tgz", @@ -3144,6 +3241,12 @@ "@octokit/openapi-types": "^27.0.0" } }, + "node_modules/@openzeppelin/contracts": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.6.1.tgz", + "integrity": "sha512-Ly6SlsVJ3mj+b18W3R8gNufB7dTICT105fJhodGAGgyC2oqnBAhqSiNDJ8V8DLY05cCz81GLI0CU5vNYA1EC/w==", + "license": "MIT" + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -3510,6 +3613,81 @@ "win32" ] }, + "node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz", + "integrity": "sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.9.0", + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz", + "integrity": "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.8.0", + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@sec-ant/readable-stream": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", @@ -5004,9 +5182,9 @@ }, "node_modules/@tradetrust-tt/token-registry-v5": { "name": "@tradetrust-tt/token-registry", - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/token-registry/-/token-registry-5.5.1.tgz", - "integrity": "sha512-yxOdjRLSI0fPptFbicYpnb/fn4Ngbi/LuGDCQKL0vb7PLCvhT8DLpiAFbFs0cc+QAb439lnZjhPg+UbWQHufRA==", + "version": "5.6.0-beta.1", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/token-registry/-/token-registry-5.6.0-beta.1.tgz", + "integrity": "sha512-EtxZw/WnvGQMb/MB243eHy4ejSTN8bkV7I7Y9f19xk9v/mOojFL74C/tD1zjsZUUjiQi9rzLRYlzSUNbZBN2gg==", "license": "Apache-2.0", "dependencies": { "ethers": "^6.13.4" @@ -5359,30 +5537,43 @@ "integrity": "sha512-YIECQwcoreIfyTbol1/5u9CGK6mbg0Q0bSN2/Ks388zLus1IXELWK5EHYuyrFPbb9d8ajsvz7m+ySsMIY9574w==", "license": "Apache-2.0" }, + "node_modules/@trustvc/eip7702": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@trustvc/eip7702/-/eip7702-1.0.0-beta.1.tgz", + "integrity": "sha512-cOGuZVLHd0+Uu7rZ/Dp2iF1VuNq+L+pWWGe+tPD/u74rSvCAzIc17dIk5HOwRBiC5awh1rXG46vLG8IRc5O01Q==", + "license": "MIT", + "dependencies": { + "@account-abstraction/contracts": "^0.8.0", + "@openzeppelin/contracts": "^5.6.1" + } + }, "node_modules/@trustvc/trustvc": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.14.1.tgz", - "integrity": "sha512-vGR6/s8nn69sl3Ntr/rE8+kg64RuqsRN2AeB0yeNOAUwTWEmQRk16cvB4g1xW7+CsLc5yI5sRuAqeAmbhHdV0g==", + "version": "2.15.0-beta.3", + "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.15.0-beta.3.tgz", + "integrity": "sha512-EFiYmXZulyWnq+g3tb/yrpANkggE76QjDILuNE/68ZWdh9cw8yUxR+hcrqkk8tbhapmgulzQjtTuuASnuD1xog==", "license": "Apache-2.0", "dependencies": { "@tradetrust-tt/dnsprove": "^2.18.0", "@tradetrust-tt/ethers-aws-kms-signer": "^2.1.4", "@tradetrust-tt/token-registry-v4": "npm:@tradetrust-tt/token-registry@^4.16.0", - "@tradetrust-tt/token-registry-v5": "npm:@tradetrust-tt/token-registry@^5.5.0", + "@tradetrust-tt/token-registry-v5": "npm:@tradetrust-tt/token-registry@^5.6.0-beta.1", "@tradetrust-tt/tradetrust": "^6.10.3", "@tradetrust-tt/tt-verify": "^9.7.5", "@trustvc/document-store": "^1.0.3", - "@trustvc/w3c": "^2.2.0", - "@trustvc/w3c-context": "^2.2.0", - "@trustvc/w3c-credential-status": "^2.2.0", - "@trustvc/w3c-issuer": "^2.2.0", - "@trustvc/w3c-vc": "^2.2.0", + "@trustvc/eip7702": "^1.0.0-beta.1", + "@trustvc/w3c": "^2.4.1", + "@trustvc/w3c-context": "^2.4.0", + "@trustvc/w3c-credential-status": "^2.4.0", + "@trustvc/w3c-issuer": "^2.3.0", + "@trustvc/w3c-vc": "^2.4.1", "ethers": "^5.8.0", "ethersV6": "npm:ethers@^6.14.4", "js-sha3": "^0.9.3", "node-fetch": "^2.7.0", "node-forge": "^1.3.3", - "ts-chacha20": "^1.2.0" + "permissionless": "^0.3.6", + "ts-chacha20": "^1.2.0", + "viem": "^2.53.1" }, "engines": { "node": ">=20.0.0" @@ -5469,33 +5660,33 @@ } }, "node_modules/@trustvc/trustvc/node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/@trustvc/w3c": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@trustvc/w3c/-/w3c-2.2.0.tgz", - "integrity": "sha512-2WhAoYZW7JLt9H1OrT1qcwTL0g6LymMVg9uiZ3xxlaRgYzOmEqClN3Pq6apo1kRZTzJMHcKWECKADkHGa0Jgqw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@trustvc/w3c/-/w3c-2.4.1.tgz", + "integrity": "sha512-yCyztSAbialRn9VYvXrHUE4v13q4g/BHUN4XUctzF5lrN3WsHKSgUpFUflocLdp1h5fxvJTbqyVoMSh5SDLwQw==", "license": "Apache-2.0", "dependencies": { - "@trustvc/w3c-context": "^2.2.0", - "@trustvc/w3c-credential-status": "^2.2.0", - "@trustvc/w3c-issuer": "^2.2.0", - "@trustvc/w3c-vc": "^2.2.0" + "@trustvc/w3c-context": "^2.4.0", + "@trustvc/w3c-credential-status": "^2.4.0", + "@trustvc/w3c-issuer": "^2.3.0", + "@trustvc/w3c-vc": "^2.4.1" }, "engines": { "node": ">=18.x" } }, "node_modules/@trustvc/w3c-context": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-context/-/w3c-context-2.2.0.tgz", - "integrity": "sha512-p9mtIWZ1v1hhqiGLJ5Fu+2PK9ClIRsdo04vgCVC8BxhIjwUU7ZHb95sYF1E8Ay9pP2BRyFujBdoaYXHH8n5v4A==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-context/-/w3c-context-2.4.0.tgz", + "integrity": "sha512-OCRfqZfTyEZ2Lpd5RPBl36DwvaKv3qV1PgZOEA9hrnEtHMWxwS5iSdv+xFYK8pZIoeheFZKymfgcB5LL7UBQRw==", "license": "Apache-2.0", "dependencies": { "did-resolver": "^4.1.0", @@ -5512,13 +5703,13 @@ "license": "Apache-2.0" }, "node_modules/@trustvc/w3c-credential-status": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-credential-status/-/w3c-credential-status-2.2.0.tgz", - "integrity": "sha512-lfgnvAUSwdi5hWnuf+wqTkpPTYxmZyZ8kdzVPRQeKWqb0ysdWN+n32ROoNpQAFSPqYlSL0pLWuI/vg35WuhnEA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-credential-status/-/w3c-credential-status-2.4.0.tgz", + "integrity": "sha512-fiMGtfOmq1x9e+vd89ZKqguYtmW2w2k2hxINkno+mDNHdt5CV8tfTH5EbL1fY0oPiuXM5SK+dV6iSBTIWGPFog==", "license": "Apache-2.0", "dependencies": { - "@trustvc/w3c-context": "^2.2.0", - "@trustvc/w3c-issuer": "^2.2.0", + "@trustvc/w3c-context": "^2.4.0", + "@trustvc/w3c-issuer": "^2.3.0", "base64url-universal": "^2.0.0", "pako": "^2.1.0" }, @@ -5527,9 +5718,9 @@ } }, "node_modules/@trustvc/w3c-issuer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-issuer/-/w3c-issuer-2.2.0.tgz", - "integrity": "sha512-o5XWh52c3KeNqrrIpSvjPt+3zwZ/wwh2hlGOst6PZXVzS9nMab+jUwhs52d+HBhe2r8BL4Z81sdMGA8YAEnk6Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-issuer/-/w3c-issuer-2.3.0.tgz", + "integrity": "sha512-J/Rlae2s/ihkF0q6OmBofmzdRjDI98ED9lRFIB6Uh2WaEl8eZP7+FoStip+t1Piy6ZbO/6MwaS0QCw/6N6viMA==", "license": "Apache-2.0", "dependencies": { "@digitalbazaar/bls12-381-multikey": "^2.1.0", @@ -5561,19 +5752,20 @@ } }, "node_modules/@trustvc/w3c-vc": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-2.2.0.tgz", - "integrity": "sha512-QAfoEgNndi2X+V0Nz9nBGiUk4Ko0XUFVLn0BY6qJK8GHJndMMCEcZ14PlaHyKG8nIossQeKZbsBwnavm2jRFdg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-2.4.1.tgz", + "integrity": "sha512-f/pqBu70epEYVmtWvKvlhCd2F5QkV885rCcbfa9KZq9xYbOzeBueIF7P3gSdv3ILAiMCQTxvpL7hd8I8hj+M1A==", "license": "Apache-2.0", "dependencies": { "@digitalbazaar/bbs-2023-cryptosuite": "^2.0.1", "@digitalbazaar/bls12-381-multikey": "^2.1.0", "@digitalbazaar/data-integrity": "^2.5.0", "@digitalbazaar/ecdsa-multikey": "^1.8.0", + "@digitalbazaar/ecdsa-rdfc-2019-cryptosuite": "^1.3.0", "@digitalbazaar/ecdsa-sd-2023-cryptosuite": "^3.4.1", "@mattrglobal/jsonld-signatures-bbs": "^1.2.0", - "@trustvc/w3c-credential-status": "^2.2.0", - "@trustvc/w3c-issuer": "^2.2.0", + "@trustvc/w3c-credential-status": "^2.4.0", + "@trustvc/w3c-issuer": "^2.3.0", "base64url-universal": "^2.0.0", "cbor": "^9.0.2", "did-resolver": "^4.1.0", @@ -5906,6 +6098,55 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true }, + "node_modules/@uniswap/lib": { + "version": "4.0.1-alpha", + "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", + "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", + "license": "GPL-3.0-or-later", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v2-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", + "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", + "license": "GPL-3.0-or-later", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz", + "integrity": "sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ==", + "license": "BUSL-1.1", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-periphery": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.4.tgz", + "integrity": "sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw==", + "license": "GPL-2.0-or-later", + "dependencies": { + "@openzeppelin/contracts": "3.4.2-solc-0.7", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "^1.0.1", + "@uniswap/v3-core": "^1.0.0", + "base64-sol": "1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { + "version": "3.4.2-solc-0.7", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==", + "license": "MIT" + }, "node_modules/@vitest/expect": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", @@ -6021,6 +6262,27 @@ "license": "ISC", "optional": true }, + "node_modules/abitype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -6391,6 +6653,12 @@ "node": ">=14" } }, + "node_modules/base64-sol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", + "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==", + "license": "MIT" + }, "node_modules/base64url": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", @@ -6620,9 +6888,9 @@ } }, "node_modules/cborg": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.1.tgz", - "integrity": "sha512-BDbSRIp6XrQXkTc7g+DN0RB9RrDPTUfals2ecWUlt3juPLjbAvy/V72mJcXY0Ehu0Dq/3WpNCOCT68HUTbW+lw==", + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.11.tgz", + "integrity": "sha512-oc6Pzg/gkTobxHZNgMmny+G99dOeBMbAmnGHcZWMKtolxZBIVwfi0Pj0khxEtNU8HMFdbT5sK0HmtgecDUPP0A==", "license": "Apache-2.0", "bin": { "cborg": "lib/bin.js" @@ -8319,6 +8587,12 @@ "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -10441,6 +10715,21 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isows": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz", + "integrity": "sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -13835,6 +14124,69 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ox": { + "version": "0.14.33", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.33.tgz", + "integrity": "sha512-rooA/4o7bBof4Ge2VH/eovfNPb/AEEYyrNj03wggc55g5HZD8Pjs/OeWhttgjic3dDcqn0r29bDuvQEdTiUemQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.2.3", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ox/node_modules/@adraffy/ens-normalize": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" + }, + "node_modules/ox/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ox/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/p-each-series": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", @@ -14076,6 +14428,21 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "license": "MIT" }, + "node_modules/permissionless": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/permissionless/-/permissionless-0.3.7.tgz", + "integrity": "sha512-r1UGWkVMqFzzJ0UcKEVHh6XvOm7+SfTvy7AoGA7ZlxpE96XR+zbtb+rRAA3DOQuq6/ifov5NvUyt1xf4zxbR0g==", + "license": "MIT", + "peerDependencies": { + "ox": "^0.11.3", + "viem": "^2.44.4" + }, + "peerDependenciesMeta": { + "ox": { + "optional": true + } + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -17012,6 +17379,84 @@ "extsprintf": "^1.2.0" } }, + "node_modules/viem": { + "version": "2.55.10", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.55.10.tgz", + "integrity": "sha512-Q9Ba+/ma81U2M5o5P2AQ7Ux8rTIwmCZvUcr8rKdQ22bV0IBFHllM2m5gWDP8hFaUN2nH2oW3QG44amRazflYNQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@noble/curves": "1.9.1", + "@noble/hashes": "1.8.0", + "@scure/bip32": "1.7.0", + "@scure/bip39": "1.6.0", + "abitype": "1.2.3", + "isows": "1.0.7", + "ox": "0.14.33", + "ws": "8.21.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/vite": { "version": "5.4.21", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", diff --git a/package.json b/package.json index 34257d5..93c3156 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ }, "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "^2.14.1", + "@trustvc/trustvc": "2.15.0-beta.3", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "dotenv": "^16.0.0", From c431c3ad48970792b9aed81a0a7444280f70d286 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Fri, 31 Jul 2026 15:45:38 +0530 Subject: [PATCH 08/40] docs: update README for obligation registry usage and enhance error handling - Clarified the process for minting BoE token IDs, emphasizing the need to sign with `w3c-sign` before minting. - Improved instructions for using the Obligation Registry address in documents. - Enhanced error messages in CLI to provide clearer guidance on contract call exceptions. - Updated deployment logs to include instructions for using the Obligation Registry address. --- README.md | 37 +-- .../obligation-credential-subject.sample.json | 55 +++++ src/commands/obligation-registry/deploy.ts | 4 + src/utils/cli-errors.ts | 223 +++++++++++++++++- src/utils/cli-options.ts | 14 +- src/utils/formatting.ts | 23 +- .../obligation-registry/deploy.test.ts | 10 + tests/utils/contract-errors.test.ts | 56 +++++ 8 files changed, 401 insertions(+), 21 deletions(-) create mode 100644 samples/obligation-credential-subject.sample.json create mode 100644 tests/utils/contract-errors.test.ts diff --git a/README.md b/README.md index 5a5222f..65370f5 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,8 @@ trustvc title-escrow reject-transfer-owner-holder # Deploy Obligation Registry (TrustVCToken + factory) trustvc obligation-registry deploy -# Mint a BoE tokenId to obligationRegistry +# Mint a BoE tokenId to obligationRegistry (sign first with w3c-sign) +trustvc w3c-sign trustvc obligation-registry mint # Lifecycle @@ -1412,7 +1413,7 @@ trustvc obligation-registry deploy - Dry-run confirmation before broadcasting **Output:** -Deployed obligation registry (and factory) addresses plus transaction receipt. +Deployed `ObligationEscrowFactory` and Obligation Registry addresses plus transaction receipt. Copy the Obligation Registry address into `credentialStatus.obligationRegistry` in your BoE document before signing and minting. @@ -1422,15 +1423,18 @@ Mints a BoE tokenId to an Obligation Registry and creates the linked ObligationE **Do not use** classic `mint` / `token-registry mint` for BoE documents. +**Before minting:** set `credentialStatus.obligationRegistry` to your deployed registry address, then sign the document with [`w3c-sign`](#w3c-sign). Mint only accepts a signed Verifiable Credential. + **Usage:** ```sh +trustvc w3c-sign trustvc obligation-registry mint ``` **Interactive Prompts:** -- Path to signed BoE / obligation document +- Path to signed BoE / obligation document (output of `w3c-sign`) - *Network, obligationRegistry address, token ID, and document ID are extracted from the document* - Holder and beneficiary (drawer/drawee) addresses as required - Wallet/private key option @@ -1716,7 +1720,7 @@ You do **not** need to call the TypeScript SDK directly — the CLI wraps it wit 1. **Install the CLI** — `npm install -g @trustvc/trustvc-cli` or `npx @trustvc/trustvc-cli ` 2. **Node.js 22+** 3. **A wallet** — encrypted wallet file (recommended), private key, or key file -4. **A signed BoE document** — W3C VC with `credentialStatus.obligationRegistry` (not `tokenRegistry`) +4. **A signed BoE document** — set `credentialStatus.obligationRegistry`, then sign with `trustvc w3c-sign` (not `tokenRegistry`) 5. **Network access** — select network in prompts, or set a custom RPC (e.g. `export SEPOLIA_RPC=…`) @@ -1738,29 +1742,32 @@ Using classic commands on a BoE document will fail or skip obligation checks. Us ``` 1. Deploy Obligation Registry -2. Put the registry address into your BoE credential status, then sign the credential -3. Mint (issuer wallet) -4. Accept or reject (holder) ──► optional transfers / discharge / return -5. Verify with `trustvc verify` +2. Put the registry address into your BoE credential status +3. Sign the credential with `trustvc w3c-sign` +4. Mint (issuer wallet) +5. Accept or reject (holder) ──► optional transfers / discharge / return +6. Verify with `trustvc verify` ``` -Signing/building the VC is usually done with TrustVC library tools or your app (`DocumentBuilder` + `obligationRegistry`). The CLI focuses on **on-chain** steps and **verify**. +Signing/building the VC can also be done with TrustVC library tools or your app (`DocumentBuilder` + `obligationRegistry`). With the CLI, use `w3c-sign` before minting. ### Step-by-step **1. Deploy** — `trustvc obligation-registry deploy` (network, name/symbol, optional factory reuse, wallet, dry-run). -**2. Mint** — `trustvc obligation-registry mint` with a signed BoE JSON that already references your registry (registry, network, token ID, document ID are extracted). +**2. Sign** — put the deployed registry into `credentialStatus.obligationRegistry`, then run `trustvc w3c-sign` on the unsigned BoE JSON. + +**3. Mint** — `trustvc obligation-registry mint` with the signed BoE JSON from `w3c-sign` (registry, network, token ID, document ID are extracted). -**3. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. Reject only sets status to Rejected; closing requires return-to-issuer afterward. +**4. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. Reject only sets status to Rejected; closing requires return-to-issuer afterward. -**4. Status** — `trustvc obligation-escrow status` reads `Issued` / `Accepted` / `Rejected` / `Discharged`, registration, and termination reason. +**5. Status** — `trustvc obligation-escrow status` reads `Issued` / `Accepted` / `Rejected` / `Discharged`, registration, and termination reason. -**5. Transfers (optional)** — `obligation-escrow transfer-holder`, nominate/endorse/return variants mirror `title-escrow`. +**6. Transfers (optional)** — `obligation-escrow transfer-holder`, nominate/endorse/return variants mirror `title-escrow`. -**6. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted (sets Discharged; does not burn). +**7. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted (sets Discharged; does not burn). -**7. Return to issuer** — requires status **Rejected** or **Discharged** and **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). +**8. Return to issuer** — requires status **Rejected** or **Discharged** and **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). **8. Verify** — `trustvc verify` (auto-detects BoE vs ETR). diff --git a/samples/obligation-credential-subject.sample.json b/samples/obligation-credential-subject.sample.json new file mode 100644 index 0000000..933ee8e --- /dev/null +++ b/samples/obligation-credential-subject.sample.json @@ -0,0 +1,55 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://w3id.org/security/data-integrity/v2", + "https://trustvc.io/context/render-method-context-v2.json", + "https://trustvc.io/context/bill-of-exchange.json", + "https://trustvc.io/context/obligation-records-context.json", + "https://trustvc.io/context/qrcode-context.json" + ], + "renderMethod": [ + { + "type": "EMBEDDED_RENDERER", + "templateName": "BILL_OF_EXCHANGE", + "id": "http://localhost:9000" + } + ], + "credentialSubject": { + "electronicDocumentIdentifier": "urn:uuid:e6f4b2a1-9c3d-4e8f-a7b0-1d2e3f4a5b6c", + "referenceNumber": "BOE-2026-00147", + "amountInFigures": "128500.00", + "amountInWords": "One hundred twenty-eight thousand five hundred United States Dollars only", + "currencyCode": "USD", + "blDate": "2026-06-28", + "placeOfIssue": "Singapore", + "dateOfIssue": "2026-07-06", + "tenor": "At 90 days sight", + "payee": "Meridian Commodities Pte Ltd", + "drawnUnder": "Documentary Credit No. LC-DBS-2026-88341 / Invoice No. INV-2026-0456 / B/L No. BL-SIN-2026-0781", + "drawnUnderDate": "2026-06-15", + "issuedBy": "DBS Bank Ltd", + "drawee": { + "name": "Fairview Industries Inc.", + "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA", + "authorisedSignatoryName": "James R. Carter", + "signature": "data:image/png;base64,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" + }, + "drawer": { + "name": "Meridian Commodities Pte Ltd", + "address": "8 Marina Boulevard, #24-01, Singapore 018981", + "authorisedSignatoryName": "Wei Ling Tan", + "signature": "data:image/png;base64,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" + } + }, + "type": ["VerifiableCredential"], + "credentialStatus": { + "type": "TransferableRecords", + "tokenNetwork": { + "chain": "Sepolia", + "chainId": 11155111 + }, + "obligationRegistry": "0xE8c7516BD4FC64DF039BAA586035dfaA57520BE4" + }, + "issuer": "did:web:didhost.vercel.app", + "validFrom": "2026-07-06T09:00:00Z" +} diff --git a/src/commands/obligation-registry/deploy.ts b/src/commands/obligation-registry/deploy.ts index ee14fbe..3c6cc55 100644 --- a/src/commands/obligation-registry/deploy.ts +++ b/src/commands/obligation-registry/deploy.ts @@ -135,6 +135,10 @@ export const deployObligationRegistryContract = async ({ const { hash } = result.receipt as unknown as TransactionReceipt; success(`Obligation registry ${registryName} deployed at ${result.obligationRegistry}`); info(`ObligationEscrowFactory: ${result.obligationEscrowFactoryAddress}`); + info(`Obligation Registry: ${result.obligationRegistry}`); + info( + `Use this Obligation Registry address as credentialStatus.obligationRegistry in your document before signing and minting.`, + ); info(`Find more details at ${getEtherscanAddress({ network })}/tx/${hash}`); info(`Chain ID used: ${chainId}`); diff --git a/src/utils/cli-errors.ts b/src/utils/cli-errors.ts index 9a8a400..358190e 100644 --- a/src/utils/cli-errors.ts +++ b/src/utils/cli-errors.ts @@ -1,4 +1,7 @@ -// CLI error helpers: turn caught errors into clear messages for the user. +/** + * Shared helpers for decoding ethers CALL_EXCEPTION / custom errors into + * clear CLI messages (gas estimation often leaves revert.name unset). + */ export type ErrnoException = NodeJS.ErrnoException; @@ -11,6 +14,224 @@ export type CliErrorOptions = { const DEFAULT_PATH_PLACEHOLDER = 'the specified path'; +/** Known on-chain custom errors → actionable CLI guidance. */ +const KNOWN_REVERT_MESSAGES: Record = { + OwnerHolderMustDiffer: + 'Beneficiary (owner) and holder must be different wallets before accept/reject can run. Remint with different beneficiary and holder addresses.', + CallerNotBeneficiary: 'Connected wallet is not the beneficiary for this obligation.', + CallerNotHolder: 'Connected wallet is not the holder for this obligation.', + NotRegistered: "This token ID hasn't been minted on this registry yet.", + RemarkLengthExceeded: 'The remark is too long. Shorten it and try again.', + RegistryContractPaused: 'This registry is paused — unpause it before continuing.', + InactiveTitleEscrow: 'This obligation escrow is inactive.', + TitleEscrowNotHoldingToken: 'This escrow is not holding the token.', + DualRoleRejectionRequired: + 'Both beneficiary and holder roles are required to reject this transfer.', + TokenNotReturnedToIssuer: 'Token must be returned to issuer before this action.', + RecipientAlreadyHolder: 'Recipient is already the holder.', + InvalidNominee: 'The nominee address is invalid.', + InvalidTransferToZeroAddress: 'Cannot transfer to the zero address.', + NomineeAlreadyNominated: 'This nominee is already nominated.', + TargetNomineeAlreadyBeneficiary: 'The nominee is already the beneficiary.', + AlreadyRegistered: 'This token ID is already minted on this registry.', + TokenExists: 'This token ID already exists on this registry.', + AccessControlUnauthorizedAccount: 'Connected wallet is not authorized for this action.', + CallerNotMinter: 'Connected wallet does not hold MINTER_ROLE on this registry.', + InvalidStatusTransition: 'This action is not allowed from the current obligation status.', + EmptyReceivingData: 'Receiving data was empty.', + InvalidTokenId: 'The token ID is invalid.', + InvalidRegistry: 'The registry address is invalid.', +}; + +/** + * keccak256 selectors for no-arg / known signatures. Gas estimation often returns + * only `data: 0x` with shortMessage "execution reverted (unknown custom error)". + */ +const REVERT_SELECTOR_TO_NAME: Record = { + '0x7e288225': 'OwnerHolderMustDiffer', + '0xf52018ac': 'CallerNotBeneficiary', + '0x667b3fbf': 'CallerNotHolder', + '0xaba47339': 'NotRegistered', + '0x14086584': 'RemarkLengthExceeded', + '0xad49811c': 'RegistryContractPaused', + '0x7c339b19': 'InactiveTitleEscrow', + '0x2fd39523': 'TitleEscrowNotHoldingToken', + '0x8c90bf45': 'DualRoleRejectionRequired', + '0xd5475a0b': 'TokenNotReturnedToIssuer', + '0x702e6e62': 'RecipientAlreadyHolder', + '0x1c98cac3': 'InvalidNominee', + '0x2c75c45a': 'InvalidTransferToZeroAddress', + '0x98f83ce8': 'NomineeAlreadyNominated', + '0xdd9f921d': 'TargetNomineeAlreadyBeneficiary', + '0x3a81d6fc': 'AlreadyRegistered', + '0x55c7e8ba': 'TokenExists', + '0x10daa94f': 'EmptyReceivingData', + '0xe3962ba3': 'InvalidStatusTransition', + '0xed15e6cf': 'InvalidTokenId', + '0x540b9601': 'InvalidRegistry', + '0xbd805e91': 'InvalidTokenTransferToZeroAddressOwners', + '0xe2517d3f': 'AccessControlUnauthorizedAccount', + '0x5eee367a': 'CallerNotMinter', +}; + +const UNKNOWN_CUSTOM_ERROR = /unknown custom error/i; + +type EthersCallException = { + reason?: unknown; + shortMessage?: unknown; + message?: unknown; + revert?: { name?: unknown }; + errorName?: unknown; + code?: unknown; + data?: unknown; + info?: { error?: { data?: unknown; message?: unknown } }; + error?: { data?: unknown; message?: unknown }; +}; + +const asEthersError = (value: unknown): EthersCallException | null => + typeof value === 'object' && value !== null ? (value as EthersCallException) : null; + +const normalizeLabel = (raw: string): string | undefined => { + const cleaned = raw.trim().replace(/\(\)$/, ''); + if (!cleaned || UNKNOWN_CUSTOM_ERROR.test(cleaned) || cleaned === '(unknown custom error)') { + return undefined; + } + // Drop leading junk like ": OwnerHolderMustDiffer" or parentheses wrappers + const ident = cleaned.match(/([A-Za-z][A-Za-z0-9_]*)/); + return ident?.[1]; +}; + +const collectPossibleData = (err: EthersCallException): string[] => { + const values: unknown[] = [err.data, err.info?.error?.data, err.error?.data]; + const out: string[] = []; + for (const v of values) { + if (typeof v === 'string' && /^0x[0-9a-fA-F]+$/i.test(v)) { + out.push(v.toLowerCase()); + } else if (typeof v === 'object' && v !== null && 'data' in v) { + const nested = (v as { data?: unknown }).data; + if (typeof nested === 'string' && /^0x[0-9a-fA-F]+$/i.test(nested)) { + out.push(nested.toLowerCase()); + } + } + } + return out; +}; + +const labelFromRevertData = (err: EthersCallException): string | undefined => { + for (const data of collectPossibleData(err)) { + if (data === '0x') continue; + const selector = data.slice(0, 10); + if (REVERT_SELECTOR_TO_NAME[selector]) { + return REVERT_SELECTOR_TO_NAME[selector]; + } + } + return undefined; +}; + +export function extractContractRevertLabel(error: unknown): string | undefined { + const err = asEthersError(error); + if (!err) { + if (error instanceof Error) { + const fromMessage = error.message.match( + /(?:execution reverted:\s*|Contract reverted with\s*|failed:\s*)([A-Za-z0-9_]+)/, + ); + return fromMessage?.[1] ? normalizeLabel(fromMessage[1]) : undefined; + } + return undefined; + } + + const revertName = err.revert?.name ?? err.errorName; + if (typeof revertName === 'string') { + const label = normalizeLabel(revertName); + if (label) return label; + } + + if (typeof err.reason === 'string') { + const label = normalizeLabel(err.reason); + if (label) return label; + } + + // Prefer selector decoding before shortMessage — gas estimate often only has + // "execution reverted (unknown custom error)" + data: 0x7e288225 + const fromData = labelFromRevertData(err); + if (fromData) return fromData; + + if (typeof err.shortMessage === 'string' && err.shortMessage.trim()) { + if (!UNKNOWN_CUSTOM_ERROR.test(err.shortMessage)) { + const match = err.shortMessage.match(/execution reverted(?::\s*)?(.+)?/i); + if (match?.[1]) { + const label = normalizeLabel(match[1]); + if (label) return label; + } + } + } + + if (typeof err.message === 'string') { + const custom = err.message.match(/execution reverted:\s*([A-Za-z0-9_]+)/); + if (custom?.[1]) { + const label = normalizeLabel(custom[1]); + if (label) return label; + } + const wrapped = err.message.match(/(?:Contract reverted with\s*|failed:\s*)([A-Za-z0-9_]+)/); + if (wrapped?.[1]) { + const label = normalizeLabel(wrapped[1]); + if (label) return label; + } + } + + return undefined; +} + +/** True when the failure is a definitive on-chain revert (not a transient gas/RPC issue). */ +export function isContractCallException(error: unknown): boolean { + const err = asEthersError(error); + if (!err) { + if (error instanceof Error && /Pre-check .* failed:/i.test(error.message)) { + return Boolean(extractContractRevertLabel(error)); + } + return false; + } + if (err.code === 'CALL_EXCEPTION') return true; + if (err.revert?.name || err.errorName) return true; + if (labelFromRevertData(err)) return true; + return Boolean(extractContractRevertLabel(error)); +} + +/** Maps ethers / contract errors to a short user-facing message. */ +export function describeContractError(error: unknown): string { + const label = extractContractRevertLabel(error); + if (label && KNOWN_REVERT_MESSAGES[label]) { + return `${label}: ${KNOWN_REVERT_MESSAGES[label]}`; + } + if (label) { + return `Contract reverted with ${label}`; + } + + const err = asEthersError(error); + if (err) { + // Never surface the useless ethers placeholder as the final message + if ( + typeof err.shortMessage === 'string' && + err.shortMessage.trim() && + !UNKNOWN_CUSTOM_ERROR.test(err.shortMessage) + ) { + return err.shortMessage; + } + if (typeof err.reason === 'string' && err.reason.trim()) { + return err.reason; + } + if (typeof err.message === 'string' && err.message.trim()) { + return err.message.split('\n')[0]!; + } + } + + if (error instanceof Error && error.message) { + return error.message.split('\n')[0]!; + } + + return String(error); +} + export function isErrnoException(err: unknown): err is ErrnoException { return ( typeof err === 'object' && diff --git a/src/utils/cli-options.ts b/src/utils/cli-options.ts index 456bfba..652cd1e 100644 --- a/src/utils/cli-options.ts +++ b/src/utils/cli-options.ts @@ -12,7 +12,8 @@ import { readDocumentFile } from './file-io'; import { getTokenRegistryAddress, getTokenId, getChainId } from '@trustvc/trustvc'; import fs from 'fs'; import { getTokenRegistryVersion } from '../commands/helpers'; -import { getErrorMessage } from './index'; +import { getErrorMessage } from './formatting'; +import { isContractCallException } from './cli-errors'; import { dryRunMode } from './dryRun'; export interface NetworkOption { @@ -572,7 +573,16 @@ export const performDryRunWithConfirmation = async ({ info('\n✅ Proceeding with transaction...'); return true; } catch (estimateError) { - error(`Gas estimation failed: ${getErrorMessage(estimateError)}`); + const message = getErrorMessage(estimateError); + // Definitive on-chain reverts will never succeed if broadcast — abort instead of + // offering "proceed anyway" (which only dumps a larger callStatic stack next). + if (isContractCallException(estimateError)) { + error(`Transaction would revert: ${message}`); + info('Transaction cancelled.'); + return false; + } + + error(`Gas estimation failed: ${message}`); const proceedAnyway = await confirm({ message: 'Gas estimation failed. Do you want to proceed anyway?', default: false, diff --git a/src/utils/formatting.ts b/src/utils/formatting.ts index dd7faf9..cbdd83b 100644 --- a/src/utils/formatting.ts +++ b/src/utils/formatting.ts @@ -1,4 +1,5 @@ import chalk from 'chalk'; +import { describeContractError, isContractCallException } from './cli-errors'; export const addAddressPrefix = (address: string): string => address.startsWith('0x') ? address : `0x${address}`; @@ -33,11 +34,27 @@ const toErrorWithMessage = function (maybeError: unknown): ErrorWithMessage { export const extractErrorMessage = (error: unknown): string => toErrorWithMessage(error).message; export const getErrorMessage = function (error: unknown): string { + // Prefer structured ethers / custom-error decoding over raw `reason` (often null). + if (isContractCallException(error)) { + return describeContractError(error); + } + if (error instanceof Error) { - return 'reason' in error ? (error['reason'] as string) : error.message; - } else { - return extractErrorMessage(error); + const reason = + 'reason' in error && typeof (error as { reason?: unknown }).reason === 'string' + ? (error as { reason: string }).reason.trim() + : ''; + if (reason) return reason; + + // SDK may already wrap: "Pre-check for accept failed: OwnerHolderMustDiffer: ..." + if (/Pre-check .* failed:/i.test(error.message)) { + return describeContractError(error); + } + + return error.message.split('\n')[0]!; } + + return describeContractError(error) || extractErrorMessage(error); }; // Captures console.warn for a function to handle expected console.warn. diff --git a/tests/commands/obligation-registry/deploy.test.ts b/tests/commands/obligation-registry/deploy.test.ts index 557c5bc..11d1913 100644 --- a/tests/commands/obligation-registry/deploy.test.ts +++ b/tests/commands/obligation-registry/deploy.test.ts @@ -111,6 +111,16 @@ describe('obligation-registry/deploy', () => { expect(deployMock).toHaveBeenCalled(); expect(address).toBe('0xRegistry'); + + const { success, info } = await import('signale'); + expect(success).toHaveBeenCalledWith( + 'Obligation registry My BoE Registry deployed at 0xRegistry', + ); + expect(info).toHaveBeenCalledWith('ObligationEscrowFactory: 0xFactory'); + expect(info).toHaveBeenCalledWith('Obligation Registry: 0xRegistry'); + expect(info).toHaveBeenCalledWith( + 'Use this Obligation Registry address as credentialStatus.obligationRegistry in your document before signing and minting.', + ); }); }); diff --git a/tests/utils/contract-errors.test.ts b/tests/utils/contract-errors.test.ts new file mode 100644 index 0000000..45c6482 --- /dev/null +++ b/tests/utils/contract-errors.test.ts @@ -0,0 +1,56 @@ +import { describe, expect, it } from 'vitest'; +import { + describeContractError, + extractContractRevertLabel, + getErrorMessage, + isContractCallException, +} from '../../src/utils'; + +describe('contract revert error formatting', () => { + const ownerHolderError = Object.assign(new Error('execution reverted: OwnerHolderMustDiffer()'), { + code: 'CALL_EXCEPTION', + reason: null, + revert: { name: 'OwnerHolderMustDiffer', signature: 'OwnerHolderMustDiffer()', args: [] }, + shortMessage: 'execution reverted (unknown custom error)', + }); + + it('extracts OwnerHolderMustDiffer from ethers call exceptions', () => { + expect(extractContractRevertLabel(ownerHolderError)).toBe('OwnerHolderMustDiffer'); + expect(isContractCallException(ownerHolderError)).toBe(true); + }); + + it('maps OwnerHolderMustDiffer to an actionable message', () => { + expect(describeContractError(ownerHolderError)).toMatch( + /OwnerHolderMustDiffer: Beneficiary \(owner\) and holder must be different/, + ); + expect(getErrorMessage(ownerHolderError)).toMatch(/OwnerHolderMustDiffer:/); + }); + + it('does not return null when reason is null', () => { + expect(getErrorMessage(ownerHolderError)).not.toBe('null'); + expect(getErrorMessage(ownerHolderError)).toBeTruthy(); + }); + + it('decodes OwnerHolderMustDiffer from revert data when name is missing', () => { + // Typical gas-estimation shape: undecoded shortMessage + selector only + const gasEstimateError = Object.assign(new Error('execution reverted'), { + code: 'CALL_EXCEPTION', + reason: null, + data: '0x7e288225', + shortMessage: 'execution reverted (unknown custom error)', + }); + + expect(extractContractRevertLabel(gasEstimateError)).toBe('OwnerHolderMustDiffer'); + expect(getErrorMessage(gasEstimateError)).toMatch( + /OwnerHolderMustDiffer: Beneficiary \(owner\) and holder must be different/, + ); + expect(getErrorMessage(gasEstimateError)).not.toMatch(/unknown custom error/i); + }); + + it('rewrites SDK pre-check wrappers', () => { + const wrapped = new Error( + 'Pre-check for accept failed: OwnerHolderMustDiffer: Beneficiary (owner) and holder must be different wallets before accept/reject can run. Remint with different beneficiary and holder addresses.', + ); + expect(getErrorMessage(wrapped)).toMatch(/OwnerHolderMustDiffer:/); + }); +}); From fef37017b031762c4a6860404d70229706de9b7b Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Fri, 31 Jul 2026 15:51:36 +0530 Subject: [PATCH 09/40] chore(release): update release configuration and CI workflows - Renamed the 'beta-boe' branch to 'beta' in .releaserc.json for clarity. - Updated CI workflow to include checks for pushes and pull requests to 'main' and 'beta' branches, as well as feature branches. - Enhanced release workflow permissions and added npm registry URL for publishing. - Adjusted npm publish settings in the release configuration to ensure proper deployment. --- .github/workflows/ci.yml | 6 +++++- .github/workflows/release.yml | 12 +++++++++++- .releaserc.json | 9 +++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad76a6c..e9c6c0e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,14 +1,18 @@ name: CI +# Same checks for PRs targeting main or beta (and for pushes to those branches). on: push: pull_request: + branches: + - main + - beta jobs: test: name: Test runs-on: ubuntu-latest - + strategy: matrix: node-version: [22.x, 24.x] diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 84209c1..918d69e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,10 +1,13 @@ name: Release +# Publishes to npm on push to: +# - main → stable (@latest) +# - beta → prerelease (@beta), e.g. 1.2.0-beta.1 on: push: branches: - main - - beta-boe + - beta jobs: test: @@ -40,6 +43,11 @@ jobs: name: Release needs: test runs-on: ubuntu-latest + permissions: + contents: write + issues: write + pull-requests: write + id-token: write steps: - name: Checkout code @@ -53,6 +61,7 @@ jobs: with: node-version: 22.x cache: 'npm' + registry-url: 'https://registry.npmjs.org/' - name: Install dependencies run: npm ci @@ -65,3 +74,4 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.releaserc.json b/.releaserc.json index 1d46820..88adc85 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -2,7 +2,7 @@ "branches": [ "main", { - "name": "beta-boe", + "name": "beta", "prerelease": "beta", "channel": "beta" } @@ -16,7 +16,12 @@ "changelogFile": "CHANGELOG.md" } ], - "@semantic-release/npm", + [ + "@semantic-release/npm", + { + "npmPublish": true + } + ], [ "@semantic-release/git", { From 5488f9c9f1f7f8d32133689e2e591628ddfe3fe5 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Fri, 31 Jul 2026 19:50:11 +0530 Subject: [PATCH 10/40] docs: refine README formatting and clarify command usage - Improved formatting for better readability, including consistent use of markdown syntax. - Clarified instructions for using the Obligation Registry and related commands. - Removed unnecessary whitespace to enhance overall document cleanliness. --- README.md | 60 ++++++------------------------------------------------- 1 file changed, 6 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 65370f5..c70dbc4 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,10 @@ A comprehensive command-line interface for managing W3C Verifiable Credentials, This CLI leverages the TrustVC package: -- [`@trustvc/trustvc`](https://github.com/TrustVC/trustvc) — Core library for W3C credentials, OpenAttestation, token registries, Obligation Registry (BoE), and blockchain operations +- `[@trustvc/trustvc](https://github.com/TrustVC/trustvc)` — Core library for W3C credentials, OpenAttestation, token registries, Obligation Registry (BoE), and blockchain operations BoE on-chain helpers are imported from the **root** package (`mintObligationRegistry`, `acceptObligationRegistry`, …). Prefer those over any older `@trustvc/trustvc/obligation-registry` path. - - ## Table of Contents - [Features](#features) @@ -280,7 +278,7 @@ trustvc verify - **Document Store**: Deploy document store contracts and use `documentStoreIssue` and `documentStoreRevoke` to issue and revoke document hashes in deployed contracts. - **Transaction Cancel**: Cancel a pending transaction by replacing it with a 0-value transaction to yourself (same nonce, higher gas price). Supports specifying by transaction hash or by nonce and gas price. - **Title Escrow**: Provides comprehensive transferable records management including holder transfers, beneficiary nominations, endorsements, returns, and rejections using smart contracts. -- **Obligation Registry (BoE)**: Separate command trees for electronic Bill of Exchange on-chain flows — `obligation-registry` (deploy/mint) and `obligation-escrow` (accept/reject/discharge, transfers, return). Use **`trustvc verify`** for both ETR and BoE documents (ObligationRecords vs TransferableRecords is auto-detected). Do not use classic `token-registry` / `title-escrow` for obligation documents. See [Obligation Registry user guide](#obligation-registry-user-guide). +- **Obligation Registry (BoE)**: Separate command trees for electronic Bill of Exchange on-chain flows — `obligation-registry` (deploy/mint) and `obligation-escrow` (accept/reject/discharge, transfers, return). Use `trustvc verify` for both ETR and BoE documents (ObligationRecords vs TransferableRecords is auto-detected). Do not use classic `token-registry` / `title-escrow` for obligation documents. See [Obligation Registry user guide](#obligation-registry-user-guide). @@ -377,6 +375,8 @@ All title-escrow, obligation-registry, obligation-escrow, token registry, docume ### Detailed Command Reference + + #### transaction cancel Cancels a pending transaction by replacing it with a 0-value transaction to yourself using the same nonce and a higher gas price (replace-by-fee). This action is irreversible. @@ -424,8 +424,6 @@ trustvc transaction cancel \ **Note:** If the pending transaction uses EIP-1559 (maxFeePerGas / maxPriorityFeePerGas), it has no legacy `gasPrice`. In that case, specify the transaction by **nonce and gas price** and set a gas price (in wei) for the replacement. - - #### key-pair-generation Generates cryptographic key pairs for modern cryptosuites (ECDSA-SD-2023, BBS-2023). @@ -496,8 +494,6 @@ trustvc w3c-sign **Output:** Creates `signed_vc.json` with cryptographic proof. - - #### verify Verifies a W3C or OA document using the unified TrustVC verification pipeline. @@ -547,8 +543,6 @@ trustvc credential-status-create **Output:** Signed credential status list file. - - #### credential-status-update Updates an existing W3C credential status list to revoke or suspend credentials. @@ -569,8 +563,6 @@ trustvc credential-status-update **Output:** Updated credential status list file. - - #### oa-sign Signs OpenAttestation v2 or v3 documents with a private key. @@ -699,8 +691,6 @@ trustvc oa-decrypt Writes the decrypted Open Attestation document (raw OA v2/v3 or wrapped OA v2/v3) to the specified path. Fails if the key is wrong or the file is not a valid encrypted OA document. - - #### mint Mints a document hash (tokenId) to a token registry smart contract. @@ -828,8 +818,6 @@ trustvc document-store issue **Output:** Transaction receipt confirming the hash issuance. - - #### document-store revoke Revokes a document hash from a deployed document store. @@ -848,8 +836,6 @@ trustvc document-store revoke **Output:** Transaction receipt confirming the hash revocation. - - #### document-store grant-role Grants a role (ISSUER_ROLE, REVOKER_ROLE, or DEFAULT_ADMIN_ROLE) to an account in a deployed document store. @@ -1125,8 +1111,6 @@ trustvc title-escrow transfer-holder **Output:** Transaction receipt confirming holder transfer. - - #### title-escrow nominate-transfer-owner Nominates a new beneficiary (owner) for the transferable record. @@ -1155,8 +1139,6 @@ trustvc title-escrow nominate-transfer-owner **Output:** Transaction receipt confirming beneficiary nomination. - - #### title-escrow endorse-transfer-owner Endorses the change of beneficiary (owner) for the transferable record. @@ -1185,8 +1167,6 @@ trustvc title-escrow endorse-transfer-owner **Output:** Transaction receipt confirming beneficiary endorsement. - - #### title-escrow transfer-owner-holder Endorses the transfer of both beneficiary and holder to new addresses. @@ -1216,8 +1196,6 @@ trustvc title-escrow transfer-owner-holder **Output:** Transaction receipt confirming full ownership transfer. - - #### title-escrow return-to-issuer Returns the transferable record to the issuer. @@ -1245,8 +1223,6 @@ trustvc title-escrow return-to-issuer **Output:** Transaction receipt confirming document return. - - #### title-escrow accept-return-to-issuer Accepts a returned transferable record (issuer action). @@ -1274,8 +1250,6 @@ trustvc title-escrow accept-return-to-issuer **Output:** Transaction receipt confirming acceptance. - - #### title-escrow reject-return-to-issuer Rejects a returned transferable record (issuer action). @@ -1303,8 +1277,6 @@ trustvc title-escrow reject-return-to-issuer **Output:** Transaction receipt confirming rejection. - - #### title-escrow reject-transfer-holder Rejects a holder transfer request. @@ -1332,8 +1304,6 @@ trustvc title-escrow reject-transfer-holder **Output:** Transaction receipt confirming rejection. - - #### title-escrow reject-transfer-owner Rejects a beneficiary transfer request. @@ -1361,8 +1331,6 @@ trustvc title-escrow reject-transfer-owner **Output:** Transaction receipt confirming rejection. - - #### title-escrow reject-transfer-owner-holder Rejects a full ownership transfer (both beneficiary and holder). @@ -1390,8 +1358,6 @@ trustvc title-escrow reject-transfer-owner-holder **Output:** Transaction receipt confirming rejection. - - #### obligation-registry deploy Deploys an Obligation Registry (`TrustVCToken` + `ObligationEscrowFactory`) for electronic Bill of Exchange (BoE) flows. @@ -1415,15 +1381,13 @@ trustvc obligation-registry deploy **Output:** Deployed `ObligationEscrowFactory` and Obligation Registry addresses plus transaction receipt. Copy the Obligation Registry address into `credentialStatus.obligationRegistry` in your BoE document before signing and minting. - - #### obligation-registry mint Mints a BoE tokenId to an Obligation Registry and creates the linked ObligationEscrow. **Do not use** classic `mint` / `token-registry mint` for BoE documents. -**Before minting:** set `credentialStatus.obligationRegistry` to your deployed registry address, then sign the document with [`w3c-sign`](#w3c-sign). Mint only accepts a signed Verifiable Credential. +**Before minting:** set `credentialStatus.obligationRegistry` to your deployed registry address, then sign the document with `[w3c-sign](#w3c-sign)`. Mint only accepts a signed Verifiable Credential. **Usage:** @@ -1443,8 +1407,6 @@ trustvc obligation-registry mint **Output:** Transaction receipt confirming mint. - - #### obligation-escrow accept Accepts an obligation on the ObligationEscrow (drawee acceptance). @@ -1457,7 +1419,7 @@ trustvc obligation-escrow accept **Interactive Prompts:** -- Path to BoE / obligation document +- Path to BoE / obligation documentverify - *Network, obligationRegistry, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional) @@ -1465,8 +1427,6 @@ trustvc obligation-escrow accept **Output:** Transaction receipt confirming acceptance. - - #### obligation-escrow reject Rejects an obligation on the ObligationEscrow. @@ -1486,8 +1446,6 @@ trustvc obligation-escrow reject **Output:** Transaction receipt confirming rejection. - - #### obligation-escrow discharge Discharges an accepted obligation on the ObligationEscrow. @@ -1507,8 +1465,6 @@ trustvc obligation-escrow discharge **Output:** Transaction receipt confirming discharge. - - #### obligation-escrow status Reads on-chain obligation / escrow status for a BoE document (read-only; no wallet required for the status call itself beyond network connectivity). @@ -1527,8 +1483,6 @@ trustvc obligation-escrow status **Output:** Obligation and escrow status fields from the chain. - - #### obligation-escrow transfer-holder Transfers the holder of a BoE obligation record. Transfer, nominate, endorse, return, and reject variants mirror `title-escrow` but operate on ObligationEscrow via `obligation-escrow `. @@ -1553,8 +1507,6 @@ trustvc obligation-escrow transfer-holder **Output:** Transaction receipt confirming the escrow action. - - ## Configuration From dedcad6fe65d3c81d087e8452ca35ab7a94598f5 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Sat, 1 Aug 2026 00:38:07 +0530 Subject: [PATCH 11/40] chore: update dependencies and improve error handling in obligation escrow commands - Changed @trustvc/trustvc dependency to a local file reference for development. - Enhanced error handling in various obligation escrow commands to ensure proper exit codes on transaction failures. - Refactored command handlers to streamline transaction execution and error logging. - Updated README to clarify command usage and improve overall documentation quality. --- README.md | 14 ++-- src/commands/helpers.ts | 14 +++- .../accept-return-to-issuer.ts | 2 + src/commands/obligation-escrow/accept.ts | 2 + src/commands/obligation-escrow/discharge.ts | 2 + .../endorse-transfer-owner.ts | 2 + .../nominate-transfer-owner.ts | 53 ++++++--------- .../reject-return-to-issuer.ts | 2 + .../reject-transfer-holder.ts | 53 ++++++--------- .../reject-transfer-owner-holder.ts | 53 ++++++--------- .../reject-transfer-owner.ts | 2 + src/commands/obligation-escrow/reject.ts | 2 + .../obligation-escrow/return-to-issuer.ts | 2 + src/commands/obligation-escrow/runTx.ts | 4 +- src/commands/obligation-escrow/shared.ts | 20 ++++++ src/commands/obligation-escrow/status.ts | 43 +++++------- .../obligation-escrow/transfer-holder.ts | 2 + .../transfer-owner-holder.ts | 65 ++++++++----------- src/utils/cli-errors.ts | 44 ++++++++++--- src/utils/obligation-document.ts | 5 ++ tests/utils/contract-errors.test.ts | 11 ++++ 21 files changed, 217 insertions(+), 180 deletions(-) diff --git a/README.md b/README.md index c70dbc4..a312831 100644 --- a/README.md +++ b/README.md @@ -1467,7 +1467,7 @@ Transaction receipt confirming discharge. #### obligation-escrow status -Reads on-chain obligation / escrow status for a BoE document (read-only; no wallet required for the status call itself beyond network connectivity). +Reads on-chain obligation / escrow status for a BoE document. The CLI still prompts for a wallet or private key (same base inputs as other `obligation-escrow` commands) so it can attach a network provider via `getWalletOrSigner`. **Usage:** @@ -1478,7 +1478,9 @@ trustvc obligation-escrow status **Interactive Prompts:** - Path to BoE / obligation document - - *Network, obligationRegistry, and token ID are extracted from the document* +- Wallet/private key option +- Remark (optional) +- *Network, obligationRegistry, and token ID are extracted from the document* **Output:** Obligation and escrow status fields from the chain. @@ -1641,7 +1643,7 @@ User guide for electronic Bill of Exchange (BoE) / obligation flows with `trustv Classic transferable records (eBL / Token Registry + Title Escrow) use different commands. This section covers **only** Obligation Registry. -For library / SDK details, see the TrustVC README [§7c Obligation Registry (BoE)](https://github.com/TrustVC/trustvc#c-obligation-registry-boe). +For library / SDK details, see the TrustVC README [§7c Obligation Registry (BoE)](https://github.com/TrustVC/trustvc/blob/beta/README.md#c-obligation-registry-boe) (on the `beta` branch; not yet on `main`). SDK imports use the **root** package with the `*ObligationRegistry` suffix (no clash with classic ETR helpers): @@ -1692,7 +1694,7 @@ Using classic commands on a BoE document will fail or skip obligation checks. Us ### Typical workflow -``` +```text 1. Deploy Obligation Registry 2. Put the registry address into your BoE credential status 3. Sign the credential with `trustvc w3c-sign` @@ -1721,7 +1723,7 @@ Signing/building the VC can also be done with TrustVC library tools or your app **8. Return to issuer** — requires status **Rejected** or **Discharged** and **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). -**8. Verify** — `trustvc verify` (auto-detects BoE vs ETR). +**9. Verify** — `trustvc verify` (auto-detects BoE vs ETR). ### Who can run what @@ -1735,7 +1737,7 @@ Signing/building the VC can also be done with TrustVC library tools or your app | Transfer / nominate / endorse | Current holder or beneficiary per Title Escrow–style rules | | `return-to-issuer` | Dual role (beneficiary == holder) | | `accept-return-to-issuer` / `reject-return-to-issuer` | Issuer | -| `obligation-escrow status` | Anyone with network access + document | +| `obligation-escrow status` | Anyone with the document + wallet/private key (read-only) | | `verify` | Anyone with the document (+ RPC when on-chain checks run) | diff --git a/src/commands/helpers.ts b/src/commands/helpers.ts index f92927f..24375a5 100644 --- a/src/commands/helpers.ts +++ b/src/commands/helpers.ts @@ -440,7 +440,12 @@ export const connectToObligationRegistry = async ({ try { signale.info(`Connecting to obligation registry at: ${address}`); const registry = new ethers.Contract(address, TrustVCToken__factory.abi, wallet as any); - if (!registry) { + const provider = wallet.provider; + if (!provider) { + throw new Error('Wallet provider is required to validate the obligation registry contract'); + } + const code = await provider.getCode(address); + if (!code || code === '0x') { throw new Error(`Failed to connect to obligation registry at address: ${address}`); } signale.success(`Successfully connected to obligation registry`); @@ -483,7 +488,12 @@ export const connectToObligationEscrow = async ({ signale.info(`Connecting to obligation escrow at: ${escrowAddress}`); const escrow = new ethers.Contract(escrowAddress, ObligationEscrow__factory.abi, wallet as any); - if (!escrow) { + const provider = wallet.provider; + if (!provider) { + throw new Error('Wallet provider is required to validate the obligation escrow contract'); + } + const code = await provider.getCode(escrowAddress); + if (!code || code === '0x') { throw new Error(`Failed to connect to obligation escrow at address: ${escrowAddress}`); } signale.success(`Successfully connected to obligation escrow`); diff --git a/src/commands/obligation-escrow/accept-return-to-issuer.ts b/src/commands/obligation-escrow/accept-return-to-issuer.ts index a4ec7f0..eefdc55 100644 --- a/src/commands/obligation-escrow/accept-return-to-issuer.ts +++ b/src/commands/obligation-escrow/accept-return-to-issuer.ts @@ -37,6 +37,7 @@ export const acceptReturnedHandler = async (args: BaseObligationEscrowCommand) = sdk: acceptReturnedObligationRegistry as any, sdkParams: { tokenId: args.tokenId, remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -47,5 +48,6 @@ export const acceptReturnedHandler = async (args: BaseObligationEscrowCommand) = ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/accept.ts b/src/commands/obligation-escrow/accept.ts index d3b2c61..49adc7d 100644 --- a/src/commands/obligation-escrow/accept.ts +++ b/src/commands/obligation-escrow/accept.ts @@ -35,6 +35,7 @@ export const acceptHandler = async (args: BaseObligationEscrowCommand) => { sdk: acceptObligationRegistry as any, sdkParams: { remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -45,5 +46,6 @@ export const acceptHandler = async (args: BaseObligationEscrowCommand) => { ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/discharge.ts b/src/commands/obligation-escrow/discharge.ts index 8ae5907..ae32702 100644 --- a/src/commands/obligation-escrow/discharge.ts +++ b/src/commands/obligation-escrow/discharge.ts @@ -36,6 +36,7 @@ export const dischargeHandler = async (args: BaseObligationEscrowCommand) => { sdk: dischargeObligationRegistry as any, sdkParams: { remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -46,5 +47,6 @@ export const dischargeHandler = async (args: BaseObligationEscrowCommand) => { ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/endorse-transfer-owner.ts b/src/commands/obligation-escrow/endorse-transfer-owner.ts index d275c11..3166d5c 100644 --- a/src/commands/obligation-escrow/endorse-transfer-owner.ts +++ b/src/commands/obligation-escrow/endorse-transfer-owner.ts @@ -41,6 +41,7 @@ export const endorseHandler = async (args: ObligationEscrowNominateBeneficiaryCo sdk: transferBeneficiaryObligationRegistry as any, sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -51,5 +52,6 @@ export const endorseHandler = async (args: ObligationEscrowNominateBeneficiaryCo ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/nominate-transfer-owner.ts b/src/commands/obligation-escrow/nominate-transfer-owner.ts index 0d94a55..7a4397d 100644 --- a/src/commands/obligation-escrow/nominate-transfer-owner.ts +++ b/src/commands/obligation-escrow/nominate-transfer-owner.ts @@ -1,29 +1,21 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { nominateObligationRegistry } from '@trustvc/trustvc'; import { ObligationEscrowNominateBeneficiaryCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, promptAddress, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'nominate-transfer-owner'; export const describe = 'Nominate a new beneficiary (owner) for a BoE obligation'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await nominateHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, nominateHandler); export const promptForInputs = async (): Promise => { const base = await promptBaseObligationEscrowInputs(); @@ -32,24 +24,21 @@ export const promptForInputs = async (): Promise { - try { - info(`Nominating beneficiary ${args.newBeneficiary} for obligation ${args.tokenId}`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.nominate.populateTransaction(args.newBeneficiary, encryptedRemark), - sdk: nominateObligationRegistry as any, - sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, - }); - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Nominated ${args.newBeneficiary}`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - } + info(`Nominating beneficiary ${args.newBeneficiary} for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.nominate.populateTransaction(args.newBeneficiary, encryptedRemark), + sdk: nominateObligationRegistry as any, + sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Nominated ${args.newBeneficiary}`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/commands/obligation-escrow/reject-return-to-issuer.ts b/src/commands/obligation-escrow/reject-return-to-issuer.ts index 113d537..f810a53 100644 --- a/src/commands/obligation-escrow/reject-return-to-issuer.ts +++ b/src/commands/obligation-escrow/reject-return-to-issuer.ts @@ -37,6 +37,7 @@ export const rejectReturnedHandler = async (args: BaseObligationEscrowCommand) = sdk: rejectReturnedObligationRegistry as any, sdkParams: { tokenId: args.tokenId, remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -47,5 +48,6 @@ export const rejectReturnedHandler = async (args: BaseObligationEscrowCommand) = ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/reject-transfer-holder.ts b/src/commands/obligation-escrow/reject-transfer-holder.ts index d4fc2ff..4226765 100644 --- a/src/commands/obligation-escrow/reject-transfer-holder.ts +++ b/src/commands/obligation-escrow/reject-transfer-holder.ts @@ -1,50 +1,39 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { rejectTransferHolderObligationRegistry } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'reject-transfer-holder'; export const describe = 'Reject a pending holder transfer on a BoE obligation'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await rejectTransferHolderHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, rejectTransferHolderHandler); export const promptForInputs = promptBaseObligationEscrowInputs; export const rejectTransferHolderHandler = async (args: BaseObligationEscrowCommand) => { - try { - info(`Rejecting holder transfer for obligation ${args.tokenId}`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.rejectTransferHolder.populateTransaction(encryptedRemark), - sdk: rejectTransferHolderObligationRegistry as any, - sdkParams: { remarks: args.remark }, - }); - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Holder transfer rejected`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - } + info(`Rejecting holder transfer for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.rejectTransferHolder.populateTransaction(encryptedRemark), + sdk: rejectTransferHolderObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Holder transfer rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/commands/obligation-escrow/reject-transfer-owner-holder.ts b/src/commands/obligation-escrow/reject-transfer-owner-holder.ts index 85a0883..dc965c9 100644 --- a/src/commands/obligation-escrow/reject-transfer-owner-holder.ts +++ b/src/commands/obligation-escrow/reject-transfer-owner-holder.ts @@ -1,50 +1,39 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { rejectTransferOwnersObligationRegistry } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'reject-transfer-owner-holder'; export const describe = 'Reject a pending joint owner+holder transfer on a BoE obligation'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await rejectTransferOwnersHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, rejectTransferOwnersHandler); export const promptForInputs = promptBaseObligationEscrowInputs; export const rejectTransferOwnersHandler = async (args: BaseObligationEscrowCommand) => { - try { - info(`Rejecting owners transfer for obligation ${args.tokenId}`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.rejectTransferOwners.populateTransaction(encryptedRemark), - sdk: rejectTransferOwnersObligationRegistry as any, - sdkParams: { remarks: args.remark }, - }); - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Owners transfer rejected`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - } + info(`Rejecting owners transfer for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.rejectTransferOwners.populateTransaction(encryptedRemark), + sdk: rejectTransferOwnersObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Owners transfer rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/commands/obligation-escrow/reject-transfer-owner.ts b/src/commands/obligation-escrow/reject-transfer-owner.ts index c6e4b99..0ecdbf0 100644 --- a/src/commands/obligation-escrow/reject-transfer-owner.ts +++ b/src/commands/obligation-escrow/reject-transfer-owner.ts @@ -36,6 +36,7 @@ export const rejectTransferOwnerHandler = async (args: BaseObligationEscrowComma sdk: rejectTransferBeneficiaryObligationRegistry as any, sdkParams: { remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -46,5 +47,6 @@ export const rejectTransferOwnerHandler = async (args: BaseObligationEscrowComma ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/reject.ts b/src/commands/obligation-escrow/reject.ts index 6e5e5e2..40ea341 100644 --- a/src/commands/obligation-escrow/reject.ts +++ b/src/commands/obligation-escrow/reject.ts @@ -35,6 +35,7 @@ export const rejectHandler = async (args: BaseObligationEscrowCommand) => { sdk: rejectObligationRegistry as any, sdkParams: { remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -45,5 +46,6 @@ export const rejectHandler = async (args: BaseObligationEscrowCommand) => { ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/return-to-issuer.ts b/src/commands/obligation-escrow/return-to-issuer.ts index 236dbc1..2f534f6 100644 --- a/src/commands/obligation-escrow/return-to-issuer.ts +++ b/src/commands/obligation-escrow/return-to-issuer.ts @@ -36,6 +36,7 @@ export const returnToIssuerHandler = async (args: BaseObligationEscrowCommand) = sdk: returnToIssuerObligationRegistry as any, sdkParams: { remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -46,5 +47,6 @@ export const returnToIssuerHandler = async (args: BaseObligationEscrowCommand) = ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/runTx.ts b/src/commands/obligation-escrow/runTx.ts index fd5053a..d8218c1 100644 --- a/src/commands/obligation-escrow/runTx.ts +++ b/src/commands/obligation-escrow/runTx.ts @@ -35,7 +35,7 @@ export const runObligationEscrowTx = async (opts: { populate: PopulateFn; sdk: SdkCall; sdkParams: Record; -}): Promise => { +}): Promise => { const { args, populate, sdk, sdkParams } = opts; const { obligationRegistryAddress, tokenId, remark, encryptionKey, network, ...rest } = args; const wallet = await getWalletOrSigner({ network, ...rest }); @@ -60,7 +60,7 @@ export const runObligationEscrowTx = async (opts: { }); if (!shouldProceed) { - process.exit(0); + return null; } const contractOptions = { obligationRegistryAddress, tokenId }; diff --git a/src/commands/obligation-escrow/shared.ts b/src/commands/obligation-escrow/shared.ts index 15fd7f4..149100d 100644 --- a/src/commands/obligation-escrow/shared.ts +++ b/src/commands/obligation-escrow/shared.ts @@ -1,9 +1,11 @@ +import { error } from 'signale'; import { promptWalletSelection, promptAndReadDocument, promptRemark, extractObligationDocumentInfo, verifyDocumentSignature, + getErrorMessage, } from '../../utils'; import { BaseObligationEscrowCommand } from '../../types'; @@ -38,3 +40,21 @@ export const promptBaseObligationEscrowInputs = async (): Promise( + promptForInputs: () => Promise, + commandHandler: (args: TArgs) => Promise, +): Promise => { + try { + const answers = await promptForInputs(); + if (!answers) return; + await commandHandler(answers); + } catch (e) { + error(getErrorMessage(e)); + process.exitCode = 1; + } +}; diff --git a/src/commands/obligation-escrow/status.ts b/src/commands/obligation-escrow/status.ts index 2f3f7fd..ed1fff0 100644 --- a/src/commands/obligation-escrow/status.ts +++ b/src/commands/obligation-escrow/status.ts @@ -1,4 +1,4 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { ObligationDocumentStatus, ObligationEscrowTerminationReason, @@ -7,8 +7,8 @@ import { isObligationRegistryRegistered, } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; -import { getErrorMessage, getWalletOrSigner } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { getWalletOrSigner } from '../../utils'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; export const command = 'status'; export const describe = 'Read BoE obligation escrow status / registration / termination reason'; @@ -26,34 +26,23 @@ const REASON_LABEL: Record = { [ObligationEscrowTerminationReason.Discharged]: 'Discharged', }; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await statusHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, statusHandler); export const promptForInputs = promptBaseObligationEscrowInputs; export const statusHandler = async (args: BaseObligationEscrowCommand) => { - try { - const { obligationRegistryAddress, tokenId, network, ...rest } = args; - const wallet = await getWalletOrSigner({ network, ...rest }); - // Escrow resolution uses contractOptions.tokenId (params.tokenId is API parity only). - const opts = { obligationRegistryAddress, tokenId }; + const { obligationRegistryAddress, tokenId, network, ...rest } = args; + const wallet = await getWalletOrSigner({ network, ...rest }); + // Escrow resolution uses contractOptions.tokenId (params.tokenId is API parity only). + const opts = { obligationRegistryAddress, tokenId }; - const status = await getObligationRegistryStatus(opts, wallet, { tokenId }); - const registered = await isObligationRegistryRegistered(opts, wallet, { tokenId }); - const reason = await getObligationEscrowTerminationReason(opts, wallet, { tokenId }); + const status = await getObligationRegistryStatus(opts, wallet, { tokenId }); + const registered = await isObligationRegistryRegistered(opts, wallet, { tokenId }); + const reason = await getObligationEscrowTerminationReason(opts, wallet, { tokenId }); - success(`Obligation ${tokenId} on ${obligationRegistryAddress}`); - info(` Status: ${STATUS_LABEL[status] ?? status} (${status})`); - info(` Registered: ${registered}`); - info(` Termination reason: ${REASON_LABEL[reason] ?? reason} (${reason})`); - } catch (e) { - error(getErrorMessage(e)); - } + success(`Obligation ${tokenId} on ${obligationRegistryAddress}`); + info(` Status: ${STATUS_LABEL[status] ?? status} (${status})`); + info(` Registered: ${registered}`); + info(` Termination reason: ${REASON_LABEL[reason] ?? reason} (${reason})`); }; diff --git a/src/commands/obligation-escrow/transfer-holder.ts b/src/commands/obligation-escrow/transfer-holder.ts index 74d7146..c3a1aa1 100644 --- a/src/commands/obligation-escrow/transfer-holder.ts +++ b/src/commands/obligation-escrow/transfer-holder.ts @@ -44,6 +44,7 @@ export const changeHolderHandler = async (args: ObligationEscrowTransferHolderCo sdk: transferHolderObligationRegistry as any, sdkParams: { holderAddress: args.newHolder, remarks: args.remark }, }); + if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -54,5 +55,6 @@ export const changeHolderHandler = async (args: ObligationEscrowTransferHolderCo ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/transfer-owner-holder.ts b/src/commands/obligation-escrow/transfer-owner-holder.ts index db39e7f..a37da7c 100644 --- a/src/commands/obligation-escrow/transfer-owner-holder.ts +++ b/src/commands/obligation-escrow/transfer-owner-holder.ts @@ -1,29 +1,21 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { transferOwnersObligationRegistry } from '@trustvc/trustvc'; import { ObligationEscrowEndorseTransferOfOwnersCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, promptAddress, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'transfer-owner-holder'; export const describe = 'Transfer both beneficiary and holder of a BoE obligation'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await transferOwnersHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, transferOwnersHandler); export const promptForInputs = async (): Promise => { @@ -36,30 +28,27 @@ export const promptForInputs = export const transferOwnersHandler = async ( args: ObligationEscrowEndorseTransferOfOwnersCommand, ) => { - try { - info( - `Transferring owners of obligation ${args.tokenId} to owner ${args.newOwner} / holder ${args.newHolder}`, - ); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.transferOwners.populateTransaction(args.newOwner, args.newHolder, encryptedRemark), - sdk: transferOwnersObligationRegistry as any, - sdkParams: { - newBeneficiaryAddress: args.newOwner, - newHolderAddress: args.newHolder, - remarks: args.remark, - }, - }); - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Owners transferred`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - } + info( + `Transferring owners of obligation ${args.tokenId} to owner ${args.newOwner} / holder ${args.newHolder}`, + ); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.transferOwners.populateTransaction(args.newOwner, args.newHolder, encryptedRemark), + sdk: transferOwnersObligationRegistry as any, + sdkParams: { + newBeneficiaryAddress: args.newOwner, + newHolderAddress: args.newHolder, + remarks: args.remark, + }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Owners transferred`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/utils/cli-errors.ts b/src/utils/cli-errors.ts index 358190e..28f29a5 100644 --- a/src/utils/cli-errors.ts +++ b/src/utils/cli-errors.ts @@ -76,6 +76,12 @@ const REVERT_SELECTOR_TO_NAME: Record = { const UNKNOWN_CUSTOM_ERROR = /unknown custom error/i; +/** Solidity custom errors are PascalCase identifiers (e.g. OwnerHolderMustDiffer). */ +const SOLIDITY_CUSTOM_ERROR_NAME = /^[A-Z][A-Za-z0-9_]*$/; + +const isKnownRevertName = (label: string): boolean => + label in KNOWN_REVERT_MESSAGES || Object.values(REVERT_SELECTOR_TO_NAME).includes(label); + type EthersCallException = { reason?: unknown; shortMessage?: unknown; @@ -101,6 +107,27 @@ const normalizeLabel = (raw: string): string | undefined => { return ident?.[1]; }; +/** Labels after generic "failed:" — only known reverts or Solidity-shaped names. */ +const acceptFailedSuffixLabel = (raw: string): string | undefined => { + const label = normalizeLabel(raw); + if (!label) return undefined; + if (isKnownRevertName(label) || SOLIDITY_CUSTOM_ERROR_NAME.test(label)) return label; + return undefined; +}; + +const labelFromWrappedMessage = (message: string): string | undefined => { + const fromContract = message.match(/Contract reverted with\s+([A-Za-z0-9_]+)/); + if (fromContract?.[1]) { + const label = normalizeLabel(fromContract[1]); + if (label) return label; + } + const fromFailed = message.match(/failed:\s*([A-Za-z0-9_]+)/); + if (fromFailed?.[1]) { + return acceptFailedSuffixLabel(fromFailed[1]); + } + return undefined; +}; + const collectPossibleData = (err: EthersCallException): string[] => { const values: unknown[] = [err.data, err.info?.error?.data, err.error?.data]; const out: string[] = []; @@ -132,10 +159,12 @@ export function extractContractRevertLabel(error: unknown): string | undefined { const err = asEthersError(error); if (!err) { if (error instanceof Error) { - const fromMessage = error.message.match( - /(?:execution reverted:\s*|Contract reverted with\s*|failed:\s*)([A-Za-z0-9_]+)/, - ); - return fromMessage?.[1] ? normalizeLabel(fromMessage[1]) : undefined; + const fromExec = error.message.match(/execution reverted:\s*([A-Za-z0-9_]+)/); + if (fromExec?.[1]) { + const label = normalizeLabel(fromExec[1]); + if (label) return label; + } + return labelFromWrappedMessage(error.message); } return undefined; } @@ -172,11 +201,8 @@ export function extractContractRevertLabel(error: unknown): string | undefined { const label = normalizeLabel(custom[1]); if (label) return label; } - const wrapped = err.message.match(/(?:Contract reverted with\s*|failed:\s*)([A-Za-z0-9_]+)/); - if (wrapped?.[1]) { - const label = normalizeLabel(wrapped[1]); - if (label) return label; - } + const wrapped = labelFromWrappedMessage(err.message); + if (wrapped) return wrapped; } return undefined; diff --git a/src/utils/obligation-document.ts b/src/utils/obligation-document.ts index c4c9ceb..8298af5 100644 --- a/src/utils/obligation-document.ts +++ b/src/utils/obligation-document.ts @@ -48,6 +48,11 @@ export const extractObligationDocumentInfo = async ( if (!chainId) { throw new Error('Document does not contain a valid chain ID'); } + if (!(chainId in SUPPORTED_CHAINS)) { + throw new Error( + `Unsupported chain ID in obligation document: ${chainId}. Use a BoE document on a supported network.`, + ); + } const network = SUPPORTED_CHAINS[chainId].name; const documentId = document.id || 'N/A'; diff --git a/tests/utils/contract-errors.test.ts b/tests/utils/contract-errors.test.ts index 45c6482..5712044 100644 --- a/tests/utils/contract-errors.test.ts +++ b/tests/utils/contract-errors.test.ts @@ -53,4 +53,15 @@ describe('contract revert error formatting', () => { ); expect(getErrorMessage(wrapped)).toMatch(/OwnerHolderMustDiffer:/); }); + + it('rejects generic failed: suffixes that are not contract reverts', () => { + const preprocessing = new Error('SDK preprocessing failed: badInput'); + expect(extractContractRevertLabel(preprocessing)).toBeUndefined(); + expect(isContractCallException(preprocessing)).toBe(false); + }); + + it('preserves Contract reverted with labels', () => { + const wrapped = new Error('Contract reverted with OwnerHolderMustDiffer'); + expect(extractContractRevertLabel(wrapped)).toBe('OwnerHolderMustDiffer'); + }); }); From 3390fcc516645201d8581023710d15b88530dd59 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Sat, 1 Aug 2026 00:43:45 +0530 Subject: [PATCH 12/40] Update .github/workflows/ci.yml Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e9c6c0e..bcd3036 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,6 +3,9 @@ name: CI # Same checks for PRs targeting main or beta (and for pushes to those branches). on: push: + branches: + - main + - beta pull_request: branches: - main From 4c3f853e747f5b28ddc67f042f2142ae9ece56a3 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Sat, 1 Aug 2026 00:44:20 +0530 Subject: [PATCH 13/40] Update src/utils/obligation-document.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/utils/obligation-document.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/utils/obligation-document.ts b/src/utils/obligation-document.ts index 8298af5..92743d7 100644 --- a/src/utils/obligation-document.ts +++ b/src/utils/obligation-document.ts @@ -39,6 +39,11 @@ export const extractObligationDocumentInfo = async ( ); } + if (!obligationRegistry) { + throw new Error('Document does not contain a valid obligationRegistry address'); + } + if (!tokenId) { + throw new Error('Document does not contain a valid token ID'); if (!obligationRegistry) { throw new Error('Document does not contain a valid obligationRegistry address'); } @@ -48,10 +53,8 @@ export const extractObligationDocumentInfo = async ( if (!chainId) { throw new Error('Document does not contain a valid chain ID'); } - if (!(chainId in SUPPORTED_CHAINS)) { - throw new Error( - `Unsupported chain ID in obligation document: ${chainId}. Use a BoE document on a supported network.`, - ); + if (!SUPPORTED_CHAINS[chainId]) { + throw new Error(`Document references unsupported chain ID: ${chainId}`); } const network = SUPPORTED_CHAINS[chainId].name; From ffe15447f67cf14c87561315e57450644e6b0d6a Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Sat, 1 Aug 2026 00:58:57 +0530 Subject: [PATCH 14/40] Refactor error handling in extractObligationDocumentInfo function - Removed redundant error checks for obligationRegistry and tokenId. - Enhanced error message for unsupported chain IDs to provide clearer guidance on using a valid BoE document. --- .../obligation-credential-subject.sample.json | 55 ------------------- src/utils/obligation-document.ts | 11 ++-- 2 files changed, 4 insertions(+), 62 deletions(-) delete mode 100644 samples/obligation-credential-subject.sample.json diff --git a/samples/obligation-credential-subject.sample.json b/samples/obligation-credential-subject.sample.json deleted file mode 100644 index 933ee8e..0000000 --- a/samples/obligation-credential-subject.sample.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "@context": [ - "https://www.w3.org/ns/credentials/v2", - "https://w3id.org/security/data-integrity/v2", - "https://trustvc.io/context/render-method-context-v2.json", - "https://trustvc.io/context/bill-of-exchange.json", - "https://trustvc.io/context/obligation-records-context.json", - "https://trustvc.io/context/qrcode-context.json" - ], - "renderMethod": [ - { - "type": "EMBEDDED_RENDERER", - "templateName": "BILL_OF_EXCHANGE", - "id": "http://localhost:9000" - } - ], - "credentialSubject": { - "electronicDocumentIdentifier": "urn:uuid:e6f4b2a1-9c3d-4e8f-a7b0-1d2e3f4a5b6c", - "referenceNumber": "BOE-2026-00147", - "amountInFigures": "128500.00", - "amountInWords": "One hundred twenty-eight thousand five hundred United States Dollars only", - "currencyCode": "USD", - "blDate": "2026-06-28", - "placeOfIssue": "Singapore", - "dateOfIssue": "2026-07-06", - "tenor": "At 90 days sight", - "payee": "Meridian Commodities Pte Ltd", - "drawnUnder": "Documentary Credit No. LC-DBS-2026-88341 / Invoice No. INV-2026-0456 / B/L No. BL-SIN-2026-0781", - "drawnUnderDate": "2026-06-15", - "issuedBy": "DBS Bank Ltd", - "drawee": { - "name": "Fairview Industries Inc.", - "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA", - "authorisedSignatoryName": "James R. Carter", - "signature": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAosAAAF3CAMAAAD6jPHaAAAC9FBMVEUAAAADAwOxs7u0uMrDxuWrrrYDAwPFydacn7kFBQUJCgrw//+lqLcCAgKVl6SAhpEEBAQBAQGRlZ1+g4uDhpaGi5sDAwMBAQECAgJzd4w7PUw0OEVscX8AAACqsbOlp6ssLTicnqhtcHgBAQEjJjIvMT43OkY3OUaLnKc9QE0vMDYxMz0kJi2Qkp2XnLg/QU5BRVJiZXRTVVwvMj1zdox3eospKzIzNkYoKzkxMj8qLTcjJjBKTFo6PUonKTYsLzs2OUYuMUAgITAkKC9bXmhpbX02OEUyNkNDRlM9P0xCRFEkJjc5O0hKTVmIi5ktLz8uLjlGSFY9QE1DR1RSVWJCRVMbHisxNEM+QExLTlxDRVE6PUkvMT5SVmM6PE5DRlKAg5BKTVlOUV4mKTRUV2UoKzs2Nz0dHyxHSlcwMz9HSlZNUFweHyZRVWNGSlU3OEJRVGRQVGEnKjY/Qk5jZWo8QU8ZGycoKTZaXWpAQ00sMDs/QUc3OkE6PEiGi5dNTlFLTltZXWlZXWtNUV8xNUE3OEITExWLjpxbYG9/gpAUFSFYWmZiZHZiZ3kYGBwYGBtmaHYzMzwrLDX///////8sLDImJSooJywjIismJTArKjUkIy0wMDYeHSIrKjEoJy4yMj0wMDohICkoKDEzMzkgIi4bGh8dGyEuLjMvLjkkIig1NT8pKDMqKS4gHiQrLTkkJCkuLjUmJS0qLDcZGB4tLzwsLDYmKDUmJzMyNEAWFRseHigrKTAVFh8hISccHCUiJDEfICcgIyoUExkfICU3OEI4Nz81ND07PEg5OkYjICY8O0QoKzYYFxw0NkMbGyIdHyokJzEzMTcjJS0bHScfHiYZGCEuMT9AQEkYGyMSEhcnKDBKTFg6OUIdIC0VGCIYGyYoKjMhICUeHSQQEh0/QE4tMTgkJi5ISFNOUFxDRVNCQ04/PkYpKzE3NTsPDxRFRExTVGENDhgjJjRXWWc1OEcaHSteYGxjZnMICRBpbHhwc3+v3XtWAAAAlXRSTlMABw4HBRIOChcWCgULEh4uHSwXNSEpJxkkMf7RNiAbJO4oPjHp0tnKI9H15vcwE8KyOx7aPCf38/Ls4tzAuObewPLw7jMs69vPybj246UQ+enf2cGegfPj4bby7Min9egc1svRxP714Mq4r5P4t5rj3a/YoxXp5smqjb728ao7J/M9tumuky5R3P3w7bfMODPoW2mQYEx8vfkAAF4ISURBVHja7N13UJtlHAfwLxlsoWVUEFDosrWtdba1VrtUFG3Valvrrnt77r3Oded5jvPevCPJ+2ZCSAgkoZBAGEmgSAsINIEObIAWoQ5cVTz/c5zrPBfkfRPU5/Mnx72X5J57nuc3nucFQRAEQRAEQRAEQRAEQRAEQRAEQRDEf9yNGRkZG48BQUSbXIZ0PLH5onvvuKZw4RUofG/ve0+vxcK8vLuAXMhBEFEhy8fWrde8uPc4VH3wnrumfecuHPfxex6w77XXVLUft/ySbTi1SAHEYXqbgVkg/r3k5798M2zGjnLs/PwLvY6r23fkcx3H6VDOMbp2dOjeP8Ltqqs77pHrMnOzpt38mIwfKGZBIVMqgbREOV7BLDKP/xttvHN5jbEBbYxFA56ywCZwHR1teFeveXef3tnRZuDVwmE4TZTa0Nm+/IabzslVYBqJxwyk5G4+Zw0uuv3cLXPXr1u0ad5FAG5+bDOQCuLf4/wnL52wcRTfZsLnnx/ssNlYvc42ypVXAcZdH+qMek4P2742k0aoreBYczXce1eciAxMGwWyl88pPqnT5+k011T5UOWugS9YV+MJ19Rcun7eldkg/h02rump0eub1RA4lm1vLz9SzVXvWn7DDbhq+y2vb0fx9k3333+Nr+75p5haVr9Pj11VVSGPx+dbiOmyc1TmXmgOmz3VxjEMVwyXj+6ss+nKbcMDnsD+QYyic3kxiH8BBdBcbmMaDBpbp9lnXgFs37T08dkogvJkyOWJMkCpRBqQmX3dTfPPQvsuF3aqbR1m867lm8/ENCDP2HBSqHtgwOk8jHc1TJORMb2r0Tj1GtAw0UanbszXa34MxLT3+HG1Jjg/sWj6PL7V9y1JS8xQIiVpDn6nADMAyJF/3VwPZ2DxYe2HtoqdhdgY26kxDsjMe5pxWMYdrQAD0AaLYKesBhVMFqrJ3mQFrXHyBnc1LgcxzVUwqjaeB+y35Z2hxPdmxGEG/sIJAM6q1dlMAt3R5lmTiFhKQ96yJppS2e2WgLEf8FJe3rts8T2Fy2zX4zasXqRhGLsG7x9p07fuvQzTKuAifisBy3oPg0eXkV25OV8JIAn/QHxCNh5Uc9Qnlj42fCIKEBvHYAHmql08Kh2UvXVszHcSZmfie7PT01GUn1+ENJlsdgn0wWYHvecTYNS3hWR5pqlcuDleqNzBu35ZiP9RODIHgAxXCXv2mMy+IUQw20S4Oq8cHOObLIDGfqBncR5OlQHHogAoyMH3ZiEuGcciFVgxNqZVfYqBXhzdCihmgphuCjkcFJx+LCvJBuLwT6fFn/9x6WIwFbaQ7zXERCKe9gdoutLe0Mo0LkXuw384xAp+TOPj7EBAi9ExMzrd2EDmxukm7X7eRfG8yzv3bhQA8ZiU5FlQ5C/lDBVV8K3LR/QlnDM8RqkcKmiFZWdjI4A/+Q5JMwFk3IfRIELD++rcvtugAGn2mFbWCzQcjGEZ0uWYg8krABLWDLIGturo3DREW9a8gL+0tYkGuvNm4x9Iu6twODjaDvjwFE4DMZ2wAngudA1eAeIxNckJd+nLmfLqmmJE2Qtzg7yAQxYEgATM/PswB0hNf2DFWIXDtHOgMwxi+tiMWjs0rGftqXOQjKmKz0nZMMb4B9wTW4sQPfEzZXn6ATSoLIZH8pCCfyg5pegWpwP2sXGEF2bPADE91KkdfX51z+nYiEgUIOXKp+xUdY/79rQkRMuxQLXG2UCXGgGlYhI5IKTd1ESZ8Em7+dbTT0sCMQ1krDX4XU09V+FkzECEFDhY31gTCiOKEi4MCg6eaTDge0mTGYwLQNkpjFe59+JhELF32i1GDSPoihdAHP5Go7qHPUcWpeA0Hhj2azVqzoupuAS1B/VczdoFIGJOjs+bLBj+fsuUBFGsMjo5jivMRhTMBBK3BcdpCpiY2gYjffu4wHGo2L6E5LxjTf64x9m6o/FmJURz9VdH2o4cQXS8eadPDz9Trrv9TEzJgu1GvKuuqNoEItb28tSO5uLzxSvG5cDm71d7EZUMck7RU0GTBUa2EJiDKSlCh05fXvM1KU7H2JK17B7+8CWvQkwLde22XbduSoD0sq7ywET7Od+VCcfET/U3uKHaqBl2X5AOIoayLht0UnzF0hSIKfsClt/XGb4SURA0akFh6ERlRJvOASF4dAKkFhhLJSEYTNSWUyGmOCDgomqGLsiGxBRn3MarLCa+86wzEYHnMN4axMj8RJLxjp1UcAyEPqRCVDNSH+TVHrf5Okjs7fWlWjvVZFyWH9FZmySM2gO95p2zyViMIS+/u4+fr5wJkRXpXUxddbEMEvNjh6UN3pIEROYq/ziO80E+PQ6P/R/J1zEqK4UNEF3Kwv5mI45CWhtP3wMV7M3IRXJkH/eW1qCr1lNMLpiIISuchu3KmRBfD8uhc6kCUkpd5FCZLG3qPDki5aF4VNdlgogVARrUQAHRxSdeU055h1YkQkq5a5soe2nFrYhUMi5lnKjwLU0AERu32VV7mrEESRBdwk1ql7oaEhvXWmiwqxKPiYu4vcLDN4A9aTaImLjzXYsFxusUkIDiXk7Vbz56igKSmQWMNml5dlCMXd4ZYCwH1b1PykDEQOp6TanFekkipOFSGd1HV58G6cgQABrM5yaK8axbPt2zx/j1QjIWY6Mb9j7vBkhDeYkAz8S6REglCXfru2mBDUMcmgYTd9yFclJ6iQneWd57mRLSkN8r9MEz8QIkc/LKHtjV3D35EEWwiamoWAQiFio1xt7OpcmQhmKpAUy5GZI5ZomesaqYkROfgxgyqylOHVp3PIjo21AG6I5CMo/7YWA8d0MqrwBOqqECkCdDBEsuHqitdSNrZg6IKJMBQkXNiiWQSEoJ4DS6H4dk5g+4aGtzDcSRVhhk2TAAcggr+hheYNxXJkjVJ6VY2u1Uq83nQiq5AZOdBneuMgdieGf1OKeDm1yhHAPr36WY3kcSIZm7uo1g3lsOqby8XwvVPv0aiOQKqparnlidBSLazJzaa0MK4iCVZl5gq92zIZVAtyDwLESjAVvTuZVc5h19tXqT+hIlpFPECEx5OAzJHNZQDcbFGRDJkiPYd+SD4pNBRNfGxQMaxgA5JMT08X7UQSLKRaBg0V8igzhmPYv2L755f54S8SCi6RlOELzmByClPoaqNUMq2SgzwW/IS4BIit765ouvPsojsUu0nevk4d0vaf5iQzn62eqjkEbcGQM0xQ/otikgEuVbH+Kj6ivIwdQoS93VYtFD2n36Bq5Z/QmGIJUgBUHthmhOeOsToye8BkR0nTrWwqtrkADpKGDu33lk38XpkMQcsLxgYNem50As4xwb7ikBEV1PlDfsZq85HhJS3DXYz+p6T1dCEooTu1VCY+ha8R54h2OgFu4rQUTXnQZHpa4QUpJfq67tw/5VqZDCzOPXOqk+bBJxib5kHJzHDCLK9jZrKPV8JSSUuhr96lBIqvBoyQdq2sAgAckQR+ZJn5p0QD6IqDpteKDBNfGAIgmSSTr/mmbWax65D5KYA721zIV7T4N4LJqOqgdJCTDqnBb/ECR1BsuyzeEJzIAk7nNSlKDeCrG8sk3YI5RXkbvGou3lYeFThCGlN69o3mFQj6ySKnRZw4NWh7c+DLFsR4OAi09NBhFVd9Zhj/MopJS4otHQuH8EEsla5LSrGN9FKaKt+U8xVp6be+axIKJqLgwqAZmQzhz4DLy6egjSOBbrKfAVNSLe1feeUTAOkUx39A07rcLaBTmQSA6OvwB9poFg6JlZkMZql503VF2RBFHMkd3UXsFVDIGIMrnZw9OGi1IhkXikXDkx5NJiaHEmpJFeCKeJFbELu87M1WJZLojoyuiFQWVclQLJKOd3soLDj1WyAkij1qGG210ihzgWddrq4JtHmhejzleu1lYUp0BCLFPqaB4B4iGRptog3PhJAZIjmcaBTj3QeRaIqAsZKZqdL4NEkpSLqisMgqHl0awCSCEOoDSUzdOJHykjDsNWVVPcUfO95Jax6POoBZW6WIY4SOHYBDBMv6tp4EvIIY2UBwYE507zWfheAi7H2lxE4oydXIetBvmkpTvqHqgxCjRXnAApJP8YpmsdtL+55wSJRvsxwKgDA5h/chKAvRODj6ZhymYWyDaxroPOvSVKENF2RyfnUAHyGZDCzNlfDneraId68NpUSESOcZXAVz2WACV2hSe2ICWigV1ndPL+renkxoioy7gszJk07DwZJJE41+2EBRYGC+IhkZSFrSpVf+/NWcoTOzurVyAJkdhapd8DP1JARNuZW8xqw25Ooru0FadM9LqaKnfQzds2RrDM/zX5oiaNZd8Nd+Aitzt8MSIS94TbXW5XnU4OXcUGpcU+SGGOAkdDXn+D1np4ZSKmIglz8PfWBzR2tLHLfGHfBYhMduFelimrBBELW3RtKroNUpiFp1ivi8dhLE+fdJ4GOQpknSfH38vHgMVOt3a0m31mREa2tEpXgaHiRBDRl7YuyNCVhyCBhA3VI67DFNRgn5lKRIIrCtduw8l/f9nXSV5e29UKjzm8Oj3C90/X2nQ692IQsfDcZb285ZAKSIao5iB9W9jLAGiE+RwZJuuMNesGMTKEkbmb8xPxl44vbMbu3Yfqe/DgbESk6Jpa6HWdG0gPbUykrQ84rVCdATHNABTY4nMb0NjnRcVjSkzaxSMTQf84DCHz4MhK/JWk4wt5QWUFcE5iMiKQg/nwqnuG80DERNaKIO+w2+9NmAkxKa8b6qllG5uZL/c3QolJu6y/uY9uVY07WrFjpHH9Sw//VUZQ29V1yPolzk5ERE5YOIxgOxZnkhba2MiYGzBYrZpNx4taFUm/HWBMlH+gvid8s2zSvbHykv56qOjdqrKWrvpDWt7Q+GjaMfhTB1rott1ozEaE6oaDgWAPiFjJ0/G86uAj2SKW/dJLLoaqqbRL21wfMp+ehinQHtiNrvrdByqt2voDpeAHH0TSH4XbM5BxYam2vrShS71SFmFVe5fNYqJC5AVDMRRwCTR9ywKIJmvl4GiDtqyMp5lB86b0AkySsmTEiLJS7aEdXaUt9YC2q76lH7dn4Y+kzWeaylDaxTRDhogs7wloLIG55N0FsXNKwGHROsQ7opeK00N+mkalykLBuzITk3Z8oUdP7y6tRHf9Z6+9tr++29p6oAUjDyEHv5OQ/sKqYRfKWkppCiWpiEDmDajeHxjfvxlE7AyqQVvE6tZT5AKB1tKmQzzgGBu6+YTJxwGppwwaKrU7SgE8+lDajVgZauz+/nnedadiBn6VPCvp5FMKj34Jv7asvrLSxd6VEkncclWPPrjTv3gDiBgKGy0q60KIIP6NZ+exHEVTVkdZPV8/uPyhKZRqcNegq7ISKK0fWZMIHIP0vMCACpXdjTcr8Rs5BQvmTYTQCAE7DpRp2g5CjimTXcSGRwdCvS8pQMTOthqGbsCmxDhELHMV9nsHmlpBO6x9GAJOS8bkbWG1qCxFS89rAOLjAczzDlKq1qGLn/i1TB0PBRaFYB4cOrBlcVmL1SI0LsWUyUvaD+pH63Aiqf3FUvIpPQxtoR8RoWkWi3vUfdDSh1q7Woy9p081ltgPGqWlh0e+/KX8kfsguqwHEJqHX6VgWXgo1GioX4lX7yi1lgkslJi6dzvGGveSJHeMpd3maW3AihNwLCIgz95W6GvpLjvE067DBjXb+WQipmTBehhKVaVWi+328/GzDBzSqr4N4Ze/pOSfcikQRG/3o3i46A6DoGLYB0/D1MivvDTgcAZ9q8kbNGLsxts6x5sCnZmYupQbN8Nn9vsrrZValbXS4PWuuzMVU3NtyN9U2WWhd1yG33j2HpV2fATX5gDH4HvnLA5gLBBovAdPyCG7yKu2qrmtCZii94JGG6qvOoGccImxBW4PpRrzYCrikgDMPnH18qHQd+zdZ3hTVRzH8W+6oaUFCmIB2bJEBXEyFMWN4kZBxYGIA3EgDtwTH1yvMkpzm9JxLwQS0vZ23TYJ7Q0ggTRQ2kJSoKUtqIgEi+LTd25sgUIH0vq0nyd5k/HkRU5yck7+/9/BK0gSgls1pWRO5qYoWilta4VL63ZL5Y3m/zjRIxRWHSMY6Am3UZ5RCEWzGBQJIS9jKNm4dnkorRF5P9tXarc471rUVT/b7rL26QscO6bSGpcN45ZjOWlbMxKxgF7QO8sXvP7AFbRWyH1VB1yokpUFNGKWJHtl5azecB4MSTZImDKSb/g4CgASBR3ZEyNoufNDn9twZI/FWFTclc3dARRtN1ksBwZE0lJBMKnK+W2K1iGYbWZLtbvaWwHRtMGE6bhUqyIKnEhw19TWHqMbQUxHJ1szJOdygroBMPRKyW1iOj1psZA7f8hOTdWvZB5o6NK+btxbpK3+8QDhtEw41y3J9GHB6tKh05mrbRZqlhJJW0SMLC10uK16z8gYGooeJ+pq7HWVi4KXXYeqSBbyk5d/EgVAP/qOlcSyJCJaMxSfXktqsmFI14moHcLerXorFZNC6UFzdCckcjgxLz+0PXd1vgmL3uqutkrldkOyYcHi3rRN8MgKEb1VUe8MoaHBCyU1oJTHs/iaBEx7tMkpaRcSfPzesWad4dDd0bRUEFclbVydv+0aOm5IhAbgVTqFPmh1Opd2+miaJ3TCIzwwZu/abCGFAocV3LrqgpRNvhvmcSNt9qPTJRbo/d6pNNAt+HnlsDEVkscmOgrL8kmu5fUGleixGRZ3xpY7BtEy/Xhuw4pv1lA6CS6go+oVMjRiWSeJmbpkXPqeXQ7jZk5D0x2Y+V4QIX24du8xctYWWNy6ArMlsUCHvkCUnAsWDw7X0DxRwZwohMsv5/k+j1NbhwtJVqZF0dBUvyiYwCp4DiWaUsrgkSsaFtNqE93ulAcjaJkIdq9I2JSSx42RdNTO/F5Bg/ny4s7S8zBzeoVllQDjw4fTBM15fB37xoPj7r5wxLqtuaQlpOF2u606s14nCdVOLwAamkNDNNCbRobDmMxtpfZZ0494TXoRhbLGOSSR2GXBInlEyRJQTPmlC2novKmpoGVWdE9aInrUD6vTC8i/YRi96Ig0PUPCATpPmkrUaztWJZqlfbeF0rTRs3NIy9qalrstKdmZYZITzaA3Yyjco2XGtJhBNFfMgLfX5XH9tMc1NPA1dyk+e4WqGgTVrxPrVTuNDBwHNoFqQFeWveLFN9+joVgjJTUp8+NoifApP+zK0G7a89CbQAcLie8JQDjMZHTnqtb41pJaInDNBzTpubGl9h1FRQnOMgw6s4DDbdYpyaQm5FaNmDeM5ht69TFfba1vL9E0EvGQrAY8oqiucgmCFBDLF/TmHxou6DvuW2wOVZStpo0ZlfMGRtJIjLHEKOYfpfm6EToqa9emEi2vEDycDicEGM2gDvwz9r+x9Nt0ndGckkZTIu5k+44dFTadQ7C5zDqztApRhvJv0lhAUDgtsb7IoT1QUVs3NarRK1yKAgElEFAFySoDdROOLzDgCupVl+IJBGQ5+bV5PE5jkWwxYubo+Eia6/ygaVvXxbOaCwfT4fSCwaGda3I+7q5ybUmBcccoTi3q2bx1FJpsepvDptfZHFoHXoszO6FyyDT60DIX55c5HPoUR841oY06+SpVWZQDoPqxOkR/wF+59Cu6EwacT++p2D2ypPjt9VPoHcyJ+ty34RCf76qi+WI+XLMiaV1V1bQOeLLVJaPf5bMvGXTJZXQ+H67WCjoHk3tzSqHLxm0vNJW4VuHQ2QQBIaOosLJqxoh5fUNomX7gdMmKzWZvGMx+PiGLK1VRrBYlxeHSIUiSIjrr/+6BCunNxDqfQ5Zloa6qanwIJwt/Y04q332z97ZwmuuO3NzchJWZ8y7pSUcTAUuWvERnlbSrIPFHRvTl1C6+2elMyCh3iYrX4yoqx0fla58MjoiixSJRXFZFUUQqL+U4DTf4HFZPtVmPIGfIHimxQGfxMvkTBi5l6XWldj9WRQ7gq2piiMfeesS9aWNe83P7nt6UtDYhYfuFdChh/YaH9333y7lPLYvotDW9b+5CW2BMmBFLUzIUAzU1hTh9FZXA7XxAq4TfbbcKos4tKKWz+NfAqjpVARkDeEVRcusIKP56tYq6ytIiU4UHj+hX6utqmw6g+C7dVzkqmDPrQdDs/ns2phqyt46nI+kFoTz12dyrXoiGTlu9NnDOitSSEpr+82HoWFOCk3ycVaU33MZAWm3QzQGP6JE8AtTdyb98RYpkFYT0LXpV9UhyQPUTkD1qba290pkMeHR+VVFr3+HUgsYkUsPBKTTHsJFrTMlGt9FJeIdaQEcN47G5/R9+hijovMEVjz+UtKlEb1o36jJOLfi5Gfm1VbXHJi9dHM0Z9DvNhzr2mXKrTlVFBIFGJ5xV1SFVi/5Ail5V5YAfpT5APRKK3W7HLqoeVZaVKpqgmTlyu4t4bg2nGZZUbNpIRvmMUY/TQVwAdOvzxfv9r+JSojrmvvs5c8tKI/rDxuv60JSBMPWdmyI5k27vhUfEDjr1N2zYoNnZfsEqIeJ3+eqePX47i7ALNptLcJutos1zEfMMdkmmJiHf5yz//SJbA9SU1z2HhlObyYGkDVkM4IyiuLkmdctKY/yQDrVhEj6Ye+be9RCdeHL+W9i0+IwjRYd3EUdP2qIXg3jys6sYA1Gc7L0BtQkmXbVHsco2ez0N2L3YbC6JaqunIPAKfT9eSBkFrM3P99UVagv81UJ+7WmC6Hpw7MCavNyLQjm98wfPRl+CdmX2RR3jaOgwIPIrlj312PtLoPendMGQvqfGv2ULbXXxlwdzS7cfPXYXBHOSQRMrvTadpAY8qlz/b/HDBcSVI7rMLlkWBMWmANw5fdLywkRDogz1NTgUeeH4mTTt3dwDK5Myr5/AGbxYYTGaVhnybomlQwiJfvd+lvHRwSUvxHbcqrVzKm7sIYoce1JGRdEmQ79YV+QsUvJL1xdzEg29B6T5awRZ8Xv8gVk0VOmTRQ+egILi4Eb485pstyaXlSletHbGEUXTeg0miXXM53SGw4wfDlRUGGBizPAedAAXf/HS+wfnPjznqpHDukbi32YOMBzYYoFJtMnQpz5Py3DpbGTkV10axUmCH7UbcAj4/Wo9DUROravlj+W1H7+9/ngHoShLAno3Gbuq7lqEhtMIZd/anLT5NCnsfIKYEW9KLlqZs3PeTbS/EMJ5iZ1Hr77jmdl02u3EUxhm2FF06HDKlbTJxU8Xb9BiMdtcjsrbIzmFugyTS/AH/ALzgjUcF1tVKUmCoMgihVwCaODxSSole9yYE4l/ejHdOZ3wJXiz1zGYJmjowQCO5Gu3Orlq/OD238uJ4Kknn2L3fp6JDYoK6dXVafOvuG1eY0nqxngiaT1N7Nz1Wly6asHqUUeO5mSzazOQVb/sYsebDZ4HdbWibJVkodDA33eMHwceOGw21JbevJgzGDxOa8jnypjTnRuc/f0u47bM4hveaf9VS29u3bD1aM78z+gbRPt/MDqW0TMSjcZEU/yACDS0WsSDlTv0VjwC2Gs5SS/uI6VGQcLjqGsc51RXJVqtsl8td9oBNCywOxURt7ngcPqMqTdyJkEPafWGtGKaENZz4JjvtuzSrtmcNqbdm6xCRvPE3Kyd3+RlzXijK3b0FEaka3Xa9I3E0QaRfElAbxYEUfDWPhLOCfpd9mStWuYSCPj984IvaNiKX2sXQHIJhc7lQHCfEZU+g8uDW2/JeJtmCJliXJWck0MTIphh0Bm2JCS8PQXoQfvpRzRP9N+Ztz+POSMJPY8uJxlQatFrNzl8n9AWobdm4lI9yLLX/kh4d04wcEal06MXFIWFNLYNqdoqCZR5mdmHBVeyFayyqnqZ3rwpdYrWQu5RTqaBsKHAlvRNGQnXENW+YzF0IC/1L85Zn82k22M60mZ7h6LV6UoSy7Y9EkwbhFw8xu5RJIek1NlP7P0Pg+ix9rqAKMiojdN2gkbGG2RRVv1quV2ZOqawMDtfKUcpxLftNaJoFn2JybD+5SZKpLfm7WPNyrQhi2hvc4ozj5Jz9aVxXSvnJg29fhUFxkNHJtM2fUu9iiLL9lrfvEhONMyuyAHw19WN6MO/elx+Mx6pWpIEr+x3VmTYy7E7FLPT7pzxOs0lHE73rufxbjTSk7AIHl6/fmdpXtH7Tw6kB2G0Dw0xU15865edzOep+wfSvUPsb3ZMQbds0m88kphy/QTa5KaxPkV2ibW19SN6c6L7KwXcVlFO9h1r+NIMqZekamRVFgVRVAKIglsEnNcSTDP1daTiTHtsNA11h5m8mJvM6ty9OUsevZF20yOCDz/69fv9fD8fupL1zuAdQ4HbUhO/vq2BoDtw6HWOcup9nOSGStGDION01r7+Kn8Z/MCkSjuK5EH1BwIewe+RJQkUhfJRcTRbjM0m2vPm9KWxi8najCFpzYqVE3n1vF60k2he2s3Onazj1q6ReGZDxx4uWVWwOndeMG0QeXthjUMQbRgChfNepZGvH7UjuwWr11NbWbf8pr+fMG1vmg+HRwj4VVxqwC+qfg8Bv0dVX7+EfjRX9BAL/PQDjU1dUrx516bV2aax9wfRg3ZxXgjj7zk4v/iX+TvfZ0IQdM3OZxI1MZXD6Yb4i2ibb+2CZNMhBCCMhiLHY5dRRasiFNbXj+9Od2Ag26rshS7ZWg31iiDLSkD1qIpitV609Ip+LSkAvMiSumbXLzQUd19x5n7S2bUCgqEbGs4lDQBRcbe/tDsvq3h+cfEdvEeX5piWREqqFibQJmmlRpsgin6FaI4LGw4c9tukatVjlWxOb93ky4KCiXh0YTlyaoERF556VDxuz++PUP01417/AMJovtCR1SmsiecfPYdz59W58Wv2ZaZlbh1Ae5nJlPf3b9iclVP8yz2PxnX64sRm6kbVyo3pRlLG0xZD9+7NL9Sp/oC/bhENPDDRqTWiEwRJkapVlcrrXhnPiEKrWyWAJJod/tseeQ0ZPSSSVEu4hhY5b0pZmTd5/X2R/CV82MQV2YbVK7evW3fRnUFAT86pHgA3cuvcpM0bktbkbL0XOlf+Q1toIu5OMoIj/5VQWm04g67M9Rn0ohpQ7Xfyr8UL7Q7BgV7WeRRdokuQ7WlV7PDikT2YBe2P3nquCO59BRnldm9d7SvP03LOGoeTW4IAYOiofLKTEhKScvrfS3Av0HCuhce98Fj/vOLVSfFwK4M6WEhKxxZy4fbkDC0pQwbTaucRNCItOUEvyH7Zzt/CuOn+9aWFLlO1VRD9AVUSrVbRVljnLLRVW9xWUW8J+CtGxAH0WToVBsYEdaPlCtMda5h0CQCzb8gl0aRdm7Z3JPTkXOsBXP7k9f0Pzs/bvzPzGuhNl5bQLNrGpi3GtevpRetFDrAnJNgkSRbt9/9zE6/l5K0QZMQAclFCAgazoLDqR4e+WlZ0glSSsK/olb4AEAUMb83oiRxlkA6x8bWZwPPXrk/Q6kzG7/ZdsyiUdvH8rbv7s3PnfOY8QUwnyU48m/os9Bm0kELracLAl+91CCKik2A0EBk1dWF2RnwqZtlC/fRb8G0zSGa9O1GUXaJfUT16qtKmBdE2mqBpiQ60qS8CQ9LWZWNNTWXH5AnBtIOYF+75efdOivs/+DoTOkyz4f/L3aDXboy/sG1bYNvKFUmSZLHw0lgIZfIIu9dlBrPIxu2jCH33iW35dVZ0iG5VJ1SLyfml05/lLNhjLNmz5S1e/mX3+owMAZfvOvoM59wL5TO+Y/P6o1cxqGu50kpRr2w2JOs3FY6gDQbOqiwzW62iiG7WNFjgc66y6FShQJQkXdn0CBj0ISgORTDqTAXWjUcUZnFFEG0XM07SWYzIJpL2ZWjdG6c/24d2cFnsF3P6H/zhh5xfgM7cc99WpYkmq4X852mt8y/oi1MWzKIkSZTZl9t9dlECd0liaqrn21kAxMCFY406o5YUpy931oUxUZwNodNX6fW45S3afUkZ5Vbax9SHdhfvz8r75i3o2/7l4/9jMVlrcRekr3jkMlqp31DiC5HcsmSVJKHG63SKgizrkfysXbhgGH8L7ztl3F2sqVs+chrhnB1RF5lSLVhdqaVbi3jxHdph/Tz6jY/278zduT9v7BhgeNe+dhtcduUKQ0lJesLYGFop6JFMEgRRslkc1R4Br+KV5IADfXn+OGIbtfTHxPL8BII5a3rfI7otBZJQxrrHFt3Euddn9tz9/YvJygKCuv5haaPgifEmwFRJ6yUkOsTqalUWrG6PNVCj4Ef01tmvfP7Ed6c7Z083iJpdXoNk1dt84+6Li+Kci+Gz7/qzLivr4Udju5pYzoJFmHSJiQrLaI3uxL2Yr4BHFV2IkuwRy8uo0YmCM3MyIfSjMQ1nR3cAHt1RXnLI7ZYCE7mxHUJpXmbz7oOZ84vfnxLXtXY+K65ISE3V68mkdaKfWZm8J9Eqm3UyLqPV4y/3mjKqk+sm8zi9+G/NKU9GNLv905dxzsXw5c9ZB/ml+OH7Lu/qYTlLZv7G3p2HNV3HARx/swHjHkJAImGSkXhEKYrm0WWGRgdaaZaWpmWnR3fZfTw9nU9/DHYBG9uEseEYOGABAsquQK5EsEAzxBCpKKPjv67Hbi/asGOv5+Ef/tiz59l3v8/z2efz/Xwmawsyq3L1EyGG0yYcg6qu8L1MtmZDUXbWdnJzv9tz/503xeMhQRANz7K4tumbQfIk732w9QJG3LUvxlpjY7/qugG80dl95tZplW3KMhYJOW3+YZs5mLctuzCbd2s+PKDc3q6vBK4SAeCDp4xOWolc36VWU1iYqbyBESWAjC++6moa6t3AWCAQLzeJoCenqm3QNZuTC3mGKIT8In6Jgp6enp0141dw6aOXzL579qYnz3obgHNi8JRxbKar266VGxTNFGRxVwIjx4/Vy229VufhI8v4B+5D+HcLWl9W9Z7SrJ4s5mSe3fCca+WCOUJ+Fh6ZpjFW5dW9u+dcrgMxBEz1ExDuqUkx/kD0OfGs6gO7UUtlKhQU5TTXMmKCWbey32g0/diceJa3JcztLmuXFH6GvoWTEbzgMh09ui/1WKrgt17R01OCdA/JonAACPVcyPKBaGD0tE/URoWG6r3clnCfNqswM6f8RkZCKIwF+lSuLstSAry5syeoJD/EaPleIjghf1GGwWRprN2/LgEAQdKenvYe6Z49cN95PscOjOf4A0Jud6KTy3abZl4UJ4B52VuL1TpGRgqvD/W6rB2qdKYH/1N3rP67+SJXKvuMpV9zEmEzK2W06vbXIhYCVBjzpc3NPZVsmo+H+QCEAqX9R2Irqi2AEAi+ZMvWj5W78cWTggBErP7qcP9Qf3/Tgn/WWo7/GLm9za6lfImIExFSiqZkd+XuHbvXAGPW7jAX5fQ0S7l0AiMh4OUMvjpiMLS6WPzLLJ/ctgJJ7aKH8aBR4YTEsaofW2yslXXMF3qfiR4juDJXWaRUHzhXzIm8de372cXFe9rrPvzAserug0DR9rw8ed79YkZE2hcYOuWGso7Fc8dyjKOgIHfHwreC8CD/sDWpfU56rbGXw4Xeg+hR0yqVBRLN+5xMa/2nO+t3ZdVvr8/e1pzZQya5ipqW8QI87sIElvc6KdEgu+EhP1+OWfhpIZnNY0LwlGiADdaj5eUWq2sxwXh5WJkEONT6gJATCMZRlL/zp11VH/84/EZJVfXBPDxPCImW8sq9UmOZ6tZF+PIb2kxJdt6lEf54QBCj4CxWd3U0xTo7rl+D9+6A511ly81SajUsCONEHqvZXlycWZRTpc3e+nF+fptdqqj88go8KQgEcYuvN7lcerVML2UuAn5rHJlVBTWX4iG+Ex7MONy/1tlvvfx878W+EfHwJLUkV6luPjD3LU5k73bqtxZW5WytKtySVbxla3Pt/mlReJQfV+s+MTU01JTJFONvDOD3fMY9RVGReemzeIIQXu1vGhrqWJtx78XesvMImavXaLVqrJMjOYGE/fXF9dnbtuxkC7t25YNl3wVheFIUy0qleode7VC0cEHYX6zNq8jJ0pZMxgOEUzZu6AWarKlzw8A72XjEFEpztJodrZxIXPWWwsJC6t5trt5WV4Li4M3JYjzorXtnmj6UqeRlKr3VdfmTd/Bn8SiLCrbobsS9/BGw5tYjHUc7LB0suTgkkP/58sgRJNwkszc4aOd8X45PvLe+ODOrykxOT0metHr/naNFeIxvALRIKxsGq9rVeZD8joi/IBqf/VlBsfwi3G31cjXOptYOLooKCfX24owgHzB3a83aHVeGcVz+oyfXKXLJkSnsKkX17tdeEuAp/vHjNi5d22TLNZdItZ84Nm+MC+AvBT9a1zBYr1uCG/mIeKMX55G+LzqfWkcIPnibIEZS/P1ypbIt28yDQRzX6MRPa2oqK6v3VjJ5/GV4jiBl3uSv13b06tWVIJ9IwlSOI5AP0TbnEYzbBMPrvV29qFiZxoUA3gVVI2rqlfuq6wsy9xgRclwCXthcevP9B++/+8k4sQhPEbCQWjp0RlVjk63WNQ8RJ7DDoWlX4DYhrHvd6ervtWK62tuyfWZc1GKuKiJXesUEjicIITBazPMenNMxiuen7cMiy1M7VWBI3bRiHCcSWX7ALDPhJgEXLet1auQmq8uZ+NJV3iLLmTEFiaRAqZVzH2eSQAy1pRUGRaXUoLt8DlPCgk+2F+SA3ShbGnUOf8vZAELxC7HOrn76VTcsxOvMmdZDlpKy2gse5gxKwgqqA2UamRq4MJiTmXBlq92oqMUNpvBmb7ml0dTxCNO90fmMyivKL8jao7tSzBkSSbJNpkF/2H4YyNgo5hRclZhnL7Me5RWGy4ezCSSApOeGYoeGrNZZyaPxgXC8zpQpM8w5nw1yoJQzIv6mRMPXijKNubva6GTGJfeIRdGcgmAqHEq5agV/ix8ZfTZbb6zl8jGMFgLexrAzKRyNVluVg2WMiBEnYKlJZe2U52aZ7XpuX0g8p6zRrKmQJ4YwXOGEpKzq64r95BBPJSECb43ljButqsknVyK/JpIRFRojSllnkqtUBrOmwUHngmREBHKqnncpzWWMj2d4YkKFkavB2nQYQyIA4d6fts+4gHRZljLLTGkyIyqMMVa1YbCMbqVe3rBshZjTEjcRTUNXKsNz9gSgC7WrifRrJ/hwtrfY94+whMJCZZu0ddL8cxgpvmGPZ4DRwKAxt10/6wKiICaI0xA2SZNVzfUpDEfEvQw1YdU1uhYzXehdlPaPkUBVtlJSd6gc/BkJfvGRyct6+5oa5AapVHX4Eab7cdqCFzowmgwMR+TqI6pDrkZM3DjWe915hAXBcUdKxwjH7MrM2S7VVC5hJIhYN9PV69zdqjYaTbrUjBvFDIdoTEMBlbsJ5TT5smI5hw6ZSm0rmR7s702dR0oM+PBHogiBL75TpwYgZNQrb0VB29bivsGS8c/gab4kLBxqsqmRV1ZgYeUcmDq8zqzgyyhCZuQ0RSSs2BBr2MGhxkfmIvCmziMgECAIf18/oYhgAqakpDyTQkKAeCzMWb1q8SVpaZMmrWbp6jVr2AhV26jKzP0wkcgp8wNEHvuEpqYkUaFogU6D0dAbuyCZACCU4ZF8qkCVxGkIimAZTa4hi82Z/uQ7eI2EQIJFopAwYMm6xYlp61bxRX9T0/JXgQ2WWJvLZlSY7d16m8lkQjXjgV27kFD83rvvymIvT2UOYX4i3G8qSfusTtvAF3ZFpcL1VDpEQAzDlTAjM7eEpfGcsvkb05voRa67PumhsUJvicWDYvwBCER4xwTx44vTVj1ixWG0oT7idDl1JioVVJjUMqfLJkMplXTbd9q71PbOzws+2En+1nzy+WBPmVomGxpKTScEAPxjcA9RygOrraYmk1EFYLn1BeL5e8Jm1dcZnaliTlHEAytjh5o6Gmsdm+6L8N5iGQGjAF943alXYVAZ1Qa7WZ+joRMzOBxK7J8NQFtbn52qzOy2zKLPDiPZ+sG72+q35+9sz2/PyWlHKW/VmR4gPkAQ8vYrbtmiIwxjKU0VyMqq8yQ9e2R3LSbA9xz+HsH6uhK5PDWOUyJkQ5/VGdtoKp/GfLw8SjBBBK9MPQumrLm9wSGpQuuQmBsGBro7B7UOrR2JEoe9W4lW4ug0O/JodqDJK3E01OHYRTHNUnq2bWunoFBSL8FKeWzq7RlsfH6qMCwsjsjhj3rzCeGCWSbUO/KUkoYSh16/YAlh7thucGlLiUHFqRn3xnNdzk7DJ7XzXpruzZzdb9QoIOpiSIggKCB52erVY0ifWWoyydV6vUqlRu9QqfQOjZrcrkGbXIWsRqrXy/JkDv3EmeduPnfVqmtm3M9EJk/U1dTR01z4Xvu7OZKcD5tLbHkoUJfG9h+hdN4jGbevfO72xEUgCD7Nom0g+EXywFMuZGj0h97fqzexmLHBblk+IBpTah5osJ7KKwXwer+z1yBjOYi8y1jczm+CePSUB9kwo9yqSb8lbYEFMJZiMBhcNpVFhdpi2ldqsrWWVqhjr7/imlmXz0taBMB9wNgJY58XkxAXN1ocd3EcCU+zc0t+Pru25eWgkMnUMhSNH+mG6F1bbmmspauxFKwZaRecXtb78IRI1n/0vkGlVjcYVPId1WyGALddJEmzNgwMlnNy4lXfftXvVB2JnY3Ae43FLYIgHEZBCFO4JenczXe93mAfaEdZ0KORI1OpOlF1D0jzcqUHb553yexpY86/DC66CUgRwziEnMNfxcZooh9mX11xVha0z5p0KVfMODdt/bKWlpaKPizIKkxO6iR9rY7W3pkpEWFAKBAUc+K3SjQshQG52WyXthnKbE8tuHoRAbjPok80Us3+RZxYcNTGWy39tkMu3eynp+Mt97lhIGYoQCBBAjFz0lipd6FSNdBTlFMlKapqyDUfRpJTopQoynl0djJxCBBMfdsX/99VXfwhCPAPBfg1UIZCxJXSTzPRbplIgB9MCAuL9+OBy9Ju4C6ZAnWZUjagYUBauVu9YN46osLmxwsEnIB/KJEsVu0zKeS5Dd0l2WrDjDS4Q4hbHSBPal0h5PiEYngk1gqHLOlc5Uug96HoFj4EXAVJyz8qJ0+WZyxD+4XdXtDGZ/bO7rxq/fLJ546ffefLTyTEXSg8/c1nEUu7Gyho+6yd3xLEiyNvTF6SuH7SDaTP0lkOubC17H3/+tTnbr0V4OzQ4+VRzDtKucmkMsqkyFXGu2A+hHIOQbjNg61mylgk4riE3Eq/pcPibMxgPpx9Dl7DFMovBGEpsGoVy+U2g0qqbei2ayX2TqVZWiJFO/GKTXNv4mJxFL4QFD6sc34+hfCx/Q//ZRRAMM9GERLGQyyclD5jn25f+VodTggBftdeM+o8gCjSl3eYrHKFTlYp261wzlpNpAgP+ERSLK+92o/jCI64d+VQbFOpK3bptdPxGrazf/4L9IEA8RNz59zaT6/cZqTBOKDPtTfQbXfojfIfnoT3PA0IXjl2dgPDhzkUe3JBMe/V2+fF89fOAxBMvyPysknXdJTu09WWP8ezEH4ex/gDvoKxt2S4yMxt60NhVBxlPaQIwAeCcLfGEoemdp6AvxIaQtIjR6zWIzrG4C33DV80QAwAiLj6RaPKVVabpzJqjCqbbNAgUb7/fiOzb3sJCPHFDUYhoH6wrXBLjS6Bv+YPgQAEB0RdlJSYXqo7al1weQZ3iIJ/OarjYN5ayz4dhVslA/qK1DmMjUeEh3ZEjZuh7dTsuOTC40SU55p6GxvLmQXeGRDDFQP+x8JzdPAUbBaLXP3jzC01KlmFrLLSeAOb5jI/QPjr0XWHg5J84CCnIMRXJLh3c8tHOgsfMemCexEQPJUpydeUtuhKm5r295DTPSAbj2cXlV18fU2WVDc+zOfP3xpIdB7u7bLRkegdbzwcocB5HBPmF+wHa6450ni03DagVyGvrLBcMfuxm256/iwEuFt4QllVljbLzMIQTi7IJ/zhSDZdobOUHvzItHv/+seZVl5aXh7rOqLTyNXSPZUTOdb64DGRE+sGG6xE8nuBCEjrMNF3aEfjgnuBGLxOU8wvB/JhgR8sI/2GIVeH0/QFOqehRrZ8wbTH4Fl+Fh0dTSBudTv1WzNpmTmaUxLtg29A5Jx5FZikuw0tX365V6OvNDq6a/IOMjN5BaMDiPFwaLxeoSwzrOQPfKIeT+0wNNkOqVcmEeJNnb9n787Dmq7jAI6/B+M+BATE0MQDSUjSSkMtTTvVSkutLO2+7L7v+356erqedo/dkw0GO4ANBGWQgAIpl6AZKB3SoWTZ8fRf9XSX4EAatO319x6e38b2+32/n+/nGKy4cZEQByAImcRNN11KsbW4vKm0Ql6gQSOvPePGNcxJiIL/bvEz6Upl0fsmTZVlDZ4LZSbn10s35W3eIn1vk21nfolCypVLCeENhkSA58IWiZQHy47wFxMhcf31Oz79kC9335PBSUDgyG/wN0TigdgJTF9czhe7v+wq0DttUqVBr9ex4BGCACL5DwnXoi5p7TDLUxmU8zhhZ25uiTgX8t4rEokrH2XygwxR3KC+j2erTSqN+18ng7XsLlMsXzYpsFActDhSiATiiOWiFWXltRpq2fYl2gKFTD534TpIwAuiqap07K7Ul+VMwjOhCIDbVuxW5ue/n5/3wQcflLxfJLnnacKjGIrIuFDGEs5JQgEeucOhMGiMxPA7YdKqZ0t721pczVl3B4beD5nw1Ohzb+qy1dsrHaZWjUa/a/ktKxcsnQVBgFeOUWfeSa6Yw/XteCqE85+QKz6mrjBfws49e15b5ZZ3XPVoxpnEhg31rrhi3soZeEyJhYv5zctw7fYPNdovi7MeOy86EMYZsuefv+zawxIKDV0H+6hyczGcmP1MFN4TPX3TVuXhQj657VwGFAqkAGSxr75LtGuXoW+novGWhatjE+9etqSg2lBgPeOmV4QMUhzPcG1Nz4E2I3fhkdi5LWpLMwkAEPzA1du0BXwqu/rsCQQMykSYCAIS4MoTyrd9W09dgV5ZUFBbmrWU56LwPufG1oY8OjLfOeacPJYyr7j9IFK7Xm6xaHaWXpFOLAAhTy1yV8jZMYR88OCzS40te9EWHDDOwCOZdoO8eckYQCA86bambZRvsxrTp1xCgOci+F0iM9CWy53yArmq7cCO4iPT1pHIiEhYKaY1n49lsxiIcMJ951vL9u3+AcVek7qDAi089UcKzkTCWdltberk81VBwMTBTD7qre455LA5evbf7NETdvZVtVrkaWNCBYxZtZjy0u79+6544EQChpD3cMmYjGvlXXWgNevZKztw+fyMO04kElKIx8sEpCzVFUr6cFT0e8VxQoCry7RmrZZGJzp9QfnirFkTEuOT/xo9CV/96KK0zP2dZ3Ld4ApYqDl0yCbequ4+QhDHFnv9IfZqlhPMK1ds/9Tqbu8+jTmB3fNgBxMD8cC96EWOur7D1Msli85+cXZiiBDiGCF3qxuo/ExSd85JR+07IWDS7Wsvo6a3Wm6hrtGyU6HYs+QUwpn670BMMLHAohcvwXPC26vbeg6JJUVqd7dHXXKDZlTnYZdexmOX0V62wwWJcYE606GIjuVq989Z8vWHDfqbFz5CYnBcCkAyExkRKaTlisStko0Vf49UC3776Uw4JafJWnVga4lI5JA65LK0C2bwXFTkVEI5uuRTB1vBUtPWZqe17oQvPAozRk3fmy+y6YxnUFP8RYsri8BCcZCSiYCQO2Cx1erWbtPLRUseeSkxbBxAXCgj6Sx1g+pwn4SFxPA7AQIglhvTXGVlFfqDH4Nc7rTsnpueeC7DLCGjvdmpqKvlJs/+9HpTnspWXbO9mAPWk085N3DwPATBpF5z8xdf7CjtLG3JSV9NNuNIjmCEU+Cn8tjH+eJWkU3bDQCR45IBomH9SgVyuV5mwSlHKluRNh2PCBichDOPtHe7z18bjmfEebmS6v0tVXvc6Y8FRusOybK5278os1K6bcmCs2aPoqFzs5erG/KLNm52QyS/eo4F02TkmlTqz9QqmdSCTrFk1ttJIfw3Tn0KQEgKHoh82pbbkFuia6tgAwGDFMol0c+wSLF7m8btyoHxo2qGQ2hU+q5CEyLTJxcLBUwMmX0HF8y9mWKdpEh0uEiil6KT38Ls8aNlzHwUeRsLya1qTntgtFzS/0UkMH7WDE64uQCYm84zQNxoSq+LH/uEJHcjIt10gmDh90dcLqPZKt+69bCpMjdfo10+/xESR83hWghXNXzUINF9s39DoKHnYIubYxh7abGruLv8FjLW3B0OQMSoalie8PD7DbZClMy44Ylayo2yMr1FtGWLFIO2gHmPkxTNqDHpBkw/Lyhyd33zSOCuOAiREUDU2Oevde8oNcqyyPb2IlHgwTWSTNTaXbl5H3z1/qaS99ik0W/eiU6nlijN89MfgaRRlfoy+bIWlXjTxqK8nfvOCtwWB2n8Td+7jmjM8nlnz45GgNdFcizxvHJmB1u3bOGrIrGBuj4KRRS1tqa9GBsSQsroSku9tLxcZHp/Y0PJrv2Pj6oLG81CgXghzOvs7OxevoAkRkQKKQwgJlk4E85R/vjBe0XvN5RAXj5dWuTSy1MhiGESBzDz6TEcpxO5tFhrdfL+pk0b7bI1BHhmHMLs07mos/j70uWpZON1AgCChET0mwj5ICex9nJFx1cq8ko6OnJLfnx/45a9VZuXQFIQw2Umq+Z1Wps+rF0xLeNEjkPSDX12s9kqU5z8XgkKUcaoWjyMWqEEx5K6snYbzUYyTmcERMIk1t42fRWJZBPzr4m1wkkvZVzE+fPsbEEiEet2Ojqqit4rMd254PG7k05lOMRDXBi3Z5Z9Wm4GTWZ6BschiqzGVomliszVE+7ZYhDVryTg2J6JHc/zB63bjK6c01Y/x0gQAKyg3L35yawbCAeYCBDBy5AwhjXpHGkqP7Jvt1KqMpC3RVKCumTTBx+kETRsSxRCTkpammN0Gynbb11x2pRohkwQGbKeLrq6tssgmPl1B+tVFgKOJZv0K1Z8Vy6rcDUvIBsEjIQIAG1xAS17MJ42ASKCQ8JnMpkzWbpyscbYbaS5ydijNztsShsbNzV8tUm6SaJeFMLxi2EiKUGxd5x2/hNltS3W0hb3orMeAyYKGKrYm76zqHI7LE9mEAWI1Lt2yV4kYEBTWf/kjk8/K9fKNPMJZwRNvnSvo0dR7fiYA+0158z/uQFJWi0rrMXIFHt75FRUNB3Y076v6QAa3eXnfFCyqYFNueKs8FCGQTQsuhzqtZZ6mavl4TuyAUKP40Pl6+3yz7UsWZ0gBKahe4+K2wnolwAIerRM21JBvSzr4kkvI2CEjCOeWqkOm+gQW6vIRS/TyfLVDumuj6Xk7hLZpVL7AUNbS+++/UtmbHguhJMri/JFJuqP/5LDYieN4WoXpc5GUaG6YvEpDyQFh04FAUMV/PSrYHGWtiyGGAB6KnVUzCJgAM9wQek2ba/ceMW68YyoeOGFBSKbDaWqkvfzinQOHbmbGpTiInFDfsMWMSrVe3t7s1i3gfFzQuNhVb5po81ATQbHJSosdu3VObi624steq2DtLVrgoQcl5Qwrv18u1zr7H6YOfyq+WNRfVl6MAH9CeKCMow1mRfxEmECRlb0RdhMlep8SaVYIhYX5X6U3ycpyqeBg4jUCuRXTbvxxXOFb0YmA8BjIiX5hY62NIZKAELuu+lel9xoVMgVCkX7yYtACAiO81nzwnZNrWWXntlR/K7uYFfBtEBQp1/jV53crFXumc7k0XA6NedKl65KbNtZ9F5RrrgovzK/sA8cuhIROlkVt64jPCyYv7hcujV/C22lpw952/4gZ0JZQXlZAQqFVsqtTBqWZc9bP+zWyqvm3vW36fqOxi/nJRJwVEE8pEAm/47zRsek9uhZHJDV7CQX3isSF+3UGbrQySoUzFtw/4tJCcH/qE5MuLWjEhE13UON4Lwc/ug1Ghl6vV4md9TUXM6aOQyHsfd++4W2w8jap/nDlGaHfbcscywBR5XqkuvtiltWJ46OdLDQieEsvXPz/n2bP9nJBx0lm3UdLbjOYRkIswEiQ/mbZc07xSLVdtIRDOWmGPvUSq0KUX39ob0tbTy8Yfap8ZDC8QrmBTBjMZ42hj+NrbHb+wg4igjGXHhNp7HKqbl81qhaw8xmAQ/f+vCtty64dcGsl5adxfijJvAIIohkysmKSlWhiIcT8JzgtwPGbLDusEvENmXX3p49969JDI5geFz9pbxMZlk86zz+YszcApWhvnQKAf8UtHqeu7gcWDZhVGVsA9Gx5wZFZwcFAQgBiDjqZiIlktSOPEyF1UxhcCKCGZuauU2hNxSqHJtb2h5ek0A8gjhCOW4zwWnRmpc/wN/E5mBTMzfwjP6XsbisO2r1hvTHgkfHUvEPE//WzysO6L+BsYD6htxKJT2rBzMDCRLJWC5X6HLr1VvUOx29l78IxEEcx084+cptzs18umJWEH+XZqFSeoSAv0lm5kNHXKWasvl3ZDN6hQJTGVAQSPLFJXvwRAQx4wCSmN5plEkhT9Jnt8vltxIMMJXhMPPSgs8au+TTHuAfoq9w2kXcHAh2/90l5LjdNGVtmBM8WipChig4o6RQwkcfLCRe4EE+IkScOntDWqnLWNHl+LgVU4cs7UbmMGyEcKjm8MHaqwniH6IzUKtl1tTAPOi/ymZ3QSM56xgNIcXjtCZX3CCu1N3CgCKZmvLb6zOuUir0Cpu93rETqdSyYGwIw+iVaw02ZUHTirOyQ/mXFjGmsvlB//Of/3Aac8oVervaMsNHOv9VAYUO2WpCjxnDeYMz3aISxHliSYPaoLNoVsx4IJF4iGOYTL7QZGJ3251nP8NRtNhakeWcRAAAiZwyj+L9FZnLfKR3waRpmPpMDsXSkBj6EQ9vXkLIHauucBlbHGJxg7hVsrVKJW+ePiWaYTXlfLsJUc35/bRz7FWCkwAAsmMvPAOrW7NjGqMtjjNEE6PX7RVvLNRrs8Lp1+SMtWtTn9xMS/snup1isdr0UXUjve5FcxCkwDiGy3XXaw4ePlTQdl8wR3O69ZBIRJkvrIyO33kZuPcbXU0w3kda/8UAIlUJhj0u+nd6Z5Orpb0dLVKFSq+W7lLIte4FjzDcnt7OLnPtpyv7u9Z7etVKmZFApk4y566y7rday2G8MB5fMTV2YQGig7TfSH8iMPYcQCLK7ahWdEiR6szltQtJCI6IYHhdapU7S61p9CM5vfojkVmeTkD2baUaq7l4CVNJwZfolSKDXnNFIv0QUtrWJvoIsZi8ioq2CvOO5Y8z/J9ByPNUK3WlzxPN0QVdtldcqNbMD7SOCL4dKzqZzxWiRa+rMKgkKsWd/b8ivblalGsS5yPq0DXv+37RBiCCZIbVxNu/o9FpSaNfCakGk6RDvpCAJ93bd8jm43vK1BTaKr6k33vdzOex2UyqotxdFVLjNIKEEMrwK5BpZe7VwQL6VWOq1Bec5iPbxiETzuRTXJn4nvjxmWqT0mRvuV0Yj4CjukErpVWMqKKW05IAiGOYnXiPWmrRGy8IZwDVKptDgZ87cdmlxZTmAKMsEeL4xZElkogNqvJ+ptYTCZOn04alpd1NeiIAKQy3u/u2oC13DTwpZq8dkeLOJL8+BYy9cNt213c+ulCJnqHJF7dW9i4Jp1/hsB+mpa4Jgf9ibLkgBKVki77zgnABA5hrsDXojvhz1piQ1M7tblKT8EECwGwqlBgOnDEJEAzQd/zibJgIMJFhN/YE5XvoIJoBTMqsU6mrik/HX6XAwiZXqWs6PirupDRJoVhkNz4QxUDC+O+WKMGrJKp8g3wVA0nmyTpTJTL8Uygp0Szu3Ocunu8jqRBHJVG19tF8PyNm7ApTkUFUBgIGEIJaLHXuuXj0dOD3ohgmhkGTy7142QQfPnlapxJLKkUtaeMBASNh7QGtKV8xP5EBhWVsFVeqZEzFL50KijLXXN8+A33MXGmqFO3WEwECRsDMJyx6SjsfjWJAyZgkv6S3+WFyRAQkrq+XyvUnrx5VhX7DbrZVUdmqtPM4I2StAW35jvTYZI7B1IehepVv/zf6cVLqzWUWmpb6eKQ/cYkUcYNKuig8hpEwAbVKvmcFxzTFVSdRMM/3grzHEAkhS90nlDWn+Xq1T0TIrc6uPkOfYlp4BCNhtVQklX96bRLHlNYH8uVj8EPdnUbjBYTh48Ie0dSbkChzzmUkRKxSqKq2f3FDNscSfYGyr9V5s98FGAUPri+14p4Po2b603/mAbmqr9UgNY7QW71Sq0T7Oe9yDDFhGTaJUuG6GD/z4GrK3O7l+IPzcqRUHmb7Y0AyXncVjdLdV53Hsd1nE7XqOBt/cw3uMm736WDO7xLmy+sMBx2sO5WRIHc2lnVeiAdWH7KJ5a51PlLh4anY+U20t82IjfGHQUsJCyx2k03admt4HF4XnrVXZWk3cmwxTBFvKVR1+0rhm4eCbuvsxnUa/uGSR1RqkY2exXMYAQapzlyBJ+IRfVSpki3ypyqDCO7a3vRJd+pM/INgTaeDQ/S4SMb7inUOnewdPDFGIzY55POzR9e8wv+UcD1WrBdNxm9kYrMhanlKmIKXvTnDqTdIjXjk3OWFJr1syWT/yaYNu+8EudHYif945p76QyZxTc2sKLztuukyqV7WgkfCkNiUZTn4jeD1lMrKujOy/ScfJHuRCPGW3poROOpNuKigXmW4OgGPrK2stMtXjMdvXNMps+4gFv8RtKAHpamtYiHeN1cjktpTg/FMoRirCz8RMfnaHTtwz8OfRG3o6VKLt9oXJ+F1GrnaUvYInlkv7qurPeJjzRL6ExE7w1pDk3u9P8VTY3jMSV9fPpmTiJ+KNwlfP4xFq1gnxAMCASplfkVBup9kMF5ssdTUcOEc/Mp1WY68rq5W5RQB3pW4Uisza8vWBeOJmPEHRCqFJhW/MDbH1XKoebG/1T0GZ4gaKlUmFd42GbO5HjbgoYJCpcFyhV8cvMTS3dnc1rvML46h/2pDbmWhmK3pIXjXzMYCNE4m4JkxmYfUdnmOXzy17mpStDS3ZflR0OBX49jVIFEWKuedi5fptU5twQwi8Uh2Vp1KofWLjfTTmU0WajJ9P2PxX2ZLEVXmq8x342Vmp0YlzyIGzyxVKpXyMnxf0hW09PQW4ycxg786V1eXX9in0m8Iw6uedsi0zoqHz4vBI3HLsNfJi1f7/oH02qbS3poa/CUl4q/mgETVUKdfRzzedIdTLldoScJDt9tESo0s1ec3L0EXtTQVN7WlR+NvIginalcrhlqIw6ucFrmuOmd8KB6qERnMioW+P0W6k+aePef7creSfgWdJnWAmgUheJdC5pTJLjoJD005tOWgypzj86WAj7rkjuIeIvxw60LU2XV1DaJ66YLsZLxpzM0fHvxScemJeCYUth6Uai2+vl7MvqfX7miZdyL+Zxzx1FNXd1g/jRS8adJifvhQj8eiV6oblfX4eing6XOxKw74/rL46GZndlXu/lp78nnxeFPCSvNhc8VmPCVMlRhUDuuyYJ9uHRF0Wa80r5pl+GMfqzhAvbFVKTsZ7wo/v9Hs1G9fL8RDLxWipoKwOHzY2DNQ5uplvn73P7pkQhaIdkkMVYzHqxLTdiqdlBKFZ8ahNqFr99F+1X9oalaqHSvG+/iquD8h850UgnVCKN4UfZnOrK5WLArHcwfrduf4dFAnewa9Frn0amLwT+lGpclkN0IE3vSoHZPEcMZsPCMIzyosRHGV707uFRAJxdi/tM7AD7+MkQCnNFugrhhv0xQWKgtZLwzFI9GL9ipF6mKfDuqMOadd5qSUSJ9+l/0ZB2fVImlt5TEm4lUuDCZRTUYYHhGQgbJRW/YAPuy6lW16mQ4/pjGbVBLN2VF412WmQqWShSfimXh6bQZ1z9m+XGYQCzq9+Tv812aLuOGjT9OD8bIuicHGGXhsn0Sp6LkfHzbm8haZhhOe9sPgIhADuJ0SZWPtdLwrMvEqRAp9KR6KOX1PXavIOQ1fFQN0ljc2mm/xt0KX34TCHS3mSnGX7DK8bNK15IrMrjOD8cyYvSoM5swkX95i7jigcHI+/quTPpFk+5lheNmjakedpnTeSSDAA+NrJfld9u/xZeU7tHLzbfgnQTxnuTAhqX0Ub5s8T2pu1Lrx0KQcdSv1RnzaATl23x4qNBDhKaUyg7JBgddFLXVaDhdwZhACPHGagTol6/BhpS36XhG+HCoYiCAo3ar/SNLKHePwtrE/sXfnQVGXcRzH38sNCiIiJommadnpXdmdZ3ZYdpqaZoedGnZflkeHTncze6/sARrLcm+sbCAIsbIrxCGiOCwlGsey4rS1BgP/VNOhlVelsvvbff3DDH8x8/ux+zzf7+f5PpcqtYb0BvoTzqnopIiaSe8iWKP2INfrffdzEbIsheKdzj6IKQVea65HbmYUCZwadTLEIFx5RhM8iu+MmTxKNASO+UavUqXYPqUPLCvQ58hsS6M4RWIZVUI+ZnCF2aBRLsBXvTDOWPxVUlfDKAjnLOv3gOJ7khqNN8ZwchFR06UqTFvuFu4RuSiqyg1yK2H4qHH5mkN0uekLgy8u3K5WcZh+kZzcGIlEumnbzQJ+Uq/QZtJZ8EnRwDu79LkSRwvhnH2hF8rEquxSXhzEqSiTpso2LRmMcP1IY5mxYzm+ZwjAy/mmcrXCTJ+YzC4Tko0pF3EqSlN3muR5CNewK2pb08jD5+Y6QQhEAuLvdbLXRyGiT2TpMz6Xbud8wjmJCZ1JqnQF9yBU0QEX0JbduIlXfG+aTiQQOseka1C1LhwBCZx9oSBXbWTn0pGc1GAypMnKbwQ8ETT6uvy2ttJvWIJvusiZQw6EwUDOOhHBs/NNB8SSxuvvCSaSExp+HmKU+aOFu5GGO1vLUyz5VbwwxPfmRjD8Bl29usFCP/pGOFP1qNWmqsobOYmA2Skq9IqbBHwVWxBZloP2/KxEH7rv6ih3pSeVbzfODqOvTLgNRSOlzXnjAzihfuNbk3OSlPFCnk67ZmonKWXNLT52DycACTOv16Uoc82zo+grESOnoU8V59Q+BkM4kVEcUNXLDELuvPBUa634ULtjtS8mJNa8IVclqXaNCwiBSPrITUZJCrqa8wARxxeLujBTrX8PARs2vVLcgLNqPb4lHKIHkFxe/t0eouk7IvK3Z3cmZXHzYE4klBIpUt2TCNntxraU702b4j8QcH/peK43qcWlF9OnAi/QHhKLa/fl3TWYE+okVawW8iCTcKJuyKmoaMjr+ATfM1WerKhbOpy4EPpOzOxcsY5NVM4eQSTHE0lpKrDlBYRszSWqctOWw12MwIdEEs4qRbqpgDn9IZI+FDMpOR19aW3N/GEc3wDEGRXUImwTnjUa2WS1rg0D35ogIcey1fYqfW3snE3mnOa6umZiOa6oN7IzUrMRvIUGs7Gu6hMfK+w89KxSIdM41iAaQh+7sa6urLOss+aJKI4n5i61WCrdhcB9zOsGTUV6y03Lg/ERImDYxZRX2K8E+nxaedQkKJN2ltbeMOC4f8u4TlL319yI0D19JRUNRtsb+MrLGAmgP4Cc28KIHEgfix48rjQjOzu1be9VBEdzbGX7VWUl1yBskYQSbzG07mGdD2W8A86VSBAbLwjGA2YPJ8TSmJKRRNpG3WsTOZYIStIy6uX3IXjBNGuaW6laRig+YtjFqWmpMN5TbnC/igwkYnFmNQEcy1C9TJdbLOzhEb+bXYqtw8ECBnjKwzmz5i5KOpTZ1OBBJ89GGzJ2sqNCXHMdx3BOzHTlfiXbhN15+c0ENLV57S6bOZFAXyjszFisSuWga+kMPEQQd5Y0ZqdKDzTveyqAf5p4fTIqzZaX8AEDlrS25plt8S3rfCInMUqrKtyfY73dkyqqUw3lSUWU7Nt2zKndV9enKvX50+YifP2Z2mbMs/dQmSj0ReMQEKFUZxSqz/OsgX/LKpLKdY054hpW/CPqHfDIl9JUWcGlUfiESVa7o6vb5Voi8Kp3NATfgLJIbbrbo/q7gczaVVMtQyWuZ1Ug0Ryt35itZWxWMhFfMGTEknZHT3c39veFXmiMmGzQKguKK/Eww8hP1kk2qnUl3B5AHEeJozhjB9KtQ33jNEjwcpfL1eF2291uRgp40SgiaFyWQosHmjLmYpkuUyKW6fZeF8XRIgbpJBxM1d3rQQvcM2kKC6kyO+29GzYkIuQzZ5ehN5G1xwPDIAFM2y3OSWJr7tZrJvAXU2XSQ+Kiq4W9fjrioUFr9xjbu+zdGzYIOtC4MinJpP/pWU+81ixuwtX56TJVcn0J9624nCMCzy2WZEozBD6e9mhBy3HZ47vdLfQKtCEYDoOnHyjBvIkgD2j//VPUHNJTqqkr3sojQzniwZK0MtK2vo3PCHhiXXtWg7Oqq8eVSKjnfYmdBqHU75eqa8+DcDxPCDHjjcXklhXJSraOXoGI3w0rSc6Qgi90Xn4XGTuYxU47Vndv9yeEgfAGnITNy0lLU+/z3LuKA2+/QlNMUVq2bN8P/Cn21lwp2fIxAt5V/lPAtTgNeteGXro/HBQI4cIqI/QfT6ZEImGGx16yJIJncyXZhRKS+fbBoUH85pJSynQ1PtEFPBIzDebm7ZV7HK5et2O9AOd5XyzLkCYpxn/kyXf3jFj0DEXS/VJJ/b77+d2itiJVasGlw/Ap5we/ckel3Wazuru6Hn5TWGvG/iuzc8WGmqvxaCEBMx8plaUlfS45sPWKVQDwNPWovqzBp8QxkLu3mDUVFT29PV2fcFmoJwROT4dImDxdXfJtzaVAn+e5T2zs46W6ryVp1Bdsea0/wGSU0gx2vyaQZ3GKQuCt62blW1u6u7u7HA4h5b0D5xxKU+2tWeUNMc2XZLuR1JP8HauGAFEX69L2p20VeFrg2G62V2F3uLp7XXyINzy7UxCIQZyWorneE8vc/zDzOeVu3YHC/Xu//XYVMHZZmUS6uXqakKeNHYsIhgSvnHXYatW093Z39XyIIGZcRfJGLmJl8dtesiN7GZ2sMKWktLbmyQhirq7OFktlNffie0LeHYTR2uHo7v6lQb3hQ8Lo85PE/885A4OfSD9YhnGMt+SQYp5/hkPi/SWdTXtX8Nb4zM8zk9ILfPFdBFi5sAOnq8vV29uzjrFB3rylFsHEazN0ya0WL5rXEsfjXzdJN1YfaLuPAFKyv6AeoayX/q0gWO3ASXdvd5d9Pd69n+7/VJNOqjBmedXDfOg5tZii4k4WXcal0jSKdJMux0cFszTe2dXb7ehyON7/gH7e/Dqep5NK6/LPBbzmFkQRw+7LTaremL1ZegsV+yWFhbuFsXT/10QAMSyxu3F2dW2gI5GRQXhyw+J4BkIAhu8rGrRX4VU9zTieNO0u/qp645eZKWlpaUiqfaza/TeXPbp4j8PucPX0dLkTGY5X6nfPFo00w34rb3lZ+mj4NZRIMzKkmZslUnVG2pe6p/Ft86xV2yrtbrerYzVeWfo+n2U2tBWmB/EyImZM21silWbweVomEgnFT/rCwdTjimPwWvLII8uG2/4JXnY4SwRwk9WobVW+PNcTQ4snc6u8nmxxoViilqRJ5I9P9MZV0uk0+cJ17Vpju9vlwPE+jMWLiBj0oqFtU1vtJXij8BX7ZHwtlbIxVyItNI32iq7RGRXEnKnlFU6NydbebnevJ8qLSt8TFloKKhrylz3tJQ2Xv1tUUKJEkpapkxbuKPlmMn6wdHV5ub6i3WnvcjsS8Yb7skQAzEsuVFU0F6ya66059cd1jUglfLFj44767273qWz38QyfzDKnQWXUdPfYLa5Er9jFhDCMQlBt3+UdkYjjaKtrVMsKM/dvlHGuL0Z1jqHf87Q3aNB00U1P94d4vIGEXaCS7txZ+L1zBV7sGUpJypXu2Fi09RnfrHYfwwDmd4Dd3dPb0wO8GeCZB+qOWG7MkfzyLhqu8+JayMAgnqnTJRVKPs8u2vvtIiFPUvh3xkK8xuLu6e7pxfX+B549mCyUrILc1Ixy2WsxeC8RPFlTrS7MTMtk866t+P0pZuWL8Q6Xw073Bno++YAZHrk/TYC42Gs1+gaVSi6/0MvaLX8nir0GSeaOTEnmV6Vb7pvh4SckzqbAobx6SbyzwUzXBjawnrEeGH4RET744SaVkgalcfYUL49fiqC0bLNEsjmzqNi4TYDnM/+XmQ/e5nK1d/T8ErXt7loHYf08qGAi4hyAeUmbU7OT0Jw7E28XwZi9Rft/KeoUVTdvmz2FEK/KeJxp/Vg5n7wut7slvpsWeyJvhnnUv2swi0lCLJXzqDAOiZRIiyQpqdK2mk3b3vGW1NtZEREBRLHUUbnlcPuv85V7HKvv8qBWdcLwC7WWFBVpatNt3v+pCDCKRqlEnE3p3u9mTcDvKCEQDryziPc7sNm7uqClZd1aPGP6/AvMz6rsFBdmFqZfI4xXkcHntVFdlPvdpht89czLCYiAOAJnwB17qr7paHBaHdAxjxGh9KGBIILlVelabVMDaQWTZnr1BvqI/qu4b29p3bcPCmPFcbqJzgFgJtz9us1s0FR1YD9sfeNh1oRCeHgEfSAEolbRYtGaGkiu4zVv7vz91dyY2LenffeSv+1yPBH8YXRVfJU5Kzne0RJvB8Y+RN8IePquFnLT9Tp5Qfy8CULrUbz9vL8dfXIjOZf0Jqu+Oc/q6nA61z3KoADOrnAiAy9b/nq5OCUpV6lU3HHdcAYKLHka6BHLcc8V8eePex+5c3u73op5jxuHbfXayzjLRrLEQJFEurNcpp/2vNA+FP3+lRFMarPYzNh/neDYu/jhtQwIi+ZsOJ9QHli4h/SkjNRUDKwUyP7Z77+L5aJZm5IN2pSUCnt8R3vLgoefgomcce8OuHaxRpotIVlbZ9tywyj8fJooGmDuzFFzlm0/uP1Qit5m62i3drjnryWKMypg8hNXImenBLWmbstN44Wzffb778IBAhhzwyyN1lBDi6XK5aI9/sUnGDQ8iHAiON0GRkbBnnyDPlmlymA72+4HIAI/v9+qYVMYcwfkZ3W4wW3vsNtXJ65lUFgQp9tk1uX9aFTY0KpSFJr0ZddN8bdr/f7hndsWW+2ODre7yeywV2GxLZu3nMFRoadt/x4M851WhVGBXCvTp+8y3nfR0CB/vM/vaCIgGmJncO9ss9OKy97ebj1YodXanAvWsRbC/l9zBSCYp+c3NFiaDlpAT7leU3nTA8O8OcDtdyaJhsBcFk2at/59lyOrqcnQdLDBmmc7nLdu3rUMGBkWGBQ9EIDwkCNLyXAIBxFA+J+/Dec3IuKAicNh+fyKhoPlygPJjSTLUWyZOv/lNUGAd81v8jt7wgECw2LHDr350mZtipZGY63JGR+fh42FzwKTGTFieD84X3SMOCwkADAESEAEDISRcPOLBqvNIP6ephy0jUZN2533vho1YyIibz0D7Xc2iQJH3Tt7lq0qy2hs1ZqaU3IsKU7a2+1VC9bNS/wAQkmAfkFAdAIwhL8LCg0ePnbkZB5egtmarj1IOZ1NdbU1xrzXZ+Plo0r9zq64EEIHM+e565/ZZjRrWsU5NDgPNrRr5Fk2J47V6wFe4T2AyWtGTglm5MixjB1x2aBBb74Jb/LKzY8mLmm35mnT9XKTUp2rUzWb65qNr19wC1H4+f1LkRDAIF6dNPXSUsQVhupkLFqFocFiwdFSgQOXiyprSzyrIXHB4oWLufJwi73r1zv/HfFWjcZsUCRjUlKfnoRaUWm9Y+m4UQ8FkgAirxxT6ucBZk6A596wWS17jPnJWBTQUNGOA1CkW8wKrc1m0WvNVVW2w/I8jcaKxm7JQ28yUYxJj1arle/WLrj/XniXBAD839J+/5UIAgY8/8CF515wpTmLLXnmPEtLt8vutKLIJ1+hycqXZ+kV2xRZCq0mH6XcXm5ARr6lsjTPaGHbrPmTVhBzZIMT4d89+/0vgf14t/+Mt29cNOaC+VdaFflkoc9ik1GpSId0oxy5XqPXp29vV8owGSDf6Fi8YAlzGBVLDJH8IQE/v9MUfgyYywtvTYx8YeJEPnt7zPWj77xz2hXTp583evTo6dpmPRVFupxkca7jxXETZsyMfag/xDEQIr3nTgI/LxUUFTtj2JoZQ4dOiZ0y89Vr75q1eNYsHn5q+fNHui4JgBAv/vfzWCFA6ESYOXMigR57Gb6fz4gDOEcEAOeDyL889OsT/jCin5+fn5+fn5+fn5+fn9/PGwUjHgAAWjN28lc3kUIAAAAASUVORK5CYII=" - }, - "drawer": { - "name": "Meridian Commodities Pte Ltd", - "address": "8 Marina Boulevard, #24-01, Singapore 018981", - "authorisedSignatoryName": "Wei Ling Tan", - "signature": "data:image/png;base64,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" - } - }, - "type": ["VerifiableCredential"], - "credentialStatus": { - "type": "TransferableRecords", - "tokenNetwork": { - "chain": "Sepolia", - "chainId": 11155111 - }, - "obligationRegistry": "0xE8c7516BD4FC64DF039BAA586035dfaA57520BE4" - }, - "issuer": "did:web:didhost.vercel.app", - "validFrom": "2026-07-06T09:00:00Z" -} diff --git a/src/utils/obligation-document.ts b/src/utils/obligation-document.ts index 92743d7..8298af5 100644 --- a/src/utils/obligation-document.ts +++ b/src/utils/obligation-document.ts @@ -39,11 +39,6 @@ export const extractObligationDocumentInfo = async ( ); } - if (!obligationRegistry) { - throw new Error('Document does not contain a valid obligationRegistry address'); - } - if (!tokenId) { - throw new Error('Document does not contain a valid token ID'); if (!obligationRegistry) { throw new Error('Document does not contain a valid obligationRegistry address'); } @@ -53,8 +48,10 @@ export const extractObligationDocumentInfo = async ( if (!chainId) { throw new Error('Document does not contain a valid chain ID'); } - if (!SUPPORTED_CHAINS[chainId]) { - throw new Error(`Document references unsupported chain ID: ${chainId}`); + if (!(chainId in SUPPORTED_CHAINS)) { + throw new Error( + `Unsupported chain ID in obligation document: ${chainId}. Use a BoE document on a supported network.`, + ); } const network = SUPPORTED_CHAINS[chainId].name; From 6dad862cfd0b040e7e888406d6547b95a784f72d Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Sat, 1 Aug 2026 01:17:05 +0530 Subject: [PATCH 15/40] Update README and command descriptions for obligation-escrowd --- README.md | 92 ++++++++++++++++--- src/commands/obligation-escrow/discharge.ts | 3 +- src/commands/obligation-escrow/reject.ts | 2 +- .../obligation-escrow/return-to-issuer.ts | 2 +- 4 files changed, 83 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index a312831..afd3f57 100644 --- a/README.md +++ b/README.md @@ -1419,7 +1419,7 @@ trustvc obligation-escrow accept **Interactive Prompts:** -- Path to BoE / obligation documentverify +- Path to BoE / obligation document - *Network, obligationRegistry, token ID, and document ID are extracted from the document* - Wallet/private key option - Remark (optional) @@ -1429,7 +1429,7 @@ Transaction receipt confirming acceptance. #### obligation-escrow reject -Rejects an obligation on the ObligationEscrow. +Rejects an issued BoE obligation (Issued → Rejected). Burns the title (takes it out of circulation). **Usage:** @@ -1444,11 +1444,11 @@ trustvc obligation-escrow reject - Remark (optional) **Output:** -Transaction receipt confirming rejection. +Transaction receipt confirming rejection (and burn). #### obligation-escrow discharge -Discharges an accepted obligation on the ObligationEscrow. +Discharges an accepted BoE obligation (Accepted → Discharged). Burns the title. **Usage:** @@ -1463,7 +1463,7 @@ trustvc obligation-escrow discharge - Remark (optional) **Output:** -Transaction receipt confirming discharge. +Transaction receipt confirming discharge (and burn). #### obligation-escrow status @@ -1487,7 +1487,7 @@ Obligation and escrow status fields from the chain. #### obligation-escrow transfer-holder -Transfers the holder of a BoE obligation record. Transfer, nominate, endorse, return, and reject variants mirror `title-escrow` but operate on ObligationEscrow via `obligation-escrow `. +Transfers the holder of a BoE obligation record. Nominate, endorse, transfer-owner-holder, and reject-transfer variants mirror `title-escrow` but operate on ObligationEscrow via `obligation-escrow `. **Usage:** @@ -1495,7 +1495,6 @@ Transfers the holder of a BoE obligation record. Transfer, nominate, endorse, re trustvc obligation-escrow transfer-holder # Also: # nominate-transfer-owner, endorse-transfer-owner, transfer-owner-holder -# return-to-issuer, accept-return-to-issuer, reject-return-to-issuer # reject-transfer-holder, reject-transfer-owner, reject-transfer-owner-holder ``` @@ -1509,6 +1508,73 @@ trustvc obligation-escrow transfer-holder **Output:** Transaction receipt confirming the escrow action. +#### obligation-escrow return-to-issuer + +Returns the BoE obligation to the issuer. Same rules as classic ETR: the connected wallet must be both the current beneficiary (owner) and the current holder. + +**Who Can Execute:** +Both the **current holder** and **current beneficiary (owner)** must execute this together, or the entity that holds both roles. + +**Usage:** + +```sh +trustvc obligation-escrow return-to-issuer +``` + +**Interactive Prompts:** + +- Path to BoE / obligation document + - *Network, obligationRegistry, token ID, and document ID are extracted from the document* +- Wallet/private key option +- Remark (optional) + +**Output:** +Transaction receipt confirming return to issuer. + +#### obligation-escrow accept-return-to-issuer + +Accepts a returned BoE (issuer burn / shred). + +**Who Can Execute:** +Only the **issuer** (wallet with accepter role on the obligation registry). + +**Usage:** + +```sh +trustvc obligation-escrow accept-return-to-issuer +``` + +**Interactive Prompts:** + +- Path to BoE / obligation document +- Wallet/private key option +- Remark (optional) + +**Output:** +Transaction receipt confirming acceptance (burn). + +#### obligation-escrow reject-return-to-issuer + +Rejects a returned BoE and restores it to escrow (issuer restore). + +**Who Can Execute:** +Only the **issuer** (wallet with restorer role on the obligation registry). + +**Usage:** + +```sh +trustvc obligation-escrow reject-return-to-issuer +``` + +**Interactive Prompts:** + +- Path to BoE / obligation document +- Wallet/private key option +- Remark (optional) + +**Output:** +Transaction receipt confirming rejection (restore). + ## Configuration @@ -1699,7 +1765,7 @@ Using classic commands on a BoE document will fail or skip obligation checks. Us 2. Put the registry address into your BoE credential status 3. Sign the credential with `trustvc w3c-sign` 4. Mint (issuer wallet) -5. Accept or reject (holder) ──► optional transfers / discharge / return +5. Accept or reject (holder) — or transfer / discharge / return as needed 6. Verify with `trustvc verify` ``` @@ -1713,15 +1779,15 @@ Signing/building the VC can also be done with TrustVC library tools or your app **3. Mint** — `trustvc obligation-registry mint` with the signed BoE JSON from `w3c-sign` (registry, network, token ID, document ID are extracted). -**4. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. Reject only sets status to Rejected; closing requires return-to-issuer afterward. +**4. Accept or reject (holder)** — `trustvc obligation-escrow accept` or `reject` while **beneficiary ≠ holder**. Accept moves Issued → Accepted. Reject moves Issued → Rejected and burns the title. **5. Status** — `trustvc obligation-escrow status` reads `Issued` / `Accepted` / `Rejected` / `Discharged`, registration, and termination reason. -**6. Transfers (optional)** — `obligation-escrow transfer-holder`, nominate/endorse/return variants mirror `title-escrow`. +**6. Transfers (optional)** — `obligation-escrow transfer-holder`, nominate/endorse/reject-transfer variants mirror `title-escrow`. -**7. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted (sets Discharged; does not burn). +**7. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted (sets Discharged and burns). -**8. Return to issuer** — requires status **Rejected** or **Discharged** and **beneficiary == holder**; then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). +**8. Return to issuer** — same as classic ETR: **beneficiary == holder**, then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). No Rejected/Discharged status requirement. **9. Verify** — `trustvc verify` (auto-detects BoE vs ETR). @@ -1735,7 +1801,7 @@ Signing/building the VC can also be done with TrustVC library tools or your app | `obligation-escrow accept` / `reject` | Holder (roles split) | | `obligation-escrow discharge` | Beneficiary | | Transfer / nominate / endorse | Current holder or beneficiary per Title Escrow–style rules | -| `return-to-issuer` | Dual role (beneficiary == holder) | +| `return-to-issuer` | Dual role (beneficiary == holder), same as ETR | | `accept-return-to-issuer` / `reject-return-to-issuer` | Issuer | | `obligation-escrow status` | Anyone with the document + wallet/private key (read-only) | | `verify` | Anyone with the document (+ RPC when on-chain checks run) | diff --git a/src/commands/obligation-escrow/discharge.ts b/src/commands/obligation-escrow/discharge.ts index ae32702..9539ddb 100644 --- a/src/commands/obligation-escrow/discharge.ts +++ b/src/commands/obligation-escrow/discharge.ts @@ -12,7 +12,8 @@ import { promptBaseObligationEscrowInputs } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'discharge'; -export const describe = 'Beneficiary discharges an accepted BoE obligation (terminal Discharged)'; +export const describe = + 'Beneficiary discharges an accepted BoE obligation (Accepted → Discharged, burns)'; export const handler = async (): Promise => { try { diff --git a/src/commands/obligation-escrow/reject.ts b/src/commands/obligation-escrow/reject.ts index 40ea341..1a956f5 100644 --- a/src/commands/obligation-escrow/reject.ts +++ b/src/commands/obligation-escrow/reject.ts @@ -12,7 +12,7 @@ import { promptBaseObligationEscrowInputs } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'reject'; -export const describe = 'Holder rejects an issued BoE obligation (terminal Rejected)'; +export const describe = 'Holder rejects an issued BoE obligation (Issued → Rejected, burns)'; export const handler = async (): Promise => { try { diff --git a/src/commands/obligation-escrow/return-to-issuer.ts b/src/commands/obligation-escrow/return-to-issuer.ts index 2f534f6..5dcd6b8 100644 --- a/src/commands/obligation-escrow/return-to-issuer.ts +++ b/src/commands/obligation-escrow/return-to-issuer.ts @@ -12,7 +12,7 @@ import { promptBaseObligationEscrowInputs } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'return-to-issuer'; -export const describe = 'Return a BoE obligation to the issuer (requires dual role)'; +export const describe = 'Return a BoE obligation to the issuer (dual role, same as classic ETR)'; export const handler = async (): Promise => { try { From a5534dcf3691e7ae9725a832fc8192836c875d1b Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 12:50:35 +0530 Subject: [PATCH 16/40] Update @trustvc/trustvc dependency to version 2.16.0-beta.1 and add tests for verify obligation command --- package-lock.json | 8 +- package.json | 2 +- tests/commands/verify.obligation.test.ts | 131 +++++++++++++++++++++++ 3 files changed, 136 insertions(+), 5 deletions(-) create mode 100644 tests/commands/verify.obligation.test.ts diff --git a/package-lock.json b/package-lock.json index 29c40c5..a694315 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "2.15.0-beta.3", + "@trustvc/trustvc": "2.16.0-beta.1", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "dotenv": "^16.0.0", @@ -5548,9 +5548,9 @@ } }, "node_modules/@trustvc/trustvc": { - "version": "2.15.0-beta.3", - "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.15.0-beta.3.tgz", - "integrity": "sha512-EFiYmXZulyWnq+g3tb/yrpANkggE76QjDILuNE/68ZWdh9cw8yUxR+hcrqkk8tbhapmgulzQjtTuuASnuD1xog==", + "version": "2.16.0-beta.1", + "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.16.0-beta.1.tgz", + "integrity": "sha512-sXklxfioSrIV+ZyuYsyPy+WMbgOPcRweJTd2Tklg8ZdF/tQlb2yVHDTPLycSNI3YOilpRhKn9p0Y2hSJxTuRRw==", "license": "Apache-2.0", "dependencies": { "@tradetrust-tt/dnsprove": "^2.18.0", diff --git a/package.json b/package.json index 93c3156..a38b155 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ }, "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "2.15.0-beta.3", + "@trustvc/trustvc": "2.16.0-beta.1", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "dotenv": "^16.0.0", diff --git a/tests/commands/verify.obligation.test.ts b/tests/commands/verify.obligation.test.ts new file mode 100644 index 0000000..cadc915 --- /dev/null +++ b/tests/commands/verify.obligation.test.ts @@ -0,0 +1,131 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { ObligationDocumentStatus, ObligationEscrowTerminationReason } from '@trustvc/trustvc'; +import { getObligationDocumentStatus, verify } from '../../src/commands/verify'; + +vi.mock('signale', () => ({ + default: { + success: vi.fn(), + error: vi.fn(), + warn: vi.fn(), + info: vi.fn(), + }, + Signale: vi.fn().mockImplementation(() => ({ + await: vi.fn(), + success: vi.fn(), + })), +})); + +const verifyDocumentMock = vi.fn(); + +vi.mock('@trustvc/trustvc', async () => { + const actual = await vi.importActual('@trustvc/trustvc'); + return { + ...actual, + verifyDocument: (...args: unknown[]) => verifyDocumentMock(...args), + isObligationRecord: vi.fn(() => true), + isTransferableRecord: vi.fn(() => false), + isDocumentRevokable: vi.fn(() => false), + isWrappedV2Document: vi.fn(() => false), + isWrappedV3Document: vi.fn(() => false), + getChainId: vi.fn(() => 80002), + }; +}); + +vi.mock('../../src/utils', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getSupportedNetworkNameFromId: vi.fn(() => 'amoy'), + getSupportedNetwork: vi.fn(() => ({ + provider: () => ({ getNetwork: async () => ({ chainId: 80002 }) }), + })), + CaptureConsoleWarn: (fn: () => unknown) => ({ result: fn(), warnings: null }), + CaptureConsoleWarnAsync: async (fn: () => Promise) => ({ + result: await fn(), + warnings: null, + }), + }; +}); + +const shreddedObligationFragments = [ + { type: 'DOCUMENT_INTEGRITY', name: 'W3CSignatureIntegrity', status: 'VALID' }, + { + type: 'DOCUMENT_STATUS', + name: 'ObligationRecords', + status: 'VALID', + data: { + obligationRegistry: '0xRegistry', + // Reject/discharge/accept-return burns to 0xdEaD; SDK still reports minted (VALID), + // same as classic ETR shredded titles. + status: ObligationDocumentStatus.Rejected, + terminationReason: ObligationEscrowTerminationReason.Rejected, + }, + }, + { type: 'ISSUER_IDENTITY', name: 'W3CIssuerIdentity', status: 'VALID' }, +]; + +describe('verify obligation / BoE (shredded titles)', () => { + beforeEach(() => { + vi.clearAllMocks(); + verifyDocumentMock.mockResolvedValue(shreddedObligationFragments); + }); + + describe('getObligationDocumentStatus', () => { + it('returns registry status for VALID ObligationRecords after shred (rejected)', () => { + expect(getObligationDocumentStatus(shreddedObligationFragments as never)).toEqual({ + obligationRegistry: '0xRegistry', + status: ObligationDocumentStatus.Rejected, + terminationReason: ObligationEscrowTerminationReason.Rejected, + }); + }); + + it('returns registry status for VALID ObligationRecords after discharge shred', () => { + const fragments = [ + { + type: 'DOCUMENT_STATUS', + name: 'ObligationRecords', + status: 'VALID', + data: { + obligationRegistry: '0xRegistry', + status: ObligationDocumentStatus.Discharged, + terminationReason: ObligationEscrowTerminationReason.Discharged, + }, + }, + ]; + + expect(getObligationDocumentStatus(fragments as never)).toEqual({ + obligationRegistry: '0xRegistry', + status: ObligationDocumentStatus.Discharged, + terminationReason: ObligationEscrowTerminationReason.Discharged, + }); + }); + + it('returns null when ObligationRecords is INVALID (unminted / zero owner)', () => { + const fragments = [ + { + type: 'DOCUMENT_STATUS', + name: 'ObligationRecords', + status: 'INVALID', + reason: { message: 'Document has not been issued under token registry' }, + data: { obligationRegistry: '0xRegistry' }, + }, + ]; + + expect(getObligationDocumentStatus(fragments as never)).toBeNull(); + }); + }); + + describe('verify', () => { + it('treats shredded BoE as DOCUMENT_STATUS VALID and logs obligation status', async () => { + const signale = await import('signale'); + + await verify({ id: 'urn:uuid:shredded-boe' } as never); + + expect(verifyDocumentMock).toHaveBeenCalled(); + expect(signale.default.success).toHaveBeenCalledWith('DOCUMENT_STATUS: VALID'); + expect(signale.default.info).toHaveBeenCalledWith( + 'Obligation document status: registry=0xRegistry status=2 terminationReason=2', + ); + }); + }); +}); From 2c88be0620abfb9b371d728f08d340fb01cedef8 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 13:46:41 +0530 Subject: [PATCH 17/40] Enhance obligation escrow command handlers and improve error handling - Refactored command handlers for various obligation escrow actions to utilize a shared execution function, reducing code duplication. - Improved error handling to ensure proper exit codes on transaction failures. - Updated README to reflect changes in command usage and prerequisites for Node.js version. --- README.md | 11 ++-- .../accept-return-to-issuer.ts | 13 +---- src/commands/obligation-escrow/accept.ts | 13 +---- src/commands/obligation-escrow/discharge.ts | 13 +---- .../endorse-transfer-owner.ts | 13 +---- .../reject-return-to-issuer.ts | 13 +---- .../reject-transfer-owner.ts | 13 +---- src/commands/obligation-escrow/reject.ts | 13 +---- .../obligation-escrow/return-to-issuer.ts | 13 +---- src/commands/obligation-escrow/runTx.ts | 4 ++ .../obligation-escrow/transfer-holder.ts | 13 +---- src/commands/obligation-registry/deploy.ts | 45 +++++++++++---- src/commands/obligation-registry/mint.ts | 12 +++- src/commands/verify.ts | 56 +++++++++++++++---- src/utils/cli-errors.ts | 22 +++----- src/utils/cli-options.ts | 7 ++- tests/commands/verify.test.ts | 37 +++++++++++- tests/utils/contract-errors.test.ts | 10 ++++ 18 files changed, 184 insertions(+), 137 deletions(-) diff --git a/README.md b/README.md index afd3f57..ec278d5 100644 --- a/README.md +++ b/README.md @@ -49,11 +49,11 @@ BoE on-chain helpers are imported from the **root** package (`mintObligationRegi ## Prerequisites -- **Node.js 22+** — Download from [nodejs.org](https://nodejs.org) or use [nvm](https://github.com/nvm-sh/nvm): +- **Node.js 22.19.5+** — Download from [nodejs.org](https://nodejs.org) or use [nvm](https://github.com/nvm-sh/nvm): ```sh -nvm install 22 -nvm use 22 +nvm install 22.19.5 +nvm use 22.19.5 ``` @@ -305,7 +305,6 @@ trustvc verify | | `[oa-decrypt](#oa-decrypt)` | Decrypt an OA document encrypted with oa-encrypt | | **Token Registry** | `[mint](#mint)` | Mint tokens to blockchain registries | | | `[token-registry deploy](#token-registry-deploy)` | Deploy token registry contracts | -| | `[mint](#mint)` | Mint tokens to blockchain registries | | | `token-registry mint` | Alternative: `mint` | | **Document Store** | `[document-store deploy](#document-store-deploy)` | Deploy document store contracts | | | `[document-store issue](#document-store-issue)` | Issue document hashes | @@ -1513,7 +1512,7 @@ Transaction receipt confirming the escrow action. Returns the BoE obligation to the issuer. Same rules as classic ETR: the connected wallet must be both the current beneficiary (owner) and the current holder. **Who Can Execute:** -Both the **current holder** and **current beneficiary (owner)** must execute this together, or the entity that holds both roles. +One wallet holding **both** the current beneficiary (owner) and current holder roles (`beneficiary == holder`). The CLI signs with a single wallet; there is no separate holder/beneficiary co-signature flow. **Usage:** @@ -1738,7 +1737,7 @@ You do **not** need to call the TypeScript SDK directly — the CLI wraps it wit ### Before you start 1. **Install the CLI** — `npm install -g @trustvc/trustvc-cli` or `npx @trustvc/trustvc-cli ` -2. **Node.js 22+** +2. **Node.js 22.19.5+** 3. **A wallet** — encrypted wallet file (recommended), private key, or key file 4. **A signed BoE document** — set `credentialStatus.obligationRegistry`, then sign with `trustvc w3c-sign` (not `tokenRegistry`) 5. **Network access** — select network in prompts, or set a custom RPC (e.g. `export SEPOLIA_RPC=…`) diff --git a/src/commands/obligation-escrow/accept-return-to-issuer.ts b/src/commands/obligation-escrow/accept-return-to-issuer.ts index eefdc55..fd2d57f 100644 --- a/src/commands/obligation-escrow/accept-return-to-issuer.ts +++ b/src/commands/obligation-escrow/accept-return-to-issuer.ts @@ -8,21 +8,14 @@ import { NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'accept-return-to-issuer'; export const describe = 'Issuer accepts a returned BoE obligation (burn / shred)'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await acceptReturnedHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, acceptReturnedHandler); export const promptForInputs = promptBaseObligationEscrowInputs; diff --git a/src/commands/obligation-escrow/accept.ts b/src/commands/obligation-escrow/accept.ts index 49adc7d..928b253 100644 --- a/src/commands/obligation-escrow/accept.ts +++ b/src/commands/obligation-escrow/accept.ts @@ -8,21 +8,14 @@ import { NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'accept'; export const describe = 'Holder accepts an issued BoE obligation (Issued → Accepted)'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await acceptHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, acceptHandler); export const promptForInputs = promptBaseObligationEscrowInputs; diff --git a/src/commands/obligation-escrow/discharge.ts b/src/commands/obligation-escrow/discharge.ts index 9539ddb..0f95297 100644 --- a/src/commands/obligation-escrow/discharge.ts +++ b/src/commands/obligation-escrow/discharge.ts @@ -8,22 +8,15 @@ import { NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'discharge'; export const describe = 'Beneficiary discharges an accepted BoE obligation (Accepted → Discharged, burns)'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await dischargeHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, dischargeHandler); export const promptForInputs = promptBaseObligationEscrowInputs; diff --git a/src/commands/obligation-escrow/endorse-transfer-owner.ts b/src/commands/obligation-escrow/endorse-transfer-owner.ts index 3166d5c..06e556b 100644 --- a/src/commands/obligation-escrow/endorse-transfer-owner.ts +++ b/src/commands/obligation-escrow/endorse-transfer-owner.ts @@ -9,21 +9,14 @@ import { promptAddress, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'endorse-transfer-owner'; export const describe = 'Endorse / transfer beneficiary (owner) of a BoE obligation'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await endorseHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, endorseHandler); export const promptForInputs = async (): Promise => { const base = await promptBaseObligationEscrowInputs(); diff --git a/src/commands/obligation-escrow/reject-return-to-issuer.ts b/src/commands/obligation-escrow/reject-return-to-issuer.ts index f810a53..18b0089 100644 --- a/src/commands/obligation-escrow/reject-return-to-issuer.ts +++ b/src/commands/obligation-escrow/reject-return-to-issuer.ts @@ -8,21 +8,14 @@ import { NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'reject-return-to-issuer'; export const describe = 'Issuer rejects a returned BoE obligation (restore to escrow)'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await rejectReturnedHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, rejectReturnedHandler); export const promptForInputs = promptBaseObligationEscrowInputs; diff --git a/src/commands/obligation-escrow/reject-transfer-owner.ts b/src/commands/obligation-escrow/reject-transfer-owner.ts index 0ecdbf0..38845d0 100644 --- a/src/commands/obligation-escrow/reject-transfer-owner.ts +++ b/src/commands/obligation-escrow/reject-transfer-owner.ts @@ -8,21 +8,14 @@ import { NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'reject-transfer-owner'; export const describe = 'Reject a pending beneficiary transfer on a BoE obligation'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await rejectTransferOwnerHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, rejectTransferOwnerHandler); export const promptForInputs = promptBaseObligationEscrowInputs; diff --git a/src/commands/obligation-escrow/reject.ts b/src/commands/obligation-escrow/reject.ts index 1a956f5..05270a2 100644 --- a/src/commands/obligation-escrow/reject.ts +++ b/src/commands/obligation-escrow/reject.ts @@ -8,21 +8,14 @@ import { NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'reject'; export const describe = 'Holder rejects an issued BoE obligation (Issued → Rejected, burns)'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await rejectHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, rejectHandler); export const promptForInputs = promptBaseObligationEscrowInputs; diff --git a/src/commands/obligation-escrow/return-to-issuer.ts b/src/commands/obligation-escrow/return-to-issuer.ts index 5dcd6b8..63f8257 100644 --- a/src/commands/obligation-escrow/return-to-issuer.ts +++ b/src/commands/obligation-escrow/return-to-issuer.ts @@ -8,21 +8,14 @@ import { NetworkCmdName, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'return-to-issuer'; export const describe = 'Return a BoE obligation to the issuer (dual role, same as classic ETR)'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await returnToIssuerHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, returnToIssuerHandler); export const promptForInputs = promptBaseObligationEscrowInputs; diff --git a/src/commands/obligation-escrow/runTx.ts b/src/commands/obligation-escrow/runTx.ts index d8218c1..5cb8cce 100644 --- a/src/commands/obligation-escrow/runTx.ts +++ b/src/commands/obligation-escrow/runTx.ts @@ -59,6 +59,10 @@ export const runObligationEscrowTx = async (opts: { }, }); + if (shouldProceed === null) { + process.exitCode = 1; + return null; + } if (!shouldProceed) { return null; } diff --git a/src/commands/obligation-escrow/transfer-holder.ts b/src/commands/obligation-escrow/transfer-holder.ts index c3a1aa1..c92cb41 100644 --- a/src/commands/obligation-escrow/transfer-holder.ts +++ b/src/commands/obligation-escrow/transfer-holder.ts @@ -9,21 +9,14 @@ import { promptAddress, TransactionReceiptFees, } from '../../utils'; -import { promptBaseObligationEscrowInputs } from './shared'; +import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; import { runObligationEscrowTx } from './runTx'; export const command = 'transfer-holder'; export const describe = 'Transfer the holder of a BoE obligation record'; -export const handler = async (): Promise => { - try { - const answers = await promptForInputs(); - if (!answers) return; - await changeHolderHandler(answers); - } catch (err: unknown) { - error(err instanceof Error ? err.message : String(err)); - } -}; +export const handler = async (): Promise => + runObligationEscrowCommand(promptForInputs, changeHolderHandler); export const promptForInputs = async (): Promise => { const base = await promptBaseObligationEscrowInputs(); diff --git a/src/commands/obligation-registry/deploy.ts b/src/commands/obligation-registry/deploy.ts index 3c6cc55..5afe615 100644 --- a/src/commands/obligation-registry/deploy.ts +++ b/src/commands/obligation-registry/deploy.ts @@ -1,6 +1,7 @@ import { error, info, success } from 'signale'; -import { CHAIN_ID, deployObligationRegistry } from '@trustvc/trustvc'; +import { CHAIN_ID, deployObligationRegistry, v5Contracts } from '@trustvc/trustvc'; import { input, confirm } from '@inquirer/prompts'; +import { ethers } from 'ethers'; import { displayTransactionPrice, getErrorMessage, @@ -28,6 +29,7 @@ export const handler = async (): Promise => { await deployObligationRegistryContract(answers); } catch (err: unknown) { error(err instanceof Error ? err.message : String(err)); + process.exitCode = 1; } }; @@ -109,18 +111,38 @@ export const deployObligationRegistryContract = async ({ const wallet = await getWalletOrSigner({ network, ...rest }); const chainId = supportedNetwork[network as NetworkCmdName].networkId; - const shouldProceed = await performDryRunWithConfirmation({ - network, - getTransactionCallback: async () => ({ - to: await wallet.getAddress(), - data: '0x', - from: await wallet.getAddress(), - value: 0n, - }), - }); + // Dry-run only when the registry deploy tx can be populated (factory address known). + // When the factory is deployed first, skip estimation and report fees from the receipt. + let shouldProceed: boolean | null = true; + if (escrowFactoryAddress) { + shouldProceed = await performDryRunWithConfirmation({ + network, + getTransactionCallback: async () => { + const factory = new ethers.ContractFactory( + v5Contracts.TrustVCToken__factory.abi, + v5Contracts.TrustVCToken__factory.bytecode, + wallet as ethers.ContractRunner, + ); + const tx = await factory.getDeployTransaction( + registryName, + registrySymbol, + escrowFactoryAddress, + ); + return { ...tx, from: await wallet.getAddress() }; + }, + }); + } else { + info( + 'Skipping dry-run gas estimate: ObligationEscrowFactory will be deployed first. Fees will be shown from the receipt.', + ); + } + if (shouldProceed === null) { + process.exitCode = 1; + return null; + } if (!shouldProceed) { - process.exit(0); + return null; } info(`Deploying obligation registry ${registryName}`); @@ -145,5 +167,6 @@ export const deployObligationRegistryContract = async ({ return result.obligationRegistry; } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-registry/mint.ts b/src/commands/obligation-registry/mint.ts index 9997df1..7b4eb4d 100644 --- a/src/commands/obligation-registry/mint.ts +++ b/src/commands/obligation-registry/mint.ts @@ -33,6 +33,7 @@ export const handler = async (): Promise => { await mintObligationToken(answers); } catch (err: unknown) { error(err instanceof Error ? err.message : String(err)); + process.exitCode = 1; } }; @@ -82,6 +83,7 @@ export const mintObligationToken = async (args: ObligationRegistryMintCommand) = ...args, tokenId: addAddressPrefix(args.tokenId), }); + if (!transaction) return; displayTransactionPrice(transaction as any, args.network as NetworkCmdName); success( @@ -93,6 +95,7 @@ export const mintObligationToken = async (args: ObligationRegistryMintCommand) = return args.address; } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; @@ -105,7 +108,7 @@ const mintToObligationRegistry = async ({ encryptionKey, network, ...rest -}: ObligationRegistryMintCommand): Promise => { +}: ObligationRegistryMintCommand): Promise => { const wallet = await getWalletOrSigner({ network, ...rest }); const shouldProceed = await performDryRunWithConfirmation({ @@ -123,8 +126,13 @@ const mintToObligationRegistry = async ({ }, }); + // null = definitive dry-run revert; false = user cancel — do not process.exit(0) + if (shouldProceed === null) { + process.exitCode = 1; + return null; + } if (!shouldProceed) { - process.exit(0); + return null; } let transaction; diff --git a/src/commands/verify.ts b/src/commands/verify.ts index 25d9084..2f1cdea 100644 --- a/src/commands/verify.ts +++ b/src/commands/verify.ts @@ -1,4 +1,5 @@ import { input } from '@inquirer/prompts'; +import { Argv } from 'yargs'; import { getSupportedNetwork, getSupportedNetworkNameFromId, @@ -6,6 +7,7 @@ import { CaptureConsoleWarnAsync, CaptureConsoleWarn, promptNetworkSelection, + supportedNetwork, } from '../utils'; import { getChainId, @@ -33,6 +35,10 @@ type ObligationDocumentStatusInfo = { terminationReason?: number; }; +type VerifyOptions = { + network?: string; +}; + /** Extract obligation registry info from a VALID ObligationRecords verify fragment. */ export const getObligationDocumentStatus = ( fragments: VerificationFragment[], @@ -57,12 +63,20 @@ export const getObligationDocumentStatus = ( export const command = 'verify'; export const describe = 'Verify a W3C or OpenAttestation document (ETR, BoE, or revocable VC)'; -export const handler = async () => { +export const builder = (yargs: Argv): Argv => + yargs.option('network', { + alias: 'n', + choices: Object.keys(supportedNetwork), + description: 'Network provider when document chain lookup fails (skips interactive selection)', + demandOption: false, + }); + +export const handler = async (argv: { network?: string }) => { try { const signedVC = await promptQuestions(); if (!signedVC) return; - await verify(signedVC); + await verify(signedVC, { network: argv.network }); } catch (err: unknown) { signale.error(err instanceof Error ? err.message : String(err)); } @@ -85,12 +99,12 @@ export const promptQuestions = async (): Promise => return signedVC; }; -export const verify = async (signedVC: SignedVerifiableCredential) => { +export const verify = async (signedVC: SignedVerifiableCredential, options: VerifyOptions = {}) => { const isOpenAttestation = isWrappedV2Document(signedVC) || isWrappedV3Document(signedVC); const { result, warnings } = isOpenAttestation - ? { result: await verifyOpenAttestationDocument(signedVC), warnings: null } - : await verifyW3CDocument(signedVC); + ? { result: await verifyOpenAttestationDocument(signedVC, options), warnings: null } + : await verifyW3CDocument(signedVC, options); if (warnings) { handleExpiredCredentialWarning(warnings); @@ -115,8 +129,31 @@ export const verify = async (signedVC: SignedVerifiableCredential) => { // ==== Helper Functions ==== +/** + * Resolve a network provider when document chain lookup fails. + * Prefers --network, then interactive prompt on TTY, otherwise no provider. + */ +const resolveFallbackProvider = async ( + networkOverride?: string, +): Promise => { + if (networkOverride) { + return getSupportedNetwork(networkOverride).provider() as unknown as V5Provider; + } + + if (process.stdin.isTTY) { + const networkName = await promptNetworkSelection(); + return getSupportedNetwork(networkName).provider() as unknown as V5Provider; + } + + signale.warn( + 'No network could be resolved from the document and this session is non-interactive. Verifying without a provider. Pass --network to select one.', + ); + return undefined; +}; + const verifyW3CDocument = async ( signedVC: SignedVerifiableCredential, + options: VerifyOptions = {}, ): Promise<{ result: VerificationFragment[]; warnings: unknown[][] }> => { signale.info('Verifying W3C document...'); @@ -146,8 +183,7 @@ const verifyW3CDocument = async ( signale.warn(`${err instanceof Error ? err.message : String(err)}`); } - const networkName = await promptNetworkSelection(); - const provider = getSupportedNetwork(networkName).provider() as unknown as V5Provider; + const provider = await resolveFallbackProvider(options.network); if (provider) { return await CaptureConsoleWarnAsync(() => verifyDocument(signedVC, { provider })); } @@ -158,6 +194,7 @@ const verifyW3CDocument = async ( const verifyOpenAttestationDocument = async ( signedVC: WrappedOrSignedOpenAttestationDocument, + options: VerifyOptions = {}, ): Promise => { signale.info('Verifying OpenAttestation document...'); @@ -168,10 +205,9 @@ const verifyOpenAttestationDocument = async ( // If the document is not transferable or revokable, verify directly if (!requiresNetwork) return await verifyDocument(signedVC); - // If chainId is not found, prompt for network selection + // If chainId is not found, prefer --network / TTY prompt / no-provider fallback if (requiresNetwork && !chainId) { - const networkName = await promptNetworkSelection(); - const provider = getSupportedNetwork(networkName).provider() as unknown as V5Provider; + const provider = await resolveFallbackProvider(options.network); if (provider) return await verifyDocument(signedVC, { provider }); } diff --git a/src/utils/cli-errors.ts b/src/utils/cli-errors.ts index 28f29a5..1693e6c 100644 --- a/src/utils/cli-errors.ts +++ b/src/utils/cli-errors.ts @@ -102,9 +102,12 @@ const normalizeLabel = (raw: string): string | undefined => { if (!cleaned || UNKNOWN_CUSTOM_ERROR.test(cleaned) || cleaned === '(unknown custom error)') { return undefined; } - // Drop leading junk like ": OwnerHolderMustDiffer" or parentheses wrappers - const ident = cleaned.match(/([A-Za-z][A-Za-z0-9_]*)/); - return ident?.[1]; + // Only accept a full-string identifier (e.g. OwnerHolderMustDiffer), not the first + // word of free-text reasons — those fall through to describeContractError. + if (/^[A-Za-z][A-Za-z0-9_]*$/.test(cleaned)) { + return cleaned; + } + return undefined; }; /** Labels after generic "failed:" — only known reverts or Solidity-shaped names. */ @@ -157,15 +160,9 @@ const labelFromRevertData = (err: EthersCallException): string | undefined => { export function extractContractRevertLabel(error: unknown): string | undefined { const err = asEthersError(error); + // Error instances are objects, so asEthersError always succeeds for them — + // free-text Error.message is handled below via err.message / labelFromWrappedMessage. if (!err) { - if (error instanceof Error) { - const fromExec = error.message.match(/execution reverted:\s*([A-Za-z0-9_]+)/); - if (fromExec?.[1]) { - const label = normalizeLabel(fromExec[1]); - if (label) return label; - } - return labelFromWrappedMessage(error.message); - } return undefined; } @@ -212,9 +209,6 @@ export function extractContractRevertLabel(error: unknown): string | undefined { export function isContractCallException(error: unknown): boolean { const err = asEthersError(error); if (!err) { - if (error instanceof Error && /Pre-check .* failed:/i.test(error.message)) { - return Boolean(extractContractRevertLabel(error)); - } return false; } if (err.code === 'CALL_EXCEPTION') return true; diff --git a/src/utils/cli-options.ts b/src/utils/cli-options.ts index 652cd1e..07ec98d 100644 --- a/src/utils/cli-options.ts +++ b/src/utils/cli-options.ts @@ -535,7 +535,8 @@ export const shouldRunDryRun = (network: string): boolean => { /** * Performs automatic dry run for specified networks with gas estimation and user confirmation - * Uses the existing dryRunMode function for comprehensive display + * Uses the existing dryRunMode function for comprehensive display. + * @returns `true` to proceed, `false` if the user cancelled, `null` if dry-run hit a definitive revert */ export const performDryRunWithConfirmation = async ({ network, @@ -543,7 +544,7 @@ export const performDryRunWithConfirmation = async ({ }: { network: string; getTransactionCallback: () => Promise; -}): Promise => { +}): Promise => { if (!shouldRunDryRun(network)) { return true; // Proceed without dry run for other networks } @@ -579,7 +580,7 @@ export const performDryRunWithConfirmation = async ({ if (isContractCallException(estimateError)) { error(`Transaction would revert: ${message}`); info('Transaction cancelled.'); - return false; + return null; } error(`Gas estimation failed: ${message}`); diff --git a/tests/commands/verify.test.ts b/tests/commands/verify.test.ts index ec7278d..e3c2d2c 100644 --- a/tests/commands/verify.test.ts +++ b/tests/commands/verify.test.ts @@ -1,7 +1,7 @@ import * as prompts from '@inquirer/prompts'; import fs from 'node:fs'; import path from 'node:path'; -import { beforeEach, describe, expect, it, MockedFunction, vi } from 'vitest'; +import { beforeEach, afterEach, describe, expect, it, MockedFunction, vi } from 'vitest'; import { promptQuestions, verify } from '../../src/commands/verify'; import { SignedVerifiableCredential } from '@trustvc/trustvc'; import { @@ -237,6 +237,12 @@ describe('verify', () => { signaleSuccessMock = (signale.default as any).success; signaleErrorMock = (signale.default as any).error; signaleWarnMock = (signale.default as any).warn; + // Fixture tests exercise the interactive fallback path. + Object.defineProperty(process.stdin, 'isTTY', { value: true, configurable: true }); + }); + + afterEach(() => { + Object.defineProperty(process.stdin, 'isTTY', { value: undefined, configurable: true }); }); type TestCase = { @@ -331,5 +337,34 @@ describe('verify', () => { 'DOCUMENT_STATUS: ERROR - An error has occurred.', ); }); + + it('should not prompt for network in non-TTY when chain lookup fails', async () => { + Object.defineProperty(process.stdin, 'isTTY', { value: false, configurable: true }); + const utils = await import('../../src/utils'); + const filePath = path.resolve( + process.cwd(), + 'tests/fixtures/verify/oa/3.0/oa_dns_txt_token_registry_no_network_field_stability_v3.json', + ); + const signedVC = utils.readJsonFile(filePath, 'document'); + + await expect(verify(signedVC)).resolves.toBeUndefined(); + + expect(prompts.select).not.toHaveBeenCalled(); + expect(signaleWarnMock).toHaveBeenCalledWith(expect.stringContaining('non-interactive')); + }); + + it('should prefer --network over prompting when chain lookup fails', async () => { + Object.defineProperty(process.stdin, 'isTTY', { value: true, configurable: true }); + const utils = await import('../../src/utils'); + const filePath = path.resolve( + process.cwd(), + 'tests/fixtures/verify/oa/3.0/oa_dns_txt_token_registry_no_network_field_stability_v3.json', + ); + const signedVC = utils.readJsonFile(filePath, 'document'); + + await expect(verify(signedVC, { network: 'stability' })).resolves.toBeUndefined(); + + expect(prompts.select).not.toHaveBeenCalled(); + }); }); }); diff --git a/tests/utils/contract-errors.test.ts b/tests/utils/contract-errors.test.ts index 5712044..30154b8 100644 --- a/tests/utils/contract-errors.test.ts +++ b/tests/utils/contract-errors.test.ts @@ -64,4 +64,14 @@ describe('contract revert error formatting', () => { const wrapped = new Error('Contract reverted with OwnerHolderMustDiffer'); expect(extractContractRevertLabel(wrapped)).toBe('OwnerHolderMustDiffer'); }); + + it('does not extract a label from multi-word free-text reasons', () => { + const freeText = Object.assign(new Error('execution reverted'), { + code: 'CALL_EXCEPTION', + reason: 'insufficient funds for gas * price + value', + shortMessage: 'insufficient funds for gas * price + value', + }); + expect(extractContractRevertLabel(freeText)).toBeUndefined(); + expect(describeContractError(freeText)).toBe('insufficient funds for gas * price + value'); + }); }); From 54075d6927028dece6a2870d6777c66b94ae9d05 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 13:54:05 +0530 Subject: [PATCH 18/40] Update src/commands/obligation-registry/mint.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/commands/obligation-registry/mint.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/obligation-registry/mint.ts b/src/commands/obligation-registry/mint.ts index 7b4eb4d..928aff7 100644 --- a/src/commands/obligation-registry/mint.ts +++ b/src/commands/obligation-registry/mint.ts @@ -132,7 +132,7 @@ const mintToObligationRegistry = async ({ return null; } if (!shouldProceed) { - return null; + throw new Error('Mint transaction was not submitted.'); } let transaction; From 87c7d0faa7102992bd028619416eb6f252a4a5a6 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 13:54:41 +0530 Subject: [PATCH 19/40] Update src/commands/obligation-registry/mint.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/commands/obligation-registry/mint.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/obligation-registry/mint.ts b/src/commands/obligation-registry/mint.ts index 928aff7..a8171d0 100644 --- a/src/commands/obligation-registry/mint.ts +++ b/src/commands/obligation-registry/mint.ts @@ -93,6 +93,7 @@ export const mintObligationToken = async (args: ObligationRegistryMintCommand) = `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, ); return args.address; + } catch (e) { } catch (e) { error(getErrorMessage(e)); process.exitCode = 1; From 8a81dc15f994dc10cb3da9c4999ae6c073364b43 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 13:59:26 +0530 Subject: [PATCH 20/40] Refactor mintObligationToken error handling in mint.ts - Removed redundant error handling for mint transaction submission. - Updated error handling to return null instead of throwing an error when the transaction should not proceed. --- src/commands/obligation-registry/mint.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/commands/obligation-registry/mint.ts b/src/commands/obligation-registry/mint.ts index a8171d0..7b4eb4d 100644 --- a/src/commands/obligation-registry/mint.ts +++ b/src/commands/obligation-registry/mint.ts @@ -93,7 +93,6 @@ export const mintObligationToken = async (args: ObligationRegistryMintCommand) = `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, ); return args.address; - } catch (e) { } catch (e) { error(getErrorMessage(e)); process.exitCode = 1; @@ -133,7 +132,7 @@ const mintToObligationRegistry = async ({ return null; } if (!shouldProceed) { - throw new Error('Mint transaction was not submitted.'); + return null; } let transaction; From da13f560aed7c253aa5d49e4cf0d353bb3706f80 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 14:04:07 +0530 Subject: [PATCH 21/40] Update GitHub Actions workflow for release process - Removed the explicit registry URL from the release workflow. - Cleaned up environment variable definitions for NPM token usage. --- .github/workflows/release.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 918d69e..8862685 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,8 +1,5 @@ name: Release -# Publishes to npm on push to: -# - main → stable (@latest) -# - beta → prerelease (@beta), e.g. 1.2.0-beta.1 on: push: branches: @@ -43,11 +40,6 @@ jobs: name: Release needs: test runs-on: ubuntu-latest - permissions: - contents: write - issues: write - pull-requests: write - id-token: write steps: - name: Checkout code @@ -61,7 +53,6 @@ jobs: with: node-version: 22.x cache: 'npm' - registry-url: 'https://registry.npmjs.org/' - name: Install dependencies run: npm ci @@ -74,4 +65,3 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} From df96db5f3d88e20ceee32355336927fbef918c61 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 15:23:42 +0530 Subject: [PATCH 22/40] Add decrypted.json for driving licence credential and enhance error handling in command files - Introduced a new JSON file for the driving licence credential schema. - Improved error handling in various command files to ensure proper exit codes on transaction failures. - Updated README for better command usage clarity. --- README.md | 30 ++++++------- decrypted.json | 1 + src/commands/document-store/deploy.ts | 4 ++ src/commands/document-store/issue.ts | 4 ++ src/commands/obligation-escrow/discharge.ts | 42 ++++++++---------- src/commands/obligation-escrow/index.ts | 5 ++- .../reject-return-to-issuer.ts | 44 ++++++++----------- .../reject-transfer-owner.ts | 42 ++++++++---------- src/commands/obligation-escrow/reject.ts | 40 +++++++---------- .../obligation-escrow/return-to-issuer.ts | 42 ++++++++---------- src/commands/token-registry/deploy.ts | 4 ++ src/commands/token-registry/mint.ts | 4 ++ src/commands/verify.ts | 5 +++ src/utils/cli-errors.ts | 7 +-- src/utils/obligation-document.ts | 7 ++- 15 files changed, 141 insertions(+), 140 deletions(-) create mode 100644 decrypted.json diff --git a/README.md b/README.md index ec278d5..8c2adf0 100644 --- a/README.md +++ b/README.md @@ -342,13 +342,13 @@ trustvc verify | | `[obligation-escrow discharge](#obligation-escrow-discharge)` | Discharge obligation | | | `[obligation-escrow status](#obligation-escrow-status)` | Read obligation / escrow status | | | `[obligation-escrow transfer-holder](#obligation-escrow-transfer-holder)` | Transfer BoE holder | -| | `obligation-escrow nominate-transfer-owner` | Nominate BoE beneficiary | -| | `obligation-escrow endorse-transfer-owner` | Endorse BoE beneficiary change | -| | `obligation-escrow transfer-owner-holder` | Endorse full BoE ownership transfer | -| | `obligation-escrow return-to-issuer` | Return BoE to issuer | -| | `obligation-escrow accept-return-to-issuer` | Accept returned BoE | -| | `obligation-escrow reject-return-to-issuer` | Reject returned BoE | -| | `obligation-escrow reject-transfer-*` | Reject BoE transfer requests | +| | `[obligation-escrow nominate-transfer-owner](#title-escrow-nominate-transfer-owner)` | Nominate BoE beneficiary | +| | `[obligation-escrow endorse-transfer-owner](#title-escrow-endorse-transfer-owner)` | Endorse BoE beneficiary change | +| | `[obligation-escrow transfer-owner-holder](#title-escrow-transfer-owner-holder)` | Endorse full BoE ownership transfer | +| | `[obligation-escrow return-to-issuer](#obligation-escrow-return-to-issuer)` | Return BoE to issuer | +| | `[obligation-escrow accept-return-to-issuer](#obligation-escrow-accept-return-to-issuer)` | Accept returned BoE | +| | `[obligation-escrow reject-return-to-issuer](#obligation-escrow-reject-return-to-issuer)` | Reject returned BoE | +| | `[obligation-escrow reject-transfer-*](#title-escrow-reject-transfer-holder)` | Reject BoE transfer requests | @@ -1690,14 +1690,14 @@ src/commands/ │ ├── create.ts # Create encrypted wallet │ ├── encrypt.ts # Encrypt private key to wallet │ └── decrypt.ts # Decrypt wallet file -└── w3c/ - ├── did.ts # Generate DID - ├── key-pair.ts # Generate key pairs - ├── sign.ts # Sign W3C credentials - └── credentialStatus/ - ├── create.ts # Create credential status list - └── update.ts # Update credential status list - └── verify.ts # Verify W3C or OA document +├── w3c/ +│ ├── did.ts # Generate DID +│ ├── key-pair.ts # Generate key pairs +│ ├── sign.ts # Sign W3C credentials +│ └── credentialStatus/ +│ ├── create.ts # Create credential status list +│ └── update.ts # Update credential status list +└── verify.ts # Verify W3C or OA document ``` diff --git a/decrypted.json b/decrypted.json new file mode 100644 index 0000000..08c0000 --- /dev/null +++ b/decrypted.json @@ -0,0 +1 @@ +{"version":"https://schema.openattestation.com/3.0/schema.json","@context":["https://www.w3.org/2018/credentials/v1","https://schemata.openattestation.com/com/openattestation/1.0/DrivingLicenceCredential.json","https://schemata.openattestation.com/com/openattestation/1.0/OpenAttestation.v3.json","https://schemata.openattestation.com/com/openattestation/1.0/CustomContext.json"],"reference":"SERIAL_NUMBER_123","name":"Republic of Singapore Driving Licence","issuanceDate":"2010-01-01T19:23:24Z","validFrom":"2010-01-01T19:23:24Z","issuer":{"id":"https://example.com","name":"DEMO STORE","type":"OpenAttestationIssuer"},"type":["VerifiableCredential","DrivingLicenceCredential","OpenAttestationCredential"],"credentialSubject":{"id":"did:example:JOHN_DOE_DID","licenseNumber":"S1234567a","birthDate":"1977-02-22","name":"John Doe","class":[{"type":"3","effectiveDate":"2010-01-01T19:23:24Z"},{"type":"3A","effectiveDate":"2010-01-01T19:23:24Z"}]},"openAttestationMetadata":{"template":{"name":"DRIVING_LICENSE","type":"EMBEDDED_RENDERER","url":"https://tutorial-renderer.openattestation.com"},"proof":{"type":"OpenAttestationProofMethod","method":"DID","value":"did:ethr:0xE712878f6E8d5d4F9e87E10DA604F9cB564C9a89","revocation":{"type":"NONE"}},"identityProof":{"type":"DNS-DID","identifier":"example.tradetrust.io"}},"attachments":[{"fileName":"sample.pdf","mimeType":"application/pdf","data":"BASE64_ENCODED_FILE"}]} \ No newline at end of file diff --git a/src/commands/document-store/deploy.ts b/src/commands/document-store/deploy.ts index 8ad549f..f4a286f 100644 --- a/src/commands/document-store/deploy.ts +++ b/src/commands/document-store/deploy.ts @@ -133,6 +133,10 @@ export const deployDocumentStoreContract = async ({ }, }); + // null = definitive dry-run revert; false = user cancel — do not exit(0) + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/document-store/issue.ts b/src/commands/document-store/issue.ts index 9947f9c..e50c818 100644 --- a/src/commands/document-store/issue.ts +++ b/src/commands/document-store/issue.ts @@ -106,6 +106,10 @@ export const issueToken = async ({ }, }); + // null = definitive dry-run revert; false = user cancel — do not exit(0) + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/obligation-escrow/discharge.ts b/src/commands/obligation-escrow/discharge.ts index 0f95297..9b2583c 100644 --- a/src/commands/obligation-escrow/discharge.ts +++ b/src/commands/obligation-escrow/discharge.ts @@ -1,9 +1,8 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { dischargeObligationRegistry } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, TransactionReceiptFees, @@ -21,26 +20,21 @@ export const handler = async (): Promise => export const promptForInputs = promptBaseObligationEscrowInputs; export const dischargeHandler = async (args: BaseObligationEscrowCommand) => { - try { - info(`Discharging obligation token ${args.tokenId} on ${args.obligationRegistryAddress}`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.discharge.populateTransaction(encryptedRemark), - sdk: dischargeObligationRegistry as any, - sdkParams: { remarks: args.remark }, - }); - if (!transaction) return; - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Obligation ${args.tokenId} discharged`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - process.exitCode = 1; - } + info(`Discharging obligation token ${args.tokenId} on ${args.obligationRegistryAddress}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.discharge.populateTransaction(encryptedRemark), + sdk: dischargeObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Obligation ${args.tokenId} discharged`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/commands/obligation-escrow/index.ts b/src/commands/obligation-escrow/index.ts index 28969ed..58023da 100644 --- a/src/commands/obligation-escrow/index.ts +++ b/src/commands/obligation-escrow/index.ts @@ -6,6 +6,9 @@ export const describe = 'Invoke ObligationEscrow lifecycle / transfer functions for BoE obligation records'; export const builder = (yargs: Argv): Argv => - yargs.commandDir(__dirname, { extensions: ['ts', 'js'] }); + yargs.commandDir(__dirname, { + extensions: ['ts', 'js'], + exclude: /(runTx|shared)\.(ts|js)$/, + }); export const handler = (): void => {}; diff --git a/src/commands/obligation-escrow/reject-return-to-issuer.ts b/src/commands/obligation-escrow/reject-return-to-issuer.ts index 18b0089..058b73c 100644 --- a/src/commands/obligation-escrow/reject-return-to-issuer.ts +++ b/src/commands/obligation-escrow/reject-return-to-issuer.ts @@ -1,9 +1,8 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { rejectReturnedObligationRegistry } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, TransactionReceiptFees, @@ -20,27 +19,22 @@ export const handler = async (): Promise => export const promptForInputs = promptBaseObligationEscrowInputs; export const rejectReturnedHandler = async (args: BaseObligationEscrowCommand) => { - try { - info(`Rejecting returned obligation ${args.tokenId} (restore)`); - const transaction = await runObligationEscrowTx({ - args, - // rejectReturned restores the title, which lives on the TrustVCToken registry, not the escrow. - populate: ({ registry }, encryptedRemark) => - registry.restore.populateTransaction(args.tokenId, encryptedRemark), - sdk: rejectReturnedObligationRegistry as any, - sdkParams: { tokenId: args.tokenId, remarks: args.remark }, - }); - if (!transaction) return; - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Return rejected (restored to escrow)`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - process.exitCode = 1; - } + info(`Rejecting returned obligation ${args.tokenId} (restore)`); + const transaction = await runObligationEscrowTx({ + args, + // rejectReturned restores the title, which lives on the TrustVCToken registry, not the escrow. + populate: ({ registry }, encryptedRemark) => + registry.restore.populateTransaction(args.tokenId, encryptedRemark), + sdk: rejectReturnedObligationRegistry as any, + sdkParams: { tokenId: args.tokenId, remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Return rejected (restored to escrow)`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/commands/obligation-escrow/reject-transfer-owner.ts b/src/commands/obligation-escrow/reject-transfer-owner.ts index 38845d0..38d0f77 100644 --- a/src/commands/obligation-escrow/reject-transfer-owner.ts +++ b/src/commands/obligation-escrow/reject-transfer-owner.ts @@ -1,9 +1,8 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { rejectTransferBeneficiaryObligationRegistry } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, TransactionReceiptFees, @@ -20,26 +19,21 @@ export const handler = async (): Promise => export const promptForInputs = promptBaseObligationEscrowInputs; export const rejectTransferOwnerHandler = async (args: BaseObligationEscrowCommand) => { - try { - info(`Rejecting beneficiary transfer for obligation ${args.tokenId}`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.rejectTransferBeneficiary.populateTransaction(encryptedRemark), - sdk: rejectTransferBeneficiaryObligationRegistry as any, - sdkParams: { remarks: args.remark }, - }); - if (!transaction) return; - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Beneficiary transfer rejected`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - process.exitCode = 1; - } + info(`Rejecting beneficiary transfer for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.rejectTransferBeneficiary.populateTransaction(encryptedRemark), + sdk: rejectTransferBeneficiaryObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Beneficiary transfer rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/commands/obligation-escrow/reject.ts b/src/commands/obligation-escrow/reject.ts index 05270a2..7691b61 100644 --- a/src/commands/obligation-escrow/reject.ts +++ b/src/commands/obligation-escrow/reject.ts @@ -1,9 +1,8 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { rejectObligationRegistry } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, TransactionReceiptFees, @@ -20,25 +19,20 @@ export const handler = async (): Promise => export const promptForInputs = promptBaseObligationEscrowInputs; export const rejectHandler = async (args: BaseObligationEscrowCommand) => { - try { - info(`Rejecting obligation token ${args.tokenId} on ${args.obligationRegistryAddress}`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => escrow.reject.populateTransaction(encryptedRemark), - sdk: rejectObligationRegistry as any, - sdkParams: { remarks: args.remark }, - }); - if (!transaction) return; - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Obligation ${args.tokenId} rejected`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - process.exitCode = 1; - } + info(`Rejecting obligation token ${args.tokenId} on ${args.obligationRegistryAddress}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => escrow.reject.populateTransaction(encryptedRemark), + sdk: rejectObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Obligation ${args.tokenId} rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/commands/obligation-escrow/return-to-issuer.ts b/src/commands/obligation-escrow/return-to-issuer.ts index 63f8257..9937be5 100644 --- a/src/commands/obligation-escrow/return-to-issuer.ts +++ b/src/commands/obligation-escrow/return-to-issuer.ts @@ -1,9 +1,8 @@ -import { error, info, success } from 'signale'; +import { info, success } from 'signale'; import { returnToIssuerObligationRegistry } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; import { displayTransactionPrice, - getErrorMessage, getEtherscanAddress, NetworkCmdName, TransactionReceiptFees, @@ -20,26 +19,21 @@ export const handler = async (): Promise => export const promptForInputs = promptBaseObligationEscrowInputs; export const returnToIssuerHandler = async (args: BaseObligationEscrowCommand) => { - try { - info(`Returning obligation ${args.tokenId} to issuer`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.returnToIssuer.populateTransaction(encryptedRemark), - sdk: returnToIssuerObligationRegistry as any, - sdkParams: { remarks: args.remark }, - }); - if (!transaction) return; - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Returned to issuer`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); - } catch (e) { - error(getErrorMessage(e)); - process.exitCode = 1; - } + info(`Returning obligation ${args.tokenId} to issuer`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.returnToIssuer.populateTransaction(encryptedRemark), + sdk: returnToIssuerObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Returned to issuer`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); }; diff --git a/src/commands/token-registry/deploy.ts b/src/commands/token-registry/deploy.ts index 1cef3ff..833fed8 100644 --- a/src/commands/token-registry/deploy.ts +++ b/src/commands/token-registry/deploy.ts @@ -207,6 +207,10 @@ export const deployTokenRegistryContract = async ({ }, }); + // null = definitive dry-run revert; false = user cancel — do not exit(0) + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/token-registry/mint.ts b/src/commands/token-registry/mint.ts index 348705e..6cca090 100644 --- a/src/commands/token-registry/mint.ts +++ b/src/commands/token-registry/mint.ts @@ -163,6 +163,10 @@ const mintToTokenRegistry = async ({ }, }); + // null = definitive dry-run revert; false = user cancel — do not exit(0) + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/verify.ts b/src/commands/verify.ts index 2f1cdea..c149907 100644 --- a/src/commands/verify.ts +++ b/src/commands/verify.ts @@ -137,6 +137,11 @@ const resolveFallbackProvider = async ( networkOverride?: string, ): Promise => { if (networkOverride) { + if (!Object.prototype.hasOwnProperty.call(supportedNetwork, networkOverride)) { + throw new Error( + `Unsupported network "${networkOverride}". Valid options: ${Object.keys(supportedNetwork).join(', ')}`, + ); + } return getSupportedNetwork(networkOverride).provider() as unknown as V5Provider; } diff --git a/src/utils/cli-errors.ts b/src/utils/cli-errors.ts index 1693e6c..8b79b62 100644 --- a/src/utils/cli-errors.ts +++ b/src/utils/cli-errors.ts @@ -102,9 +102,10 @@ const normalizeLabel = (raw: string): string | undefined => { if (!cleaned || UNKNOWN_CUSTOM_ERROR.test(cleaned) || cleaned === '(unknown custom error)') { return undefined; } - // Only accept a full-string identifier (e.g. OwnerHolderMustDiffer), not the first - // word of free-text reasons — those fall through to describeContractError. - if (/^[A-Za-z][A-Za-z0-9_]*$/.test(cleaned)) { + // Only accept a full-string PascalCase Solidity custom-error identifier (e.g. + // OwnerHolderMustDiffer), not lowercase/free-text reasons — those fall through + // to describeContractError. + if (SOLIDITY_CUSTOM_ERROR_NAME.test(cleaned)) { return cleaned; } return undefined; diff --git a/src/utils/obligation-document.ts b/src/utils/obligation-document.ts index 8298af5..97a7051 100644 --- a/src/utils/obligation-document.ts +++ b/src/utils/obligation-document.ts @@ -55,7 +55,12 @@ export const extractObligationDocumentInfo = async ( } const network = SUPPORTED_CHAINS[chainId].name; - const documentId = document.id || 'N/A'; + if (!document.id) { + throw new Error( + 'Document does not contain a valid document ID (required as the remark encryption key)', + ); + } + const documentId = document.id; info(`Extracted from obligation document:`); info(` Network: ${network} (Chain ID: ${chainId})`); From 86af57bb5a82828fbeef97bed32b3414ffbf90b2 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 15:36:45 +0530 Subject: [PATCH 23/40] Enhance obligation escrow command inputs and error handling - Updated input prompts in various obligation escrow command files to return null on cancellation, improving user experience. - Enhanced error handling in command handlers to ensure proper exit codes on transaction failures. - Clarified roles and responsibilities in the README for executing commands related to obligation escrow. --- README.md | 9 +-- .../endorse-transfer-owner.ts | 12 ++-- .../nominate-transfer-owner.ts | 54 ++++++++------- .../reject-transfer-holder.ts | 42 +++++++----- src/commands/obligation-escrow/shared.ts | 68 ++++++++++++------- .../obligation-escrow/transfer-holder.ts | 3 +- .../transfer-owner-holder.ts | 3 +- 7 files changed, 113 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index 8c2adf0..393989e 100644 --- a/README.md +++ b/README.md @@ -1535,7 +1535,7 @@ Transaction receipt confirming return to issuer. Accepts a returned BoE (issuer burn / shred). **Who Can Execute:** -Only the **issuer** (wallet with accepter role on the obligation registry). +The connected wallet must hold the **accepter** role on the obligation registry (issuer burn / shred). **Usage:** @@ -1557,7 +1557,7 @@ Transaction receipt confirming acceptance (burn). Rejects a returned BoE and restores it to escrow (issuer restore). **Who Can Execute:** -Only the **issuer** (wallet with restorer role on the obligation registry). +The connected wallet must hold the **restorer** role on the obligation registry (restore the BoE to escrow). **Usage:** @@ -1786,7 +1786,7 @@ Signing/building the VC can also be done with TrustVC library tools or your app **7. Discharge (optional)** — `trustvc obligation-escrow discharge` by **beneficiary** after Accepted (sets Discharged and burns). -**8. Return to issuer** — same as classic ETR: **beneficiary == holder**, then issuer runs `reject-return-to-issuer` (restore) or `accept-return-to-issuer` (burn). No Rejected/Discharged status requirement. +**8. Return to issuer** — same as classic ETR: **beneficiary == holder**, then a wallet with registry **restorer** runs `reject-return-to-issuer` (restore) or with **accepter** runs `accept-return-to-issuer` (burn / shred). No Rejected/Discharged status requirement. **9. Verify** — `trustvc verify` (auto-detects BoE vs ETR). @@ -1801,7 +1801,8 @@ Signing/building the VC can also be done with TrustVC library tools or your app | `obligation-escrow discharge` | Beneficiary | | Transfer / nominate / endorse | Current holder or beneficiary per Title Escrow–style rules | | `return-to-issuer` | Dual role (beneficiary == holder), same as ETR | -| `accept-return-to-issuer` / `reject-return-to-issuer` | Issuer | +| `accept-return-to-issuer` | Connected wallet with registry **accepter** role (burn / shred) | +| `reject-return-to-issuer` | Connected wallet with registry **restorer** role (restore) | | `obligation-escrow status` | Anyone with the document + wallet/private key (read-only) | | `verify` | Anyone with the document (+ RPC when on-chain checks run) | diff --git a/src/commands/obligation-escrow/endorse-transfer-owner.ts b/src/commands/obligation-escrow/endorse-transfer-owner.ts index 06e556b..8826e84 100644 --- a/src/commands/obligation-escrow/endorse-transfer-owner.ts +++ b/src/commands/obligation-escrow/endorse-transfer-owner.ts @@ -18,11 +18,13 @@ export const describe = 'Endorse / transfer beneficiary (owner) of a BoE obligat export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, endorseHandler); -export const promptForInputs = async (): Promise => { - const base = await promptBaseObligationEscrowInputs(); - const newBeneficiary = await promptAddress('new beneficiary', 'endorsed owner'); - return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; -}; +export const promptForInputs = + async (): Promise => { + const base = await promptBaseObligationEscrowInputs(); + if (!base) return null; + const newBeneficiary = await promptAddress('new beneficiary', 'endorsed owner'); + return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; + }; export const endorseHandler = async (args: ObligationEscrowNominateBeneficiaryCommand) => { try { diff --git a/src/commands/obligation-escrow/nominate-transfer-owner.ts b/src/commands/obligation-escrow/nominate-transfer-owner.ts index 7a4397d..30ea9c1 100644 --- a/src/commands/obligation-escrow/nominate-transfer-owner.ts +++ b/src/commands/obligation-escrow/nominate-transfer-owner.ts @@ -1,8 +1,9 @@ -import { info, success } from 'signale'; +import { error, info, success } from 'signale'; import { nominateObligationRegistry } from '@trustvc/trustvc'; import { ObligationEscrowNominateBeneficiaryCommand } from '../../types'; import { displayTransactionPrice, + getErrorMessage, getEtherscanAddress, NetworkCmdName, promptAddress, @@ -17,28 +18,35 @@ export const describe = 'Nominate a new beneficiary (owner) for a BoE obligation export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, nominateHandler); -export const promptForInputs = async (): Promise => { - const base = await promptBaseObligationEscrowInputs(); - const newBeneficiary = await promptAddress('new beneficiary', 'nominee'); - return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; -}; +export const promptForInputs = + async (): Promise => { + const base = await promptBaseObligationEscrowInputs(); + if (!base) return null; + const newBeneficiary = await promptAddress('new beneficiary', 'nominee'); + return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; + }; export const nominateHandler = async (args: ObligationEscrowNominateBeneficiaryCommand) => { - info(`Nominating beneficiary ${args.newBeneficiary} for obligation ${args.tokenId}`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.nominate.populateTransaction(args.newBeneficiary, encryptedRemark), - sdk: nominateObligationRegistry as any, - sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, - }); - if (!transaction) return; - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Nominated ${args.newBeneficiary}`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); + try { + info(`Nominating beneficiary ${args.newBeneficiary} for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.nominate.populateTransaction(args.newBeneficiary, encryptedRemark), + sdk: nominateObligationRegistry as any, + sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Nominated ${args.newBeneficiary}`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + process.exitCode = 1; + } }; diff --git a/src/commands/obligation-escrow/reject-transfer-holder.ts b/src/commands/obligation-escrow/reject-transfer-holder.ts index 4226765..c0455a8 100644 --- a/src/commands/obligation-escrow/reject-transfer-holder.ts +++ b/src/commands/obligation-escrow/reject-transfer-holder.ts @@ -1,8 +1,9 @@ -import { info, success } from 'signale'; +import { error, info, success } from 'signale'; import { rejectTransferHolderObligationRegistry } from '@trustvc/trustvc'; import { BaseObligationEscrowCommand } from '../../types'; import { displayTransactionPrice, + getErrorMessage, getEtherscanAddress, NetworkCmdName, TransactionReceiptFees, @@ -19,21 +20,26 @@ export const handler = async (): Promise => export const promptForInputs = promptBaseObligationEscrowInputs; export const rejectTransferHolderHandler = async (args: BaseObligationEscrowCommand) => { - info(`Rejecting holder transfer for obligation ${args.tokenId}`); - const transaction = await runObligationEscrowTx({ - args, - populate: ({ escrow }, encryptedRemark) => - escrow.rejectTransferHolder.populateTransaction(encryptedRemark), - sdk: rejectTransferHolderObligationRegistry as any, - sdkParams: { remarks: args.remark }, - }); - if (!transaction) return; - displayTransactionPrice( - transaction as unknown as TransactionReceiptFees, - args.network as NetworkCmdName, - ); - success(`Holder transfer rejected`); - info( - `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, - ); + try { + info(`Rejecting holder transfer for obligation ${args.tokenId}`); + const transaction = await runObligationEscrowTx({ + args, + populate: ({ escrow }, encryptedRemark) => + escrow.rejectTransferHolder.populateTransaction(encryptedRemark), + sdk: rejectTransferHolderObligationRegistry as any, + sdkParams: { remarks: args.remark }, + }); + if (!transaction) return; + displayTransactionPrice( + transaction as unknown as TransactionReceiptFees, + args.network as NetworkCmdName, + ); + success(`Holder transfer rejected`); + info( + `Find more details at ${getEtherscanAddress({ network: args.network })}/tx/${transaction.hash}`, + ); + } catch (e) { + error(getErrorMessage(e)); + process.exitCode = 1; + } }; diff --git a/src/commands/obligation-escrow/shared.ts b/src/commands/obligation-escrow/shared.ts index 149100d..744d08a 100644 --- a/src/commands/obligation-escrow/shared.ts +++ b/src/commands/obligation-escrow/shared.ts @@ -9,37 +9,53 @@ import { } from '../../utils'; import { BaseObligationEscrowCommand } from '../../types'; +/** @inquirer/prompts rejects with ExitPromptError when the user cancels (e.g. Ctrl+C). */ +const isPromptCancellation = (err: unknown): boolean => + typeof err === 'object' && + err !== null && + 'name' in err && + (err as { name?: unknown }).name === 'ExitPromptError'; + /** * Shared prompt flow for obligation-escrow commands that only need document + wallet + remark. + * Returns null when the user cancels a prompt so runObligationEscrowCommand can exit quietly. */ -export const promptBaseObligationEscrowInputs = async (): Promise => { - const document = await promptAndReadDocument(); - await verifyDocumentSignature(document); - const { obligationRegistry, tokenId, network, documentId } = - await extractObligationDocumentInfo(document); - const { encryptedWalletPath, key, keyFile } = await promptWalletSelection(); - const remark = await promptRemark('v5'); +export const promptBaseObligationEscrowInputs = + async (): Promise => { + try { + const document = await promptAndReadDocument(); + await verifyDocumentSignature(document); + const { obligationRegistry, tokenId, network, documentId } = + await extractObligationDocumentInfo(document); + const { encryptedWalletPath, key, keyFile } = await promptWalletSelection(); + const remark = await promptRemark('v5'); - const baseResult = { - network, - obligationRegistryAddress: obligationRegistry, - tokenId, - remark, - encryptionKey: documentId, - maxPriorityFeePerGasScale: 1, - }; + const baseResult = { + network, + obligationRegistryAddress: obligationRegistry, + tokenId, + remark, + encryptionKey: documentId, + maxPriorityFeePerGasScale: 1, + }; - if (encryptedWalletPath) { - return { ...baseResult, encryptedWalletPath } as BaseObligationEscrowCommand; - } - if (keyFile) { - return { ...baseResult, keyFile } as BaseObligationEscrowCommand; - } - if (key) { - return { ...baseResult, key } as BaseObligationEscrowCommand; - } - return baseResult as BaseObligationEscrowCommand; -}; + if (encryptedWalletPath) { + return { ...baseResult, encryptedWalletPath } as BaseObligationEscrowCommand; + } + if (keyFile) { + return { ...baseResult, keyFile } as BaseObligationEscrowCommand; + } + if (key) { + return { ...baseResult, key } as BaseObligationEscrowCommand; + } + return baseResult as BaseObligationEscrowCommand; + } catch (err) { + if (isPromptCancellation(err)) { + return null; + } + throw err; + } + }; /** * Runs prompt → command with shared failure logging and non-zero exit on error. diff --git a/src/commands/obligation-escrow/transfer-holder.ts b/src/commands/obligation-escrow/transfer-holder.ts index c92cb41..93d059f 100644 --- a/src/commands/obligation-escrow/transfer-holder.ts +++ b/src/commands/obligation-escrow/transfer-holder.ts @@ -18,8 +18,9 @@ export const describe = 'Transfer the holder of a BoE obligation record'; export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, changeHolderHandler); -export const promptForInputs = async (): Promise => { +export const promptForInputs = async (): Promise => { const base = await promptBaseObligationEscrowInputs(); + if (!base) return null; const newHolder = await promptAddress('new holder', 'new holder'); return { ...base, newHolder } as ObligationEscrowTransferHolderCommand; }; diff --git a/src/commands/obligation-escrow/transfer-owner-holder.ts b/src/commands/obligation-escrow/transfer-owner-holder.ts index a37da7c..34aa719 100644 --- a/src/commands/obligation-escrow/transfer-owner-holder.ts +++ b/src/commands/obligation-escrow/transfer-owner-holder.ts @@ -18,8 +18,9 @@ export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, transferOwnersHandler); export const promptForInputs = - async (): Promise => { + async (): Promise => { const base = await promptBaseObligationEscrowInputs(); + if (!base) return null; const newOwner = await promptAddress('new beneficiary', 'new owner'); const newHolder = await promptAddress('new holder', 'new holder'); return { ...base, newOwner, newHolder } as ObligationEscrowEndorseTransferOfOwnersCommand; From 82684c69bc9f9cc7cb066d2ee4ef1893da9c56c1 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 15:44:26 +0530 Subject: [PATCH 24/40] Enhance error handling in document store and title escrow commands - Added checks to ensure proper exit codes when `shouldProceed` is null in various document store and title escrow command files. - Updated README to reflect the new structure of command files for better clarity. --- README.md | 16 ++++++++-------- src/commands/document-store/grant-role.ts | 3 +++ src/commands/document-store/revoke-role.ts | 3 +++ src/commands/document-store/revoke.ts | 3 +++ .../title-escrow/accept-return-to-issuer.ts | 3 +++ .../title-escrow/endorse-transfer-owner.ts | 3 +++ .../title-escrow/nominate-transfer-owner.ts | 3 +++ .../title-escrow/reject-return-to-issuer.ts | 3 +++ .../title-escrow/reject-transfer-holder.ts | 3 +++ .../title-escrow/reject-transfer-owner-holder.ts | 3 +++ .../title-escrow/reject-transfer-owner.ts | 3 +++ src/commands/title-escrow/return-to-issuer.ts | 3 +++ src/commands/title-escrow/transfer-holder.ts | 3 +++ .../title-escrow/transfer-owner-holder.ts | 3 +++ tests/utils/contract-errors.test.ts | 11 +++++++++++ 15 files changed, 58 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 393989e..9e2f3d6 100644 --- a/README.md +++ b/README.md @@ -1690,14 +1690,14 @@ src/commands/ │ ├── create.ts # Create encrypted wallet │ ├── encrypt.ts # Encrypt private key to wallet │ └── decrypt.ts # Decrypt wallet file -├── w3c/ -│ ├── did.ts # Generate DID -│ ├── key-pair.ts # Generate key pairs -│ ├── sign.ts # Sign W3C credentials -│ └── credentialStatus/ -│ ├── create.ts # Create credential status list -│ └── update.ts # Update credential status list -└── verify.ts # Verify W3C or OA document +├── verify.ts # Verify W3C or OA document (`src/commands/verify.ts`) +└── w3c/ + ├── did.ts # Generate DID + ├── key-pair.ts # Generate key pairs + ├── sign.ts # Sign W3C credentials + └── credentialStatus/ + ├── create.ts # Create credential status list + └── update.ts # Update credential status list ``` diff --git a/src/commands/document-store/grant-role.ts b/src/commands/document-store/grant-role.ts index 65f1600..fa132c4 100644 --- a/src/commands/document-store/grant-role.ts +++ b/src/commands/document-store/grant-role.ts @@ -153,6 +153,9 @@ export const grantRoleToDocumentStore = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/document-store/revoke-role.ts b/src/commands/document-store/revoke-role.ts index 7f7b11e..5a66037 100644 --- a/src/commands/document-store/revoke-role.ts +++ b/src/commands/document-store/revoke-role.ts @@ -153,6 +153,9 @@ export const revokeRoleFromDocumentStore = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/document-store/revoke.ts b/src/commands/document-store/revoke.ts index 5a6347a..0c5ece2 100644 --- a/src/commands/document-store/revoke.ts +++ b/src/commands/document-store/revoke.ts @@ -106,6 +106,9 @@ export const revokeToken = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/accept-return-to-issuer.ts b/src/commands/title-escrow/accept-return-to-issuer.ts index 560f5cf..16f2259 100644 --- a/src/commands/title-escrow/accept-return-to-issuer.ts +++ b/src/commands/title-escrow/accept-return-to-issuer.ts @@ -163,6 +163,9 @@ export const acceptReturned = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/endorse-transfer-owner.ts b/src/commands/title-escrow/endorse-transfer-owner.ts index b17c589..da1ec52 100644 --- a/src/commands/title-escrow/endorse-transfer-owner.ts +++ b/src/commands/title-escrow/endorse-transfer-owner.ts @@ -194,6 +194,9 @@ export const endorseNominatedBeneficiary = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/nominate-transfer-owner.ts b/src/commands/title-escrow/nominate-transfer-owner.ts index bcaefa4..61095f3 100644 --- a/src/commands/title-escrow/nominate-transfer-owner.ts +++ b/src/commands/title-escrow/nominate-transfer-owner.ts @@ -185,6 +185,9 @@ export const nominateBeneficiary = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/reject-return-to-issuer.ts b/src/commands/title-escrow/reject-return-to-issuer.ts index 8e076cf..7268dcb 100644 --- a/src/commands/title-escrow/reject-return-to-issuer.ts +++ b/src/commands/title-escrow/reject-return-to-issuer.ts @@ -164,6 +164,9 @@ export const rejectReturned = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/reject-transfer-holder.ts b/src/commands/title-escrow/reject-transfer-holder.ts index 1bcb7a2..6c95f7b 100644 --- a/src/commands/title-escrow/reject-transfer-holder.ts +++ b/src/commands/title-escrow/reject-transfer-holder.ts @@ -174,6 +174,9 @@ export const rejectTransferHolder = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/reject-transfer-owner-holder.ts b/src/commands/title-escrow/reject-transfer-owner-holder.ts index 0309a1d..15c8cd0 100644 --- a/src/commands/title-escrow/reject-transfer-owner-holder.ts +++ b/src/commands/title-escrow/reject-transfer-owner-holder.ts @@ -181,6 +181,9 @@ export const rejectTransferOwnerHolder = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/reject-transfer-owner.ts b/src/commands/title-escrow/reject-transfer-owner.ts index f0a9c64..245c0c4 100644 --- a/src/commands/title-escrow/reject-transfer-owner.ts +++ b/src/commands/title-escrow/reject-transfer-owner.ts @@ -181,6 +181,9 @@ export const rejectTransferOwner = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/return-to-issuer.ts b/src/commands/title-escrow/return-to-issuer.ts index 0f8fffc..5af8cd5 100644 --- a/src/commands/title-escrow/return-to-issuer.ts +++ b/src/commands/title-escrow/return-to-issuer.ts @@ -164,6 +164,9 @@ export const returnDocument = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/transfer-holder.ts b/src/commands/title-escrow/transfer-holder.ts index 593168d..5d77306 100644 --- a/src/commands/title-escrow/transfer-holder.ts +++ b/src/commands/title-escrow/transfer-holder.ts @@ -177,6 +177,9 @@ export const transferHolder = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/transfer-owner-holder.ts b/src/commands/title-escrow/transfer-owner-holder.ts index 6d8cc7f..687f2e1 100644 --- a/src/commands/title-escrow/transfer-owner-holder.ts +++ b/src/commands/title-escrow/transfer-owner-holder.ts @@ -197,6 +197,9 @@ export const transferOwners = async ({ }, }); + if (shouldProceed === null) { + process.exit(1); + } if (!shouldProceed) { process.exit(0); } diff --git a/tests/utils/contract-errors.test.ts b/tests/utils/contract-errors.test.ts index 30154b8..b78ffe2 100644 --- a/tests/utils/contract-errors.test.ts +++ b/tests/utils/contract-errors.test.ts @@ -74,4 +74,15 @@ describe('contract revert error formatting', () => { expect(extractContractRevertLabel(freeText)).toBeUndefined(); expect(describeContractError(freeText)).toBe('insufficient funds for gas * price + value'); }); + + it('does not treat lowercase single-word reasons as Solidity custom errors', () => { + const timeout = Object.assign(new Error('timeout'), { + code: 'CALL_EXCEPTION', + reason: 'timeout', + shortMessage: 'timeout', + }); + expect(extractContractRevertLabel(timeout)).toBeUndefined(); + expect(describeContractError(timeout)).toBe('timeout'); + expect(describeContractError(timeout)).not.toMatch(/Contract reverted with timeout/); + }); }); From 7ed1ea9e45643857980128fd0c89efb660913b56 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 16:06:22 +0530 Subject: [PATCH 25/40] Update .gitignore, remove decrypted.json, and enhance README clarity - Added decrypted.json to .gitignore to prevent tracking of sensitive files. - Removed the decrypted.json file as it is no longer needed. - Updated README to clarify command usage and improve overall documentation structure. --- .gitignore | 1 + README.md | 16 +++--- decrypted.json | 1 - src/commands/document-store/deploy.ts | 13 +++-- src/commands/obligation-escrow/shared.ts | 2 +- src/commands/obligation-escrow/status.ts | 49 +++++++++++++++---- src/commands/token-registry/deploy.ts | 2 +- src/utils/cli-errors.ts | 4 +- .../accept-return-to-issuer.test.ts | 3 +- .../obligation-escrow/discharge.test.ts | 8 ++- .../commands/obligation-escrow/status.test.ts | 11 +++-- tests/utils/contract-errors.test.ts | 7 +++ 12 files changed, 81 insertions(+), 36 deletions(-) delete mode 100644 decrypted.json diff --git a/.gitignore b/.gitignore index b920894..b27418b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ wellknown.json credentialStatus.json signed_vc.json raw_vc.json +decrypted.json # Dependencies node_modules/ diff --git a/README.md b/README.md index 9e2f3d6..75c4f26 100644 --- a/README.md +++ b/README.md @@ -342,13 +342,13 @@ trustvc verify | | `[obligation-escrow discharge](#obligation-escrow-discharge)` | Discharge obligation | | | `[obligation-escrow status](#obligation-escrow-status)` | Read obligation / escrow status | | | `[obligation-escrow transfer-holder](#obligation-escrow-transfer-holder)` | Transfer BoE holder | -| | `[obligation-escrow nominate-transfer-owner](#title-escrow-nominate-transfer-owner)` | Nominate BoE beneficiary | -| | `[obligation-escrow endorse-transfer-owner](#title-escrow-endorse-transfer-owner)` | Endorse BoE beneficiary change | -| | `[obligation-escrow transfer-owner-holder](#title-escrow-transfer-owner-holder)` | Endorse full BoE ownership transfer | +| | `[obligation-escrow nominate-transfer-owner](#obligation-escrow-transfer-holder)` | Nominate BoE beneficiary | +| | `[obligation-escrow endorse-transfer-owner](#obligation-escrow-transfer-holder)` | Endorse BoE beneficiary change | +| | `[obligation-escrow transfer-owner-holder](#obligation-escrow-transfer-holder)` | Endorse full BoE ownership transfer | | | `[obligation-escrow return-to-issuer](#obligation-escrow-return-to-issuer)` | Return BoE to issuer | | | `[obligation-escrow accept-return-to-issuer](#obligation-escrow-accept-return-to-issuer)` | Accept returned BoE | | | `[obligation-escrow reject-return-to-issuer](#obligation-escrow-reject-return-to-issuer)` | Reject returned BoE | -| | `[obligation-escrow reject-transfer-*](#title-escrow-reject-transfer-holder)` | Reject BoE transfer requests | +| | `[obligation-escrow reject-transfer-*](#obligation-escrow-transfer-holder)` | Reject BoE transfer requests | @@ -359,7 +359,7 @@ trustvc verify ### Wallet/Private Key Options -All title-escrow, obligation-registry, obligation-escrow, token registry, document-store, and transaction commands require a wallet or private key to sign transactions. You can provide your private key in one of the following ways: +Commands that submit transactions (title-escrow, obligation-registry, obligation-escrow write actions, token registry, document-store, and transaction) require a wallet or private key to sign. Read-only `obligation-escrow status` does not — it uses the network RPC/provider from the document (override with `{NETWORK}_RPC` if needed). You can provide your private key in one of the following ways: **Select wallet/private key option:** @@ -1466,7 +1466,7 @@ Transaction receipt confirming discharge (and burn). #### obligation-escrow status -Reads on-chain obligation / escrow status for a BoE document. The CLI still prompts for a wallet or private key (same base inputs as other `obligation-escrow` commands) so it can attach a network provider via `getWalletOrSigner`. +Reads on-chain obligation / escrow status for a BoE document. This is read-only: no wallet or private key is requested. The CLI attaches the default network RPC/provider for the document’s chain (or `{NETWORK}_RPC` when set). **Usage:** @@ -1477,8 +1477,6 @@ trustvc obligation-escrow status **Interactive Prompts:** - Path to BoE / obligation document -- Wallet/private key option -- Remark (optional) - *Network, obligationRegistry, and token ID are extracted from the document* **Output:** @@ -1803,7 +1801,7 @@ Signing/building the VC can also be done with TrustVC library tools or your app | `return-to-issuer` | Dual role (beneficiary == holder), same as ETR | | `accept-return-to-issuer` | Connected wallet with registry **accepter** role (burn / shred) | | `reject-return-to-issuer` | Connected wallet with registry **restorer** role (restore) | -| `obligation-escrow status` | Anyone with the document + wallet/private key (read-only) | +| `obligation-escrow status` | Anyone with the document (read-only RPC; no signing key) | | `verify` | Anyone with the document (+ RPC when on-chain checks run) | diff --git a/decrypted.json b/decrypted.json deleted file mode 100644 index 08c0000..0000000 --- a/decrypted.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"https://schema.openattestation.com/3.0/schema.json","@context":["https://www.w3.org/2018/credentials/v1","https://schemata.openattestation.com/com/openattestation/1.0/DrivingLicenceCredential.json","https://schemata.openattestation.com/com/openattestation/1.0/OpenAttestation.v3.json","https://schemata.openattestation.com/com/openattestation/1.0/CustomContext.json"],"reference":"SERIAL_NUMBER_123","name":"Republic of Singapore Driving Licence","issuanceDate":"2010-01-01T19:23:24Z","validFrom":"2010-01-01T19:23:24Z","issuer":{"id":"https://example.com","name":"DEMO STORE","type":"OpenAttestationIssuer"},"type":["VerifiableCredential","DrivingLicenceCredential","OpenAttestationCredential"],"credentialSubject":{"id":"did:example:JOHN_DOE_DID","licenseNumber":"S1234567a","birthDate":"1977-02-22","name":"John Doe","class":[{"type":"3","effectiveDate":"2010-01-01T19:23:24Z"},{"type":"3A","effectiveDate":"2010-01-01T19:23:24Z"}]},"openAttestationMetadata":{"template":{"name":"DRIVING_LICENSE","type":"EMBEDDED_RENDERER","url":"https://tutorial-renderer.openattestation.com"},"proof":{"type":"OpenAttestationProofMethod","method":"DID","value":"did:ethr:0xE712878f6E8d5d4F9e87E10DA604F9cB564C9a89","revocation":{"type":"NONE"}},"identityProof":{"type":"DNS-DID","identifier":"example.tradetrust.io"}},"attachments":[{"fileName":"sample.pdf","mimeType":"application/pdf","data":"BASE64_ENCODED_FILE"}]} \ No newline at end of file diff --git a/src/commands/document-store/deploy.ts b/src/commands/document-store/deploy.ts index f4a286f..c7a44e1 100644 --- a/src/commands/document-store/deploy.ts +++ b/src/commands/document-store/deploy.ts @@ -133,7 +133,7 @@ export const deployDocumentStoreContract = async ({ }, }); - // null = definitive dry-run revert; false = user cancel — do not exit(0) + // null = definitive dry-run revert → exit 1; false = user cancellation → exit 0 if (shouldProceed === null) { process.exit(1); } @@ -143,9 +143,14 @@ export const deployDocumentStoreContract = async ({ info(`Deploying document store ${storeName}`); - const transaction = await deployDocumentStore(storeName, owner, wallet, { - chainId: getSupportedNetwork(network).networkId as unknown as CHAIN_ID, - }); + const transaction = await deployDocumentStore( + storeName, + owner, + wallet as unknown as Parameters[2], + { + chainId: getSupportedNetwork(network).networkId as unknown as CHAIN_ID, + }, + ); displayTransactionPrice( transaction as unknown as TransactionReceiptFees, diff --git a/src/commands/obligation-escrow/shared.ts b/src/commands/obligation-escrow/shared.ts index 744d08a..86a1fa8 100644 --- a/src/commands/obligation-escrow/shared.ts +++ b/src/commands/obligation-escrow/shared.ts @@ -10,7 +10,7 @@ import { import { BaseObligationEscrowCommand } from '../../types'; /** @inquirer/prompts rejects with ExitPromptError when the user cancels (e.g. Ctrl+C). */ -const isPromptCancellation = (err: unknown): boolean => +export const isPromptCancellation = (err: unknown): boolean => typeof err === 'object' && err !== null && 'name' in err && diff --git a/src/commands/obligation-escrow/status.ts b/src/commands/obligation-escrow/status.ts index ed1fff0..c1781fc 100644 --- a/src/commands/obligation-escrow/status.ts +++ b/src/commands/obligation-escrow/status.ts @@ -6,9 +6,15 @@ import { getObligationRegistryStatus, isObligationRegistryRegistered, } from '@trustvc/trustvc'; +import { Signer } from 'ethers'; import { BaseObligationEscrowCommand } from '../../types'; -import { getWalletOrSigner } from '../../utils'; -import { promptBaseObligationEscrowInputs, runObligationEscrowCommand } from './shared'; +import { + extractObligationDocumentInfo, + getSupportedNetwork, + promptAndReadDocument, + verifyDocumentSignature, +} from '../../utils'; +import { runObligationEscrowCommand, isPromptCancellation } from './shared'; export const command = 'status'; export const describe = 'Read BoE obligation escrow status / registration / termination reason'; @@ -26,20 +32,43 @@ const REASON_LABEL: Record = { [ObligationEscrowTerminationReason.Discharged]: 'Discharged', }; +/** Read-only status inputs — document only; no wallet or remark. */ +export type ObligationEscrowStatusCommand = Pick< + BaseObligationEscrowCommand, + 'network' | 'obligationRegistryAddress' | 'tokenId' +>; + export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, statusHandler); -export const promptForInputs = promptBaseObligationEscrowInputs; +export const promptForInputs = async (): Promise => { + try { + const document = await promptAndReadDocument(); + await verifyDocumentSignature(document); + const { obligationRegistry, tokenId, network } = await extractObligationDocumentInfo(document); + return { + network, + obligationRegistryAddress: obligationRegistry, + tokenId, + }; + } catch (err) { + if (isPromptCancellation(err)) { + return null; + } + throw err; + } +}; -export const statusHandler = async (args: BaseObligationEscrowCommand) => { - const { obligationRegistryAddress, tokenId, network, ...rest } = args; - const wallet = await getWalletOrSigner({ network, ...rest }); - // Escrow resolution uses contractOptions.tokenId (params.tokenId is API parity only). +export const statusHandler = async (args: ObligationEscrowStatusCommand) => { + const { obligationRegistryAddress, tokenId, network } = args; + // SDK view readers only need signer.provider; use network RPC (no signing key). + const provider = getSupportedNetwork(network).provider(); + const readOnlySigner = { provider } as unknown as Signer; const opts = { obligationRegistryAddress, tokenId }; - const status = await getObligationRegistryStatus(opts, wallet, { tokenId }); - const registered = await isObligationRegistryRegistered(opts, wallet, { tokenId }); - const reason = await getObligationEscrowTerminationReason(opts, wallet, { tokenId }); + const status = await getObligationRegistryStatus(opts, readOnlySigner, { tokenId }); + const registered = await isObligationRegistryRegistered(opts, readOnlySigner, { tokenId }); + const reason = await getObligationEscrowTerminationReason(opts, readOnlySigner, { tokenId }); success(`Obligation ${tokenId} on ${obligationRegistryAddress}`); info(` Status: ${STATUS_LABEL[status] ?? status} (${status})`); diff --git a/src/commands/token-registry/deploy.ts b/src/commands/token-registry/deploy.ts index 833fed8..7343a26 100644 --- a/src/commands/token-registry/deploy.ts +++ b/src/commands/token-registry/deploy.ts @@ -207,7 +207,7 @@ export const deployTokenRegistryContract = async ({ }, }); - // null = definitive dry-run revert; false = user cancel — do not exit(0) + // null = definitive dry-run revert → exit 1; false = user cancellation → exit 0 if (shouldProceed === null) { process.exit(1); } diff --git a/src/utils/cli-errors.ts b/src/utils/cli-errors.ts index 8b79b62..b8f4ef5 100644 --- a/src/utils/cli-errors.ts +++ b/src/utils/cli-errors.ts @@ -111,11 +111,11 @@ const normalizeLabel = (raw: string): string | undefined => { return undefined; }; -/** Labels after generic "failed:" — only known reverts or Solidity-shaped names. */ +/** Labels after generic "failed:" — only known on-chain revert names. */ const acceptFailedSuffixLabel = (raw: string): string | undefined => { const label = normalizeLabel(raw); if (!label) return undefined; - if (isKnownRevertName(label) || SOLIDITY_CUSTOM_ERROR_NAME.test(label)) return label; + if (isKnownRevertName(label)) return label; return undefined; }; diff --git a/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts b/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts index b175b05..7591644 100644 --- a/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts +++ b/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts @@ -94,7 +94,8 @@ describe('obligation-escrow/accept-return-to-issuer', () => { it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); - expect(result.obligationRegistryAddress).toBe('0xRegistry'); + expect(result).not.toBeNull(); + expect(result!.obligationRegistryAddress).toBe('0xRegistry'); }); it('dry-run populates burn() on the registry contract, not the escrow', async () => { diff --git a/tests/commands/obligation-escrow/discharge.test.ts b/tests/commands/obligation-escrow/discharge.test.ts index 5a0c010..3392117 100644 --- a/tests/commands/obligation-escrow/discharge.test.ts +++ b/tests/commands/obligation-escrow/discharge.test.ts @@ -83,10 +83,14 @@ describe('obligation-escrow/discharge', () => { key: '0xabc', maxPriorityFeePerGasScale: 1, }); - expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalledWith( + expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalled(); + const callArgs = (runObligationEscrowTx as MockedFunction).mock.calls[0][0]; + expect(callArgs).toEqual( expect.objectContaining({ - sdkParams: expect.objectContaining({ remarks: undefined }), + sdkParams: expect.any(Object), }), ); + expect(Object.prototype.hasOwnProperty.call(callArgs.sdkParams, 'remarks')).toBe(true); + expect(callArgs.sdkParams.remarks).toBeUndefined(); }); }); diff --git a/tests/commands/obligation-escrow/status.test.ts b/tests/commands/obligation-escrow/status.test.ts index e80f2cc..a98da11 100644 --- a/tests/commands/obligation-escrow/status.test.ts +++ b/tests/commands/obligation-escrow/status.test.ts @@ -43,7 +43,10 @@ vi.mock('../../../src/utils', async (importOriginal) => { const actual = await importOriginal(); return { ...actual, - getWalletOrSigner: vi.fn().mockResolvedValue({ provider: {} }), + getSupportedNetwork: vi.fn().mockReturnValue({ + provider: () => ({ mock: 'provider' }), + networkId: 80002, + }), getErrorMessage: (e: unknown) => (e instanceof Error ? e.message : String(e)), }; }); @@ -51,18 +54,16 @@ vi.mock('../../../src/utils', async (importOriginal) => { describe('obligation-escrow/status', () => { beforeEach(() => vi.clearAllMocks()); - it('reads status, registration, and termination reason', async () => { + it('reads status via network provider without a wallet', async () => { const trustvc = await import('@trustvc/trustvc'); await statusHandler({ network: NetworkCmdName.Amoy, obligationRegistryAddress: '0xRegistry', tokenId: '0x1', - key: '0xabc', - maxPriorityFeePerGasScale: 1, }); expect(trustvc.getObligationRegistryStatus as MockedFunction).toHaveBeenCalledWith( { obligationRegistryAddress: '0xRegistry', tokenId: '0x1' }, - expect.anything(), + { provider: { mock: 'provider' } }, { tokenId: '0x1' }, ); expect(trustvc.isObligationRegistryRegistered).toHaveBeenCalled(); diff --git a/tests/utils/contract-errors.test.ts b/tests/utils/contract-errors.test.ts index b78ffe2..8f4e97d 100644 --- a/tests/utils/contract-errors.test.ts +++ b/tests/utils/contract-errors.test.ts @@ -60,6 +60,13 @@ describe('contract revert error formatting', () => { expect(isContractCallException(preprocessing)).toBe(false); }); + it('rejects PascalCase failed: suffixes that are not known reverts', () => { + const preprocessing = new Error('SDK preprocessing failed: BadInput'); + expect(extractContractRevertLabel(preprocessing)).toBeUndefined(); + expect(isContractCallException(preprocessing)).toBe(false); + expect(getErrorMessage(preprocessing)).toBe('SDK preprocessing failed: BadInput'); + }); + it('preserves Contract reverted with labels', () => { const wrapped = new Error('Contract reverted with OwnerHolderMustDiffer'); expect(extractContractRevertLabel(wrapped)).toBe('OwnerHolderMustDiffer'); From 512d7a4e54e7cf08c9a2286423f6b5d69a766a21 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 23:07:16 +0530 Subject: [PATCH 26/40] Refactor error handling in document store and title escrow commands - Removed redundant checks for `shouldProceed` being null in various command files to streamline exit logic. - Updated README to reflect changes in command verification processes for improved clarity. --- README.md | 2 +- src/commands/document-store/deploy.ts | 15 +++------------ src/commands/document-store/grant-role.ts | 3 --- src/commands/document-store/issue.ts | 4 ---- src/commands/document-store/revoke-role.ts | 3 --- src/commands/document-store/revoke.ts | 3 --- .../title-escrow/accept-return-to-issuer.ts | 3 --- .../title-escrow/endorse-transfer-owner.ts | 3 --- .../title-escrow/nominate-transfer-owner.ts | 3 --- .../title-escrow/reject-return-to-issuer.ts | 3 --- .../title-escrow/reject-transfer-holder.ts | 3 --- .../title-escrow/reject-transfer-owner-holder.ts | 3 --- .../title-escrow/reject-transfer-owner.ts | 3 --- src/commands/title-escrow/return-to-issuer.ts | 3 --- src/commands/title-escrow/transfer-holder.ts | 3 --- .../title-escrow/transfer-owner-holder.ts | 3 --- src/commands/token-registry/deploy.ts | 4 ---- src/commands/token-registry/mint.ts | 4 ---- 18 files changed, 4 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 75c4f26..8dae41f 100644 --- a/README.md +++ b/README.md @@ -1688,7 +1688,7 @@ src/commands/ │ ├── create.ts # Create encrypted wallet │ ├── encrypt.ts # Encrypt private key to wallet │ └── decrypt.ts # Decrypt wallet file -├── verify.ts # Verify W3C or OA document (`src/commands/verify.ts`) +├── verify.ts # Verify W3C, OA, ETR, and BoE documents (unified pipeline) └── w3c/ ├── did.ts # Generate DID ├── key-pair.ts # Generate key pairs diff --git a/src/commands/document-store/deploy.ts b/src/commands/document-store/deploy.ts index c7a44e1..8ad549f 100644 --- a/src/commands/document-store/deploy.ts +++ b/src/commands/document-store/deploy.ts @@ -133,24 +133,15 @@ export const deployDocumentStoreContract = async ({ }, }); - // null = definitive dry-run revert → exit 1; false = user cancellation → exit 0 - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } info(`Deploying document store ${storeName}`); - const transaction = await deployDocumentStore( - storeName, - owner, - wallet as unknown as Parameters[2], - { - chainId: getSupportedNetwork(network).networkId as unknown as CHAIN_ID, - }, - ); + const transaction = await deployDocumentStore(storeName, owner, wallet, { + chainId: getSupportedNetwork(network).networkId as unknown as CHAIN_ID, + }); displayTransactionPrice( transaction as unknown as TransactionReceiptFees, diff --git a/src/commands/document-store/grant-role.ts b/src/commands/document-store/grant-role.ts index fa132c4..65f1600 100644 --- a/src/commands/document-store/grant-role.ts +++ b/src/commands/document-store/grant-role.ts @@ -153,9 +153,6 @@ export const grantRoleToDocumentStore = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/document-store/issue.ts b/src/commands/document-store/issue.ts index e50c818..9947f9c 100644 --- a/src/commands/document-store/issue.ts +++ b/src/commands/document-store/issue.ts @@ -106,10 +106,6 @@ export const issueToken = async ({ }, }); - // null = definitive dry-run revert; false = user cancel — do not exit(0) - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/document-store/revoke-role.ts b/src/commands/document-store/revoke-role.ts index 5a66037..7f7b11e 100644 --- a/src/commands/document-store/revoke-role.ts +++ b/src/commands/document-store/revoke-role.ts @@ -153,9 +153,6 @@ export const revokeRoleFromDocumentStore = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/document-store/revoke.ts b/src/commands/document-store/revoke.ts index 0c5ece2..5a6347a 100644 --- a/src/commands/document-store/revoke.ts +++ b/src/commands/document-store/revoke.ts @@ -106,9 +106,6 @@ export const revokeToken = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/accept-return-to-issuer.ts b/src/commands/title-escrow/accept-return-to-issuer.ts index 16f2259..560f5cf 100644 --- a/src/commands/title-escrow/accept-return-to-issuer.ts +++ b/src/commands/title-escrow/accept-return-to-issuer.ts @@ -163,9 +163,6 @@ export const acceptReturned = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/endorse-transfer-owner.ts b/src/commands/title-escrow/endorse-transfer-owner.ts index da1ec52..b17c589 100644 --- a/src/commands/title-escrow/endorse-transfer-owner.ts +++ b/src/commands/title-escrow/endorse-transfer-owner.ts @@ -194,9 +194,6 @@ export const endorseNominatedBeneficiary = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/nominate-transfer-owner.ts b/src/commands/title-escrow/nominate-transfer-owner.ts index 61095f3..bcaefa4 100644 --- a/src/commands/title-escrow/nominate-transfer-owner.ts +++ b/src/commands/title-escrow/nominate-transfer-owner.ts @@ -185,9 +185,6 @@ export const nominateBeneficiary = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/reject-return-to-issuer.ts b/src/commands/title-escrow/reject-return-to-issuer.ts index 7268dcb..8e076cf 100644 --- a/src/commands/title-escrow/reject-return-to-issuer.ts +++ b/src/commands/title-escrow/reject-return-to-issuer.ts @@ -164,9 +164,6 @@ export const rejectReturned = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/reject-transfer-holder.ts b/src/commands/title-escrow/reject-transfer-holder.ts index 6c95f7b..1bcb7a2 100644 --- a/src/commands/title-escrow/reject-transfer-holder.ts +++ b/src/commands/title-escrow/reject-transfer-holder.ts @@ -174,9 +174,6 @@ export const rejectTransferHolder = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/reject-transfer-owner-holder.ts b/src/commands/title-escrow/reject-transfer-owner-holder.ts index 15c8cd0..0309a1d 100644 --- a/src/commands/title-escrow/reject-transfer-owner-holder.ts +++ b/src/commands/title-escrow/reject-transfer-owner-holder.ts @@ -181,9 +181,6 @@ export const rejectTransferOwnerHolder = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/reject-transfer-owner.ts b/src/commands/title-escrow/reject-transfer-owner.ts index 245c0c4..f0a9c64 100644 --- a/src/commands/title-escrow/reject-transfer-owner.ts +++ b/src/commands/title-escrow/reject-transfer-owner.ts @@ -181,9 +181,6 @@ export const rejectTransferOwner = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/return-to-issuer.ts b/src/commands/title-escrow/return-to-issuer.ts index 5af8cd5..0f8fffc 100644 --- a/src/commands/title-escrow/return-to-issuer.ts +++ b/src/commands/title-escrow/return-to-issuer.ts @@ -164,9 +164,6 @@ export const returnDocument = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/transfer-holder.ts b/src/commands/title-escrow/transfer-holder.ts index 5d77306..593168d 100644 --- a/src/commands/title-escrow/transfer-holder.ts +++ b/src/commands/title-escrow/transfer-holder.ts @@ -177,9 +177,6 @@ export const transferHolder = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/title-escrow/transfer-owner-holder.ts b/src/commands/title-escrow/transfer-owner-holder.ts index 687f2e1..6d8cc7f 100644 --- a/src/commands/title-escrow/transfer-owner-holder.ts +++ b/src/commands/title-escrow/transfer-owner-holder.ts @@ -197,9 +197,6 @@ export const transferOwners = async ({ }, }); - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/token-registry/deploy.ts b/src/commands/token-registry/deploy.ts index 7343a26..1cef3ff 100644 --- a/src/commands/token-registry/deploy.ts +++ b/src/commands/token-registry/deploy.ts @@ -207,10 +207,6 @@ export const deployTokenRegistryContract = async ({ }, }); - // null = definitive dry-run revert → exit 1; false = user cancellation → exit 0 - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } diff --git a/src/commands/token-registry/mint.ts b/src/commands/token-registry/mint.ts index 6cca090..348705e 100644 --- a/src/commands/token-registry/mint.ts +++ b/src/commands/token-registry/mint.ts @@ -163,10 +163,6 @@ const mintToTokenRegistry = async ({ }, }); - // null = definitive dry-run revert; false = user cancel — do not exit(0) - if (shouldProceed === null) { - process.exit(1); - } if (!shouldProceed) { process.exit(0); } From 9615cd147589a5bf33ac069c8ab9edfcc7a9af8b Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Mon, 3 Aug 2026 23:16:16 +0530 Subject: [PATCH 27/40] Refactor CLI error handling and remove unused code - Simplified CLI error helpers by removing outdated constants and functions related to known revert messages and selectors. - Updated comments for clarity and conciseness, enhancing the overall readability of the error handling logic. --- src/commands/helpers.ts | 22 +- .../accept-return-to-issuer.ts | 2 - src/commands/obligation-escrow/accept.ts | 2 - src/commands/obligation-escrow/discharge.ts | 1 - .../endorse-transfer-owner.ts | 14 +- .../nominate-transfer-owner.ts | 14 +- .../reject-return-to-issuer.ts | 1 - .../reject-transfer-holder.ts | 2 - .../reject-transfer-owner-holder.ts | 1 - .../reject-transfer-owner.ts | 1 - src/commands/obligation-escrow/reject.ts | 1 - .../obligation-escrow/return-to-issuer.ts | 1 - src/commands/obligation-escrow/runTx.ts | 8 +- src/commands/obligation-escrow/shared.ts | 75 +++--- src/commands/obligation-escrow/status.ts | 27 +- .../obligation-escrow/transfer-holder.ts | 5 +- .../transfer-owner-holder.ts | 4 +- src/commands/obligation-registry/deploy.ts | 10 +- src/commands/obligation-registry/mint.ts | 12 +- src/utils/cli-errors.ts | 244 +----------------- src/utils/cli-options.ts | 19 +- src/utils/formatting.ts | 23 +- tests/utils/contract-errors.test.ts | 95 ------- 23 files changed, 73 insertions(+), 511 deletions(-) delete mode 100644 tests/utils/contract-errors.test.ts diff --git a/src/commands/helpers.ts b/src/commands/helpers.ts index 24375a5..432d769 100644 --- a/src/commands/helpers.ts +++ b/src/commands/helpers.ts @@ -440,13 +440,10 @@ export const connectToObligationRegistry = async ({ try { signale.info(`Connecting to obligation registry at: ${address}`); const registry = new ethers.Contract(address, TrustVCToken__factory.abi, wallet as any); - const provider = wallet.provider; - if (!provider) { - throw new Error('Wallet provider is required to validate the obligation registry contract'); - } - const code = await provider.getCode(address); - if (!code || code === '0x') { - throw new Error(`Failed to connect to obligation registry at address: ${address}`); + if (!registry) { + const error = `Failed to connect to obligation registry at address: ${address}`; + signale.error(error); + throw new Error(error); } signale.success(`Successfully connected to obligation registry`); return registry; @@ -488,13 +485,10 @@ export const connectToObligationEscrow = async ({ signale.info(`Connecting to obligation escrow at: ${escrowAddress}`); const escrow = new ethers.Contract(escrowAddress, ObligationEscrow__factory.abi, wallet as any); - const provider = wallet.provider; - if (!provider) { - throw new Error('Wallet provider is required to validate the obligation escrow contract'); - } - const code = await provider.getCode(escrowAddress); - if (!code || code === '0x') { - throw new Error(`Failed to connect to obligation escrow at address: ${escrowAddress}`); + if (!escrow) { + const error = `Failed to connect to obligation escrow at address: ${escrowAddress}`; + signale.error(error); + throw new Error(error); } signale.success(`Successfully connected to obligation escrow`); return escrow; diff --git a/src/commands/obligation-escrow/accept-return-to-issuer.ts b/src/commands/obligation-escrow/accept-return-to-issuer.ts index fd2d57f..4c35f62 100644 --- a/src/commands/obligation-escrow/accept-return-to-issuer.ts +++ b/src/commands/obligation-escrow/accept-return-to-issuer.ts @@ -30,7 +30,6 @@ export const acceptReturnedHandler = async (args: BaseObligationEscrowCommand) = sdk: acceptReturnedObligationRegistry as any, sdkParams: { tokenId: args.tokenId, remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -41,6 +40,5 @@ export const acceptReturnedHandler = async (args: BaseObligationEscrowCommand) = ); } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/accept.ts b/src/commands/obligation-escrow/accept.ts index 928b253..6c0dba6 100644 --- a/src/commands/obligation-escrow/accept.ts +++ b/src/commands/obligation-escrow/accept.ts @@ -28,7 +28,6 @@ export const acceptHandler = async (args: BaseObligationEscrowCommand) => { sdk: acceptObligationRegistry as any, sdkParams: { remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -39,6 +38,5 @@ export const acceptHandler = async (args: BaseObligationEscrowCommand) => { ); } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/discharge.ts b/src/commands/obligation-escrow/discharge.ts index 9b2583c..7ee3fa5 100644 --- a/src/commands/obligation-escrow/discharge.ts +++ b/src/commands/obligation-escrow/discharge.ts @@ -28,7 +28,6 @@ export const dischargeHandler = async (args: BaseObligationEscrowCommand) => { sdk: dischargeObligationRegistry as any, sdkParams: { remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, diff --git a/src/commands/obligation-escrow/endorse-transfer-owner.ts b/src/commands/obligation-escrow/endorse-transfer-owner.ts index 8826e84..2b13aab 100644 --- a/src/commands/obligation-escrow/endorse-transfer-owner.ts +++ b/src/commands/obligation-escrow/endorse-transfer-owner.ts @@ -18,13 +18,11 @@ export const describe = 'Endorse / transfer beneficiary (owner) of a BoE obligat export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, endorseHandler); -export const promptForInputs = - async (): Promise => { - const base = await promptBaseObligationEscrowInputs(); - if (!base) return null; - const newBeneficiary = await promptAddress('new beneficiary', 'endorsed owner'); - return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; - }; +export const promptForInputs = async (): Promise => { + const base = await promptBaseObligationEscrowInputs(); + const newBeneficiary = await promptAddress('new beneficiary', 'endorsed owner'); + return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; +}; export const endorseHandler = async (args: ObligationEscrowNominateBeneficiaryCommand) => { try { @@ -36,7 +34,6 @@ export const endorseHandler = async (args: ObligationEscrowNominateBeneficiaryCo sdk: transferBeneficiaryObligationRegistry as any, sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -47,6 +44,5 @@ export const endorseHandler = async (args: ObligationEscrowNominateBeneficiaryCo ); } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/nominate-transfer-owner.ts b/src/commands/obligation-escrow/nominate-transfer-owner.ts index 30ea9c1..c9340a9 100644 --- a/src/commands/obligation-escrow/nominate-transfer-owner.ts +++ b/src/commands/obligation-escrow/nominate-transfer-owner.ts @@ -18,13 +18,11 @@ export const describe = 'Nominate a new beneficiary (owner) for a BoE obligation export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, nominateHandler); -export const promptForInputs = - async (): Promise => { - const base = await promptBaseObligationEscrowInputs(); - if (!base) return null; - const newBeneficiary = await promptAddress('new beneficiary', 'nominee'); - return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; - }; +export const promptForInputs = async (): Promise => { + const base = await promptBaseObligationEscrowInputs(); + const newBeneficiary = await promptAddress('new beneficiary', 'nominee'); + return { ...base, newBeneficiary } as ObligationEscrowNominateBeneficiaryCommand; +}; export const nominateHandler = async (args: ObligationEscrowNominateBeneficiaryCommand) => { try { @@ -36,7 +34,6 @@ export const nominateHandler = async (args: ObligationEscrowNominateBeneficiaryC sdk: nominateObligationRegistry as any, sdkParams: { newBeneficiaryAddress: args.newBeneficiary, remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -47,6 +44,5 @@ export const nominateHandler = async (args: ObligationEscrowNominateBeneficiaryC ); } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/reject-return-to-issuer.ts b/src/commands/obligation-escrow/reject-return-to-issuer.ts index 058b73c..023683f 100644 --- a/src/commands/obligation-escrow/reject-return-to-issuer.ts +++ b/src/commands/obligation-escrow/reject-return-to-issuer.ts @@ -28,7 +28,6 @@ export const rejectReturnedHandler = async (args: BaseObligationEscrowCommand) = sdk: rejectReturnedObligationRegistry as any, sdkParams: { tokenId: args.tokenId, remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, diff --git a/src/commands/obligation-escrow/reject-transfer-holder.ts b/src/commands/obligation-escrow/reject-transfer-holder.ts index c0455a8..edf2479 100644 --- a/src/commands/obligation-escrow/reject-transfer-holder.ts +++ b/src/commands/obligation-escrow/reject-transfer-holder.ts @@ -29,7 +29,6 @@ export const rejectTransferHolderHandler = async (args: BaseObligationEscrowComm sdk: rejectTransferHolderObligationRegistry as any, sdkParams: { remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -40,6 +39,5 @@ export const rejectTransferHolderHandler = async (args: BaseObligationEscrowComm ); } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/reject-transfer-owner-holder.ts b/src/commands/obligation-escrow/reject-transfer-owner-holder.ts index dc965c9..a5b5a73 100644 --- a/src/commands/obligation-escrow/reject-transfer-owner-holder.ts +++ b/src/commands/obligation-escrow/reject-transfer-owner-holder.ts @@ -27,7 +27,6 @@ export const rejectTransferOwnersHandler = async (args: BaseObligationEscrowComm sdk: rejectTransferOwnersObligationRegistry as any, sdkParams: { remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, diff --git a/src/commands/obligation-escrow/reject-transfer-owner.ts b/src/commands/obligation-escrow/reject-transfer-owner.ts index 38d0f77..8cf3735 100644 --- a/src/commands/obligation-escrow/reject-transfer-owner.ts +++ b/src/commands/obligation-escrow/reject-transfer-owner.ts @@ -27,7 +27,6 @@ export const rejectTransferOwnerHandler = async (args: BaseObligationEscrowComma sdk: rejectTransferBeneficiaryObligationRegistry as any, sdkParams: { remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, diff --git a/src/commands/obligation-escrow/reject.ts b/src/commands/obligation-escrow/reject.ts index 7691b61..476eec8 100644 --- a/src/commands/obligation-escrow/reject.ts +++ b/src/commands/obligation-escrow/reject.ts @@ -26,7 +26,6 @@ export const rejectHandler = async (args: BaseObligationEscrowCommand) => { sdk: rejectObligationRegistry as any, sdkParams: { remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, diff --git a/src/commands/obligation-escrow/return-to-issuer.ts b/src/commands/obligation-escrow/return-to-issuer.ts index 9937be5..0e0ae94 100644 --- a/src/commands/obligation-escrow/return-to-issuer.ts +++ b/src/commands/obligation-escrow/return-to-issuer.ts @@ -27,7 +27,6 @@ export const returnToIssuerHandler = async (args: BaseObligationEscrowCommand) = sdk: returnToIssuerObligationRegistry as any, sdkParams: { remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, diff --git a/src/commands/obligation-escrow/runTx.ts b/src/commands/obligation-escrow/runTx.ts index 5cb8cce..fd5053a 100644 --- a/src/commands/obligation-escrow/runTx.ts +++ b/src/commands/obligation-escrow/runTx.ts @@ -35,7 +35,7 @@ export const runObligationEscrowTx = async (opts: { populate: PopulateFn; sdk: SdkCall; sdkParams: Record; -}): Promise => { +}): Promise => { const { args, populate, sdk, sdkParams } = opts; const { obligationRegistryAddress, tokenId, remark, encryptionKey, network, ...rest } = args; const wallet = await getWalletOrSigner({ network, ...rest }); @@ -59,12 +59,8 @@ export const runObligationEscrowTx = async (opts: { }, }); - if (shouldProceed === null) { - process.exitCode = 1; - return null; - } if (!shouldProceed) { - return null; + process.exit(0); } const contractOptions = { obligationRegistryAddress, tokenId }; diff --git a/src/commands/obligation-escrow/shared.ts b/src/commands/obligation-escrow/shared.ts index 86a1fa8..46ec8ff 100644 --- a/src/commands/obligation-escrow/shared.ts +++ b/src/commands/obligation-escrow/shared.ts @@ -9,60 +9,44 @@ import { } from '../../utils'; import { BaseObligationEscrowCommand } from '../../types'; -/** @inquirer/prompts rejects with ExitPromptError when the user cancels (e.g. Ctrl+C). */ -export const isPromptCancellation = (err: unknown): boolean => - typeof err === 'object' && - err !== null && - 'name' in err && - (err as { name?: unknown }).name === 'ExitPromptError'; - /** * Shared prompt flow for obligation-escrow commands that only need document + wallet + remark. - * Returns null when the user cancels a prompt so runObligationEscrowCommand can exit quietly. + * Mirrors title-escrow prompt shape (throws on cancel / invalid input). */ -export const promptBaseObligationEscrowInputs = - async (): Promise => { - try { - const document = await promptAndReadDocument(); - await verifyDocumentSignature(document); - const { obligationRegistry, tokenId, network, documentId } = - await extractObligationDocumentInfo(document); - const { encryptedWalletPath, key, keyFile } = await promptWalletSelection(); - const remark = await promptRemark('v5'); - - const baseResult = { - network, - obligationRegistryAddress: obligationRegistry, - tokenId, - remark, - encryptionKey: documentId, - maxPriorityFeePerGasScale: 1, - }; +export const promptBaseObligationEscrowInputs = async (): Promise => { + const document = await promptAndReadDocument(); + await verifyDocumentSignature(document); + const { obligationRegistry, tokenId, network, documentId } = + await extractObligationDocumentInfo(document); + const { encryptedWalletPath, key, keyFile } = await promptWalletSelection(); + const remark = await promptRemark('v5'); - if (encryptedWalletPath) { - return { ...baseResult, encryptedWalletPath } as BaseObligationEscrowCommand; - } - if (keyFile) { - return { ...baseResult, keyFile } as BaseObligationEscrowCommand; - } - if (key) { - return { ...baseResult, key } as BaseObligationEscrowCommand; - } - return baseResult as BaseObligationEscrowCommand; - } catch (err) { - if (isPromptCancellation(err)) { - return null; - } - throw err; - } + const baseResult = { + network, + obligationRegistryAddress: obligationRegistry, + tokenId, + remark, + encryptionKey: documentId, + maxPriorityFeePerGasScale: 1, }; + if (encryptedWalletPath) { + return { ...baseResult, encryptedWalletPath } as BaseObligationEscrowCommand; + } + if (keyFile) { + return { ...baseResult, keyFile } as BaseObligationEscrowCommand; + } + if (key) { + return { ...baseResult, key } as BaseObligationEscrowCommand; + } + return baseResult as BaseObligationEscrowCommand; +}; + /** - * Runs prompt → command with shared failure logging and non-zero exit on error. - * Prompt cancellation (falsy answers) returns without setting exitCode. + * Runs prompt → command with the same try/catch shape as title-escrow handlers. */ export const runObligationEscrowCommand = async ( - promptForInputs: () => Promise, + promptForInputs: () => Promise, commandHandler: (args: TArgs) => Promise, ): Promise => { try { @@ -71,6 +55,5 @@ export const runObligationEscrowCommand = async ( await commandHandler(answers); } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/status.ts b/src/commands/obligation-escrow/status.ts index c1781fc..b3d0b9a 100644 --- a/src/commands/obligation-escrow/status.ts +++ b/src/commands/obligation-escrow/status.ts @@ -14,7 +14,7 @@ import { promptAndReadDocument, verifyDocumentSignature, } from '../../utils'; -import { runObligationEscrowCommand, isPromptCancellation } from './shared'; +import { runObligationEscrowCommand } from './shared'; export const command = 'status'; export const describe = 'Read BoE obligation escrow status / registration / termination reason'; @@ -41,22 +41,15 @@ export type ObligationEscrowStatusCommand = Pick< export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, statusHandler); -export const promptForInputs = async (): Promise => { - try { - const document = await promptAndReadDocument(); - await verifyDocumentSignature(document); - const { obligationRegistry, tokenId, network } = await extractObligationDocumentInfo(document); - return { - network, - obligationRegistryAddress: obligationRegistry, - tokenId, - }; - } catch (err) { - if (isPromptCancellation(err)) { - return null; - } - throw err; - } +export const promptForInputs = async (): Promise => { + const document = await promptAndReadDocument(); + await verifyDocumentSignature(document); + const { obligationRegistry, tokenId, network } = await extractObligationDocumentInfo(document); + return { + network, + obligationRegistryAddress: obligationRegistry, + tokenId, + }; }; export const statusHandler = async (args: ObligationEscrowStatusCommand) => { diff --git a/src/commands/obligation-escrow/transfer-holder.ts b/src/commands/obligation-escrow/transfer-holder.ts index 93d059f..ddacdfb 100644 --- a/src/commands/obligation-escrow/transfer-holder.ts +++ b/src/commands/obligation-escrow/transfer-holder.ts @@ -18,9 +18,8 @@ export const describe = 'Transfer the holder of a BoE obligation record'; export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, changeHolderHandler); -export const promptForInputs = async (): Promise => { +export const promptForInputs = async (): Promise => { const base = await promptBaseObligationEscrowInputs(); - if (!base) return null; const newHolder = await promptAddress('new holder', 'new holder'); return { ...base, newHolder } as ObligationEscrowTransferHolderCommand; }; @@ -38,7 +37,6 @@ export const changeHolderHandler = async (args: ObligationEscrowTransferHolderCo sdk: transferHolderObligationRegistry as any, sdkParams: { holderAddress: args.newHolder, remarks: args.remark }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, @@ -49,6 +47,5 @@ export const changeHolderHandler = async (args: ObligationEscrowTransferHolderCo ); } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/transfer-owner-holder.ts b/src/commands/obligation-escrow/transfer-owner-holder.ts index 34aa719..62a5146 100644 --- a/src/commands/obligation-escrow/transfer-owner-holder.ts +++ b/src/commands/obligation-escrow/transfer-owner-holder.ts @@ -18,9 +18,8 @@ export const handler = async (): Promise => runObligationEscrowCommand(promptForInputs, transferOwnersHandler); export const promptForInputs = - async (): Promise => { + async (): Promise => { const base = await promptBaseObligationEscrowInputs(); - if (!base) return null; const newOwner = await promptAddress('new beneficiary', 'new owner'); const newHolder = await promptAddress('new holder', 'new holder'); return { ...base, newOwner, newHolder } as ObligationEscrowEndorseTransferOfOwnersCommand; @@ -43,7 +42,6 @@ export const transferOwnersHandler = async ( remarks: args.remark, }, }); - if (!transaction) return; displayTransactionPrice( transaction as unknown as TransactionReceiptFees, args.network as NetworkCmdName, diff --git a/src/commands/obligation-registry/deploy.ts b/src/commands/obligation-registry/deploy.ts index 5afe615..878859a 100644 --- a/src/commands/obligation-registry/deploy.ts +++ b/src/commands/obligation-registry/deploy.ts @@ -29,7 +29,6 @@ export const handler = async (): Promise => { await deployObligationRegistryContract(answers); } catch (err: unknown) { error(err instanceof Error ? err.message : String(err)); - process.exitCode = 1; } }; @@ -113,7 +112,7 @@ export const deployObligationRegistryContract = async ({ // Dry-run only when the registry deploy tx can be populated (factory address known). // When the factory is deployed first, skip estimation and report fees from the receipt. - let shouldProceed: boolean | null = true; + let shouldProceed = true; if (escrowFactoryAddress) { shouldProceed = await performDryRunWithConfirmation({ network, @@ -137,12 +136,8 @@ export const deployObligationRegistryContract = async ({ ); } - if (shouldProceed === null) { - process.exitCode = 1; - return null; - } if (!shouldProceed) { - return null; + process.exit(0); } info(`Deploying obligation registry ${registryName}`); @@ -167,6 +162,5 @@ export const deployObligationRegistryContract = async ({ return result.obligationRegistry; } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; diff --git a/src/commands/obligation-registry/mint.ts b/src/commands/obligation-registry/mint.ts index 7b4eb4d..9997df1 100644 --- a/src/commands/obligation-registry/mint.ts +++ b/src/commands/obligation-registry/mint.ts @@ -33,7 +33,6 @@ export const handler = async (): Promise => { await mintObligationToken(answers); } catch (err: unknown) { error(err instanceof Error ? err.message : String(err)); - process.exitCode = 1; } }; @@ -83,7 +82,6 @@ export const mintObligationToken = async (args: ObligationRegistryMintCommand) = ...args, tokenId: addAddressPrefix(args.tokenId), }); - if (!transaction) return; displayTransactionPrice(transaction as any, args.network as NetworkCmdName); success( @@ -95,7 +93,6 @@ export const mintObligationToken = async (args: ObligationRegistryMintCommand) = return args.address; } catch (e) { error(getErrorMessage(e)); - process.exitCode = 1; } }; @@ -108,7 +105,7 @@ const mintToObligationRegistry = async ({ encryptionKey, network, ...rest -}: ObligationRegistryMintCommand): Promise => { +}: ObligationRegistryMintCommand): Promise => { const wallet = await getWalletOrSigner({ network, ...rest }); const shouldProceed = await performDryRunWithConfirmation({ @@ -126,13 +123,8 @@ const mintToObligationRegistry = async ({ }, }); - // null = definitive dry-run revert; false = user cancel — do not process.exit(0) - if (shouldProceed === null) { - process.exitCode = 1; - return null; - } if (!shouldProceed) { - return null; + process.exit(0); } let transaction; diff --git a/src/utils/cli-errors.ts b/src/utils/cli-errors.ts index b8f4ef5..9a8a400 100644 --- a/src/utils/cli-errors.ts +++ b/src/utils/cli-errors.ts @@ -1,7 +1,4 @@ -/** - * Shared helpers for decoding ethers CALL_EXCEPTION / custom errors into - * clear CLI messages (gas estimation often leaves revert.name unset). - */ +// CLI error helpers: turn caught errors into clear messages for the user. export type ErrnoException = NodeJS.ErrnoException; @@ -14,245 +11,6 @@ export type CliErrorOptions = { const DEFAULT_PATH_PLACEHOLDER = 'the specified path'; -/** Known on-chain custom errors → actionable CLI guidance. */ -const KNOWN_REVERT_MESSAGES: Record = { - OwnerHolderMustDiffer: - 'Beneficiary (owner) and holder must be different wallets before accept/reject can run. Remint with different beneficiary and holder addresses.', - CallerNotBeneficiary: 'Connected wallet is not the beneficiary for this obligation.', - CallerNotHolder: 'Connected wallet is not the holder for this obligation.', - NotRegistered: "This token ID hasn't been minted on this registry yet.", - RemarkLengthExceeded: 'The remark is too long. Shorten it and try again.', - RegistryContractPaused: 'This registry is paused — unpause it before continuing.', - InactiveTitleEscrow: 'This obligation escrow is inactive.', - TitleEscrowNotHoldingToken: 'This escrow is not holding the token.', - DualRoleRejectionRequired: - 'Both beneficiary and holder roles are required to reject this transfer.', - TokenNotReturnedToIssuer: 'Token must be returned to issuer before this action.', - RecipientAlreadyHolder: 'Recipient is already the holder.', - InvalidNominee: 'The nominee address is invalid.', - InvalidTransferToZeroAddress: 'Cannot transfer to the zero address.', - NomineeAlreadyNominated: 'This nominee is already nominated.', - TargetNomineeAlreadyBeneficiary: 'The nominee is already the beneficiary.', - AlreadyRegistered: 'This token ID is already minted on this registry.', - TokenExists: 'This token ID already exists on this registry.', - AccessControlUnauthorizedAccount: 'Connected wallet is not authorized for this action.', - CallerNotMinter: 'Connected wallet does not hold MINTER_ROLE on this registry.', - InvalidStatusTransition: 'This action is not allowed from the current obligation status.', - EmptyReceivingData: 'Receiving data was empty.', - InvalidTokenId: 'The token ID is invalid.', - InvalidRegistry: 'The registry address is invalid.', -}; - -/** - * keccak256 selectors for no-arg / known signatures. Gas estimation often returns - * only `data: 0x` with shortMessage "execution reverted (unknown custom error)". - */ -const REVERT_SELECTOR_TO_NAME: Record = { - '0x7e288225': 'OwnerHolderMustDiffer', - '0xf52018ac': 'CallerNotBeneficiary', - '0x667b3fbf': 'CallerNotHolder', - '0xaba47339': 'NotRegistered', - '0x14086584': 'RemarkLengthExceeded', - '0xad49811c': 'RegistryContractPaused', - '0x7c339b19': 'InactiveTitleEscrow', - '0x2fd39523': 'TitleEscrowNotHoldingToken', - '0x8c90bf45': 'DualRoleRejectionRequired', - '0xd5475a0b': 'TokenNotReturnedToIssuer', - '0x702e6e62': 'RecipientAlreadyHolder', - '0x1c98cac3': 'InvalidNominee', - '0x2c75c45a': 'InvalidTransferToZeroAddress', - '0x98f83ce8': 'NomineeAlreadyNominated', - '0xdd9f921d': 'TargetNomineeAlreadyBeneficiary', - '0x3a81d6fc': 'AlreadyRegistered', - '0x55c7e8ba': 'TokenExists', - '0x10daa94f': 'EmptyReceivingData', - '0xe3962ba3': 'InvalidStatusTransition', - '0xed15e6cf': 'InvalidTokenId', - '0x540b9601': 'InvalidRegistry', - '0xbd805e91': 'InvalidTokenTransferToZeroAddressOwners', - '0xe2517d3f': 'AccessControlUnauthorizedAccount', - '0x5eee367a': 'CallerNotMinter', -}; - -const UNKNOWN_CUSTOM_ERROR = /unknown custom error/i; - -/** Solidity custom errors are PascalCase identifiers (e.g. OwnerHolderMustDiffer). */ -const SOLIDITY_CUSTOM_ERROR_NAME = /^[A-Z][A-Za-z0-9_]*$/; - -const isKnownRevertName = (label: string): boolean => - label in KNOWN_REVERT_MESSAGES || Object.values(REVERT_SELECTOR_TO_NAME).includes(label); - -type EthersCallException = { - reason?: unknown; - shortMessage?: unknown; - message?: unknown; - revert?: { name?: unknown }; - errorName?: unknown; - code?: unknown; - data?: unknown; - info?: { error?: { data?: unknown; message?: unknown } }; - error?: { data?: unknown; message?: unknown }; -}; - -const asEthersError = (value: unknown): EthersCallException | null => - typeof value === 'object' && value !== null ? (value as EthersCallException) : null; - -const normalizeLabel = (raw: string): string | undefined => { - const cleaned = raw.trim().replace(/\(\)$/, ''); - if (!cleaned || UNKNOWN_CUSTOM_ERROR.test(cleaned) || cleaned === '(unknown custom error)') { - return undefined; - } - // Only accept a full-string PascalCase Solidity custom-error identifier (e.g. - // OwnerHolderMustDiffer), not lowercase/free-text reasons — those fall through - // to describeContractError. - if (SOLIDITY_CUSTOM_ERROR_NAME.test(cleaned)) { - return cleaned; - } - return undefined; -}; - -/** Labels after generic "failed:" — only known on-chain revert names. */ -const acceptFailedSuffixLabel = (raw: string): string | undefined => { - const label = normalizeLabel(raw); - if (!label) return undefined; - if (isKnownRevertName(label)) return label; - return undefined; -}; - -const labelFromWrappedMessage = (message: string): string | undefined => { - const fromContract = message.match(/Contract reverted with\s+([A-Za-z0-9_]+)/); - if (fromContract?.[1]) { - const label = normalizeLabel(fromContract[1]); - if (label) return label; - } - const fromFailed = message.match(/failed:\s*([A-Za-z0-9_]+)/); - if (fromFailed?.[1]) { - return acceptFailedSuffixLabel(fromFailed[1]); - } - return undefined; -}; - -const collectPossibleData = (err: EthersCallException): string[] => { - const values: unknown[] = [err.data, err.info?.error?.data, err.error?.data]; - const out: string[] = []; - for (const v of values) { - if (typeof v === 'string' && /^0x[0-9a-fA-F]+$/i.test(v)) { - out.push(v.toLowerCase()); - } else if (typeof v === 'object' && v !== null && 'data' in v) { - const nested = (v as { data?: unknown }).data; - if (typeof nested === 'string' && /^0x[0-9a-fA-F]+$/i.test(nested)) { - out.push(nested.toLowerCase()); - } - } - } - return out; -}; - -const labelFromRevertData = (err: EthersCallException): string | undefined => { - for (const data of collectPossibleData(err)) { - if (data === '0x') continue; - const selector = data.slice(0, 10); - if (REVERT_SELECTOR_TO_NAME[selector]) { - return REVERT_SELECTOR_TO_NAME[selector]; - } - } - return undefined; -}; - -export function extractContractRevertLabel(error: unknown): string | undefined { - const err = asEthersError(error); - // Error instances are objects, so asEthersError always succeeds for them — - // free-text Error.message is handled below via err.message / labelFromWrappedMessage. - if (!err) { - return undefined; - } - - const revertName = err.revert?.name ?? err.errorName; - if (typeof revertName === 'string') { - const label = normalizeLabel(revertName); - if (label) return label; - } - - if (typeof err.reason === 'string') { - const label = normalizeLabel(err.reason); - if (label) return label; - } - - // Prefer selector decoding before shortMessage — gas estimate often only has - // "execution reverted (unknown custom error)" + data: 0x7e288225 - const fromData = labelFromRevertData(err); - if (fromData) return fromData; - - if (typeof err.shortMessage === 'string' && err.shortMessage.trim()) { - if (!UNKNOWN_CUSTOM_ERROR.test(err.shortMessage)) { - const match = err.shortMessage.match(/execution reverted(?::\s*)?(.+)?/i); - if (match?.[1]) { - const label = normalizeLabel(match[1]); - if (label) return label; - } - } - } - - if (typeof err.message === 'string') { - const custom = err.message.match(/execution reverted:\s*([A-Za-z0-9_]+)/); - if (custom?.[1]) { - const label = normalizeLabel(custom[1]); - if (label) return label; - } - const wrapped = labelFromWrappedMessage(err.message); - if (wrapped) return wrapped; - } - - return undefined; -} - -/** True when the failure is a definitive on-chain revert (not a transient gas/RPC issue). */ -export function isContractCallException(error: unknown): boolean { - const err = asEthersError(error); - if (!err) { - return false; - } - if (err.code === 'CALL_EXCEPTION') return true; - if (err.revert?.name || err.errorName) return true; - if (labelFromRevertData(err)) return true; - return Boolean(extractContractRevertLabel(error)); -} - -/** Maps ethers / contract errors to a short user-facing message. */ -export function describeContractError(error: unknown): string { - const label = extractContractRevertLabel(error); - if (label && KNOWN_REVERT_MESSAGES[label]) { - return `${label}: ${KNOWN_REVERT_MESSAGES[label]}`; - } - if (label) { - return `Contract reverted with ${label}`; - } - - const err = asEthersError(error); - if (err) { - // Never surface the useless ethers placeholder as the final message - if ( - typeof err.shortMessage === 'string' && - err.shortMessage.trim() && - !UNKNOWN_CUSTOM_ERROR.test(err.shortMessage) - ) { - return err.shortMessage; - } - if (typeof err.reason === 'string' && err.reason.trim()) { - return err.reason; - } - if (typeof err.message === 'string' && err.message.trim()) { - return err.message.split('\n')[0]!; - } - } - - if (error instanceof Error && error.message) { - return error.message.split('\n')[0]!; - } - - return String(error); -} - export function isErrnoException(err: unknown): err is ErrnoException { return ( typeof err === 'object' && diff --git a/src/utils/cli-options.ts b/src/utils/cli-options.ts index 07ec98d..456bfba 100644 --- a/src/utils/cli-options.ts +++ b/src/utils/cli-options.ts @@ -12,8 +12,7 @@ import { readDocumentFile } from './file-io'; import { getTokenRegistryAddress, getTokenId, getChainId } from '@trustvc/trustvc'; import fs from 'fs'; import { getTokenRegistryVersion } from '../commands/helpers'; -import { getErrorMessage } from './formatting'; -import { isContractCallException } from './cli-errors'; +import { getErrorMessage } from './index'; import { dryRunMode } from './dryRun'; export interface NetworkOption { @@ -535,8 +534,7 @@ export const shouldRunDryRun = (network: string): boolean => { /** * Performs automatic dry run for specified networks with gas estimation and user confirmation - * Uses the existing dryRunMode function for comprehensive display. - * @returns `true` to proceed, `false` if the user cancelled, `null` if dry-run hit a definitive revert + * Uses the existing dryRunMode function for comprehensive display */ export const performDryRunWithConfirmation = async ({ network, @@ -544,7 +542,7 @@ export const performDryRunWithConfirmation = async ({ }: { network: string; getTransactionCallback: () => Promise; -}): Promise => { +}): Promise => { if (!shouldRunDryRun(network)) { return true; // Proceed without dry run for other networks } @@ -574,16 +572,7 @@ export const performDryRunWithConfirmation = async ({ info('\n✅ Proceeding with transaction...'); return true; } catch (estimateError) { - const message = getErrorMessage(estimateError); - // Definitive on-chain reverts will never succeed if broadcast — abort instead of - // offering "proceed anyway" (which only dumps a larger callStatic stack next). - if (isContractCallException(estimateError)) { - error(`Transaction would revert: ${message}`); - info('Transaction cancelled.'); - return null; - } - - error(`Gas estimation failed: ${message}`); + error(`Gas estimation failed: ${getErrorMessage(estimateError)}`); const proceedAnyway = await confirm({ message: 'Gas estimation failed. Do you want to proceed anyway?', default: false, diff --git a/src/utils/formatting.ts b/src/utils/formatting.ts index cbdd83b..dd7faf9 100644 --- a/src/utils/formatting.ts +++ b/src/utils/formatting.ts @@ -1,5 +1,4 @@ import chalk from 'chalk'; -import { describeContractError, isContractCallException } from './cli-errors'; export const addAddressPrefix = (address: string): string => address.startsWith('0x') ? address : `0x${address}`; @@ -34,27 +33,11 @@ const toErrorWithMessage = function (maybeError: unknown): ErrorWithMessage { export const extractErrorMessage = (error: unknown): string => toErrorWithMessage(error).message; export const getErrorMessage = function (error: unknown): string { - // Prefer structured ethers / custom-error decoding over raw `reason` (often null). - if (isContractCallException(error)) { - return describeContractError(error); - } - if (error instanceof Error) { - const reason = - 'reason' in error && typeof (error as { reason?: unknown }).reason === 'string' - ? (error as { reason: string }).reason.trim() - : ''; - if (reason) return reason; - - // SDK may already wrap: "Pre-check for accept failed: OwnerHolderMustDiffer: ..." - if (/Pre-check .* failed:/i.test(error.message)) { - return describeContractError(error); - } - - return error.message.split('\n')[0]!; + return 'reason' in error ? (error['reason'] as string) : error.message; + } else { + return extractErrorMessage(error); } - - return describeContractError(error) || extractErrorMessage(error); }; // Captures console.warn for a function to handle expected console.warn. diff --git a/tests/utils/contract-errors.test.ts b/tests/utils/contract-errors.test.ts deleted file mode 100644 index 8f4e97d..0000000 --- a/tests/utils/contract-errors.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { describe, expect, it } from 'vitest'; -import { - describeContractError, - extractContractRevertLabel, - getErrorMessage, - isContractCallException, -} from '../../src/utils'; - -describe('contract revert error formatting', () => { - const ownerHolderError = Object.assign(new Error('execution reverted: OwnerHolderMustDiffer()'), { - code: 'CALL_EXCEPTION', - reason: null, - revert: { name: 'OwnerHolderMustDiffer', signature: 'OwnerHolderMustDiffer()', args: [] }, - shortMessage: 'execution reverted (unknown custom error)', - }); - - it('extracts OwnerHolderMustDiffer from ethers call exceptions', () => { - expect(extractContractRevertLabel(ownerHolderError)).toBe('OwnerHolderMustDiffer'); - expect(isContractCallException(ownerHolderError)).toBe(true); - }); - - it('maps OwnerHolderMustDiffer to an actionable message', () => { - expect(describeContractError(ownerHolderError)).toMatch( - /OwnerHolderMustDiffer: Beneficiary \(owner\) and holder must be different/, - ); - expect(getErrorMessage(ownerHolderError)).toMatch(/OwnerHolderMustDiffer:/); - }); - - it('does not return null when reason is null', () => { - expect(getErrorMessage(ownerHolderError)).not.toBe('null'); - expect(getErrorMessage(ownerHolderError)).toBeTruthy(); - }); - - it('decodes OwnerHolderMustDiffer from revert data when name is missing', () => { - // Typical gas-estimation shape: undecoded shortMessage + selector only - const gasEstimateError = Object.assign(new Error('execution reverted'), { - code: 'CALL_EXCEPTION', - reason: null, - data: '0x7e288225', - shortMessage: 'execution reverted (unknown custom error)', - }); - - expect(extractContractRevertLabel(gasEstimateError)).toBe('OwnerHolderMustDiffer'); - expect(getErrorMessage(gasEstimateError)).toMatch( - /OwnerHolderMustDiffer: Beneficiary \(owner\) and holder must be different/, - ); - expect(getErrorMessage(gasEstimateError)).not.toMatch(/unknown custom error/i); - }); - - it('rewrites SDK pre-check wrappers', () => { - const wrapped = new Error( - 'Pre-check for accept failed: OwnerHolderMustDiffer: Beneficiary (owner) and holder must be different wallets before accept/reject can run. Remint with different beneficiary and holder addresses.', - ); - expect(getErrorMessage(wrapped)).toMatch(/OwnerHolderMustDiffer:/); - }); - - it('rejects generic failed: suffixes that are not contract reverts', () => { - const preprocessing = new Error('SDK preprocessing failed: badInput'); - expect(extractContractRevertLabel(preprocessing)).toBeUndefined(); - expect(isContractCallException(preprocessing)).toBe(false); - }); - - it('rejects PascalCase failed: suffixes that are not known reverts', () => { - const preprocessing = new Error('SDK preprocessing failed: BadInput'); - expect(extractContractRevertLabel(preprocessing)).toBeUndefined(); - expect(isContractCallException(preprocessing)).toBe(false); - expect(getErrorMessage(preprocessing)).toBe('SDK preprocessing failed: BadInput'); - }); - - it('preserves Contract reverted with labels', () => { - const wrapped = new Error('Contract reverted with OwnerHolderMustDiffer'); - expect(extractContractRevertLabel(wrapped)).toBe('OwnerHolderMustDiffer'); - }); - - it('does not extract a label from multi-word free-text reasons', () => { - const freeText = Object.assign(new Error('execution reverted'), { - code: 'CALL_EXCEPTION', - reason: 'insufficient funds for gas * price + value', - shortMessage: 'insufficient funds for gas * price + value', - }); - expect(extractContractRevertLabel(freeText)).toBeUndefined(); - expect(describeContractError(freeText)).toBe('insufficient funds for gas * price + value'); - }); - - it('does not treat lowercase single-word reasons as Solidity custom errors', () => { - const timeout = Object.assign(new Error('timeout'), { - code: 'CALL_EXCEPTION', - reason: 'timeout', - shortMessage: 'timeout', - }); - expect(extractContractRevertLabel(timeout)).toBeUndefined(); - expect(describeContractError(timeout)).toBe('timeout'); - expect(describeContractError(timeout)).not.toMatch(/Contract reverted with timeout/); - }); -}); From 0dd6a8ee88eceb220d152d0e9e3d6c4fd368a96d Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 4 Aug 2026 00:17:47 +0530 Subject: [PATCH 28/40] Refactor command input handling and improve error responses - Streamlined input handling in various command files to ensure consistent null returns on user cancellation. - Enhanced error response mechanisms to provide clearer exit codes on transaction failures. - Updated README for improved documentation on command usage and error handling practices. --- .../verify.obligation.sepolia.test.ts | 94 +++++++++++++++++++ .../w3c-obligation-record-sepolia.json | 65 +++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 tests/commands/verify.obligation.sepolia.test.ts create mode 100644 tests/fixtures/obligation/w3c-obligation-record-sepolia.json diff --git a/tests/commands/verify.obligation.sepolia.test.ts b/tests/commands/verify.obligation.sepolia.test.ts new file mode 100644 index 0000000..a5395ae --- /dev/null +++ b/tests/commands/verify.obligation.sepolia.test.ts @@ -0,0 +1,94 @@ +import path from 'node:path'; +import { describe, expect, it } from 'vitest'; +import { readJsonFile } from '../../src/utils'; +import { SignedVerifiableCredential } from '@trustvc/trustvc'; + +const OBLIGATION_FIXTURES_DIR = path.resolve(process.cwd(), 'tests/fixtures/obligation'); +const W3C_OBLIGATION_FIXTURE = path.join( + OBLIGATION_FIXTURES_DIR, + 'w3c-obligation-record-sepolia.json', +); + +describe('Obligation record (BoE) — Sepolia testnet verify', () => { + // ─── W3C fixture structure (offline, no network) ────────────────────────── + // No OA v2 equivalent: obligation / BoE records are W3C VC only. + + describe('W3C obligation record fixture (structural)', () => { + it('fixture should be a W3C VC with an obligationRegistry credentialStatus', () => { + const doc = readJsonFile( + W3C_OBLIGATION_FIXTURE, + 'document', + ) as any; + expect(doc['@context']).toBeDefined(); + expect(doc.type).toContain('VerifiableCredential'); + expect(doc.credentialStatus.type).toBe('TransferableRecords'); + expect(doc.credentialStatus.obligationRegistry).toBeDefined(); + expect(doc.credentialStatus.tokenRegistry).toBeUndefined(); + }); + + it('fixture should target Sepolia testnet (chainId 11155111)', () => { + const doc = readJsonFile( + W3C_OBLIGATION_FIXTURE, + 'document', + ) as any; + expect(doc.credentialStatus.tokenNetwork.chain).toBe('Sepolia'); + expect(doc.credentialStatus.tokenNetwork.chainId).toBe(11155111); + }); + + it('fixture should reference the correct obligation registry and token ID', () => { + const doc = readJsonFile( + W3C_OBLIGATION_FIXTURE, + 'document', + ) as any; + expect(doc.credentialStatus.obligationRegistry).toBe( + '0xE8c7516BD4FC64DF039BAA586035dfaA57520BE4', + ); + expect(doc.credentialStatus.tokenId).toBe( + 'd518e8958af67b90441775e4836feb050240ace87ac086d30496169ea296b32e', + ); + }); + + it('fixture issuer should be did:web:didhost.vercel.app', () => { + const doc = readJsonFile( + W3C_OBLIGATION_FIXTURE, + 'document', + ) as any; + expect(doc.issuer).toBe('did:web:didhost.vercel.app'); + }); + + it('fixture should have a DataIntegrityProof', () => { + const doc = readJsonFile( + W3C_OBLIGATION_FIXTURE, + 'document', + ) as any; + expect(doc.proof.type).toBe('DataIntegrityProof'); + }); + }); + + // ─── Network routing (no live RPC needed) ──────────────────────────────── + + describe('network routing', () => { + it('chainId 11155111 maps to NetworkCmdName.Sepolia', async () => { + const { getSupportedNetworkNameFromId, getSupportedNetwork, NetworkCmdName } = + await import('../../src/utils/networks'); + expect(getSupportedNetworkNameFromId(11155111)).toBe(NetworkCmdName.Sepolia); + expect(getSupportedNetwork(NetworkCmdName.Sepolia)).toBeDefined(); + }); + + it('SEPOLIA_RPC env var overrides the default Infura provider for Sepolia', async () => { + const customRpc = 'https://sepolia.example.com/rpc'; + process.env.SEPOLIA_RPC = customRpc; + + const { getSupportedNetwork, NetworkCmdName } = await import('../../src/utils/networks'); + const { JsonRpcProvider } = await import('ethers'); + const provider = getSupportedNetwork(NetworkCmdName.Sepolia).provider(); + + delete process.env.SEPOLIA_RPC; + + expect(provider).toBeInstanceOf(JsonRpcProvider); + expect((provider as any)._getConnection?.().url ?? (provider as any).connection?.url).toBe( + customRpc, + ); + }); + }); +}); diff --git a/tests/fixtures/obligation/w3c-obligation-record-sepolia.json b/tests/fixtures/obligation/w3c-obligation-record-sepolia.json new file mode 100644 index 0000000..9bf3d42 --- /dev/null +++ b/tests/fixtures/obligation/w3c-obligation-record-sepolia.json @@ -0,0 +1,65 @@ +{ + "@context": [ + "https://www.w3.org/ns/credentials/v2", + "https://w3id.org/security/data-integrity/v2", + "https://trustvc.io/context/render-method-context-v2.json", + "https://trustvc.io/context/bill-of-exchange.json", + "https://trustvc.io/context/obligation-records-context.json", + "https://trustvc.io/context/qrcode-context.json" + ], + "renderMethod": [ + { + "type": "EMBEDDED_RENDERER", + "templateName": "BILL_OF_EXCHANGE", + "id": "http://localhost:9000" + } + ], + "credentialSubject": { + "electronicDocumentIdentifier": "urn:uuid:e6f4b2a1-9c3d-4e8f-a7b0-1d2e3f4a5b6c", + "referenceNumber": "BOE-2026-00147", + "amountInFigures": "128500.00", + "amountInWords": "One hundred twenty-eight thousand five hundred United States Dollars only", + "currencyCode": "USD", + "blDate": "2026-06-28", + "placeOfIssue": "Singapore", + "dateOfIssue": "2026-07-06", + "tenor": "At 90 days sight", + "payee": "Meridian Commodities Pte Ltd", + "drawnUnder": "Documentary Credit No. LC-DBS-2026-88341 / Invoice No. INV-2026-0456 / B/L No. BL-SIN-2026-0781", + "drawnUnderDate": "2026-06-15", + "issuedBy": "DBS Bank Ltd", + "drawee": { + "name": "Fairview Industries Inc.", + "address": "1201 Market Street, Suite 900, Wilmington, DE 19801, USA", + "authorisedSignatoryName": "James R. Carter", + "signature": "data:image/png;base64,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" + }, + "drawer": { + "name": "Meridian Commodities Pte Ltd", + "address": "8 Marina Boulevard, #24-01, Singapore 018981", + "authorisedSignatoryName": "Wei Ling Tan", + "signature": "data:image/png;base64,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" + } + }, + "type": ["VerifiableCredential"], + "credentialStatus": { + "type": "TransferableRecords", + "tokenNetwork": { + "chain": "Sepolia", + "chainId": 11155111 + }, + "obligationRegistry": "0xE8c7516BD4FC64DF039BAA586035dfaA57520BE4", + "tokenId": "d518e8958af67b90441775e4836feb050240ace87ac086d30496169ea296b32e" + }, + "issuer": "did:web:didhost.vercel.app", + "validFrom": "2026-07-06T09:00:00Z", + "id": "urn:uuid:019fb78d-6398-7555-b5c1-7d2b7d67d3bc", + "proof": { + "type": "DataIntegrityProof", + "created": "2026-07-31T09:42:04Z", + "verificationMethod": "did:web:didhost.vercel.app#keys-1", + "cryptosuite": "ecdsa-sd-2023", + "proofPurpose": "assertionMethod", + "proofValue": "u2V0AhVhAm65FcAUwH5rvLqYGqTPlXH8NEBHy8SJUPKgKvDqzpGsnVbth6CXjOo8XMhUkg6hxYZMXqyetyJyJ3sOZw4L1qFgjgCQCI0rB576lMvWjQwvsRh6WAeO-_Bvxfu0D-2A_xSblUv9YINwuawOQEsyxChM41qMSVrHJ-HisHqdCMCOTB0d2SU7MmCJYQCnXGlyzpEjGdi41vXkCPLt-vHrnh032cLlAMl1Azb4-eFSPZgi6P2AAyEaum9UQ9YncO5-DXqyqQOiP0axqiepYQKsezXwreBt3Q1crmaD68zmUZcoTUKVmEnYcrCPtXzBHtZl9ytS1CY79VDcBR93d6OWDuLzY2VuPQ48Tc37-1vRYQN2WDSzH92tGNpatUHZIJSq2Qy1GveTOCJkTNnG9mQ82UZBuncFRQH0--U2DblbxukGlPQamUmP55IVme25IvuVYQCGuVaeW0VuYtNbyHCM8lKdz1D-ctWkiSdozUHC1KtQwMUWxtxj-M2L-Ft7ufXfiCcIziDkNcaYuryIXuAT9DRFYQPzkyw3TsBQ8V5v8mUSHaZSu5b05D3zFXpeRfePaOgeVA5BDd1cB5PEdO8KntsA4Y5R4ij1MMei9rQTu66tKE1FYQMIoUtRwul_QpWWI6G_Yc9cNt6VY8S1Vh9xSGFkz9mYgh__JMaKpzJ8OYaGTW1Ue8wOEyyKidnDS3JCf8QaGFPtYQP8URQShugqpr26JVN914ShgzLuSgHfOy8GjY-DNEYnaIFcfa6hs8hedb5lE3dOp67uGYXdnMaVN0itZTuNiu7tYQPydYJ96ecxyaWtC6Le-hxGclkcQHskH0JLt3717CBIws6novpT2pfRbRM3I6h3J2BxK8-6RHx0OOZ_rEpqcaH5YQIydZMPyLayc_SKPLG8KUJM-GngjjKOCAtUexTxOD66amNVcGAm8Ni-odBQZN3pDulPgVWIjnYfhjI8RUqsT4z9YQIcuzoq4teeosn4BQ2ZNan6l_Ofg6xX7K86Xgx4MSYOcOLA0bKVPIimBkytOmWL4robL_x_t4BS4yxlnGRkgxnlYQBnN2CNQ0tY8ORmofg_bWcmyy-BcFyurMiM4M9-sA_VVpkEgyypMMiozCt2T2f_G7EL9hAfpwltBqWfgNQxvTztYQOhn6cDpioAtCAcEr3_3PrzQyDpUmrs4re9TkPt2l5pNJN0T-GGvoC5Gq2MnO4k18o0ikvNSacAg9Fl1v9qIWMFYQKs8Bm6cwB_MnHLiwpocK5VxygUgAtMvAePWsFFAEzybbobll1en-b9VPqhMNGpppHknmBfN_EiNLM6eFEg5gDlYQGfvI8Lfp4hwWu-v4DHqSF9RWRY9kUx3M-nRYQD_8SvQJF4xePv3tUioMICHdy0b5Dyxs2XRw_LRSgpBeqQImOdYQJKVBH6H_wqmajXXUeofMy_GXGRr4Ao-50g3OSij63EMYs4BnvS1n_Dxg0qcm-mDTcDPFa38Fwmc_CdBCZSSBjJYQOOh2JQayFlTSY0TW5ss6Bi_63WSxYw8kyM8OydBmInQflYYpujQsJED80pzO1XeLiIP2g28cXTOp4W2Nsrm245YQDBDfAtMb3namoMoXADB4sgTlZrnEj0cR-oGgTDDJUhch6KBiT8K1KKdaEN4cYGYAnubqltuhec1XoJ-9hqy6RBYQHv4gKZ-OiOoy_pxGOQDUkso_8pNnxC3axBSp0YPsKg8o4PeHStZF5ZABxjv9oeyB1tO0ElHlDImtzG6NEHaHGpYQIQd9jbblx73ySfToU5f3NYEk9lWGzrq3nuUJXhwL2A818GNb9jbLElUwTMhcqxuaBNyjicsAM1VH2UskV-aN3ZYQFYSH3GQyYvhaUbuiuZVCcD-l-Oe2X2maN9q9iICIoboBldun_7gj8fl2eu7LHJZEJ7A1zsD6PkxqvHkpU7y8eFYQGbJ-5pjVrB6b2qz-Ps93G3IoCr-OxcZNu4UL-J_s-fThMkat2GJoQuUnL6Sh6wjdAykDBQEBC3rh_ec8-uSpW9YQOeahTs3hJ5vILvC2tnphReWEsv2B-MSy8ZujJmSjkYKLfG1gVVh4YrCrCTyQh8onPVOaYo22_9neYeLU1oPb15YQA6g4yrxjHqU9AKEfSAOyuXuPpgRjlqO_vSav1a5oDHVEV9cMcPl5T7ji9WVoxp7Bg_TBvdU2B-UE53617zOea9YQAZVr6aaqFNHoK6IzI-VPCXPgTtJVir7kQjPIcGF3Rn9c4AMW6SUwRct_fD_PnOyWI77dUWi5uxGiqqKHfePzfdYQOjj2SEucVr4EVpK-Fnm_qvmbZIDDnZ1I0XINihZRRgjDEp_PvhTY2GD31A9okkaW9cOWPstpx_E2DJ8tzdp89FYQE22TYtzxEuHJawiCpVhe-iOLInwfrBZHwqBCid-l2ObwjSYgaSBiThx3-oEBASPzBqYVjis0BsimgaykFvQLIVYQGWpgMu7Ac7y-1aCpGaoqBfzGc3mhplozvfZE9pVlFgSRV3gbxgA1A9HJIOGT4f6Zj3cq3LNoaVtM7rY-Zzca-hYQMndHwFgVOcLfgi6k33MH41xLBhalo0QrFs-oKiZ_6x9oPSErDAjAnoQHKV0mk9Q9N1G0mhcsbsVhw-w9DA-4yBYQE6yuiDALO4LsDD0zP5lGJeF3_iMafK5WxVsbd_pNKlYAVGtiJs919b-2hEHHUtPND9oPLaMcmAlOiZZTpf7ZqJYQNYPDkPvRPELkGoNuDcMisXGop4Jzi3-OpgxIi2qrGrDGOFG3SiXoR2eYKyKRBBwROhzTQvdvxP_unipobuuc6NYQP5ntlfQZjAJPnfsusN4E89FVXT00Xiws3NaaKDFOgPCsAAM55cdZweS-mJBbySUDK9DtRLKiou08SygZFb9mSlYQAOzGzd5Rtp_sTm6JZe2lyQl1k4fQGAXYeVYZNCRRpsNrBB1QNXym_5Hm5buKUScCNrcJzCYHLveJqFYnBo0rjFYQMquAi8erK6ZicWC3QWjZrbBjNDzJMzES0WnUt8fGTOi8xI90OeIuPjtX0-GnaRh5in2tb86OsLmvWDwkmhnuEdYQD3AoYQDeZdJ0OE3LTO4UALgKCa3ZeDnuRsuvRk8WFlAMzCSbUFylKbwzmSFM79CsY7YPx1nikdgpiF4N2neXbWCZy9pc3N1ZXJqL3ZhbGlkRnJvbQ" + } +} From 355b791b8e54a702938a68e4fbdb559fe23641a6 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 4 Aug 2026 07:31:48 +0530 Subject: [PATCH 29/40] Update README.md Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8dae41f..23755b8 100644 --- a/README.md +++ b/README.md @@ -1734,7 +1734,7 @@ You do **not** need to call the TypeScript SDK directly — the CLI wraps it wit ### Before you start -1. **Install the CLI** — `npm install -g @trustvc/trustvc-cli` or `npx @trustvc/trustvc-cli ` +1. **Install the CLI** — `npm install -g `@trustvc/trustvc-cli`@beta` or `npx `@trustvc/trustvc-cli`@beta ` 2. **Node.js 22.19.5+** 3. **A wallet** — encrypted wallet file (recommended), private key, or key file 4. **A signed BoE document** — set `credentialStatus.obligationRegistry`, then sign with `trustvc w3c-sign` (not `tokenRegistry`) From c3b45eeeb13c2313cd64033ed99317197141d9fb Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 4 Aug 2026 11:30:05 +0530 Subject: [PATCH 30/40] Refactor obligation registry and escrow command handling - Introduced `toSdkSigner` utility to standardize signer handling across obligation registry and escrow commands. - Updated various command files to utilize `toSdkSigner`, enhancing consistency in signer usage. - Cleaned up unnecessary code and improved type definitions in utility files for better clarity and maintainability. - Enhanced test cases to ensure proper mocking and input handling in obligation escrow commands. From c56af5d90f1e1866626c51f569c7a73d768d1a59 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 4 Aug 2026 11:30:27 +0530 Subject: [PATCH 31/40] Refactor signer handling in obligation commands - Implemented `toSdkSigner` utility across obligation registry and escrow commands to standardize signer usage. - Updated command implementations to utilize the new utility, enhancing consistency and maintainability. - Cleaned up type definitions in utility files for improved clarity. - Adjusted test cases to ensure proper mocking and input handling in obligation escrow commands. --- package-lock.json | 14390 ++++++++-------- src/commands/obligation-escrow/status.ts | 11 +- src/commands/obligation-registry/deploy.ts | 14 +- src/commands/obligation-registry/mint.ts | 5 +- src/utils/cli-options.ts | 4 +- src/utils/wallet.ts | 22 +- .../accept-return-to-issuer.test.ts | 4 +- .../commands/obligation-escrow/accept.test.ts | 4 +- .../obligation-escrow/discharge.test.ts | 8 +- .../endorse-transfer-owner.test.ts | 4 +- .../nominate-transfer-owner.test.ts | 4 +- .../reject-return-to-issuer.test.ts | 4 +- .../reject-transfer-holder.test.ts | 4 +- .../reject-transfer-owner-holder.test.ts | 4 +- .../reject-transfer-owner.test.ts | 4 +- .../commands/obligation-escrow/reject.test.ts | 4 +- .../return-to-issuer.test.ts | 4 +- .../commands/obligation-escrow/status.test.ts | 4 +- .../obligation-escrow/transfer-holder.test.ts | 4 +- .../transfer-owner-holder.test.ts | 4 +- 20 files changed, 7417 insertions(+), 7089 deletions(-) diff --git a/package-lock.json b/package-lock.json index a694315..3ce359d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,94 +46,6 @@ "node": ">=22.19.5" } }, - " /Users/zineiq/Desktop/SGT/trustvc": { - "extraneous": true - }, - "../SGT/trustvc": { - "extraneous": true - }, - "../trustvc": { - "name": "@trustvc/trustvc", - "version": "2.11.0", - "extraneous": true, - "license": "Apache-2.0", - "dependencies": { - "@tradetrust-tt/dnsprove": "^2.18.0", - "@tradetrust-tt/ethers-aws-kms-signer": "^2.1.4", - "@tradetrust-tt/token-registry-v4": "npm:@tradetrust-tt/token-registry@^4.16.0", - "@tradetrust-tt/token-registry-v5": "npm:@tradetrust-tt/token-registry@^5.5.0", - "@tradetrust-tt/tradetrust": "^6.10.2", - "@tradetrust-tt/tt-verify": "^9.6.0", - "@trustvc/document-store": "^1.0.3", - "@trustvc/w3c": "^2.0.0", - "@trustvc/w3c-context": "^2.0.0", - "@trustvc/w3c-credential-status": "^2.0.0", - "@trustvc/w3c-issuer": "^2.0.0", - "@trustvc/w3c-vc": "^2.0.0", - "ethers": "^5.8.0", - "ethersV6": "npm:ethers@^6.14.4", - "js-sha3": "^0.9.3", - "node-fetch": "^2.7.0", - "node-forge": "^1.3.3", - "ts-chacha20": "^1.2.0" - }, - "devDependencies": { - "@commitlint/cli": "^19.8.0", - "@commitlint/config-conventional": "^19.8.0", - "@commitlint/config-nx-scopes": "^19.8.0", - "@commitlint/prompt": "^19.8.0", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", - "@nomiclabs/hardhat-ethers": "^2.2.3", - "@openzeppelin/contracts": "^5.3.0", - "@semantic-release/changelog": "^6.0.3", - "@semantic-release/git": "^10.0.1", - "@semantic-release/npm": "^9.0.2", - "@types/conventional-commits-parser": "^5.0.1", - "@types/gtag.js": "^0.0.20", - "@types/lodash": "^4.17.16", - "@types/mocha": "^10.0.10", - "@types/node": "^18.19.86", - "@types/node-fetch": "^2.6.12", - "@types/node-forge": "^1.3.14", - "@vitest/coverage-v8": "^1.6.1", - "concurrently": "^9.2.0", - "cpy": "^11.1.0", - "dotenv": "^16.5.0", - "eslint": "^9.25.1", - "eslint-config-prettier": "^9.1.0", - "eslint-formatter-table": "^7.32.1", - "eslint-plugin-jsdoc": "^50.6.9", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^5.2.6", - "eslint-plugin-promise": "^7.2.1", - "eth-testing": "^1.14.0", - "execa": "^9.5.2", - "hardhat": "^2.25.0", - "husky": "^9.1.7", - "jsdom": "^24.0.0", - "lint-staged": "^15.5.1", - "prettier": "^3.5.3", - "rimraf": "^5.0.10", - "semantic-release": "^20.1.3", - "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", - "tsup": "^8.4.0", - "typescript": "^5.8.3", - "typescript-eslint": "^8.31.0", - "vite-plugin-dts": "^3.9.1", - "vitest": "^1.6.1", - "wait-on": "^8.0.3" - }, - "engines": { - "node": ">=20.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "~4.40.0" - }, - "peerDependencies": { - "ethers": "^5.8.0" - } - }, "node_modules/@account-abstraction/contracts": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@account-abstraction/contracts/-/contracts-0.8.0.tgz", @@ -145,10 +57,11 @@ } }, "node_modules/@actions/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz", - "integrity": "sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.1.tgz", + "integrity": "sha512-a6d/Nwahm9fliVGRhdhofo40HjHQasUPusmc7vBfyky+7Z+P2A1J68zyFVaNcEclc/Se+eO595oAr5nwEIoIUA==", "dev": true, + "license": "MIT", "dependencies": { "@actions/exec": "^3.0.0", "@actions/http-client": "^4.0.0" @@ -159,200 +72,58 @@ "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz", "integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==", "dev": true, + "license": "MIT", "dependencies": { "@actions/io": "^3.0.2" } }, "node_modules/@actions/http-client": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.0.tgz", - "integrity": "sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.1.tgz", + "integrity": "sha512-+Nvd1ImaOZBSoPbsUtEhv+1z99H12xzncCkz0a3RuehINE81FZSe2QTj3uvAPTcJX/SCzUQHQ0D1GrPMbrPitg==", "dev": true, + "license": "MIT", "dependencies": { "tunnel": "^0.0.6", "undici": "^6.23.0" } }, + "node_modules/@actions/http-client/node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/@actions/io": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz", "integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", + "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "license": "MIT" }, "node_modules/@aws-sdk/client-kms": { - "version": "3.1003.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.1003.0.tgz", - "integrity": "sha512-XO11qsl/p+WTzOTf4o9w6aZZ0lh2QHwwpuv9en2fgtVL4PnibndWC4Ln/5CB9fJpeUsQo8dLAys1PVhTh4lcGQ==", + "version": "3.1102.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.1102.0.tgz", + "integrity": "sha512-NNWPWGSq3cYGmmqrEx18PfSbC3ZRBDrV/bejOTq/g51Jxf7/rZ0eBhQfJqdTX9GU+MNUuEC3eTGynWTC+Fs9kQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/credential-provider-node": "^3.972.17", - "@aws-sdk/middleware-host-header": "^3.972.7", - "@aws-sdk/middleware-logger": "^3.972.7", - "@aws-sdk/middleware-recursion-detection": "^3.972.7", - "@aws-sdk/middleware-user-agent": "^3.972.18", - "@aws-sdk/region-config-resolver": "^3.972.7", - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-endpoints": "^3.996.4", - "@aws-sdk/util-user-agent-browser": "^3.972.7", - "@aws-sdk/util-user-agent-node": "^3.973.3", - "@smithy/config-resolver": "^4.4.10", - "@smithy/core": "^3.23.8", - "@smithy/fetch-http-handler": "^5.3.13", - "@smithy/hash-node": "^4.2.11", - "@smithy/invalid-dependency": "^4.2.11", - "@smithy/middleware-content-length": "^4.2.11", - "@smithy/middleware-endpoint": "^4.4.22", - "@smithy/middleware-retry": "^4.4.39", - "@smithy/middleware-serde": "^4.2.12", - "@smithy/middleware-stack": "^4.2.11", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/node-http-handler": "^4.4.14", - "@smithy/protocol-http": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.38", - "@smithy/util-defaults-mode-node": "^4.2.41", - "@smithy/util-endpoints": "^3.3.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-retry": "^4.2.11", - "@smithy/util-utf8": "^4.2.2", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/credential-provider-node": "^3.972.77", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/fetch-http-handler": "^5.6.13", + "@smithy/node-http-handler": "^4.9.13", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -360,23 +131,18 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.973.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.18.tgz", - "integrity": "sha512-GUIlegfcK2LO1J2Y98sCJy63rQSiLiDOgVw7HiHPRqfI2vb3XozTVqemwO0VSGXp54ngCnAQz0Lf0YPCBINNxA==", + "version": "3.977.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.977.5.tgz", + "integrity": "sha512-O5otOc1c6UZh5HsHAaPdYBcUUR9HL6mtnKqvc8nxN/CKDGUBUpsdh0q8K04Uz/dd1i0TaGyIQuQNqoO7+ad2TQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/xml-builder": "^3.972.10", - "@smithy/core": "^3.23.8", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/property-provider": "^4.2.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/signature-v4": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-utf8": "^4.2.2", + "@aws-sdk/types": "^3.974.2", + "@aws-sdk/xml-builder": "^3.972.37", + "@aws/lambda-invoke-store": "^0.3.0", + "@smithy/core": "^3.31.1", + "@smithy/signature-v4": "^5.6.12", + "@smithy/types": "^4.16.1", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { @@ -384,15 +150,15 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.16.tgz", - "integrity": "sha512-HrdtnadvTGAQUr18sPzGlE5El3ICphnH6SU7UQOMOWFgRKbTRNN8msTxM4emzguUso9CzaHU2xy5ctSrmK5YNA==", + "version": "3.972.66", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.66.tgz", + "integrity": "sha512-bOzP2+zdJ0XrghywB4FaJXtGZCx9yS0AGps+VJ5yEgg30wVyHNmVDBwVDXcRypzQY5iLGCS3NSn0nsuISqjFCQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/types": "^3.973.5", - "@smithy/property-provider": "^4.2.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -400,20 +166,17 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.18.tgz", - "integrity": "sha512-NyB6smuZAixND5jZumkpkunQ0voc4Mwgkd+SZ6cvAzIB7gK8HV8Zd4rS8Kn5MmoGgusyNfVGG+RLoYc4yFiw+A==", + "version": "3.972.68", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.68.tgz", + "integrity": "sha512-lkunS8X+H6V76WE+t/uGQm/U8v0JXK5mLfNFTUAMlE1kqaCjwlmqKJrgCVtqjK/vqnlrSWsLK4Lr4NANBWlfTQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/types": "^3.973.5", - "@smithy/fetch-http-handler": "^5.3.13", - "@smithy/node-http-handler": "^4.4.14", - "@smithy/property-provider": "^4.2.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "@smithy/util-stream": "^4.5.17", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/fetch-http-handler": "^5.6.13", + "@smithy/node-http-handler": "^4.9.13", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -421,24 +184,23 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.16.tgz", - "integrity": "sha512-hzAnzNXKV0A4knFRWGu2NCt72P4WWxpEGnOc6H3DptUjC4oX3hGw846oN76M1rTHAOwDdbhjU0GAOWR4OUfTZg==", + "version": "3.973.11", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.11.tgz", + "integrity": "sha512-KoDEolYtLHG/8C+IiZpXbJWyBOMkrHV+j66Kb9PBXmLv5euGb7aELvuCmLenoGAV6gBW2wM7TsG/1e5iulH4kA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/credential-provider-env": "^3.972.16", - "@aws-sdk/credential-provider-http": "^3.972.18", - "@aws-sdk/credential-provider-login": "^3.972.16", - "@aws-sdk/credential-provider-process": "^3.972.16", - "@aws-sdk/credential-provider-sso": "^3.972.16", - "@aws-sdk/credential-provider-web-identity": "^3.972.16", - "@aws-sdk/nested-clients": "^3.996.6", - "@aws-sdk/types": "^3.973.5", - "@smithy/credential-provider-imds": "^4.2.11", - "@smithy/property-provider": "^4.2.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/credential-provider-env": "^3.972.66", + "@aws-sdk/credential-provider-http": "^3.972.68", + "@aws-sdk/credential-provider-login": "^3.972.73", + "@aws-sdk/credential-provider-process": "^3.972.66", + "@aws-sdk/credential-provider-sso": "^3.973.10", + "@aws-sdk/credential-provider-web-identity": "^3.972.72", + "@aws-sdk/nested-clients": "^3.997.40", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/credential-provider-imds": "^4.4.16", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -446,18 +208,16 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.16.tgz", - "integrity": "sha512-VI0kXTlr0o1FTay+Jvx6AKqx5ECBgp7X4VevGBEbuXdCXnNp7SPU0KvjsOLVhIz3OoPK4/lTXphk43t0IVk65w==", + "version": "3.972.73", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.73.tgz", + "integrity": "sha512-tjsxMkTAFkmiV9ycmymapb9nLECWVOwFs0bZMQ9gB9bnbY8/HwfukHZlWbXZZp7qkPU6EXAfOcMm3DioFFEywA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/nested-clients": "^3.996.6", - "@aws-sdk/types": "^3.973.5", - "@smithy/property-provider": "^4.2.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/nested-clients": "^3.997.40", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -465,22 +225,21 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.17", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.17.tgz", - "integrity": "sha512-98MAcQ2Dk7zkvgwZ5f6fLX2lTyptC3gTSDx4EpvTdJWET8qs9lBPYggoYx7GmKp/5uk0OwVl0hxIDZsDNS/Y9g==", + "version": "3.972.77", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.77.tgz", + "integrity": "sha512-l4nitYCN/Ls57vtUfdextCjTjW41JD7lQiAnuR0RTbdByFc/6OmEAzwGd+lrp6CUtiXGQL1FCaYiamfHASrwBw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.16", - "@aws-sdk/credential-provider-http": "^3.972.18", - "@aws-sdk/credential-provider-ini": "^3.972.16", - "@aws-sdk/credential-provider-process": "^3.972.16", - "@aws-sdk/credential-provider-sso": "^3.972.16", - "@aws-sdk/credential-provider-web-identity": "^3.972.16", - "@aws-sdk/types": "^3.973.5", - "@smithy/credential-provider-imds": "^4.2.11", - "@smithy/property-provider": "^4.2.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", + "@aws-sdk/credential-provider-env": "^3.972.66", + "@aws-sdk/credential-provider-http": "^3.972.68", + "@aws-sdk/credential-provider-ini": "^3.973.11", + "@aws-sdk/credential-provider-process": "^3.972.66", + "@aws-sdk/credential-provider-sso": "^3.973.10", + "@aws-sdk/credential-provider-web-identity": "^3.972.72", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/credential-provider-imds": "^4.4.16", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -488,16 +247,15 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.16.tgz", - "integrity": "sha512-n89ibATwnLEg0ZdZmUds5bq8AfBAdoYEDpqP3uzPLaRuGelsKlIvCYSNNvfgGLi8NaHPNNhs1HjJZYbqkW9b+g==", + "version": "3.972.66", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.66.tgz", + "integrity": "sha512-YOnX6bIhdjx0QfaENu2PB0eFm5MEc9ft8XNGQ+NxMfeLSq9aE+XjWCwDupEnV4UWv5ZFpBLJbTREIx7KNOoqpQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/types": "^3.973.5", - "@smithy/property-provider": "^4.2.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -505,18 +263,17 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.16.tgz", - "integrity": "sha512-b9of7tQgERxgcEcwAFWvRe84ivw+Kw6b3jVuz/6LQzonkomiY5UoWfprkbjc8FSCQ2VjDqKTvIRA9F0KSQ025w==", + "version": "3.973.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.10.tgz", + "integrity": "sha512-IsXnQ35j5VE+3ZK6aIhT5ypB+Jim3zRwVz0nYuVwyBKZyu/SYx+O2/LQpng8c2EiuwyqceabsDlYrICHDlJPsA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/nested-clients": "^3.996.6", - "@aws-sdk/token-providers": "3.1003.0", - "@aws-sdk/types": "^3.973.5", - "@smithy/property-provider": "^4.2.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/nested-clients": "^3.997.40", + "@aws-sdk/token-providers": "3.1102.0", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -524,80 +281,16 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.16", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.16.tgz", - "integrity": "sha512-PaOH5jFoPQX4WkqpKzKh9cM7rieKtbgEGqrZ+ybGmotJhcvhI/xl69yCwMbHGnpQJJmHZIX9q2zaPB7HTBn/4w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/nested-clients": "^3.996.6", - "@aws-sdk/types": "^3.973.5", - "@smithy/property-provider": "^4.2.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", - "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", - "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", - "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.972.18", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.18.tgz", - "integrity": "sha512-KcqQDs/7WtoEnp52+879f8/i1XAJkgka5i4arOtOCPR10o4wWo3VRecDI9Gxoh6oghmLCnIiOSKyRcXI/50E+w==", + "version": "3.972.72", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.72.tgz", + "integrity": "sha512-nj9Zlsy7ya+fy+jhWTJwgfr7YdtDM4xHyZvgKuftuny0UgROVx9lxwvsWJSLvpKk4lig0m0tHng3k1fEnt0LeA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-endpoints": "^3.996.4", - "@smithy/core": "^3.23.8", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/nested-clients": "^3.997.40", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -605,64 +298,33 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.996.6", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.6.tgz", - "integrity": "sha512-blNJ3ugn4gCQ9ZSZi/firzKCvVl5LvPFVxv24LprENeWI4R8UApG006UQkF4SkmLygKq2BQXRad2/anQ13Te4Q==", + "version": "3.997.40", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.40.tgz", + "integrity": "sha512-hEdHT0PBR4fkGxWhwKG5EtEYKnAM7HKkp0vD10ufk4YcXejH4r4q6G/XhPzjUc6Yxo5kBS2vHg7llj4ViR9VTQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/middleware-host-header": "^3.972.7", - "@aws-sdk/middleware-logger": "^3.972.7", - "@aws-sdk/middleware-recursion-detection": "^3.972.7", - "@aws-sdk/middleware-user-agent": "^3.972.18", - "@aws-sdk/region-config-resolver": "^3.972.7", - "@aws-sdk/types": "^3.973.5", - "@aws-sdk/util-endpoints": "^3.996.4", - "@aws-sdk/util-user-agent-browser": "^3.972.7", - "@aws-sdk/util-user-agent-node": "^3.973.3", - "@smithy/config-resolver": "^4.4.10", - "@smithy/core": "^3.23.8", - "@smithy/fetch-http-handler": "^5.3.13", - "@smithy/hash-node": "^4.2.11", - "@smithy/invalid-dependency": "^4.2.11", - "@smithy/middleware-content-length": "^4.2.11", - "@smithy/middleware-endpoint": "^4.4.22", - "@smithy/middleware-retry": "^4.4.39", - "@smithy/middleware-serde": "^4.2.12", - "@smithy/middleware-stack": "^4.2.11", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/node-http-handler": "^4.4.14", - "@smithy/protocol-http": "^5.3.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-body-length-node": "^4.2.3", - "@smithy/util-defaults-mode-browser": "^4.3.38", - "@smithy/util-defaults-mode-node": "^4.2.41", - "@smithy/util-endpoints": "^3.3.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-retry": "^4.2.11", - "@smithy/util-utf8": "^4.2.2", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/signature-v4-multi-region": "^3.996.43", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/fetch-http-handler": "^5.6.13", + "@smithy/node-http-handler": "^4.9.13", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", - "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.43", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.43.tgz", + "integrity": "sha512-lKekx8bLBXSv4O+cslk9Zfnw2XKSkWBs3uWL5QGhH2ZAQfNS7FE0vcSSN2vD/AhxX54ZTywWxR4STThoeOXlBA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/config-resolver": "^4.4.10", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", + "@aws-sdk/types": "^3.974.2", + "@smithy/signature-v4": "^5.6.12", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -670,17 +332,16 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1003.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1003.0.tgz", - "integrity": "sha512-SOyyWNdT7njKRwtZ1JhwHlH1csv6Pkgf305X96/OIfnhq1pU/EjmT6W6por57rVrjrKuHBuEIXgpWv8OgoMHpg==", + "version": "3.1102.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1102.0.tgz", + "integrity": "sha512-Ua700vVvM1q105yABSUQWkCK6FeTrNfU6ORGetJe5BzkZWY7QhkF7SVTOlmDGWRDNd6jbyY0Dv5e+E4bMBEmLg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.973.18", - "@aws-sdk/nested-clients": "^3.996.6", - "@aws-sdk/types": "^3.973.5", - "@smithy/property-provider": "^4.2.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", + "@aws-sdk/core": "^3.977.5", + "@aws-sdk/nested-clients": "^3.997.40", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -688,90 +349,25 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.973.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", - "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.996.4", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", - "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-endpoints": "^3.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.965.5", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", - "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.972.7", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", - "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.973.5", - "@smithy/types": "^4.13.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.973.3", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.3.tgz", - "integrity": "sha512-8s2cQmTUOwcBlIJyI9PAZNnnnF+cGtdhHc1yzMMsSD/GR/Hxj7m0IGUE92CslXXb8/p5Q76iqOCjN1GFwyf+1A==", + "version": "3.974.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.2.tgz", + "integrity": "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "^3.972.18", - "@aws-sdk/types": "^3.973.5", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { "node": ">=20.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.10.tgz", - "integrity": "sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA==", + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.37.tgz", + "integrity": "sha512-zKq4HQum8JwDyEuyfuI4bbiAcU0KxP6qy+9PR/IsR92IyE/DaBAikzAS50tjxip4bqIIANpCcG+Yyj6CVhXupg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", - "fast-xml-parser": "5.4.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -779,21 +375,22 @@ } }, "node_modules/@aws/lambda-invoke-store": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz", - "integrity": "sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.3.0.tgz", + "integrity": "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==", "license": "Apache-2.0", "engines": { "node": ">=18.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -801,17 +398,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -821,6 +413,7 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" @@ -969,6 +562,15 @@ "node": ">=18" } }, + "node_modules/@digitalbazaar/di-sd-primitives/node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/@digitalbazaar/ecdsa-multikey": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@digitalbazaar/ecdsa-multikey/-/ecdsa-multikey-1.8.0.tgz", @@ -1057,6 +659,15 @@ "node": ">=18" } }, + "node_modules/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite/node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/@digitalbazaar/ecdsa-sd-2023-cryptosuite": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/ecdsa-sd-2023-cryptosuite/-/ecdsa-sd-2023-cryptosuite-3.4.1.tgz", @@ -1097,18 +708,6 @@ "node": ">=14.0" } }, - "node_modules/@digitalbazaar/http-client/node_modules/undici": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, "node_modules/@digitalbazaar/security-context": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@digitalbazaar/security-context/-/security-context-1.0.1.tgz", @@ -1116,13 +715,14 @@ "license": "BSD-3-Clause" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -1132,13 +732,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1148,13 +749,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1164,13 +766,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1180,13 +783,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1196,13 +800,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1212,13 +817,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1228,13 +834,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1244,13 +851,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1260,13 +868,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1276,13 +885,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1292,13 +902,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1308,13 +919,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1324,13 +936,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1340,13 +953,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1356,13 +970,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1372,13 +987,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1388,13 +1004,14 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1404,13 +1021,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1420,13 +1038,14 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1436,13 +1055,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1452,13 +1072,14 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -1468,13 +1089,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -1484,13 +1106,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1500,13 +1123,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1516,13 +1140,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1532,10 +1157,11 @@ } }, "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", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -1554,6 +1180,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1563,6 +1190,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1582,10 +1210,11 @@ } }, "node_modules/@eslint/eslintrc/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.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1597,11 +1226,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/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==", + "dev": true, + "license": "MIT" + }, "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==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1612,6 +1249,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -1620,13 +1258,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1639,6 +1279,7 @@ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1981,6 +1622,12 @@ "js-sha3": "0.8.0" } }, + "node_modules/@ethersproject/keccak256/node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" + }, "node_modules/@ethersproject/logger": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", @@ -2093,27 +1740,6 @@ "ws": "8.18.0" } }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@ethersproject/random": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", @@ -2430,6 +2056,7 @@ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -2439,21 +2066,30 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/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==", + "dev": true, + "license": "MIT" + }, "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==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "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==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2466,6 +2102,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -2479,20 +2116,23 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@inquirer/ansi": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.3.tgz", - "integrity": "sha512-g44zhR3NIKVs0zUesa4iMzExmZpLUdTLRMCStqX3GE5NT6VkPcxQGJ+uC8tDgBUC/vB1rUhUd55cOf++4NZcmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz", + "integrity": "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==", + "license": "MIT", "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, "node_modules/@inquirer/checkbox": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/figures": "^1.0.5", @@ -2508,6 +2148,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3" @@ -2520,6 +2161,7 @@ "version": "9.2.1", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", + "license": "MIT", "dependencies": { "@inquirer/figures": "^1.0.6", "@inquirer/type": "^2.0.0", @@ -2542,6 +2184,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", + "license": "MIT", "dependencies": { "mute-stream": "^1.0.0" }, @@ -2553,6 +2196,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3", @@ -2566,6 +2210,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz", "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3", @@ -2576,15 +2221,16 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-2.0.3.tgz", - "integrity": "sha512-LgyI7Agbda74/cL5MvA88iDpvdXI2KuMBCGRkbCl2Dg1vzHeOgs+s0SDcXV7b+WZJrv2+ERpWSM65Fpi9VfY3w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==", + "license": "MIT", "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.2" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -2596,14 +2242,16 @@ } }, "node_modules/@inquirer/external-editor/node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "license": "MIT" }, "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -2619,6 +2267,7 @@ "version": "1.0.15", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "license": "MIT", "engines": { "node": ">=18" } @@ -2627,6 +2276,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz", "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3" @@ -2639,6 +2289,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz", "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3" @@ -2651,6 +2302,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz", "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3", @@ -2664,6 +2316,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.5.0.tgz", "integrity": "sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==", + "license": "MIT", "dependencies": { "@inquirer/checkbox": "^2.5.0", "@inquirer/confirm": "^3.2.0", @@ -2684,6 +2337,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz", "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/type": "^1.5.3", @@ -2697,6 +2351,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz", "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/figures": "^1.0.5", @@ -2711,6 +2366,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz", "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==", + "license": "MIT", "dependencies": { "@inquirer/core": "^9.1.0", "@inquirer/figures": "^1.0.5", @@ -2726,6 +2382,7 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", + "license": "MIT", "dependencies": { "mute-stream": "^1.0.0" }, @@ -2738,6 +2395,7 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -2750,6 +2408,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -2760,6 +2419,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -2768,13 +2428,15 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -2956,6 +2618,15 @@ "yallist": "^3.0.2" } }, + "node_modules/@mattrglobal/jsonld-signatures-bbs/node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/@mattrglobal/jsonld-signatures-bbs/node_modules/rdf-canonize": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-2.0.1.tgz", @@ -3021,6 +2692,26 @@ "yarn": "1.x" } }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, "node_modules/@noble/ciphers": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", @@ -3065,6 +2756,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3078,6 +2770,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -3087,6 +2780,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3100,21 +2794,23 @@ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 20" } }, "node_modules/@octokit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz", - "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.7.tgz", + "integrity": "sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/auth-token": "^6.0.0", - "@octokit/graphql": "^9.0.3", - "@octokit/request": "^10.0.6", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/graphql": "^9.0.4", + "@octokit/request": "^10.0.13", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" }, @@ -3123,12 +2819,13 @@ } }, "node_modules/@octokit/endpoint": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.3.tgz", - "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.4.tgz", + "integrity": "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.2" }, "engines": { @@ -3136,13 +2833,14 @@ } }, "node_modules/@octokit/graphql": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz", - "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.4.tgz", + "integrity": "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/request": "^10.0.6", - "@octokit/types": "^16.0.0", + "@octokit/request": "^10.0.13", + "@octokit/types": "^17.0.0", "universal-user-agent": "^7.0.0" }, "engines": { @@ -3150,16 +2848,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "27.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", - "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", - "dev": true + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz", + "integrity": "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==", + "dev": true, + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^16.0.0" }, @@ -3170,14 +2870,32 @@ "@octokit/core": ">=6" } }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, "node_modules/@octokit/plugin-retry": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", - "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-8.1.1.tgz", + "integrity": "sha512-VCVvZ/R1+u3WuiBWpNavZ0mY4aaJNAsENrpBP9aLSR2QyOpQgd7DhM5j4AW7z4MQpnJYgwBPf0XqPQoNBRdQwg==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -3188,12 +2906,13 @@ } }, "node_modules/@octokit/plugin-throttling": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", - "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-11.0.5.tgz", + "integrity": "sha512-LIdrkrUv+DWbKeg/49rGuFJ3SU0d3hUS+B4MhNZLepBoNUFXms8Ic9edJjrlx+zycqJHjrMRudVpVb/bAXM2Lw==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0", + "@octokit/types": "^17.0.0", "bottleneck": "^2.15.3" }, "engines": { @@ -3204,15 +2923,16 @@ } }, "node_modules/@octokit/request": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.8.tgz", - "integrity": "sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==", + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.13.tgz", + "integrity": "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/endpoint": "^11.0.3", - "@octokit/request-error": "^7.0.2", - "@octokit/types": "^16.0.0", - "fast-content-type-parse": "^3.0.0", + "@octokit/request-error": "^7.1.1", + "@octokit/types": "^17.0.0", + "content-type": "^2.0.0", "json-with-bigint": "^3.5.3", "universal-user-agent": "^7.0.2" }, @@ -3221,24 +2941,26 @@ } }, "node_modules/@octokit/request-error": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz", - "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.1.tgz", + "integrity": "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^16.0.0" + "@octokit/types": "^17.0.0" }, "engines": { "node": ">= 20" } }, "node_modules/@octokit/types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", - "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz", + "integrity": "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^27.0.0" + "@octokit/openapi-types": "^28.0.0" } }, "node_modules/@openzeppelin/contracts": { @@ -3252,6 +2974,7 @@ "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.22.0" } @@ -3261,6 +2984,7 @@ "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "4.2.10" }, @@ -3272,13 +2996,15 @@ "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@pnpm/npm-conf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.2.tgz", - "integrity": "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz", + "integrity": "sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==", "dev": true, + "license": "MIT", "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", @@ -3289,221 +3015,271 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", - "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", "cpu": [ "arm" ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", - "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", "cpu": [ "loong64" ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", "cpu": [ "loong64" ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", "cpu": [ "riscv64" ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -3516,6 +3292,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -3523,91 +3302,101 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openharmony" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", - "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", - "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -3692,13 +3481,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@semantic-release/changelog": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", "dev": true, + "license": "MIT", "dependencies": { "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", @@ -3712,46 +3503,12 @@ "semantic-release": ">=18.0.0" } }, - "node_modules/@semantic-release/changelog/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@semantic-release/changelog/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@semantic-release/changelog/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@semantic-release/commit-analyzer": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-13.0.1.tgz", "integrity": "sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==", "dev": true, + "license": "MIT", "dependencies": { "conventional-changelog-angular": "^8.0.0", "conventional-changelog-writer": "^8.0.0", @@ -3774,6 +3531,7 @@ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.17" } @@ -3783,6 +3541,7 @@ "resolved": "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz", "integrity": "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w==", "dev": true, + "license": "MIT", "dependencies": { "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", @@ -3800,118 +3559,12 @@ "semantic-release": ">=18.0.0" } }, - "node_modules/@semantic-release/git/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@semantic-release/git/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/git/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@semantic-release/git/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/git/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@semantic-release/git/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@semantic-release/git/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/git/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/@semantic-release/git/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@semantic-release/github": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.6.tgz", - "integrity": "sha512-aYYFkwHW3c6YtHwQF0t0+lAjlU+87NFOZuH2CvWFD0Ylivc7MwhZMiHOJ0FMpIgPpCVib/VUAcOwvrW0KnxQtA==", + "node_modules/@semantic-release/github": { + "version": "12.0.9", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-12.0.9.tgz", + "integrity": "sha512-ODIqb0V3QqndipryEEiaBxUQCFjvv7Oese5Dt4omMGa60YRNEW0Sx3K+zri0uac2Y6S9nOlMehciWIzvvRCTGQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/core": "^7.0.0", "@octokit/plugin-paginate-rest": "^14.0.0", @@ -3921,8 +3574,8 @@ "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", + "http-proxy-agent": "^9.0.0", + "https-proxy-agent": "^9.0.0", "issue-parser": "^7.0.0", "lodash-es": "^4.17.21", "mime": "^4.0.0", @@ -3943,17 +3596,19 @@ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/@semantic-release/github/node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", + "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/@semantic-release/github/node_modules/aggregate-error": { @@ -3961,6 +3616,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" @@ -3977,6 +3633,7 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -3992,6 +3649,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4000,16 +3658,18 @@ } }, "node_modules/@semantic-release/github/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-9.1.0.tgz", + "integrity": "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/@semantic-release/github/node_modules/indent-string": { @@ -4017,6 +3677,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4025,10 +3686,11 @@ } }, "node_modules/@semantic-release/github/node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "dev": true, + "license": "MIT", "engines": { "node": ">=20.18.1" } @@ -4038,6 +3700,7 @@ "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.5.tgz", "integrity": "sha512-Hq5UxzoatN3LHiq2rTsWS54nCdqJHlsssGERCo8WlvdfFA9LoN0vO+OuKVSjtNapIc/S8C2LBj206wKLHg62mg==", "dev": true, + "license": "MIT", "dependencies": { "@actions/core": "^3.0.0", "@semantic-release/error": "^4.0.0", @@ -4067,6 +3730,7 @@ "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } @@ -4076,6 +3740,7 @@ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^5.2.0", "indent-string": "^5.0.0" @@ -4092,6 +3757,7 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, @@ -4107,6 +3773,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4119,6 +3786,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", @@ -4140,40 +3808,12 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@semantic-release/npm/node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@semantic-release/npm/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@semantic-release/npm/node_modules/get-stream": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", "dev": true, + "license": "MIT", "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" @@ -4190,6 +3830,7 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -4199,6 +3840,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4211,6 +3853,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4218,23 +3861,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/@semantic-release/npm/node_modules/npm-run-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" @@ -4251,6 +3883,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -4263,6 +3896,7 @@ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4275,6 +3909,7 @@ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4282,29 +3917,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@semantic-release/npm/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@semantic-release/release-notes-generator": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.0.tgz", - "integrity": "sha512-CcyDRk7xq+ON/20YNR+1I/jP7BYKICr1uKd1HHpROSnnTdGqOTburi4jcRiTYz0cpfhxSloQO3cGhnoot7IEkA==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-14.1.1.tgz", + "integrity": "sha512-Pbd2e2XRMUD0OxehHpgd5/YghsE76cddkRHSoDvKLK+OCy4Ewxn49rWR631MEUU01lgwF/uyVXvbnVuu6+Z6VA==", "dev": true, + "license": "MIT", "dependencies": { "conventional-changelog-angular": "^8.0.0", "conventional-changelog-writer": "^8.0.0", "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", - "get-stream": "^7.0.0", "import-from-esm": "^2.0.0", - "into-stream": "^7.0.0", "lodash-es": "^4.17.21", "read-package-up": "^11.0.0" }, @@ -4315,23 +3940,12 @@ "semantic-release": ">=20.1.0" } }, - "node_modules/@semantic-release/release-notes-generator/node_modules/get-stream": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-7.0.1.tgz", - "integrity": "sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@semantic-release/release-notes-generator/node_modules/hosted-git-info": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -4343,13 +3957,15 @@ "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@semantic-release/release-notes-generator/node_modules/normalize-package-data": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", @@ -4364,6 +3980,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", @@ -4381,6 +3998,7 @@ "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz", "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", @@ -4398,6 +4016,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", @@ -4417,6 +4036,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -4429,6 +4049,7 @@ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4441,6 +4062,7 @@ "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4449,16 +4071,18 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "version": "0.27.12", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.12.tgz", + "integrity": "sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g==", + "dev": true, + "license": "MIT" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4471,6 +4095,7 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4478,51 +4103,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.11.tgz", - "integrity": "sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.10.tgz", - "integrity": "sha512-IRTkd6ps0ru+lTWnfnsbXzW80A8Od8p3pYiZnW98K2Hb20rqfsX7VTlfUwhrcOeSSy68Gn9WBofwPuw3e5CCsg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-endpoints": "^3.3.2", - "@smithy/util-middleware": "^4.2.11", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@smithy/core": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.8.tgz", - "integrity": "sha512-f7uPeBi7ehmLT4YF2u9j3qx6lSnurG1DLXOsTtJrIRNDF7VXio4BGHQ+SQteN/BrUVudbkuL4v7oOsRCzq4BqA==", + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.31.1.tgz", + "integrity": "sha512-CyogUINxvi7C7LDsh8Syo6hVJOT9ckz4rG8dRZfTJ8r91HkMY59PnNooaj7WcHyxEkxPfBAmbgztZU+xTo76lg==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.2.12", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-stream": "^4.5.17", - "@smithy/util-utf8": "^4.2.2", - "@smithy/uuid": "^1.1.2", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -4530,15 +4117,13 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.11.tgz", - "integrity": "sha512-lBXrS6ku0kTj3xLmsJW0WwqWbGQ6ueooYyp/1L9lkyT0M02C+DWwYwc5aTyXFbRaK38ojALxNixg+LxKSHZc0g==", + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.16.tgz", + "integrity": "sha512-QfuLWAkLzptffFW980AFeHZFdqds2B64rpEd3uJ6lgs3xVn9QegGMUgUcj+4d7dRrAsya3r58ZKpku97WcFb4w==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.11", - "@smithy/property-provider": "^4.2.11", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { @@ -4546,53 +4131,51 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.13", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.13.tgz", - "integrity": "sha512-U2Hcfl2s3XaYjikN9cT4mPu8ybDbImV3baXR0PkVlC0TTx808bRP3FaPGAzPtB8OByI+JqJ1kyS+7GEgae7+qQ==", + "version": "5.6.13", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.13.tgz", + "integrity": "sha512-4fW86pEUOMbrD5nkbyl/tTvPHHWJFbuB2odl6ps9lWfHoXf9HWh3Q/Smh59qH1g7+c/BSZghX6bbUk4gsiMs8A==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.11", - "@smithy/querystring-builder": "^4.2.11", - "@smithy/types": "^4.13.0", - "@smithy/util-base64": "^4.3.2", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/hash-node": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.11.tgz", - "integrity": "sha512-T+p1pNynRkydpdL015ruIoyPSRw9e/SQOWmSAMmmprfswMrd5Ow5igOWNVlvyVFZlxXqGmyH3NQwfwy8r5Jx0A==", + "node_modules/@smithy/node-http-handler": { + "version": "4.9.13", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.13.tgz", + "integrity": "sha512-Nmd/Nl35zfYrd+a6OO2cDJb3GPh9bgTjIUhcM+JFfjpp8/osCgboDV5nCT1I01Pv6R13eSKDKLSoVa5ZB6Zsfw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.11.tgz", - "integrity": "sha512-cGNMrgykRmddrNhYy1yBdrp5GwIgEkniS7k9O1VLB38yxQtlvrxpZtUVvo6T4cKpeZsriukBuuxfJcdZQc/f/g==", + "node_modules/@smithy/signature-v4": { + "version": "5.6.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.12.tgz", + "integrity": "sha512-I6KLtq3H0qqSuV9vLglfi8puHqzygzWHOnI4z/Rdoo+q50vvo18vBRdPAvvEtcaKROz7Zn6qnPa14kRfPH6PcQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", + "@smithy/core": "^3.31.1", + "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", - "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", + "node_modules/@smithy/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.16.1.tgz", + "integrity": "sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -4601,642 +4184,646 @@ "node": ">=18.0.0" } }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.11.tgz", - "integrity": "sha512-UvIfKYAKhCzr4p6jFevPlKhQwyQwlJ6IeKLDhmV1PlYfcW3RL4ROjNEDtSik4NYMi9kDkH7eSwyTP3vNJ/u/Dw==", - "license": "Apache-2.0", + "node_modules/@stablelib/binary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", + "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "license": "MIT", "dependencies": { - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@stablelib/int": "^1.0.1" } }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.22", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.22.tgz", - "integrity": "sha512-sc81w1o4Jy+/MAQlY3sQ8C7CmSpcvIi3TAzXblUv2hjG11BBSJi/Cw8vDx5BxMxapuH2I+Gc+45vWsgU07WZRQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.23.8", - "@smithy/middleware-serde": "^4.2.12", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", - "@smithy/url-parser": "^4.2.11", - "@smithy/util-middleware": "^4.2.11", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@stablelib/int": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", + "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==", + "license": "MIT" }, - "node_modules/@smithy/middleware-retry": { - "version": "4.4.39", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.39.tgz", - "integrity": "sha512-MCVCxaCzuZgiHtHGV2Ke44nh6t4+8/tO+rTYOzrr2+G4nMLU/qbzNCWKBX54lyEaVcGQrfOJiG2f8imtiw+nIQ==", - "license": "Apache-2.0", + "node_modules/@stablelib/random": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.0.tgz", + "integrity": "sha512-G9vwwKrNCGMI/uHL6XeWe2Nk4BuxkYyWZagGaDU9wrsuV+9hUwNI1lok2WVo8uJDa2zx7ahNwN7Ij983hOUFEw==", + "license": "MIT", "dependencies": { - "@smithy/node-config-provider": "^4.3.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/service-error-classification": "^4.2.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-retry": "^4.2.11", - "@smithy/uuid": "^1.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@stablelib/binary": "^1.0.0", + "@stablelib/wipe": "^1.0.0" } }, - "node_modules/@smithy/middleware-serde": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.12.tgz", - "integrity": "sha512-W9g1bOLui7Xn5FABRVS0o3rXL0gfN37d/8I/W7i0N7oxjx9QecUmXEMSUMADTODwdtka9cN43t5BI2CodLJpng==", + "node_modules/@stablelib/wipe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", + "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==", + "license": "MIT" + }, + "node_modules/@tradetrust-tt/dnsprove": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/dnsprove/-/dnsprove-2.21.0.tgz", + "integrity": "sha512-acxJGS07WLfLDli1E4uvT5IbPcmh9vzVelgEdhxzi2KE50r3k/vvkwUQl1ctgkw152cIxnqR20cch8x3HLLvcw==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" + "axios": "1.7.2", + "debug": "^4.3.1", + "runtypes": "^6.3.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.x" } }, - "node_modules/@smithy/middleware-stack": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.11.tgz", - "integrity": "sha512-s+eenEPW6RgliDk2IhjD2hWOxIx1NKrOHxEwNUaUXxYBxIyCcDfNULZ2Mu15E3kwcJWBedTET/kEASPV1A1Akg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" + "node_modules/@tradetrust-tt/ethers-aws-kms-signer": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/ethers-aws-kms-signer/-/ethers-aws-kms-signer-2.1.4.tgz", + "integrity": "sha512-bwsPF9TOlkXUICwUIt3FJCBQZ8zJTbT3AlPdj+7dGEgPTY6sAH71BzFYFQ1aJnZht1Sww6y8ix14FK4M54lRsQ==", + "license": "MIT", + "dependencies": { + "@aws-sdk/client-kms": "^3.830.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@types/node": "^18.19.112", + "asn1.js": "^5.4.1", + "bn.js": "^5.2.2", + "debug": "^4.4.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.17.0" } }, - "node_modules/@smithy/node-config-provider": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.11.tgz", - "integrity": "sha512-xD17eE7kaLgBBGf5CZQ58hh2YmwK1Z0O8YhffwB/De2jsL0U3JklmhVYJ9Uf37OtUDLF2gsW40Xwwag9U869Gg==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/ethers-aws-kms-signer/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", "dependencies": { - "@smithy/property-provider": "^4.2.11", - "@smithy/shared-ini-file-loader": "^4.4.6", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "undici-types": "~5.26.4" } }, - "node_modules/@smithy/node-http-handler": { - "version": "4.4.14", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.14.tgz", - "integrity": "sha512-DamSqaU8nuk0xTJDrYnRzZndHwwRnyj/n/+RqGGCcBKB4qrQem0mSDiWdupaNWdwxzyMU91qxDmHOCazfhtO3A==", + "node_modules/@tradetrust-tt/ethers-aws-kms-signer/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/@tradetrust-tt/token-registry": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/token-registry/-/token-registry-5.5.1.tgz", + "integrity": "sha512-yxOdjRLSI0fPptFbicYpnb/fn4Ngbi/LuGDCQKL0vb7PLCvhT8DLpiAFbFs0cc+QAb439lnZjhPg+UbWQHufRA==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/querystring-builder": "^4.2.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "ethers": "^6.13.4" } }, - "node_modules/@smithy/property-provider": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.11.tgz", - "integrity": "sha512-14T1V64o6/ndyrnl1ze1ZhyLzIeYNN47oF/QU6P5m82AEtyOkMJTb0gO1dPubYjyyKuPD6OSVMPDKe+zioOnCg==", + "node_modules/@tradetrust-tt/token-registry-v4": { + "name": "@tradetrust-tt/token-registry", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/token-registry/-/token-registry-4.16.0.tgz", + "integrity": "sha512-B5l/WtOL72/836lAUnRvHlr2IVyUwmMBAARGbCuMW6/2nHdFE/v2uDpEuIWsSjqGWLfvGHnPkYJazKVkXZf8yQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" + "@typechain/ethers-v5": "10.2.1" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "ethers": ">=5.0.8" } }, - "node_modules/@smithy/protocol-http": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.11.tgz", - "integrity": "sha512-hI+barOVDJBkNt4y0L2mu3Ugc0w7+BpJ2CZuLwXtSltGAAwCb3IvnalGlbDV/UCS6a9ZuT3+exd1WxNdLb5IlQ==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/token-registry-v4/node_modules/@typechain/ethers-v5": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", + "license": "MIT", "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" } }, - "node_modules/@smithy/querystring-builder": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.11.tgz", - "integrity": "sha512-7spdikrYiljpket6u0up2Ck2mxhy7dZ0+TDd+S53Dg2DHd6wg+YNJrTCHiLdgZmEXZKI7LJZcwL3721ZRDFiqA==", + "node_modules/@tradetrust-tt/token-registry-v5": { + "name": "@tradetrust-tt/token-registry", + "version": "5.6.0-beta.1", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/token-registry/-/token-registry-5.6.0-beta.1.tgz", + "integrity": "sha512-EtxZw/WnvGQMb/MB243eHy4ejSTN8bkV7I7Y9f19xk9v/mOojFL74C/tD1zjsZUUjiQi9rzLRYlzSUNbZBN2gg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", - "@smithy/util-uri-escape": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "ethers": "^6.13.4" } }, - "node_modules/@smithy/querystring-parser": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.11.tgz", - "integrity": "sha512-nE3IRNjDltvGcoThD2abTozI1dkSy8aX+a2N1Rs55en5UsdyyIXgGEmevUL3okZFoJC77JgRGe99xYohhsjivQ==", + "node_modules/@tradetrust-tt/tradetrust": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/tradetrust/-/tradetrust-6.10.3.tgz", + "integrity": "sha512-2A/o6GguA31V7GnOfvhG1zANuxKdlBS5+k6jvAMeh/VotZEDvoOOA+mTArt5Fv+BKHhpgh7J8dS0DUohfVAiqg==", + "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" + "@govtechsg/jsonld": "^0.1.1", + "@trustvc/w3c-vc": "^1.2.17", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", + "cross-fetch": "^4.0.0", + "debug": "^4.3.4", + "ethers": "^5.8.0", + "flatley": "^5.2.0", + "js-base64": "^3.7.7", + "js-sha3": "^0.9.3", + "lodash": "^4.17.21", + "runtypes": "^6.7.0", + "uuid": "^9.0.1", + "validator": "^13.11.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.x" } }, - "node_modules/@smithy/service-error-classification": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.11.tgz", - "integrity": "sha512-HkMFJZJUhzU3HvND1+Yw/kYWXp4RPDLBWLcK1n+Vqw8xn4y2YiBhdww8IxhkQjP/QlZun5bwm3vcHc8AqIU3zw==", + "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-context": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-context/-/w3c-context-1.2.13.tgz", + "integrity": "sha512-Qii0ExOuTZhBirmzPhdX0o0R1P8DOc8UYEmU+XQ5ouOmQNOqyMkikS0IvFXTb7LmUD3I2d8pT6BMKyY2S8Ac/A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0" + "did-resolver": "^4.1.0", + "jsonld-signatures": "^7.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.x" } }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.6.tgz", - "integrity": "sha512-IB/M5I8G0EeXZTHsAxpx51tMQ5R719F3aq+fjEB6VtNcCHDc0ajFDIGDZw+FW9GxtEkgTduiPpjveJdA/CX7sw==", + "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-credential-status": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-credential-status/-/w3c-credential-status-1.2.13.tgz", + "integrity": "sha512-GNT+r00pscDdjSnTEbH3XQgidKKPblurZnWtCu8OydDilXkMH4p7Lc7JrvvCoIn6W2Iwv0em6107gB7rsW3yXA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" + "@trustvc/w3c-context": "^1.2.13", + "@trustvc/w3c-issuer": "^1.2.4", + "base64url-universal": "^2.0.0", + "pako": "^2.1.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.x" } }, - "node_modules/@smithy/signature-v4": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.11.tgz", - "integrity": "sha512-V1L6N9aKOBAN4wEHLyqjLBnAz13mtILU0SeDrjOaIZEeN6IFa6DxwRt1NNpOdmSpQUfkBj0qeD3m6P77uzMhgQ==", + "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-issuer": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-issuer/-/w3c-issuer-1.2.4.tgz", + "integrity": "sha512-BRxdb+VxKVj3N/ukivpPF0oP1dvlMOSZjoOLF+F4jMsJVcs2+8QIJbvCQJNiB6I+ji6On4uvvRPOmc8tYhOt+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.2.2", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-middleware": "^4.2.11", - "@smithy/util-uri-escape": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" + "@mattrglobal/bls12381-key-pair": "^1.2.1", + "bip39": "^3.1.0", + "did-resolver": "^4.1.0", + "multiformats": "^9.9.0", + "web-did-resolver": "^2.0.27" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.x" } }, - "node_modules/@smithy/smithy-client": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.2.tgz", - "integrity": "sha512-HezY3UuG0k4T+4xhFKctLXCA5N2oN+Rtv+mmL8Gt7YmsUY2yhmcLyW75qrSzldfj75IsCW/4UhY3s20KcFnZqA==", + "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-vc": { + "version": "1.2.17", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-1.2.17.tgz", + "integrity": "sha512-R7dz16D5mmb7tsPt71o/XAqaKaNA0J0du0ZOa16i7x3I9yPCx11jwCYdb0NYzsCXrWa318mqS2u7MCtzvEVBBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.23.8", - "@smithy/middleware-endpoint": "^4.4.22", - "@smithy/middleware-stack": "^4.2.11", - "@smithy/protocol-http": "^5.3.11", - "@smithy/types": "^4.13.0", - "@smithy/util-stream": "^4.5.17", - "tslib": "^2.6.2" + "@mattrglobal/jsonld-signatures-bbs": "^1.2.0", + "@trustvc/w3c-credential-status": "^1.2.13", + "@trustvc/w3c-issuer": "^1.2.4", + "did-resolver": "^4.1.0", + "jsonld": "^6.0.0", + "jsonld-signatures": "7.0.0", + "uuid": "^10.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.x" + }, + "peerDependencies": { + "jsonld": "^6.0.0" } }, - "node_modules/@smithy/types": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.0.tgz", - "integrity": "sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-vc/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@smithy/url-parser": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.11.tgz", - "integrity": "sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/tradetrust/node_modules/did-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", + "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", + "license": "Apache-2.0" + }, + "node_modules/@tradetrust-tt/tradetrust/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", "dependencies": { - "@smithy/querystring-parser": "^4.2.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" } }, - "node_modules/@smithy/util-base64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", - "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/tradetrust/node_modules/jsonld-signatures": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsonld-signatures/-/jsonld-signatures-7.0.0.tgz", + "integrity": "sha512-J/nA+llcYYjErPHG9WFpXvR82TOg5fbHk/7rXbx4Ts854DPReaKAAd0hAZ+s5/P2WIIAZPIHCqA+iz1QrOqeiQ==", + "license": "BSD-3-Clause", "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" + "base64url": "^3.0.1", + "crypto-ld": "^3.7.0", + "jsonld": "^4.0.1", + "node-forge": "^0.10.0", + "security-context": "^4.0.0", + "serialize-error": "^5.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10" } }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", - "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", - "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/tradetrust/node_modules/jsonld-signatures/node_modules/jsonld": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-4.0.1.tgz", + "integrity": "sha512-ltEqMQB37ZxZnsgmI+9rqHYkz1M6PqUykuS1t2aQNuH1oiLrUDYz5nyVkHQDgjFd7CFKTIWeLiNhwdwFrH5o5A==", + "license": "BSD-3-Clause", "dependencies": { - "tslib": "^2.6.2" + "canonicalize": "^1.0.1", + "lru-cache": "^5.1.1", + "object.fromentries": "^2.0.2", + "rdf-canonize": "^2.0.1", + "request": "^2.88.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=6" } }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", - "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/tradetrust/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { - "@smithy/is-array-buffer": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "yallist": "^3.0.2" } }, - "node_modules/@smithy/util-config-provider": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", - "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, + "node_modules/@tradetrust-tt/tradetrust/node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { - "node": ">=18.0.0" + "node": ">= 6.0.0" } }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.38", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.38.tgz", - "integrity": "sha512-c8P1mFLNxcsdAMabB8/VUQUbWzFmgujWi4bAXSggcqLYPc8V4U5abqFqOyn+dK4YT+q8UyCVkTO8807t4t2syA==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/tradetrust/node_modules/rdf-canonize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-2.0.1.tgz", + "integrity": "sha512-/GVELjrfW8G/wS4QfDZ5Kq68cS1belVNJqZlcwiErerexeBUsgOINCROnP7UumWIBNdeCwTVLE9NVXMnRYK0lA==", + "license": "BSD-3-Clause", "dependencies": { - "@smithy/property-provider": "^4.2.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" + "semver": "^6.3.0", + "setimmediate": "^1.0.5" }, "engines": { - "node": ">=18.0.0" + "node": ">=6" } }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.41", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.41.tgz", - "integrity": "sha512-/UG+9MT3UZAR0fLzOtMJMfWGcjjHvgggq924x/CRy8vRbL+yFf3Z6vETlvq8vDH92+31P/1gSOFoo7303wN8WQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.4.10", - "@smithy/credential-provider-imds": "^4.2.11", - "@smithy/node-config-provider": "^4.3.11", - "@smithy/property-provider": "^4.2.11", - "@smithy/smithy-client": "^4.12.2", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "node_modules/@tradetrust-tt/tradetrust/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@smithy/util-endpoints": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.2.tgz", - "integrity": "sha512-+4HFLpE5u29AbFlTdlKIT7jfOzZ8PDYZKTb3e+AgLz986OYwqTourQ5H+jg79/66DB69Un1+qKecLnkZdAsYcA==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/tradetrust/node_modules/serialize-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", + "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "license": "MIT", "dependencies": { - "@smithy/node-config-provider": "^4.3.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" + "type-fest": "^0.8.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", - "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, + "node_modules/@tradetrust-tt/tradetrust/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=18.0.0" + "node": ">=8" } }, - "node_modules/@smithy/util-middleware": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.11.tgz", - "integrity": "sha512-r3dtF9F+TpSZUxpOVVtPfk09Rlo4lT6ORBqEvX3IBT6SkQAdDSVKR5GcfmZbtl7WKhKnmb3wbDTQ6ibR2XHClw==", + "node_modules/@tradetrust-tt/tradetrust/node_modules/web-did-resolver": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.32.tgz", + "integrity": "sha512-L91/ApTmDjgzS0UDstTKn3kN/1hlQBnVcUN8K29e3xhVBpPktHYC6uvVAQ8ohbIg9D6wrrbaBQvfRArDxgJG2g==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "cross-fetch": "^4.1.0", + "did-resolver": "^4.1.0" } }, - "node_modules/@smithy/util-retry": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.11.tgz", - "integrity": "sha512-XSZULmL5x6aCTTii59wJqKsY1l3eMIAomRAccW7Tzh9r8s7T/7rdo03oektuH5jeYRlJMPcNP92EuRDvk9aXbw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.2.11", - "@smithy/types": "^4.13.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@tradetrust-tt/tradetrust/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" }, - "node_modules/@smithy/util-stream": { - "version": "4.5.17", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.17.tgz", - "integrity": "sha512-793BYZ4h2JAQkNHcEnyFxDTcZbm9bVybD0UV/LEWmZ5bkTms7JqjfrLMi2Qy0E5WFcCzLwCAPgcvcvxoeALbAQ==", + "node_modules/@tradetrust-tt/tt-verify": { + "version": "9.7.5", + "resolved": "https://registry.npmjs.org/@tradetrust-tt/tt-verify/-/tt-verify-9.7.5.tgz", + "integrity": "sha512-LoVrJLiWB9ZnMHoe7IGBAc4edK2upKYsfCRgo9T7VNLo3XiBM4cIr25RQ5e1AQ58m+3gKWRnpP9ZKj0qqN+xFg==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.13", - "@smithy/node-http-handler": "^4.4.14", - "@smithy/types": "^4.13.0", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-hex-encoding": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" + "@tradetrust-tt/dnsprove": "^2.21.0", + "@tradetrust-tt/token-registry": "^5.5.0", + "@tradetrust-tt/tradetrust": "^6.10.3", + "@trustvc/document-store": "^1.0.3", + "axios": "^1.7.2", + "debug": "^4.3.1", + "did-resolver": "^3.1.0", + "ethers": "^5.8.0", + "ethr-did-resolver": "^4.3.3", + "node-cache": "^5.1.2", + "runtypes": "^6.3.0", + "web-did-resolver": "2.0.4" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.x" + }, + "peerDependencies": { + "ethers": "^5.8.0" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", - "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", - "license": "Apache-2.0", + "node_modules/@tradetrust-tt/tt-verify/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" } }, - "node_modules/@smithy/util-utf8": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", - "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", - "license": "Apache-2.0", + "node_modules/@trustvc/document-store": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@trustvc/document-store/-/document-store-1.0.3.tgz", + "integrity": "sha512-YIECQwcoreIfyTbol1/5u9CGK6mbg0Q0bSN2/Ks388zLus1IXELWK5EHYuyrFPbb9d8ajsvz7m+ySsMIY9574w==", + "license": "Apache-2.0" + }, + "node_modules/@trustvc/eip7702": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/@trustvc/eip7702/-/eip7702-1.0.0-beta.1.tgz", + "integrity": "sha512-cOGuZVLHd0+Uu7rZ/Dp2iF1VuNq+L+pWWGe+tPD/u74rSvCAzIc17dIk5HOwRBiC5awh1rXG46vLG8IRc5O01Q==", + "license": "MIT", "dependencies": { - "@smithy/util-buffer-from": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "@account-abstraction/contracts": "^0.8.0", + "@openzeppelin/contracts": "^5.6.1" } }, - "node_modules/@smithy/uuid": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", - "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "node_modules/@trustvc/trustvc": { + "version": "2.16.0-beta.1", + "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.16.0-beta.1.tgz", + "integrity": "sha512-sXklxfioSrIV+ZyuYsyPy+WMbgOPcRweJTd2Tklg8ZdF/tQlb2yVHDTPLycSNI3YOilpRhKn9p0Y2hSJxTuRRw==", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@tradetrust-tt/dnsprove": "^2.18.0", + "@tradetrust-tt/ethers-aws-kms-signer": "^2.1.4", + "@tradetrust-tt/token-registry-v4": "npm:@tradetrust-tt/token-registry@^4.16.0", + "@tradetrust-tt/token-registry-v5": "npm:@tradetrust-tt/token-registry@^5.6.0-beta.1", + "@tradetrust-tt/tradetrust": "^6.10.3", + "@tradetrust-tt/tt-verify": "^9.7.5", + "@trustvc/document-store": "^1.0.3", + "@trustvc/eip7702": "^1.0.0-beta.1", + "@trustvc/w3c": "^2.4.1", + "@trustvc/w3c-context": "^2.4.0", + "@trustvc/w3c-credential-status": "^2.4.0", + "@trustvc/w3c-issuer": "^2.3.0", + "@trustvc/w3c-vc": "^2.4.1", + "ethers": "^5.8.0", + "ethersV6": "npm:ethers@^6.14.4", + "js-sha3": "^0.9.3", + "node-fetch": "^2.7.0", + "node-forge": "^1.3.3", + "permissionless": "^0.3.6", + "ts-chacha20": "^1.2.0", + "viem": "^2.53.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-linux-x64-gnu": "~4.40.0" + }, + "peerDependencies": { + "ethers": "^5.8.0" } }, - "node_modules/@stablelib/binary": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/binary/-/binary-1.0.1.tgz", - "integrity": "sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==", + "node_modules/@trustvc/trustvc/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "license": "MIT", "dependencies": { - "@stablelib/int": "^1.0.1" - } - }, - "node_modules/@stablelib/int": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/int/-/int-1.0.1.tgz", - "integrity": "sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==", - "license": "MIT" - }, - "node_modules/@stablelib/random": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@stablelib/random/-/random-1.0.0.tgz", - "integrity": "sha512-G9vwwKrNCGMI/uHL6XeWe2Nk4BuxkYyWZagGaDU9wrsuV+9hUwNI1lok2WVo8uJDa2zx7ahNwN7Ij983hOUFEw==", - "license": "MIT", - "dependencies": { - "@stablelib/binary": "^1.0.0", - "@stablelib/wipe": "^1.0.0" - } - }, - "node_modules/@stablelib/wipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stablelib/wipe/-/wipe-1.0.1.tgz", - "integrity": "sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==", - "license": "MIT" - }, - "node_modules/@tradetrust-tt/dnsprove": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/dnsprove/-/dnsprove-2.21.0.tgz", - "integrity": "sha512-acxJGS07WLfLDli1E4uvT5IbPcmh9vzVelgEdhxzi2KE50r3k/vvkwUQl1ctgkw152cIxnqR20cch8x3HLLvcw==", - "license": "Apache-2.0", - "dependencies": { - "axios": "1.7.2", - "debug": "^4.3.1", - "runtypes": "^6.3.0" - }, - "engines": { - "node": ">=18.x" + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" } }, - "node_modules/@tradetrust-tt/ethers-aws-kms-signer": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/ethers-aws-kms-signer/-/ethers-aws-kms-signer-2.1.4.tgz", - "integrity": "sha512-bwsPF9TOlkXUICwUIt3FJCBQZ8zJTbT3AlPdj+7dGEgPTY6sAH71BzFYFQ1aJnZht1Sww6y8ix14FK4M54lRsQ==", + "node_modules/@trustvc/trustvc/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { - "@aws-sdk/client-kms": "^3.830.0", - "@ethersproject/abstract-provider": "^5.8.0", - "@ethersproject/abstract-signer": "^5.8.0", - "@ethersproject/bytes": "^5.8.0", - "@ethersproject/hash": "^5.8.0", - "@ethersproject/keccak256": "^5.8.0", - "@ethersproject/properties": "^5.8.0", - "@ethersproject/transactions": "^5.8.0", - "@types/node": "^18.19.112", - "asn1.js": "^5.4.1", - "bn.js": "^5.2.2", - "debug": "^4.4.1" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=18.17.0" - } - }, - "node_modules/@tradetrust-tt/ethers-aws-kms-signer/node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@tradetrust-tt/ethers-aws-kms-signer/node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT" - }, - "node_modules/@tradetrust-tt/token-registry": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/token-registry/-/token-registry-5.5.1.tgz", - "integrity": "sha512-yxOdjRLSI0fPptFbicYpnb/fn4Ngbi/LuGDCQKL0vb7PLCvhT8DLpiAFbFs0cc+QAb439lnZjhPg+UbWQHufRA==", - "license": "Apache-2.0", - "dependencies": { - "ethers": "^6.13.4" - } - }, - "node_modules/@tradetrust-tt/token-registry-v4": { - "name": "@tradetrust-tt/token-registry", - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/token-registry/-/token-registry-4.16.0.tgz", - "integrity": "sha512-B5l/WtOL72/836lAUnRvHlr2IVyUwmMBAARGbCuMW6/2nHdFE/v2uDpEuIWsSjqGWLfvGHnPkYJazKVkXZf8yQ==", - "license": "Apache-2.0", - "dependencies": { - "@typechain/ethers-v5": "10.2.1" + "node": "4.x || >=6.0.0" }, "peerDependencies": { - "ethers": ">=5.0.8" - } - }, - "node_modules/@tradetrust-tt/token-registry-v4/node_modules/@typechain/ethers-v5": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", - "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" + "encoding": "^0.1.0" }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" - } - }, - "node_modules/@tradetrust-tt/token-registry-v5": { - "name": "@tradetrust-tt/token-registry", - "version": "5.6.0-beta.1", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/token-registry/-/token-registry-5.6.0-beta.1.tgz", - "integrity": "sha512-EtxZw/WnvGQMb/MB243eHy4ejSTN8bkV7I7Y9f19xk9v/mOojFL74C/tD1zjsZUUjiQi9rzLRYlzSUNbZBN2gg==", - "license": "Apache-2.0", - "dependencies": { - "ethers": "^6.13.4" + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/@tradetrust-tt/tradetrust": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/tradetrust/-/tradetrust-6.10.3.tgz", - "integrity": "sha512-2A/o6GguA31V7GnOfvhG1zANuxKdlBS5+k6jvAMeh/VotZEDvoOOA+mTArt5Fv+BKHhpgh7J8dS0DUohfVAiqg==", - "hasInstallScript": true, + "node_modules/@trustvc/w3c": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@trustvc/w3c/-/w3c-2.4.1.tgz", + "integrity": "sha512-yCyztSAbialRn9VYvXrHUE4v13q4g/BHUN4XUctzF5lrN3WsHKSgUpFUflocLdp1h5fxvJTbqyVoMSh5SDLwQw==", "license": "Apache-2.0", "dependencies": { - "@govtechsg/jsonld": "^0.1.1", - "@trustvc/w3c-vc": "^1.2.17", - "ajv": "^8.12.0", - "ajv-formats": "^2.1.1", - "cross-fetch": "^4.0.0", - "debug": "^4.3.4", - "ethers": "^5.8.0", - "flatley": "^5.2.0", - "js-base64": "^3.7.7", - "js-sha3": "^0.9.3", - "lodash": "^4.17.21", - "runtypes": "^6.7.0", - "uuid": "^9.0.1", - "validator": "^13.11.0" + "@trustvc/w3c-context": "^2.4.0", + "@trustvc/w3c-credential-status": "^2.4.0", + "@trustvc/w3c-issuer": "^2.3.0", + "@trustvc/w3c-vc": "^2.4.1" }, "engines": { "node": ">=18.x" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-context": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-context/-/w3c-context-1.2.13.tgz", - "integrity": "sha512-Qii0ExOuTZhBirmzPhdX0o0R1P8DOc8UYEmU+XQ5ouOmQNOqyMkikS0IvFXTb7LmUD3I2d8pT6BMKyY2S8Ac/A==", + "node_modules/@trustvc/w3c-context": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-context/-/w3c-context-2.4.0.tgz", + "integrity": "sha512-OCRfqZfTyEZ2Lpd5RPBl36DwvaKv3qV1PgZOEA9hrnEtHMWxwS5iSdv+xFYK8pZIoeheFZKymfgcB5LL7UBQRw==", "license": "Apache-2.0", "dependencies": { "did-resolver": "^4.1.0", - "jsonld-signatures": "^7.0.0" + "jsonld-signatures": "^11.5.0" }, "engines": { "node": ">=18.x" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-credential-status": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-credential-status/-/w3c-credential-status-1.2.13.tgz", - "integrity": "sha512-GNT+r00pscDdjSnTEbH3XQgidKKPblurZnWtCu8OydDilXkMH4p7Lc7JrvvCoIn6W2Iwv0em6107gB7rsW3yXA==", + "node_modules/@trustvc/w3c-context/node_modules/did-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", + "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", + "license": "Apache-2.0" + }, + "node_modules/@trustvc/w3c-credential-status": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-credential-status/-/w3c-credential-status-2.4.0.tgz", + "integrity": "sha512-fiMGtfOmq1x9e+vd89ZKqguYtmW2w2k2hxINkno+mDNHdt5CV8tfTH5EbL1fY0oPiuXM5SK+dV6iSBTIWGPFog==", "license": "Apache-2.0", "dependencies": { - "@trustvc/w3c-context": "^1.2.13", - "@trustvc/w3c-issuer": "^1.2.4", + "@trustvc/w3c-context": "^2.4.0", + "@trustvc/w3c-issuer": "^2.3.0", "base64url-universal": "^2.0.0", "pako": "^2.1.0" }, @@ -5244,12 +4831,14 @@ "node": ">=18.x" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-issuer": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-issuer/-/w3c-issuer-1.2.4.tgz", - "integrity": "sha512-BRxdb+VxKVj3N/ukivpPF0oP1dvlMOSZjoOLF+F4jMsJVcs2+8QIJbvCQJNiB6I+ji6On4uvvRPOmc8tYhOt+w==", + "node_modules/@trustvc/w3c-issuer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-issuer/-/w3c-issuer-2.3.0.tgz", + "integrity": "sha512-J/Rlae2s/ihkF0q6OmBofmzdRjDI98ED9lRFIB6Uh2WaEl8eZP7+FoStip+t1Piy6ZbO/6MwaS0QCw/6N6viMA==", "license": "Apache-2.0", "dependencies": { + "@digitalbazaar/bls12-381-multikey": "^2.1.0", + "@digitalbazaar/ecdsa-multikey": "^1.8.0", "@mattrglobal/bls12381-key-pair": "^1.2.1", "bip39": "^3.1.0", "did-resolver": "^4.1.0", @@ -5260,1258 +4849,1178 @@ "node": ">=18.x" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-vc": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-1.2.17.tgz", - "integrity": "sha512-R7dz16D5mmb7tsPt71o/XAqaKaNA0J0du0ZOa16i7x3I9yPCx11jwCYdb0NYzsCXrWa318mqS2u7MCtzvEVBBQ==", + "node_modules/@trustvc/w3c-issuer/node_modules/did-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", + "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", + "license": "Apache-2.0" + }, + "node_modules/@trustvc/w3c-issuer/node_modules/web-did-resolver": { + "version": "2.0.32", + "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.32.tgz", + "integrity": "sha512-L91/ApTmDjgzS0UDstTKn3kN/1hlQBnVcUN8K29e3xhVBpPktHYC6uvVAQ8ohbIg9D6wrrbaBQvfRArDxgJG2g==", "license": "Apache-2.0", "dependencies": { - "@mattrglobal/jsonld-signatures-bbs": "^1.2.0", - "@trustvc/w3c-credential-status": "^1.2.13", - "@trustvc/w3c-issuer": "^1.2.4", - "did-resolver": "^4.1.0", - "jsonld": "^6.0.0", - "jsonld-signatures": "7.0.0", - "uuid": "^10.0.0" - }, - "engines": { - "node": ">=18.x" - }, - "peerDependencies": { - "jsonld": "^6.0.0" + "cross-fetch": "^4.1.0", + "did-resolver": "^4.1.0" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/@trustvc/w3c-vc/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@trustvc/w3c-vc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-2.4.1.tgz", + "integrity": "sha512-f/pqBu70epEYVmtWvKvlhCd2F5QkV885rCcbfa9KZq9xYbOzeBueIF7P3gSdv3ILAiMCQTxvpL7hd8I8hj+M1A==", + "license": "Apache-2.0", + "dependencies": { + "@digitalbazaar/bbs-2023-cryptosuite": "^2.0.1", + "@digitalbazaar/bls12-381-multikey": "^2.1.0", + "@digitalbazaar/data-integrity": "^2.5.0", + "@digitalbazaar/ecdsa-multikey": "^1.8.0", + "@digitalbazaar/ecdsa-rdfc-2019-cryptosuite": "^1.3.0", + "@digitalbazaar/ecdsa-sd-2023-cryptosuite": "^3.4.1", + "@mattrglobal/jsonld-signatures-bbs": "^1.2.0", + "@trustvc/w3c-credential-status": "^2.4.0", + "@trustvc/w3c-issuer": "^2.3.0", + "base64url-universal": "^2.0.0", + "cbor": "^9.0.2", + "did-resolver": "^4.1.0", + "jsonld": "^6.0.0", + "jsonld-signatures": "^11.5.0", + "jsonld-signatures-v7": "npm:jsonld-signatures@7.0.0", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18.x" + }, + "peerDependencies": { + "jsonld": "^6.0.0" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/did-resolver": { + "node_modules/@trustvc/w3c-vc/node_modules/did-resolver": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", "license": "Apache-2.0" }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/ethers": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", - "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", + "node_modules/@trustvc/w3c-vc/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" ], "license": "MIT", - "dependencies": { - "@ethersproject/abi": "5.8.0", - "@ethersproject/abstract-provider": "5.8.0", - "@ethersproject/abstract-signer": "5.8.0", - "@ethersproject/address": "5.8.0", - "@ethersproject/base64": "5.8.0", - "@ethersproject/basex": "5.8.0", - "@ethersproject/bignumber": "5.8.0", - "@ethersproject/bytes": "5.8.0", - "@ethersproject/constants": "5.8.0", - "@ethersproject/contracts": "5.8.0", - "@ethersproject/hash": "5.8.0", - "@ethersproject/hdnode": "5.8.0", - "@ethersproject/json-wallets": "5.8.0", - "@ethersproject/keccak256": "5.8.0", - "@ethersproject/logger": "5.8.0", - "@ethersproject/networks": "5.8.0", - "@ethersproject/pbkdf2": "5.8.0", - "@ethersproject/properties": "5.8.0", - "@ethersproject/providers": "5.8.0", - "@ethersproject/random": "5.8.0", - "@ethersproject/rlp": "5.8.0", - "@ethersproject/sha2": "5.8.0", - "@ethersproject/signing-key": "5.8.0", - "@ethersproject/solidity": "5.8.0", - "@ethersproject/strings": "5.8.0", - "@ethersproject/transactions": "5.8.0", - "@ethersproject/units": "5.8.0", - "@ethersproject/wallet": "5.8.0", - "@ethersproject/web": "5.8.0", - "@ethersproject/wordlists": "5.8.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/js-sha3": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.9.3.tgz", - "integrity": "sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==", + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, "license": "MIT" }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/jsonld-signatures": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jsonld-signatures/-/jsonld-signatures-7.0.0.tgz", - "integrity": "sha512-J/nA+llcYYjErPHG9WFpXvR82TOg5fbHk/7rXbx4Ts854DPReaKAAd0hAZ+s5/P2WIIAZPIHCqA+iz1QrOqeiQ==", - "license": "BSD-3-Clause", + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "license": "MIT", "dependencies": { - "base64url": "^3.0.1", - "crypto-ld": "^3.7.0", - "jsonld": "^4.0.1", - "node-forge": "^0.10.0", - "security-context": "^4.0.0", - "serialize-error": "^5.0.0" - }, - "engines": { - "node": ">=10" + "@types/node": "*" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/jsonld-signatures/node_modules/jsonld": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-4.0.1.tgz", - "integrity": "sha512-ltEqMQB37ZxZnsgmI+9rqHYkz1M6PqUykuS1t2aQNuH1oiLrUDYz5nyVkHQDgjFd7CFKTIWeLiNhwdwFrH5o5A==", - "license": "BSD-3-Clause", + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "license": "MIT", "dependencies": { - "canonicalize": "^1.0.1", - "lru-cache": "^5.1.1", - "object.fromentries": "^2.0.2", - "rdf-canonize": "^2.0.1", - "request": "^2.88.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6" + "undici-types": "~6.21.0" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "license": "ISC", + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/signale": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/signale/-/signale-1.4.7.tgz", + "integrity": "sha512-nc0j37QupTT7OcYeH3gRE1ZfzUalEUsDKJsJ3IsJr0pjjFZTjtrX1Bsn6Kv56YXI/H9rNSwAkIPRxNlZI8GyQw==", + "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" + "@types/node": "*" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/rdf-canonize": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-2.0.1.tgz", - "integrity": "sha512-/GVELjrfW8G/wS4QfDZ5Kq68cS1belVNJqZlcwiErerexeBUsgOINCROnP7UumWIBNdeCwTVLE9NVXMnRYK0lA==", - "license": "BSD-3-Clause", + "node_modules/@types/tmp": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", + "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", "dependencies": { - "semver": "^6.3.0", - "setimmediate": "^1.0.5" - }, - "engines": { - "node": ">=6" + "@types/yargs-parser": "*" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/serialize-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", - "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.66.0.tgz", + "integrity": "sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==", + "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.8.0" + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/type-utils": "8.66.0", + "@typescript-eslint/utils": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.66.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "license": "(MIT OR CC0-1.0)", + "node_modules/@typescript-eslint/parser": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.66.0.tgz", + "integrity": "sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", + "debug": "^4.4.3" + }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/web-did-resolver": { - "version": "2.0.32", - "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.32.tgz", - "integrity": "sha512-L91/ApTmDjgzS0UDstTKn3kN/1hlQBnVcUN8K29e3xhVBpPktHYC6uvVAQ8ohbIg9D6wrrbaBQvfRArDxgJG2g==", - "license": "Apache-2.0", + "node_modules/@typescript-eslint/project-service": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.66.0.tgz", + "integrity": "sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==", + "dev": true, + "license": "MIT", "dependencies": { - "cross-fetch": "^4.1.0", - "did-resolver": "^4.1.0" + "@typescript-eslint/tsconfig-utils": "^8.66.0", + "@typescript-eslint/types": "^8.66.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@tradetrust-tt/tradetrust/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC" - }, - "node_modules/@tradetrust-tt/tt-verify": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@tradetrust-tt/tt-verify/-/tt-verify-9.7.5.tgz", - "integrity": "sha512-LoVrJLiWB9ZnMHoe7IGBAc4edK2upKYsfCRgo9T7VNLo3XiBM4cIr25RQ5e1AQ58m+3gKWRnpP9ZKj0qqN+xFg==", - "license": "Apache-2.0", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.66.0.tgz", + "integrity": "sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==", + "dev": true, + "license": "MIT", "dependencies": { - "@tradetrust-tt/dnsprove": "^2.21.0", - "@tradetrust-tt/token-registry": "^5.5.0", - "@tradetrust-tt/tradetrust": "^6.10.3", - "@trustvc/document-store": "^1.0.3", - "axios": "^1.7.2", - "debug": "^4.3.1", - "did-resolver": "^3.1.0", - "ethers": "^5.8.0", - "ethr-did-resolver": "^4.3.3", - "node-cache": "^5.1.2", - "runtypes": "^6.3.0", - "web-did-resolver": "2.0.4" + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0" }, "engines": { - "node": ">=18.x" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "ethers": "^5.8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@tradetrust-tt/tt-verify/node_modules/ethers": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", - "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.66.0.tgz", + "integrity": "sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==", + "dev": true, "license": "MIT", - "dependencies": { - "@ethersproject/abi": "5.8.0", - "@ethersproject/abstract-provider": "5.8.0", - "@ethersproject/abstract-signer": "5.8.0", - "@ethersproject/address": "5.8.0", - "@ethersproject/base64": "5.8.0", - "@ethersproject/basex": "5.8.0", - "@ethersproject/bignumber": "5.8.0", - "@ethersproject/bytes": "5.8.0", - "@ethersproject/constants": "5.8.0", - "@ethersproject/contracts": "5.8.0", - "@ethersproject/hash": "5.8.0", - "@ethersproject/hdnode": "5.8.0", - "@ethersproject/json-wallets": "5.8.0", - "@ethersproject/keccak256": "5.8.0", - "@ethersproject/logger": "5.8.0", - "@ethersproject/networks": "5.8.0", - "@ethersproject/pbkdf2": "5.8.0", - "@ethersproject/properties": "5.8.0", - "@ethersproject/providers": "5.8.0", - "@ethersproject/random": "5.8.0", - "@ethersproject/rlp": "5.8.0", - "@ethersproject/sha2": "5.8.0", - "@ethersproject/signing-key": "5.8.0", - "@ethersproject/solidity": "5.8.0", - "@ethersproject/strings": "5.8.0", - "@ethersproject/transactions": "5.8.0", - "@ethersproject/units": "5.8.0", - "@ethersproject/wallet": "5.8.0", - "@ethersproject/web": "5.8.0", - "@ethersproject/wordlists": "5.8.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@trustvc/document-store": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@trustvc/document-store/-/document-store-1.0.3.tgz", - "integrity": "sha512-YIECQwcoreIfyTbol1/5u9CGK6mbg0Q0bSN2/Ks388zLus1IXELWK5EHYuyrFPbb9d8ajsvz7m+ySsMIY9574w==", - "license": "Apache-2.0" - }, - "node_modules/@trustvc/eip7702": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/@trustvc/eip7702/-/eip7702-1.0.0-beta.1.tgz", - "integrity": "sha512-cOGuZVLHd0+Uu7rZ/Dp2iF1VuNq+L+pWWGe+tPD/u74rSvCAzIc17dIk5HOwRBiC5awh1rXG46vLG8IRc5O01Q==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.66.0.tgz", + "integrity": "sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==", + "dev": true, "license": "MIT", "dependencies": { - "@account-abstraction/contracts": "^0.8.0", - "@openzeppelin/contracts": "^5.6.1" - } - }, - "node_modules/@trustvc/trustvc": { - "version": "2.16.0-beta.1", - "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.16.0-beta.1.tgz", - "integrity": "sha512-sXklxfioSrIV+ZyuYsyPy+WMbgOPcRweJTd2Tklg8ZdF/tQlb2yVHDTPLycSNI3YOilpRhKn9p0Y2hSJxTuRRw==", - "license": "Apache-2.0", - "dependencies": { - "@tradetrust-tt/dnsprove": "^2.18.0", - "@tradetrust-tt/ethers-aws-kms-signer": "^2.1.4", - "@tradetrust-tt/token-registry-v4": "npm:@tradetrust-tt/token-registry@^4.16.0", - "@tradetrust-tt/token-registry-v5": "npm:@tradetrust-tt/token-registry@^5.6.0-beta.1", - "@tradetrust-tt/tradetrust": "^6.10.3", - "@tradetrust-tt/tt-verify": "^9.7.5", - "@trustvc/document-store": "^1.0.3", - "@trustvc/eip7702": "^1.0.0-beta.1", - "@trustvc/w3c": "^2.4.1", - "@trustvc/w3c-context": "^2.4.0", - "@trustvc/w3c-credential-status": "^2.4.0", - "@trustvc/w3c-issuer": "^2.3.0", - "@trustvc/w3c-vc": "^2.4.1", - "ethers": "^5.8.0", - "ethersV6": "npm:ethers@^6.14.4", - "js-sha3": "^0.9.3", - "node-fetch": "^2.7.0", - "node-forge": "^1.3.3", - "permissionless": "^0.3.6", - "ts-chacha20": "^1.2.0", - "viem": "^2.53.1" + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0", + "@typescript-eslint/utils": "8.66.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "~4.40.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "ethers": "^5.8.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@trustvc/trustvc/node_modules/ethers": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", - "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@typescript-eslint/types": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.66.0.tgz", + "integrity": "sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@ethersproject/abi": "5.8.0", - "@ethersproject/abstract-provider": "5.8.0", - "@ethersproject/abstract-signer": "5.8.0", - "@ethersproject/address": "5.8.0", - "@ethersproject/base64": "5.8.0", - "@ethersproject/basex": "5.8.0", - "@ethersproject/bignumber": "5.8.0", - "@ethersproject/bytes": "5.8.0", - "@ethersproject/constants": "5.8.0", - "@ethersproject/contracts": "5.8.0", - "@ethersproject/hash": "5.8.0", - "@ethersproject/hdnode": "5.8.0", - "@ethersproject/json-wallets": "5.8.0", - "@ethersproject/keccak256": "5.8.0", - "@ethersproject/logger": "5.8.0", - "@ethersproject/networks": "5.8.0", - "@ethersproject/pbkdf2": "5.8.0", - "@ethersproject/properties": "5.8.0", - "@ethersproject/providers": "5.8.0", - "@ethersproject/random": "5.8.0", - "@ethersproject/rlp": "5.8.0", - "@ethersproject/sha2": "5.8.0", - "@ethersproject/signing-key": "5.8.0", - "@ethersproject/solidity": "5.8.0", - "@ethersproject/strings": "5.8.0", - "@ethersproject/transactions": "5.8.0", - "@ethersproject/units": "5.8.0", - "@ethersproject/wallet": "5.8.0", - "@ethersproject/web": "5.8.0", - "@ethersproject/wordlists": "5.8.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@trustvc/trustvc/node_modules/js-sha3": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.9.3.tgz", - "integrity": "sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==", - "license": "MIT" - }, - "node_modules/@trustvc/trustvc/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.66.0.tgz", + "integrity": "sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==", + "dev": true, "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "@typescript-eslint/project-service": "8.66.0", + "@typescript-eslint/tsconfig-utils": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/visitor-keys": "8.66.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "4.x || >=6.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "encoding": "^0.1.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@trustvc/trustvc/node_modules/node-forge": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", - "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", - "license": "(BSD-3-Clause OR GPL-2.0)", + "node_modules/@typescript-eslint/utils": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.66.0.tgz", + "integrity": "sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.66.0", + "@typescript-eslint/types": "8.66.0", + "@typescript-eslint/typescript-estree": "8.66.0" + }, "engines": { - "node": ">= 6.13.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@trustvc/w3c": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@trustvc/w3c/-/w3c-2.4.1.tgz", - "integrity": "sha512-yCyztSAbialRn9VYvXrHUE4v13q4g/BHUN4XUctzF5lrN3WsHKSgUpFUflocLdp1h5fxvJTbqyVoMSh5SDLwQw==", - "license": "Apache-2.0", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.66.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.66.0.tgz", + "integrity": "sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==", + "dev": true, + "license": "MIT", "dependencies": { - "@trustvc/w3c-context": "^2.4.0", - "@trustvc/w3c-credential-status": "^2.4.0", - "@trustvc/w3c-issuer": "^2.3.0", - "@trustvc/w3c-vc": "^2.4.1" + "@typescript-eslint/types": "8.66.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": ">=18.x" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@trustvc/w3c-context": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-context/-/w3c-context-2.4.0.tgz", - "integrity": "sha512-OCRfqZfTyEZ2Lpd5RPBl36DwvaKv3qV1PgZOEA9hrnEtHMWxwS5iSdv+xFYK8pZIoeheFZKymfgcB5LL7UBQRw==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, "license": "Apache-2.0", - "dependencies": { - "did-resolver": "^4.1.0", - "jsonld-signatures": "^11.5.0" - }, "engines": { - "node": ">=18.x" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@trustvc/w3c-context/node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", - "license": "Apache-2.0" + "node_modules/@ungap/structured-clone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz", + "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==", + "dev": true, + "license": "ISC" }, - "node_modules/@trustvc/w3c-credential-status": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-credential-status/-/w3c-credential-status-2.4.0.tgz", - "integrity": "sha512-fiMGtfOmq1x9e+vd89ZKqguYtmW2w2k2hxINkno+mDNHdt5CV8tfTH5EbL1fY0oPiuXM5SK+dV6iSBTIWGPFog==", - "license": "Apache-2.0", - "dependencies": { - "@trustvc/w3c-context": "^2.4.0", - "@trustvc/w3c-issuer": "^2.3.0", - "base64url-universal": "^2.0.0", - "pako": "^2.1.0" - }, + "node_modules/@uniswap/lib": { + "version": "4.0.1-alpha", + "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", + "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", + "license": "GPL-3.0-or-later", "engines": { - "node": ">=18.x" + "node": ">=10" } }, - "node_modules/@trustvc/w3c-issuer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-issuer/-/w3c-issuer-2.3.0.tgz", - "integrity": "sha512-J/Rlae2s/ihkF0q6OmBofmzdRjDI98ED9lRFIB6Uh2WaEl8eZP7+FoStip+t1Piy6ZbO/6MwaS0QCw/6N6viMA==", - "license": "Apache-2.0", - "dependencies": { - "@digitalbazaar/bls12-381-multikey": "^2.1.0", - "@digitalbazaar/ecdsa-multikey": "^1.8.0", - "@mattrglobal/bls12381-key-pair": "^1.2.1", - "bip39": "^3.1.0", - "did-resolver": "^4.1.0", - "multiformats": "^9.9.0", - "web-did-resolver": "^2.0.27" - }, + "node_modules/@uniswap/v2-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", + "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", + "license": "GPL-3.0-or-later", "engines": { - "node": ">=18.x" + "node": ">=10" } }, - "node_modules/@trustvc/w3c-issuer/node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", - "license": "Apache-2.0" - }, - "node_modules/@trustvc/w3c-issuer/node_modules/web-did-resolver": { - "version": "2.0.32", - "resolved": "https://registry.npmjs.org/web-did-resolver/-/web-did-resolver-2.0.32.tgz", - "integrity": "sha512-L91/ApTmDjgzS0UDstTKn3kN/1hlQBnVcUN8K29e3xhVBpPktHYC6uvVAQ8ohbIg9D6wrrbaBQvfRArDxgJG2g==", - "license": "Apache-2.0", - "dependencies": { - "cross-fetch": "^4.1.0", - "did-resolver": "^4.1.0" + "node_modules/@uniswap/v3-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz", + "integrity": "sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ==", + "license": "BUSL-1.1", + "engines": { + "node": ">=10" } }, - "node_modules/@trustvc/w3c-vc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-2.4.1.tgz", - "integrity": "sha512-f/pqBu70epEYVmtWvKvlhCd2F5QkV885rCcbfa9KZq9xYbOzeBueIF7P3gSdv3ILAiMCQTxvpL7hd8I8hj+M1A==", - "license": "Apache-2.0", + "node_modules/@uniswap/v3-periphery": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.4.tgz", + "integrity": "sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw==", + "license": "GPL-2.0-or-later", "dependencies": { - "@digitalbazaar/bbs-2023-cryptosuite": "^2.0.1", - "@digitalbazaar/bls12-381-multikey": "^2.1.0", - "@digitalbazaar/data-integrity": "^2.5.0", - "@digitalbazaar/ecdsa-multikey": "^1.8.0", - "@digitalbazaar/ecdsa-rdfc-2019-cryptosuite": "^1.3.0", - "@digitalbazaar/ecdsa-sd-2023-cryptosuite": "^3.4.1", - "@mattrglobal/jsonld-signatures-bbs": "^1.2.0", - "@trustvc/w3c-credential-status": "^2.4.0", - "@trustvc/w3c-issuer": "^2.3.0", - "base64url-universal": "^2.0.0", - "cbor": "^9.0.2", - "did-resolver": "^4.1.0", - "jsonld": "^6.0.0", - "jsonld-signatures": "^11.5.0", - "jsonld-signatures-v7": "npm:jsonld-signatures@7.0.0", - "uuid": "^10.0.0" + "@openzeppelin/contracts": "3.4.2-solc-0.7", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "^1.0.1", + "@uniswap/v3-core": "^1.0.0", + "base64-sol": "1.0.1" }, "engines": { - "node": ">=18.x" - }, - "peerDependencies": { - "jsonld": "^6.0.0" + "node": ">=10" } }, - "node_modules/@trustvc/w3c-vc/node_modules/did-resolver": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-4.1.0.tgz", - "integrity": "sha512-S6fWHvCXkZg2IhS4RcVHxwuyVejPR7c+a4Go0xbQ9ps5kILa8viiYQgrM4gfTyeTjJ0ekgJH9gk/BawTpmkbZA==", - "license": "Apache-2.0" + "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { + "version": "3.4.2-solc-0.7", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==", + "license": "MIT" }, - "node_modules/@trustvc/w3c-vc/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/@vitest/expect": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", + "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", "dependencies": { - "@types/node": "*" + "@vitest/spy": "1.6.1", + "@vitest/utils": "1.6.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@types/node": { - "version": "22.19.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.5.tgz", - "integrity": "sha512-HfF8+mYcHPcPypui3w3mvzuIErlNOh2OAG+BCeBZCEwyiD5ls2SiCwEyT47OELtf7M3nHxBdu0FsmzdKxkN52Q==", + "node_modules/@vitest/runner": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", + "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", + "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "@vitest/utils": "1.6.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "license": "MIT", - "peer": true - }, - "node_modules/@types/signale": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@types/signale/-/signale-1.4.7.tgz", - "integrity": "sha512-nc0j37QupTT7OcYeH3gRE1ZfzUalEUsDKJsJ3IsJr0pjjFZTjtrX1Bsn6Kv56YXI/H9rNSwAkIPRxNlZI8GyQw==", + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@types/tmp": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz", - "integrity": "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==", + "node_modules/@vitest/runner/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, "license": "MIT" }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", - "integrity": "sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==", + "node_modules/@vitest/runner/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, - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.52.0", - "@typescript-eslint/type-utils": "8.52.0", - "@typescript-eslint/utils": "8.52.0", - "@typescript-eslint/visitor-keys": "8.52.0", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.4.0" - }, + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12.20" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.52.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", - "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", + "node_modules/@vitest/snapshot": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", + "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.52.0", - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/typescript-estree": "8.52.0", - "@typescript-eslint/visitor-keys": "8.52.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", - "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", + "node_modules/@vitest/snapshot/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/spy": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", + "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.52.0", - "@typescript-eslint/types": "^8.52.0", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "tinyspy": "^2.2.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", - "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", + "node_modules/@vitest/utils": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", + "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/visitor-keys": "8.52.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", - "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, + "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==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/abitype": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", + "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "license": "MIT", "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/wevm" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "typescript": ">=5.0.4", + "zod": "^3.22.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz", - "integrity": "sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==", - "dev": true, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/typescript-estree": "8.52.0", - "@typescript-eslint/utils": "8.52.0", - "debug": "^4.4.3", - "ts-api-utils": "^2.4.0" + "event-target-shim": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", - "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=0.4.0" + } + }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" + }, + "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" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", - "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.52.0", - "@typescript-eslint/tsconfig-utils": "8.52.0", - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/visitor-keys": "8.52.0", - "debug": "^4.4.3", - "minimatch": "^9.0.5", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.4.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", - "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", - "dev": true, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.52.0", - "@typescript-eslint/types": "8.52.0", - "@typescript-eslint/typescript-estree": "8.52.0" + "type-fest": "^0.21.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", - "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", + "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, - "dependencies": { - "@typescript-eslint/types": "8.52.0", - "eslint-visitor-keys": "^4.2.1" - }, + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@ungap/structured-clone": { + "node_modules/any-promise": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" }, - "node_modules/@uniswap/lib": { - "version": "4.0.1-alpha", - "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", - "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", - "license": "GPL-3.0-or-later", + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, "engines": { "node": ">=10" } }, - "node_modules/@uniswap/v2-core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", - "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", - "license": "GPL-3.0-or-later", - "engines": { - "node": ">=10" - } + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" }, - "node_modules/@uniswap/v3-core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz", - "integrity": "sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ==", - "license": "BUSL-1.1", + "node_modules/argv-formatter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", + "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/@uniswap/v3-periphery": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.4.tgz", - "integrity": "sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw==", - "license": "GPL-2.0-or-later", + "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==", + "license": "MIT", "dependencies": { - "@openzeppelin/contracts": "3.4.2-solc-0.7", - "@uniswap/lib": "^4.0.1-alpha", - "@uniswap/v2-core": "^1.0.1", - "@uniswap/v3-core": "^1.0.0", - "base64-sol": "1.0.1" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { - "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==", + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true, "license": "MIT" }, - "node_modules/@vitest/expect": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz", - "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", - "dev": true, + "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==", + "license": "MIT", "dependencies": { - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "chai": "^4.3.10" + "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://opencollective.com/vitest" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@vitest/runner": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz", - "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", - "dev": true, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", "dependencies": { - "@vitest/utils": "1.6.1", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "safer-buffer": "~2.1.0" } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/@vitest/runner/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "license": "MIT" }, - "node_modules/@vitest/runner/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, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8" } }, - "node_modules/@vitest/snapshot": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz", - "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "license": "MIT", + "engines": { + "node": "*" } }, - "node_modules/@vitest/snapshot/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/@vitest/spy": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz", - "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/@vitest/utils": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz", - "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "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 + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, - "node_modules/abitype": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz", - "integrity": "sha512-Ofer5QUnuUdTFsBRwARMoWKOH1ND5ehwYhJ3OJ/BQO+StkwQjHw0XyVh4vDttzHB7QOFhPHa/o413PJ82gU/Tg==", + "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==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/wevm" + "dependencies": { + "possible-typed-array-names": "^1.0.0" }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3.22.0 || ^4.0.0" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", "engines": { - "node": ">=6.5" + "node": "*" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", "dependencies": { - "acorn": "^8.11.0" - }, + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base58-universal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base58-universal/-/base58-universal-2.0.0.tgz", + "integrity": "sha512-BgkgF8zVLOAygszG4W8NkLm7iXrw80VYAOcedrzANrIhS14+4W6zVqjyGTFUBM/FpqkHUt8aAYd4DbBBfn3zKg==", + "license": "BSD-3-Clause", "engines": { - "node": ">=0.4.0" + "node": ">=14" } }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "node_modules/base64-sol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", + "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==", "license": "MIT" }, - "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==", + "node_modules/base64url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", + "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", "license": "MIT", - "optional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/base64url-universal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url-universal/-/base64url-universal-2.0.0.tgz", + "integrity": "sha512-6Hpg7EBf3t148C3+fMzjf+CHnADVDafWzlJUXAqqqbm4MKNXbsoPdOkWeRTjNlkYG7TpyjIpRO1Gk0SnsFD1rw==", + "license": "BSD-3-Clause", "dependencies": { - "debug": "4" + "base64url": "^3.0.1" }, "engines": { - "node": ">= 6.0.0" + "node": ">=14" } }, - "node_modules/aggregate-error": { + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" + }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bip39": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "node_modules/bip39/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/bn.js": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", + "license": "MIT" + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, + "license": "MIT", "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "fill-range": "^7.1.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "base-x": "^3.0.2" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "load-tsconfig": "^0.2.3" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "esbuild": ">=0.18" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { + "node_modules/call-bind-apply-helpers": { "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==", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/arraybuffer.prototype.slice": { + "node_modules/call-bound": { "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==", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "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" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -6520,794 +6029,479 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" + "engines": { + "node": ">=6" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "license": "MIT", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } + "node_modules/canonicalize": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", + "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", + "license": "Apache-2.0" }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", - "license": "MIT" + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "license": "Apache-2.0" }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/cbor": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", + "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", "license": "MIT", + "dependencies": { + "nofilter": "^3.1.0" + }, "engines": { - "node": ">=0.8" + "node": ">=16" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" + "node_modules/cborg": { + "version": "5.1.11", + "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.11.tgz", + "integrity": "sha512-oc6Pzg/gkTobxHZNgMmny+G99dOeBMbAmnGHcZWMKtolxZBIVwfi0Pj0khxEtNU8HMFdbT5sK0HmtgecDUPP0A==", + "license": "Apache-2.0", + "bin": { + "cborg": "lib/bin.js" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "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==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "license": "Apache-2.0", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, - "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" } }, - "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==" - }, - "node_modules/base-x": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", - "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "^5.0.1" + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/base58-universal": { + "node_modules/chownr": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base58-universal/-/base58-universal-2.0.0.tgz", - "integrity": "sha512-BgkgF8zVLOAygszG4W8NkLm7iXrw80VYAOcedrzANrIhS14+4W6zVqjyGTFUBM/FpqkHUt8aAYd4DbBBfn3zKg==", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "devOptional": true, + "license": "ISC", "engines": { - "node": ">=14" + "node": ">=10" } }, - "node_modules/base64-sol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", - "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==", - "license": "MIT" - }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", + "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==", + "dev": true, "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=6" } }, - "node_modules/base64url-universal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64url-universal/-/base64url-universal-2.0.0.tgz", - "integrity": "sha512-6Hpg7EBf3t148C3+fMzjf+CHnADVDafWzlJUXAqqqbm4MKNXbsoPdOkWeRTjNlkYG7TpyjIpRO1Gk0SnsFD1rw==", - "license": "BSD-3-Clause", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "optional": true, "dependencies": { - "base64url": "^3.0.1" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "license": "BSD-3-Clause", + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "license": "ISC", "dependencies": { - "tweetnacl": "^0.14.3" + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" } }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "license": "MIT" - }, - "node_modules/before-after-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", - "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", - "dev": true - }, - "node_modules/bip39": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", - "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "license": "ISC", "dependencies": { - "@noble/hashes": "^1.2.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/bip39/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/cli-highlight/node_modules/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": "^14.21.3 || >=16" + "node": ">=10" }, "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/bn.js": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz", - "integrity": "sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==", - "license": "MIT" - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true - }, - "node_modules/bowser": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", - "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", - "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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT" - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" } }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "license": "MIT", - "optional": true - }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, + "license": "MIT", "dependencies": { - "load-tsconfig": "^0.2.3" + "string-width": "^4.2.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "10.* || >= 12.*" }, - "peerDependencies": { - "esbuild": ">=0.18" + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", "engines": { - "node": ">=8" + "node": ">= 12" } }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "license": "MIT", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "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", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/cliui/node_modules/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==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/canonicalize": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", - "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", - "license": "Apache-2.0" + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0" + "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/cbor": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", - "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", "dependencies": { - "nofilter": "^3.1.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=16" - } - }, - "node_modules/cborg": { - "version": "5.1.11", - "resolved": "https://registry.npmjs.org/cborg/-/cborg-5.1.11.tgz", - "integrity": "sha512-oc6Pzg/gkTobxHZNgMmny+G99dOeBMbAmnGHcZWMKtolxZBIVwfi0Pj0khxEtNU8HMFdbT5sK0HmtgecDUPP0A==", - "license": "Apache-2.0", - "bin": { - "cborg": "lib/bin.js" + "node": ">= 0.8" } }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/command-line-commands": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/command-line-commands/-/command-line-commands-3.0.2.tgz", + "integrity": "sha512-ac6PdCtdR6q7S3HN+JiVLIWGHY30PRYIEl2qPo+FuEuzwAUk0UYyimrngrg7FvF/mCr4Jgoqv5ZnHZgads50rw==", + "license": "MIT", + "optional": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "array-back": "^4.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, + "node_modules/command-line-commands/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", + "optional": true, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "license": "MIT", "dependencies": { - "get-func-name": "^2.0.2" + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" }, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "optional": true, "engines": { - "node": ">=10" + "node": ">=4" } }, - "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==", - "dev": true, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", - "optional": true, "dependencies": { - "restore-cursor": "^3.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "dev": true, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "bin": { - "highlight": "bin/highlight" - }, - "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "color-name": "1.1.3" } }, - "node_modules/cli-highlight/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" } }, - "node_modules/cli-highlight/node_modules/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, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=4" } }, - "node_modules/cli-highlight/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/cli-highlight/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/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==", - "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/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "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/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "license": "MIT", - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-commands": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/command-line-commands/-/command-line-commands-3.0.2.tgz", - "integrity": "sha512-ac6PdCtdR6q7S3HN+JiVLIWGHY30PRYIEl2qPo+FuEuzwAUk0UYyimrngrg7FvF/mCr4Jgoqv5ZnHZgads50rw==", - "license": "MIT", - "optional": true, - "dependencies": { - "array-back": "^4.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-commands/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "license": "MIT", - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/command-line-usage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "node": ">=4" } }, "node_modules/command-line-usage/node_modules/typical": { @@ -7324,6 +6518,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -7333,6 +6528,7 @@ "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, + "license": "MIT", "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" @@ -7341,19 +6537,22 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" }, "node_modules/confbox": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -7364,6 +6563,7 @@ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, + "license": "MIT", "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -7375,14 +6575,29 @@ "license": "ISC", "optional": true }, - "node_modules/conventional-changelog-angular": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.0.tgz", - "integrity": "sha512-DOuBwYSqWzfwuRByY9O4oOIvDlkUCTDzfbOgcSbkY+imXXj+4tmrEFao3K+FxemClYfYnZzsvudbwrhje9VHDA==", + "node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, "engines": { "node": ">=18" } @@ -7392,6 +6607,7 @@ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.4.0.tgz", "integrity": "sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==", "dev": true, + "license": "MIT", "dependencies": { "@simple-libs/stream-utils": "^1.2.0", "conventional-commits-filter": "^5.0.0", @@ -7411,15 +6627,17 @@ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/conventional-commits-parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.3.0.tgz", - "integrity": "sha512-RfOq/Cqy9xV9bOA8N+ZH6DlrDR+5S3Mi0B5kACEjESpE+AviIpAptx9a9cFpWCCvgRtWT+0BbUw+e1BZfts9jg==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", "dev": true, + "license": "MIT", "dependencies": { "@simple-libs/stream-utils": "^1.2.0", "meow": "^13.0.0" @@ -7436,6 +6654,7 @@ "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7450,10 +6669,11 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", - "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -7475,24 +6695,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cross-fetch": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", @@ -7527,6 +6729,7 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7566,6 +6769,15 @@ "node": ">=8.3.0" } }, + "node_modules/crypto-ld/node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/crypto-ld/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -7580,6 +6792,7 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -7595,6 +6808,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7618,6 +6832,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", "engines": { "node": ">= 12" } @@ -7677,6 +6892,7 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -7694,6 +6910,7 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -7714,7 +6931,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/define-data-property": { "version": "1.1.4", @@ -7787,6 +7005,7 @@ "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" } @@ -7796,6 +7015,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -7808,6 +7028,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -7820,6 +7041,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -7858,6 +7080,7 @@ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "readable-stream": "^2.0.2" } @@ -7866,13 +7089,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7887,13 +7112,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -7924,27 +7151,30 @@ } }, "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", - "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/emojilib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/env-ci": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-11.2.0.tgz", "integrity": "sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^8.0.0", "java-properties": "^1.0.2" @@ -7953,11 +7183,143 @@ "node": "^18.17 || >=20.6.1" } }, + "node_modules/env-ci/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/env-ci/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/env-ci/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/env-ci/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -7967,6 +7329,7 @@ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -7978,6 +7341,7 @@ "version": "1.3.4", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -8050,6 +7414,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "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", @@ -8096,14 +7478,17 @@ } }, "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==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "license": "MIT", "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -8113,11 +7498,12 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -8125,38 +7511,39 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -8166,6 +7553,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -8179,6 +7567,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -8234,6 +7623,7 @@ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -8249,6 +7639,7 @@ "resolved": "https://registry.npmjs.org/eslint-formatter-table/-/eslint-formatter-table-7.32.1.tgz", "integrity": "sha512-JYC49hAJMNjLfbgXVeQHU6ngP0M8ThgXCHLGrncYB+R/RHEhRPnLxHjolTJdb7RdQ8zcCt2F7Mrt6Ou3PwMOHw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "table": "^6.0.9" @@ -8262,6 +7653,7 @@ "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" @@ -8278,6 +7670,7 @@ "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" }, @@ -8286,10 +7679,11 @@ } }, "node_modules/eslint/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.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -8301,11 +7695,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/eslint/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==", + "dev": true, + "license": "MIT" + }, "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==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8316,6 +7718,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -8324,13 +7727,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8343,6 +7748,7 @@ "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", @@ -8360,6 +7766,7 @@ "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" }, @@ -8372,6 +7779,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -8384,6 +7792,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -8393,6 +7802,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -8402,14 +7812,15 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/ethers": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz", - "integrity": "sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.17.0.tgz", + "integrity": "sha512-BpyrpIPJ3ydEVow8zGaz1DuPS7YU8DcWxuBnY9a0UA/lvAPwrMr+EPXsfrul628SRaekPNeIM4UFh/91GWZang==", "funding": [ { "type": "individual", @@ -8422,13 +7833,13 @@ ], "license": "MIT", "dependencies": { - "@adraffy/ens-normalize": "1.10.1", + "@adraffy/ens-normalize": "1.11.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", "tslib": "2.7.0", - "ws": "8.17.1" + "ws": "8.21.0" }, "engines": { "node": ">=14.0.0" @@ -8479,30 +7890,51 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, - "node_modules/ethersV6": { - "name": "ethers", - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz", - "integrity": "sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/ethers/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/ethersV6": { + "name": "ethers", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.17.0.tgz", + "integrity": "sha512-BpyrpIPJ3ydEVow8zGaz1DuPS7YU8DcWxuBnY9a0UA/lvAPwrMr+EPXsfrul628SRaekPNeIM4UFh/91GWZang==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } ], "license": "MIT", "dependencies": { - "@adraffy/ens-normalize": "1.10.1", + "@adraffy/ens-normalize": "1.11.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "22.7.5", "aes-js": "4.0.0-beta.5", "tslib": "2.7.0", - "ws": "8.17.1" + "ws": "8.21.0" }, "engines": { "node": ">=14.0.0" @@ -8553,6 +7985,27 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, + "node_modules/ethersV6/node_modules/ws": { + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/ethr-did-registry": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/ethr-did-registry/-/ethr-did-registry-0.0.3.tgz", @@ -8594,28 +8047,36 @@ "license": "MIT" }, "node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=16.17" + "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -8626,6 +8087,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -8644,42 +8106,44 @@ ], "license": "MIT" }, - "node_modules/fast-content-type-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", - "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -8689,37 +8153,16 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] - }, - "node_modules/fast-xml-builder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", - "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } ], - "license": "MIT" + "license": "BSD-3-Clause" }, - "node_modules/fast-xml-parser": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", - "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", "license": "MIT", "dependencies": { - "fast-xml-builder": "^1.0.0", - "strnum": "^2.1.2" - }, - "bin": { - "fxparser": "src/cli/cli.js" + "fast-string-width": "^3.0.2" } }, "node_modules/fastq": { @@ -8727,27 +8170,11 @@ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -8762,6 +8189,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -8771,22 +8199,19 @@ } }, "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "is-unicode-supported": "^2.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-entry-cache": { @@ -8794,6 +8219,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -8806,6 +8232,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -8830,6 +8257,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8846,6 +8274,7 @@ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -8858,6 +8287,7 @@ "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz", "integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==", "dev": true, + "license": "MIT", "dependencies": { "semver-regex": "^4.0.5", "super-regex": "^1.0.0" @@ -8874,6 +8304,7 @@ "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", "dev": true, + "license": "MIT", "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", @@ -8885,6 +8316,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -8904,10 +8336,11 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.16.0", @@ -8954,16 +8387,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -8973,6 +8406,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" }, @@ -8980,73 +8414,27 @@ "node": ">=12.20.0" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/from2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.14" } }, "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==", + "devOptional": true, "license": "ISC", - "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -9058,8 +8446,8 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, "license": "ISC", - "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9070,7 +8458,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==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -9078,6 +8467,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -9100,6 +8490,7 @@ "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -9108,17 +8499,20 @@ } }, "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==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9178,14 +8572,17 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -9198,6 +8595,7 @@ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -9240,12 +8638,13 @@ } }, "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9268,18 +8667,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -9304,6 +8691,7 @@ "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.1.tgz", "integrity": "sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==", "dev": true, + "license": "MIT", "dependencies": { "argv-formatter": "~1.0.0", "spawn-error-forwarder": "~1.0.0", @@ -9317,8 +8705,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "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, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9339,6 +8728,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -9346,21 +8736,30 @@ "node": ">=10.13.0" } }, + "node_modules/glob/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" + }, "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==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "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==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "devOptional": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9373,6 +8772,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -9388,6 +8788,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -9426,18 +8827,20 @@ "node_modules/graceful-fs": { "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==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9517,6 +8920,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -9609,6 +9013,7 @@ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": "*" } @@ -9629,6 +9034,7 @@ "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-4.0.0.tgz", "integrity": "sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=20" }, @@ -9637,10 +9043,11 @@ } }, "node_modules/hosted-git-info": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", - "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^11.1.0" }, @@ -9649,34 +9056,38 @@ } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "dev": true, + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-9.1.0.tgz", + "integrity": "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "agent-base": "9.0.0", + "debug": "^4.3.4", + "proxy-agent-negotiate": "1.1.0" }, "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-9.0.0.tgz", + "integrity": "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 20" } }, "node_modules/http-signature": { @@ -9709,12 +9120,13 @@ } }, "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=16.17.0" + "node": ">=10.17.0" } }, "node_modules/husky": { @@ -9737,6 +9149,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9745,10 +9158,11 @@ } }, "node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -9758,6 +9172,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -9774,6 +9189,7 @@ "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-2.0.0.tgz", "integrity": "sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.3.4", "import-meta-resolve": "^4.0.0" @@ -9787,6 +9203,7 @@ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -9797,6 +9214,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -9806,6 +9224,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9815,6 +9234,7 @@ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -9827,6 +9247,7 @@ "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.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9835,13 +9256,15 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/iniparser": { "version": "1.0.5", @@ -9853,14 +9276,15 @@ } }, "node_modules/inquirer": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-13.2.0.tgz", - "integrity": "sha512-4CBv58vLrL4CnMgrscW/T5cLvfWM2nRLevttTiZTQyku7YV7/pc2IKyABBU2rDfVl4PiIB0sTRcwOac7BIYKLA==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-13.4.3.tgz", + "integrity": "sha512-EPd3IqieHSavSOXh+LZhrIkdQcOELWeRblLT6kslQr+cF9XTh/HxZdSt1YkHH1iq4dvqBnV42uwg2YlorgOy6g==", + "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.1", - "@inquirer/prompts": "^8.2.0", - "@inquirer/type": "^4.0.3", + "@inquirer/ansi": "^2.0.5", + "@inquirer/core": "^11.1.10", + "@inquirer/prompts": "^8.4.3", + "@inquirer/type": "^4.0.5", "mute-stream": "^3.0.0", "run-async": "^4.0.6", "rxjs": "^7.8.2" @@ -9878,17 +9302,18 @@ } }, "node_modules/inquirer/node_modules/@inquirer/checkbox": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.0.4.tgz", - "integrity": "sha512-DrAMU3YBGMUAp6ArwTIp/25CNDtDbxk7UjIrrtM25JVVrlVYlVzHh5HR1BDFu9JMyUoZ4ZanzeaHqNDttf3gVg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz", + "integrity": "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", + "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.1", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -9900,15 +9325,16 @@ } }, "node_modules/inquirer/node_modules/@inquirer/confirm": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.4.tgz", - "integrity": "sha512-WdaPe7foUnoGYvXzH4jp4wH/3l+dBhZ3uwhKjXjwdrq5tEIFaANxj6zrGHxLdsIA0yKM0kFPVcEalOZXBB5ISA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.1", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -9920,20 +9346,21 @@ } }, "node_modules/inquirer/node_modules/@inquirer/core": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.1.tgz", - "integrity": "sha512-hV9o15UxX46OyQAtaoMqAOxGR8RVl1aZtDx1jHbCtSJy1tBdTfKxLPKf7utsE4cRy4tcmCQ4+vdV+ca+oNxqNA==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3", + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^9.0.2" + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -9945,16 +9372,17 @@ } }, "node_modules/inquirer/node_modules/@inquirer/editor": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.0.4.tgz", - "integrity": "sha512-QI3Jfqcv6UO2/VJaEFONH8Im1ll++Xn/AJTBn9Xf+qx2M+H8KZAdQ5sAe2vtYlo+mLW+d7JaMJB4qWtK4BG3pw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-5.2.2.tgz", + "integrity": "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.1", - "@inquirer/external-editor": "^2.0.3", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/external-editor": "^3.0.3", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -9966,15 +9394,16 @@ } }, "node_modules/inquirer/node_modules/@inquirer/expand": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.0.4.tgz", - "integrity": "sha512-0I/16YwPPP0Co7a5MsomlZLpch48NzYfToyqYAOWtBmaXSB80RiNQ1J+0xx2eG+Wfxt0nHtpEWSRr6CzNVnOGg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.1.tgz", + "integrity": "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.1", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -9986,23 +9415,25 @@ } }, "node_modules/inquirer/node_modules/@inquirer/figures": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.3.tgz", - "integrity": "sha512-y09iGt3JKoOCBQ3w4YrSJdokcD8ciSlMIWsD+auPu+OZpfxLuyz+gICAQ6GCBOmJJt4KEQGHuZSVff2jiNOy7g==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz", + "integrity": "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==", + "license": "MIT", "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, "node_modules/inquirer/node_modules/@inquirer/input": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.4.tgz", - "integrity": "sha512-4B3s3jvTREDFvXWit92Yc6jF1RJMDy2VpSqKtm4We2oVU65YOh2szY5/G14h4fHlyQdpUmazU5MPCFZPRJ0AOw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz", + "integrity": "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.1", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -10014,15 +9445,16 @@ } }, "node_modules/inquirer/node_modules/@inquirer/number": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.0.4.tgz", - "integrity": "sha512-CmMp9LF5HwE+G/xWsC333TlCzYYbXMkcADkKzcawh49fg2a1ryLc7JL1NJYYt1lJ+8f4slikNjJM9TEL/AljYQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-4.1.1.tgz", + "integrity": "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.1", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -10034,16 +9466,17 @@ } }, "node_modules/inquirer/node_modules/@inquirer/password": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.0.4.tgz", - "integrity": "sha512-ZCEPyVYvHK4W4p2Gy6sTp9nqsdHQCfiPXIP9LbJVW4yCinnxL/dDDmPaEZVysGrj8vxVReRnpfS2fOeODe9zjg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-5.1.1.tgz", + "integrity": "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==", + "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.1", - "@inquirer/type": "^4.0.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -10055,23 +9488,24 @@ } }, "node_modules/inquirer/node_modules/@inquirer/prompts": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.2.0.tgz", - "integrity": "sha512-rqTzOprAj55a27jctS3vhvDDJzYXsr33WXTjODgVOru21NvBo9yIgLIAf7SBdSV0WERVly3dR6TWyp7ZHkvKFA==", - "dependencies": { - "@inquirer/checkbox": "^5.0.4", - "@inquirer/confirm": "^6.0.4", - "@inquirer/editor": "^5.0.4", - "@inquirer/expand": "^5.0.4", - "@inquirer/input": "^5.0.4", - "@inquirer/number": "^4.0.4", - "@inquirer/password": "^5.0.4", - "@inquirer/rawlist": "^5.2.0", - "@inquirer/search": "^4.1.0", - "@inquirer/select": "^5.0.4" + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.5.2.tgz", + "integrity": "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^5.2.1", + "@inquirer/confirm": "^6.1.1", + "@inquirer/editor": "^5.2.2", + "@inquirer/expand": "^5.1.1", + "@inquirer/input": "^5.1.2", + "@inquirer/number": "^4.1.1", + "@inquirer/password": "^5.1.1", + "@inquirer/rawlist": "^5.3.1", + "@inquirer/search": "^4.2.1", + "@inquirer/select": "^5.2.1" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -10083,15 +9517,16 @@ } }, "node_modules/inquirer/node_modules/@inquirer/rawlist": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.2.0.tgz", - "integrity": "sha512-CciqGoOUMrFo6HxvOtU5uL8fkjCmzyeB6fG7O1vdVAZVSopUBYECOwevDBlqNLyyYmzpm2Gsn/7nLrpruy9RFg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.1.tgz", + "integrity": "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.1", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -10103,16 +9538,17 @@ } }, "node_modules/inquirer/node_modules/@inquirer/search": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.1.0.tgz", - "integrity": "sha512-EAzemfiP4IFvIuWnrHpgZs9lAhWDA0GM3l9F4t4mTQ22IFtzfrk8xbkMLcAN7gmVML9O/i+Hzu8yOUyAaL6BKA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-4.2.1.tgz", + "integrity": "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==", + "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.1", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -10124,17 +9560,18 @@ } }, "node_modules/inquirer/node_modules/@inquirer/select": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.0.4.tgz", - "integrity": "sha512-s8KoGpPYMEQ6WXc0dT9blX2NtIulMdLOO3LA1UKOiv7KFWzlJ6eLkEYTDBIi+JkyKXyn8t/CD6TinxGjyLt57g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz", + "integrity": "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", + "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.1", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -10146,11 +9583,12 @@ } }, "node_modules/inquirer/node_modules/@inquirer/type": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.3.tgz", - "integrity": "sha512-cKZN7qcXOpj1h+1eTTcGDVLaBIHNMT1Rz9JqJP5MnEJ0JhgVWllx7H/tahUp5YEK1qaByH2Itb8wLG/iScD5kw==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", + "integrity": "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==", + "license": "MIT", "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -10161,87 +9599,15 @@ } } }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/inquirer/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==" - }, "node_modules/inquirer/node_modules/mute-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz", "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "license": "ISC", "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/inquirer/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/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==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -10256,22 +9622,6 @@ "node": ">= 0.4" } }, - "node_modules/into-stream": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-7.0.0.tgz", - "integrity": "sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==", - "dev": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -10292,7 +9642,8 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", @@ -10395,11 +9746,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "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" } @@ -10423,6 +9790,7 @@ "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==", + "license": "MIT", "engines": { "node": ">=8" } @@ -10451,6 +9819,7 @@ "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" }, @@ -10487,6 +9856,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -10512,6 +9882,7 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10521,6 +9892,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10530,6 +9902,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -10583,12 +9956,13 @@ } }, "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10653,6 +10027,7 @@ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -10713,7 +10088,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isows": { "version": "1.0.7", @@ -10737,10 +10113,11 @@ "license": "MIT" }, "node_modules/issue-parser": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz", - "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.2.tgz", + "integrity": "sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==", "dev": true, + "license": "MIT", "dependencies": { "lodash.capitalize": "^4.2.1", "lodash.escaperegexp": "^4.1.2", @@ -10757,6 +10134,7 @@ "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -10766,33 +10144,46 @@ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/js-base64": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.8.tgz", - "integrity": "sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==", + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.9.2.tgz", + "integrity": "sha512-6zayE8QlUdiweYI6cETD/XBSqFcoCUlufn/29PJR99r82x1yDnIprRca0YvAYpAW+ez0GuQkVBC6xG5QkD7OjA==", "license": "BSD-3-Clause" }, "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.9.3.tgz", + "integrity": "sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==", "license": "MIT" }, "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -10810,18 +10201,21 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "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==" + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "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", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", @@ -10832,13 +10226,15 @@ "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -10847,17 +10243,21 @@ "license": "ISC" }, "node_modules/json-with-bigint": { - "version": "3.5.7", - "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.7.tgz", - "integrity": "sha512-7ei3MdAI5+fJPVnKlW77TKNKwQ5ppSzWvhPuSuINT/GYW9ZOC1eRKOuhV9yHG5aEsUPj9BBx5JIekkmoLHxZOw==", - "dev": true + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz", + "integrity": "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==", + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -10936,6 +10336,15 @@ "yallist": "^3.0.2" } }, + "node_modules/jsonld-signatures-v7/node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/jsonld-signatures-v7/node_modules/rdf-canonize": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-2.0.1.tgz", @@ -11046,6 +10455,15 @@ "node": ">=18" } }, + "node_modules/jsonld-signatures/node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, "node_modules/jsprim": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", @@ -11066,6 +10484,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -11121,6 +10540,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -11134,6 +10554,7 @@ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" }, @@ -11145,12 +10566,14 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -11161,11 +10584,25 @@ "node": ">=4" } }, + "node_modules/load-json-file/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==", + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/load-tsconfig": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -11175,6 +10612,7 @@ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", "dev": true, + "license": "MIT", "dependencies": { "mlly": "^1.7.3", "pkg-types": "^1.2.1" @@ -11191,6 +10629,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -11202,16 +10641,17 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", - "dev": true + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -11223,49 +10663,57 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isstring": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniqby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loupe": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } @@ -11287,6 +10735,7 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } @@ -11296,6 +10745,7 @@ "resolved": "https://registry.npmjs.org/make-asynchronous/-/make-asynchronous-1.1.0.tgz", "integrity": "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==", "dev": true, + "license": "MIT", "dependencies": { "p-event": "^6.0.0", "type-fest": "^4.6.0", @@ -11313,6 +10763,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" }, @@ -11358,6 +10809,7 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true, + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -11370,6 +10822,7 @@ "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", "dev": true, + "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", "ansi-regex": "^6.1.0", @@ -11391,6 +10844,7 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, + "license": "MIT", "dependencies": { "environment": "^1.0.0" }, @@ -11401,23 +10855,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/marked-terminal/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, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/marked-terminal/node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -11439,6 +10882,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -11450,13 +10894,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -11465,18 +10911,6 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", @@ -11485,6 +10919,7 @@ "funding": [ "https://github.com/sponsors/broofa" ], + "license": "MIT", "bin": { "mime": "bin/cli.js" }, @@ -11514,15 +10949,13 @@ } }, "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "devOptional": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/minimalistic-assert": { @@ -11538,15 +10971,16 @@ "license": "MIT" }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -11566,8 +11000,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "devOptional": true, "license": "ISC", - "optional": true, "engines": { "node": ">=8" } @@ -11576,8 +11010,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -11590,8 +11024,8 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "devOptional": true, "license": "ISC", - "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -11612,21 +11046,23 @@ } }, "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.15.0", + "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", - "ufo": "^1.6.1" + "ufo": "^1.6.3" } }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/multiformats": { "version": "9.9.0", @@ -11638,6 +11074,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -11647,6 +11084,7 @@ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, + "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -11654,9 +11092,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.17", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", + "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", "dev": true, "funding": [ { @@ -11664,6 +11102,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -11675,7 +11114,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", @@ -11815,7 +11255,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-cache": { "version": "5.1.2", @@ -11844,6 +11285,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -11853,6 +11295,7 @@ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "dev": true, + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -11867,6 +11310,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -11881,12 +11325,12 @@ } }, "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", + "integrity": "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ==", "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { - "node": ">= 6.0.0" + "node": ">= 6.13.0" } }, "node_modules/node-gyp-build": { @@ -11914,8 +11358,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "devOptional": true, "license": "ISC", - "optional": true, "dependencies": { "abbrev": "1" }, @@ -11931,6 +11375,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz", "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^9.0.0", "semver": "^7.3.5", @@ -11941,10 +11386,11 @@ } }, "node_modules/normalize-url": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.0.tgz", - "integrity": "sha512-z9nC87iaZXXySbWWtTHfCFJyFvKaUAW6lODhikG7ILSbVgmwuFjUqkgnheHvAUcGedO29e2QGBRXMUD64aurqQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-9.0.1.tgz", + "integrity": "sha512-ARftfC5HdUNu9jJeL8pHj8debUIHA2b91FizCoMzY4lG6dDX13jdvTK0TBe24IBDRf2HvJSzzwEPvmbkQWHRSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=20" }, @@ -11953,9 +11399,9 @@ } }, "node_modules/npm": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.11.0.tgz", - "integrity": "sha512-82gRxKrh/eY5UnNorkTFcdBQAGpgjWehkfGVqAGlJjejEtJZGGJUqjo3mbBTNbc5BTnPKGVtGPBZGhElujX5cw==", + "version": "11.19.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.19.0.tgz", + "integrity": "sha512-SDd/hHg3KqHE5Ht2NHWxNYNtqCQ2pXAPLl6OtQhPyED5PHsRfrOtO199MZTIG2cQoQ1ZRI9t28shrD+2cr3AAw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -12024,6 +11470,7 @@ "which" ], "dev": true, + "license": "Artistic-2.0", "workspaces": [ "docs", "smoke-tests", @@ -12033,65 +11480,65 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.4.0", - "@npmcli/config": "^10.7.1", + "@npmcli/arborist": "^9.9.1", + "@npmcli/config": "^10.12.0", "@npmcli/fs": "^5.0.0", "@npmcli/map-workspaces": "^5.0.3", "@npmcli/metavuln-calculator": "^9.0.3", "@npmcli/package-json": "^7.0.5", "@npmcli/promise-spawn": "^9.0.1", "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.3", - "@sigstore/tuf": "^4.0.1", + "@npmcli/run-script": "^10.0.4", + "@sigstore/tuf": "^4.0.2", "abbrev": "^4.0.0", "archy": "~1.0.0", - "cacache": "^20.0.3", + "cacache": "^20.0.4", "chalk": "^5.6.2", "ci-info": "^4.4.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^13.0.6", "graceful-fs": "^4.2.11", - "hosted-git-info": "^9.0.2", + "hosted-git-info": "^9.0.3", "ini": "^6.0.0", "init-package-json": "^8.2.5", - "is-cidr": "^6.0.3", + "is-cidr": "^6.0.4", "json-parse-even-better-errors": "^5.0.0", "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.3", - "libnpmexec": "^10.2.3", - "libnpmfund": "^7.0.17", + "libnpmdiff": "^8.1.12", + "libnpmexec": "^10.3.2", + "libnpmfund": "^7.0.26", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.3", - "libnpmpublish": "^11.1.3", + "libnpmpack": "^9.1.12", + "libnpmpublish": "^11.2.0", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", - "libnpmversion": "^8.0.3", - "make-fetch-happen": "^15.0.4", - "minimatch": "^10.2.2", + "libnpmversion": "^8.0.4", + "make-fetch-happen": "^15.0.6", + "minimatch": "^10.2.5", "minipass": "^7.1.3", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^12.2.0", + "node-gyp": "^12.4.0", "nopt": "^9.0.0", "npm-audit-report": "^7.0.0", "npm-install-checks": "^8.0.0", "npm-package-arg": "^13.0.2", "npm-pick-manifest": "^11.0.3", - "npm-profile": "^12.0.1", + "npm-profile": "^12.0.2", "npm-registry-fetch": "^19.1.1", "npm-user-validate": "^4.0.0", "p-map": "^7.0.4", - "pacote": "^21.4.0", + "pacote": "^21.5.1", "parse-conflict-json": "^5.0.1", "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", "read": "^5.0.1", - "semver": "^7.7.4", + "semver": "^7.8.5", "spdx-expression-parse": "^4.0.0", "ssri": "^13.0.1", "supports-color": "^10.2.2", - "tar": "^7.5.9", + "tar": "^7.5.19", "text-table": "~0.2.0", "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", @@ -12106,2173 +11553,2756 @@ "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/@gar/promise-retry": { + "version": "1.0.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "4.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "9.9.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^5.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/metavuln-calculator": "^9.0.2", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/query": "^5.0.0", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.0", + "bin-links": "^6.0.0", + "cacache": "^20.0.1", + "common-ancestor-path": "^2.0.0", + "hosted-git-info": "^9.0.0", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^11.2.1", + "minimatch": "^10.0.3", + "nopt": "^9.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.0", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "pacote": "^21.0.2", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", + "proggy": "^4.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "semver": "^7.3.7", + "ssri": "^13.0.0", + "treeverse": "^3.0.0", + "walk-up-path": "^4.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "10.12.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "ci-info": "^4.0.0", + "ini": "^6.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "5.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "glob": "^13.0.0", + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "9.0.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^20.0.0", + "json-parse-even-better-errors": "^5.0.0", + "pacote": "^21.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "7.0.5", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "10.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "4.0.0", "dev": true, + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "path-key": "^4.0.0" + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/npm/node_modules/@sigstore/core": { + "version": "3.2.1", "dev": true, + "inBundle": true, + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.5.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@gar/promise-retry": "^1.0.2", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@gar/promise-retry": { - "version": "1.0.2", + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "4.0.2", "dev": true, "inBundle": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "retry": "^0.13.1" + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@gar/promise-retry/node_modules/retry": { - "version": "0.13.1", + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", "dev": true, "inBundle": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", + "node_modules/npm/node_modules/@tufjs/models": { + "version": "4.1.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^7.0.4" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" }, "engines": { - "node": ">=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", + "node_modules/npm/node_modules/abbrev": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.1.0", "dev": true, "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "4.0.0", + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/npm/node_modules/bin-links": { + "version": "6.0.2", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^11.2.1", - "socks-proxy-agent": "^8.0.3" + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.4.0", + "node_modules/npm/node_modules/binary-extensions": { + "version": "3.1.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^5.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/metavuln-calculator": "^9.0.2", - "@npmcli/name-from-folder": "^4.0.0", - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/query": "^5.0.0", - "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.0", - "bin-links": "^6.0.0", - "cacache": "^20.0.1", - "common-ancestor-path": "^2.0.0", - "hosted-git-info": "^9.0.0", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^11.2.1", - "minimatch": "^10.0.3", - "nopt": "^9.0.0", - "npm-install-checks": "^8.0.0", - "npm-package-arg": "^13.0.0", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "pacote": "^21.0.2", - "parse-conflict-json": "^5.0.1", - "proc-log": "^6.0.0", - "proggy": "^4.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "semver": "^7.3.7", - "ssri": "^13.0.0", - "treeverse": "^3.0.0", - "walk-up-path": "^4.0.0" + "license": "MIT", + "engines": { + "node": ">=18.20" }, - "bin": { - "arborist": "bin/index.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "5.0.7", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "18 || 20 || >=22" } }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.7.1", + "node_modules/npm/node_modules/cacache": { + "version": "20.0.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "ci-info": "^4.0.0", - "ini": "^6.0.0", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "walk-up-path": "^4.0.0" + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "5.0.0", + "node_modules/npm/node_modules/chalk": { + "version": "5.6.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "5.0.5", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "8.0.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "7.0.2", + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "ini": "^6.0.0", - "lru-cache": "^11.2.1", - "npm-pick-manifest": "^11.0.1", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "which": "^6.0.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 18" } }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "4.0.0", + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^5.0.0", - "npm-normalize-package-bin": "^5.0.0" - }, + "license": "MIT", "bin": { - "installed-package-contents": "bin/index.js" + "cssesc": "bin/cssesc" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "5.0.3", + "node_modules/npm/node_modules/debug": { + "version": "4.4.3", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/name-from-folder": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "glob": "^13.0.0", - "minimatch": "^10.0.3" + "ms": "^2.1.3" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "9.0.3", + "node_modules/npm/node_modules/diff": { + "version": "8.0.4", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^20.0.0", - "json-parse-even-better-errors": "^5.0.0", - "pacote": "^21.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5" - }, + "license": "BSD-3-Clause", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=0.3.1" } }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "4.0.0", + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "5.0.0", + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.3", "dev": true, "inBundle": true, - "license": "ISC", + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 4.9.1" } }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "7.0.5", + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^7.0.0", - "glob": "^13.0.0", - "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.5.3", - "spdx-expression-parse": "^4.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "9.0.1", + "node_modules/npm/node_modules/glob": { + "version": "13.0.6", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "which": "^6.0.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "5.0.0", + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "9.0.3", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "lru-cache": "^11.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/redact": { - "version": "4.0.0", + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.2.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 14" } }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "10.0.3", + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.6", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "node-gyp": "^12.1.0", - "proc-log": "^6.0.0", - "which": "^6.0.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 14" } }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "4.0.0", + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.7.2", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "3.1.0", + "node_modules/npm/node_modules/ignore-walk": { + "version": "8.0.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.5.0", + "node_modules/npm/node_modules/ini": { + "version": "6.0.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "4.1.0", + "node_modules/npm/node_modules/init-package-json": { + "version": "8.2.5", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", - "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.3", - "proc-log": "^6.1.0", - "promise-retry": "^2.0.1" + "@npmcli/package-json": "^7.0.0", + "npm-package-arg": "^13.0.0", + "promzard": "^3.0.1", + "read": "^5.0.1", + "semver": "^7.7.2", + "validate-npm-package-name": "^7.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "4.0.1", + "node_modules/npm/node_modules/ip-address": { + "version": "10.2.0", "dev": true, "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.1.0" - }, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 12" } }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "3.1.0", + "node_modules/npm/node_modules/is-cidr": { + "version": "6.0.4", "dev": true, "inBundle": true, - "license": "Apache-2.0", + "license": "BSD-2-Clause", "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", - "@sigstore/protobuf-specs": "^0.5.0" + "cidr-regex": "^5.0.4" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=20" } }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", + "node_modules/npm/node_modules/isexe": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=20" } }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "4.1.0", + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "5.0.0", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^10.1.1" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/abbrev": { - "version": "4.0.0", + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", "dev": true, "inBundle": true, "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.4", + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", "dev": true, + "engines": [ + "node >= 0.2.0" + ], "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } + "license": "MIT" }, - "node_modules/npm/node_modules/aproba": { - "version": "2.1.0", + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", "dev": true, "inBundle": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", "dev": true, "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/balanced-match": { - "version": "4.0.4", + "node_modules/npm/node_modules/libnpmaccess": { + "version": "10.0.3", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0" + }, "engines": { - "node": "18 || 20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/bin-links": { - "version": "6.0.0", + "node_modules/npm/node_modules/libnpmdiff": { + "version": "8.1.12", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "cmd-shim": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "proc-log": "^6.0.0", - "read-cmd-shim": "^6.0.0", - "write-file-atomic": "^7.0.0" + "@npmcli/arborist": "^9.9.1", + "@npmcli/installed-package-contents": "^4.0.0", + "binary-extensions": "^3.0.0", + "diff": "^8.0.2", + "minimatch": "^10.0.3", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "tar": "^7.5.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "3.1.0", + "node_modules/npm/node_modules/libnpmexec": { + "version": "10.3.2", "dev": true, "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18.20" + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/arborist": "^9.9.1", + "@npmcli/package-json": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "proc-log": "^6.0.0", + "read": "^5.0.1", + "semver": "^7.3.7", + "signal-exit": "^4.1.0", + "walk-up-path": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "5.0.3", + "node_modules/npm/node_modules/libnpmfund": { + "version": "7.0.26", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "balanced-match": "^4.0.2" + "@npmcli/arborist": "^9.9.1" }, "engines": { - "node": "18 || 20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/cacache": { - "version": "20.0.3", + "node_modules/npm/node_modules/libnpmorg": { + "version": "8.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^5.0.0", - "fs-minipass": "^3.0.0", - "glob": "^13.0.0", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^13.0.0", - "unique-filename": "^5.0.0" + "aproba": "^2.0.0", + "npm-registry-fetch": "^19.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/chalk": { - "version": "5.6.2", + "node_modules/npm/node_modules/libnpmpack": { + "version": "9.1.12", "dev": true, "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^9.9.1", + "@npmcli/run-script": "^10.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/chownr": { - "version": "3.0.0", + "node_modules/npm/node_modules/libnpmpublish": { + "version": "11.2.0", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^7.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.7", + "sigstore": "^4.0.0", + "ssri": "^13.0.0" + }, "engines": { - "node": ">=18" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.4.0", + "node_modules/npm/node_modules/libnpmsearch": { + "version": "9.0.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^19.0.0" + }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.3", + "node_modules/npm/node_modules/libnpmteam": { + "version": "8.0.2", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^19.0.0" + }, "engines": { - "node": ">=20" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "8.0.0", + "node_modules/npm/node_modules/libnpmversion": { + "version": "8.0.4", "dev": true, "inBundle": true, "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.7" + }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "2.0.0", + "node_modules/npm/node_modules/lru-cache": { + "version": "11.5.1", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "engines": { - "node": ">= 18" + "node": "20 || >=22" } }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "15.0.6", "dev": true, "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" }, "engines": { - "node": ">=4" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/debug": { - "version": "4.4.3", + "node_modules/npm/node_modules/minimatch": { + "version": "10.2.5", "dev": true, "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ms": "^2.1.3" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=6.0" + "node": "18 || 20 || >=22" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/diff": { - "version": "8.0.3", + "node_modules/npm/node_modules/minipass": { + "version": "7.1.3", "dev": true, "inBundle": true, - "license": "BSD-3-Clause", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=0.3.1" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">=6" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.3", + "node_modules/npm/node_modules/minipass-fetch": { + "version": "5.0.2", "dev": true, "inBundle": true, - "license": "Apache-2.0" + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" + } }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.6", "dev": true, "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^7.1.3" + }, "engines": { - "node": ">= 4.9.1" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^7.0.3" + "minipass": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/glob": { - "version": "13.0.6", + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" + "yallist": "^4.0.0" }, "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", + "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "9.0.2", + "node_modules/npm/node_modules/minipass-sized": { + "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "lru-cache": "^11.1.0" + "minipass": "^7.1.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.2", + "node_modules/npm/node_modules/minizlib": { + "version": "3.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "minipass": "^7.1.2" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.6", + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "1.0.0", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, "engines": { - "node": ">= 14" + "node": ">= 0.6" } }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.7.2", + "node_modules/npm/node_modules/node-gyp": { + "version": "12.4.0", "dev": true, "inBundle": true, "license": "MIT", - "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "node-gyp": "bin/node-gyp.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "8.0.0", + "node_modules/npm/node_modules/nopt": { + "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "minimatch": "^10.0.3" + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", + "node_modules/npm/node_modules/npm-audit-report": { + "version": "7.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=0.8.19" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/ini": { - "version": "6.0.0", + "node_modules/npm/node_modules/npm-bundled": { + "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^5.0.0" + }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/init-package-json": { - "version": "8.2.5", + "node_modules/npm/node_modules/npm-install-checks": { + "version": "8.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BSD-2-Clause", "dependencies": { - "@npmcli/package-json": "^7.0.0", - "npm-package-arg": "^13.0.0", - "promzard": "^3.0.1", - "read": "^5.0.1", - "semver": "^7.7.2", - "validate-npm-package-name": "^7.0.0" + "semver": "^7.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/ip-address": { - "version": "10.1.0", + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "5.0.0", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">= 12" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/is-cidr": { - "version": "6.0.3", + "node_modules/npm/node_modules/npm-package-arg": { + "version": "13.0.2", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "cidr-regex": "^5.0.1" + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^7.0.0" }, "engines": { - "node": ">=20" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/isexe": { - "version": "4.0.0", + "node_modules/npm/node_modules/npm-packlist": { + "version": "10.0.4", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, "engines": { - "node": ">=20" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "5.0.0", + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "11.0.3", "dev": true, "inBundle": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", + "semver": "^7.3.5" + }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", + "node_modules/npm/node_modules/npm-profile": { + "version": "12.0.2", "dev": true, "inBundle": true, "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "dependencies": { + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "19.1.1", "dev": true, - "engines": [ - "node >= 0.2.0" - ], "inBundle": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", + "node_modules/npm/node_modules/npm-user-validate": { + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "MIT" + "license": "BSD-2-Clause", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", + "node_modules/npm/node_modules/p-map": { + "version": "7.0.4", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "10.0.3", + "node_modules/npm/node_modules/pacote": { + "version": "21.5.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", - "npm-registry-fetch": "^19.0.0" + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" + }, + "bin": { + "pacote": "bin/index.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.1.3", + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.4.0", - "@npmcli/installed-package-contents": "^4.0.0", - "binary-extensions": "^3.0.0", - "diff": "^8.0.2", - "minimatch": "^10.0.3", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2", - "tar": "^7.5.1" + "json-parse-even-better-errors": "^5.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "10.2.3", + "node_modules/npm/node_modules/path-scurry": { + "version": "2.0.2", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/arborist": "^9.4.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/run-script": "^10.0.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2", - "proc-log": "^6.0.0", - "read": "^5.0.1", - "semver": "^7.3.7", - "signal-exit": "^4.1.0", - "walk-up-path": "^4.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.17", + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "7.1.4", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/arborist": "^9.4.0" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "8.0.1", + "node_modules/npm/node_modules/proc-log": { + "version": "6.1.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^19.0.0" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "9.1.3", + "node_modules/npm/node_modules/proggy": { + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.4.0", - "@npmcli/run-script": "^10.0.0", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "11.1.3", + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "@npmcli/package-json": "^7.0.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^13.0.0", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.7", - "sigstore": "^4.0.0", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "9.0.1", + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "8.0.2", + "node_modules/npm/node_modules/promzard": { + "version": "3.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^19.0.0" + "read": "^5.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "8.0.3", + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "dev": true, + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "5.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^7.0.0", - "@npmcli/run-script": "^10.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.7" + "mute-stream": "^3.0.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/lru-cache": { - "version": "11.2.6", + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "6.0.0", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "engines": { - "node": "20 || >=22" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.4", + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.8.5", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/agent": "^4.0.0", - "cacache": "^20.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^6.0.0", - "ssri": "^13.0.0" + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/minimatch": { - "version": "10.2.2", + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, + "license": "ISC", "engines": { - "node": "18 || 20 || >=22" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/minipass": { - "version": "7.1.3", + "node_modules/npm/node_modules/sigstore": { + "version": "4.1.1", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "5.0.2", + "node_modules/npm/node_modules/socks": { + "version": "2.8.9", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^2.0.0", - "minizlib": "^3.0.1" + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" - }, - "optionalDependencies": { - "iconv-lite": "^0.7.2" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.5", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">= 8" + "node": ">= 14" } }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.23", + "dev": true, + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "13.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", + "node_modules/npm/node_modules/supports-color": { + "version": "10.2.2", "dev": true, "inBundle": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", + "node_modules/npm/node_modules/tar": { + "version": "7.5.19", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "minipass": "^3.0.0" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", "dev": true, "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "2.0.2", "dev": true, "inBundle": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "2.0.0", + "node_modules/npm/node_modules/tinyglobby": { + "version": "0.2.17", "dev": true, "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^7.1.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/npm/node_modules/minizlib": { - "version": "3.1.0", + "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, "engines": { - "node": ">= 18" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", + "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", "dev": true, "inBundle": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "node_modules/npm/node_modules/mute-stream": { + "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/negotiator": { - "version": "1.0.0", + "node_modules/npm/node_modules/tuf-js": { + "version": "4.1.0", "dev": true, "inBundle": true, "license": "MIT", + "dependencies": { + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" + }, "engines": { - "node": ">= 0.6" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp": { - "version": "12.2.0", + "node_modules/npm/node_modules/undici": { + "version": "6.27.0", "dev": true, "inBundle": true, "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^15.0.0", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "tar": "^7.5.4", - "tinyglobby": "^0.2.12", - "which": "^6.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=18.17" } }, - "node_modules/npm/node_modules/nopt": { - "version": "9.0.0", + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", - "dependencies": { - "abbrev": "^4.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "7.0.0", + "node_modules/npm/node_modules/walk-up-path": { + "version": "4.0.0", "dev": true, "inBundle": true, "license": "ISC", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "20 || >=22" } }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "5.0.0", + "node_modules/npm/node_modules/which": { + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "npm-normalize-package-bin": "^5.0.0" + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "8.0.0", + "node_modules/npm/node_modules/write-file-atomic": { + "version": "7.0.1", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "semver": "^7.1.1" + "signal-exit": "^4.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { + "node_modules/npm/node_modules/yallist": { "version": "5.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=18" } }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "13.0.2", - "dev": true, - "inBundle": true, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", "license": "ISC", + "optional": true, "dependencies": { - "hosted-git-info": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^7.0.0" - }, + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "license": "Apache-2.0", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "*" } }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "10.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^8.0.0", - "proc-log": "^6.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==", + "devOptional": true, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "11.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "npm-package-arg": "^13.0.0", - "semver": "^7.3.5" + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, + "funding": { + "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==", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.4" } }, - "node_modules/npm/node_modules/npm-profile": { - "version": "12.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", + "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==", + "license": "MIT", "dependencies": { - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0" + "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": "^20.17.0 || >=22.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "19.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", + "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==", + "license": "MIT", "dependencies": { - "@npmcli/redact": "^4.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^15.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^13.0.0", - "proc-log": "^6.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^20.17.0 || >=22.9.0" + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" } }, - "node_modules/npm/node_modules/p-map": { - "version": "7.0.4", - "dev": true, - "inBundle": true, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "devOptional": true, "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { - "node": ">=18" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/pacote": { - "version": "21.4.0", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/git": "^7.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "@npmcli/run-script": "^10.0.0", - "cacache": "^20.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^13.0.0", - "npm-packlist": "^10.0.1", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "sigstore": "^4.0.0", - "ssri": "^13.0.0", - "tar": "^7.4.3" - }, - "bin": { - "pacote": "bin/index.js" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 0.8.0" } }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^5.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/path-scurry": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "license": "MIT", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.1", - "dev": true, - "inBundle": true, + "node_modules/ox": { + "version": "0.14.33", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.33.tgz", + "integrity": "sha512-rooA/4o7bBof4Ge2VH/eovfNPb/AEEYyrNj03wggc55g5HZD8Pjs/OeWhttgjic3dDcqn0r29bDuvQEdTiUemQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@adraffy/ens-normalize": "^1.11.0", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "1.9.1", + "@noble/hashes": "^1.8.0", + "@scure/bip32": "^1.7.0", + "@scure/bip39": "^1.6.0", + "abitype": "^1.2.3", + "eventemitter3": "5.0.1" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/npm/node_modules/proc-log": { - "version": "6.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/ox/node_modules/@noble/curves": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", + "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/npm/node_modules/proggy": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/ox/node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", + "node": "^14.21.3 || >=16" + }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.2", + "node_modules/p-each-series": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", + "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", + "engines": { + "node": ">=12" + }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", + "node_modules/p-event": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", + "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "p-timeout": "^6.1.2" }, "engines": { - "node": ">=10" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/promzard": { - "version": "3.0.1", + "node_modules/p-filter": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", + "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "read": "^5.0.0" + "p-map": "^7.0.1" }, "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/read": { - "version": "5.0.1", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "mute-stream": "^3.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "6.0.0", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", + "node_modules/p-map": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", "dev": true, - "inBundle": true, "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.7.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", "dev": true, - "inBundle": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/sigstore": { - "version": "4.1.0", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.1.0", - "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.0", - "@sigstore/tuf": "^4.0.1", - "@sigstore/verify": "^3.1.0" - }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", + "node_modules/pako": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "inBundle": true, "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=6" } }, - "node_modules/npm/node_modules/socks": { - "version": "2.8.7", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.5", + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, "engines": { - "node": ">= 14" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true, - "inBundle": true, - "license": "CC-BY-3.0" + "license": "MIT" }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "4.0.0", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "dev": true, - "inBundle": true, "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "parse5": "^6.0.1" } }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.23", + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true, - "inBundle": true, - "license": "CC0-1.0" + "license": "MIT" }, - "node_modules/npm/node_modules/ssri": { - "version": "13.0.1", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, + "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=8" } }, - "node_modules/npm/node_modules/supports-color": { - "version": "10.2.2", - "dev": true, - "inBundle": true, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/tar": { - "version": "7.5.9", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "inBundle": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "2.0.2", + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, - "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.15", + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": "*" } }, - "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "dev": true, - "inBundle": true, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/permissionless": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/permissionless/-/permissionless-0.3.7.tgz", + "integrity": "sha512-r1UGWkVMqFzzJ0UcKEVHh6XvOm7+SfTvy7AoGA7ZlxpE96XR+zbtb+rRAA3DOQuq6/ifov5NvUyt1xf4zxbR0g==", "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, "peerDependencies": { - "picomatch": "^3 || ^4" + "ox": "^0.11.3", + "viem": "^2.44.4" }, "peerDependenciesMeta": { - "picomatch": { + "ox": { "optional": true } } }, - "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, - "inBundle": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/npm/node_modules/treeverse": { + "node_modules/pify": { "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/tuf-js": { - "version": "4.1.0", + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, - "inBundle": true, "license": "MIT", - "dependencies": { - "@tufjs/models": "4.1.0", - "debug": "^4.4.3", - "make-fetch-happen": "^15.0.1" - }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">= 6" } }, - "node_modules/npm/node_modules/unique-filename": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/pkg-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", + "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "license": "MIT", "dependencies": { - "unique-slug": "^6.0.0" + "find-up": "^2.0.0", + "load-json-file": "^4.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/unique-slug": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/pkg-conf/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" + "locate-path": "^2.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" + "node": ">=4" } }, - "node_modules/npm/node_modules/which": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "license": "MIT", "dependencies": { - "isexe": "^4.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" + "p-try": "^1.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" + "node": ">=4" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "license": "MIT", "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "license": "Apache-2.0", + "p-limit": "^1.1.0" + }, "engines": { - "node": "*" + "node": ">=4" } }, - "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==", - "devOptional": true, + "node_modules/pkg-conf/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==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, - "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==", + "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==", "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==", + "node_modules/postcss": { + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "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" + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10 || ^12 || >=14" } }, - "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==", + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" + "lilconfig": "^3.1.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "dev": true, "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" + "parse-ms": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ox": { - "version": "0.14.33", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.14.33.tgz", - "integrity": "sha512-rooA/4o7bBof4Ge2VH/eovfNPb/AEEYyrNj03wggc55g5HZD8Pjs/OeWhttgjic3dDcqn0r29bDuvQEdTiUemQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-agent-negotiate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-agent-negotiate/-/proxy-agent-negotiate-1.1.0.tgz", + "integrity": "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "^1.11.0", - "@noble/ciphers": "^1.3.0", - "@noble/curves": "1.9.1", - "@noble/hashes": "^1.8.0", - "@scure/bip32": "^1.7.0", - "@scure/bip39": "^1.6.0", - "abitype": "^1.2.3", - "eventemitter3": "5.0.1" + "engines": { + "node": ">= 20" }, "peerDependencies": { - "typescript": ">=5.4.0" + "kerberos": "^2.0.0" }, "peerDependenciesMeta": { - "typescript": { + "kerberos": { "optional": true } } }, - "node_modules/ox/node_modules/@adraffy/ens-normalize": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz", - "integrity": "sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/ox/node_modules/@noble/curves": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz", - "integrity": "sha512-k11yZxZg+t+gWvBbIswW0yoJlu8cHOC7dhunwOzoWH/mXGBiYyR4YY6hAEK/3EUs4UpB8la1RfdRpeGsFHkWsA==", + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.8.0" - }, - "engines": { - "node": "^14.21.3 || >=16" + "punycode": "^2.3.1" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/lupomontero" } }, - "node_modules/ox/node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=6" } }, - "node_modules/p-each-series": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", - "integrity": "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==", - "dev": true, + "node_modules/qs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", + "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", + "license": "BSD-3-Clause", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.6" } }, - "node_modules/p-event": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-6.0.1.tgz", - "integrity": "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==", + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "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" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "p-timeout": "^6.1.2" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.17" + "node": ">=0.10.0" + } + }, + "node_modules/rdf-canonize": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "license": "BSD-3-Clause", + "dependencies": { + "setimmediate": "^1.0.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=12" } }, - "node_modules/p-filter": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-4.1.0.tgz", - "integrity": "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==", + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/read-package-up": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", + "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", "dev": true, + "license": "MIT", "dependencies": { - "p-map": "^7.0.1" + "find-up-simple": "^1.0.1", + "read-pkg": "^10.0.0", + "type-fest": "^5.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/read-package-up/node_modules/type-fest": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", + "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "dependencies": { - "yocto-queue": "^0.1.0" + "tagged-tag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/read-pkg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz", + "integrity": "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "@types/normalize-package-data": "^2.4.4", + "normalize-package-data": "^8.0.0", + "parse-json": "^8.3.0", + "type-fest": "^5.4.4", + "unicorn-magic": "^0.4.0" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "node_modules/read-pkg/node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, "engines": { "node": ">=18" }, @@ -14280,486 +14310,401 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-timeout": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", - "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=14.16" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", + "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "tagged-tag": "^1.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "dev": true, - "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "optional": true, "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT" - }, - "node_modules/permissionless": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/permissionless/-/permissionless-0.3.7.tgz", - "integrity": "sha512-r1UGWkVMqFzzJ0UcKEVHh6XvOm7+SfTvy7AoGA7ZlxpE96XR+zbtb+rRAA3DOQuq6/ifov5NvUyt1xf4zxbR0g==", "license": "MIT", - "peerDependencies": { - "ox": "^0.11.3", - "viem": "^2.44.4" - }, - "peerDependenciesMeta": { - "ox": { - "optional": true - } - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, "engines": { - "node": ">=12" + "node": ">= 14.18.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "engines": { - "node": ">=4" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", + "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==", + "license": "MIT", "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" + "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": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "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==", + "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "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": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/registry-auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", + "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@pnpm/npm-conf": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=14" } }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "license": "Apache-2.0", "dependencies": { - "p-try": "^1.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=4" + "node": ">= 0.12" } }, - "node_modules/pkg-conf/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==", - "engines": { - "node": ">=4" + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" } }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "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==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=4" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "optional": true, "dependencies": { - "lilconfig": "^3.1.1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "node": ">=8" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC", + "optional": true + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" + "node_modules/rfc4648": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", + "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "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, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" }, - "engines": { - "node": ">=14" + "bin": { + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", + "fsevents": "~2.3.2" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "cpu": [ + "x64" + ], "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/run-async": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", + "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.12.0" } }, - "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "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": { - "parse-ms": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "queue-microtask": "^1.2.2" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "node_modules/runtypes": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/runtypes/-/runtypes-6.7.0.tgz", + "integrity": "sha512-3TLdfFX8YHNFOhwHrSJza6uxVBmBrEjnNQlNXvXCdItS0Pdskfg5vVXUTWIN+Y23QR09jWpSl99UHkA83m4uWA==", "license": "MIT" }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "license": "MIT", + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.5.tgz", - "integrity": "sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" + "tslib": "^2.1.0" } }, - "node_modules/querystring": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, "engines": { - "node": ">=0.4.x" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -14773,110 +14718,121 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, + "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==", + "license": "MIT", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rdf-canonize": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", - "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", - "license": "BSD-3-Clause", + "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==", + "license": "MIT", "dependencies": { - "setimmediate": "^1.0.5" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, - "node_modules/read-package-up": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz", - "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==", + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" + }, + "node_modules/security-context": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/security-context/-/security-context-4.0.0.tgz", + "integrity": "sha512-yiDCS7tpKQl6p4NG57BdKLTSNLFfj5HosBIzXBl4jZf/qorJzSzbEUIdLhN+vVYgyLlvjixY8DPPTgqI8zvNCA==" + }, + "node_modules/semantic-release": { + "version": "25.0.8", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.8.tgz", + "integrity": "sha512-w/iZ0bur36rKffXZYmIUmy068eoBY3Ij1DCCddx2JwWEM5Tg+eU9ld/E9qSInVvPASyyR2Ln/XGfQ9OZrMlhtw==", "dev": true, + "license": "MIT", "dependencies": { - "find-up-simple": "^1.0.1", - "read-pkg": "^10.0.0", - "type-fest": "^5.2.0" - }, - "engines": { - "node": ">=20" + "@semantic-release/commit-analyzer": "^13.0.1", + "@semantic-release/error": "^4.0.0", + "@semantic-release/github": "^12.0.0", + "@semantic-release/npm": "^13.1.1", + "@semantic-release/release-notes-generator": "^14.1.0", + "aggregate-error": "^5.0.0", + "cosmiconfig": "^9.0.0", + "debug": "^4.0.0", + "env-ci": "^11.0.0", + "execa": "^9.0.0", + "figures": "^6.0.0", + "find-versions": "^6.0.0", + "get-stream": "^6.0.0", + "git-log-parser": "^1.2.0", + "hook-std": "^4.0.0", + "hosted-git-info": "^9.0.0", + "import-from-esm": "^2.0.0", + "lodash-es": "^4.17.21", + "marked": "^15.0.0", + "marked-terminal": "^7.3.0", + "micromatch": "^4.0.2", + "p-each-series": "^3.0.0", + "p-reduce": "^3.0.0", + "read-package-up": "^12.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.3.2", + "signale": "^1.2.1", + "yargs": "^18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-package-up/node_modules/type-fest": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", - "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", - "dev": true, - "dependencies": { - "tagged-tag": "^1.0.0" + "bin": { + "semantic-release": "bin/semantic-release.js" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^22.14.0 || >= 24.10.0" } }, - "node_modules/read-pkg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz", - "integrity": "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==", + "node_modules/semantic-release/node_modules/@semantic-release/error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", + "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.4", - "normalize-package-data": "^8.0.0", - "parse-json": "^8.3.0", - "type-fest": "^5.4.4", - "unicorn-magic": "^0.4.0" - }, + "license": "MIT", "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", - "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "node_modules/semantic-release/node_modules/aggregate-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", + "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" + "clean-stack": "^5.2.0", + "indent-string": "^5.0.0" }, "engines": { "node": ">=18" @@ -14885,1013 +14841,930 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "node_modules/semantic-release/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": ">=16" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", - "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", + "node_modules/semantic-release/node_modules/clean-stack": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", + "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", "dev": true, + "license": "MIT", "dependencies": { - "tagged-tag": "^1.0.0" + "escape-string-regexp": "5.0.0" }, "engines": { - "node": ">=20" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "optional": true, + "node_modules/semantic-release/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">= 6" + "node": ">=20" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/semantic-release/node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", "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" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/semantic-release/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/semantic-release/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "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" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/registry-auth-token": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.1.tgz", - "integrity": "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==", + "node_modules/semantic-release/node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^3.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" }, "engines": { - "node": ">= 0.12" + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/semantic-release/node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.10.0" + "node": ">=18.18.0" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/semantic-release/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/semantic-release/node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/semantic-release/node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/semantic-release/node_modules/p-reduce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", + "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/semantic-release/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC", - "optional": true - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/semantic-release/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/rfc4648": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", - "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==", - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "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, + "node_modules/semantic-release/node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "node_modules/semantic-release/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": ">=12" }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", - "cpu": [ - "x64" - ], + "node_modules/semantic-release/node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/run-async": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-4.0.6.tgz", - "integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==", + "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/semantic-release/node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/runtypes": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/runtypes/-/runtypes-6.7.0.tgz", - "integrity": "sha512-3TLdfFX8YHNFOhwHrSJza6uxVBmBrEjnNQlNXvXCdItS0Pdskfg5vVXUTWIN+Y23QR09jWpSl99UHkA83m4uWA==", - "license": "MIT" - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, "engines": { - "node": ">=0.4" + "node": ">=18" }, "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", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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" + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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==", + "node_modules/semantic-release/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "node_modules/semantic-release/node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "license": "MIT" - }, - "node_modules/security-context": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/security-context/-/security-context-4.0.0.tgz", - "integrity": "sha512-yiDCS7tpKQl6p4NG57BdKLTSNLFfj5HosBIzXBl4jZf/qorJzSzbEUIdLhN+vVYgyLlvjixY8DPPTgqI8zvNCA==" - }, - "node_modules/semantic-release": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-25.0.3.tgz", - "integrity": "sha512-WRgl5GcypwramYX4HV+eQGzUbD7UUbljVmS+5G1uMwX/wLgYuJAxGeerXJDMO2xshng4+FXqCgyB5QfClV6WjA==", + "node_modules/semantic-release/node_modules/yargs": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz", + "integrity": "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==", "dev": true, + "license": "MIT", "dependencies": { - "@semantic-release/commit-analyzer": "^13.0.1", - "@semantic-release/error": "^4.0.0", - "@semantic-release/github": "^12.0.0", - "@semantic-release/npm": "^13.1.1", - "@semantic-release/release-notes-generator": "^14.1.0", - "aggregate-error": "^5.0.0", - "cosmiconfig": "^9.0.0", - "debug": "^4.0.0", - "env-ci": "^11.0.0", - "execa": "^9.0.0", - "figures": "^6.0.0", - "find-versions": "^6.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^4.0.0", - "hosted-git-info": "^9.0.0", - "import-from-esm": "^2.0.0", - "lodash-es": "^4.17.21", - "marked": "^15.0.0", - "marked-terminal": "^7.3.0", - "micromatch": "^4.0.2", - "p-each-series": "^3.0.0", - "p-reduce": "^3.0.0", - "read-package-up": "^12.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "signale": "^1.2.1", - "yargs": "^18.0.0" + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/semantic-release/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "devOptional": true, + "license": "ISC", "bin": { - "semantic-release": "bin/semantic-release.js" + "semver": "bin/semver.js" }, "engines": { - "node": "^22.14.0 || >= 24.10.0" + "node": ">=10" } }, - "node_modules/semantic-release/node_modules/@semantic-release/error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz", - "integrity": "sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==", + "node_modules/semver-regex": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", + "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/node_modules/aggregate-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-5.0.0.tgz", - "integrity": "sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==", - "dev": true, + "node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "license": "MIT", "dependencies": { - "clean-stack": "^5.2.0", - "indent-string": "^5.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/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, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semantic-release/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, + "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/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==", + "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": ">=12" + "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==", + "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" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">= 0.4" } }, - "node_modules/semantic-release/node_modules/clean-stack": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-5.3.0.tgz", - "integrity": "sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==", - "dev": true, + "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==", + "license": "MIT", "dependencies": { - "escape-string-regexp": "5.0.0" + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=14.16" + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/semantic-release/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": ">=20" - } - }, - "node_modules/semantic-release/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "dev": true - }, - "node_modules/semantic-release/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", - "dev": true, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" }, "engines": { - "node": "^18.19.0 || >=20.5.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/execa/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { - "is-unicode-supported": "^2.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semantic-release/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, + "license": "ISC" + }, + "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==", + "license": "ISC", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/semantic-release/node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "dev": true, + "node_modules/signale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", + "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", + "license": "MIT", + "dependencies": { + "chalk": "^2.3.2", + "figures": "^2.0.0", + "pkg-conf": "^2.1.0" + }, "engines": { - "node": ">=18.18.0" + "node": ">=6" } }, - "node_modules/semantic-release/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, + "node_modules/signale/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": ">=12" + "node": ">=4" + } + }, + "node_modules/signale/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/semantic-release/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, + "node_modules/signale/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/signale/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/signale/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/semantic-release/node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, + "node_modules/signale/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "license": "MIT", "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/semantic-release/node_modules/p-reduce": { + "node_modules/signale/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-3.0.0.tgz", - "integrity": "sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==", - "dev": true, + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/semantic-release/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/signale/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/semantic-release/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/semantic-release/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/semantic-release/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, + "node_modules/sodium-native": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-3.4.1.tgz", + "integrity": "sha512-PaNN/roiFWzVVTL6OqjzYct38NSXewdl2wz8SRB51Br/MLIJPrbM3XexhVWkq7D3UWMysfrhKVf1v1phZq6MeQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node-gyp-build": "^4.3.0" } }, - "node_modules/semantic-release/node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", - "dev": true, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "devOptional": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/semantic-release/node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/semantic-release/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", "dev": true, + "license": "MIT" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "devOptional": true, + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/semantic-release/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "dev": true, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "devOptional": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "devOptional": true, + "license": "MIT", "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/semantic-release/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "devOptional": true, + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", + "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", "dev": true, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "license": "ISC", + "dependencies": { + "through2": "~2.0.0" } }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "devOptional": true, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, "bin": { - "semver": "bin/semver.js" + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "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==", "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, - "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/stream-combiner2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/stream-combiner2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "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==", + "node_modules/stream-combiner2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-combiner2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "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" + "safe-buffer": "~5.1.0" } }, - "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==", + "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", + "optional": true, "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "safe-buffer": "~5.2.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, - "node_modules/shebang-command": { + "node_modules/string-format": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "license": "WTFPL OR MIT", + "peer": true + }, + "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==", + "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -15900,14 +15773,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -15916,16 +15791,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "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==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15934,300 +15808,347 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "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==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "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==", + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, + "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==", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/signale/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/signale/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/signale/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/signale/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/signale/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" }, - "node_modules/signale/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, "engines": { - "node": ">=4" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/signale/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/super-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", + "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "function-timeout": "^1.0.1", + "make-asynchronous": "^1.0.1", + "time-span": "^5.1.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", - "dev": true, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.18" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, - "node_modules/sodium-native": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/sodium-native/-/sodium-native-3.4.1.tgz", - "integrity": "sha512-PaNN/roiFWzVVTL6OqjzYct38NSXewdl2wz8SRB51Br/MLIJPrbM3XexhVWkq7D3UWMysfrhKVf1v1phZq6MeQ==", - "hasInstallScript": true, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "license": "MIT", - "optional": true, "dependencies": { - "node-gyp-build": "^4.3.0" + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, - "license": "BSD-3-Clause", + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/spawn-error-forwarder": { + "node_modules/tagged-tag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true + "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "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", "devOptional": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "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" + }, + "engines": { + "node": ">=10" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "devOptional": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "devOptional": true, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "engines": { + "node": ">=14.16" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.23", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", - "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", - "devOptional": true, - "license": "CC0-1.0" - }, - "node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", + "node_modules/tempy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.2.0.tgz", + "integrity": "sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==", "dev": true, + "license": "MIT", "dependencies": { - "through2": "~2.0.0" + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=0.10.0" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "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/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } }, - "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==", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": ">= 0.4" + "node": ">=0.8" } }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT", + "optional": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "license": "MIT", "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/stream-combiner2/node_modules/isarray": { + "node_modules/through2/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/stream-combiner2/node_modules/readable-stream": { + "node_modules/through2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -16238,719 +16159,833 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/stream-combiner2/node_modules/safe-buffer": { + "node_modules/through2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/stream-combiner2/node_modules/string_decoder": { + "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "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", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "license": "WTFPL OR MIT", - "peer": true - }, - "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==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.1.0" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" + "convert-hrtime": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", - "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">= 0.4" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "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==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dependencies": { - "ansi-regex": "^5.0.1" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": ">=8" - } - }, - "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==", - "engines": { - "node": ">=4" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.0.0" } }, - "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", "dependencies": { - "js-tokens": "^9.0.1" + "os-tmpdir": "~1.0.2" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": ">=0.6.0" } }, - "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "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": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" + "is-number": "^7.0.0" }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "license": "MIT", + "optional": true + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.8" } }, - "node_modules/super-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.1.0.tgz", - "integrity": "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==", + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", "dev": true, - "dependencies": { - "function-timeout": "^1.0.1", - "make-asynchronous": "^1.0.1", - "time-span": "^5.1.0" - }, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" } }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=14.18" + "node": ">=18.12" }, - "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, + "node_modules/ts-chacha20": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-chacha20/-/ts-chacha20-1.2.0.tgz", + "integrity": "sha512-PTyPoWYHc2we8P2NTn5hpYG211popWbkjiw+k63xqjeMrx9pPtXSclz9F3fu0Tpr+vfR1xxcQFwsEkh1cXMLqw==", + "license": "MIT" + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "license": "ISC", + "peer": true, "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" }, - "engines": { - "node": ">=10.0.0" + "bin": { + "write-markdown": "dist/write-markdown.js" } }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ts-typed-json": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ts-typed-json/-/ts-typed-json-0.3.2.tgz", + "integrity": "sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA==", + "license": "MIT", + "optional": true + }, + "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==", + "license": "0BSD" + }, + "node_modules/tsup": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", + "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "dev": true, "license": "MIT", "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.27.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "^0.7.6", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" }, "engines": { - "node": ">=8.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "license": "MIT", + "node_modules/tsup/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">= 12" } }, - "node_modules/tagged-tag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", - "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "node_modules/tsx": { + "version": "4.23.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.5.tgz", + "integrity": "sha512-rw55FUaqOoI7RvlQwLbhO4nSDApnQ4/CykPuiQ/EPvtrX3WA9Ig55jIt9VvbBJbzJuj12ueRu4PMZ2SxPVbihg==", "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, "engines": { - "node": ">=20" + "node": ">=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "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/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", "optional": true, - "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" - }, + "os": [ + "aix" + ], "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=14.16" + "node": ">=18" } }, - "node_modules/tempy": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.2.0.tgz", - "integrity": "sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==", + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^3.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "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 - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "any-promise": "^1.0.0" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.8" + "node": ">=18" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "optional": true + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/time-span": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", - "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "convert-hrtime": "^5.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=18" } }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.6.0" + "node": ">=18" } }, - "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/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.8" + "node": ">=18" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "tree-kill": "cli.js" + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/ts-api-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", - "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" + "node": ">=18" } }, - "node_modules/ts-chacha20": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ts-chacha20/-/ts-chacha20-1.2.0.tgz", - "integrity": "sha512-PTyPoWYHc2we8P2NTn5hpYG211popWbkjiw+k63xqjeMrx9pPtXSclz9F3fu0Tpr+vfR1xxcQFwsEkh1cXMLqw==", - "license": "MIT" - }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "license": "ISC", - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "peerDependencies": { - "typescript": ">=3.7.0" + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/ts-typed-json": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ts-typed-json/-/ts-typed-json-0.3.2.tgz", - "integrity": "sha512-Tdu3BWzaer7R5RvBIJcg9r8HrTZgpJmsX+1meXMJzYypbkj8NK2oJN0yvm4Dp/Iv6tzFa/L5jKRmEVTga6K3nA==", + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "optional": true - }, - "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==" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } }, - "node_modules/tsup": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", - "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "bundle-require": "^5.1.0", - "cac": "^6.7.14", - "chokidar": "^4.0.3", - "consola": "^3.4.0", - "debug": "^4.4.0", - "esbuild": "^0.27.0", - "fix-dts-default-cjs-exports": "^1.0.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.34.8", - "source-map": "^0.7.6", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.11", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } } }, - "node_modules/tsup/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/tsup/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 12" + "node": ">=18" } }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "node_modules/tsx/node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, + "hasInstallScript": true, + "license": "MIT", "bin": { - "tsx": "dist/cli.mjs" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18.0.0" + "node": ">=18" }, "optionalDependencies": { - "fsevents": "~2.3.3" + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, "node_modules/tunnel": { @@ -16958,6 +16993,7 @@ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } @@ -16985,6 +17021,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -16997,6 +17034,7 @@ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17005,6 +17043,7 @@ "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -17037,10 +17076,17 @@ "typescript": ">=4.3.0" } }, + "node_modules/typechain/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==", + "license": "MIT", + "peer": true + }, "node_modules/typechain/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==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "license": "MIT", "peer": true, "dependencies": { @@ -17048,6 +17094,21 @@ "concat-map": "0.0.1" } }, + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -17070,6 +17131,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/typechain/node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT", + "peer": true + }, + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/typechain/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -17099,6 +17177,16 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -17177,6 +17265,7 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17195,10 +17284,11 @@ } }, "node_modules/ufo": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.2.tgz", - "integrity": "sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==", - "dev": true + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "dev": true, + "license": "MIT" }, "node_modules/uglify-js": { "version": "3.19.3", @@ -17232,24 +17322,29 @@ } }, "node_modules/undici": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", - "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, "engines": { - "node": ">=18.17" + "node": ">=14.0" } }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" }, "node_modules/unicode-emoji-modifier-base": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -17259,6 +17354,7 @@ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", "dev": true, + "license": "MIT", "engines": { "node": ">=20" }, @@ -17271,6 +17367,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, + "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -17285,22 +17382,24 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -17310,6 +17409,7 @@ "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -17350,8 +17450,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "devOptional": true, "license": "ISC", - "optional": true, "dependencies": { "builtins": "^1.0.3" } @@ -17462,6 +17562,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -17521,6 +17622,7 @@ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz", "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.4", @@ -17542,7 +17644,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", @@ -17552,6 +17655,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -17568,6 +17672,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -17584,6 +17689,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -17600,6 +17706,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -17616,6 +17723,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -17632,6 +17740,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -17648,6 +17757,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -17664,6 +17774,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -17680,6 +17791,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17696,6 +17808,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17712,6 +17825,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17728,6 +17842,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17744,6 +17859,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17760,6 +17876,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17776,6 +17893,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17792,6 +17910,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17808,6 +17927,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -17824,6 +17944,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -17840,6 +17961,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -17856,6 +17978,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -17872,6 +17995,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -17888,6 +18012,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -17904,6 +18029,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -17918,6 +18044,7 @@ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -17955,6 +18082,7 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz", "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/expect": "1.6.1", "@vitest/runner": "1.6.1", @@ -18015,11 +18143,143 @@ } } }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/vitest/node_modules/pathe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/vitest/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/web-did-resolver": { "version": "2.0.4", @@ -18064,6 +18324,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -18072,7 +18333,8 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/webidl-conversions": { "version": "3.0.1", @@ -18095,6 +18357,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -18195,6 +18458,7 @@ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -18221,6 +18485,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -18258,6 +18523,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -18270,12 +18536,13 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -18298,6 +18565,7 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" } @@ -18306,6 +18574,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -18317,9 +18586,10 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -18337,6 +18607,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -18346,6 +18617,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -18354,10 +18626,11 @@ } }, "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -18369,6 +18642,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", "engines": { "node": ">=18" }, diff --git a/src/commands/obligation-escrow/status.ts b/src/commands/obligation-escrow/status.ts index b3d0b9a..3366c9b 100644 --- a/src/commands/obligation-escrow/status.ts +++ b/src/commands/obligation-escrow/status.ts @@ -13,6 +13,7 @@ import { getSupportedNetwork, promptAndReadDocument, verifyDocumentSignature, + toSdkSigner, } from '../../utils'; import { runObligationEscrowCommand } from './shared'; @@ -59,9 +60,13 @@ export const statusHandler = async (args: ObligationEscrowStatusCommand) => { const readOnlySigner = { provider } as unknown as Signer; const opts = { obligationRegistryAddress, tokenId }; - const status = await getObligationRegistryStatus(opts, readOnlySigner, { tokenId }); - const registered = await isObligationRegistryRegistered(opts, readOnlySigner, { tokenId }); - const reason = await getObligationEscrowTerminationReason(opts, readOnlySigner, { tokenId }); + const status = await getObligationRegistryStatus(opts, toSdkSigner(readOnlySigner), { tokenId }); + const registered = await isObligationRegistryRegistered(opts, toSdkSigner(readOnlySigner), { + tokenId, + }); + const reason = await getObligationEscrowTerminationReason(opts, toSdkSigner(readOnlySigner), { + tokenId, + }); success(`Obligation ${tokenId} on ${obligationRegistryAddress}`); info(` Status: ${STATUS_LABEL[status] ?? status} (${status})`); diff --git a/src/commands/obligation-registry/deploy.ts b/src/commands/obligation-registry/deploy.ts index 878859a..8954467 100644 --- a/src/commands/obligation-registry/deploy.ts +++ b/src/commands/obligation-registry/deploy.ts @@ -14,6 +14,7 @@ import { performDryRunWithConfirmation, promptAddress, supportedNetwork, + toSdkSigner, } from '../../utils'; import { TransactionReceipt } from 'ethers'; @@ -142,10 +143,15 @@ export const deployObligationRegistryContract = async ({ info(`Deploying obligation registry ${registryName}`); - const result = await deployObligationRegistry(registryName, registrySymbol, wallet, { - chainId: getSupportedNetwork(network).networkId as unknown as CHAIN_ID, - escrowFactoryAddress, - }); + const result = await deployObligationRegistry( + registryName, + registrySymbol, + toSdkSigner(wallet), + { + chainId: getSupportedNetwork(network).networkId as unknown as CHAIN_ID, + escrowFactoryAddress, + }, + ); displayTransactionPrice(result.receipt as any, network as NetworkCmdName); diff --git a/src/commands/obligation-registry/mint.ts b/src/commands/obligation-registry/mint.ts index 9997df1..0432550 100644 --- a/src/commands/obligation-registry/mint.ts +++ b/src/commands/obligation-registry/mint.ts @@ -16,6 +16,7 @@ import { promptAddress, performDryRunWithConfirmation, verifyDocumentSignature, + toSdkSigner, } from '../../utils'; import { connectToObligationRegistry, validateAndEncryptRemark } from '../helpers'; import { TransactionReceipt } from 'ethers'; @@ -135,7 +136,7 @@ const mintToObligationRegistry = async ({ const gasFees = await getGasFees({ provider: wallet.provider, ...rest }); transaction = await mintObligationRegistry( { obligationRegistryAddress: address }, - wallet, + toSdkSigner(wallet), { beneficiaryAddress: beneficiary, holderAddress: holder, tokenId, remarks: remark }, { id: encryptionKey, @@ -146,7 +147,7 @@ const mintToObligationRegistry = async ({ } else { transaction = await mintObligationRegistry( { obligationRegistryAddress: address }, - wallet, + toSdkSigner(wallet), { beneficiaryAddress: beneficiary, holderAddress: holder, tokenId, remarks: remark }, { id: encryptionKey }, ); diff --git a/src/utils/cli-options.ts b/src/utils/cli-options.ts index 456bfba..bd662bf 100644 --- a/src/utils/cli-options.ts +++ b/src/utils/cli-options.ts @@ -61,9 +61,7 @@ export const isRpcUrlOption = (option: any): option is RpcUrlOption => { }; export type WalletOrSignerOption = - | Partial - | Partial - | Partial; + Partial | Partial | Partial; export interface GasPriceScale { maxPriorityFeePerGasScale: number; diff --git a/src/utils/wallet.ts b/src/utils/wallet.ts index a7f0c60..223bd40 100644 --- a/src/utils/wallet.ts +++ b/src/utils/wallet.ts @@ -27,6 +27,20 @@ export type ConnectedSigner = Signer & { readonly privateKey?: never; }; +/** Wallet/signer shapes produced by this CLI (`ethers@6`). */ +export type CliSigner = Signer | Wallet | ConnectedSigner | HDNodeWallet; + +/** + * TrustVC types Signer as `ethers` (v5) | `ethersV6` (aliased v6). + * The CLI's direct `ethers@6` install is a different package path than `ethersV6`, + * so TypeScript rejects assignability (private fields on Network/Provider) even + * though the runtime objects are fine. Cast at SDK boundaries only. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type SdkSigner = any; + +export const toSdkSigner = (signer: CliSigner | Signer): SdkSigner => signer; + export const getPrivateKey = ({ keyFile, key }: PrivateKeyOption): string | undefined => { if (key) { signale.warn( @@ -45,9 +59,10 @@ export const getWalletOrSigner = async ({ ...options }: WalletOrSignerOption & Partial & - Partial & { progress?: (progress: number) => void; password?: string }): Promise< - Signer | Wallet | ConnectedSigner | HDNodeWallet -> => { + Partial & { + progress?: (progress: number) => void; + password?: string; + }): Promise => { // Use custom RPC URL if provided, otherwise use the default network provider const provider = isRpcUrlOption(options) ? new JsonRpcProvider(options.rpcUrl) @@ -81,7 +96,6 @@ export const getWalletOrSigner = async ({ // keyId: options.kmsKeyId, // sessionToken: options.sessionToken, // }; - // const signer = new AwsKmsSigner(kmsCredentials).connect(provider); // if (signer.provider) return signer as ConnectedSigner; // throw new Error('Unable to attach the provider to the kms signer'); diff --git a/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts b/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts index 7591644..b8c1847 100644 --- a/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts +++ b/tests/commands/obligation-escrow/accept-return-to-issuer.test.ts @@ -90,7 +90,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/accept-return-to-issuer', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/accept.test.ts b/tests/commands/obligation-escrow/accept.test.ts index 231bf3a..dcdb670 100644 --- a/tests/commands/obligation-escrow/accept.test.ts +++ b/tests/commands/obligation-escrow/accept.test.ts @@ -64,7 +64,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/accept', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/discharge.test.ts b/tests/commands/obligation-escrow/discharge.test.ts index 3392117..11fbbff 100644 --- a/tests/commands/obligation-escrow/discharge.test.ts +++ b/tests/commands/obligation-escrow/discharge.test.ts @@ -67,7 +67,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/discharge', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); @@ -84,7 +86,9 @@ describe('obligation-escrow/discharge', () => { maxPriorityFeePerGasScale: 1, }); expect(runObligationEscrowTx as MockedFunction).toHaveBeenCalled(); - const callArgs = (runObligationEscrowTx as MockedFunction).mock.calls[0][0]; + const callArgs = (runObligationEscrowTx as MockedFunction).mock.calls[0][0] as { + sdkParams: Record; + }; expect(callArgs).toEqual( expect.objectContaining({ sdkParams: expect.any(Object), diff --git a/tests/commands/obligation-escrow/endorse-transfer-owner.test.ts b/tests/commands/obligation-escrow/endorse-transfer-owner.test.ts index deb6ba8..37a66e3 100644 --- a/tests/commands/obligation-escrow/endorse-transfer-owner.test.ts +++ b/tests/commands/obligation-escrow/endorse-transfer-owner.test.ts @@ -67,7 +67,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/endorse-transfer-owner', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs includes newBeneficiary', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/nominate-transfer-owner.test.ts b/tests/commands/obligation-escrow/nominate-transfer-owner.test.ts index a3da87a..227e068 100644 --- a/tests/commands/obligation-escrow/nominate-transfer-owner.test.ts +++ b/tests/commands/obligation-escrow/nominate-transfer-owner.test.ts @@ -67,7 +67,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/nominate-transfer-owner', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs includes newBeneficiary', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/reject-return-to-issuer.test.ts b/tests/commands/obligation-escrow/reject-return-to-issuer.test.ts index 83c6c2c..2f87519 100644 --- a/tests/commands/obligation-escrow/reject-return-to-issuer.test.ts +++ b/tests/commands/obligation-escrow/reject-return-to-issuer.test.ts @@ -90,7 +90,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/reject-return-to-issuer', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/reject-transfer-holder.test.ts b/tests/commands/obligation-escrow/reject-transfer-holder.test.ts index e596fe2..107b7d4 100644 --- a/tests/commands/obligation-escrow/reject-transfer-holder.test.ts +++ b/tests/commands/obligation-escrow/reject-transfer-holder.test.ts @@ -67,7 +67,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/reject-transfer-holder', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/reject-transfer-owner-holder.test.ts b/tests/commands/obligation-escrow/reject-transfer-owner-holder.test.ts index d01c1e2..d0e4fa8 100644 --- a/tests/commands/obligation-escrow/reject-transfer-owner-holder.test.ts +++ b/tests/commands/obligation-escrow/reject-transfer-owner-holder.test.ts @@ -67,7 +67,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/reject-transfer-owner-holder', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/reject-transfer-owner.test.ts b/tests/commands/obligation-escrow/reject-transfer-owner.test.ts index 9ef97d3..4e287d9 100644 --- a/tests/commands/obligation-escrow/reject-transfer-owner.test.ts +++ b/tests/commands/obligation-escrow/reject-transfer-owner.test.ts @@ -67,7 +67,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/reject-transfer-owner', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/reject.test.ts b/tests/commands/obligation-escrow/reject.test.ts index 90d0c07..92cf86b 100644 --- a/tests/commands/obligation-escrow/reject.test.ts +++ b/tests/commands/obligation-escrow/reject.test.ts @@ -64,7 +64,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/reject', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs uses shared obligation prompts', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/return-to-issuer.test.ts b/tests/commands/obligation-escrow/return-to-issuer.test.ts index bd13c7b..f3dbacf 100644 --- a/tests/commands/obligation-escrow/return-to-issuer.test.ts +++ b/tests/commands/obligation-escrow/return-to-issuer.test.ts @@ -52,7 +52,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/return-to-issuer', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('returnToIssuerHandler invokes runObligationEscrowTx', async () => { const { runObligationEscrowTx } = await import('../../../src/commands/obligation-escrow/runTx'); diff --git a/tests/commands/obligation-escrow/status.test.ts b/tests/commands/obligation-escrow/status.test.ts index a98da11..6b570d0 100644 --- a/tests/commands/obligation-escrow/status.test.ts +++ b/tests/commands/obligation-escrow/status.test.ts @@ -52,7 +52,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/status', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('reads status via network provider without a wallet', async () => { const trustvc = await import('@trustvc/trustvc'); diff --git a/tests/commands/obligation-escrow/transfer-holder.test.ts b/tests/commands/obligation-escrow/transfer-holder.test.ts index 4a5c7f6..49629c0 100644 --- a/tests/commands/obligation-escrow/transfer-holder.test.ts +++ b/tests/commands/obligation-escrow/transfer-holder.test.ts @@ -67,7 +67,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/transfer-holder', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs includes newHolder', async () => { const result = await promptForInputs(); diff --git a/tests/commands/obligation-escrow/transfer-owner-holder.test.ts b/tests/commands/obligation-escrow/transfer-owner-holder.test.ts index 05f89fb..656b0c0 100644 --- a/tests/commands/obligation-escrow/transfer-owner-holder.test.ts +++ b/tests/commands/obligation-escrow/transfer-owner-holder.test.ts @@ -70,7 +70,9 @@ vi.mock('../../../src/utils', async (importOriginal) => { }); describe('obligation-escrow/transfer-owner-holder', () => { - beforeEach(() => vi.clearAllMocks()); + beforeEach(() => { + vi.clearAllMocks(); + }); it('promptForInputs includes newOwner and newHolder', async () => { const result = await promptForInputs(); From cd1c7ab894060beee22d440bb6306f6fa75958d4 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 4 Aug 2026 11:58:19 +0530 Subject: [PATCH 32/40] Update tests/commands/obligation-escrow/reject-transfer-owner.test.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- tests/commands/obligation-escrow/reject-transfer-owner.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/commands/obligation-escrow/reject-transfer-owner.test.ts b/tests/commands/obligation-escrow/reject-transfer-owner.test.ts index 4e287d9..d1d415a 100644 --- a/tests/commands/obligation-escrow/reject-transfer-owner.test.ts +++ b/tests/commands/obligation-escrow/reject-transfer-owner.test.ts @@ -50,6 +50,7 @@ vi.mock('../../../src/commands/obligation-escrow/shared', () => ({ key: '0xabc', maxPriorityFeePerGasScale: 1, }), + runObligationEscrowCommand: vi.fn(), })); vi.mock('../../../src/commands/obligation-escrow/runTx', () => ({ From 184859826e620b62fe73213b4245e19f238fcdd3 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 4 Aug 2026 12:05:56 +0530 Subject: [PATCH 33/40] Update README.md and enhance error handling in obligation escrow commands - Added instructions for using BoE commands with the `@beta` dist-tag in the README. - Updated obligation escrow command handlers to ensure consistent exit codes on errors. - Improved error handling in `accept-return-to-issuer`, `endorse-transfer-owner`, `nominate-transfer-owner`, `reject-transfer-holder`, and `transfer-holder` commands. - Enhanced tests for the verify command to handle unsupported chain IDs and ensure proper provider usage. --- README.md | 148 +++++++++--------- .../accept-return-to-issuer.ts | 1 + .../endorse-transfer-owner.ts | 1 + .../nominate-transfer-owner.ts | 1 + .../reject-transfer-holder.ts | 1 + src/commands/obligation-escrow/shared.ts | 1 + .../obligation-escrow/transfer-holder.ts | 1 + src/commands/verify.ts | 24 +-- .../verify.obligation.sepolia.test.ts | 25 +-- tests/commands/verify.test.ts | 26 ++- 10 files changed, 133 insertions(+), 96 deletions(-) diff --git a/README.md b/README.md index 23755b8..e2acdd8 100644 --- a/README.md +++ b/README.md @@ -289,66 +289,66 @@ trustvc verify ### Available Commands -| Category | Command | Description | -| -------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------- | -| **W3C Credentials** | `[key-pair-generation](#key-pair-generation)` | Generate cryptographic key pairs (ECDSA-SD-2023, BBS-2023) | -| | `[did-web](#did-web)` | Create did:web identifiers from key pairs | -| | `[w3c-sign](#w3c-sign)` | Sign W3C verifiable credentials | -| | `[verify](#verify)` | Verify W3C verifiable credentials | -| | `[credential-status-create](#credential-status-create)` | Create credential status lists | -| | `[credential-status-update](#credential-status-update)` | Update credential status (revoke/suspend) | -| **OpenAttestation** | `[oa-sign](#oa-sign)` | Sign OpenAttestation v2/v3 documents | -| | `[verify](#verify)` | Verify OpenAttestation documents | -| | `[oa-wrap](#oa-wrap)` | Wrap OpenAttestation documents | -| | `[oa-unwrap](#oa-unwrap)` | Unwrap OpenAttestation documents | -| | `[oa-encrypt](#oa-encrypt)` | Encrypt an OA document for safe sharing and storage | -| | `[oa-decrypt](#oa-decrypt)` | Decrypt an OA document encrypted with oa-encrypt | -| **Token Registry** | `[mint](#mint)` | Mint tokens to blockchain registries | -| | `[token-registry deploy](#token-registry-deploy)` | Deploy token registry contracts | -| | `token-registry mint` | Alternative: `mint` | -| **Document Store** | `[document-store deploy](#document-store-deploy)` | Deploy document store contracts | -| | `[document-store issue](#document-store-issue)` | Issue document hashes | -| | `[document-store revoke](#document-store-revoke)` | Revoke document hashes | -| | `[document-store grant-role](#document-store-grant-role)` | Grant roles to accounts | -| | `[document-store revoke-role](#document-store-revoke-role)` | Revoke roles from accounts | -| | `[document-store transfer-ownership](#document-store-transfer-ownership)` | Transfer document store ownership | -| **Transaction** | `[transaction cancel](#transaction-cancel)` | Cancel a pending transaction | -| **Wallet** | `[wallet create](#wallet-create)` | Create a new encrypted wallet file | -| | `[wallet encrypt](#wallet-encrypt)` | Encrypt a wallet using a private key | -| | `[wallet decrypt](#wallet-decrypt)` | Decrypt an encrypted wallet file | -| **Title Escrow** | `[transfer-holder](#title-escrow-transfer-holder)` | Transfer document holder | -| | `title-escrow transfer-holder` | Alternative: `transfer-holder` | -| | `[nominate-transfer-owner](#title-escrow-nominate-transfer-owner)` | Nominate new beneficiary | -| | `title-escrow nominate-transfer-owner` | Alternative: `nominate-transfer-owner` | -| | `[endorse-transfer-owner](#title-escrow-endorse-transfer-owner)` | Endorse beneficiary change | -| | `title-escrow endorse-transfer-owner` | Alternative: `endorse-transfer-owner` | -| | `[transfer-owner-holder](#title-escrow-transfer-owner-holder)` | Endorse full ownership transfer | -| | `title-escrow transfer-owner-holder` | Alternative: `transfer-owner-holder` | -| | `[return-to-issuer](#title-escrow-return-to-issuer)` | Return document to issuer | -| | `title-escrow return-to-issuer` | Alternative: `return-to-issuer` | -| | `[accept-return-to-issuer](#title-escrow-accept-return-to-issuer)` | Accept returned document | -| | `title-escrow accept-return-to-issuer` | Alternative: `accept-return-to-issuer` | -| | `[reject-return-to-issuer](#title-escrow-reject-return-to-issuer)` | Reject returned document | -| | `title-escrow reject-return-to-issuer` | Alternative: `reject-return-to-issuer` | -| | `[reject-transfer-holder](#title-escrow-reject-transfer-holder)` | Reject holder transfer | -| | `title-escrow reject-transfer-holder` | Alternative: `reject-transfer-holder` | -| | `[reject-transfer-owner](#title-escrow-reject-transfer-owner)` | Reject owner transfer | -| | `[reject-transfer-owner-holder](#title-escrow-reject-transfer-owner-holder)` | Reject full transfer | -| | `title-escrow reject-transfer-owner-holder` | Alternative: `reject-transfer-owner-holder` | -| **Obligation / BoE** | `[obligation-registry deploy](#obligation-registry-deploy)` | Deploy Obligation Registry | -| | `[obligation-registry mint](#obligation-registry-mint)` | Mint BoE token to obligationRegistry | -| | `[obligation-escrow accept](#obligation-escrow-accept)` | Accept obligation | -| | `[obligation-escrow reject](#obligation-escrow-reject)` | Reject obligation | -| | `[obligation-escrow discharge](#obligation-escrow-discharge)` | Discharge obligation | -| | `[obligation-escrow status](#obligation-escrow-status)` | Read obligation / escrow status | -| | `[obligation-escrow transfer-holder](#obligation-escrow-transfer-holder)` | Transfer BoE holder | -| | `[obligation-escrow nominate-transfer-owner](#obligation-escrow-transfer-holder)` | Nominate BoE beneficiary | -| | `[obligation-escrow endorse-transfer-owner](#obligation-escrow-transfer-holder)` | Endorse BoE beneficiary change | -| | `[obligation-escrow transfer-owner-holder](#obligation-escrow-transfer-holder)` | Endorse full BoE ownership transfer | -| | `[obligation-escrow return-to-issuer](#obligation-escrow-return-to-issuer)` | Return BoE to issuer | -| | `[obligation-escrow accept-return-to-issuer](#obligation-escrow-accept-return-to-issuer)` | Accept returned BoE | -| | `[obligation-escrow reject-return-to-issuer](#obligation-escrow-reject-return-to-issuer)` | Reject returned BoE | -| | `[obligation-escrow reject-transfer-*](#obligation-escrow-transfer-holder)` | Reject BoE transfer requests | +| Category | Command | Description | +| -------------------- | ----------------------------------------------------------------------------------------- | ---------------------------------------------------------- | +| **W3C Credentials** | `[key-pair-generation](#key-pair-generation)` | Generate cryptographic key pairs (ECDSA-SD-2023, BBS-2023) | +| | `[did-web](#did-web)` | Create did:web identifiers from key pairs | +| | `[w3c-sign](#w3c-sign)` | Sign W3C verifiable credentials | +| | `[verify](#verify)` | Verify W3C verifiable credentials | +| | `[credential-status-create](#credential-status-create)` | Create credential status lists | +| | `[credential-status-update](#credential-status-update)` | Update credential status (revoke/suspend) | +| **OpenAttestation** | `[oa-sign](#oa-sign)` | Sign OpenAttestation v2/v3 documents | +| | `[verify](#verify)` | Verify OpenAttestation documents | +| | `[oa-wrap](#oa-wrap)` | Wrap OpenAttestation documents | +| | `[oa-unwrap](#oa-unwrap)` | Unwrap OpenAttestation documents | +| | `[oa-encrypt](#oa-encrypt)` | Encrypt an OA document for safe sharing and storage | +| | `[oa-decrypt](#oa-decrypt)` | Decrypt an OA document encrypted with oa-encrypt | +| **Token Registry** | `[mint](#mint)` | Mint tokens to blockchain registries | +| | `[token-registry deploy](#token-registry-deploy)` | Deploy token registry contracts | +| | `token-registry mint` | Alternative: `mint` | +| **Document Store** | `[document-store deploy](#document-store-deploy)` | Deploy document store contracts | +| | `[document-store issue](#document-store-issue)` | Issue document hashes | +| | `[document-store revoke](#document-store-revoke)` | Revoke document hashes | +| | `[document-store grant-role](#document-store-grant-role)` | Grant roles to accounts | +| | `[document-store revoke-role](#document-store-revoke-role)` | Revoke roles from accounts | +| | `[document-store transfer-ownership](#document-store-transfer-ownership)` | Transfer document store ownership | +| **Transaction** | `[transaction cancel](#transaction-cancel)` | Cancel a pending transaction | +| **Wallet** | `[wallet create](#wallet-create)` | Create a new encrypted wallet file | +| | `[wallet encrypt](#wallet-encrypt)` | Encrypt a wallet using a private key | +| | `[wallet decrypt](#wallet-decrypt)` | Decrypt an encrypted wallet file | +| **Title Escrow** | `[transfer-holder](#title-escrow-transfer-holder)` | Transfer document holder | +| | `title-escrow transfer-holder` | Alternative: `transfer-holder` | +| | `[nominate-transfer-owner](#title-escrow-nominate-transfer-owner)` | Nominate new beneficiary | +| | `title-escrow nominate-transfer-owner` | Alternative: `nominate-transfer-owner` | +| | `[endorse-transfer-owner](#title-escrow-endorse-transfer-owner)` | Endorse beneficiary change | +| | `title-escrow endorse-transfer-owner` | Alternative: `endorse-transfer-owner` | +| | `[transfer-owner-holder](#title-escrow-transfer-owner-holder)` | Endorse full ownership transfer | +| | `title-escrow transfer-owner-holder` | Alternative: `transfer-owner-holder` | +| | `[return-to-issuer](#title-escrow-return-to-issuer)` | Return document to issuer | +| | `title-escrow return-to-issuer` | Alternative: `return-to-issuer` | +| | `[accept-return-to-issuer](#title-escrow-accept-return-to-issuer)` | Accept returned document | +| | `title-escrow accept-return-to-issuer` | Alternative: `accept-return-to-issuer` | +| | `[reject-return-to-issuer](#title-escrow-reject-return-to-issuer)` | Reject returned document | +| | `title-escrow reject-return-to-issuer` | Alternative: `reject-return-to-issuer` | +| | `[reject-transfer-holder](#title-escrow-reject-transfer-holder)` | Reject holder transfer | +| | `title-escrow reject-transfer-holder` | Alternative: `reject-transfer-holder` | +| | `[reject-transfer-owner](#title-escrow-reject-transfer-owner)` | Reject owner transfer | +| | `[reject-transfer-owner-holder](#title-escrow-reject-transfer-owner-holder)` | Reject full transfer | +| | `title-escrow reject-transfer-owner-holder` | Alternative: `reject-transfer-owner-holder` | +| **Obligation / BoE** | `[obligation-registry deploy](#obligation-registry-deploy)` | Deploy Obligation Registry | +| | `[obligation-registry mint](#obligation-registry-mint)` | Mint BoE token to obligationRegistry | +| | `[obligation-escrow accept](#obligation-escrow-accept)` | Accept obligation | +| | `[obligation-escrow reject](#obligation-escrow-reject)` | Reject obligation | +| | `[obligation-escrow discharge](#obligation-escrow-discharge)` | Discharge obligation | +| | `[obligation-escrow status](#obligation-escrow-status)` | Read obligation / escrow status | +| | `[obligation-escrow transfer-holder](#obligation-escrow-transfer-holder)` | Transfer BoE holder | +| | `[obligation-escrow nominate-transfer-owner](#obligation-escrow-transfer-holder)` | Nominate BoE beneficiary | +| | `[obligation-escrow endorse-transfer-owner](#obligation-escrow-transfer-holder)` | Endorse BoE beneficiary change | +| | `[obligation-escrow transfer-owner-holder](#obligation-escrow-transfer-holder)` | Endorse full BoE ownership transfer | +| | `[obligation-escrow return-to-issuer](#obligation-escrow-return-to-issuer)` | Return BoE to issuer | +| | `[obligation-escrow accept-return-to-issuer](#obligation-escrow-accept-return-to-issuer)` | Accept returned BoE | +| | `[obligation-escrow reject-return-to-issuer](#obligation-escrow-reject-return-to-issuer)` | Reject returned BoE | +| | `[obligation-escrow reject-transfer-*](#obligation-escrow-transfer-holder)` | Reject BoE transfer requests | @@ -1706,7 +1706,7 @@ User guide for electronic Bill of Exchange (BoE) / obligation flows with `trustv Classic transferable records (eBL / Token Registry + Title Escrow) use different commands. This section covers **only** Obligation Registry. -For library / SDK details, see the TrustVC README [§7c Obligation Registry (BoE)](https://github.com/TrustVC/trustvc/blob/beta/README.md#c-obligation-registry-boe) (on the `beta` branch; not yet on `main`). +For library / SDK details, see the TrustVC README [§7c Obligation Registry (BoE)](https://github.com/TrustVC/trustvc/blob/main/README.md#c-obligation-registry-boe). SDK imports use the **root** package with the `*ObligationRegistry` suffix (no clash with classic ETR helpers): @@ -1734,7 +1734,7 @@ You do **not** need to call the TypeScript SDK directly — the CLI wraps it wit ### Before you start -1. **Install the CLI** — `npm install -g `@trustvc/trustvc-cli`@beta` or `npx `@trustvc/trustvc-cli`@beta ` +1. **Install the CLI** — `npm install -g @trustvc/trustvc-cli` or `npx @trustvc/trustvc-cli ` 2. **Node.js 22.19.5+** 3. **A wallet** — encrypted wallet file (recommended), private key, or key file 4. **A signed BoE document** — set `credentialStatus.obligationRegistry`, then sign with `trustvc w3c-sign` (not `tokenRegistry`) @@ -1791,18 +1791,18 @@ Signing/building the VC can also be done with TrustVC library tools or your app ### Who can run what -| Action | Typical role | -| ----------------------------------------------------- | ---------------------------------------------------------- | -| `obligation-registry deploy` | Deployer / issuer org | -| `obligation-registry mint` | Issuer (registry minter) | -| `obligation-escrow accept` / `reject` | Holder (roles split) | -| `obligation-escrow discharge` | Beneficiary | -| Transfer / nominate / endorse | Current holder or beneficiary per Title Escrow–style rules | -| `return-to-issuer` | Dual role (beneficiary == holder), same as ETR | -| `accept-return-to-issuer` | Connected wallet with registry **accepter** role (burn / shred) | -| `reject-return-to-issuer` | Connected wallet with registry **restorer** role (restore) | -| `obligation-escrow status` | Anyone with the document (read-only RPC; no signing key) | -| `verify` | Anyone with the document (+ RPC when on-chain checks run) | +| Action | Typical role | +| ------------------------------------- | --------------------------------------------------------------- | +| `obligation-registry deploy` | Deployer / issuer org | +| `obligation-registry mint` | Issuer (registry minter) | +| `obligation-escrow accept` / `reject` | Holder (roles split) | +| `obligation-escrow discharge` | Beneficiary | +| Transfer / nominate / endorse | Current holder or beneficiary per Title Escrow–style rules | +| `return-to-issuer` | Dual role (beneficiary == holder), same as ETR | +| `accept-return-to-issuer` | Connected wallet with registry **accepter** role (burn / shred) | +| `reject-return-to-issuer` | Connected wallet with registry **restorer** role (restore) | +| `obligation-escrow status` | Anyone with the document (read-only RPC; no signing key) | +| `verify` | Anyone with the document (+ RPC when on-chain checks run) | diff --git a/src/commands/obligation-escrow/accept-return-to-issuer.ts b/src/commands/obligation-escrow/accept-return-to-issuer.ts index 4c35f62..860a4c7 100644 --- a/src/commands/obligation-escrow/accept-return-to-issuer.ts +++ b/src/commands/obligation-escrow/accept-return-to-issuer.ts @@ -40,5 +40,6 @@ export const acceptReturnedHandler = async (args: BaseObligationEscrowCommand) = ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/endorse-transfer-owner.ts b/src/commands/obligation-escrow/endorse-transfer-owner.ts index 2b13aab..87335f9 100644 --- a/src/commands/obligation-escrow/endorse-transfer-owner.ts +++ b/src/commands/obligation-escrow/endorse-transfer-owner.ts @@ -44,5 +44,6 @@ export const endorseHandler = async (args: ObligationEscrowNominateBeneficiaryCo ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/nominate-transfer-owner.ts b/src/commands/obligation-escrow/nominate-transfer-owner.ts index c9340a9..2250382 100644 --- a/src/commands/obligation-escrow/nominate-transfer-owner.ts +++ b/src/commands/obligation-escrow/nominate-transfer-owner.ts @@ -44,5 +44,6 @@ export const nominateHandler = async (args: ObligationEscrowNominateBeneficiaryC ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/reject-transfer-holder.ts b/src/commands/obligation-escrow/reject-transfer-holder.ts index edf2479..034a6b8 100644 --- a/src/commands/obligation-escrow/reject-transfer-holder.ts +++ b/src/commands/obligation-escrow/reject-transfer-holder.ts @@ -39,5 +39,6 @@ export const rejectTransferHolderHandler = async (args: BaseObligationEscrowComm ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/shared.ts b/src/commands/obligation-escrow/shared.ts index 46ec8ff..bf6d04f 100644 --- a/src/commands/obligation-escrow/shared.ts +++ b/src/commands/obligation-escrow/shared.ts @@ -55,5 +55,6 @@ export const runObligationEscrowCommand = async ( await commandHandler(answers); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/obligation-escrow/transfer-holder.ts b/src/commands/obligation-escrow/transfer-holder.ts index ddacdfb..8d01ef6 100644 --- a/src/commands/obligation-escrow/transfer-holder.ts +++ b/src/commands/obligation-escrow/transfer-holder.ts @@ -47,5 +47,6 @@ export const changeHolderHandler = async (args: ObligationEscrowTransferHolderCo ); } catch (e) { error(getErrorMessage(e)); + process.exitCode = 1; } }; diff --git a/src/commands/verify.ts b/src/commands/verify.ts index c149907..dab56d5 100644 --- a/src/commands/verify.ts +++ b/src/commands/verify.ts @@ -205,27 +205,27 @@ const verifyOpenAttestationDocument = async ( checkExpiration(signedVC); const requiresNetwork = isTransferableRecord(signedVC) || isDocumentRevokable(signedVC); - const chainId = getChainId(signedVC); // If the document is not transferable or revokable, verify directly if (!requiresNetwork) return await verifyDocument(signedVC); - // If chainId is not found, prefer --network / TTY prompt / no-provider fallback - if (requiresNetwork && !chainId) { - const provider = await resolveFallbackProvider(options.network); - if (provider) return await verifyDocument(signedVC, { provider }); - } - try { - const chainName = getSupportedNetworkNameFromId(Number(chainId)); - const network = getSupportedNetwork(chainName); - const provider = network.provider() as unknown as V5Provider; - if (provider) return await verifyDocument(signedVC, { provider }); + const chainId = getChainId(signedVC); + if (chainId) { + const chainName = getSupportedNetworkNameFromId(Number(chainId)); + const network = getSupportedNetwork(chainName); + const provider = network.provider() as unknown as V5Provider; + if (provider) return await verifyDocument(signedVC, { provider }); + } } catch (err: unknown) { signale.warn(`${err instanceof Error ? err.message : String(err)}`); } - // Fallback: Verify without provider + // Prefer --network / TTY prompt when chain lookup fails or returns no provider + const provider = await resolveFallbackProvider(options.network); + if (provider) return await verifyDocument(signedVC, { provider }); + + // Fallback: Verify without provider only when no override can be resolved return await verifyDocument(signedVC); }; diff --git a/tests/commands/verify.obligation.sepolia.test.ts b/tests/commands/verify.obligation.sepolia.test.ts index a5395ae..fb0857b 100644 --- a/tests/commands/verify.obligation.sepolia.test.ts +++ b/tests/commands/verify.obligation.sepolia.test.ts @@ -77,18 +77,25 @@ describe('Obligation record (BoE) — Sepolia testnet verify', () => { it('SEPOLIA_RPC env var overrides the default Infura provider for Sepolia', async () => { const customRpc = 'https://sepolia.example.com/rpc'; + const originalSepoliaRpc = process.env.SEPOLIA_RPC; process.env.SEPOLIA_RPC = customRpc; - const { getSupportedNetwork, NetworkCmdName } = await import('../../src/utils/networks'); - const { JsonRpcProvider } = await import('ethers'); - const provider = getSupportedNetwork(NetworkCmdName.Sepolia).provider(); + try { + const { getSupportedNetwork, NetworkCmdName } = await import('../../src/utils/networks'); + const { JsonRpcProvider } = await import('ethers'); + const provider = getSupportedNetwork(NetworkCmdName.Sepolia).provider(); - delete process.env.SEPOLIA_RPC; - - expect(provider).toBeInstanceOf(JsonRpcProvider); - expect((provider as any)._getConnection?.().url ?? (provider as any).connection?.url).toBe( - customRpc, - ); + expect(provider).toBeInstanceOf(JsonRpcProvider); + expect((provider as any)._getConnection?.().url ?? (provider as any).connection?.url).toBe( + customRpc, + ); + } finally { + if (originalSepoliaRpc === undefined) { + delete process.env.SEPOLIA_RPC; + } else { + process.env.SEPOLIA_RPC = originalSepoliaRpc; + } + } }); }); }); diff --git a/tests/commands/verify.test.ts b/tests/commands/verify.test.ts index e3c2d2c..b520344 100644 --- a/tests/commands/verify.test.ts +++ b/tests/commands/verify.test.ts @@ -232,6 +232,8 @@ describe('verify', () => { return 'none'; }; + const originalStdinIsTTYDescriptor = Object.getOwnPropertyDescriptor(process.stdin, 'isTTY'); + beforeEach(async () => { const signale = await import('signale'); signaleSuccessMock = (signale.default as any).success; @@ -242,7 +244,11 @@ describe('verify', () => { }); afterEach(() => { - Object.defineProperty(process.stdin, 'isTTY', { value: undefined, configurable: true }); + if (originalStdinIsTTYDescriptor) { + Object.defineProperty(process.stdin, 'isTTY', originalStdinIsTTYDescriptor); + } else { + delete (process.stdin as { isTTY?: boolean }).isTTY; + } }); type TestCase = { @@ -366,5 +372,23 @@ describe('verify', () => { expect(prompts.select).not.toHaveBeenCalled(); }); + + it('should use --network when document has a non-empty unsupported chain ID', async () => { + Object.defineProperty(process.stdin, 'isTTY', { value: true, configurable: true }); + const utils = await import('../../src/utils'); + const filePath = path.resolve( + process.cwd(), + 'tests/fixtures/verify/oa/3.0/signed_wrapped_oa_dns_txt_token_registry_v3.json', + ); + const signedVC = utils.readJsonFile(filePath, 'document') as any; + signedVC.network = { ...signedVC.network, chainId: '999999' }; + + await expect(verify(signedVC, { network: 'stability' })).resolves.toBeUndefined(); + + expect(prompts.select).not.toHaveBeenCalled(); + expect(signaleWarnMock).toHaveBeenCalledWith(expect.stringContaining('999999')); + // Override provider was used (verification continued past chain-resolution failure) + expect(signaleSuccessMock).toHaveBeenCalled(); + }); }); }); From 7db20eaf30e985d6a7e951270b5e26da6ee03933 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 4 Aug 2026 12:33:10 +0530 Subject: [PATCH 34/40] Update src/commands/obligation-registry/deploy.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/commands/obligation-registry/deploy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/obligation-registry/deploy.ts b/src/commands/obligation-registry/deploy.ts index 8954467..874e8a5 100644 --- a/src/commands/obligation-registry/deploy.ts +++ b/src/commands/obligation-registry/deploy.ts @@ -75,7 +75,7 @@ export const promptForInputs = async (): Promise Date: Tue, 4 Aug 2026 16:53:45 +0530 Subject: [PATCH 35/40] Update src/commands/obligation-escrow/status.ts Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/commands/obligation-escrow/status.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/obligation-escrow/status.ts b/src/commands/obligation-escrow/status.ts index 3366c9b..aa56335 100644 --- a/src/commands/obligation-escrow/status.ts +++ b/src/commands/obligation-escrow/status.ts @@ -57,7 +57,7 @@ export const statusHandler = async (args: ObligationEscrowStatusCommand) => { const { obligationRegistryAddress, tokenId, network } = args; // SDK view readers only need signer.provider; use network RPC (no signing key). const provider = getSupportedNetwork(network).provider(); - const readOnlySigner = { provider } as unknown as Signer; + const readOnlySigner = new VoidSigner(ZeroAddress, provider); const opts = { obligationRegistryAddress, tokenId }; const status = await getObligationRegistryStatus(opts, toSdkSigner(readOnlySigner), { tokenId }); From 2d37a10ed8df38319c9bc317a89ddc0a284858d6 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 4 Aug 2026 17:22:32 +0530 Subject: [PATCH 36/40] Refactor obligation document handling and update imports - Replaced `Signer` import with `VoidSigner` and `ZeroAddress` in `status.ts` for improved clarity. - Enhanced `extractObligationDocumentInfo` function in `obligation-document.ts` by adding `getSupportedNetworkNameFromId` to map library chain names to NetworkCmdName keys. --- src/commands/obligation-escrow/status.ts | 2 +- src/utils/obligation-document.ts | 5 +++-- tests/commands/obligation-escrow/status.test.ts | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/commands/obligation-escrow/status.ts b/src/commands/obligation-escrow/status.ts index aa56335..19363de 100644 --- a/src/commands/obligation-escrow/status.ts +++ b/src/commands/obligation-escrow/status.ts @@ -6,7 +6,7 @@ import { getObligationRegistryStatus, isObligationRegistryRegistered, } from '@trustvc/trustvc'; -import { Signer } from 'ethers'; +import { VoidSigner, ZeroAddress } from 'ethers'; import { BaseObligationEscrowCommand } from '../../types'; import { extractObligationDocumentInfo, diff --git a/src/utils/obligation-document.ts b/src/utils/obligation-document.ts index 97a7051..ddaf149 100644 --- a/src/utils/obligation-document.ts +++ b/src/utils/obligation-document.ts @@ -5,7 +5,7 @@ import { getChainId, isObligationRecord, } from '@trustvc/trustvc'; -import { SUPPORTED_CHAINS, CHAIN_ID } from './networks'; +import { SUPPORTED_CHAINS, CHAIN_ID, getSupportedNetworkNameFromId } from './networks'; /** * Extracts obligation / BoE document fields. Fails for classic ETR (tokenRegistry-only) docs. @@ -54,7 +54,8 @@ export const extractObligationDocumentInfo = async ( ); } - const network = SUPPORTED_CHAINS[chainId].name; + // Map library chain names (e.g. matic) to NetworkCmdName keys (e.g. pol) + const network = getSupportedNetworkNameFromId(Number(chainId)); if (!document.id) { throw new Error( 'Document does not contain a valid document ID (required as the remark encryption key)', diff --git a/tests/commands/obligation-escrow/status.test.ts b/tests/commands/obligation-escrow/status.test.ts index 6b570d0..0b948f9 100644 --- a/tests/commands/obligation-escrow/status.test.ts +++ b/tests/commands/obligation-escrow/status.test.ts @@ -65,7 +65,7 @@ describe('obligation-escrow/status', () => { }); expect(trustvc.getObligationRegistryStatus as MockedFunction).toHaveBeenCalledWith( { obligationRegistryAddress: '0xRegistry', tokenId: '0x1' }, - { provider: { mock: 'provider' } }, + expect.objectContaining({ provider: { mock: 'provider' } }), { tokenId: '0x1' }, ); expect(trustvc.isObligationRegistryRegistered).toHaveBeenCalled(); From fb1122d30b683fa8de724cc8ebd71a95e5a18c7e Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Wed, 5 Aug 2026 07:52:01 +0530 Subject: [PATCH 37/40] Remove branch specifications for CI triggers in GitHub Actions workflow --- .github/workflows/ci.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bcd3036..a02df6a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,13 +3,7 @@ name: CI # Same checks for PRs targeting main or beta (and for pushes to those branches). on: push: - branches: - - main - - beta pull_request: - branches: - - main - - beta jobs: test: From b715b9246f02a1a7fbbe4007c4e497e10b38dc29 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Wed, 5 Aug 2026 07:52:46 +0530 Subject: [PATCH 38/40] Remove redundant comments from CI workflow configuration --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a02df6a..637d8aa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,5 @@ name: CI -# Same checks for PRs targeting main or beta (and for pushes to those branches). on: push: pull_request: From 70245f509c194d53ca99dea66b98ae53fc704c76 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Wed, 5 Aug 2026 09:00:29 +0530 Subject: [PATCH 39/40] chore: trigger actions From c5213bf4a3ea039fef9e3015d4da64db5fa734f2 Mon Sep 17 00:00:00 2001 From: manishdex25 Date: Tue, 11 Aug 2026 11:37:10 +0530 Subject: [PATCH 40/40] Update package dependencies in package-lock.json and package.json - Upgraded @trustvc/trustvc to version 2.16.0-beta.3. --- package-lock.json | 96 +++++++++++++++++++++++------------------------ package.json | 2 +- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ce359d..1482fa0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "2.16.0-beta.1", + "@trustvc/trustvc": "2.16.0-beta.3", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "dotenv": "^16.0.0", @@ -502,13 +502,13 @@ } }, "node_modules/@digitalbazaar/di-sd-primitives/node_modules/@digitalbazaar/http-client": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.3.0.tgz", - "integrity": "sha512-6lMpxpt9BOmqHKGs9Xm6DP4LlZTBFer/ZjHvP3FcW3IaUWYIWC7dw5RFZnvw4fP57kAVcm1dp3IF+Y50qhBvAw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.4.0.tgz", + "integrity": "sha512-ODhCGmElUPmR3IR+KZmBNkRAFyjJ01rxvk2E+/qQ2h2EGPJH5k6bz3N24ympGc5+i4YCGk/ipIpmkwc0+iSmRg==", "license": "BSD-3-Clause", "dependencies": { - "ky": "^1.14.2", - "undici": "^6.23.0" + "ky": "^1.14.3", + "undici": "^6.28.0" }, "engines": { "node": ">=18.0" @@ -599,13 +599,13 @@ } }, "node_modules/@digitalbazaar/ecdsa-rdfc-2019-cryptosuite/node_modules/@digitalbazaar/http-client": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.3.0.tgz", - "integrity": "sha512-6lMpxpt9BOmqHKGs9Xm6DP4LlZTBFer/ZjHvP3FcW3IaUWYIWC7dw5RFZnvw4fP57kAVcm1dp3IF+Y50qhBvAw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.4.0.tgz", + "integrity": "sha512-ODhCGmElUPmR3IR+KZmBNkRAFyjJ01rxvk2E+/qQ2h2EGPJH5k6bz3N24ympGc5+i4YCGk/ipIpmkwc0+iSmRg==", "license": "BSD-3-Clause", "dependencies": { - "ky": "^1.14.2", - "undici": "^6.23.0" + "ky": "^1.14.3", + "undici": "^6.28.0" }, "engines": { "node": ">=18.0" @@ -2725,12 +2725,12 @@ } }, "node_modules/@noble/curves": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.2.0.tgz", - "integrity": "sha512-T/BoHgFXirb0ENSPBquzX0rcjXeM6Lo892a2jlYJkqk83LqZx0l1Of7DzlKJ6jkpvMrkHSnAcgb5JegL8SeIkQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-2.3.0.tgz", + "integrity": "sha512-v7cY+4oWYPQszRj6ZFGzTVL7uP2TaLo1xMhWHzYC5wj0ZhOXQ5x+sBre8rF3hi8cAoi0bh1qXoovoOkdFtvqEg==", "license": "MIT", "dependencies": { - "@noble/hashes": "2.2.0" + "@noble/hashes": "2.3.0" }, "engines": { "node": ">= 20.19.0" @@ -2740,9 +2740,9 @@ } }, "node_modules/@noble/hashes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", - "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.3.0.tgz", + "integrity": "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==", "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -4677,9 +4677,9 @@ } }, "node_modules/@trustvc/trustvc": { - "version": "2.16.0-beta.1", - "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.16.0-beta.1.tgz", - "integrity": "sha512-sXklxfioSrIV+ZyuYsyPy+WMbgOPcRweJTd2Tklg8ZdF/tQlb2yVHDTPLycSNI3YOilpRhKn9p0Y2hSJxTuRRw==", + "version": "2.16.0-beta.3", + "resolved": "https://registry.npmjs.org/@trustvc/trustvc/-/trustvc-2.16.0-beta.3.tgz", + "integrity": "sha512-spuYfT78ZYY5Xg60yTrnDjbGsxwv5QNAyfEhWzp0mcBTRZRPJRiH8mVWTp4AZeAHO6ph9ZyOY0ZVl3f7/cBcvw==", "license": "Apache-2.0", "dependencies": { "@tradetrust-tt/dnsprove": "^2.18.0", @@ -4690,11 +4690,11 @@ "@tradetrust-tt/tt-verify": "^9.7.5", "@trustvc/document-store": "^1.0.3", "@trustvc/eip7702": "^1.0.0-beta.1", - "@trustvc/w3c": "^2.4.1", + "@trustvc/w3c": "^2.4.2", "@trustvc/w3c-context": "^2.4.0", "@trustvc/w3c-credential-status": "^2.4.0", "@trustvc/w3c-issuer": "^2.3.0", - "@trustvc/w3c-vc": "^2.4.1", + "@trustvc/w3c-vc": "^2.4.2", "ethers": "^5.8.0", "ethersV6": "npm:ethers@^6.14.4", "js-sha3": "^0.9.3", @@ -4783,15 +4783,15 @@ } }, "node_modules/@trustvc/w3c": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@trustvc/w3c/-/w3c-2.4.1.tgz", - "integrity": "sha512-yCyztSAbialRn9VYvXrHUE4v13q4g/BHUN4XUctzF5lrN3WsHKSgUpFUflocLdp1h5fxvJTbqyVoMSh5SDLwQw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@trustvc/w3c/-/w3c-2.4.2.tgz", + "integrity": "sha512-ldrlp3Mg3Jr+JOME4R5mhqubmLg5VtuQPbDh1oh8KGAX93zX/ZCGgLgCE4KI6CrZsEv5HYCA2tTSBxMjKzU6eg==", "license": "Apache-2.0", "dependencies": { "@trustvc/w3c-context": "^2.4.0", "@trustvc/w3c-credential-status": "^2.4.0", "@trustvc/w3c-issuer": "^2.3.0", - "@trustvc/w3c-vc": "^2.4.1" + "@trustvc/w3c-vc": "^2.4.2" }, "engines": { "node": ">=18.x" @@ -4866,9 +4866,9 @@ } }, "node_modules/@trustvc/w3c-vc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-2.4.1.tgz", - "integrity": "sha512-f/pqBu70epEYVmtWvKvlhCd2F5QkV885rCcbfa9KZq9xYbOzeBueIF7P3gSdv3ILAiMCQTxvpL7hd8I8hj+M1A==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@trustvc/w3c-vc/-/w3c-vc-2.4.2.tgz", + "integrity": "sha512-XLyiMjIoaviPfp0CT3rodUPS8zD2KCTIR6lPFfAPz7/JK0KlgdUW8O12HzgN1ZGw4hqIKfZiV8Wy1AwG75bgvQ==", "license": "Apache-2.0", "dependencies": { "@digitalbazaar/bbs-2023-cryptosuite": "^2.0.1", @@ -5402,8 +5402,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "devOptional": true, - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/abitype": { "version": "1.2.3", @@ -5953,8 +5953,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "devOptional": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/bundle-require": { "version": "5.1.0", @@ -6156,8 +6156,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "devOptional": true, "license": "ISC", + "optional": true, "engines": { "node": ">=10" } @@ -8433,8 +8433,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "devOptional": true, "license": "ISC", + "optional": true, "dependencies": { "minipass": "^3.0.0" }, @@ -8446,8 +8446,8 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, "license": "ISC", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -10395,13 +10395,13 @@ "license": "ISC" }, "node_modules/jsonld-signatures/node_modules/@digitalbazaar/http-client": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.3.0.tgz", - "integrity": "sha512-6lMpxpt9BOmqHKGs9Xm6DP4LlZTBFer/ZjHvP3FcW3IaUWYIWC7dw5RFZnvw4fP57kAVcm1dp3IF+Y50qhBvAw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-4.4.0.tgz", + "integrity": "sha512-ODhCGmElUPmR3IR+KZmBNkRAFyjJ01rxvk2E+/qQ2h2EGPJH5k6bz3N24ympGc5+i4YCGk/ipIpmkwc0+iSmRg==", "license": "BSD-3-Clause", "dependencies": { - "ky": "^1.14.2", - "undici": "^6.23.0" + "ky": "^1.14.3", + "undici": "^6.28.0" }, "engines": { "node": ">=18.0" @@ -11000,8 +11000,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "devOptional": true, "license": "ISC", + "optional": true, "engines": { "node": ">=8" } @@ -11010,8 +11010,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "devOptional": true, "license": "MIT", + "optional": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -11024,8 +11024,8 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, "license": "ISC", + "optional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -11358,8 +11358,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "devOptional": true, "license": "ISC", + "optional": true, "dependencies": { "abbrev": "1" }, @@ -16019,8 +16019,8 @@ "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", - "devOptional": true, "license": "ISC", + "optional": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -17450,8 +17450,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "devOptional": true, "license": "ISC", + "optional": true, "dependencies": { "builtins": "^1.0.3" } diff --git a/package.json b/package.json index a38b155..220a43c 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ }, "dependencies": { "@inquirer/prompts": "^5.3.8", - "@trustvc/trustvc": "2.16.0-beta.1", + "@trustvc/trustvc": "2.16.0-beta.3", "@types/yargs": "^17.0.32", "chalk": "^4.1.2", "dotenv": "^16.0.0",