diff --git a/.github/scripts/validate-branch-policy.sh b/.github/scripts/validate-branch-policy.sh new file mode 100755 index 0000000..0fb7ee2 --- /dev/null +++ b/.github/scripts/validate-branch-policy.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +set -euo pipefail + +failed=0 + +error() { + echo "::error::$*" + failed=1 +} + +warning() { + echo "::warning::$*" +} + +active_branch_file="support/ci/ACTIVE_DEV_BRANCH" +if [[ ! -f "${active_branch_file}" ]]; then + error "${active_branch_file} is required." + active_branch="" +else + active_branch="$(tr -d '[:space:]' < "${active_branch_file}")" +fi + +if [[ -z "${active_branch}" ]]; then + error "${active_branch_file} must not be empty." +elif [[ "${active_branch}" == "main" ]]; then + error "${active_branch_file} must point to a dev branch, not main." +elif [[ "${active_branch}" != *-dev ]]; then + warning "${active_branch_file} should normally point to a -dev branch; got ${active_branch}." +fi + +release_branch="${active_branch%-dev}" +default_branch="${GITHUB_DEFAULT_BRANCH:-}" +event_name="${GITHUB_EVENT_NAME:-local}" +base_ref="${GITHUB_BASE_REF:-}" +head_ref="${GITHUB_HEAD_REF:-}" +ref_name="${GITHUB_REF_NAME:-}" +actor="${GITHUB_ACTOR:-}" + +if [[ -n "${default_branch}" && "${default_branch}" != "main" ]]; then + warning "Repository default branch should be main after branch-policy rollout; currently ${default_branch}." +fi + +if [[ -n "${base_ref}" && "${base_ref}" == "main" ]]; then + warning "PR targets main; retarget-main-prs should move it to ${active_branch}." +fi + +if [[ -n "${base_ref}" && -n "${active_branch}" ]]; then + if [[ "${base_ref}" == "${release_branch}" && "${head_ref}" != "${active_branch}" && "${ALLOW_DIRECT_RELEASE_PR:-false}" != "true" ]]; then + error "PRs into ${release_branch} must come from ${active_branch}. Merge feature work into ${active_branch}, then promote ${active_branch} -> ${release_branch}." + fi +fi + +if [[ "${event_name}" == "push" && "${ref_name}" == "main" ]]; then + case "${actor}" in + github-actions[bot]|ci-core-e2e-runner[bot]) + ;; + *) + error "main should only move by automation from ${active_branch}; direct push actor was ${actor:-unknown}." + ;; + esac +fi + +if [[ ! -f ".github/workflows/fast-forward-main.yaml" ]]; then + error ".github/workflows/fast-forward-main.yaml is required." +fi + +if [[ ! -f ".github/workflows/retarget-main-prs.yaml" ]]; then + error ".github/workflows/retarget-main-prs.yaml is required." +fi + +if [[ -f ".github/workflows/release-from-main.yml" ]]; then + error ".github/workflows/release-from-main.yml is forbidden. Releases must be tag/version-branch driven." +fi + +if [[ -f "release.config.js" ]]; then + error "release.config.js is forbidden in versioned tooling branches; semantic-release-on-main must not be restored." +fi + +if [[ -f ".github/workflows/release-from-tag.yml" ]]; then + if ! grep -Fq 'v*.*.*' .github/workflows/release-from-tag.yml; then + error "release-from-tag.yml must trigger only from version tags matching v*.*.*." + fi + if ! grep -Fq 'refs/remotes/origin/${version_branch}' .github/workflows/release-from-tag.yml || \ + ! grep -Fq 'tag_commit' .github/workflows/release-from-tag.yml || \ + ! grep -Fq 'branch_head' .github/workflows/release-from-tag.yml; then + error "release-from-tag.yml must verify the tag commit is the current matching version branch head." + fi +fi + +if [[ -f ".github/workflows/manual-docker-release.yml" ]]; then + if ! grep -Fq 'expected_branch=' .github/workflows/manual-docker-release.yml; then + error "manual-docker-release.yml must derive and enforce the expected version branch from the tag." + fi + if ! grep -Fq './.github/workflows/release-from-tag.yml' .github/workflows/manual-docker-release.yml; then + error "manual-docker-release.yml must delegate image promotion to release-from-tag.yml." + fi +fi + +if [[ "${failed}" -ne 0 ]]; then + exit 1 +fi + +if [[ -n "${base_ref}" ]]; then + echo "Branch policy ok for PR ${head_ref} -> ${base_ref}; active dev branch is ${active_branch}." +else + echo "Branch policy ok for ${event_name} on ${ref_name:-detached ref}; active dev branch is ${active_branch}." +fi diff --git a/.github/workflows/branch-policy.yml b/.github/workflows/branch-policy.yml new file mode 100644 index 0000000..5994908 --- /dev/null +++ b/.github/workflows/branch-policy.yml @@ -0,0 +1,24 @@ +name: Branch Policy + +on: + pull_request: + types: [opened, synchronize, reopened, edited, ready_for_review] + push: + branches: + - '**' + workflow_dispatch: + +permissions: + contents: read + +jobs: + branch-policy: + name: Validate branch policy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Validate branch policy + env: + GITHUB_DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + run: ./.github/scripts/validate-branch-policy.sh diff --git a/.github/workflows/fast-forward-main.yaml b/.github/workflows/fast-forward-main.yaml new file mode 100644 index 0000000..688e997 --- /dev/null +++ b/.github/workflows/fast-forward-main.yaml @@ -0,0 +1,57 @@ +name: Fast-forward main + +# main is the static/default branch for GitHub UX and tools that assume a +# stable default branch. It is not the integration target. On each push to the +# configured active dev branch, fast-forward main to that commit. + +on: + push: + branches: ["**"] + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: fast-forward-main-${{ github.repository }} + cancel-in-progress: false + +defaults: + run: + shell: bash + +jobs: + fast-forward: + if: github.ref_type == 'branch' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fast-forward main to active dev branch + run: | + set -euo pipefail + + active_branch="$(tr -d '[:space:]' < support/ci/ACTIVE_DEV_BRANCH)" + if [[ -z "${active_branch}" || "${active_branch}" == "main" ]]; then + echo "::error::support/ci/ACTIVE_DEV_BRANCH must name a non-main dev branch" + exit 1 + fi + + if [[ "${GITHUB_REF_NAME}" != "${active_branch}" ]]; then + echo "Push was to ${GITHUB_REF_NAME}; active dev branch is ${active_branch}. Nothing to do." + exit 0 + fi + + if git ls-remote --exit-code --heads origin main >/dev/null 2>&1; then + git fetch origin main + if ! git merge-base --is-ancestor origin/main HEAD; then + echo "::error::main has diverged from ${active_branch}; refusing non-fast-forward update" + exit 1 + fi + else + echo "main does not exist yet; creating it at ${GITHUB_SHA}." + fi + + git push origin "HEAD:refs/heads/main" diff --git a/.github/workflows/retarget-main-prs.yaml b/.github/workflows/retarget-main-prs.yaml new file mode 100644 index 0000000..37a066f --- /dev/null +++ b/.github/workflows/retarget-main-prs.yaml @@ -0,0 +1,53 @@ +name: Retarget main PRs + +# main is a static/default alias of the active dev branch. Contributions should +# target the active dev branch directly; PRs opened against main are retargeted +# automatically so required checks and release-train rules run in the right +# branch context. +# +# pull_request_target is used for the write-scoped token. This workflow never +# checks out or executes PR head code; it reads only trusted base-branch files. + +on: + pull_request_target: + types: [opened, reopened, synchronize, edited, ready_for_review] + +permissions: + contents: read + pull-requests: write + issues: write + +defaults: + run: + shell: bash + +jobs: + retarget: + if: github.event.pull_request.base.ref == 'main' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.base.ref }} + + - name: Retarget PR to active dev branch + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + set -euo pipefail + + active_branch="$(tr -d '[:space:]' < support/ci/ACTIVE_DEV_BRANCH)" + if [[ -z "${active_branch}" || "${active_branch}" == "main" ]]; then + echo "::error::support/ci/ACTIVE_DEV_BRANCH must name a non-main dev branch" + exit 1 + fi + + gh pr edit "${PR_NUMBER}" --repo "${GITHUB_REPOSITORY}" --base "${active_branch}" + + gh pr comment "${PR_NUMBER}" --repo "${GITHUB_REPOSITORY}" --body "$(cat <=18.6.0" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + } +} diff --git a/packages/transaction-kit/src/index.ts b/packages/transaction-kit/src/index.ts new file mode 100644 index 0000000..dd4a21b --- /dev/null +++ b/packages/transaction-kit/src/index.ts @@ -0,0 +1,488 @@ +import { AbiCoder, keccak256 } from 'ethers'; +import { + createClient, + isSuccessful as sdkIsSuccessful, +} from 'genlayer-js'; +import type { + FeesDistribution, + FeesDistributionInput, + GenLayerChain, + GenLayerTransaction, + TransactionFeeEstimate, +} from 'genlayer-js/types'; + +export type { + FeesDistribution, + FeesDistributionInput, + GenLayerChain, +} from 'genlayer-js/types'; + +export type FeePreset = 'low' | 'standard' | 'high'; + +export type PolicyInput = { + preset?: FeePreset; + overrides?: Partial; + userValue?: bigint; +}; + +export type PolicyQuote = { + distribution: FeesDistribution; + feeValue: bigint; + userValue: bigint; + total: bigint; + breakdown: { + timeUnitFees: bigint; + executionBudget: bigint; + messageFees: bigint; + }; + caps: { + genPerTimeUnit: bigint; + storagePrice: bigint; + receiptPrice: bigint; + }; + refundable: true; +}; + +export type SubmitInput = + | { kind: 'deploy'; code: string; args?: unknown[]; leaderOnly?: boolean } + | { + kind: 'write'; + address: `0x${string}`; + method: string; + args?: unknown[]; + }; + +export type TrackedStatus = { + phase: 'submitted' | 'pending' | 'processing' | 'decided' | 'finalized'; + statusName?: string; + executionResultName?: string; + successful?: boolean; + genlayerTxId?: `0x${string}`; + evmTxHash?: `0x${string}`; + contractAddress?: `0x${string}`; +}; + +export type TransactionKit = { + estimate(input: PolicyInput, tx?: SubmitInput): Promise; + submit( + quote: PolicyQuote, + tx: SubmitInput, + ): Promise<{ genlayerTxId: `0x${string}`; evmTxHash?: `0x${string}` }>; + track( + genlayerTxId: `0x${string}`, + onUpdate: (s: TrackedStatus) => void, + opts?: { until?: 'decided' | 'finalized' }, + ): Promise; + verification( + quote: PolicyQuote, + tx: SubmitInput, + ): { feeConfigHash: `0x${string}`; summary: Record }; +}; + +export type Eip1193Provider = { + request(args: { method: string; params?: unknown[] }): Promise; +}; + +type Client = { + estimateTransactionFeesForWrite?: ( + args: Record, + ) => Promise; + estimateTransactionFees: ( + args?: Record, + ) => Promise; + writeContract(args: Record): Promise<`0x${string}`>; + deployContract(args: Record): Promise<`0x${string}`>; + getTransaction(args: { hash: `0x${string}` }): Promise; + waitForTransactionReceipt?: (args: { + hash: `0x${string}`; + waitUntil?: 'decided' | 'finalized'; + fullTransaction?: boolean; + }) => Promise; +}; + +const abiCoder = AbiCoder.defaultAbiCoder(); + +const TRANSACTION_STATUS_NUMBER_TO_NAME = { + '0': 'UNINITIALIZED', + '1': 'PENDING', + '2': 'PROPOSING', + '3': 'COMMITTING', + '4': 'REVEALING', + '5': 'ACCEPTED', + '6': 'UNDETERMINED', + '7': 'FINALIZED', + '8': 'CANCELED', + '9': 'APPEAL_REVEALING', + '10': 'APPEAL_COMMITTING', + '11': 'READY_TO_FINALIZE', + '12': 'VALIDATORS_TIMEOUT', + '13': 'LEADER_TIMEOUT', + '14': 'LEADER_REVEALING', +} as const; + +const EXECUTION_RESULT_NUMBER_TO_NAME = { + '0': 'NOT_VOTED', + '1': 'FINISHED_WITH_RETURN', + '2': 'FINISHED_WITH_ERROR', + '3': 'TIMEOUT', + '4': 'NONDET_DISAGREE', +} as const; + +const PRESETS: Record = { + low: { + appealRounds: 0n, + rotations: [0n], + }, + standard: { + appealRounds: 1n, + rotations: [0n, 0n], + }, + high: { + appealRounds: 2n, + rotations: [0n, 0n, 0n], + }, +}; + +const POLL_INTERVAL_MS = 2_000; +const MAX_POLLS = 300; + +const toCalldataArgs = (args: unknown[] | undefined): unknown[] | undefined => + args; + +const max = (value: bigint, floor: bigint): bigint => + value > floor ? value : floor; + +const leaderRounds = (distribution: FeesDistribution): bigint => + distribution.rotations.reduce( + (sum, rotations) => sum + rotations + 1n, + distribution.appealRounds, + ); + +const buildBreakdown = ( + estimate: TransactionFeeEstimate, +): PolicyQuote['breakdown'] => { + const messageFees = estimate.distribution.totalMessageFees; + const executionBudget = + estimate.distribution.executionBudgetPerRound * + leaderRounds(estimate.distribution); + const timeUnitFees = max(estimate.feeValue - messageFees - executionBudget, 0n); + + return { + timeUnitFees, + executionBudget, + messageFees, + }; +}; + +const toPolicyQuote = ( + estimate: TransactionFeeEstimate, + userValue: bigint, +): PolicyQuote => ({ + distribution: estimate.distribution, + feeValue: estimate.feeValue, + userValue, + total: estimate.feeValue + userValue, + breakdown: buildBreakdown(estimate), + caps: { + genPerTimeUnit: estimate.distribution.maxPriceGenPerTimeUnit, + storagePrice: estimate.distribution.storageFeeMaxGasPrice, + receiptPrice: estimate.distribution.receiptFeeMaxGasPrice, + }, + refundable: true, +}); + +const buildFeeOptions = (input: PolicyInput): Record => ({ + ...PRESETS[input.preset ?? 'standard'], + ...(input.overrides ?? {}), +}); + +const captureProviderTxHash = (provider: Eip1193Provider) => { + let lastEvmTxHash: `0x${string}` | undefined; + const wrapped: Eip1193Provider = { + async request(args) { + const result = await provider.request(args); + if ( + args.method === 'eth_sendTransaction' && + typeof result === 'string' && + result.startsWith('0x') + ) { + lastEvmTxHash = result as `0x${string}`; + } + return result; + }, + }; + + return { + provider: wrapped, + getLastEvmTxHash: () => lastEvmTxHash, + }; +}; + +const feeTuple = (fees: FeesDistribution): unknown[] => [ + fees.leaderTimeunitsAllocation, + fees.validatorTimeunitsAllocation, + fees.appealRounds, + fees.executionBudgetPerRound, + fees.executionConsumed, + fees.totalMessageFees, + fees.rotations, + fees.maxPriceGenPerTimeUnit, + fees.storageFeeMaxGasPrice, + fees.receiptFeeMaxGasPrice, +]; + +const hashFeeConfig = (distribution: FeesDistribution): `0x${string}` => + keccak256( + abiCoder.encode( + [ + 'tuple(uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256,uint256,uint256)', + 'tuple(uint8,bool,uint256,address,bytes32,uint256,bytes)[]', + ], + [feeTuple(distribution), []], + ), + ) as `0x${string}`; + +const asStringRecord = (quote: PolicyQuote, tx: SubmitInput) => ({ + kind: tx.kind, + feeValue: quote.feeValue.toString(), + userValue: quote.userValue.toString(), + total: quote.total.toString(), + appealRounds: quote.distribution.appealRounds.toString(), + rotations: quote.distribution.rotations.map(String).join(','), + leaderTimeunitsAllocation: + quote.distribution.leaderTimeunitsAllocation.toString(), + validatorTimeunitsAllocation: + quote.distribution.validatorTimeunitsAllocation.toString(), + executionBudgetPerRound: + quote.distribution.executionBudgetPerRound.toString(), + totalMessageFees: quote.distribution.totalMessageFees.toString(), + maxPriceGenPerTimeUnit: + quote.distribution.maxPriceGenPerTimeUnit.toString(), + storageFeeMaxGasPrice: + quote.distribution.storageFeeMaxGasPrice.toString(), + receiptFeeMaxGasPrice: + quote.distribution.receiptFeeMaxGasPrice.toString(), +}); + +const statusNameOf = (transaction: GenLayerTransaction): string | undefined => { + if (transaction.statusName) { + return transaction.statusName; + } + if (typeof transaction.status === 'string') { + const status = transaction.status as string; + return /^\d+$/u.test(status) + ? TRANSACTION_STATUS_NUMBER_TO_NAME[ + status as keyof typeof TRANSACTION_STATUS_NUMBER_TO_NAME + ] + : status; + } + if (typeof transaction.status === 'number') { + return TRANSACTION_STATUS_NUMBER_TO_NAME[ + String(transaction.status) as keyof typeof TRANSACTION_STATUS_NUMBER_TO_NAME + ]; + } + return undefined; +}; + +const executionResultNameOf = ( + transaction: GenLayerTransaction, +): string | undefined => { + if (transaction.txExecutionResultName) { + return transaction.txExecutionResultName; + } + if (transaction.txExecutionResult === undefined) { + return undefined; + } + return EXECUTION_RESULT_NUMBER_TO_NAME[ + String( + transaction.txExecutionResult, + ) as keyof typeof EXECUTION_RESULT_NUMBER_TO_NAME + ]; +}; + +const isFinalized = (statusName: string | undefined): boolean => + statusName === 'FINALIZED'; + +const isDecided = (statusName: string | undefined): boolean => + [ + 'ACCEPTED', + 'UNDETERMINED', + 'FINALIZED', + 'CANCELED', + 'LEADER_TIMEOUT', + 'VALIDATORS_TIMEOUT', + ].includes(statusName ?? ''); + +const phaseOf = ( + transaction: GenLayerTransaction, +): TrackedStatus['phase'] => { + const statusName = statusNameOf(transaction); + if (isFinalized(statusName)) { + return 'finalized'; + } + if (isDecided(statusName)) { + return 'decided'; + } + if ( + [ + 'PROPOSING', + 'COMMITTING', + 'REVEALING', + 'APPEAL_REVEALING', + 'APPEAL_COMMITTING', + 'LEADER_REVEALING', + 'READY_TO_FINALIZE', + ].includes(statusName ?? '') + ) { + return 'processing'; + } + return 'pending'; +}; + +const mapTrackedStatus = ( + genlayerTxId: `0x${string}`, + transaction: GenLayerTransaction, +): TrackedStatus => { + const statusName = statusNameOf(transaction); + const executionResultName = executionResultNameOf(transaction); + const phase = phaseOf(transaction); + const contractAddress = (transaction.txDataDecoded as Record) + ?.contractAddress; + + const status: TrackedStatus = { + phase, + genlayerTxId: transaction.txId ?? transaction.hash ?? genlayerTxId, + }; + + if (statusName !== undefined) { + status.statusName = statusName; + } + if (executionResultName !== undefined) { + status.executionResultName = executionResultName; + } + if (isDecided(statusName)) { + status.successful = sdkIsSuccessful(transaction); + } + if (typeof contractAddress === 'string' && contractAddress.startsWith('0x')) { + status.contractAddress = contractAddress as `0x${string}`; + } + + return status; +}; + +const sleep = (ms: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, ms); + }); + +export function createTransactionKit(opts: { + chain: GenLayerChain; + provider: Eip1193Provider; + account?: `0x${string}`; +}): TransactionKit { + const captured = captureProviderTxHash(opts.provider); + const client = createClient({ + chain: opts.chain, + provider: captured.provider, + ...(opts.account ? { account: opts.account } : {}), + } as never) as unknown as Client; + + const estimate = async ( + input: PolicyInput, + tx?: SubmitInput, + ): Promise => { + const userValue = input.userValue ?? 0n; + const feeOptions = buildFeeOptions(input); + const sdkEstimate = + tx?.kind === 'write' && client.estimateTransactionFeesForWrite + ? await client.estimateTransactionFeesForWrite({ + ...feeOptions, + address: tx.address, + functionName: tx.method, + args: toCalldataArgs(tx.args), + value: userValue, + }) + : await client.estimateTransactionFees(feeOptions); + + return toPolicyQuote(sdkEstimate, userValue); + }; + + const submit = async ( + quote: PolicyQuote, + tx: SubmitInput, + ): Promise<{ genlayerTxId: `0x${string}`; evmTxHash?: `0x${string}` }> => { + const fees = { + distribution: quote.distribution, + feeValue: quote.feeValue, + }; + const common = { + fees, + value: quote.userValue, + }; + const genlayerTxId = + tx.kind === 'deploy' + ? await client.deployContract({ + ...common, + code: tx.code, + args: toCalldataArgs(tx.args), + leaderOnly: tx.leaderOnly, + }) + : await client.writeContract({ + ...common, + address: tx.address, + functionName: tx.method, + args: toCalldataArgs(tx.args), + }); + + const result: { genlayerTxId: `0x${string}`; evmTxHash?: `0x${string}` } = { + genlayerTxId, + }; + const evmTxHash = captured.getLastEvmTxHash(); + if (evmTxHash !== undefined) { + result.evmTxHash = evmTxHash; + } + return result; + }; + + const track = async ( + genlayerTxId: `0x${string}`, + onUpdate: (s: TrackedStatus) => void, + opts?: { until?: 'decided' | 'finalized' }, + ): Promise => { + const until = opts?.until ?? 'finalized'; + const submitted: TrackedStatus = { + phase: 'submitted', + genlayerTxId, + }; + onUpdate(submitted); + + for (let poll = 0; poll < MAX_POLLS; poll++) { + const transaction = await client.getTransaction({ hash: genlayerTxId }); + const status = mapTrackedStatus(genlayerTxId, transaction); + onUpdate(status); + + if ( + status.phase === 'finalized' || + (until === 'decided' && status.phase === 'decided') + ) { + return status; + } + + await sleep(POLL_INTERVAL_MS); + } + + throw new Error(`Timed out tracking GenLayer transaction ${genlayerTxId}`); + }; + + return { + estimate, + submit, + track, + verification(quote: PolicyQuote, tx: SubmitInput) { + return { + feeConfigHash: hashFeeConfig(quote.distribution), + summary: asStringRecord(quote, tx), + }; + }, + }; +} diff --git a/packages/transaction-kit/test/index.test.ts b/packages/transaction-kit/test/index.test.ts new file mode 100644 index 0000000..1db18de --- /dev/null +++ b/packages/transaction-kit/test/index.test.ts @@ -0,0 +1,339 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +import type { FeesDistribution, GenLayerChain } from 'genlayer-js/types'; + +const mocks = vi.hoisted(() => ({ + createClient: vi.fn(), + isSuccessful: vi.fn((transaction: Record) => { + return ( + transaction.statusName === 'ACCEPTED' && + transaction.txExecutionResultName === 'FINISHED_WITH_RETURN' + ); + }), +})); + +vi.mock('genlayer-js', () => ({ + createClient: mocks.createClient, + isSuccessful: mocks.isSuccessful, + transactionsStatusNumberToName: { + '0': 'UNINITIALIZED', + '1': 'PENDING', + '2': 'PROPOSING', + '3': 'COMMITTING', + '4': 'REVEALING', + '5': 'ACCEPTED', + '6': 'UNDETERMINED', + '7': 'FINALIZED', + '8': 'CANCELED', + '12': 'VALIDATORS_TIMEOUT', + '13': 'LEADER_TIMEOUT', + }, + executionResultNumberToName: { + '0': 'NOT_VOTED', + '1': 'FINISHED_WITH_RETURN', + '2': 'FINISHED_WITH_ERROR', + '3': 'TIMEOUT', + '4': 'NONDET_DISAGREE', + }, +})); + +const chain = { + id: 61999, + name: 'GenLayer Studio', + rpcUrls: { default: { http: ['https://studio.genlayer.com/api'] } }, + nativeCurrency: { name: 'GEN', symbol: 'GEN', decimals: 18 }, + isStudio: true, +} as unknown as GenLayerChain; + +const distribution = (overrides: Partial = {}) => + ({ + leaderTimeunitsAllocation: 10n, + validatorTimeunitsAllocation: 20n, + appealRounds: 1n, + executionBudgetPerRound: 100n, + executionConsumed: 0n, + totalMessageFees: 20n, + rotations: [0n, 0n], + maxPriceGenPerTimeUnit: 3n, + storageFeeMaxGasPrice: 4n, + receiptFeeMaxGasPrice: 5n, + ...overrides, + }) satisfies FeesDistribution; + +const provider = (hash = `0x${'a'.repeat(64)}`) => ({ + request: vi.fn(async ({ method }: { method: string }) => { + if (method === 'eth_sendTransaction') { + return hash; + } + return undefined; + }), +}); + +describe('transaction kit core', () => { + beforeEach(() => { + mocks.createClient.mockReset(); + mocks.isSuccessful.mockClear(); + }); + + it('returns coherent policy quotes and uses the standard preset by default', async () => { + const client = { + estimateTransactionFees: vi.fn(async () => ({ + distribution: distribution(), + feeValue: 350n, + policy: { + enabled: true, + genPerTimeUnit: 3n, + storageUnitPrice: 4n, + receiptGasPrice: 5n, + executionBudgetFloor: 0n, + }, + })), + }; + mocks.createClient.mockReturnValue(client); + + const { createTransactionKit } = await import('../src/index'); + const kit = createTransactionKit({ + chain, + provider: provider(), + account: `0x${'1'.repeat(40)}`, + }); + + const quote = await kit.estimate({ userValue: 7n }); + + expect(client.estimateTransactionFees).toHaveBeenCalledWith({ + appealRounds: 1n, + rotations: [0n, 0n], + }); + expect(quote.total).toBe(357n); + expect(quote.breakdown.executionBudget).toBe(300n); + expect(quote.breakdown.messageFees).toBe(20n); + expect(quote.breakdown.timeUnitFees).toBe(30n); + expect( + quote.breakdown.executionBudget + + quote.breakdown.messageFees + + quote.breakdown.timeUnitFees, + ).toBeLessThanOrEqual(quote.feeValue); + expect(quote.refundable).toBe(true); + }); + + it('uses write-targeted estimation when a write transaction is supplied', async () => { + const client = { + estimateTransactionFeesForWrite: vi.fn(async () => ({ + distribution: distribution({ appealRounds: 2n, rotations: [0n, 0n, 0n] }), + feeValue: 600n, + policy: { + enabled: true, + genPerTimeUnit: 3n, + storageUnitPrice: 4n, + receiptGasPrice: 5n, + executionBudgetFloor: 0n, + }, + })), + estimateTransactionFees: vi.fn(), + }; + mocks.createClient.mockReturnValue(client); + + const { createTransactionKit } = await import('../src/index'); + const kit = createTransactionKit({ + chain, + provider: provider(), + account: `0x${'1'.repeat(40)}`, + }); + + await kit.estimate( + { preset: 'high', userValue: 9n }, + { + kind: 'write', + address: `0x${'2'.repeat(40)}`, + method: 'update_storage', + args: ['value'], + }, + ); + + expect(client.estimateTransactionFeesForWrite).toHaveBeenCalledWith({ + appealRounds: 2n, + rotations: [0n, 0n, 0n], + address: `0x${'2'.repeat(40)}`, + functionName: 'update_storage', + args: ['value'], + value: 9n, + }); + expect(client.estimateTransactionFees).not.toHaveBeenCalled(); + }); + + it('submits through the SDK provider path and returns the captured EVM hash', async () => { + const evmTxHash = `0x${'b'.repeat(64)}` as const; + const injected = provider(evmTxHash); + let sdkProvider: typeof injected | undefined; + const client = { + writeContract: vi.fn(async () => { + await sdkProvider?.request({ + method: 'eth_sendTransaction', + params: [{ to: `0x${'3'.repeat(40)}` }], + }); + return `0x${'c'.repeat(64)}`; + }), + }; + mocks.createClient.mockImplementation((config) => { + sdkProvider = config.provider; + return client; + }); + + const { createTransactionKit } = await import('../src/index'); + const kit = createTransactionKit({ + chain, + provider: injected, + account: `0x${'1'.repeat(40)}`, + }); + const quote = { + distribution: distribution(), + feeValue: 350n, + userValue: 11n, + total: 361n, + breakdown: { + timeUnitFees: 30n, + executionBudget: 300n, + messageFees: 20n, + }, + caps: { + genPerTimeUnit: 3n, + storagePrice: 4n, + receiptPrice: 5n, + }, + refundable: true, + } as const; + + const result = await kit.submit(quote, { + kind: 'write', + address: `0x${'2'.repeat(40)}`, + method: 'store', + args: ['x'], + }); + + expect(client.writeContract).toHaveBeenCalledWith({ + fees: { + distribution: quote.distribution, + feeValue: 350n, + }, + value: 11n, + address: `0x${'2'.repeat(40)}`, + functionName: 'store', + args: ['x'], + }); + expect(injected.request).toHaveBeenCalledWith({ + method: 'eth_sendTransaction', + params: [{ to: `0x${'3'.repeat(40)}` }], + }); + expect(result).toEqual({ + genlayerTxId: `0x${'c'.repeat(64)}`, + evmTxHash, + }); + }); + + it('tracks submitted to decided and maps successful transactions', async () => { + const client = { + getTransaction: vi.fn(async () => ({ + statusName: 'ACCEPTED', + txExecutionResultName: 'FINISHED_WITH_RETURN', + txId: `0x${'d'.repeat(64)}`, + })), + }; + mocks.createClient.mockReturnValue(client); + + const { createTransactionKit } = await import('../src/index'); + const kit = createTransactionKit({ + chain, + provider: provider(), + account: `0x${'1'.repeat(40)}`, + }); + const updates: unknown[] = []; + + const final = await kit.track( + `0x${'d'.repeat(64)}`, + (status) => updates.push(status), + { until: 'decided' }, + ); + + expect(updates).toMatchObject([ + { phase: 'submitted' }, + { + phase: 'decided', + statusName: 'ACCEPTED', + executionResultName: 'FINISHED_WITH_RETURN', + successful: true, + }, + ]); + expect(final.successful).toBe(true); + }); + + it('does not mark UNDETERMINED plus FINISHED_WITH_RETURN as successful', async () => { + const client = { + getTransaction: vi.fn(async () => ({ + statusName: 'UNDETERMINED', + txExecutionResultName: 'FINISHED_WITH_RETURN', + txId: `0x${'e'.repeat(64)}`, + })), + }; + mocks.createClient.mockReturnValue(client); + + const { createTransactionKit } = await import('../src/index'); + const kit = createTransactionKit({ + chain, + provider: provider(), + account: `0x${'1'.repeat(40)}`, + }); + + const final = await kit.track( + `0x${'e'.repeat(64)}`, + () => undefined, + { until: 'decided' }, + ); + + expect(final).toMatchObject({ + phase: 'decided', + statusName: 'UNDETERMINED', + executionResultName: 'FINISHED_WITH_RETURN', + successful: false, + }); + }); + + it('returns a stable verification hash for identical quotes', async () => { + mocks.createClient.mockReturnValue({}); + + const { createTransactionKit } = await import('../src/index'); + const kit = createTransactionKit({ + chain, + provider: provider(), + account: `0x${'1'.repeat(40)}`, + }); + const quote = { + distribution: distribution(), + feeValue: 350n, + userValue: 0n, + total: 350n, + breakdown: { + timeUnitFees: 30n, + executionBudget: 300n, + messageFees: 20n, + }, + caps: { + genPerTimeUnit: 3n, + storagePrice: 4n, + receiptPrice: 5n, + }, + refundable: true, + } as const; + const tx = { + kind: 'deploy', + code: 'class Contract: pass', + args: [], + } as const; + + const first = kit.verification(quote, tx); + const second = kit.verification(quote, tx); + + expect(first.feeConfigHash).toBe(second.feeConfigHash); + expect(first.feeConfigHash).toMatch(/^0x[0-9a-f]{64}$/u); + expect(first.summary.total).toBe('350'); + }); +}); diff --git a/packages/transaction-kit/tsconfig.json b/packages/transaction-kit/tsconfig.json new file mode 100644 index 0000000..d3ab6b9 --- /dev/null +++ b/packages/transaction-kit/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": false, + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": false, + "outDir": "dist", + "types": ["vitest/globals"] + }, + "include": ["src", "test", "vitest.config.ts"] +} diff --git a/packages/transaction-kit/vitest.config.ts b/packages/transaction-kit/vitest.config.ts new file mode 100644 index 0000000..014f97e --- /dev/null +++ b/packages/transaction-kit/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + environment: 'node', + globals: true, + }, +}); diff --git a/support/ci/ACTIVE_DEV_BRANCH b/support/ci/ACTIVE_DEV_BRANCH new file mode 100644 index 0000000..f18752c --- /dev/null +++ b/support/ci/ACTIVE_DEV_BRANCH @@ -0,0 +1 @@ +v0.2-dev diff --git a/yarn.lock b/yarn.lock index fbc1164..357714c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1683,6 +1683,349 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/aix-ppc64@npm:0.27.7" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm64@npm:0.27.7" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm@npm:0.27.7" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-x64@npm:0.27.7" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-arm64@npm:0.27.7" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-x64@npm:0.27.7" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-arm64@npm:0.27.7" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-x64@npm:0.27.7" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm64@npm:0.27.7" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm@npm:0.27.7" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ia32@npm:0.27.7" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-loong64@npm:0.27.7" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-mips64el@npm:0.27.7" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ppc64@npm:0.27.7" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-riscv64@npm:0.27.7" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-s390x@npm:0.27.7" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-x64@npm:0.27.7" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-arm64@npm:0.27.7" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-x64@npm:0.27.7" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-arm64@npm:0.27.7" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-x64@npm:0.27.7" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openharmony-arm64@npm:0.27.7" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/sunos-x64@npm:0.27.7" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-arm64@npm:0.27.7" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-ia32@npm:0.27.7" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-x64@npm:0.27.7" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.1 resolution: "@eslint-community/eslint-utils@npm:4.4.1" @@ -1881,6 +2224,19 @@ __metadata: languageName: node linkType: hard +"@genlayer/transaction-kit@workspace:packages/transaction-kit": + version: 0.0.0-use.local + resolution: "@genlayer/transaction-kit@workspace:packages/transaction-kit" + dependencies: + ethers: ^6.13.5 + genlayer-js: "github:genlayerlabs/genlayer-js#v2-dev" + rimraf: ^3.0.2 + tsup: ^8.2.4 + typescript: ^5.6.2 + vitest: ^2.1.1 + languageName: unknown + linkType: soft + "@graphql-codegen/add@npm:^3.2.3": version: 3.2.3 resolution: "@graphql-codegen/add@npm:3.2.3" @@ -2492,6 +2848,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.2": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.0 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.8 resolution: "@jridgewell/gen-mapping@npm:0.3.8" @@ -2534,6 +2900,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: c2e36e67971f719a8a3a85ef5a5f580622437cc723c35d03ebd0c9c0b06418700ef006f58af742791f71f6a4fc68fcfaf1f6a74ec2f9a3332860e9373459dae7 + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:0.3.9": version: 0.3.9 resolution: "@jridgewell/trace-mapping@npm:0.3.9" @@ -4485,6 +4858,181 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.61.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-android-arm64@npm:4.61.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.61.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.61.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.61.1" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.61.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.61.1" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.61.1" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.61.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.61.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-gnu@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.61.1" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-musl@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-loong64-musl@npm:4.61.1" + conditions: os=linux & cpu=loong64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.61.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-musl@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.61.1" + conditions: os=linux & cpu=ppc64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.61.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.61.1" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.61.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.61.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.61.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-openbsd-x64@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-openbsd-x64@npm:4.61.1" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.61.1" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.61.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.61.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-gnu@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.61.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.61.1": + version: 4.61.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.61.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -5375,6 +5923,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.9, @types/estree@npm:^1.0.0": + version: 1.0.9 + resolution: "@types/estree@npm:1.0.9" + checksum: 752c0afee3ec82b8e24484bf6a27dfa093bbf3de4ef1c20ed0364fb6ad2c0c7971e7504ed9a7aaff103a47e2d945ce7a17f74951743dd944782a0735f53170de + languageName: node + linkType: hard + "@types/get-port@npm:^3.2.0": version: 3.2.0 resolution: "@types/get-port@npm:3.2.0" @@ -5984,6 +6539,87 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:2.1.9": + version: 2.1.9 + resolution: "@vitest/expect@npm:2.1.9" + dependencies: + "@vitest/spy": 2.1.9 + "@vitest/utils": 2.1.9 + chai: ^5.1.2 + tinyrainbow: ^1.2.0 + checksum: a234f96dd42c76e20af68b2ad2f00b80a3873501d5daa524bf1405b344e86123716b925f976d8104fd242bfbd0d9cf7084d0eb4a690097e6e5db456d220ed67a + languageName: node + linkType: hard + +"@vitest/mocker@npm:2.1.9": + version: 2.1.9 + resolution: "@vitest/mocker@npm:2.1.9" + dependencies: + "@vitest/spy": 2.1.9 + estree-walker: ^3.0.3 + magic-string: ^0.30.12 + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 17de391acc4d899f15356b45cde8202e5d5ca4517c32c0c9dcf32ce0660501773fdc29675b4f7d48c1579a560ac41f8f5181ebe41a7daf675f561d611e8e30dc + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.1.9, @vitest/pretty-format@npm:^2.1.9": + version: 2.1.9 + resolution: "@vitest/pretty-format@npm:2.1.9" + dependencies: + tinyrainbow: ^1.2.0 + checksum: 33f7ff0a9d356ddd6534390a0aea260dc04a3022a94901c87d141bacf71d2b3fff2e3bf08a55dd424c5355fd3b41656cb7871c76372fef45ffac1ea89d0dc508 + languageName: node + linkType: hard + +"@vitest/runner@npm:2.1.9": + version: 2.1.9 + resolution: "@vitest/runner@npm:2.1.9" + dependencies: + "@vitest/utils": 2.1.9 + pathe: ^1.1.2 + checksum: d8aaadc98bcbe1ee7c832a7d619d3c77d3c67536f10b80a3106d9d6e03ecc0f5467ef7bd4a65a07fe924cc166fe7415d637b2b08ef71e1a208a250543f9f3545 + languageName: node + linkType: hard + +"@vitest/snapshot@npm:2.1.9": + version: 2.1.9 + resolution: "@vitest/snapshot@npm:2.1.9" + dependencies: + "@vitest/pretty-format": 2.1.9 + magic-string: ^0.30.12 + pathe: ^1.1.2 + checksum: fb693dea59709c9df8660e5948c7971d2c3ce74212eafa7d542a578bbb8aed203dc03129dd5e476251e1946b50432e79a4fd59069fd4f950283e188167b9496d + languageName: node + linkType: hard + +"@vitest/spy@npm:2.1.9": + version: 2.1.9 + resolution: "@vitest/spy@npm:2.1.9" + dependencies: + tinyspy: ^3.0.2 + checksum: f9279488b5d2a27800e33e8fe51cc685b2a0db49d30b80b2b0cc924f8b1736eb520459c6e8bd09fa4457f5bb86ff073e7bdcf60d36452c11a8a8f9cbc8030237 + languageName: node + linkType: hard + +"@vitest/utils@npm:2.1.9": + version: 2.1.9 + resolution: "@vitest/utils@npm:2.1.9" + dependencies: + "@vitest/pretty-format": 2.1.9 + loupe: ^3.1.2 + tinyrainbow: ^1.2.0 + checksum: b24fb9c6765801f2e0578ad5c32fadf9541a833301eaed2877a427096cf05214244b361f94eda80be2b9c841f58ae3c67d37dedc5a902b2cb44041979bae4d8f + languageName: node + linkType: hard + "@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/ast@npm:1.14.1" @@ -6288,6 +6924,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.16.0": + version: 8.16.0 + resolution: "acorn@npm:8.16.0" + bin: + acorn: bin/acorn + checksum: bbfa466cd0dbd18b4460a85e9d0fc2f35db999380892403c573261beda91f23836db2aa71fd3ae65e94424ad14ff8e2b7bd37c7a2624278fd89137cd6e448c41 + languageName: node + linkType: hard + "address@npm:1.2.2, address@npm:^1.0.1, address@npm:^1.1.2": version: 1.2.2 resolution: "address@npm:1.2.2" @@ -6487,6 +7132,13 @@ __metadata: languageName: node linkType: hard +"any-promise@npm:^1.0.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de + languageName: node + linkType: hard + "anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" @@ -6730,6 +7382,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: a0789dd882211b87116e81e2648ccb7f60340b34f19877dd020b39ebb4714e475eb943e14ba3e22201c221ef6645b7bfe10297e76b6ac95b48a9898c1211ce66 + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.8": version: 0.0.8 resolution: "ast-types-flow@npm:0.0.8" @@ -7620,6 +8279,17 @@ __metadata: languageName: node linkType: hard +"bundle-require@npm:^5.1.0": + version: 5.1.0 + resolution: "bundle-require@npm:5.1.0" + dependencies: + load-tsconfig: ^0.2.3 + peerDependencies: + esbuild: ">=0.18" + checksum: 78a972b2d83b212f8bf3919bf806cc0846db4fb2182eb85770d4caec459f3b78053477acffb7396c6c15ceb7e132f22b18c1b430388d0f1b335a3b73b5012a1c + languageName: node + linkType: hard + "busboy@npm:^1.0.0": version: 1.6.0 resolution: "busboy@npm:1.6.0" @@ -7643,6 +8313,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a + languageName: node + linkType: hard + "cacache@npm:^18.0.0": version: 18.0.4 resolution: "cacache@npm:18.0.4" @@ -7845,6 +8522,19 @@ __metadata: languageName: node linkType: hard +"chai@npm:^5.1.2": + version: 5.3.3 + resolution: "chai@npm:5.3.3" + dependencies: + assertion-error: ^2.0.1 + check-error: ^2.1.1 + deep-eql: ^5.0.1 + loupe: ^3.1.0 + pathval: ^2.0.0 + checksum: bc4091f1cccfee63f6a3d02ce477fe847f5c57e747916a11bd72675c9459125084e2e55dc2363ee2b82b088a878039ee7ee27c75d6d90f7de9202bf1b12ce573 + languageName: node + linkType: hard + "chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -7946,6 +8636,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^2.1.1": + version: 2.1.3 + resolution: "check-error@npm:2.1.3" + checksum: f1868d3db60f5a7da92e140ccf33e9152bf6124161fa9b7a4ae8eafdb05e66e1f13570401e56f314f037b0f1b71eaf38ad0c7256310d82c6105e9d85ded0f202 + languageName: node + linkType: hard + "chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": version: 3.6.0 resolution: "chokidar@npm:3.6.0" @@ -7965,6 +8662,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^4.0.3": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: ^4.0.1 + checksum: a8765e452bbafd04f3f2fad79f04222dd65f43161488bb6014a41099e6ca18d166af613d59a90771908c1c823efa3f46ba36b86ac50b701c20c1b9908c5fe36e + languageName: node + linkType: hard + "chownr@npm:^1.1.1": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -8277,6 +8983,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^4.0.0": + version: 4.1.1 + resolution: "commander@npm:4.1.1" + checksum: d7b9913ff92cae20cb577a4ac6fcc121bd6223319e54a40f51a14740a681ad5c574fd29a57da478a5f234a6fa6c52cbf0b7c641353e03c648b1ae85ba670b977 + languageName: node + linkType: hard + "commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" @@ -8367,6 +9080,13 @@ __metadata: languageName: node linkType: hard +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 5c7718ab22cf9e35a31c21ef124156076ae8c9dc65e6463d54961caf5a1d529284485a0fdf83fd23b27329f3b75b0c8c07d2e36c699f5151a2efe903343f976a + languageName: node + linkType: hard + "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -8398,6 +9118,13 @@ __metadata: languageName: node linkType: hard +"consola@npm:^3.4.0": + version: 3.4.2 + resolution: "consola@npm:3.4.2" + checksum: 32d1339e0505842f033ca34cb4572a841281caa367f438b785d3b284ab2a06134f009e605908480402c5f57f56c1e3210090c37e6417923416f76ce730d39361 + languageName: node + linkType: hard + "console-browserify@npm:^1.1.0, console-browserify@npm:^1.2.0": version: 1.2.0 resolution: "console-browserify@npm:1.2.0" @@ -9012,6 +9739,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.4.0": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 4805abd570e601acdca85b6aa3757186084a45cff9b2fa6eee1f3b173caa776b45f478b2a71a572d616d2010cea9211d0ac4a02a610e4c18ac4324bde3760834 + languageName: node + linkType: hard + "debug@npm:~4.3.1, debug@npm:~4.3.2, debug@npm:~4.3.4": version: 4.3.7 resolution: "debug@npm:4.3.7" @@ -9059,6 +9798,13 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 6aaaadb4c19cbce42e26b2bbe5bd92875f599d2602635dc97f0294bae48da79e89470aedee05f449e0ca8c65e9fd7e7872624d1933a1db02713d99c2ca8d1f24 + languageName: node + linkType: hard + "deep-equal@npm:^2.0.5": version: 2.2.3 resolution: "deep-equal@npm:2.2.3" @@ -9887,6 +10633,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.5.4": + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 7858bb76ae387fdbf8a6fccc951bf18919768309850587553eca34698b9193fbc65fab03d3d9f69163d860321fbf66adf89d5821e7f4148c7cb7d7b997259211 + languageName: node + linkType: hard + "es-object-atoms@npm:^1.0.0": version: 1.0.0 resolution: "es-object-atoms@npm:1.0.0" @@ -9980,6 +10733,175 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": 0.21.5 + "@esbuild/android-arm": 0.21.5 + "@esbuild/android-arm64": 0.21.5 + "@esbuild/android-x64": 0.21.5 + "@esbuild/darwin-arm64": 0.21.5 + "@esbuild/darwin-x64": 0.21.5 + "@esbuild/freebsd-arm64": 0.21.5 + "@esbuild/freebsd-x64": 0.21.5 + "@esbuild/linux-arm": 0.21.5 + "@esbuild/linux-arm64": 0.21.5 + "@esbuild/linux-ia32": 0.21.5 + "@esbuild/linux-loong64": 0.21.5 + "@esbuild/linux-mips64el": 0.21.5 + "@esbuild/linux-ppc64": 0.21.5 + "@esbuild/linux-riscv64": 0.21.5 + "@esbuild/linux-s390x": 0.21.5 + "@esbuild/linux-x64": 0.21.5 + "@esbuild/netbsd-x64": 0.21.5 + "@esbuild/openbsd-x64": 0.21.5 + "@esbuild/sunos-x64": 0.21.5 + "@esbuild/win32-arm64": 0.21.5 + "@esbuild/win32-ia32": 0.21.5 + "@esbuild/win32-x64": 0.21.5 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 2911c7b50b23a9df59a7d6d4cdd3a4f85855787f374dce751148dbb13305e0ce7e880dde1608c2ab7a927fc6cec3587b80995f7fc87a64b455f8b70b55fd8ec1 + languageName: node + linkType: hard + +"esbuild@npm:^0.27.0": + version: 0.27.7 + resolution: "esbuild@npm:0.27.7" + dependencies: + "@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 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: ea7ee3c039b83caae1b59bb7ae2db9c6bceb21bccb033dbc4c0c45cb159554ead4289492ad874857bbca7f6e37bf74e04e892544de2b3c5c7888c8ef8beaf2f7 + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -10731,6 +11653,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": ^1.0.0 + checksum: a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -10894,6 +11825,13 @@ __metadata: languageName: node linkType: hard +"expect-type@npm:^1.1.0": + version: 1.3.0 + resolution: "expect-type@npm:1.3.0" + checksum: 60476b4f4c0c88bf24db0735faa7d1d0c9120c21e5b78781c0fea0d4a95838f2db0c919a055aa4bb185ccbf38e37fa3000d3bb05500ceafcc7c469955c5a4f84 + languageName: node + linkType: hard + "expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" @@ -11137,6 +12075,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: bd537daa9d3cd53887eed35efa0eab2dbb1ca408790e10e024120e7a36c6e9ae2b33710cb8381e35def01bc9c1d7eaba746f886338413e68ff6ebaee07b9a6e8 + languageName: node + linkType: hard + "fecha@npm:^4.2.0": version: 4.2.3 resolution: "fecha@npm:4.2.3" @@ -11281,6 +12231,17 @@ __metadata: languageName: node linkType: hard +"fix-dts-default-cjs-exports@npm:^1.0.0": + version: 1.0.1 + resolution: "fix-dts-default-cjs-exports@npm:1.0.1" + dependencies: + magic-string: ^0.30.17 + mlly: ^1.7.4 + rollup: ^4.34.8 + checksum: 3324418bb63c93b6b22a808e242d220caba804860c24218b2912abc4525525334fcdcb62d22be6472a8d84ee2ad4165bc79554140c3369eb11d23220cdd986ce + languageName: node + linkType: hard + "flat-cache@npm:^3.0.4": version: 3.2.0 resolution: "flat-cache@npm:3.2.0" @@ -11534,7 +12495,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -11544,7 +12505,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin": +"fsevents@patch:fsevents@^2.3.2#~builtin, fsevents@patch:fsevents@~2.3.2#~builtin, fsevents@patch:fsevents@~2.3.3#~builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=18f3a7" dependencies: @@ -12059,6 +13020,17 @@ __metadata: languageName: node linkType: hard +"genlayer-js@github:genlayerlabs/genlayer-js#v2-dev": + version: 1.1.8 + resolution: "genlayer-js@https://github.com/genlayerlabs/genlayer-js.git#commit=2af6928e2587091fb33f5f703160c8a160606048" + dependencies: + eslint-plugin-import: ^2.30.0 + typescript-parsec: ^0.3.4 + viem: ^2.29.0 + checksum: 3bb6209639cfd8f00610fc45ab8916e2ac6bfa874625ded1f4a1c07468bbf6cb9716a8024dc271aee4dc37b3716fc1ff4ecb58ec47546d14944282b8caf77da3 + languageName: node + linkType: hard + "genlayer-js@npm:1.1.8": version: 1.1.8 resolution: "genlayer-js@npm:1.1.8" @@ -14353,6 +15325,13 @@ __metadata: languageName: node linkType: hard +"joycon@npm:^3.1.1": + version: 3.1.1 + resolution: "joycon@npm:3.1.1" + checksum: 8003c9c3fc79c5c7602b1c7e9f7a2df2e9916f046b0dbad862aa589be78c15734d11beb9fe846f5e06138df22cb2ad29961b6a986ba81c4920ce2b15a7f11067 + languageName: node + linkType: hard + "js-sha3@npm:^0.5.7": version: 0.5.7 resolution: "js-sha3@npm:0.5.7" @@ -14659,6 +15638,13 @@ __metadata: languageName: node linkType: hard +"lilconfig@npm:^3.1.1": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 644eb10830350f9cdc88610f71a921f510574ed02424b57b0b3abb66ea725d7a082559552524a842f4e0272c196b88dfe1ff7d35ffcc6f45736777185cd67c9a + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -14739,6 +15725,13 @@ __metadata: languageName: node linkType: hard +"load-tsconfig@npm:^0.2.3": + version: 0.2.5 + resolution: "load-tsconfig@npm:0.2.5" + checksum: 631740833c4a7157bb7b6eeae6e1afb6a6fac7416b7ba91bd0944d5c5198270af2d68bf8347af3cc2ba821adc4d83ef98f66278bd263bc284c863a09ec441503 + languageName: node + linkType: hard + "loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" @@ -14932,6 +15925,13 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0, loupe@npm:^3.1.2": + version: 3.2.1 + resolution: "loupe@npm:3.2.1" + checksum: 3ce9ecc5b2c56ffc073bf065ad3a4644cccce3eac81e61a8732e9c8ebfe05513ed478592d25f9dba24cfe82766913be045ab384c04711c7c6447deaf800ad94c + languageName: node + linkType: hard + "lower-case-first@npm:^2.0.2": version: 2.0.2 resolution: "lower-case-first@npm:2.0.2" @@ -15031,6 +16031,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.12, magic-string@npm:^0.30.17": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.5 + checksum: 4ff76a4e8d439431cf49f039658751ed351962d044e5955adc257489569bd676019c906b631f86319217689d04815d7d064ee3ff08ab82ae65b7655a7e82a414 + languageName: node + linkType: hard + "make-dir@npm:^3.0.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -15569,6 +16578,18 @@ __metadata: languageName: node linkType: hard +"mlly@npm:^1.7.4": + version: 1.8.2 + resolution: "mlly@npm:1.8.2" + dependencies: + acorn: ^8.16.0 + pathe: ^2.0.3 + pkg-types: ^1.3.1 + ufo: ^1.6.3 + checksum: b934402379921eb0bff9a67640002cde244bf2a163cef9543a39c2ded2345cf952fd83475f087fb9fd0dc2f4a4fe58ba40697bf12145f9ba68208a880bb8232a + languageName: node + linkType: hard + "module-deps@npm:^6.2.3": version: 6.2.3 resolution: "module-deps@npm:6.2.3" @@ -15680,6 +16701,17 @@ __metadata: languageName: node linkType: hard +"mz@npm:^2.7.0": + version: 2.7.0 + resolution: "mz@npm:2.7.0" + dependencies: + any-promise: ^1.0.0 + object-assign: ^4.0.1 + thenify-all: ^1.0.0 + checksum: 8427de0ece99a07e9faed3c0c6778820d7543e3776f9a84d22cf0ec0a8eb65f6e9aee9c9d353ff9a105ff62d33a9463c6ca638974cc652ee8140cd1e35951c87 + languageName: node + linkType: hard + "nanoid@npm:^3.1.31, nanoid@npm:^3.3.7, nanoid@npm:^3.3.8": version: 3.3.8 resolution: "nanoid@npm:3.3.8" @@ -15689,6 +16721,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.12": + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" + bin: + nanoid: bin/nanoid.cjs + checksum: 38699257447dc59e21e73e0510d0dfb16b7a610d9ca80633d5c3a68f9b4298c990513d30404ca8f163c2d03225ee01695ff8898bea6179183f38f0477b7635ac + languageName: node + linkType: hard + "napi-build-utils@npm:^1.0.1": version: 1.0.2 resolution: "napi-build-utils@npm:1.0.2" @@ -16137,7 +17178,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": +"object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f @@ -16785,6 +17826,27 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^1.1.2": + version: 1.1.2 + resolution: "pathe@npm:1.1.2" + checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 + languageName: node + linkType: hard + +"pathe@npm:^2.0.1, pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 0602bdd4acb54d91044e0c56f1fb63467ae7d44ab3afea1f797947b0eb2b4d1d91cf0d58d065fdb0a8ab0c4acbbd8d3a5b424983eaf10dd5285d37a16f6e3ee9 + languageName: node + linkType: hard + +"pathval@npm:^2.0.0": + version: 2.0.1 + resolution: "pathval@npm:2.0.1" + checksum: 280e71cfd86bb5d7ff371fe2752997e5fa82901fcb209abf19d4457b7814f1b4a17845dfb17bd28a596ccdb0ecea178720ce23dacfa9c841f37804b700647810 + languageName: node + linkType: hard + "pause-stream@npm:^0.0.11": version: 0.0.11 resolution: "pause-stream@npm:0.0.11" @@ -16842,6 +17904,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 76b387b5157951422fa6049a96bdd1695e39dd126cd99df34d343638dc5cdb8bcdc83fff288c23eddcf7c26657c35e3173d4d5f488c4f28b889b314472e0a662 + languageName: node + linkType: hard + "pify@npm:^5.0.0": version: 5.0.0 resolution: "pify@npm:5.0.0" @@ -16849,6 +17918,13 @@ __metadata: languageName: node linkType: hard +"pirates@npm:^4.0.1": + version: 4.0.7 + resolution: "pirates@npm:4.0.7" + checksum: 3dcbaff13c8b5bc158416feb6dc9e49e3c6be5fddc1ea078a05a73ef6b85d79324bbb1ef59b954cdeff000dbf000c1d39f32dc69310c7b78fbada5171b583e40 + languageName: node + linkType: hard + "pirates@npm:^4.0.4": version: 4.0.6 resolution: "pirates@npm:4.0.6" @@ -16865,6 +17941,17 @@ __metadata: languageName: node linkType: hard +"pkg-types@npm:^1.3.1": + version: 1.3.1 + resolution: "pkg-types@npm:1.3.1" + dependencies: + confbox: ^0.1.8 + mlly: ^1.7.4 + pathe: ^2.0.1 + checksum: 4fa4edb2bb845646cdbd04c5c6bc43cdbc8f02ed4d1c28bfcafb6e65928aece789bcf1335e4cac5f65dfdc376e4bd7435bd509a35e9ec73ef2c076a1b88e289c + languageName: node + linkType: hard + "pkg-up@npm:^3.1.0": version: 3.1.0 resolution: "pkg-up@npm:3.1.0" @@ -16978,6 +18065,29 @@ __metadata: languageName: node linkType: hard +"postcss-load-config@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-load-config@npm:6.0.1" + dependencies: + lilconfig: ^3.1.1 + 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 + checksum: 701061264cce7646e53e4cecd14aa95432a9bd508f30520a31dfa4c86fe9252d5d8d0204fdbfbddc1559c9b8791556e9c4b92c56070f5fca0a6c60e5ee9ad0fd + languageName: node + linkType: hard + "postcss-loader@npm:^5.3.0": version: 5.3.0 resolution: "postcss-loader@npm:5.3.0" @@ -17305,6 +18415,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.43": + version: 8.5.15 + resolution: "postcss@npm:8.5.15" + dependencies: + nanoid: ^3.3.12 + picocolors: ^1.1.1 + source-map-js: ^1.2.1 + checksum: 82e046d5bd0c537e7bcae1b97ec366968cac4ebdbd38773b69a2a4ad437f26641643a48f120317dd167199ac718ff8a0ab7dd102258430e4c919daaef0e57904 + languageName: node + linkType: hard + "prebuild-install@npm:^7.1.1": version: 7.1.2 resolution: "prebuild-install@npm:7.1.2" @@ -17888,6 +19009,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 3242ee125422cb7c0e12d51452e993f507e6ed3d8c490bc8bf3366c5cdd09167562224e429b13e9cb2b98d4b8b2b11dc100d3c73883aa92d657ade5a21ded004 + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -18369,6 +19497,96 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.20.0, rollup@npm:^4.34.8": + version: 4.61.1 + resolution: "rollup@npm:4.61.1" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.61.1 + "@rollup/rollup-android-arm64": 4.61.1 + "@rollup/rollup-darwin-arm64": 4.61.1 + "@rollup/rollup-darwin-x64": 4.61.1 + "@rollup/rollup-freebsd-arm64": 4.61.1 + "@rollup/rollup-freebsd-x64": 4.61.1 + "@rollup/rollup-linux-arm-gnueabihf": 4.61.1 + "@rollup/rollup-linux-arm-musleabihf": 4.61.1 + "@rollup/rollup-linux-arm64-gnu": 4.61.1 + "@rollup/rollup-linux-arm64-musl": 4.61.1 + "@rollup/rollup-linux-loong64-gnu": 4.61.1 + "@rollup/rollup-linux-loong64-musl": 4.61.1 + "@rollup/rollup-linux-ppc64-gnu": 4.61.1 + "@rollup/rollup-linux-ppc64-musl": 4.61.1 + "@rollup/rollup-linux-riscv64-gnu": 4.61.1 + "@rollup/rollup-linux-riscv64-musl": 4.61.1 + "@rollup/rollup-linux-s390x-gnu": 4.61.1 + "@rollup/rollup-linux-x64-gnu": 4.61.1 + "@rollup/rollup-linux-x64-musl": 4.61.1 + "@rollup/rollup-openbsd-x64": 4.61.1 + "@rollup/rollup-openharmony-arm64": 4.61.1 + "@rollup/rollup-win32-arm64-msvc": 4.61.1 + "@rollup/rollup-win32-ia32-msvc": 4.61.1 + "@rollup/rollup-win32-x64-gnu": 4.61.1 + "@rollup/rollup-win32-x64-msvc": 4.61.1 + "@types/estree": 1.0.9 + fsevents: ~2.3.2 + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loong64-gnu": + optional: true + "@rollup/rollup-linux-loong64-musl": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-musl": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openbsd-x64": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 2fe75a574dd6364b37b00b4914ab37c7adda3aef9f6afb947412c019386a58bd66cf9ebb564488e7fa158111c0a38ead5a3557475ad3d153c05e668181da55c2 + languageName: node + linkType: hard + "run-async@npm:^2.4.0": version: 2.4.1 resolution: "run-async@npm:2.4.1" @@ -18813,6 +20031,13 @@ __metadata: languageName: node linkType: hard +"siginfo@npm:^2.0.0": + version: 2.0.0 + resolution: "siginfo@npm:2.0.0" + checksum: 8aa5a98640ca09fe00d74416eca97551b3e42991614a3d1b824b115fc1401543650914f651ab1311518177e4d297e80b953f4cd4cd7ea1eabe824e8f2091de01 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -19117,6 +20342,13 @@ __metadata: languageName: node linkType: hard +"source-map@npm:^0.7.6": + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 932f4a2390aa7100e91357d88cc272de984ad29139ac09eedfde8cc78d46da35f389065d0c5343c5d71d054a6ebd4939a8c0f2c98d5df64fe97bb8a730596c2d + languageName: node + linkType: hard + "source-map@npm:~0.5.3": version: 0.5.7 resolution: "source-map@npm:0.5.7" @@ -19255,6 +20487,13 @@ __metadata: languageName: node linkType: hard +"stackback@npm:0.0.2": + version: 0.0.2 + resolution: "stackback@npm:0.0.2" + checksum: 2d4dc4e64e2db796de4a3c856d5943daccdfa3dd092e452a1ce059c81e9a9c29e0b9badba91b43ef0d5ff5c04ee62feb3bcc559a804e16faf447bac2d883aa99 + languageName: node + linkType: hard + "stackframe@npm:^1.3.4": version: 1.3.4 resolution: "stackframe@npm:1.3.4" @@ -19269,6 +20508,13 @@ __metadata: languageName: node linkType: hard +"std-env@npm:^3.8.0": + version: 3.10.0 + resolution: "std-env@npm:3.10.0" + checksum: 51d641b36b0fae494a546fb8446d39a837957fbf902c765c62bd12af8e50682d141c4087ca032f1192fa90330c4f6ff23fd6c9795324efacd1684e814471e0e0 + languageName: node + linkType: hard + "stop-iteration-iterator@npm:^1.0.0": version: 1.1.0 resolution: "stop-iteration-iterator@npm:1.1.0" @@ -19687,6 +20933,24 @@ __metadata: languageName: node linkType: hard +"sucrase@npm:^3.35.0": + version: 3.35.1 + resolution: "sucrase@npm:3.35.1" + 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 + checksum: 9a3ae3900f85ede60468bdaebc07a32691d5e44c80bb008734088dcde49cd0e05ead854786d90fbb6e63ed1c50592146cb50536321212773f6d72d1c85b2a51b + languageName: node + linkType: hard + "sudo-prompt@npm:^8.2.0": version: 8.2.5 resolution: "sudo-prompt@npm:8.2.5" @@ -19977,6 +21241,24 @@ __metadata: languageName: node linkType: hard +"thenify-all@npm:^1.0.0": + version: 1.6.0 + resolution: "thenify-all@npm:1.6.0" + dependencies: + thenify: ">= 3.1.0 < 4" + checksum: dba7cc8a23a154cdcb6acb7f51d61511c37a6b077ec5ab5da6e8b874272015937788402fd271fdfc5f187f8cb0948e38d0a42dcc89d554d731652ab458f5343e + languageName: node + linkType: hard + +"thenify@npm:>= 3.1.0 < 4": + version: 3.3.1 + resolution: "thenify@npm:3.3.1" + dependencies: + any-promise: ^1.0.0 + checksum: 84e1b804bfec49f3531215f17b4a6e50fd4397b5f7c1bccc427b9c656e1ecfb13ea79d899930184f78bc2f57285c54d9a50a590c8868f4f0cef5c1d9f898b05e + languageName: node + linkType: hard + "through2@npm:^2.0.0": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -20038,6 +21320,30 @@ __metadata: languageName: node linkType: hard +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 1ab00d7dfe0d1f127cbf00822bacd9024f7a50a3ecd1f354a8168e0b7d2b53a639a24414e707c27879d1adc0f5153141d51d76ebd7b4d37fe245e742e5d91fe8 + languageName: node + linkType: hard + +"tinyexec@npm:^0.3.1, tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: bd491923020610bdeadb0d8cf5d70e7cbad5a3201620fd01048c9bf3b31ffaa75c33254e1540e13b993ce4e8187852b0b5a93057bb598e7a57afa2ca2048a35c + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.11": + version: 0.2.17 + resolution: "tinyglobby@npm:0.2.17" + dependencies: + fdir: ^6.5.0 + picomatch: ^4.0.4 + checksum: 041e73eae568152c376551b21b8a27909d474166a8f405cdb0345991c50cf6afd0f878d7a387645d9c05d8ea2c9a55cc2fd2cfe6c5d5a5264770972b1adcad86 + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.9": version: 0.2.10 resolution: "tinyglobby@npm:0.2.10" @@ -20048,6 +21354,27 @@ __metadata: languageName: node linkType: hard +"tinypool@npm:^1.0.1": + version: 1.1.1 + resolution: "tinypool@npm:1.1.1" + checksum: 0258abe108df8be395a2cbdc8b4390c94908850250530f7bea83a129fa33d49a8c93246f76bf81cd458534abd81322f4d4cb3a40690254f8d9044ff449f328a8 + languageName: node + linkType: hard + +"tinyrainbow@npm:^1.2.0": + version: 1.2.0 + resolution: "tinyrainbow@npm:1.2.0" + checksum: d1e2cb5400032c0092be00e4a3da5450bea8b4fad58bfb5d3c58ca37ff5c5e252f7fcfb9af247914854af79c46014add9d1042fe044358c305a129ed55c8be35 + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.2": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 + languageName: node + linkType: hard + "title-case@npm:^3.0.3": version: 3.0.3 resolution: "title-case@npm:3.0.3" @@ -20113,6 +21440,15 @@ __metadata: languageName: node linkType: hard +"tree-kill@npm:^1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 49117f5f410d19c84b0464d29afb9642c863bc5ba40fcb9a245d474c6d5cc64d1b177a6e6713129eb346b40aebb9d4631d967517f9fbe8251c35b21b13cd96c7 + languageName: node + linkType: hard + "triple-beam@npm:^1.3.0": version: 1.4.1 resolution: "triple-beam@npm:1.4.1" @@ -20136,6 +21472,13 @@ __metadata: languageName: node linkType: hard +"ts-interface-checker@npm:^0.1.9": + version: 0.1.13 + resolution: "ts-interface-checker@npm:0.1.13" + checksum: 20c29189c2dd6067a8775e07823ddf8d59a33e2ffc47a1bd59a5cb28bb0121a2969a816d5e77eda2ed85b18171aa5d1c4005a6b88ae8499ec7cc49f78571cb5e + languageName: node + linkType: hard + "ts-jest@npm:^29.1.0": version: 29.2.5 resolution: "ts-jest@npm:29.2.5" @@ -20261,6 +21604,48 @@ __metadata: languageName: node linkType: hard +"tsup@npm:^8.2.4": + version: 8.5.1 + resolution: "tsup@npm:8.5.1" + 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 + 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 + bin: + tsup: dist/cli-default.js + tsup-node: dist/cli-node.js + checksum: 26435438bf8fd3ae49e61521d3f46ccf747dc4ca5c2f8bfa410dc952fbd00bc473b9be2e3ce8e74104d9e78d2eb0b298cb409d226fe658d51b72e647a8e04c16 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -20509,6 +21894,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.6.2": + version: 5.9.3 + resolution: "typescript@npm:5.9.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 0d0ffb84f2cd072c3e164c79a2e5a1a1f4f168e84cb2882ff8967b92afe1def6c2a91f6838fb58b168428f9458c57a2ba06a6737711fdd87a256bbe83e9a217f + languageName: node + linkType: hard + "typescript@patch:typescript@^4.7.4#~builtin": version: 4.9.5 resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=7ad353" @@ -20529,6 +21924,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@^5.6.2#~builtin": + version: 5.9.3 + resolution: "typescript@patch:typescript@npm%3A5.9.3#~builtin::version=5.9.3&hash=7ad353" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 8bb8d86819ac86a498eada254cad7fb69c5f74778506c700c2a712daeaff21d3a6f51fd0d534fe16903cb010d1b74f89437a3d02d4d0ff5ca2ba9a4660de8497 + languageName: node + linkType: hard + "ua-parser-js@npm:^1.0.35": version: 1.0.40 resolution: "ua-parser-js@npm:1.0.40" @@ -20538,6 +21943,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.6.3": + version: 1.6.4 + resolution: "ufo@npm:1.6.4" + checksum: 56d70ee0f55b47dd6e93fa10347164c8f73636aa63f306e742a70193ac870f01392c4ca1ac3742540f953cc31444bdd78acd69e241adb22a44141ad33a38f4cd + languageName: node + linkType: hard + "umd@npm:^3.0.0": version: 3.0.3 resolution: "umd@npm:3.0.3" @@ -20921,6 +22333,114 @@ __metadata: languageName: node linkType: hard +"vite-node@npm:2.1.9": + version: 2.1.9 + resolution: "vite-node@npm:2.1.9" + dependencies: + cac: ^6.7.14 + debug: ^4.3.7 + es-module-lexer: ^1.5.4 + pathe: ^1.1.2 + vite: ^5.0.0 + bin: + vite-node: vite-node.mjs + checksum: 716d37649834ecea547b43121ee89b2e4f9ca65ff6ce26214770ecfefe070b8c7245c9fdd0f92fb232d266e153629d04af9a4dc4fc350abfa521e5e46434b7b2 + languageName: node + linkType: hard + +"vite@npm:^5.0.0": + version: 5.4.21 + resolution: "vite@npm:5.4.21" + dependencies: + esbuild: ^0.21.3 + fsevents: ~2.3.3 + postcss: ^8.4.43 + rollup: ^4.20.0 + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 7177fa03cff6a382f225290c9889a0d0e944d17eab705bcba89b58558a6f7adfa1f47e469b88f42a044a0eb40c12a1bf68b3cb42abb5295d04f9d7d4dd320837 + languageName: node + linkType: hard + +"vitest@npm:^2.1.1": + version: 2.1.9 + resolution: "vitest@npm:2.1.9" + dependencies: + "@vitest/expect": 2.1.9 + "@vitest/mocker": 2.1.9 + "@vitest/pretty-format": ^2.1.9 + "@vitest/runner": 2.1.9 + "@vitest/snapshot": 2.1.9 + "@vitest/spy": 2.1.9 + "@vitest/utils": 2.1.9 + chai: ^5.1.2 + debug: ^4.3.7 + expect-type: ^1.1.0 + magic-string: ^0.30.12 + pathe: ^1.1.2 + std-env: ^3.8.0 + tinybench: ^2.9.0 + tinyexec: ^0.3.1 + tinypool: ^1.0.1 + tinyrainbow: ^1.2.0 + vite: ^5.0.0 + vite-node: 2.1.9 + why-is-node-running: ^2.3.0 + peerDependencies: + "@edge-runtime/vm": "*" + "@types/node": ^18.0.0 || >=20.0.0 + "@vitest/browser": 2.1.9 + "@vitest/ui": 2.1.9 + happy-dom: "*" + jsdom: "*" + peerDependenciesMeta: + "@edge-runtime/vm": + optional: true + "@types/node": + optional: true + "@vitest/browser": + optional: true + "@vitest/ui": + optional: true + happy-dom: + optional: true + jsdom: + optional: true + bin: + vitest: vitest.mjs + checksum: 20db77529f843930ef1626103c898b27528d6d68d6c44753ec823e318f26bbdeb3bc56e6fb80e3f1ecc34382107d32e1f4e709e23198f414fecc9298ab225fa8 + languageName: node + linkType: hard + "vm-browserify@npm:^1.0.0, vm-browserify@npm:^1.1.2": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" @@ -21198,6 +22718,18 @@ __metadata: languageName: node linkType: hard +"why-is-node-running@npm:^2.3.0": + version: 2.3.0 + resolution: "why-is-node-running@npm:2.3.0" + dependencies: + siginfo: ^2.0.0 + stackback: 0.0.2 + bin: + why-is-node-running: cli.js + checksum: 58ebbf406e243ace97083027f0df7ff4c2108baf2595bb29317718ef207cc7a8104e41b711ff65d6fa354f25daa8756b67f2f04931a4fd6ba9d13ae8197496fb + languageName: node + linkType: hard + "widest-line@npm:^3.1.0": version: 3.1.0 resolution: "widest-line@npm:3.1.0"