diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000..120f81c --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,36 @@ +# CI/CD Workflow + +This directory contains GitHub Actions workflows for automated testing and validation. + +## CI / Validation Workflow (`.github/workflows/test.yml`) + +**Purpose**: Prevents regressions by running all test suites and linting on every pull request to main. + +**Triggers**: + +- Pull requests targeting the `main` branch + +**What it does**: + +1. **Setup**: Installs Rust (stable) and Node.js (v20) with dependency caching +2. **Dependency Installation**: Uses `npm install` for both backend and frontend +3. **Code Quality**: Runs linting on both backend and frontend (if configured) +4. **Backend Tests**: Runs `npm test` in `/backend` (Vitest + TypeScript) +5. **Frontend Tests**: Runs `npm test --if-present` in `/frontend` (no test framework configured yet) +6. **Smart Contract Tests**: Runs `cargo test` in `/contracts` (Rust) + +**Failure Behavior**: + +- Workflow fails if any test or linting step fails +- Blocks PR merge until all checks pass +- Uses `--if-present` to avoid failures when test scripts are missing + +**Requirements for Contributors**: + +- Ensure lint and test scripts are properly configured in `package.json` +- Tests must pass in all directories where they exist +- New dependencies should be added to respective `package.json` files +- Backend uses Vitest, frontend has no test framework configured yet +- react-hot-toast is available as a root dependency + +**Note**: The workflow uses `continue-on-error: false` to ensure strict validation - any failure will prevent the PR from being merged. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..01660c9 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,68 @@ +name: CI / Validation + +on: + pull_request: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + contracts/target + key: ${{ runner.os }}-cargo-${{ hashFiles('contracts/**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Install backend dependencies + run: npm install + working-directory: ./backend + + - name: Install frontend dependencies + run: npm install + working-directory: ./frontend + + - name: Run linting (backend) + run: npm run lint --if-present + working-directory: ./backend + continue-on-error: false + + - name: Run linting (frontend) + run: npm run lint --if-present + working-directory: ./frontend + continue-on-error: false + + - name: Run Rust tests + run: cargo test + working-directory: ./contracts + continue-on-error: false + + - name: Run backend tests + run: npm test + working-directory: ./backend + continue-on-error: false + + - name: Run frontend tests + run: npm test + working-directory: ./frontend + continue-on-error: false diff --git a/backend/package.json b/backend/package.json index 6856d8f..42105e9 100644 --- a/backend/package.json +++ b/backend/package.json @@ -38,13 +38,19 @@ "@types/cors": "^2.8.19", "@types/express": "^5.0.6", "@types/node": "^25.2.3", + + "@types/supertest": "^6.0.3", + "@types/pg": "^8.16.0", + "@types/swagger-jsdoc": "^6.0.4", "@types/swagger-ui-express": "^4.1.6", "nodemon": "^3.1.11", "prisma": "^7.4.1", + "supertest": "^7.2.2", "ts-node": "^10.9.2", "tsx": "^4.19.2", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "vitest": "^4.0.18" } } diff --git a/backend/tsconfig.json b/backend/tsconfig.json index cfba994..2f81df9 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -43,4 +43,4 @@ "src/**/*", "tests/**/*" ] -} \ No newline at end of file +} diff --git a/frontend/app/layout.tsx b/frontend/app/layout.tsx index f92b217..3bad395 100644 --- a/frontend/app/layout.tsx +++ b/frontend/app/layout.tsx @@ -2,7 +2,6 @@ import type { Metadata } from "next"; import { IBM_Plex_Mono, Sora } from "next/font/google"; import React from "react"; -import "./globals.css"; import { WalletProvider } from "@/context/wallet-context"; import { Toaster } from "react-hot-toast"; import { ThemeProvider } from "@/context/theme-provider"; diff --git a/frontend/app/page.tsx b/frontend/app/page.tsx index d5669fe..6b974b8 100644 --- a/frontend/app/page.tsx +++ b/frontend/app/page.tsx @@ -1,59 +1,9 @@ -import Link from "next/link"; - -import { FAQ } from "@/components/FAQ"; -import { Features } from "@/components/Features"; -import { Footer } from "@/components/Footer"; -import { Hero } from "@/components/Hero"; -import { HowItWorks } from "@/components/HowItWorks"; -import { Navbar } from "@/components/Navbar"; -import { Stats } from "@/components/Stats"; +import OutgoingStreams from "@/components/OutgoingStreams"; export default function Home() { return (
-
-
-
-
-
- - - -
- - - - - -
-
-
-

- Ready to build the
- Money Network? -

-

- Join the hundreds of protocol builders and DAOs who have already - switched to real-time capital allocation. -

-
- - Launch App - - -
-
-
- - -
- -
); } diff --git a/frontend/components/OutgoingStreams.tsx b/frontend/components/OutgoingStreams.tsx new file mode 100644 index 0000000..aacd226 --- /dev/null +++ b/frontend/components/OutgoingStreams.tsx @@ -0,0 +1,224 @@ +"use client"; + +import React, { useState } from "react"; +import toast from "react-hot-toast"; + +interface OutgoingStreamData { + id: string; + recipient: string; + token: string; + rate: string; + remainingBalance: number; + status: "Active" | "Completed" | "Paused"; +} + +const mockOutgoingStreams: OutgoingStreamData[] = [ + { + id: "201", + recipient: "G...7xYp", + token: "USDC", + rate: "1000/mo", + remainingBalance: 2500.0, + status: "Active", + }, + { + id: "202", + recipient: "G...9KmN", + token: "XLM", + rate: "500/mo", + remainingBalance: 1200.0, + status: "Active", + }, + { + id: "203", + recipient: "G...3LqR", + token: "EURC", + rate: "750/mo", + remainingBalance: 0.0, + status: "Completed", + }, + { + id: "204", + recipient: "G...8ZtW", + token: "USDC", + rate: "2000/mo", + remainingBalance: 5000.0, + status: "Paused", + }, + { + id: "205", + recipient: "G...5PqV", + token: "XLM", + rate: "300/mo", + remainingBalance: 300.0, + status: "Active", + }, +]; + +const OutgoingStreams: React.FC = () => { + const [filter, setFilter] = useState< + "All" | "Active" | "Completed" | "Paused" + >("All"); + + const filteredStreams = + filter === "All" + ? mockOutgoingStreams + : mockOutgoingStreams.filter((s) => s.status === filter); + + const handleCancel = async (streamId: string) => { + const toastId = toast.loading("Cancelling stream..."); + + try { + // Simulate async transaction (replace with real blockchain call later) + await new Promise((resolve) => setTimeout(resolve, 2000)); + + toast.success("Stream cancelled successfully!", { id: toastId }); + } catch (error) { + console.error("Failed to cancel stream:", error); + toast.error("Failed to cancel stream.", { id: toastId }); + } + }; + + const handleModify = async (streamId: string) => { + const toastId = toast.loading("Opening modify dialog..."); + + try { + // Simulate opening modify dialog (replace with real modal later) + await new Promise((resolve) => setTimeout(resolve, 1000)); + + toast.success("Modify dialog opened!", { id: toastId }); + } catch (error) { + console.error("Failed to open modify dialog:", error); + toast.error("Failed to open modify dialog.", { id: toastId }); + } + }; + + const handleFilterChange = (e: React.ChangeEvent) => { + setFilter(e.target.value as "All" | "Active" | "Completed" | "Paused"); + }; + + return ( +
+
+

+ Outgoing Streams +

+
+ +
+ +
+ + + +
+
+
+
+ +
+ + + + + + + + + + + + + {filteredStreams.map((stream) => ( + + + + + + + + + ))} + +
+ Recipient + + Token + + Rate + + Remaining Balance + + Status + + Actions +
+ {stream.recipient} + + {stream.token} + + {stream.rate} + + {stream.remainingBalance.toFixed(2)} + + + {stream.status} + + +
+ + +
+
+ {filteredStreams.length === 0 && ( +
+ No {filter !== "All" ? filter.toLowerCase() : ""} streams found. +
+ )} +
+
+ ); +}; + +export default OutgoingStreams; diff --git a/frontend/package.json b/frontend/package.json index 031fc63..f0346be 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,24 +6,34 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "eslint" + "lint": "eslint", + "test": "vitest run" }, "dependencies": { "lucide-react": "^0.575.0", "next": "16.1.6", "next-themes": "^0.4.6", "react": "19.2.3", - "react-dom": "19.2.3", + + "react-dom": "19.2.3" + "react-hot-toast": "^2.6.0" + }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@vitest/ui": "^4.0.18", "eslint": "^9", "eslint-config-next": "16.1.6", + "jsdom": "^28.1.0", "tailwindcss": "^4", - "typescript": "^5" + "typescript": "^5", + "vitest": "^4.0.18" } } diff --git a/package-lock.json b/package-lock.json index 872d039..68fb395 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,11 +39,16 @@ "@types/cors": "^2.8.19", "@types/express": "^5.0.6", "@types/node": "^25.2.3", + + "@types/supertest": "^6.0.3", + "@types/pg": "^8.16.0", + "@types/swagger-jsdoc": "^6.0.4", "@types/swagger-ui-express": "^4.1.6", "nodemon": "^3.1.11", "prisma": "^7.4.1", + "supertest": "^7.2.2", "ts-node": "^10.9.2", "tsx": "^4.19.2", "typescript": "^5.9.3" @@ -70,13 +75,19 @@ }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.2", + "@testing-library/user-event": "^14.6.1", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@vitest/ui": "^4.0.18", "eslint": "^9", "eslint-config-next": "16.1.6", + "jsdom": "^28.1.0", "tailwindcss": "^4", - "typescript": "^5" + "typescript": "^5", + "vitest": "^4.0.18" } }, "frontend/node_modules/react": { @@ -1704,8 +1715,8 @@ "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@jsdevtools/ono": { @@ -2559,7 +2570,7 @@ "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/node/node_modules/undici-types": { @@ -2892,14 +2903,16 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/utils": { "version": "8.56.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz", @@ -3325,11 +3338,20 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "peer": true, "engines": { "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -4397,12 +4419,28 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/dotenv": { @@ -5771,8 +5809,6 @@ }, "node_modules/goober": { "version": "2.1.18", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.18.tgz", - "integrity": "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==", "license": "MIT", "peerDependencies": { "csstype": "^3.0.10" @@ -5831,7 +5867,7 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -6790,6 +6826,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">= 12.0.0" }, @@ -7297,10 +7334,14 @@ "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "mime-db": "^1.54.0" }, "engines": { - "node": "*" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/minimist": { @@ -8455,8 +8496,6 @@ }, "node_modules/react-hot-toast": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.6.0.tgz", - "integrity": "sha512-bH+2EBMZ4sdyou/DPrfgIouFpcRLCJ+HoCA32UoAYHn6T3Ur5yfcDCeSr5mwldl6pFOsiocmrXMuoCJ1vV8bWg==", "license": "MIT", "dependencies": { "csstype": "^3.1.3", @@ -8475,7 +8514,8 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/readable-stream": { "version": "3.6.2", @@ -8592,8 +8632,23 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/resolve-pkg-maps": { @@ -8602,8 +8657,25 @@ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/restore-cursor": { @@ -8793,8 +8865,26 @@ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "devOptional": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/send": { @@ -9158,7 +9248,7 @@ "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", "dev": true, - "license": "MIT" + "license": "ISC" }, "node_modules/stack-trace": { "version": "0.0.10", @@ -9190,11 +9280,7 @@ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, + "license": "ISC", "engines": { "node": ">= 0.4" } @@ -9257,25 +9343,10 @@ "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" + "semver": "^7.5.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, "node_modules/string.prototype.repeat": { @@ -9305,10 +9376,7 @@ "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, "node_modules/string.prototype.trimend": { @@ -9318,16 +9386,14 @@ "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/string.prototype.trimstart": { @@ -9336,16 +9402,11 @@ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/strip-ansi": { @@ -9369,9 +9430,11 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, "node_modules/strip-json-comments": { @@ -9381,10 +9444,7 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/styled-jsx": { @@ -9416,9 +9476,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { "node": ">=8" } @@ -9564,17 +9621,7 @@ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } + "license": "MIT" }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", @@ -9583,15 +9630,7 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "node": ">= 0.8" } }, "node_modules/tinyglobby/node_modules/picomatch": { @@ -9614,7 +9653,8 @@ "dev": true, "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { "node": ">=8.0" @@ -9712,10 +9752,7 @@ "dev": true, "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "safe-buffer": "~5.2.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { @@ -9767,7 +9804,7 @@ "prelude-ls": "^1.2.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.6.19" } }, "node_modules/type-is": { @@ -9791,12 +9828,14 @@ "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">= 0.4" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-byte-length": { @@ -9806,17 +9845,13 @@ "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/typed-array-byte-offset": { @@ -9825,20 +9860,11 @@ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/typed-array-length": { @@ -9849,17 +9875,11 @@ "license": "MIT", "dependencies": { "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { @@ -9908,9 +9928,17 @@ "license": "MIT", "dependencies": { "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9982,20 +10010,6 @@ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { "escalade": "^3.2.0", @@ -10107,19 +10121,10 @@ "dev": true, "license": "MIT", "dependencies": { + "call-bind": "^1.0.8", "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10135,10 +10140,9 @@ "dev": true, "license": "MIT", "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10154,19 +10158,10 @@ "dev": true, "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" + "min-indent": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/winston": { @@ -10349,7 +10344,7 @@ "node": ">=8.0.0" }, "optionalDependencies": { - "commander": "^9.4.1" + "commander": "^10.0.0" } }, "node_modules/z-schema/node_modules/commander": { @@ -10359,7 +10354,7 @@ "license": "MIT", "optional": true, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=14" } }, "node_modules/zeptomatch": { @@ -10375,8 +10370,6 @@ }, "node_modules/zod": { "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks"