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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ Recipient
+ |
+
+ Token
+ |
+
+ Rate
+ |
+
+ Remaining Balance
+ |
+
+ Status
+ |
+
+ Actions
+ |
+
+
+
+ {filteredStreams.map((stream) => (
+
+ |
+ {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"