diff --git a/.agents/README.md b/.agents/README.md index 7155934b..3d3e4c3f 100644 --- a/.agents/README.md +++ b/.agents/README.md @@ -2,6 +2,14 @@ Project-specific context for AI coding agents. See also [.cursor/skills/multisig/SKILL.md](../.cursor/skills/multisig/SKILL.md) for the multisig Cursor skill. +## Specs & PRDs + +Specs live in the vault, not this repo. The maintainer keeps a document-driven dev base (an Obsidian vault) where features are specified as **PRDs** before they are built; concept and entity notes there are the upstream source for data models and flows. + +- Before building a vault-specced feature, read its **PRD** (and the concept/entity notes it links) for scope, data model, and acceptance criteria. An entity note is the spec for its Prisma model. +- Implementing PRs should **cite the PRD id** in the description (e.g. "Implements PRD-001"), so code stays traceable to the document that produced it. +- The vault is the maintainer's local knowledge base; if you don't have access, ask for the relevant PRD's contents rather than guessing scope. + ## Stack and layout - **Stack**: Next.js (Pages Router), TypeScript, tRPC, Prisma, PostgreSQL, Cardano (Mesh SDK). Auth: NextAuth (user) + JWT (API: wallet sign-in or bot keys). diff --git a/.env.example b/.env.example index 18a3a66a..6369a1d8 100644 --- a/.env.example +++ b/.env.example @@ -19,6 +19,12 @@ JWT_SECRET="your-jwt-secret-minimum-32-characters-long" # Get your JWT token from https://app.pinata.cloud/ PINATA_JWT="your-pinata-jwt-token" +# Optional: dedicated Pinata IPFS gateway origin (e.g. https://.mypinata.cloud). +# IPFS reads resolve through /api/ipfs/resolve, which tries this gateway first +# (our pinned content) before falling back to public gateways, and new uploads +# return a URL on this gateway instead of the frequently-504ing public ipfs.io. +# NEXT_PUBLIC_PINATA_GATEWAY_URL="https://your-gateway.mypinata.cloud" + # GitHub Personal Access Token # Create one at https://github.com/settings/tokens # GITHUB_TOKEN="your-github-token" (Optional - for GitHub issue creation) @@ -33,6 +39,12 @@ NEXT_PUBLIC_BLOCKFROST_API_KEY_PREPROD="your-blockfrost-preprod-api-key" # Used to authenticate the balance snapshot batch endpoint # SNAPSHOT_AUTH_TOKEN="your-snapshot-auth-token" +# Canonical public URL of the deployment. +# Used for SEO: canonical tags, Open Graph / Twitter URLs, robots.txt and the +# sitemap. Defaults to the production domain when unset; set this on preview or +# self-hosted environments so links point at the right origin. +# NEXT_PUBLIC_SITE_URL="https://multisig.meshjs.dev" + # Optional: Skip environment validation during builds # Useful for Docker builds where env vars are set at runtime # SKIP_ENV_VALIDATION=true diff --git a/ROADMAP.md b/ROADMAP.md index 7374f8b1..a4abe6fc 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -42,59 +42,216 @@ Status of M1 tasks. Last updated 2026-04-23. --- -## Months 2–3 — June–July 2026 +## Month 2 — June 2026 -**Direction:** Authentication, Summon migration, collateral service, minor fixes. +**Focus:** Mesh 2.0 upgrade and CI improvements. -- Improved authentication — nonce-based auth, wallet connection fixes, registration flow (#135, #53) -- Summon migration — land API routes and wallet import (PR #212, PR #208) -- Collateral service — 22 ADA → 4 UTxOs for proxy collateral (#221) -- Full address verification (#196) -- Transaction pagination (#30) -- Better 404 page (#22) -- Monthly report +**Quirin** + +| Task | Issues | +|------|--------| +| Mesh 2.0 upgrade — migrate to Mesh SDK 2.0 | | + +**Andre** + +| Task | Issues | +|------|--------| +| CI improvements | | + +--- + +## Month 3 — July 2026 + +**Focus:** On-chain wallet discovery and FROST kickoff. + +**Quirin** + +| Task | Issues | +|------|--------| +| FROST research kickoff | #220 | + +**Andre** + +| Task | Issues | +|------|--------| +| Wallet V2 — on-chain registration and discovery | #33 | + +--- + +## Month 4 — August 2026 + +**Focus:** Document Sign-Off MVP — build (see [Flagship feature](#flagship-feature--document-sign-off)). + +**Quirin** + +| Task | Issues | +|------|--------| +| Document Sign-Off MVP (build) — 5-table data model, four routes, CIP-8 signature enforcement, version-hash binding | | + +**Andre** + +| Task | Issues | +|------|--------| +| Document Sign-Off MVP (build) — Documents section UI, six-state lifecycle, signer review screen | | + +--- + +## Month 5 — September 2026 + +**Focus:** Document Sign-Off MVP — ship (8–10 wk effort completes). + +**Quirin** + +| Task | Issues | +|------|--------| +| Document Sign-Off MVP (ship) — proof export (JSON + PDF), verify route | | + +**Andre** + +| Task | Issues | +|------|--------| +| Document Sign-Off MVP (ship) — diffs where feasible, status grouping, polish | | +| Monthly report | | --- -## Months 4–6 — August–October 2026 +## Month 6 — October 2026 -**Direction:** Governance, smart contracts, and on-chain wallet discovery. +**Focus:** Document Sign-Off provenance, FROST findings, hardware wallets. -- Aiken crowdfund integration (PR #164) -- Governance metadata fix (#122) -- Proxy voting polish and documentation -- Wallet V2 — on-chain registration and discovery (#33) -- Pending transactions on homepage (#125) -- FROST research kickoff (#220) -- Backlog cleanup, dependency/security updates -- Monthly reports +**Quirin** + +| Task | Issues | +|------|--------| +| Document Sign-Off v1 — Provenance (history, diff & rollback, richer audit export) | | +| FROST research — deliver findings, PoC, go/no-go | #220 | + +**Andre** + +| Task | Issues | +|------|--------| +| Hardware wallet support — Ledger/Trezor | #44 | --- -## Months 7–9 — November 2026–January 2027 +## Month 7 — November 2026 + +**Focus:** Governance polish, dApp connector, bot platform. + +**Quirin** -**Direction:** Ecosystem integrations and developer experience. +| Task | Issues | +|------|--------| +| Governance metadata fix | #122 | +| dApp connector — external dApps request multi-sig transactions | | -- Hardware wallet support — Ledger/Trezor (#44) -- Bot platform v2 — SDK, webhooks, example bots -- dApp connector — external dApps request multi-sig transactions -- API documentation and developer portal -- FROST research — deliver findings, PoC, go/no-go (#220) -- Monthly reports +**Andre** + +| Task | Issues | +|------|--------| +| Pending transactions on homepage | #125 | +| Bot platform v2 — SDK, webhooks, example bots | | --- -## Months 10–12 — February–April 2027 +## Month 8 — December 2026 + +**Focus:** Proxy voting, testing, developer experience. + +**Quirin** + +| Task | Issues | +|------|--------| +| Proxy voting polish and documentation | | +| Transaction builder & tRPC integration tests | #255 | + +**Andre** + +| Task | Issues | +|------|--------| +| API documentation and developer portal | | +| Backlog cleanup, dependency/security updates | | +| Monthly report | | + +--- + +## Month 9 — January 2027 + +**Focus:** Document Sign-Off checkpoints, vesting, growth. + +**Quirin** + +| Task | Issues | +|------|--------| +| Document Sign-Off v2 — Checkpoints (opt-in on-chain anchoring in Cardano metadata) | | +| Vesting — time-locked multi-sig contracts | #81 | + +**Andre** + +| Task | Issues | +|------|--------| +| User profiles and contacts | | + +--- + +## Month 10 — February 2027 + +**Focus:** Invite flow and discovery. + +**Quirin** + +| Task | Issues | +|------|--------| +| Invite flow | PR #67 | + +**Andre** + +| Task | Issues | +|------|--------| +| Discover page — browse wallets, DAOs, governance | #52 | + +--- + +## Month 11 — March 2027 + +**Focus:** Polish, wrap-up, and forward-looking research. + +**Quirin** + +| Task | Issues | +|------|--------| +| Performance and UX audit | | +| Final summary report — activity, outcomes, gaps, next steps | | + +**Andre** + +| Task | Issues | +|------|--------| +| Document Sign-Off v3 — Collaboration & standards (CRDT/QES bridge — scoped as research) | | +| Monthly report | | + +--- + +## Month 12 — April 2027 + +**Focus:** Buffer / catch-up — absorb slippage from earlier months, finalize reporting, plan next cycle. + +No fixed feature commitments; reserved for spillover, stabilization, and next-roadmap planning. + +--- + +## Flagship feature — Document Sign-Off + +A wallet-native, off-chain document approval layer: bind approval to an exact version hash, inherit the wallet's signer set + threshold, and collect CIP-8 sign-off (approve/reject) per signer. No new chain, no new token, no change to the transaction model — delivered as a Documents section inside the wallet. -**Direction:** Growth features, polish, and wrap-up. +| Phase | Scope | Months | +|-------|-------|--------| +| MVP — Sign-off | Documents section, six-state lifecycle, version-hash binding, signer review, exportable JSON+PDF proof. Off-chain. | M4–M5 | +| v1 — Provenance | Revision history first-class, diff & rollback, richer audit export (off-chain). | M6 | +| v2 — Checkpoints | Optional on-chain anchoring of a version's hash + parent in Cardano tx metadata. | M9 | +| v3 — Collaboration & standards | Real-time co-authoring (CRDT), metadata standard (CIP candidate), eIDAS/EUDI QES bridge. | M11 (research) | -- Vesting — time-locked multi-sig contracts (#81) -- User profiles and contacts -- Discover page — browse wallets, DAOs, governance (#52) -- Performance and UX audit -- Invite flow (PR #67) -- Final summary report — activity, outcomes, gaps, next steps -- Monthly reports +**Data model:** five entities (`Document`, `DocumentVersion`, `DocumentReview`, `DocumentSignerSnapshot`, `DocumentEvent`) + optional `Checkpoint`, all reusing wallet signer identity and threshold. Approval belongs to a version, never a mutable container; a new version starts a fresh round at zero approvals. --- @@ -102,10 +259,11 @@ Status of M1 tasks. Last updated 2026-04-23. | Topic | Description | Months | Owner | |-------|-------------|--------|-------| -| **FROST multi-sig wallets** | Research FROST (Flexible Round-Optimized Schnorr Threshold) signatures for Cardano. Evaluate feasibility of replacing or complementing native script multi-sig with threshold Schnorr signatures — smaller on-chain footprint, better privacy (single signature on-chain), and flexible threshold schemes. Investigate Cardano-compatible FROST libraries, protocol readiness, and migration path from current native scripts. | 6-9 | Quirin | +| **FROST & PQC multi-sig wallets** | Research FROST (Flexible Round-Optimized Schnorr Threshold) signatures for Cardano. Evaluate feasibility of replacing or complementing native script multi-sig with threshold Schnorr signatures — smaller on-chain footprint, better privacy (single signature on-chain), and flexible threshold schemes. Investigate Cardano-compatible FROST libraries, protocol readiness, and migration path from current native scripts. Also evaluate **Lemour post-quantum (PQC) multi-sig** — lattice-based threshold signatures for long-term quantum resistance — as a forward-looking alternative/complement to FROST. | M3 (kickoff) – M6 (findings) | Quirin | **Research deliverables:** - Written summary of FROST vs native script trade-offs +- Assessment of Lemour PQC multi-sig — maturity, libraries, and quantum-resistance trade-offs vs FROST - Proof-of-concept if libraries are available - Go/no-go recommendation for integration into the platform @@ -145,33 +303,34 @@ Aggregated view of the 12-month roadmap split by contributor. Each task has a si - [M1] Fix transaction loading bug (#211) - [M1] Handle external PR — Summon API routes (PR #212) - [M1] Fix legacy wallet compatibility bug -- [M2–3] Improved authentication — nonce-based auth, wallet connection fixes, registration flow (#135, #53) -- [M2–3] Full address verification (#196) -- [M2–3] Transaction pagination (#30) -- [M4–6] Aiken crowdfund integration (PR #164) -- [M4–6] Governance metadata fix (#122) -- [M4–6] Proxy voting polish and documentation -- [M4–6] FROST research kickoff (#220) -- [M7–9] dApp connector — external dApps request multi-sig transactions -- [M7–9] FROST research — deliver findings, PoC, go/no-go (#220) -- [M10–12] Vesting — time-locked multi-sig contracts (#81) -- [M10–12] Performance and UX audit -- [M10–12] Invite flow (PR #67) -- [M10–12] Final summary report +- [M2] Mesh 2.0 upgrade — migrate to Mesh SDK 2.0 +- [M3] FROST research kickoff (#220) +- [M4–5] Document Sign-Off MVP — data model, routes, CIP-8 enforcement, proof export +- [M6] Document Sign-Off v1 — Provenance (history, diff & rollback, audit export) +- [M6] FROST research — deliver findings, PoC, go/no-go (#220) +- [M7] Governance metadata fix (#122) +- [M7] dApp connector — external dApps request multi-sig transactions +- [M8] Proxy voting polish and documentation +- [M8] Transaction builder & tRPC integration tests (#255) +- [M9] Document Sign-Off v2 — Checkpoints (opt-in on-chain anchoring) +- [M9] Vesting — time-locked multi-sig contracts (#81) +- [M10] Invite flow (PR #67) +- [M11] Performance and UX audit +- [M11] Final summary report ### Andre - [M1] Improve repository infrastructure — preprod environment and comprehensive smoke CI - [M1] CI smoke tests on real chain (#213) - [M1] Handle external PR — capability-based metadata (PR #208) -- [M2–3] Summon migration — land API routes and wallet import (PR #212, PR #208) -- [M2–3] Collateral service — 22 ADA → 4 UTxOs for proxy collateral (#221) -- [M2–3] Better 404 page (#22) -- [M4–6] Wallet V2 — on-chain registration and discovery (#33) -- [M4–6] Pending transactions on homepage (#125) -- [M4–6] Backlog cleanup, dependency/security updates -- [M7–9] Hardware wallet support — Ledger/Trezor (#44) -- [M7–9] Bot platform v2 — SDK, webhooks, example bots -- [M7–9] API documentation and developer portal -- [M10–12] User profiles and contacts -- [M10–12] Discover page — browse wallets, DAOs, governance (#52) +- [M2] CI improvements +- [M3] Wallet V2 — on-chain registration and discovery (#33) +- [M4–5] Document Sign-Off MVP — Documents UI, six-state lifecycle, signer review, diffs +- [M6] Hardware wallet support — Ledger/Trezor (#44) +- [M7] Pending transactions on homepage (#125) +- [M7] Bot platform v2 — SDK, webhooks, example bots +- [M8] API documentation and developer portal +- [M8] Backlog cleanup, dependency/security updates +- [M9] User profiles and contacts +- [M10] Discover page — browse wallets, DAOs, governance (#52) +- [M11] Document Sign-Off v3 — Collaboration & standards (research) diff --git a/next.config.js b/next.config.js index 76a89372..4d6eca67 100644 --- a/next.config.js +++ b/next.config.js @@ -44,9 +44,13 @@ const config = { unoptimized: false, }, // Turbopack configuration (Next.js 16+) - // Empty config silences the warning about webpack/turbopack conflict - // WebAssembly support is enabled by default in Turbopack - turbopack: {}, + // Pin the workspace root to this config's directory. Without this, Turbopack + // can mis-detect the root when stray lockfiles exist higher up the tree (e.g. + // a git worktree under a parent that also has a package-lock.json), which + // breaks resolution of the whisky WASM during dev SSR. `import.meta.dirname` + // is the project root in every checkout, so this is safe in CI and prod too. + // WebAssembly support is enabled by default in Turbopack. + turbopack: { root: import.meta.dirname }, // Webpack config for builds that explicitly use webpack (e.g., with --webpack flag) webpack: function (config, options) { diff --git a/package-lock.json b/package-lock.json index 6628b174..002958a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17118,26 +17118,26 @@ } }, "node_modules/npm": { - "version": "9.9.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.9.4.tgz", - "integrity": "sha512-NzcQiLpqDuLhavdyJ2J3tGJ/ni/ebcqHVFZkv1C4/6lblraUPbPgCJ4Vhb4oa3FFhRa2Yj9gA58jGH/ztKueNQ==", + "version": "11.17.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.17.0.tgz", + "integrity": "sha512-PurxiZexEHDTE4SSaLI3ZrnbAGiZfeyUcQcxcP5D+hfytNAze/D1IzDuInTn9XVLIbAQUnQuSPXJx02LHjLvQw==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", "@npmcli/config", "@npmcli/fs", "@npmcli/map-workspaces", + "@npmcli/metavuln-calculator", "@npmcli/package-json", "@npmcli/promise-spawn", + "@npmcli/redact", "@npmcli/run-script", + "@sigstore/tuf", "abbrev", "archy", "cacache", "chalk", "ci-info", - "cli-columns", - "cli-table3", - "columnify", "fastest-levenshtein", "fs-minipass", "glob", @@ -17151,7 +17151,6 @@ "libnpmdiff", "libnpmexec", "libnpmfund", - "libnpmhook", "libnpmorg", "libnpmpack", "libnpmpublish", @@ -17165,7 +17164,6 @@ "ms", "node-gyp", "nopt", - "normalize-package-data", "npm-audit-report", "npm-install-checks", "npm-package-arg", @@ -17173,7 +17171,6 @@ "npm-profile", "npm-registry-fetch", "npm-user-validate", - "npmlog", "p-map", "pacote", "parse-conflict-json", @@ -17181,7 +17178,6 @@ "qrcode-terminal", "read", "semver", - "sigstore", "spdx-expression-parse", "ssri", "supports-color", @@ -17190,8 +17186,7 @@ "tiny-relative-date", "treeverse", "validate-npm-package-name", - "which", - "write-file-atomic" + "which" ], "license": "Artistic-2.0", "workspaces": [ @@ -17203,82 +17198,77 @@ ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.5.0", - "@npmcli/config": "^6.4.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^4.0.1", - "@npmcli/promise-spawn": "^6.0.2", - "@npmcli/run-script": "^6.0.2", - "abbrev": "^2.0.0", + "@npmcli/arborist": "^9.8.0", + "@npmcli/config": "^10.11.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.4", + "@sigstore/tuf": "^4.0.2", + "abbrev": "^4.0.0", "archy": "~1.0.0", - "cacache": "^17.1.4", - "chalk": "^5.3.0", - "ci-info": "^4.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", + "cacache": "^20.0.4", + "chalk": "^5.6.2", + "ci-info": "^4.4.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^10.3.10", + "glob": "^13.0.6", "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.3", - "ini": "^4.1.1", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.1", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.20", - "libnpmexec": "^6.0.4", - "libnpmfund": "^4.2.1", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.4", - "libnpmpack": "^5.0.20", - "libnpmpublish": "^7.5.1", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "minipass": "^7.0.4", + "hosted-git-info": "^9.0.3", + "ini": "^6.0.0", + "init-package-json": "^8.2.5", + "is-cidr": "^6.0.4", + "json-parse-even-better-errors": "^5.0.0", + "libnpmaccess": "^10.0.3", + "libnpmdiff": "^8.1.10", + "libnpmexec": "^10.3.0", + "libnpmfund": "^7.0.24", + "libnpmorg": "^8.0.1", + "libnpmpack": "^9.1.10", + "libnpmpublish": "^11.2.0", + "libnpmsearch": "^9.0.1", + "libnpmteam": "^8.0.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": "^9.4.1", - "nopt": "^7.2.0", - "normalize-package-data": "^5.0.0", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.2", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.5", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.2.0", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.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-registry-fetch": "^19.1.1", + "npm-user-validate": "^4.0.0", + "p-map": "^7.0.4", + "pacote": "^21.5.1", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "semver": "^7.6.0", - "sigstore": "^1.9.0", - "spdx-expression-parse": "^3.0.1", - "ssri": "^10.0.5", - "supports-color": "^9.4.0", - "tar": "^6.2.1", + "read": "^5.0.1", + "semver": "^7.8.4", + "spdx-expression-parse": "^4.0.0", + "ssri": "^13.0.1", + "supports-color": "^10.2.2", + "tar": "^7.5.16", "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", + "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.1", - "write-file-atomic": "^5.0.1" + "validate-npm-package-name": "^7.0.2", + "which": "^6.0.1" }, "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm-run-path": { @@ -17294,463 +17284,367 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", + "node_modules/npm/node_modules/@gar/promise-retry": { + "version": "1.0.3", "inBundle": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=0.1.90" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "minipass": "^7.0.4" }, "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=18.0.0" } }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC" }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "4.0.2", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-regex": "^6.0.1" + "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": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "6.5.1", + "version": "9.8.0", "inBundle": true, "license": "ISC", "dependencies": { + "@gar/promise-retry": "^1.0.0", "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^4.0.0", - "@npmcli/query": "^3.1.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.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", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", + "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": "^1.0.2", - "read-package-json-fast": "^3.0.2", + "promise-call-limit": "^3.0.1", "semver": "^7.3.7", - "ssri": "^10.0.1", + "ssri": "^13.0.0", "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" + "walk-up-path": "^4.0.0" }, "bin": { "arborist": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "6.4.1", + "version": "10.11.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/package-json": "^7.0.0", "ci-info": "^4.0.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", + "ini": "^6.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" + "walk-up-path": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/git": { - "version": "4.1.0", + "version": "7.0.2", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", + "@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": "^3.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", + "version": "4.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" }, "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", + "version": "5.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "glob": "^13.0.0", + "minimatch": "^10.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "5.0.1", + "version": "9.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", + "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": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", + "version": "4.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "4.0.1", + "version": "7.0.5", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^4.1.0", - "glob": "^10.2.2", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" + "@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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", + "version": "9.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "which": "^3.0.0" + "which": "^6.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.1.0", + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "6.0.2", + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "4.0.0", "inBundle": true, "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "10.0.4", "inBundle": true, - "license": "MIT", - "optional": 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": ">=14" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "1.1.0", + "version": "4.0.0", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" + "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "3.2.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", + "version": "0.5.1", "inBundle": true, "license": "Apache-2.0", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "1.0.0", + "version": "4.1.1", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" + "@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" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "1.0.3", + "version": "4.0.2", "inBundle": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "3.1.1", "inBundle": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0" + }, "engines": { - "node": ">= 10" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "1.0.0", + "version": "2.0.0", "inBundle": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm/node_modules/@tufjs/models": { - "version": "1.0.4", + "version": "4.1.0", "inBundle": true, "license": "MIT", "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", + "version": "4.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.5.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", + "version": "7.1.4", "inBundle": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 14" } }, "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", + "version": "2.1.0", "inBundle": true, "license": "ISC" }, @@ -17759,81 +17653,73 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.2", + "node_modules/npm/node_modules/balanced-match": { + "version": "4.0.4", "inBundle": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/bin-links": { - "version": "4.0.3", + "version": "6.0.2", "inBundle": true, "license": "ISC", "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" + "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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", + "version": "3.1.0", "inBundle": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", + "version": "5.0.6", "inBundle": true, "license": "MIT", "dependencies": { - "semver": "^7.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/npm/node_modules/cacache": { - "version": "17.1.4", + "version": "20.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/fs": "^3.1.0", + "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "p-map": "^7.0.2", + "ssri": "^13.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/chalk": { - "version": "5.3.0", + "version": "5.6.2", "inBundle": true, "license": "MIT", "engines": { @@ -17844,15 +17730,15 @@ } }, "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", + "version": "3.0.0", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/npm/node_modules/ci-info": { - "version": "4.0.0", + "version": "4.4.0", "funding": [ { "type": "github", @@ -17866,142 +17752,27 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", + "version": "5.0.5", "inBundle": true, "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, "engines": { - "node": ">=10" + "node": ">=20" } }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", + "node_modules/npm/node_modules/cmd-shim": { + "version": "8.0.0", "inBundle": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=6" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "2.0.0", "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" + "node": ">= 18" } }, "node_modules/npm/node_modules/cssesc": { @@ -18016,7 +17787,7 @@ } }, "node_modules/npm/node_modules/debug": { - "version": "4.3.7", + "version": "4.4.3", "inBundle": true, "license": "MIT", "dependencies": { @@ -18031,49 +17802,14 @@ } } }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/diff": { - "version": "5.2.0", + "version": "8.0.4", "inBundle": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/npm/node_modules/env-paths": { "version": "2.2.1", "inBundle": true, @@ -18082,13 +17818,8 @@ "node": ">=6" } }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.1", + "version": "3.1.3", "inBundle": true, "license": "Apache-2.0" }, @@ -18100,21 +17831,6 @@ "node": ">= 4.9.1" } }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm/node_modules/fs-minipass": { "version": "3.0.3", "inBundle": true, @@ -18126,53 +17842,17 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/gauge": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/npm/node_modules/glob": { - "version": "10.3.10", + "version": "13.0.6", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -18183,73 +17863,48 @@ "inBundle": true, "license": "ISC" }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hasown": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/npm/node_modules/hosted-git-info": { - "version": "6.1.3", + "version": "9.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "lru-cache": "^7.5.1" + "lru-cache": "^11.1.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", + "version": "4.2.0", "inBundle": true, "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", + "version": "7.0.2", "inBundle": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", + "version": "7.0.6", "inBundle": true, "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" + "node": ">= 14" } }, "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", + "version": "0.7.2", "inBundle": true, "license": "MIT", "optional": true, @@ -18258,172 +17913,80 @@ }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.4", + "version": "8.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "minimatch": "^9.0.0" + "minimatch": "^10.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/ini": { - "version": "4.1.1", + "version": "6.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/init-package-json": { - "version": "5.0.0", + "version": "8.2.5", "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" + "@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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/ip-address": { - "version": "9.0.5", + "version": "10.2.0", "inBundle": true, "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, "engines": { "node": ">= 12" } }, - "node_modules/npm/node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", + "version": "6.0.4", "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" + "cidr-regex": "^5.0.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=20" } }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jackspeak": { - "version": "2.3.6", + "version": "4.0.0", "inBundle": true, "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "node": ">=20" } }, - "node_modules/npm/node_modules/jsbn": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", + "version": "5.0.0", "inBundle": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/json-stringify-nice": { @@ -18453,303 +18016,238 @@ "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { - "version": "7.0.3", + "version": "10.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "5.0.21", + "version": "8.1.10", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.5.0", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" + "@npmcli/arborist": "^9.8.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" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "6.0.5", + "version": "10.3.0", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.5.0", - "@npmcli/run-script": "^6.0.0", + "@gar/promise-retry": "^1.0.0", + "@npmcli/arborist": "^9.8.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "proc-log": "^6.0.0", + "read": "^5.0.1", "semver": "^7.3.7", - "walk-up-path": "^3.0.1" + "signal-exit": "^4.1.0", + "walk-up-path": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "4.2.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.5.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "9.0.4", + "version": "7.0.24", "inBundle": true, "license": "ISC", "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" + "@npmcli/arborist": "^9.8.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmorg": { - "version": "5.0.5", + "version": "8.0.1", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "5.0.21", + "version": "9.1.10", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^6.5.0", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" + "@npmcli/arborist": "^9.8.0", + "@npmcli/run-script": "^10.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmpublish": { - "version": "7.5.2", + "version": "11.2.0", "inBundle": true, "license": "ISC", "dependencies": { + "@npmcli/package-json": "^7.0.0", "ci-info": "^4.0.0", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.7", - "sigstore": "^1.4.0", - "ssri": "^10.0.1" + "sigstore": "^4.0.0", + "ssri": "^13.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmsearch": { - "version": "6.0.3", + "version": "9.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "npm-registry-fetch": "^14.0.3" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmteam": { - "version": "5.0.4", + "version": "8.0.2", "inBundle": true, "license": "ISC", "dependencies": { "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" + "npm-registry-fetch": "^19.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/libnpmversion": { - "version": "4.0.3", + "version": "8.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", + "@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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/lru-cache": { - "version": "7.18.3", + "version": "11.5.1", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=12" + "node": "20 || >=22" } }, "node_modules/npm/node_modules/make-fetch-happen": { - "version": "11.1.1", + "version": "15.0.6", "inBundle": true, "license": "ISC", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", + "@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", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/minimatch": { - "version": "9.0.3", + "version": "10.2.5", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/npm/node_modules/minipass": { - "version": "7.0.4", + "version": "7.1.3", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", + "version": "2.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.4", + "version": "5.0.2", "inBundle": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" }, "optionalDependencies": { - "encoding": "^0.1.13" + "iconv-lite": "^0.7.2" } }, "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", + "version": "1.0.6", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.3" }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/npm/node_modules/minipass-pipeline": { @@ -18774,60 +18272,31 @@ "node": ">=8" } }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", + "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", + "node_modules/npm/node_modules/minipass-sized": { + "version": "2.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { "node": ">=8" } }, "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", + "version": "3.1.0", "inBundle": true, "license": "MIT", "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" + "minipass": "^7.1.2" }, "engines": { - "node": ">=10" + "node": ">= 18" } }, "node_modules/npm/node_modules/ms": { @@ -18836,15 +18305,15 @@ "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", + "version": "3.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", + "version": "1.0.0", "inBundle": true, "license": "MIT", "engines": { @@ -18852,1093 +18321,495 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "9.4.1", + "version": "12.4.0", "inBundle": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.13 || ^14.13 || >=16" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "2.1.2", + "node_modules/npm/node_modules/nopt": { + "version": "9.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { - "version": "1.1.1", + "node_modules/npm/node_modules/npm-audit-report": { + "version": "7.0.0", "inBundle": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", + "node_modules/npm/node_modules/npm-bundled": { + "version": "5.0.0", "inBundle": true, "license": "ISC", "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "npm-normalize-package-bin": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", + "node_modules/npm/node_modules/npm-install-checks": { + "version": "8.0.0", "inBundle": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "semver": "^7.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { - "version": "16.1.3", + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "5.0.0", "inBundle": true, "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", + "node_modules/npm/node_modules/npm-package-arg": { + "version": "13.0.2", "inBundle": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0" + "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.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", + "node_modules/npm/node_modules/npm-packlist": { + "version": "10.0.4", "inBundle": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "11.0.3", "inBundle": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "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": ">=10" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", + "node_modules/npm/node_modules/npm-profile": { + "version": "12.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0" }, "engines": { - "node": ">= 8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "19.1.1", "inBundle": true, "license": "ISC", "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "@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": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", + "node_modules/npm/node_modules/npm-user-validate": { + "version": "4.0.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "10.2.1", + "node_modules/npm/node_modules/p-map": { + "version": "7.0.4", "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", + "node_modules/npm/node_modules/pacote": { + "version": "21.5.1", "inBundle": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "@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" }, "engines": { - "node": "*" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass": { - "version": "3.3.6", + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "5.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "json-parse-even-better-errors": "^5.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" }, "engines": { - "node": ">=8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "2.1.2", + "node_modules/npm/node_modules/path-scurry": { + "version": "2.0.2", "inBundle": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "18 || 20 || >=22" }, - "optionalDependencies": { - "encoding": "^0.1.13" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "7.1.4", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=4" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", + "node_modules/npm/node_modules/proc-log": { + "version": "6.1.0", "inBundle": true, "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { - "version": "9.0.1", + "node_modules/npm/node_modules/proggy": { + "version": "4.0.0", "inBundle": true, "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { - "version": "2.0.1", + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", "inBundle": true, "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { - "version": "3.0.0", + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.2", "inBundle": true, "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", + "node_modules/npm/node_modules/promzard": { + "version": "3.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "read": "^5.0.0" }, "engines": { - "node": ">= 8" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/nopt": { - "version": "7.2.0", + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "qrcode-terminal": "bin/qrcode-terminal.js" } }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "5.0.0", + "node_modules/npm/node_modules/read": { + "version": "5.0.1", "inBundle": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "mute-stream": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "6.0.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "MIT", + "optional": true }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", + "node_modules/npm/node_modules/semver": { + "version": "7.8.4", "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", "inBundle": true, "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "10.1.0", + "node_modules/npm/node_modules/sigstore": { + "version": "4.1.1", "inBundle": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" + "@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": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "7.0.4", + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.0" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "8.0.2", + "node_modules/npm/node_modules/socks": { + "version": "2.8.9", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/npm/node_modules/npm-profile": { - "version": "7.0.1", + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.5", "inBundle": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 14" } }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "14.0.5", + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "CC-BY-3.0" }, - "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "5.0.0", + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.23", "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "CC0-1.0" }, - "node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", + "node_modules/npm/node_modules/ssri": { + "version": "13.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", + "node_modules/npm/node_modules/supports-color": { + "version": "10.2.2", "inBundle": true, "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/npm/node_modules/pacote": { - "version": "15.2.0", + "node_modules/npm/node_modules/tar": { + "version": "7.5.16", "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/npm/node_modules/pacote/node_modules/minipass": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.10.1", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.6.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "1.9.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.8.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "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.17", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "10.0.5", + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "2.0.2", "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } + "license": "MIT" }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", + "node_modules/npm/node_modules/tinyglobby": { + "version": "0.2.17", "inBundle": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "fdir": "^6.5.0", + "picomatch": "^4.0.4" }, "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "node": ">=12.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", "inBundle": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" + "node": ">=12.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", + "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", "inBundle": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.2.1", - "inBundle": true, - "license": "ISC", - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", "inBundle": true, @@ -19948,38 +18819,24 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "1.1.7", + "version": "4.1.0", "inBundle": true, "license": "MIT", "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", + "node_modules/npm/node_modules/undici": { + "version": "6.26.0", "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=18.17" } }, "node_modules/npm/node_modules/util-deprecate": { @@ -19987,172 +18844,54 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", + "version": "7.0.2", "inBundle": true, "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", + "version": "4.0.0", "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" + "license": "ISC", + "engines": { + "node": "20 || >=22" } }, "node_modules/npm/node_modules/which": { - "version": "3.0.1", + "version": "6.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", + "version": "7.0.1", "inBundle": true, "license": "ISC", "dependencies": { - "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", + "version": "5.0.0", "inBundle": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } }, "node_modules/oauth": { "version": "0.9.15", diff --git a/package.json b/package.json index 052b302c..c2c0c07c 100644 --- a/package.json +++ b/package.json @@ -145,6 +145,7 @@ "lodash.isequal": "^4.5.0", "undici": "^6.23.0", "elliptic": "^6.5.7", - "@peculiar/webcrypto": "1.5.0" + "@peculiar/webcrypto": "1.5.0", + "npm": "^11.0.0" } } diff --git a/prisma/migrations/20260614120000_add_proposal_tally/migration.sql b/prisma/migrations/20260614120000_add_proposal_tally/migration.sql new file mode 100644 index 00000000..12046d32 --- /dev/null +++ b/prisma/migrations/20260614120000_add_proposal_tally/migration.sql @@ -0,0 +1,18 @@ +-- CreateTable +CREATE TABLE "ProposalTally" ( + "id" TEXT NOT NULL, + "network" INTEGER NOT NULL, + "proposalId" TEXT NOT NULL, + "yes" INTEGER NOT NULL DEFAULT 0, + "no" INTEGER NOT NULL DEFAULT 0, + "abstain" INTEGER NOT NULL DEFAULT 0, + "total" INTEGER NOT NULL DEFAULT 0, + "capped" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ProposalTally_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "ProposalTally_network_proposalId_key" ON "ProposalTally"("network", "proposalId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6e85805b..f753e5b2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -310,3 +310,18 @@ model AuditLog { @@index([createdAt]) @@index([actorAddress, createdAt]) } + +model ProposalTally { + id String @id @default(cuid()) + network Int + proposalId String + yes Int @default(0) + no Int @default(0) + abstain Int @default(0) + total Int @default(0) + capped Boolean @default(false) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@unique([network, proposalId]) +} diff --git a/public/favicon/site.webmanifest b/public/favicon/site.webmanifest index ec7a7bb4..7d03962c 100644 --- a/public/favicon/site.webmanifest +++ b/public/favicon/site.webmanifest @@ -1,14 +1,12 @@ - - { - "name": "Multisig MeshJS", + "name": "Mesh Multisig — Cardano Treasury Wallet", "short_name": "Multisig", - "description": "A multisignature wallet interface built with MeshJS", + "description": "Free, open-source Cardano multi-signature wallet for teams and DAOs — secure your treasury and vote on governance together.", "start_url": "/", "scope": "/", "display": "standalone", - "background_color": "#ffffff", - "theme_color": "#000000", + "background_color": "#0a0a0a", + "theme_color": "#0a0a0a", "icons": [ { "src": "/favicon/apple-touch-icon.png", @@ -26,4 +24,4 @@ "type": "image/png" } ] -} \ No newline at end of file +} diff --git a/public/features/all-tx.png b/public/features/all-tx.png deleted file mode 100644 index 9e1f8c82..00000000 Binary files a/public/features/all-tx.png and /dev/null differ diff --git a/public/features/chat.png b/public/features/chat.png deleted file mode 100644 index 1422b81f..00000000 Binary files a/public/features/chat.png and /dev/null differ diff --git a/public/features/invite-signers.png b/public/features/invite-signers.png deleted file mode 100644 index 40bc067d..00000000 Binary files a/public/features/invite-signers.png and /dev/null differ diff --git a/public/features/multi-wallets.png b/public/features/multi-wallets.png deleted file mode 100644 index 1dbb7f9e..00000000 Binary files a/public/features/multi-wallets.png and /dev/null differ diff --git a/public/features/new-tx.png b/public/features/new-tx.png deleted file mode 100644 index 6beffda7..00000000 Binary files a/public/features/new-tx.png and /dev/null differ diff --git a/public/features/pending-tx.png b/public/features/pending-tx.png deleted file mode 100644 index 163a8f7d..00000000 Binary files a/public/features/pending-tx.png and /dev/null differ diff --git a/public/features/proposals.png b/public/features/proposals.png deleted file mode 100644 index b9b84f16..00000000 Binary files a/public/features/proposals.png and /dev/null differ diff --git a/public/features/register-drep.png b/public/features/register-drep.png deleted file mode 100644 index 2aacb289..00000000 Binary files a/public/features/register-drep.png and /dev/null differ diff --git a/public/features/verify-signers.png b/public/features/verify-signers.png deleted file mode 100644 index 5631621a..00000000 Binary files a/public/features/verify-signers.png and /dev/null differ diff --git a/public/og-image.png b/public/og-image.png new file mode 100644 index 00000000..cd6bf8da Binary files /dev/null and b/public/og-image.png differ diff --git a/scripts/generate-og-image.mjs b/scripts/generate-og-image.mjs new file mode 100644 index 00000000..f714e027 --- /dev/null +++ b/scripts/generate-og-image.mjs @@ -0,0 +1,71 @@ +// Generates the static social card at public/og-image.png (1200×630). +// +// Run with: node scripts/generate-og-image.mjs +// +// We rasterise a hand-written SVG with `sharp` (already a dependency via +// next/image) and composite the white Mesh logo on top. Keeping this as a +// committed script means the card is reproducible and tweakable without any +// design tooling or runtime/edge dependency. +import sharp from "sharp"; +import { fileURLToPath } from "node:url"; +import { dirname, join } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const root = join(__dirname, ".."); + +const W = 1200; +const H = 630; + +const svg = ` + + + + + + + + + + + + + + + + + + + + + + + + Mesh Multisig + + + Cardano treasuries, + secured by multisig. + + + Free, open-source, Cardano-native multi-signature wallet for teams & DAOs. + + + + multisig.meshjs.dev + Treasury · Governance · Collaboration + +`; + +const logo = await sharp( + join(root, "public/logo-mesh/white/logo-mesh-white-512x512.png"), +) + .resize(96, 96, { fit: "contain", background: { r: 0, g: 0, b: 0, alpha: 0 } }) + .png() + .toBuffer(); + +await sharp(Buffer.from(svg)) + .composite([{ input: logo, top: 50, left: 80 }]) + .png() + .toFile(join(root, "public/og-image.png")); + +console.log("Wrote public/og-image.png"); diff --git a/src/__tests__/ipfs.test.ts b/src/__tests__/ipfs.test.ts new file mode 100644 index 00000000..710bb5fb --- /dev/null +++ b/src/__tests__/ipfs.test.ts @@ -0,0 +1,52 @@ +import { describe, expect, it, jest } from "@jest/globals"; + +// extractCidPath is pure, but the module imports the validated env object. +jest.mock("@/env", () => ({ env: {} })); + +import { extractCidPath } from "@/lib/ipfs"; + +const CID = "QmTzQ1Nj5wW3sM1f8Z9d4VqLp2rXh7Yk6BcDeFgHiJkLm"; + +describe("extractCidPath", () => { + it("returns a bare CID unchanged", () => { + expect(extractCidPath(CID)).toBe(CID); + }); + + it("strips the ipfs:// scheme (with or without an ipfs/ prefix)", () => { + expect(extractCidPath(`ipfs://${CID}`)).toBe(CID); + expect(extractCidPath(`ipfs://ipfs/${CID}`)).toBe(CID); + }); + + it("extracts cid[/path] after /ipfs/ in a gateway URL", () => { + expect(extractCidPath(`https://gateway.pinata.cloud/ipfs/${CID}`)).toBe(CID); + expect(extractCidPath(`https://x.mypinata.cloud/ipfs/${CID}/meta.json`)).toBe( + `${CID}/meta.json`, + ); + }); + + it("matches the /ipfs/ marker case-insensitively", () => { + expect(extractCidPath(`https://x/IPFS/${CID}`)).toBe(CID); + }); + + it("drops query/hash and leading slashes", () => { + expect(extractCidPath(`https://x/ipfs/${CID}?foo=1#bar`)).toBe(CID); + expect(extractCidPath(`/ipfs/${CID}`)).toBe(CID); + }); + + it("returns null for empty, non-ipfs, too-short, or traversal inputs", () => { + expect(extractCidPath("")).toBeNull(); + expect(extractCidPath(null)).toBeNull(); + expect(extractCidPath(undefined)).toBeNull(); + expect(extractCidPath("https://example.com/foo")).toBeNull(); + expect(extractCidPath("short")).toBeNull(); + expect(extractCidPath(`https://x/ipfs/${CID}/../secret`)).toBeNull(); + }); + + it("terminates quickly on hostile repeated /ipfs/ input (no ReDoS)", () => { + const hostile = "/ipfs/a".repeat(20000); + const start = Date.now(); + const result = extractCidPath(hostile); + expect(Date.now() - start).toBeLessThan(1000); + expect(result).toBeNull(); + }); +}); diff --git a/src/__tests__/mergeSignerWitnesses.test.ts b/src/__tests__/mergeSignerWitnesses.test.ts index 00e0971f..baed18dc 100644 --- a/src/__tests__/mergeSignerWitnesses.test.ts +++ b/src/__tests__/mergeSignerWitnesses.test.ts @@ -1,7 +1,11 @@ import { describe, expect, it } from "@jest/globals"; -import { csl, calculateTxHash } from "@meshsdk/core-csl"; +import { csl } from "@meshsdk/core-csl"; +import { resolveTxHash } from "@meshsdk/core-cst"; -import { mergeSignerWitnesses } from "@/utils/txSignUtils"; +import { + mergeSignerWitnesses, + filterWitnessesToScripts, +} from "@/utils/txSignUtils"; function buildMinimalTxHex(): string { const inputs = csl.TransactionInputs.new(); @@ -30,78 +34,30 @@ function buildMinimalTxHex(): string { return csl.Transaction.new(body, witnesses, undefined).to_hex(); } -function witnessSetHexFor( - signer: csl.PrivateKey, - bodyHashHex: string, -): string { +// A witness-set-only payload (CIP-30 partial sign) signed over the core-cst +// body hash of `bodyHashHex` — i.e. exactly the bytes the wallet was handed. +function witnessSetHexFor(signer: csl.PrivateKey, bodyHashHex: string): string { const sig = signer.sign(Buffer.from(bodyHashHex, "hex")); const witness = csl.Vkeywitness.new(csl.Vkey.new(signer.to_public()), sig); const witnesses = csl.Vkeywitnesses.new(); witnesses.add(witness); - const witnessSet = csl.TransactionWitnessSet.new(); witnessSet.set_vkeys(witnesses); return witnessSet.to_hex(); } -// Build a full signed Transaction hex whose body bytes differ from -// `originalTxHex` (one input flipped) and whose vkey signature targets the -// wallet's body — the shape a wallet returns when it re-canonicalises CBOR -// before signing. -function fullSignedTxHexWithDifferentBody( - originalTxHex: string, - signer: csl.PrivateKey, -): { hex: string; walletBodyHashHex: string } { - const inputs = csl.TransactionInputs.new(); - inputs.add( - csl.TransactionInput.new( - csl.TransactionHash.from_bytes(Buffer.from("11".repeat(32), "hex")), - 0, - ), - ); - - const orig = csl.Transaction.from_hex(originalTxHex); - const body = csl.TransactionBody.new( - inputs, - orig.body().outputs(), - orig.body().fee(), - undefined, - ); - - // Build a transient tx (no witnesses) just to take its body hash. - const probeHex = csl.Transaction.new( - body, - csl.TransactionWitnessSet.new(), - undefined, - ).to_hex(); - const walletBodyHashHex = calculateTxHash(probeHex); - - const sig = signer.sign(Buffer.from(walletBodyHashHex, "hex")); - const vkeys = csl.Vkeywitnesses.new(); - vkeys.add(csl.Vkeywitness.new(csl.Vkey.new(signer.to_public()), sig)); - const witnessSet = csl.TransactionWitnessSet.new(); - witnessSet.set_vkeys(vkeys); - - // Re-parse the body so it's not consumed by the probe tx above. - return { - hex: csl.Transaction.new( - csl.TransactionBody.from_bytes(body.to_bytes()), - witnessSet, - undefined, - ).to_hex(), - walletBodyHashHex, - }; -} - describe("mergeSignerWitnesses", () => { - it("returns an empty invalidVkeyPubKeysHex when the new vkey verifies", () => { + it("accepts a vkey signed over the core-cst body hash and preserves the body", () => { const txHex = buildMinimalTxHex(); const signer = csl.PrivateKey.generate_ed25519(); - const payload = witnessSetHexFor(signer, calculateTxHash(txHex)); + const payload = witnessSetHexFor(signer, resolveTxHash(txHex)); const result = mergeSignerWitnesses(txHex, payload); expect(result.invalidVkeyPubKeysHex).toEqual([]); + // Body bytes are unchanged: the persisted/submitted hash equals what the + // wallet signed — no node-side InvalidWitnessesUTXOW. + expect(resolveTxHash(result.txHex)).toEqual(resolveTxHash(txHex)); expect( csl.Transaction.from_hex(result.txHex).witness_set().vkeys()?.len(), ).toBe(1); @@ -110,10 +66,7 @@ describe("mergeSignerWitnesses", () => { it("flags a vkey whose signature targets a different body", () => { const txHex = buildMinimalTxHex(); const signer = csl.PrivateKey.generate_ed25519(); - - // Sign a hash that does NOT match the body — simulates a wallet that - // re-canonicalised the CBOR before signing, producing a witness whose - // signature verifies against the wallet's re-encoded body but not ours. + // Signed over a hash that isn't this body's — must be reported, not adopted. const payload = witnessSetHexFor(signer, "ff".repeat(32)); const result = mergeSignerWitnesses(txHex, payload); @@ -122,51 +75,22 @@ describe("mergeSignerWitnesses", () => { .toString("hex") .toLowerCase(); expect(result.invalidVkeyPubKeysHex).toEqual([expectedPubKey]); - - // The merged tx still contains the witness (callers decide what to do); - // we just surface the validity verdict. - expect( - csl.Transaction.from_hex(result.txHex).witness_set().vkeys()?.len(), - ).toBe(1); - }); - - it("adopts the wallet's body when the wallet returned a full signed tx whose body differs and there are no pre-existing witnesses", () => { - // First-signer scenario: the wallet re-canonicalised the body before - // signing. We should use the wallet's body (so the signature verifies) - // and report no invalid vkeys. - const txHex = buildMinimalTxHex(); - const signer = csl.PrivateKey.generate_ed25519(); - const { hex: walletSignedHex, walletBodyHashHex } = - fullSignedTxHexWithDifferentBody(txHex, signer); - - // Sanity: the wallet's body hash is NOT the original body hash. - expect(walletBodyHashHex).not.toEqual(calculateTxHash(txHex)); - - const result = mergeSignerWitnesses(txHex, walletSignedHex); - - expect(result.invalidVkeyPubKeysHex).toEqual([]); - expect(calculateTxHash(result.txHex)).toEqual(walletBodyHashHex); }); - it("does not re-verify witnesses that were already present", () => { + it("merges a co-signer without re-verifying existing witnesses and keeps the body stable", () => { const txHex = buildMinimalTxHex(); const existingSigner = csl.PrivateKey.generate_ed25519(); const newSigner = csl.PrivateKey.generate_ed25519(); - // Pre-seed an "invalid" existing witness (signed against the wrong body). - // mergeSignerWitnesses should not flag it; only newly merged ones. - const wrongHashHex = "ff".repeat(32); - const sig = existingSigner.sign(Buffer.from(wrongHashHex, "hex")); - const existingWitness = csl.Vkeywitness.new( - csl.Vkey.new(existingSigner.to_public()), - sig, - ); + // Pre-seed an existing witness signed against the wrong body. The merge must + // not re-flag it (only newly added witnesses are verified). + const sig = existingSigner.sign(Buffer.from("ff".repeat(32), "hex")); const tx = csl.Transaction.from_hex(txHex); const witnessSet = csl.TransactionWitnessSet.from_bytes( tx.witness_set().to_bytes(), ); const vkeys = csl.Vkeywitnesses.new(); - vkeys.add(existingWitness); + vkeys.add(csl.Vkeywitness.new(csl.Vkey.new(existingSigner.to_public()), sig)); witnessSet.set_vkeys(vkeys); const seededTxHex = csl.Transaction.new( csl.TransactionBody.from_bytes(tx.body().to_bytes()), @@ -174,16 +98,86 @@ describe("mergeSignerWitnesses", () => { tx.auxiliary_data(), ).to_hex(); - // Merge a valid signature from a different signer. - const goodPayload = witnessSetHexFor( - newSigner, - calculateTxHash(seededTxHex), - ); + const goodPayload = witnessSetHexFor(newSigner, resolveTxHash(seededTxHex)); const result = mergeSignerWitnesses(seededTxHex, goodPayload); expect(result.invalidVkeyPubKeysHex).toEqual([]); + expect(resolveTxHash(result.txHex)).toEqual(resolveTxHash(seededTxHex)); expect( csl.Transaction.from_hex(result.txHex).witness_set().vkeys()?.len(), ).toBe(2); }); }); + +describe("filterWitnessesToScripts", () => { + it("drops vkeys not required by the native script while preserving the body", () => { + // Build a tx whose witness set carries a native script requiring signer A, + // plus vkey witnesses from A (required) and B (extraneous). + const A = csl.PrivateKey.generate_ed25519(); + const B = csl.PrivateKey.generate_ed25519(); + + const inputs = csl.TransactionInputs.new(); + inputs.add( + csl.TransactionInput.new( + csl.TransactionHash.from_bytes(Buffer.from("00".repeat(32), "hex")), + 0, + ), + ); + const outputs = csl.TransactionOutputs.new(); + const outAddr = csl.EnterpriseAddress.new( + csl.NetworkInfo.testnet_preview().network_id(), + csl.Credential.from_keyhash(A.to_public().hash()), + ).to_address(); + outputs.add( + csl.TransactionOutput.new(outAddr, csl.Value.new(csl.BigNum.from_str("1000000"))), + ); + const body = csl.TransactionBody.new( + inputs, + outputs, + csl.BigNum.from_str("100000"), + undefined, + ); + + const nativeScript = csl.ScriptPubkey.new(A.to_public().hash()); + const scripts = csl.NativeScripts.new(); + scripts.add(csl.NativeScript.new_script_pubkey(nativeScript)); + + const probeHex = csl.Transaction.new( + csl.TransactionBody.from_bytes(body.to_bytes()), + csl.TransactionWitnessSet.new(), + undefined, + ).to_hex(); + const bodyHash = resolveTxHash(probeHex); + + const vkeys = csl.Vkeywitnesses.new(); + vkeys.add(csl.Vkeywitness.new(csl.Vkey.new(A.to_public()), A.sign(Buffer.from(bodyHash, "hex")))); + vkeys.add(csl.Vkeywitness.new(csl.Vkey.new(B.to_public()), B.sign(Buffer.from(bodyHash, "hex")))); + const witnessSet = csl.TransactionWitnessSet.new(); + witnessSet.set_vkeys(vkeys); + witnessSet.set_native_scripts(scripts); + + const txHex = csl.Transaction.new( + csl.TransactionBody.from_bytes(body.to_bytes()), + witnessSet, + undefined, + ).to_hex(); + + const filtered = filterWitnessesToScripts(txHex); + + // B is dropped, A kept, body unchanged. + expect( + csl.Transaction.from_hex(filtered).witness_set().vkeys()?.len(), + ).toBe(1); + expect(resolveTxHash(filtered)).toEqual(resolveTxHash(txHex)); + const keptPub = csl.Transaction.from_hex(filtered) + .witness_set() + .vkeys()! + .get(0) + .vkey() + .public_key() + .as_bytes(); + expect(Buffer.from(keptPub).toString("hex")).toEqual( + Buffer.from(A.to_public().as_bytes()).toString("hex"), + ); + }); +}); diff --git a/src/components/common/cardano-objects/connect-wallet.tsx b/src/components/common/cardano-objects/connect-wallet.tsx index be8c98dc..2f58ee4f 100644 --- a/src/components/common/cardano-objects/connect-wallet.tsx +++ b/src/components/common/cardano-objects/connect-wallet.tsx @@ -1,4 +1,4 @@ -import { Wallet, Loader2, CheckCircle2, AlertCircle, ShieldCheck } from "lucide-react"; +import { Wallet, Loader2, CheckCircle2, AlertCircle, ShieldCheck, Sparkles, ChevronRight } from "lucide-react"; import { Button } from "@/components/ui/button"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { @@ -136,6 +136,9 @@ function ConnectWalletContent({ // Track wallet detection state const [detectingWallets, setDetectingWallets] = useState(true); const [dropdownOpen, setDropdownOpen] = useState(false); + // When no wallet extension is detected we lead with the UTXOS CTA; this lets + // a user opt into the full wallet picker anyway. + const [forceMenu, setForceMenu] = useState(false); const walletsRef = useRef(wallets); const hasInitializedPersist = useRef(false); const hasAttemptedAutoConnect = useRef(false); @@ -690,6 +693,46 @@ function ConnectWalletContent({ ); }; + // No Cardano wallet extension installed (detection has settled) and nothing + // connected yet: lead non-crypto users straight to UTXOS instead of a picker. + const noWalletDetected = + !forceMenu && + !detectingWallets && + wallets.length === 0 && + !isAnyWalletConnected; + + if (noWalletDetected) { + return ( +
+ + +
+ ); + } + return (
@@ -791,8 +834,8 @@ function ConnectWalletContent({ )} - {/* UTXOS Wallet Option - Featured for new users */} -
+ {/* UTXOS Wallet Option */} +
{ // Prevent Radix from auto-closing when interacting with nested controls (toggle). @@ -801,148 +844,132 @@ function ConnectWalletContent({ }} disabled={isUtxosLoading} className={cn( - "px-3 py-3 rounded-md", - "transition-all duration-150", - "cursor-default", - "border", - isUtxosEnabled && [ - "bg-zinc-100 dark:bg-zinc-800", - "border-zinc-200 dark:border-zinc-700", - ], - !isUtxosEnabled && [ - "border-blue-200 dark:border-blue-800", - "bg-blue-50 dark:bg-blue-950/30", - "hover:bg-blue-100 dark:hover:bg-blue-950/50", - ], - isUtxosLoading && "opacity-50 cursor-wait" + "block w-full cursor-default rounded-lg border p-3 transition-colors duration-150", + isUtxosEnabled && + "border-emerald-200 bg-emerald-50/60 dark:border-emerald-900/50 dark:bg-emerald-950/20", + // Only tint UTXOS as the suggested path when there's no wallet + // extension to choose; otherwise keep it neutral. + !isUtxosEnabled && + wallets.length === 0 && + "border-blue-200 bg-blue-50/70 dark:border-blue-900/60 dark:bg-blue-950/30", + !isUtxosEnabled && + wallets.length > 0 && + "border-zinc-200 dark:border-zinc-800", + isUtxosLoading && "cursor-wait opacity-60", )} > -
-
-
+ {/* Header: brand tile + name + status */} +
+ + {isUtxosEnabled ? ( + + ) : ( + + )} + +
+
+ + UTXOS + {isUtxosEnabled ? ( - - ) : ( - - )} -
- UTXOS - {!isUtxosEnabled && ( - - Recommended - - )} -
+ + Active + + ) : wallets.length === 0 ? ( + + Recommended + + ) : null}
- {isUtxosEnabled && ( - - Active - - )} +

+ Email or social login — no extension needed +

-

- No extension needed - sign in with email or social login -

+
+ + {/* Controls: network toggle + connect/disconnect */} +
e.stopPropagation()} + onPointerDown={(e) => e.stopPropagation()} + > + { + if (!value) return; + const next = (value === "mainnet" ? 1 : 0) as 0 | 1; + if (next === netId) return; - {/* Dedicated connect button to avoid toggle/click conflicts */} -
e.stopPropagation()} - onPointerDown={(e) => e.stopPropagation()} + if (isUtxosEnabled) { + toast({ + title: "Network switched", + description: + "Please reconnect your UTXOS wallet for the new network.", + variant: "default", + }); + } + setNetwork(next); + }} + className="gap-0.5 rounded-md border border-zinc-200 bg-white p-0.5 dark:border-zinc-800 dark:bg-zinc-950" > - -
- -
e.stopPropagation()} - onPointerDown={(e) => e.stopPropagation()} - > - - Network - - { - if (!value) return; - const next = (value === "mainnet" ? 1 : 0) as 0 | 1; - if (next === netId) return; - - if (isUtxosEnabled) { - toast({ - title: "Network switched", - description: - "Please reconnect your UTXOS wallet for the new network.", - variant: "default", - }); - } - setNetwork(next); - }} + Mainnet + + - - Mainnet - - - Testnet - - -
+ Testnet + +
+
@@ -969,6 +996,9 @@ function ConnectWalletContent({
) : (
+

+ Browser wallets +

{wallets.map((wallet) => { const isCurrentWallet = isConnected && connectedWalletName === wallet.id; @@ -993,26 +1023,31 @@ function ConnectWalletContent({ isConnecting && "opacity-50 cursor-wait" )} > -
-
- {isCurrentWallet ? ( - - ) : ( -
- )} - +
+
+ + {wallet.icon ? ( + // eslint-disable-next-line @next/next/no-img-element + + ) : ( + + )} + + {wallet.name}
- {isCurrentWallet && ( - + {isCurrentWallet ? ( + + Active + ) : ( + )}
diff --git a/src/components/common/empty-state.tsx b/src/components/common/empty-state.tsx new file mode 100644 index 00000000..eb3ff636 --- /dev/null +++ b/src/components/common/empty-state.tsx @@ -0,0 +1,46 @@ +import { type LucideIcon } from "lucide-react"; + +import { Card, CardContent } from "@/components/ui/card"; +import { cn } from "@/lib/utils"; + +interface EmptyStateProps { + icon?: LucideIcon; + title: string; + description?: string; + action?: React.ReactNode; + className?: string; +} + +/** + * Consistent empty-state card: an optional icon, a title, optional description, + * and an optional call-to-action. Replaces the ad-hoc plain-text "No X yet" + * strings scattered across the app. + */ +export function EmptyState({ + icon: Icon, + title, + description, + action, + className, +}: EmptyStateProps) { + return ( + + + {Icon && ( +
+ +
+ )} +
+

{title}

+ {description && ( +

+ {description} +

+ )} +
+ {action &&
{action}
} +
+
+ ); +} diff --git a/src/components/common/metatags.tsx b/src/components/common/metatags.tsx deleted file mode 100644 index dfcd0fa9..00000000 --- a/src/components/common/metatags.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import Head from "next/head"; - -export default function Metatags({ - title, - keywords, - description, - image = "/logo-mesh/mesh.png", -}: { - title?: string; - keywords?: string; - description?: string; - image?: string; -}) { - if (description === undefined) { - description = - "Secure your treasury and participate in Cardano governance as a team with multi-signature"; - } - if (keywords === undefined) { - keywords = - "cardano, blockchain, multisig, wallet, governance, smart contract, meshjs"; - } - if (title === undefined) { - title = "Cardano Multisig Platform"; - } - - title = title + " - Cardano Multisig Platform"; - - return ( - - - - - {title} - - - - - - - - - - {/* {image && ( - - )} */} - - {image && } - - - - - - {/* {image && ( - - )} */} - - - - - - - - - - - ); -} diff --git a/src/components/common/overall-layout/layout.tsx b/src/components/common/overall-layout/layout.tsx index 8b86a74f..9285c98a 100644 --- a/src/components/common/overall-layout/layout.tsx +++ b/src/components/common/overall-layout/layout.tsx @@ -6,6 +6,8 @@ import { publicRoutes } from "@/data/public-routes"; import { api } from "@/utils/api"; import useUser from "@/hooks/useUser"; import { useUserStore } from "@/lib/zustand/user"; +import { useAppearanceStore } from "@/lib/zustand/appearance"; +import { Background } from "@/components/ui/background"; import { normalizeAddressToBech32 } from "@/utils/addressCompatibility"; import useAppWallet from "@/hooks/useAppWallet"; import useUTXOS from "@/hooks/useUTXOS"; @@ -29,6 +31,7 @@ import { import LogoutWrapper from "@/components/common/overall-layout/mobile-wrappers/logout-wrapper"; import { PageHomepage } from "@/components/pages/homepage"; import Logo from "@/components/common/overall-layout/logo"; +import SiteFooter from "@/components/common/overall-layout/site-footer"; import dynamic from "next/dynamic"; import Loading from "@/components/common/overall-layout/loading"; import { MobileNavigation } from "@/components/ui/mobile-navigation"; @@ -124,7 +127,15 @@ export default function RootLayout({ const [checkingSession, setCheckingSession] = useState(false); const [hasCheckedSession, setHasCheckedSession] = useState(false); // Prevent duplicate checks const [showPostAuthLoading, setShowPostAuthLoading] = useState(false); // Show loading after authorization - + + // Animated background preference (persisted to localStorage). Gate render on a + // mounted flag so the server (which can't read localStorage) and the first + // client paint agree, avoiding a hydration mismatch. + const backgroundEnabled = useAppearanceStore((s) => s.backgroundEnabled); + const backgroundPreset = useAppearanceStore((s) => s.backgroundPreset); + const [appearanceMounted, setAppearanceMounted] = useState(false); + useEffect(() => setAppearanceMounted(true), []); + // Use WalletState for connection check const connected = String(walletState) === String(WalletState.CONNECTED); const anyWalletConnected = connected || isUtxosEnabled; @@ -456,6 +467,12 @@ export default function RootLayout({ const pageIsPublic = useMemo(() => publicRoutes.includes(router.pathname), [router.pathname]); const isLoggedIn = useMemo(() => !!user, [user]); const isHomepage = useMemo(() => router.pathname === "/", [router.pathname]); + // Marketing footer on public surfaces, but not on the logged-in homepage + // (which renders the wallet dashboard rather than the landing page). + const showFooter = useMemo( + () => pageIsPublic && !(isHomepage && isLoggedIn), + [pageIsPublic, isHomepage, isLoggedIn], + ); // Keep track of the last visited wallet to show wallet menu even on other pages const [lastVisitedWalletId, setLastVisitedWalletId] = React.useState(null); @@ -520,7 +537,19 @@ export default function RootLayout({ const walletIdForMenu = useMemo(() => (router.query.wallet as string) || lastVisitedWalletId || undefined, [router.query.wallet, lastVisitedWalletId]); return ( -
+
+ {/* Animated app background (on by default; toggle in profile → Appearance). + Renders on every route including the homepage, behind the homepage's + own hero background. */} + {appearanceMounted && backgroundEnabled && ( +
+ +
+ )} {/* Skip link for keyboard users */}