+ AI-generated illustration, not scan data. The numbers above come from the scan.
+
diff --git a/components/ui/switch.tsx b/components/ui/switch.tsx
index 3c4cfa3..3c123d9 100644
--- a/components/ui/switch.tsx
+++ b/components/ui/switch.tsx
@@ -13,7 +13,7 @@ function Switch({
diff --git a/components/workflow-input-dialog.tsx b/components/workflow-input-dialog.tsx
index f3edc9f..dcbb3ba 100644
--- a/components/workflow-input-dialog.tsx
+++ b/components/workflow-input-dialog.tsx
@@ -11,7 +11,7 @@ import { Switch } from "@/components/ui/switch"
import { encryptValue, decryptValue } from "@/lib/security/encryption"
import type { StartNodeData } from "@/components/nodes/start-node"
-type ScanOptions = { githubToken?: string; scanMode?: "demo" | "real" }
+type ScanOptions = { githubToken?: string; scanMode?: "demo" | "real"; aiReport?: boolean }
type WorkflowInputDialogProps = {
open: boolean
@@ -22,12 +22,14 @@ type WorkflowInputDialogProps = {
}
export function WorkflowInputDialog({ open, startNodes, onSubmit, onCancel, workflowId }: WorkflowInputDialogProps) {
- // GitHub Scanner gets an extra control: a real/demo toggle + an optional BYOK
- // GitHub token (scan-DATA axis). The AI key (report-NARRATIVE axis) is handled
- // separately via the existing API Settings.
+ // GitHub Scanner gets two per-run switches (design doc §15): "Run a real scan" (scan-DATA axis,
+ // optional BYOK GitHub token) and "Write the report with my AI key" (report-NARRATIVE axis). Both are
+ // off by default; a saved AI key only makes the second one available, it never turns it on.
const isScanner = workflowId === "github-security-scanner"
const [githubToken, setGithubToken] = useState("")
const [realScan, setRealScan] = useState(false)
+ const [aiReport, setAiReport] = useState(false)
+ const [hasAiKey, setHasAiKey] = useState(false)
const [inputs, setInputs] = useState>(() => {
const initialInputs: Record = {}
startNodes.forEach((node) => {
@@ -46,6 +48,17 @@ export function WorkflowInputDialog({ open, startNodes, onSubmit, onCancel, work
})
setInputs(newInputs)
setErrors({})
+ setAiReport(false)
+
+ // Scanner: the AI-report switch is only available when an AI provider key is saved.
+ if (isScanner && typeof window !== "undefined") {
+ try {
+ const keys = JSON.parse(localStorage.getItem("ai-agent-api-keys") || "{}")
+ setHasAiKey(["openai", "anthropic", "google", "groq"].some((p) => Boolean(keys?.[p])))
+ } catch {
+ setHasAiKey(false)
+ }
+ }
// Scanner: load + decrypt any saved GitHub token (legacy plaintext passes through).
if (isScanner && typeof window !== "undefined") {
@@ -129,7 +142,11 @@ export function WorkflowInputDialog({ open, startNodes, onSubmit, onCancel, work
else localStorage.removeItem("ai-agent-github-token")
}
// realScan off => force demo; on => real (token optional: public repos scan tokenless).
- scanOptions = { githubToken: realScan && token ? token : undefined, scanMode: realScan ? "real" : "demo" }
+ scanOptions = {
+ githubToken: realScan && token ? token : undefined,
+ scanMode: realScan ? "real" : "demo",
+ aiReport: aiReport && hasAiKey,
+ }
}
onSubmit(inputs, scanOptions)
@@ -212,6 +229,18 @@ export function WorkflowInputDialog({ open, startNodes, onSubmit, onCancel, work
)}
+
+
+
+
+
+ {hasAiKey
+ ? "Uses your own AI provider key and quota. Off = a report built from the scan data, no AI calls. With a Google key, also draws an AI-generated illustration."
+ : "Add an AI provider key under API Keys to enable. Without it, the report is built from the scan data, with no AI calls."}
+
+
+
+
)}
diff --git a/lib/__tests__/scanner-axes.test.ts b/lib/__tests__/scanner-axes.test.ts
index ffa847e..009a19f 100644
--- a/lib/__tests__/scanner-axes.test.ts
+++ b/lib/__tests__/scanner-axes.test.ts
@@ -48,6 +48,29 @@ describe("resolveScanModes (two-axis BYOK)", () => {
})
})
+describe("resolveScanModes with the scanner's AI-report switch (design §15)", () => {
+ test("AI key saved but switch off -> templated report, no LLM (demo and real data)", () => {
+ expect(resolveScanModes({ apiKeys: { openai: "sk-x" }, aiReport: false }).narrativeMode).toBe("templated")
+ expect(resolveScanModes({ apiKeys: { openai: "sk-x" }, scanMode: "real", aiReport: false }).narrativeMode).toBe("templated")
+ })
+
+ test("switch on with an AI key -> LLM report", () => {
+ expect(resolveScanModes({ apiKeys: { anthropic: "sk-ant-x" }, aiReport: true }).narrativeMode).toBe("llm")
+ })
+
+ test("switch on without any AI key -> still templated", () => {
+ expect(resolveScanModes({ aiReport: true }).narrativeMode).toBe("templated")
+ })
+
+ test("switch off + sample data -> full demo, even with keys saved", () => {
+ expect(resolveScanModes({ apiKeys: { openai: "sk-x", google: "g" }, scanMode: "demo", aiReport: false }).demoMode).toBe(true)
+ })
+
+ test("other workflows (no aiReport given) keep the key-driven rule", () => {
+ expect(resolveScanModes({ apiKeys: { openai: "sk-x" } }).narrativeMode).toBe("llm")
+ })
+})
+
describe("resolveReportModel (provider-agnostic)", () => {
test("prefers anthropic, then openai, then google, then groq", () => {
expect(resolveReportModel({ anthropic: "x", openai: "y" })).toBe("anthropic/claude-3-5-sonnet-20241022")
diff --git a/lib/demo-mode.ts b/lib/demo-mode.ts
index 5e20cf8..51bd4e6 100644
--- a/lib/demo-mode.ts
+++ b/lib/demo-mode.ts
@@ -73,7 +73,10 @@ export interface ScanAxes {
/**
* Resolve the two scan axes from the available keys + explicit preferences.
*
- * - narrative: explicit demo/live preference wins; otherwise LLM iff an AI key exists.
+ * - narrative: explicit demo/live preference wins. When `aiReport` is given (the GitHub Scanner always
+ * passes it), the LLM runs only if the user switched the AI report on for this run AND an
+ * AI key exists: saved keys never trigger spending on their own (design §15). Without
+ * `aiReport` (other workflows via shouldUseDemoMode): LLM iff an AI key exists.
* - data: explicit scanMode wins; a "demo" preference forces mock data; otherwise
* real iff a GitHub token is present. (Public repos can scan tokenless at
* the lower rate limit, but we only flip to "real" on an explicit signal so
@@ -84,6 +87,8 @@ export function resolveScanModes(opts: {
githubToken?: string
scanMode?: ScanMode
userPreference?: DemoModePreference
+ /** Scanner only: the per-run "Write the report with my AI key" switch. */
+ aiReport?: boolean
}): ScanAxes {
const apiKeys = opts.apiKeys || {}
const hasAiKey = Boolean(
@@ -96,6 +101,7 @@ export function resolveScanModes(opts: {
let narrativeMode: "llm" | "templated"
if (pref === "demo") narrativeMode = "templated"
else if (pref === "live") narrativeMode = "llm"
+ else if (opts.aiReport !== undefined) narrativeMode = opts.aiReport && hasAiKey ? "llm" : "templated"
else narrativeMode = hasAiKey ? "llm" : "templated"
let dataMode: "real" | "demo"
diff --git a/lib/topflow-execution-engine.ts b/lib/topflow-execution-engine.ts
index 0401e6b..bd25446 100644
--- a/lib/topflow-execution-engine.ts
+++ b/lib/topflow-execution-engine.ts
@@ -16,6 +16,7 @@ import {
resolveReportModel
} from './demo-mode'
import { assertSafeOutboundUrl } from './security/ssrf'
+import { scanRepository } from './osv/scanner'
import { isTrustedCode, UNTRUSTED_CODE_MESSAGE } from './security/trusted-code'
import { evaluateCondition } from './conditions/safe-evaluate'
import {
@@ -131,7 +132,14 @@ export class TopFlowExecutionEngine extends ExecutionEngine {
// Data axis: mock when demo, real otherwise.
if (dataLogicNodes.includes(id)) {
- return this.dataMode === 'demo' ? { handled: true, result: await mock() } : { handled: false }
+ if (this.dataMode === 'demo') return { handled: true, result: await mock() }
+ // Real scan: call the scanner in process instead of fetching our own /api/scan/github over
+ // HTTP (the hosted service has no base URL for that, and HTTP-to-self would share one client
+ // IP for every visitor's scan). Design doc §15.5.
+ if (id === 'fetch-security') {
+ return { handled: true, result: await this.scanInProcess(inputs) }
+ }
+ return { handled: false }
}
// Narrative axis: URW-constrained LLM when "llm"; templated render otherwise.
@@ -166,6 +174,16 @@ export class TopFlowExecutionEngine extends ExecutionEngine {
return { handled: false }
}
+ /**
+ * Real scan of the repository chosen upstream (extract-repo → { fullName: "owner/repo" }).
+ */
+ private async scanInProcess(inputs: Record): Promise {
+ const fullName = String(inputs.input1?.fullName ?? '')
+ const match = fullName.match(/^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)$/)
+ if (!match) throw new Error('Expected a GitHub repository in the form owner/repo')
+ return scanRepository(match[1], match[2], { githubToken: this.githubToken })
+ }
+
/**
* Real execution for TopFlow-specific node types (the original switch).
*/
@@ -224,20 +242,16 @@ export class TopFlowExecutionEngine extends ExecutionEngine {
private async executeHttpRequestNode(node: Node, inputs: Record): Promise {
const data = node.data as any
- let url = data.url || ''
+ const url = data.url || ''
const method = (data.method || 'GET').toUpperCase()
// Templates may store headers as a JSON string; only spread real objects.
const headers: Record = (data.headers && typeof data.headers === 'object') ? { ...data.headers } : {}
const body = data.body || ''
- // Real-scan (per-axis) overrides for the GitHub Scanner data nodes:
- // - point the security node at the real OSV endpoint
- // - attach the user's GitHub token (BYOK): private repos + 5,000 req/hr
+ // Real scan: attach the visitor's GitHub token (BYOK) to the metadata request
+ // (private repos, 5,000 req/hr). The security node itself runs in process (scanInProcess).
if (this.perAxis && this.dataMode === 'real' && this.workflowId === 'github-security-scanner') {
- if (node.id === 'fetch-security') {
- url = '/api/scan/github/$input1.fullName'
- if (this.githubToken) headers['x-github-token'] = this.githubToken
- } else if (node.id === 'fetch-metadata' && this.githubToken) {
+ if (node.id === 'fetch-metadata' && this.githubToken) {
headers['Authorization'] = `Bearer ${this.githubToken}`
}
}
From 41a3d878b4e7272abdeb7272db698164d16d1230 Mon Sep 17 00:00:00 2001
From: csupenn
Date: Sun, 27 Sep 2026 18:19:50 -0700
Subject: [PATCH 8/9] docs(scanner): W6 workstream, tracker update, accepted
design revision 2
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Scanner page: 2x2 "before you run it" section with the AI-report
switch and who pays; README: no AI spending unless switched on;
CONTRIBUTING: security reports -> SECURITY.md.
- Design doc: revision 2 accepted; §6.1/§6.3/§10/§11/§13 notes.
- docs/development/osv-scanner: 05 tracker brought up to date
(Sept 26-27 items, new "M1.5" section, stale next steps fixed);
new 07-w6 workstream doc; README/roadmap index W6; June handoff
marked historical.
---
CONTRIBUTING.md | 2 +-
README.md | 2 +
app/showcase/security-scanner/page.tsx | 18 +++--
docs/architecture/osv-real-scan-design.md | 26 ++++++-
docs/development/osv-scanner/00-roadmap.md | 1 +
.../osv-scanner/05-implementation-status.md | 38 ++++++++--
docs/development/osv-scanner/06-handoff.md | 3 +
.../07-w6-real-scans-and-accurate-results.md | 72 +++++++++++++++++++
docs/development/osv-scanner/README.md | 4 +-
9 files changed, 153 insertions(+), 13 deletions(-)
create mode 100644 docs/development/osv-scanner/07-w6-real-scans-and-accurate-results.md
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ef6fded..96349ac 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -583,7 +583,7 @@ We value all contributions and will:
- **General Questions**: Open a [GitHub Discussion](https://github.com/csupenn/topflow/discussions)
- **Bug Reports**: Open a [GitHub Issue](https://github.com/csupenn/topflow/issues)
-- **Security Issues**: Email charlie@charliesu.com
+- **Security Issues**: Report privately; see [SECURITY.md](SECURITY.md)
- **Feature Proposals**: Open an issue with the "feature request" label
---
diff --git a/README.md b/README.md
index fd750ab..8acfcf5 100644
--- a/README.md
+++ b/README.md
@@ -30,6 +30,8 @@ database and explains what to upgrade.
([why](https://www.topflow.dev/blog/untrusted-reasoning-worker-llm-security)).
- **Runs show sample results by default.** Turn on **Run a real scan** in the run dialog for live data. Public
repos work without a key; a GitHub token raises GitHub's rate limit and allows private repos.
+- **No AI spending unless you ask.** The report is built from the scan data. An LLM report (your own key and
+ quota) runs only when you switch on **Write the report with my AI key** for that run; saved keys never turn it on.
**[Scan a repo →](https://www.topflow.dev/builder?template=github-security-scanner)**
diff --git a/app/showcase/security-scanner/page.tsx b/app/showcase/security-scanner/page.tsx
index 7e966e4..b3458e7 100644
--- a/app/showcase/security-scanner/page.tsx
+++ b/app/showcase/security-scanner/page.tsx
@@ -66,7 +66,7 @@ const STEPS = [
{ name: "Fetch Repo Metadata", detail: "Stars, language and default branch from the GitHub API." },
{ name: "Security Scan", detail: "Reads the manifests from GitHub, queries OSV.dev, and scores the result with the formula below." },
{ name: "Calculate Score", detail: "Prepares the score, grade and breakdown for the report. No AI involved." },
- { name: "Write the report", detail: "A template, or an LLM with your own key, explains the findings." },
+ { name: "Write the report", detail: "Built from the scan data; or, if you switch it on, an LLM with your own key explains the findings." },
]
const SCORE = [
@@ -219,7 +219,7 @@ export default function SecurityScannerShowcase() {
{/* Modes and data */}
-
+
Sample results (default)
@@ -236,10 +236,20 @@ export default function SecurityScannerShowcase() {
-
What goes where
+
AI-written report (optional)
+
+ Off by default, even if you've saved AI keys. Turn on{" "}
+ Write the report with my AI key for a run to have an LLM, using
+ your own key and quota, explain the findings. It can't change them. With a Google key it also draws
+ an illustration, labeled as AI-generated.
+
+
+
+
What goes where, and who pays
Our server receives the repo name and, if you add one, your GitHub token for that request. It calls the
- GitHub API and OSV.dev, and stores neither the results nor your token. The optional AI report uses your own provider key.
+ GitHub API and OSV.dev (free), and stores neither the results nor your token. Nothing calls an AI
+ provider unless you switch the AI report on.
diff --git a/docs/architecture/osv-real-scan-design.md b/docs/architecture/osv-real-scan-design.md
index 9aa8df4..883ebc5 100644
--- a/docs/architecture/osv-real-scan-design.md
+++ b/docs/architecture/osv-real-scan-design.md
@@ -2,7 +2,7 @@
| | |
|---|---|
-| **Status** | Revision 1 implemented (real scan, two axes, templated fallback). **Revision 2 — proposed 2026-09-27 (§15):** explicit opt-in for AI spending, labeled demo, in-process scanning |
+| **Status** | Revision 1 implemented (real scan, two axes, templated fallback). **Revision 2 accepted 2026-09-27 (§15):** explicit opt-in for AI spending, in-process scanning, rate-limited public route; sample labeling (§15.4) follows in a later PR |
| **Owner** | TopFlow |
| **Related** | `docs/architecture/architecture-overview.md`, `lib/templates/github-scanner.ts`, `lib/demo-mode.ts`, `lib/topflow-execution-engine.ts`, `app/api/demo/github-scan/[...repo]/route.ts` |
| **Scope** | Adds a real, opt-in scan path. Demo mode is unchanged. |
@@ -140,6 +140,10 @@ scanner. They must be treated separately — neither implies the other.
| **Report narrative** | **AI provider key** | the `AI Security Analysis` text-model node | `apiKeys` in the `/api/execute-workflow` body (never stored) | fall back to a **templated** (no-LLM) report rendered from `RepoAnalysis` |
### 6.1 Decoupled gating
+
+> **Superseded by §15.3 (Revision 2):** the narrative axis no longer follows "any AI key present"; it follows
+> an explicit per-run switch. The matrix below is kept as the history of Revision 1.
+
Today `shouldUseDemoMode` returns one boolean for the whole workflow, keyed **only** on the AI key —
so a GitHub token alone cannot trigger a real scan, and the data/narrative decisions are conflated.
The target design splits the decision **per axis**:
@@ -171,6 +175,9 @@ whichever provider the user actually has a key for (e.g. priority `anthropic →
groq`, mapping to a sensible default model per provider), rather than a fixed model string.
### 6.3 Templated (no-LLM) report fallback
+
+> **Revision 2:** the templated report is the **default** for every scanner run, not a fallback (§15.3).
+
A real scan should not *require* an AI key. When scan data is real but no AI key is present, render
the report deterministically from `RepoAnalysis` — exactly the approach `getGitHubScannerMockResponse`
already uses to synthesize report markdown from counts/practices/recommendations. This is factored
@@ -235,6 +242,10 @@ it; no downstream change is required either way.
## 10. Security & privacy
+> **Revision 2 additions (§15):** the hosted service sets **no** server-side GitHub token (the `GITHUB_TOKEN` fallback is
+> for self-hosted deployments only); the public scan route is rate-limited per client (HMAC-keyed IP); builder scans
+> call `scanRepository()` in process.
+
- **Two BYOK keys, neither stored.** The **GitHub token** arrives in a request header
(`x-github-token`) and the **AI key** in the `execute-workflow` body; both are used only for the
duration of the request and never written to disk, logs, or a database — consistent with the
@@ -257,6 +268,10 @@ it; no downstream change is required either way.
## 11. Error handling
+> **Revision 2 additions:** the public `/api/scan/github` route answers `429` (with `Retry-After`) after 10 requests
+> per minute per client (§15.5).
+
+
| Case | Behavior |
|---|---|
| Repo not found / private without token | `502` with an actionable message |
@@ -278,6 +293,10 @@ it; no downstream change is required either way.
## 13. Rollout
+> **Revision 2:** in-process scanning and the opt-in narrative ship in the same release, because fixing the
+> builder's real-scan path alone would also have made saved keys start spending (§15.1).
+
+
Standard `feature → dev → main` flow. Backend + docs land first (this PR, into `dev`). A follow-up
implements §6 (decoupled gating, provider-agnostic report model, templated fallback) and the UI:
a **GitHub-token field** (scan-data axis) alongside the existing **AI-key settings** (narrative
@@ -298,8 +317,9 @@ PR-comment bot reusing `lib/osv/scanner.ts`.
## 15. Revision 2 — proposed (2026-09-27)
-> **Status: Proposed.** Becomes **Accepted** when the implementing PRs are released; §6.1 is then rewritten to
-> match and this section keeps the history. Until then, §1–§14 describe the shipped behavior.
+> **Status: Accepted (2026-09-27)** — §15.2, §15.3, §15.5, §15.6 ship together in one release (branch
+> `feat/scanner-real-scan-and-cost`); §15.4 (sample labeling, no substitution) follows in a later PR. Where §1–§14
+> disagree with this section, this section wins; the notes added to §6.1, §6.3, §10, §11 and §13 point here.
### 15.1 Why
diff --git a/docs/development/osv-scanner/00-roadmap.md b/docs/development/osv-scanner/00-roadmap.md
index b5b6946..3644d3d 100644
--- a/docs/development/osv-scanner/00-roadmap.md
+++ b/docs/development/osv-scanner/00-roadmap.md
@@ -45,6 +45,7 @@ is ranked by **trust delivered per unit effort**, not by feature surface. Two tr
| W3 | Make a second template real (PII detection; GDPR stretch) | **P1** | M | W2 Phase 1 pattern | `03-p1-second-template.md` |
| W4 | Distribution loop (GitHub Action / PR bot + real README badges + SEO pages) | **P1** | M | real scan endpoint; CI enabled | `04-p1-distribution-loop.md` |
| W5 | Observability / execution history (audit substrate) | P2 | M | W2 | (roadmap Phase 3) |
+| W6 | Real scans on the hosted service, AI spending only on request, accurate results (Sept 2026) | **P0/P1** | M | real scan endpoint; design §15 | `07-w6-real-scans-and-accurate-results.md` |
Effort: **S** < 1 day · **M** 1–3 days · **L** ≥ 1 week.
diff --git a/docs/development/osv-scanner/05-implementation-status.md b/docs/development/osv-scanner/05-implementation-status.md
index 411b78c..283b311 100644
--- a/docs/development/osv-scanner/05-implementation-status.md
+++ b/docs/development/osv-scanner/05-implementation-status.md
@@ -1,7 +1,7 @@
# OSV Scanner — Implementation Status
-**Last updated:** 2026-09-26
-**Branch baseline:** `main` = `dev` @ `b180e80` (PR #31)
+**Last updated:** 2026-09-27
+**Branch baseline:** `main` @ `e0d2dc5` (release v1.5.0); W6 work on `feat/scanner-real-scan-and-cost`
This document is the ground truth between what the roadmap plans and what the code actually does. Update it as things land or get blocked — not after the fact.
@@ -92,6 +92,13 @@ defects in shipped code (H4 privacy, H11 SSRF bypass). Each shipped with a red-b
| **H6 Honest coverage** | Global 75% threshold was never met (~17%) and CI hid it (`continue-on-error`). Now per-file thresholds on the security core + execute route, a global ratchet floor, and a blocking `pnpm test:ci` | #28 | ✅ Shipped |
| **H11 SSRF bypass** | IPv4-mapped IPv6 in the URL parser's hex form (`[::ffff:a9fe:a9fe]` = `169.254.169.254`) passed `checkOutboundUrl`. Hex-embedded IPv4 is now decoded and re-checked; tests go through the parser | #29 | ✅ Shipped, verified in production |
| **H10 Validation panel parity** | `validation-engine.ts` (builder panel) had 0% coverage and a drifted copy of SSRF/cycle rules (reported "passed" for `[::1]`, CGNAT, `*.internal`, `file:`). Now delegates to `ssrf.ts` + `workflow-graph.ts`; 0% → 100% lines | #30 | ✅ Shipped |
+| **P3 Rate-limit key privacy** | Rate-limit keys are HMAC-SHA256 of the client IP under `RATE_LIMIT_KEY_SECRET` (a plain hash of an IPv4 address is brute-forceable) | #36 | ✅ Shipped |
+| **A3 Content Security Policy** | CSP in **report-only** mode from one source (`lib/security/security-headers.cjs`) + privacy-safe `/api/csp-report`; enforcement pending review of reports | #37 | ✅ Report-only |
+| **H13 Condition tester + builder values** | Condition "Test" isolated from the page; visual-builder values emitted as JSON literals (code injection) | #38 | ✅ Shipped |
+| **H17 User code containment** | JavaScript/Tool code ran via `new Function` with access to `process.env`/`fetch`. Hosted service now runs only built-in template code; conditions use a safe parser. Isolation design: `docs/architecture/js-node-isolation-design.md` | #42 (released #43) | ✅ Contained |
+| **Honest scanner surfaces** | Scanner page, README and badge describe what the scanner does; badge carries no score and accepts no writes | #50–#52 | ✅ Shipped |
+| **H12 Dependency patch** | Next.js 15.5.7 → 15.5.26, unused Auth.js removed; `pnpm audit --prod` 64 (6 critical) → 10 (0 critical); CI fails on new critical advisories (#61) | #53, #61 | ✅ Shipped |
+| **Repository foundation** | SECURITY.md, Dependabot, OpenSSF Scorecard workflow, Code of Conduct, issue/PR templates; plain MIT license (#59); release v1.5.0 | #59, #61 | ✅ Shipped |
### ssrf.ts: IPv4-mapped IPv6 bypass via URL normalization (H11)
@@ -108,6 +115,27 @@ IPv4 hosts, which the parser already normalizes safely). Tutorial 01 documents t
---
+## M1.5 — Real scans on the hosted service; AI spending only on request (W6)
+
+Workstream doc: `07-w6-real-scans-and-accurate-results.md`. Design: `docs/architecture/osv-real-scan-design.md` §15.
+
+| Item | What | PR | Status |
+|------|------|----|:------:|
+| **In-process scanning** | Builder real scans called `/api/scan/github` over HTTP at `NEXT_PUBLIC_BASE_URL` (unset on the hosted service → `fetch failed`). The engine now calls `scanRepository()` in process | feat/scanner-real-scan-and-cost | ✅ in `dev` |
+| **AI report on request** | The LLM report (and the Gemini image) ran whenever any AI key was saved. Now a per-run "Write the report with my AI key" switch, off by default; the scanner always takes the per-axis path (URW), never a plain text-model call | same | ✅ in `dev` |
+| **Public scan route rate limit** | `/api/scan/github` limited to 10 requests/min per client (HMAC-keyed IP), like the execution route; no server GitHub token on the hosted service | same | ✅ in `dev` |
+| **Conditions keep `<` / `>`** | Input sanitizing stripped `<>` from `condition` fields (`score >= 80` → `score = 80`); conditions are now exempt (read only by the safe parser) | same | ✅ in `dev` |
+| **Scanner key validation** | The route demanded keys for every template node's hard-coded model (e.g. Google for the image step); skipped for the scanner, which only uses the keys a run needs | same | ✅ in `dev` |
+| **Visible switches** | Unchecked switches were the same color as the page background; now have a visible track | same | ✅ in `dev` |
+| Sample-data labeling | Label sample results everywhere; no substituted data for repos outside the sample set; no `85`/`B+` defaults | — | 🔲 Planned |
+| Fix-version accuracy | Fix suggestions use the installed version's range (no downgrades or major jumps) | — | 🔲 Planned |
+| Production vs development dependencies | Report both; score on production | — | 🔲 Planned |
+| Score formula | Keep distinguishing repositories with many findings | — | 🔲 Planned |
+| Accuracy CI gate | Recorded OSV/GitHub fixtures for known-vulnerable and known-clean lockfiles | — | 🔲 Planned |
+| Conditional branches | The base engine runs both sides of every condition; skip the side that wasn't chosen | — | 🔲 Planned |
+
+---
+
## Open blockers
### B1 — `pnpm install --frozen-lockfile` prevents adding new dependencies in CI
@@ -133,13 +161,15 @@ Evaluate in this order: (1) `quickjs-emscripten` — pure wasm, no native binari
## What's next (ordered)
+0. **W6** — release the in-process/opt-in work, then the planned rows in "M1.5" above (`07-w6-…`)
+
1. ~~**W2 Phase 1** — constrained-selector~~ ✅ shipped (`lib/security/urw.ts`)
2. ~~**T4 durable rate limiter**~~ ✅ shipped (`lib/security/upstash-rate-limit-store.ts`; PR #20)
3. ~~**T6 claims reconciliation**~~ ✅ shipped (`docs/architecture/architecture-overview.md`; PR #19)
4. ~~**T7 drop `ignoreBuildErrors`**~~ ✅ shipped (`next.config.mjs`; PR #19)
5. ~~**Post-M1 hardening** (H4, H6, H10, H11)~~ ✅ shipped (PRs #25–#31, Sept 2026)
-6. **Rate-limit key privacy** — key Redis by a keyed hash of the client IP, not the raw IP (today: raw IP, ~65 s TTL)
-7. **CSP header** — report-only first, then enforce
+6. ~~**Rate-limit key privacy**~~ ✅ shipped (HMAC-SHA256 keys; PR #36)
+7. **CSP header** — ✅ report-only shipped (PR #37); enforcement pending review of reports
8. **T3 JS-node isolation** — design: [`docs/architecture/js-node-isolation-design.md`](../../architecture/js-node-isolation-design.md) (QuickJS/WebAssembly inside a `worker_thread`; spike results included). Since Sept 2026 (H17) custom JS/Tool code is refused on the hosted service until this ships
9. **W2 Phase 2** — trifecta guard + human-gated sinks (co-develops with T3)
10. **W3 PII Detection** — M2, after URW Phase 1 establishes the pattern
diff --git a/docs/development/osv-scanner/06-handoff.md b/docs/development/osv-scanner/06-handoff.md
index a7f92d2..06a2875 100644
--- a/docs/development/osv-scanner/06-handoff.md
+++ b/docs/development/osv-scanner/06-handoff.md
@@ -1,5 +1,8 @@
# Handoff — OSV Scanner Security Program
+> **Historical (June 2026).** Kept as a record of the June pause. For current status see
+> `05-implementation-status.md`; for the September work see its "Post-M1 hardening" and "M1.5" sections.
+
**Written:** 2026-06-14
**Branch at pause:** `feature/t4-durable-rate-limiter` (current working branch)
**Program tracker:** `05-implementation-status.md`
diff --git a/docs/development/osv-scanner/07-w6-real-scans-and-accurate-results.md b/docs/development/osv-scanner/07-w6-real-scans-and-accurate-results.md
new file mode 100644
index 0000000..65a0374
--- /dev/null
+++ b/docs/development/osv-scanner/07-w6-real-scans-and-accurate-results.md
@@ -0,0 +1,72 @@
+# W6 — Real Scans on the Hosted Service, AI Spending on Request, Accurate Results (P0/P1)
+
+**Priority:** P0 (release blockers first), then P1 · **Effort:** M overall, in small PRs
+**Design:** `docs/architecture/osv-real-scan-design.md` §15 (Revision 2)
+**Tracker rows:** `05-implementation-status.md` → "M1.5"
+
+---
+
+## Goal
+
+The GitHub Security Scanner should do what its page says, for any visitor, without surprise costs:
+
+1. **Keep the zero-setup demo** (sample data for a few well-known repos), labeled as sample data.
+2. **Real scans work on the hosted service** for public repos, anonymously or with the visitor's own GitHub token.
+3. **No AI-provider spending unless the visitor asks for it in that run.** Saved keys make the AI report
+ *available*; a per-run switch decides.
+4. **Results are accurate:** fix suggestions, dependency scope and the score hold up when someone checks them.
+
+## Owner constraints
+
+- The v1.4.0 demo used sample data on purpose, to launch quickly; it stays.
+- No LLM or image-model calls by default.
+- No server-side GitHub token on the hosted service (the `GITHUB_TOKEN` fallback is for self-hosting).
+
+## Target behavior
+
+Two per-run switches in the run dialog, both off by default (design §15.3):
+
+| "Run a real scan" | "Write the report with my AI key" | Data | Report | Who pays |
+|:---:|:---:|---|---|---|
+| off | off | sample (labeled) | built from the data | nobody |
+| off | on | sample (labeled) | URW-constrained LLM | visitor's AI key |
+| on | off | real (OSV + GitHub) | built from the data | GitHub quota (anonymous or visitor token); OSV is free |
+| on | on | real | URW-constrained LLM | visitor's AI key + the above |
+
+With the AI report on and a Google key saved, the image step also runs; the image is labeled "AI-generated
+illustration, not scan data".
+
+## Tasks
+
+| # | Task | Status |
+|---|---|:--:|
+| 1 | Engine calls `scanRepository()` in process for the Security Scan node (no HTTP to its own origin) | ✅ in `dev` |
+| 2 | Narrative axis follows the per-run switch (`aiReport`); scanner always takes the per-axis path (URW); image only with the switch + Google key, labeled | ✅ in `dev` |
+| 3 | Rate-limit `GET /api/scan/github` (10/min per client, HMAC-keyed IP) | ✅ in `dev` |
+| 4 | Keep `<` / `>` in `condition` fields through input sanitizing | ✅ in `dev` |
+| 5 | Scanner skips template-wide API-key validation (uses only the keys a run needs) | ✅ in `dev` |
+| 6 | Run dialog: AI-report switch (disabled without a saved AI key); visible switch styling | ✅ in `dev` |
+| 7 | Sample-data labeling in report header, badge and exports; no substituted data for repos outside the sample set; remove `85`/`B+` defaults | 🔲 |
+| 8 | Fix-version suggestions from the affected range that contains the installed version (no downgrades, no needless major or pre-release jumps) | 🔲 |
+| 9 | Production vs development dependencies from lockfiles; report both, score on production | 🔲 |
+| 10 | Score formula that keeps distinguishing repositories with many findings; scanner page formula table in sync | 🔲 |
+| 11 | Accuracy CI gate: recorded OSV/GitHub responses for a known-vulnerable and a known-clean lockfile (no network in CI) | 🔲 |
+| 12 | Skip the unchosen side of conditional branches in the engine (the base engine runs both) | 🔲 |
+| 13 | Later: real cached badge (W4 task 1); decide whether real scans become the default | 🔲 |
+
+## Acceptance criteria
+
+Design §15.8, plus:
+
+- Tasks 1–6: `app/api/execute-workflow/__tests__/scanner-real-scan-and-cost.test.ts` (real route + engine, AI SDK
+ and scanner mocked) and `app/api/scan/github/__tests__/rate-limit.test.ts`. Each was checked to fail on the
+ previous code for the intended reason (AI calls > 0; request to the app's own origin; 11th request → 200;
+ `grade-check` error from the stripped `>=`).
+- Task 8: fixtures built from real OSV records for packages with more than one affected release line.
+- A stranger scans their own public repo on the hosted service without help, and every number shown can be
+ traced to code.
+
+## Rollout
+
+Tasks 1–6 ship in one release: fixing the builder's real-scan path alone would have let saved AI keys start
+spending on the hosted service. Tasks 7–12 ship as separate small PRs, each with its own failing-first test.
diff --git a/docs/development/osv-scanner/README.md b/docs/development/osv-scanner/README.md
index 9b7c132..9d62fde 100644
--- a/docs/development/osv-scanner/README.md
+++ b/docs/development/osv-scanner/README.md
@@ -8,7 +8,7 @@ This folder is the working documentation hub for the GitHub Security Scanner fea
The OSV scanner turns TopFlow into a **real** security tool: given a GitHub repo, it fetches dependency manifests, queries the [OSV.dev](https://osv.dev) API, and returns structured vulnerability findings. The LLM is used only as a constrained selector over those findings — it cannot invent CVEs or modify severities.
-The work here is tracked across two P0 workstreams (W1 security hardening, W2 URW trust boundary) and two P1 workstreams (W3 second template, W4 distribution loop).
+The work here is tracked across two P0 workstreams (W1 security hardening, W2 URW trust boundary), two P1 workstreams (W3 second template, W4 distribution loop), and W6 (real scans on the hosted service, AI spending on request, accurate results).
---
@@ -23,6 +23,8 @@ The work here is tracked across two P0 workstreams (W1 security hardening, W2 UR
| `03-p1-second-template.md` | W3: making PII Detection real (the second URW-compliant template) |
| `04-p1-distribution-loop.md` | W4: real badge API, GitHub Action/PR bot, shareable report cards |
| `05-implementation-status.md` | Live tracking: what's shipped, what's in progress, what's blocked and why |
+| `06-handoff.md` | Historical (June 2026 pause); superseded by `05-implementation-status.md` |
+| `07-w6-real-scans-and-accurate-results.md` | W6: real scans on the hosted service, AI spending only on request, accurate results (design §15) |
## Tutorial series
From 2e0212f9c3c2636a30dfb1beb99f4646ff47fb7e Mon Sep 17 00:00:00 2001
From: csupenn
Date: Sun, 27 Sep 2026 18:39:05 -0700
Subject: [PATCH 9/9] Revert "chore(deps-dev): bump eslint-config-next from
15.5.26 to 16.3.6 (#69)"
This reverts commit 794ce39989f8d2bc802191520d74450da0c3090f, reversing
changes made to 1f78097ef3928c74e70b4addcc001e14ad0f9da3.
---
package.json | 2 +-
pnpm-lock.yaml | 738 +++++++++++++++++++++----------------------------
2 files changed, 313 insertions(+), 427 deletions(-)
diff --git a/package.json b/package.json
index 55fae1c..d2cd751 100644
--- a/package.json
+++ b/package.json
@@ -100,7 +100,7 @@
"@types/react": "^18",
"@types/react-dom": "^18",
"eslint": "^9.39.2",
- "eslint-config-next": "16.3.6",
+ "eslint-config-next": "15.5.26",
"husky": "^9.1.7",
"jest": "^30.2.0",
"jest-environment-jsdom": "^30.2.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 04a67ad..b527650 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -4,6 +4,11 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
+overrides:
+ lodash@4: ^4.18.1
+ nanoid@3: ^3.3.18
+ browserslist@4: ^4.28.7
+
importers:
.:
@@ -115,7 +120,7 @@ importers:
version: 1.38.0
'@vercel/analytics':
specifier: 1.3.1
- version: 1.3.1(next@15.5.26(@babel/core@7.28.5(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)
+ version: 1.3.1(next@15.5.26(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)
'@vercel/og':
specifier: ^0.8.6
version: 0.8.6
@@ -148,7 +153,7 @@ importers:
version: 11.18.2(@emotion/is-prop-valid@1.4.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
geist:
specifier: ^1.3.1
- version: 1.5.1(next@15.5.26(@babel/core@7.28.5(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
+ version: 1.5.1(next@15.5.26(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))
immer:
specifier: 11.1.3
version: 11.1.3
@@ -160,7 +165,7 @@ importers:
version: 0.454.0(react@19.1.0)
next:
specifier: 15.5.26
- version: 15.5.26(@babel/core@7.28.5(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ version: 15.5.26(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
@@ -209,7 +214,7 @@ importers:
devDependencies:
'@eslint/eslintrc':
specifier: ^3.3.3
- version: 3.3.3(supports-color@8.1.1)
+ version: 3.3.3
'@playwright/test':
specifier: ^1.57.0
version: 1.57.0
@@ -239,19 +244,19 @@ importers:
version: 18.3.7(@types/react@18.3.27)
eslint:
specifier: ^9.39.2
- version: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
+ version: 9.39.2(jiti@2.6.1)
eslint-config-next:
- specifier: 16.3.6
- version: 16.3.6(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
+ specifier: 15.5.26
+ version: 15.5.26(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
husky:
specifier: ^9.1.7
version: 9.1.7
jest:
specifier: ^30.2.0
- version: 30.2.0(@types/node@22.19.3)(supports-color@8.1.1)
+ version: 30.2.0(@types/node@22.19.3)
jest-environment-jsdom:
specifier: ^30.2.0
- version: 30.2.0(supports-color@8.1.1)
+ version: 30.2.0
lint-staged:
specifier: ^16.2.7
version: 16.2.7
@@ -661,105 +666,89 @@ packages:
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-arm@1.2.4':
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
cpu: [arm]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-ppc64@1.2.4':
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
cpu: [ppc64]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-riscv64@1.2.4':
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
cpu: [riscv64]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-s390x@1.2.4':
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
cpu: [s390x]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-x64@1.2.4':
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
cpu: [x64]
os: [linux]
- libc: [musl]
'@img/sharp-linux-arm64@0.34.5':
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-arm@0.34.5':
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-ppc64@0.34.5':
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-riscv64@0.34.5':
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [riscv64]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-s390x@0.34.5':
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-x64@0.34.5':
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@img/sharp-linuxmusl-arm64@0.34.5':
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@img/sharp-linuxmusl-x64@0.34.5':
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
- libc: [musl]
'@img/sharp-wasm32@0.34.5':
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
@@ -949,8 +938,8 @@ packages:
'@next/env@15.5.26':
resolution: {integrity: sha512-NJBz9q10LU9h3KjHLEbdgWIV+ow/x+MYzKBRfqhm9/QmML3tPMhYmXF/UIV9SDVCNtOqFNc5oX7kZqeiigMCEA==}
- '@next/eslint-plugin-next@16.3.6':
- resolution: {integrity: sha512-jowwDX+7DOlDIjJLgTMxudw+k37QnWu1JkZLkSi9MaJBfDYcfhAPMKBhXL0idYzFN/AGg//axnOR4cLkHX/Rng==}
+ '@next/eslint-plugin-next@15.5.26':
+ resolution: {integrity: sha512-xeVpG8CbnTf9IelaFbZQ7TN4BXHV2x+ejnXXbY7Z4kD+sgJ8j97psraV+4/fGjLCjNQuEofUHMeIeieDMyKO/w==}
'@next/swc-darwin-arm64@15.5.26':
resolution: {integrity: sha512-So8eoJxIcXw/TexNUvvh3uY72J9nDo5BpJsAwUKx+FK57CrWXg6RqVufV7U9OT3BO+siMzJ2FuAwBhaHoPlLGg==}
@@ -969,28 +958,24 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@next/swc-linux-arm64-musl@15.5.26':
resolution: {integrity: sha512-97AyKI34yjpaudlkWHswAf7c1PjWQAC7lLyrw3R5K+bq834EOA+9IG68rIVy0VqrqGjtPSMjJmMmgeJ3wHR5og==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@next/swc-linux-x64-gnu@15.5.26':
resolution: {integrity: sha512-eVtuOCew1sBPV7BEgxy7qxuVyqoU3tJIS/xDZwa1/NiQ4Q0LM2JMH7rny+/uVIN6hsQ3PTb0hTQWypA0L2QxtA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@next/swc-linux-x64-musl@15.5.26':
resolution: {integrity: sha512-EiUXADp+Z+OdQnSqbX10YgOSUrs0CXVODoTfySfsP2jdhngn9bq5RJd376FJzqMPe/XX25FMr1aXtYUVPA0qDw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- libc: [musl]
'@next/swc-win32-arm64-msvc@15.5.26':
resolution: {integrity: sha512-HPl41fgkC4kdM5CCIoqNW6KlKEj1N+xS6bjNFFxDNKooUNUu09frgD948zo95TPw/C3XINZpkdkBGNU2RhjEnw==}
@@ -1709,6 +1694,9 @@ packages:
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+ '@rushstack/eslint-patch@1.15.0':
+ resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==}
+
'@shuding/opentype.js@1.4.0-beta.0':
resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==}
engines: {node: '>= 8.0.0'}
@@ -1767,28 +1755,24 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.1.18':
resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.1.18':
resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.1.18':
resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.1.18':
resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
@@ -1960,63 +1944,63 @@ packages:
'@types/yargs@17.0.35':
resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
- '@typescript-eslint/eslint-plugin@8.70.1':
- resolution: {integrity: sha512-nDNrUQ/4ruSNYbu749TRY7cfrzPtoLHEXSNBI8aaNY32LlZCajixqRf3FqcKC4p5Cam4VOHYx/t+i5+nKXvrqA==}
+ '@typescript-eslint/eslint-plugin@8.52.0':
+ resolution: {integrity: sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.70.1
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ '@typescript-eslint/parser': ^8.52.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/parser@8.70.1':
- resolution: {integrity: sha512-nO974WLllwhSFWQXnMLj6nDGa8f0khKEz1JzpPJ1u7Vm/4X1X6ZHajpoknU4bb41vJyMB0HHVyS2GqdhWfIXZw==}
+ '@typescript-eslint/parser@8.52.0':
+ resolution: {integrity: sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/project-service@8.70.1':
- resolution: {integrity: sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA==}
+ '@typescript-eslint/project-service@8.52.0':
+ resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: '>=4.8.4 <6.1.0'
+ typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/scope-manager@8.70.1':
- resolution: {integrity: sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw==}
+ '@typescript-eslint/scope-manager@8.52.0':
+ resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.70.1':
- resolution: {integrity: sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg==}
+ '@typescript-eslint/tsconfig-utils@8.52.0':
+ resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: '>=4.8.4 <6.1.0'
+ typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/type-utils@8.70.1':
- resolution: {integrity: sha512-7zKTnyvaVWqzLZHPFQtX1hVHqgkMC+WebPWakNCSyrQVbIP1AM0L0TlBZtACldIRb6PptI8Odk+jyZ5kP3B1VA==}
+ '@typescript-eslint/type-utils@8.52.0':
+ resolution: {integrity: sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/types@8.70.1':
- resolution: {integrity: sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q==}
+ '@typescript-eslint/types@8.52.0':
+ resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.70.1':
- resolution: {integrity: sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g==}
+ '@typescript-eslint/typescript-estree@8.52.0':
+ resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: '>=4.8.4 <6.1.0'
+ typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/utils@8.70.1':
- resolution: {integrity: sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw==}
+ '@typescript-eslint/utils@8.52.0':
+ resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/visitor-keys@8.70.1':
- resolution: {integrity: sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw==}
+ '@typescript-eslint/visitor-keys@8.52.0':
+ resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ungap/structured-clone@1.3.0':
@@ -2062,49 +2046,41 @@ packages:
resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-arm64-musl@1.11.1':
resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
cpu: [ppc64]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
cpu: [riscv64]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
cpu: [riscv64]
os: [linux]
- libc: [musl]
'@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
cpu: [s390x]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-x64-gnu@1.11.1':
resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-x64-musl@1.11.1':
resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
cpu: [x64]
os: [linux]
- libc: [musl]
'@unrs/resolver-binding-wasm32-wasi@1.11.1':
resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
@@ -2315,10 +2291,6 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- balanced-match@4.0.4:
- resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
- engines: {node: 18 || 20 || >=22}
-
base64-js@0.0.8:
resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==}
engines: {node: '>= 0.4'}
@@ -2334,10 +2306,6 @@ packages:
brace-expansion@2.0.2:
resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
- brace-expansion@5.0.12:
- resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==}
- engines: {node: 20 || >=22}
-
braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
@@ -2765,10 +2733,10 @@ packages:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
- eslint-config-next@16.3.6:
- resolution: {integrity: sha512-1Upt3U7BDwU+ilpe2byZjAfts9oNq4d4fv/zXEvs8/4yS+cwOQW/WCxUNy8gCDquX67SzeehDvKblVC6ZBMocQ==}
+ eslint-config-next@15.5.26:
+ resolution: {integrity: sha512-nekKvDmRQV8VRUhBTt2B/HFdgNR0vWKA/ao5W1L7lcaEvAXsuQYjIJqwLUGaux9uvXOrxnxLu5dQjnRnOixcfw==}
peerDependencies:
- eslint: '>=9.0.0'
+ eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
typescript: '>=3.3.1'
peerDependenciesMeta:
typescript:
@@ -2827,11 +2795,11 @@ packages:
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
- eslint-plugin-react-hooks@7.1.1:
- resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==}
- engines: {node: '>=18'}
+ eslint-plugin-react-hooks@5.2.0:
+ resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+ engines: {node: '>=10'}
peerDependencies:
- eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
eslint-plugin-react@7.37.5:
resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==}
@@ -2851,10 +2819,6 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint-visitor-keys@5.0.1:
- resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
- engines: {node: ^20.19.0 || ^22.13.0 || >=24}
-
eslint@9.39.2:
resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3088,10 +3052,6 @@ packages:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'}
- globals@16.4.0:
- resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==}
- engines: {node: '>=18'}
-
globalthis@1.0.4:
resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
engines: {node: '>= 0.4'}
@@ -3137,12 +3097,6 @@ packages:
headers-polyfill@4.0.3:
resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==}
- hermes-estree@0.25.1:
- resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==}
-
- hermes-parser@0.25.1:
- resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==}
-
hex-rgb@4.3.0:
resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==}
engines: {node: '>=6'}
@@ -3632,28 +3586,24 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
- libc: [glibc]
lightningcss-linux-arm64-musl@1.30.2:
resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
- libc: [musl]
lightningcss-linux-x64-gnu@1.30.2:
resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
- libc: [glibc]
lightningcss-linux-x64-musl@1.30.2:
resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
- libc: [musl]
lightningcss-win32-arm64-msvc@1.30.2:
resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
@@ -3760,10 +3710,6 @@ packages:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
- minimatch@10.2.6:
- resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
- engines: {node: 18 || 20 || >=22}
-
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -4515,8 +4461,8 @@ packages:
resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
engines: {node: '>=18'}
- ts-api-utils@2.5.0:
- resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==}
+ ts-api-utils@2.4.0:
+ resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
@@ -4562,13 +4508,6 @@ packages:
resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
engines: {node: '>= 0.4'}
- typescript-eslint@8.70.1:
- resolution: {integrity: sha512-AcWG7KDjZ2THNXsgwttMaGmzVi0VFRlFYfqFHYQRbDpF3owuYbuiL8c7UUrd2k8s3PoSfIQrWfrGXfcElrWLYA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
-
typescript@5.9.3:
resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
engines: {node: '>=14.17'}
@@ -4597,7 +4536,7 @@ packages:
resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==}
hasBin: true
peerDependencies:
- browserslist: '>= 4.21.0'
+ browserslist: ^4.28.7
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -4762,12 +4701,6 @@ packages:
yoga-layout@3.2.1:
resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==}
- zod-validation-error@4.0.2:
- resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- zod: ^3.25.0 || ^4.0.0
-
zod@3.25.67:
resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==}
@@ -4879,20 +4812,20 @@ snapshots:
'@babel/compat-data@7.28.5': {}
- '@babel/core@7.28.5(supports-color@8.1.1)':
+ '@babel/core@7.28.5':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/generator': 7.28.5
'@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5(supports-color@8.1.1))(supports-color@8.1.1)
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
'@babel/helpers': 7.28.4
'@babel/parser': 7.28.5
'@babel/template': 7.27.2
- '@babel/traverse': 7.28.5(supports-color@8.1.1)
+ '@babel/traverse': 7.28.5
'@babel/types': 7.28.5
'@jridgewell/remapping': 2.3.5
convert-source-map: 2.0.0
- debug: 4.4.3(supports-color@8.1.1)
+ debug: 4.4.3
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@@ -4917,19 +4850,19 @@ snapshots:
'@babel/helper-globals@7.28.0': {}
- '@babel/helper-module-imports@7.27.1(supports-color@8.1.1)':
+ '@babel/helper-module-imports@7.27.1':
dependencies:
- '@babel/traverse': 7.28.5(supports-color@8.1.1)
+ '@babel/traverse': 7.28.5
'@babel/types': 7.28.5
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5(supports-color@8.1.1))(supports-color@8.1.1)':
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
- '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1)
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
- '@babel/traverse': 7.28.5(supports-color@8.1.1)
+ '@babel/traverse': 7.28.5
transitivePeerDependencies:
- supports-color
@@ -4950,89 +4883,89 @@ snapshots:
dependencies:
'@babel/types': 7.28.5
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
- '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5(supports-color@8.1.1))':
+ '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/helper-plugin-utils': 7.27.1
'@babel/runtime@7.28.4': {}
@@ -5043,7 +4976,7 @@ snapshots:
'@babel/parser': 7.28.5
'@babel/types': 7.28.5
- '@babel/traverse@7.28.5(supports-color@8.1.1)':
+ '@babel/traverse@7.28.5':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/generator': 7.28.5
@@ -5051,7 +4984,7 @@ snapshots:
'@babel/parser': 7.28.5
'@babel/template': 7.27.2
'@babel/types': 7.28.5
- debug: 4.4.3(supports-color@8.1.1)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -5115,17 +5048,17 @@ snapshots:
'@emotion/memoize@0.9.0': {}
- '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))':
+ '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))':
dependencies:
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
+ eslint: 9.39.2(jiti@2.6.1)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {}
- '@eslint/config-array@0.21.1(supports-color@8.1.1)':
+ '@eslint/config-array@0.21.1':
dependencies:
'@eslint/object-schema': 2.1.7
- debug: 4.4.3(supports-color@8.1.1)
+ debug: 4.4.3
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -5138,10 +5071,10 @@ snapshots:
dependencies:
'@types/json-schema': 7.0.15
- '@eslint/eslintrc@3.3.3(supports-color@8.1.1)':
+ '@eslint/eslintrc@3.3.3':
dependencies:
ajv: 6.12.6
- debug: 4.4.3(supports-color@8.1.1)
+ debug: 4.4.3
espree: 10.4.0
globals: 14.0.0
ignore: 5.3.2
@@ -5346,13 +5279,13 @@ snapshots:
jest-util: 30.2.0
slash: 3.0.0
- '@jest/core@30.2.0(supports-color@8.1.1)':
+ '@jest/core@30.2.0':
dependencies:
'@jest/console': 30.2.0
'@jest/pattern': 30.0.1
- '@jest/reporters': 30.2.0(supports-color@8.1.1)
+ '@jest/reporters': 30.2.0
'@jest/test-result': 30.2.0
- '@jest/transform': 30.2.0(supports-color@8.1.1)
+ '@jest/transform': 30.2.0
'@jest/types': 30.2.0
'@types/node': 22.19.3
ansi-escapes: 4.3.2
@@ -5361,15 +5294,15 @@ snapshots:
exit-x: 0.2.2
graceful-fs: 4.2.11
jest-changed-files: 30.2.0
- jest-config: 30.2.0(@types/node@22.19.3)(supports-color@8.1.1)
+ jest-config: 30.2.0(@types/node@22.19.3)
jest-haste-map: 30.2.0
jest-message-util: 30.2.0
jest-regex-util: 30.0.1
jest-resolve: 30.2.0
- jest-resolve-dependencies: 30.2.0(supports-color@8.1.1)
- jest-runner: 30.2.0(supports-color@8.1.1)
- jest-runtime: 30.2.0(supports-color@8.1.1)
- jest-snapshot: 30.2.0(supports-color@8.1.1)
+ jest-resolve-dependencies: 30.2.0
+ jest-runner: 30.2.0
+ jest-runtime: 30.2.0
+ jest-snapshot: 30.2.0
jest-util: 30.2.0
jest-validate: 30.2.0
jest-watcher: 30.2.0
@@ -5384,7 +5317,7 @@ snapshots:
'@jest/diff-sequences@30.0.1': {}
- '@jest/environment-jsdom-abstract@30.2.0(jsdom@26.1.0(supports-color@8.1.1))':
+ '@jest/environment-jsdom-abstract@30.2.0(jsdom@26.1.0)':
dependencies:
'@jest/environment': 30.2.0
'@jest/fake-timers': 30.2.0
@@ -5393,7 +5326,7 @@ snapshots:
'@types/node': 22.19.3
jest-mock: 30.2.0
jest-util: 30.2.0
- jsdom: 26.1.0(supports-color@8.1.1)
+ jsdom: 26.1.0
'@jest/environment@30.2.0':
dependencies:
@@ -5406,10 +5339,10 @@ snapshots:
dependencies:
'@jest/get-type': 30.1.0
- '@jest/expect@30.2.0(supports-color@8.1.1)':
+ '@jest/expect@30.2.0':
dependencies:
expect: 30.2.0
- jest-snapshot: 30.2.0(supports-color@8.1.1)
+ jest-snapshot: 30.2.0
transitivePeerDependencies:
- supports-color
@@ -5424,10 +5357,10 @@ snapshots:
'@jest/get-type@30.1.0': {}
- '@jest/globals@30.2.0(supports-color@8.1.1)':
+ '@jest/globals@30.2.0':
dependencies:
'@jest/environment': 30.2.0
- '@jest/expect': 30.2.0(supports-color@8.1.1)
+ '@jest/expect': 30.2.0
'@jest/types': 30.2.0
jest-mock: 30.2.0
transitivePeerDependencies:
@@ -5438,12 +5371,12 @@ snapshots:
'@types/node': 22.19.3
jest-regex-util: 30.0.1
- '@jest/reporters@30.2.0(supports-color@8.1.1)':
+ '@jest/reporters@30.2.0':
dependencies:
'@bcoe/v8-coverage': 0.2.3
'@jest/console': 30.2.0
'@jest/test-result': 30.2.0
- '@jest/transform': 30.2.0(supports-color@8.1.1)
+ '@jest/transform': 30.2.0
'@jest/types': 30.2.0
'@jridgewell/trace-mapping': 0.3.31
'@types/node': 22.19.3
@@ -5453,9 +5386,9 @@ snapshots:
glob: 10.5.0
graceful-fs: 4.2.11
istanbul-lib-coverage: 3.2.2
- istanbul-lib-instrument: 6.0.3(supports-color@8.1.1)
+ istanbul-lib-instrument: 6.0.3
istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 5.0.6(supports-color@8.1.1)
+ istanbul-lib-source-maps: 5.0.6
istanbul-reports: 3.2.0
jest-message-util: 30.2.0
jest-util: 30.2.0
@@ -5497,12 +5430,12 @@ snapshots:
jest-haste-map: 30.2.0
slash: 3.0.0
- '@jest/transform@30.2.0(supports-color@8.1.1)':
+ '@jest/transform@30.2.0':
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@jest/types': 30.2.0
'@jridgewell/trace-mapping': 0.3.31
- babel-plugin-istanbul: 7.0.1(supports-color@8.1.1)
+ babel-plugin-istanbul: 7.0.1
chalk: 4.1.2
convert-source-map: 2.0.0
fast-json-stable-stringify: 2.1.0
@@ -5564,12 +5497,9 @@ snapshots:
'@next/env@15.5.26': {}
- '@next/eslint-plugin-next@16.3.6(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))':
+ '@next/eslint-plugin-next@15.5.26':
dependencies:
- '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))
fast-glob: 3.3.1
- transitivePeerDependencies:
- - eslint
'@next/swc-darwin-arm64@15.5.26':
optional: true
@@ -6325,6 +6255,8 @@ snapshots:
'@rtsao/scc@1.1.0': {}
+ '@rushstack/eslint-patch@1.15.0': {}
+
'@shuding/opentype.js@1.4.0-beta.0':
dependencies:
fflate: 0.7.4
@@ -6570,96 +6502,96 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
- '@typescript-eslint/eslint-plugin@8.70.1(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)':
+ '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/scope-manager': 8.70.1
- '@typescript-eslint/type-utils': 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/utils': 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.70.1
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
+ '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.52.0
+ '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.52.0
+ eslint: 9.39.2(jiti@2.6.1)
ignore: 7.0.5
natural-compare: 1.4.0
- ts-api-utils: 2.5.0(typescript@5.9.3)
+ ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)':
+ '@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.70.1
- '@typescript-eslint/types': 8.70.1
- '@typescript-eslint/typescript-estree': 8.70.1(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.70.1
- debug: 4.4.3(supports-color@8.1.1)
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
+ '@typescript-eslint/scope-manager': 8.52.0
+ '@typescript-eslint/types': 8.52.0
+ '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.52.0
+ debug: 4.4.3
+ eslint: 9.39.2(jiti@2.6.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.70.1(supports-color@8.1.1)(typescript@5.9.3)':
+ '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.70.1(typescript@5.9.3)
- '@typescript-eslint/types': 8.70.1
- debug: 4.4.3(supports-color@8.1.1)
+ '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.52.0
+ debug: 4.4.3
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.70.1':
+ '@typescript-eslint/scope-manager@8.52.0':
dependencies:
- '@typescript-eslint/types': 8.70.1
- '@typescript-eslint/visitor-keys': 8.70.1
+ '@typescript-eslint/types': 8.52.0
+ '@typescript-eslint/visitor-keys': 8.52.0
- '@typescript-eslint/tsconfig-utils@8.70.1(typescript@5.9.3)':
+ '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
- '@typescript-eslint/type-utils@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)':
+ '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/types': 8.70.1
- '@typescript-eslint/typescript-estree': 8.70.1(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/utils': 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
- debug: 4.4.3(supports-color@8.1.1)
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
- ts-api-utils: 2.5.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.52.0
+ '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ debug: 4.4.3
+ eslint: 9.39.2(jiti@2.6.1)
+ ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.70.1': {}
+ '@typescript-eslint/types@8.52.0': {}
- '@typescript-eslint/typescript-estree@8.70.1(supports-color@8.1.1)(typescript@5.9.3)':
+ '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/project-service': 8.70.1(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/tsconfig-utils': 8.70.1(typescript@5.9.3)
- '@typescript-eslint/types': 8.70.1
- '@typescript-eslint/visitor-keys': 8.70.1
- debug: 4.4.3(supports-color@8.1.1)
- minimatch: 10.2.6
+ '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3)
+ '@typescript-eslint/types': 8.52.0
+ '@typescript-eslint/visitor-keys': 8.52.0
+ debug: 4.4.3
+ minimatch: 9.0.5
semver: 7.7.3
tinyglobby: 0.2.15
- ts-api-utils: 2.5.0(typescript@5.9.3)
+ ts-api-utils: 2.4.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)':
+ '@typescript-eslint/utils@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))
- '@typescript-eslint/scope-manager': 8.70.1
- '@typescript-eslint/types': 8.70.1
- '@typescript-eslint/typescript-estree': 8.70.1(supports-color@8.1.1)(typescript@5.9.3)
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
+ '@typescript-eslint/scope-manager': 8.52.0
+ '@typescript-eslint/types': 8.52.0
+ '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.70.1':
+ '@typescript-eslint/visitor-keys@8.52.0':
dependencies:
- '@typescript-eslint/types': 8.70.1
- eslint-visitor-keys: 5.0.1
+ '@typescript-eslint/types': 8.52.0
+ eslint-visitor-keys: 4.2.1
'@ungap/structured-clone@1.3.0': {}
@@ -6726,11 +6658,11 @@ snapshots:
dependencies:
uncrypto: 0.1.3
- '@vercel/analytics@1.3.1(next@15.5.26(@babel/core@7.28.5(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)':
+ '@vercel/analytics@1.3.1(next@15.5.26(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)':
dependencies:
server-only: 0.0.1
optionalDependencies:
- next: 15.5.26(@babel/core@7.28.5(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ next: 15.5.26(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
react: 19.1.0
'@vercel/og@0.8.6':
@@ -6915,25 +6847,25 @@ snapshots:
axobject-query@4.1.0: {}
- babel-jest@30.2.0(@babel/core@7.28.5(supports-color@8.1.1))(supports-color@8.1.1):
+ babel-jest@30.2.0(@babel/core@7.28.5):
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
- '@jest/transform': 30.2.0(supports-color@8.1.1)
+ '@babel/core': 7.28.5
+ '@jest/transform': 30.2.0
'@types/babel__core': 7.20.5
- babel-plugin-istanbul: 7.0.1(supports-color@8.1.1)
- babel-preset-jest: 30.2.0(@babel/core@7.28.5(supports-color@8.1.1))
+ babel-plugin-istanbul: 7.0.1
+ babel-preset-jest: 30.2.0(@babel/core@7.28.5)
chalk: 4.1.2
graceful-fs: 4.2.11
slash: 3.0.0
transitivePeerDependencies:
- supports-color
- babel-plugin-istanbul@7.0.1(supports-color@8.1.1):
+ babel-plugin-istanbul@7.0.1:
dependencies:
'@babel/helper-plugin-utils': 7.27.1
'@istanbuljs/load-nyc-config': 1.1.0
'@istanbuljs/schema': 0.1.3
- istanbul-lib-instrument: 6.0.3(supports-color@8.1.1)
+ istanbul-lib-instrument: 6.0.3
test-exclude: 6.0.0
transitivePeerDependencies:
- supports-color
@@ -6942,35 +6874,33 @@ snapshots:
dependencies:
'@types/babel__core': 7.20.5
- babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5(supports-color@8.1.1)):
- dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5(supports-color@8.1.1))
-
- babel-preset-jest@30.2.0(@babel/core@7.28.5(supports-color@8.1.1)):
- dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5):
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5)
+ '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5)
+
+ babel-preset-jest@30.2.0(@babel/core@7.28.5):
+ dependencies:
+ '@babel/core': 7.28.5
babel-plugin-jest-hoist: 30.2.0
- babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5(supports-color@8.1.1))
+ babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5)
balanced-match@1.0.2: {}
- balanced-match@4.0.4: {}
-
base64-js@0.0.8: {}
baseline-browser-mapping@2.11.26: {}
@@ -6984,10 +6914,6 @@ snapshots:
dependencies:
balanced-match: 1.0.2
- brace-expansion@5.0.12:
- dependencies:
- balanced-match: 4.0.4
-
braces@3.0.3:
dependencies:
fill-range: 7.1.1
@@ -7227,17 +7153,13 @@ snapshots:
date-fns@4.1.0: {}
- debug@3.2.7(supports-color@8.1.1):
+ debug@3.2.7:
dependencies:
ms: 2.1.3
- optionalDependencies:
- supports-color: 8.1.1
- debug@4.4.3(supports-color@8.1.1):
+ debug@4.4.3:
dependencies:
ms: 2.1.3
- optionalDependencies:
- supports-color: 8.1.1
decimal.js-light@2.5.1: {}
@@ -7436,72 +7358,72 @@ snapshots:
escape-string-regexp@4.0.0: {}
- eslint-config-next@16.3.6(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3):
- dependencies:
- '@next/eslint-plugin-next': 16.3.6(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
- eslint-import-resolver-node: 0.3.9(supports-color@8.1.1)
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)
- eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))
- eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))
- eslint-plugin-react-hooks: 7.1.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)
- globals: 16.4.0
- typescript-eslint: 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
+ eslint-config-next@15.5.26(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3):
+ dependencies:
+ '@next/eslint-plugin-next': 15.5.26
+ '@rushstack/eslint-patch': 1.15.0
+ '@typescript-eslint/eslint-plugin': 8.52.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1))
+ eslint-plugin-react-hooks: 5.2.0(eslint@9.39.2(jiti@2.6.1))
optionalDependencies:
typescript: 5.9.3
transitivePeerDependencies:
- - '@typescript-eslint/parser'
- eslint-import-resolver-webpack
- eslint-plugin-import-x
- supports-color
- eslint-import-resolver-node@0.3.9(supports-color@8.1.1):
+ eslint-import-resolver-node@0.3.9:
dependencies:
- debug: 3.2.7(supports-color@8.1.1)
+ debug: 3.2.7
is-core-module: 2.16.1
resolve: 1.22.11
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1):
+ eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
- debug: 4.4.3(supports-color@8.1.1)
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
+ debug: 4.4.3
+ eslint: 9.39.2(jiti@2.6.1)
get-tsconfig: 4.13.0
is-bun-module: 2.0.0
stable-hash: 0.0.5
tinyglobby: 0.2.15
unrs-resolver: 1.11.1
optionalDependencies:
- eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)
+ eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.1(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1):
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
- debug: 3.2.7(supports-color@8.1.1)
+ debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
- eslint-import-resolver-node: 0.3.9(supports-color@8.1.1)
- eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)
+ '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
+ eslint: 9.39.2(jiti@2.6.1)
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2(jiti@2.6.1))
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
array.prototype.findlastindex: 1.2.6
array.prototype.flat: 1.3.3
array.prototype.flatmap: 1.3.3
- debug: 3.2.7(supports-color@8.1.1)
+ debug: 3.2.7
doctrine: 2.1.0
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
- eslint-import-resolver-node: 0.3.9(supports-color@8.1.1)
- eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)
+ eslint: 9.39.2(jiti@2.6.1)
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2(jiti@2.6.1))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -7513,13 +7435,13 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1)):
+ eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)):
dependencies:
aria-query: 5.3.2
array-includes: 3.1.9
@@ -7529,7 +7451,7 @@ snapshots:
axobject-query: 4.1.0
damerau-levenshtein: 1.0.8
emoji-regex: 9.2.2
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
+ eslint: 9.39.2(jiti@2.6.1)
hasown: 2.0.2
jsx-ast-utils: 3.3.5
language-tags: 1.0.9
@@ -7538,18 +7460,11 @@ snapshots:
safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
- eslint-plugin-react-hooks@7.1.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1):
+ eslint-plugin-react-hooks@5.2.0(eslint@9.39.2(jiti@2.6.1)):
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
- '@babel/parser': 7.28.5
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
- hermes-parser: 0.25.1
- zod: 3.25.67
- zod-validation-error: 4.0.2(zod@3.25.67)
- transitivePeerDependencies:
- - supports-color
+ eslint: 9.39.2(jiti@2.6.1)
- eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1)):
+ eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)):
dependencies:
array-includes: 3.1.9
array.prototype.findlast: 1.2.5
@@ -7557,7 +7472,7 @@ snapshots:
array.prototype.tosorted: 1.1.4
doctrine: 2.1.0
es-iterator-helpers: 1.2.2
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
+ eslint: 9.39.2(jiti@2.6.1)
estraverse: 5.3.0
hasown: 2.0.2
jsx-ast-utils: 3.3.5
@@ -7580,16 +7495,14 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
- eslint-visitor-keys@5.0.1: {}
-
- eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1):
+ eslint@9.39.2(jiti@2.6.1):
dependencies:
- '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))
+ '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1))
'@eslint-community/regexpp': 4.12.2
- '@eslint/config-array': 0.21.1(supports-color@8.1.1)
+ '@eslint/config-array': 0.21.1
'@eslint/config-helpers': 0.4.2
'@eslint/core': 0.17.0
- '@eslint/eslintrc': 3.3.3(supports-color@8.1.1)
+ '@eslint/eslintrc': 3.3.3
'@eslint/js': 9.39.2
'@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7
@@ -7599,7 +7512,7 @@ snapshots:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
- debug: 4.4.3(supports-color@8.1.1)
+ debug: 4.4.3
escape-string-regexp: 4.0.0
eslint-scope: 8.4.0
eslint-visitor-keys: 4.2.1
@@ -7769,9 +7682,9 @@ snapshots:
functions-have-names@1.2.3: {}
- geist@1.5.1(next@15.5.26(@babel/core@7.28.5(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)):
+ geist@1.5.1(next@15.5.26(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)):
dependencies:
- next: 15.5.26(@babel/core@7.28.5(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ next: 15.5.26(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
generator-function@2.0.1: {}
@@ -7843,8 +7756,6 @@ snapshots:
globals@14.0.0: {}
- globals@16.4.0: {}
-
globalthis@1.0.4:
dependencies:
define-properties: 1.2.1
@@ -7880,12 +7791,6 @@ snapshots:
headers-polyfill@4.0.3: {}
- hermes-estree@0.25.1: {}
-
- hermes-parser@0.25.1:
- dependencies:
- hermes-estree: 0.25.1
-
hex-rgb@4.3.0: {}
html-encoding-sniffer@4.0.0:
@@ -7894,17 +7799,17 @@ snapshots:
html-escaper@2.0.2: {}
- http-proxy-agent@7.0.2(supports-color@8.1.1):
+ http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.4
- debug: 4.4.3(supports-color@8.1.1)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
- https-proxy-agent@7.0.6(supports-color@8.1.1):
+ https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.4
- debug: 4.4.3(supports-color@8.1.1)
+ debug: 4.4.3
transitivePeerDependencies:
- supports-color
@@ -8090,9 +7995,9 @@ snapshots:
istanbul-lib-coverage@3.2.2: {}
- istanbul-lib-instrument@6.0.3(supports-color@8.1.1):
+ istanbul-lib-instrument@6.0.3:
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/parser': 7.28.5
'@istanbuljs/schema': 0.1.3
istanbul-lib-coverage: 3.2.2
@@ -8106,10 +8011,10 @@ snapshots:
make-dir: 4.0.0
supports-color: 7.2.0
- istanbul-lib-source-maps@5.0.6(supports-color@8.1.1):
+ istanbul-lib-source-maps@5.0.6:
dependencies:
'@jridgewell/trace-mapping': 0.3.31
- debug: 4.4.3(supports-color@8.1.1)
+ debug: 4.4.3
istanbul-lib-coverage: 3.2.2
transitivePeerDependencies:
- supports-color
@@ -8140,10 +8045,10 @@ snapshots:
jest-util: 30.2.0
p-limit: 3.1.0
- jest-circus@30.2.0(supports-color@8.1.1):
+ jest-circus@30.2.0:
dependencies:
'@jest/environment': 30.2.0
- '@jest/expect': 30.2.0(supports-color@8.1.1)
+ '@jest/expect': 30.2.0
'@jest/test-result': 30.2.0
'@jest/types': 30.2.0
'@types/node': 22.19.3
@@ -8154,8 +8059,8 @@ snapshots:
jest-each: 30.2.0
jest-matcher-utils: 30.2.0
jest-message-util: 30.2.0
- jest-runtime: 30.2.0(supports-color@8.1.1)
- jest-snapshot: 30.2.0(supports-color@8.1.1)
+ jest-runtime: 30.2.0
+ jest-snapshot: 30.2.0
jest-util: 30.2.0
p-limit: 3.1.0
pretty-format: 30.2.0
@@ -8166,15 +8071,15 @@ snapshots:
- babel-plugin-macros
- supports-color
- jest-cli@30.2.0(@types/node@22.19.3)(supports-color@8.1.1):
+ jest-cli@30.2.0(@types/node@22.19.3):
dependencies:
- '@jest/core': 30.2.0(supports-color@8.1.1)
+ '@jest/core': 30.2.0
'@jest/test-result': 30.2.0
'@jest/types': 30.2.0
chalk: 4.1.2
exit-x: 0.2.2
import-local: 3.2.0
- jest-config: 30.2.0(@types/node@22.19.3)(supports-color@8.1.1)
+ jest-config: 30.2.0(@types/node@22.19.3)
jest-util: 30.2.0
jest-validate: 30.2.0
yargs: 17.7.2
@@ -8185,25 +8090,25 @@ snapshots:
- supports-color
- ts-node
- jest-config@30.2.0(@types/node@22.19.3)(supports-color@8.1.1):
+ jest-config@30.2.0(@types/node@22.19.3):
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@jest/get-type': 30.1.0
'@jest/pattern': 30.0.1
'@jest/test-sequencer': 30.2.0
'@jest/types': 30.2.0
- babel-jest: 30.2.0(@babel/core@7.28.5(supports-color@8.1.1))(supports-color@8.1.1)
+ babel-jest: 30.2.0(@babel/core@7.28.5)
chalk: 4.1.2
ci-info: 4.3.1
deepmerge: 4.3.1
glob: 10.5.0
graceful-fs: 4.2.11
- jest-circus: 30.2.0(supports-color@8.1.1)
+ jest-circus: 30.2.0
jest-docblock: 30.2.0
jest-environment-node: 30.2.0
jest-regex-util: 30.0.1
jest-resolve: 30.2.0
- jest-runner: 30.2.0(supports-color@8.1.1)
+ jest-runner: 30.2.0
jest-util: 30.2.0
jest-validate: 30.2.0
micromatch: 4.0.8
@@ -8236,13 +8141,13 @@ snapshots:
jest-util: 30.2.0
pretty-format: 30.2.0
- jest-environment-jsdom@30.2.0(supports-color@8.1.1):
+ jest-environment-jsdom@30.2.0:
dependencies:
'@jest/environment': 30.2.0
- '@jest/environment-jsdom-abstract': 30.2.0(jsdom@26.1.0(supports-color@8.1.1))
+ '@jest/environment-jsdom-abstract': 30.2.0(jsdom@26.1.0)
'@types/jsdom': 21.1.7
'@types/node': 22.19.3
- jsdom: 26.1.0(supports-color@8.1.1)
+ jsdom: 26.1.0
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -8309,10 +8214,10 @@ snapshots:
jest-regex-util@30.0.1: {}
- jest-resolve-dependencies@30.2.0(supports-color@8.1.1):
+ jest-resolve-dependencies@30.2.0:
dependencies:
jest-regex-util: 30.0.1
- jest-snapshot: 30.2.0(supports-color@8.1.1)
+ jest-snapshot: 30.2.0
transitivePeerDependencies:
- supports-color
@@ -8327,12 +8232,12 @@ snapshots:
slash: 3.0.0
unrs-resolver: 1.11.1
- jest-runner@30.2.0(supports-color@8.1.1):
+ jest-runner@30.2.0:
dependencies:
'@jest/console': 30.2.0
'@jest/environment': 30.2.0
'@jest/test-result': 30.2.0
- '@jest/transform': 30.2.0(supports-color@8.1.1)
+ '@jest/transform': 30.2.0
'@jest/types': 30.2.0
'@types/node': 22.19.3
chalk: 4.1.2
@@ -8345,7 +8250,7 @@ snapshots:
jest-leak-detector: 30.2.0
jest-message-util: 30.2.0
jest-resolve: 30.2.0
- jest-runtime: 30.2.0(supports-color@8.1.1)
+ jest-runtime: 30.2.0
jest-util: 30.2.0
jest-watcher: 30.2.0
jest-worker: 30.2.0
@@ -8354,14 +8259,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- jest-runtime@30.2.0(supports-color@8.1.1):
+ jest-runtime@30.2.0:
dependencies:
'@jest/environment': 30.2.0
'@jest/fake-timers': 30.2.0
- '@jest/globals': 30.2.0(supports-color@8.1.1)
+ '@jest/globals': 30.2.0
'@jest/source-map': 30.0.1
'@jest/test-result': 30.2.0
- '@jest/transform': 30.2.0(supports-color@8.1.1)
+ '@jest/transform': 30.2.0
'@jest/types': 30.2.0
'@types/node': 22.19.3
chalk: 4.1.2
@@ -8374,26 +8279,26 @@ snapshots:
jest-mock: 30.2.0
jest-regex-util: 30.0.1
jest-resolve: 30.2.0
- jest-snapshot: 30.2.0(supports-color@8.1.1)
+ jest-snapshot: 30.2.0
jest-util: 30.2.0
slash: 3.0.0
strip-bom: 4.0.0
transitivePeerDependencies:
- supports-color
- jest-snapshot@30.2.0(supports-color@8.1.1):
+ jest-snapshot@30.2.0:
dependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
'@babel/generator': 7.28.5
- '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5(supports-color@8.1.1))
- '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5(supports-color@8.1.1))
+ '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5)
+ '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5)
'@babel/types': 7.28.5
'@jest/expect-utils': 30.2.0
'@jest/get-type': 30.1.0
'@jest/snapshot-utils': 30.2.0
- '@jest/transform': 30.2.0(supports-color@8.1.1)
+ '@jest/transform': 30.2.0
'@jest/types': 30.2.0
- babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5(supports-color@8.1.1))
+ babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5)
chalk: 4.1.2
expect: 30.2.0
graceful-fs: 4.2.11
@@ -8444,12 +8349,12 @@ snapshots:
merge-stream: 2.0.0
supports-color: 8.1.1
- jest@30.2.0(@types/node@22.19.3)(supports-color@8.1.1):
+ jest@30.2.0(@types/node@22.19.3):
dependencies:
- '@jest/core': 30.2.0(supports-color@8.1.1)
+ '@jest/core': 30.2.0
'@jest/types': 30.2.0
import-local: 3.2.0
- jest-cli: 30.2.0(@types/node@22.19.3)(supports-color@8.1.1)
+ jest-cli: 30.2.0(@types/node@22.19.3)
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
@@ -8470,14 +8375,14 @@ snapshots:
dependencies:
argparse: 2.0.1
- jsdom@26.1.0(supports-color@8.1.1):
+ jsdom@26.1.0:
dependencies:
cssstyle: 4.6.0
data-urls: 5.0.0
decimal.js: 10.6.0
html-encoding-sniffer: 4.0.0
- http-proxy-agent: 7.0.2(supports-color@8.1.1)
- https-proxy-agent: 7.0.6(supports-color@8.1.1)
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
is-potential-custom-element-name: 1.0.1
nwsapi: 2.2.23
parse5: 7.3.0
@@ -8679,10 +8584,6 @@ snapshots:
min-indent@1.0.1: {}
- minimatch@10.2.6:
- dependencies:
- brace-expansion: 5.0.12
-
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.12
@@ -8743,7 +8644,7 @@ snapshots:
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
- next@15.5.26(@babel/core@7.28.5(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
+ next@15.5.26(@babel/core@7.28.5)(@opentelemetry/api@1.9.0)(@playwright/test@1.57.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0):
dependencies:
'@next/env': 15.5.26
'@swc/helpers': 0.5.15
@@ -8751,7 +8652,7 @@ snapshots:
postcss: 8.4.31
react: 19.1.0
react-dom: 19.1.0(react@19.1.0)
- styled-jsx: 5.1.6(@babel/core@7.28.5(supports-color@8.1.1))(react@19.1.0)
+ styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.1.0)
optionalDependencies:
'@next/swc-darwin-arm64': 15.5.26
'@next/swc-darwin-x64': 15.5.26
@@ -9412,12 +9313,12 @@ snapshots:
strip-json-comments@3.1.1: {}
- styled-jsx@5.1.6(@babel/core@7.28.5(supports-color@8.1.1))(react@19.1.0):
+ styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.1.0):
dependencies:
client-only: 0.0.1
react: 19.1.0
optionalDependencies:
- '@babel/core': 7.28.5(supports-color@8.1.1)
+ '@babel/core': 7.28.5
supports-color@7.2.0:
dependencies:
@@ -9492,7 +9393,7 @@ snapshots:
dependencies:
punycode: 2.3.1
- ts-api-utils@2.5.0(typescript@5.9.3):
+ ts-api-utils@2.4.0(typescript@5.9.3):
dependencies:
typescript: 5.9.3
@@ -9552,17 +9453,6 @@ snapshots:
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
- typescript-eslint@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3):
- dependencies:
- '@typescript-eslint/eslint-plugin': 8.70.1(@typescript-eslint/parser@8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/parser': 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/typescript-estree': 8.70.1(supports-color@8.1.1)(typescript@5.9.3)
- '@typescript-eslint/utils': 8.70.1(eslint@9.39.2(jiti@2.6.1)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.9.3)
- eslint: 9.39.2(jiti@2.6.1)(supports-color@8.1.1)
- typescript: 5.9.3
- transitivePeerDependencies:
- - supports-color
-
typescript@5.9.3: {}
unbox-primitive@1.1.0:
@@ -9797,10 +9687,6 @@ snapshots:
yoga-layout@3.2.1: {}
- zod-validation-error@4.0.2(zod@3.25.67):
- dependencies:
- zod: 3.25.67
-
zod@3.25.67: {}
zustand@4.5.7(@types/react@18.3.27)(immer@11.1.3)(react@19.1.0):