From 94b7ef57e21052df2d57176498eade48ca50f83e Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Fri, 24 Jul 2026 15:30:47 +0100 Subject: [PATCH 01/11] feat(cli): add map command --- .changeset/rebuild-map-command.md | 5 + .gitignore | 3 + eslint.config.mjs | 8 + packages/cli/README.md | 5 + packages/cli/package.json | 5 +- packages/cli/src/commands/index.ts | 2 + packages/cli/src/commands/map.ts | 350 +++ packages/cli/src/core/output.ts | 1 + packages/cli/src/lib/errors.ts | 29 + packages/cli/src/lib/map/adapters/index.ts | 17 + packages/cli/src/lib/map/adapters/next.ts | 157 + packages/cli/src/lib/map/adapters/nuxt.ts | 206 ++ .../src/lib/map/adapters/tanstack-start.ts | 96 + packages/cli/src/lib/map/checks/index.ts | 315 ++ packages/cli/src/lib/map/detect.ts | 83 + packages/cli/src/lib/map/exemptions.ts | 63 + packages/cli/src/lib/map/parse.ts | 211 ++ packages/cli/src/lib/map/scan.ts | 56 + packages/cli/src/lib/map/score.ts | 112 + packages/cli/src/lib/map/sensitivity.ts | 72 + packages/cli/src/lib/map/types.ts | 90 + packages/cli/src/lib/map/utils.ts | 93 + packages/cli/src/lib/map/write.ts | 29 + packages/cli/test/map.command.test.ts | 173 ++ .../test/map/__snapshots__/scan.test.ts.snap | 956 ++++++ packages/cli/test/map/detect.test.ts | 60 + packages/cli/test/map/display.test.ts | 51 + packages/cli/test/map/exemptions.test.ts | 35 + packages/cli/test/map/fixtures/.gitignore | 1 + .../next-app-router/app/actions/orders.ts | 5 + .../next-app-router/app/api/checkout/route.ts | 8 + .../next-app-router/app/api/error/route.ts | 3 + .../next-app-router/app/api/health/route.ts | 3 + .../next-app-router/app/api/payments/route.ts | 10 + .../map/fixtures/next-app-router/app/page.tsx | 3 + .../fixtures/next-app-router/middleware.ts | 5 + .../map/fixtures/next-app-router/package.json | 9 + .../test/map/fixtures/nuxt-basic/package.json | 9 + .../map/fixtures/nuxt-basic/pages/index.vue | 7 + .../fixtures/nuxt-basic/pages/orders/[id].vue | 12 + .../nuxt-basic/server/api/broken-error.get.ts | 7 + .../nuxt-basic/server/api/checkout.post.ts | 6 + .../server/api/docs/[...slug].get.ts | 3 + .../nuxt-basic/server/api/orders/[id].get.ts | 10 + .../server/api/payments/stripe.post.ts | 10 + .../nuxt-basic/server/api/plain-error.get.ts | 3 + .../nuxt-basic/server/middleware/auth.ts | 3 + .../nuxt-basic/server/routes/health.get.ts | 3 + .../nuxt-basic/server/tasks/cleanup.ts | 6 + .../map/fixtures/tanstack-basic/package.json | 9 + .../tanstack-basic/src/routes/api/admin.ts | 15 + .../tanstack-basic/src/routes/api/checkout.ts | 23 + .../tanstack-basic/src/routes/api/hello.ts | 11 + .../tanstack-basic/src/routes/index.tsx | 9 + packages/cli/test/map/scan.test.ts | 166 + packages/cli/test/map/score.test.ts | 28 + pnpm-lock.yaml | 2706 ++++++----------- 57 files changed, 4647 insertions(+), 1729 deletions(-) create mode 100644 .changeset/rebuild-map-command.md create mode 100644 packages/cli/src/commands/map.ts create mode 100644 packages/cli/src/lib/map/adapters/index.ts create mode 100644 packages/cli/src/lib/map/adapters/next.ts create mode 100644 packages/cli/src/lib/map/adapters/nuxt.ts create mode 100644 packages/cli/src/lib/map/adapters/tanstack-start.ts create mode 100644 packages/cli/src/lib/map/checks/index.ts create mode 100644 packages/cli/src/lib/map/detect.ts create mode 100644 packages/cli/src/lib/map/exemptions.ts create mode 100644 packages/cli/src/lib/map/parse.ts create mode 100644 packages/cli/src/lib/map/scan.ts create mode 100644 packages/cli/src/lib/map/score.ts create mode 100644 packages/cli/src/lib/map/sensitivity.ts create mode 100644 packages/cli/src/lib/map/types.ts create mode 100644 packages/cli/src/lib/map/utils.ts create mode 100644 packages/cli/src/lib/map/write.ts create mode 100644 packages/cli/test/map.command.test.ts create mode 100644 packages/cli/test/map/__snapshots__/scan.test.ts.snap create mode 100644 packages/cli/test/map/detect.test.ts create mode 100644 packages/cli/test/map/display.test.ts create mode 100644 packages/cli/test/map/exemptions.test.ts create mode 100644 packages/cli/test/map/fixtures/.gitignore create mode 100644 packages/cli/test/map/fixtures/next-app-router/app/actions/orders.ts create mode 100644 packages/cli/test/map/fixtures/next-app-router/app/api/checkout/route.ts create mode 100644 packages/cli/test/map/fixtures/next-app-router/app/api/error/route.ts create mode 100644 packages/cli/test/map/fixtures/next-app-router/app/api/health/route.ts create mode 100644 packages/cli/test/map/fixtures/next-app-router/app/api/payments/route.ts create mode 100644 packages/cli/test/map/fixtures/next-app-router/app/page.tsx create mode 100644 packages/cli/test/map/fixtures/next-app-router/middleware.ts create mode 100644 packages/cli/test/map/fixtures/next-app-router/package.json create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/package.json create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/pages/index.vue create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/pages/orders/[id].vue create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/api/broken-error.get.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/api/checkout.post.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/api/docs/[...slug].get.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/api/orders/[id].get.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/api/payments/stripe.post.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/api/plain-error.get.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/middleware/auth.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/routes/health.get.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/tasks/cleanup.ts create mode 100644 packages/cli/test/map/fixtures/tanstack-basic/package.json create mode 100644 packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/admin.ts create mode 100644 packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/checkout.ts create mode 100644 packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/hello.ts create mode 100644 packages/cli/test/map/fixtures/tanstack-basic/src/routes/index.tsx create mode 100644 packages/cli/test/map/scan.test.ts create mode 100644 packages/cli/test/map/score.test.ts diff --git a/.changeset/rebuild-map-command.md b/.changeset/rebuild-map-command.md new file mode 100644 index 00000000..7c35f7e1 --- /dev/null +++ b/.changeset/rebuild-map-command.md @@ -0,0 +1,5 @@ +--- +"@evlog/cli": minor +--- + +Add `evlog map` — a static observability score for your app, Lighthouse-style. Detects your framework (Nuxt, Nitro, Next.js App Router, or TanStack Start), scans every route, and scores wide-event coverage: `useLogger()`, request context (`log.set()`), structured errors (`createError({ why, fix })`), audit trails on sensitive routes, and error handling. Writes `evlog.map.json` to the project root (skip with `--no-write`), prints a route-by-route report with the worst offenders first (`--all` for the full list), and can gate CI with `--min-score `. diff --git a/.gitignore b/.gitignore index d4b6dcb3..eed40bb0 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,9 @@ logs # Benchmarks bench/results.json +# evlog map reports +evlog.map.json + # Test artefacts (coverage report, Stryker mutation report, Stryker scratch) coverage/ reports/ diff --git a/eslint.config.mjs b/eslint.config.mjs index 08477193..dc6abab3 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -28,4 +28,12 @@ export default createConfig( 'import/first': 'off', }, }, + { + // `evlog map` test fixtures are throwaway sample apps scanned by the + // analysis engine (like `examples/*`, which carry no lint script at + // all) — intentionally imperfect (empty catch blocks, plain + // `throw new Error()`, framework-mandated `GET`/`POST`/`Route` names) + // to exercise specific checks. Not maintained to repo lint standards. + ignores: ['packages/cli/test/map/fixtures/**'], + }, ) diff --git a/packages/cli/README.md b/packages/cli/README.md index c48c8ce0..903b5656 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -39,6 +39,11 @@ npx @evlog/cli doctor --cwd apps/web | `evlog doctor` | Monorepo-aware diagnosis: Node, project/workspace, stack, evlog install, `.evlog/logs` | | `evlog doctor --cwd ` | Run against another directory | | `evlog doctor --debug` | Same, plus a debug wide event (see Debug) | +| `evlog map` | Static observability score for the current app — Lighthouse for wide events | +| `evlog map --framework ` | Override framework detection (`nuxt`, `nitro`, `next`, `tanstack-start`) | +| `evlog map --all` | Show every scanned route in the report, not just the worst 15 | +| `evlog map --min-score ` | Exit 1 if the global score is below `n` | +| `evlog map --no-write` | Skip writing `evlog.map.json` to the project root | | `evlog telemetry status` | Show telemetry status and disclosure | | `evlog telemetry enable` / `disable` | Change telemetry preference (disable purges buffered data) | diff --git a/packages/cli/package.json b/packages/cli/package.json index bde541d5..b9c9c23a 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -39,6 +39,7 @@ "cli", "wide-events", "doctor", + "map", "citty", "structured-logging", "telemetry" @@ -56,7 +57,9 @@ "dependencies": { "@evlog/telemetry": "workspace:*", "citty": "^0.2.2", - "evlog": "workspace:*" + "evlog": "workspace:*", + "oxc-parser": "^0.82.3", + "tinyglobby": "^0.2.17" }, "devDependencies": { "tsdown": "^0.22.8", diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts index 3e336b12..96a7ef2c 100644 --- a/packages/cli/src/commands/index.ts +++ b/packages/cli/src/commands/index.ts @@ -1,4 +1,5 @@ import doctor from './doctor' +import map from './map' import telemetry from './telemetry' /** @@ -14,5 +15,6 @@ import telemetry from './telemetry' */ export const subCommands = { doctor, + map, telemetry, } diff --git a/packages/cli/src/commands/map.ts b/packages/cli/src/commands/map.ts new file mode 100644 index 00000000..bd4cef0c --- /dev/null +++ b/packages/cli/src/commands/map.ts @@ -0,0 +1,350 @@ +import { EvlogError } from 'evlog' +import type { CliContext } from '../core/context' +import { createStyle, EXIT_FAIL } from '../core/output' +import { defineEvlogCommand } from '../lib/command' +import type { CliDebug } from '../lib/debug' +import { createNoopCliDebug } from '../lib/debug' +import { cliErrors } from '../lib/errors' +import { resolveEvlog, resolveProject } from '../lib/project' +import type { ProjectInfo } from '../lib/project' +import { detectFramework } from '../lib/map/detect' +import { classifyRouteObservability, gradeFromScore, routeCheckChips, topIssue } from '../lib/map/score' +import { scan } from '../lib/map/scan' +import { sensitivityBadge, sensitivityLabel } from '../lib/map/sensitivity' +import type { CheckId, CheckResult, Framework, RouteEntry, ScanContext, ScanResult } from '../lib/map/types' +import { frameworkLabel } from '../lib/map/utils' +import { writeMapFile } from '../lib/map/write' + +const FRAMEWORKS: readonly Framework[] = ['nuxt', 'nitro', 'next', 'tanstack-start'] + +function isFramework(value: string): value is Framework { + return (FRAMEWORKS as readonly string[]).includes(value) +} + +/** Typed result of `evlog map` — rendered by {@link formatMapReport}. */ +export interface MapResult { + project: Pick + framework: Framework + frameworkWarnings: string[] + scan: ScanResult + /** Path `evlog.map.json` was written to, or `null` with `--no-write`. */ + mapPath: string | null +} + +/** + * Scan `ctx.cwd` for routes and score their wide-event coverage (monorepo-aware). + * Pure with respect to the context except for the `evlog.map.json` write. + */ +export async function runMap( + ctx: CliContext, + log: CliDebug = createNoopCliDebug(), + options: { framework?: Framework, noWrite?: boolean, verbose?: boolean } = {}, +): Promise { + const project = await log.step( + 'resolveProject', + () => resolveProject(ctx.cwd), + p => ({ + cwd: ctx.cwd, + project: { kind: p.kind, root: p.root, packageDir: p.packageDir, name: p.packageName }, + }), + ) + + const { framework, warnings } = await log.step( + 'detectFramework', + () => detectFramework(project, options.framework), + r => ({ framework: r.framework, frameworkWarnings: r.warnings }), + ) + + const resolved = await log.step( + 'resolveEvlog', + () => resolveEvlog(project), + r => ({ hasEvlog: !!r.install }), + ) + + const scanCtx: ScanContext = { + projectRoot: project.packageDir, + framework, + projectName: project.packageName ?? 'unknown', + hasEvlog: !!resolved.install, + verbose: options.verbose ?? false, + } + + const scanResult = await log.step( + 'scan', + () => scan(scanCtx), + r => ({ routes: r.map.routes.length, score: r.map.score, grade: r.grade }), + ) + + let mapPath: string | null = null + if (!options.noWrite) { + mapPath = await log.step('writeMapFile', () => writeMapFile(project.packageDir, scanResult.map)) + } + + log.set({ steps: ['done'] }) + + return { + project, + framework, + frameworkWarnings: warnings, + scan: scanResult, + mapPath, + } +} + +const COL = { method: 6, path: 26, score: 5, badge: 2 } as const + +function stripAnsi(text: string): string { + return text.replace(/\u001B\[[0-9;]*m/g, '') +} + +function padVisible(text: string, width: number): string { + const len = stripAnsi(text).length + if (len >= width) return text + return text + ' '.repeat(width - len) +} + +function truncateVisible(text: string, width: number): string { + const plain = stripAnsi(text) + if (plain.length <= width) return text + return `${plain.slice(0, width - 1)}…` +} + +function scoreBar(score: number, width = 20): string { + const filled = Math.round((score / 100) * width) + return `${'█'.repeat(filled)}${'░'.repeat(width - filled)} ${score}/100` +} + +function gradeWord(grade: ReturnType): string { + switch (grade) { + case 'excellent': return 'excellent' + case 'good': return 'good' + case 'needs-work': return 'needs work' + case 'at-risk': return 'at risk' + } +} + +interface Finding { + text: string + location: string + impact: number + kind: 'gap' | 'dark' +} + +const CHECK_SHORT: Record = { + 'wide-event': 'useLogger', + 'context': 'log.set', + 'structured-errors': 'createError', + 'audit': 'log.audit', + 'error-handling': 'error handling', + 'page-error-handling': 'fetch error handling', +} + +function summarizeRouteFinding(route: RouteEntry): Finding | null { + if (classifyRouteObservability(route) === 'exempt') return null + + const failed = (Object.entries(route.checks) as [CheckId, CheckResult | undefined][]) + .filter(([, c]) => c?.status === 'fail') + if (failed.length === 0) return null + + const observability = classifyRouteObservability(route) + const method = route.method ?? 'ANY' + const sens = sensitivityLabel(route.sensitivity) + const sensTag = sens ? ` (${sens})` : '' + const line = failed[0]?.[1]?.evidence?.line ?? route.handler?.line ?? 1 + const chips = routeCheckChips(route) + + if (observability === 'instrumented' || observability === 'partial') { + const gaps = failed.map(([id, c]) => CHECK_SHORT[id] ?? c?.message ?? id).join(', ') + return { + kind: 'gap', + text: `${method} ${route.path}${sensTag} — has logger + context, missing: ${gaps}${chips ? ` · ${chips}` : ''}`, + location: `${route.file}:${line}`, + impact: observability === 'partial' ? 2 : 1, + } + } + + const issues = failed.map(([, c]) => c?.message ?? 'no observability').join('; ') + return { + kind: 'dark', + text: `${method} ${route.path}${sensTag} — no observability: ${issues}`, + location: `${route.file}:${line}`, + impact: 4 + (route.sensitivity.level === 'high' ? 2 : 0), + } +} + +function collectFindings(routes: RouteEntry[]): Finding[] { + const findings: Finding[] = [] + for (const route of routes) { + const summary = summarizeRouteFinding(route) + if (summary) findings.push(summary) + } + return findings.sort((a, b) => b.impact - a.impact) +} + +/** + * On-brand map report: score, route table (worst first), top findings. + * Command header is owned by {@link defineEvlogCommand}. + */ +export function formatMapReport(ctx: CliContext, result: MapResult, options: { all?: boolean } = {}): string { + const { paint } = createStyle(ctx) + const { map, grade, summary } = result.scan + const scoreColor = map.score >= 70 ? 'green' : map.score >= 50 ? 'yellow' : 'red' + const lines: string[] = [] + + lines.push(paint('dim', `${frameworkLabel(result.framework)} · ${map.projectName} · ${map.routes.length} routes`)) + for (const warning of result.frameworkWarnings) { + lines.push(paint('yellow', `⚠ ${warning}`)) + } + lines.push('') + + lines.push(`${paint('bold', String(map.score))} ${paint(scoreColor, gradeWord(grade))}`) + lines.push(paint(scoreColor, scoreBar(map.score))) + lines.push('') + + const summaryParts = [ + `${summary.instrumented} instrumented`, + summary.partial > 0 ? `${summary.partial} partial` : null, + summary.dark > 0 ? `${summary.dark} dark` : null, + summary.exempt > 0 ? `${summary.exempt} exempt` : null, + ].filter(Boolean).join(' · ') + lines.push(paint('dim', summaryParts)) + lines.push(paint('dim', '$ money · A auth · o pii · CHECKS = logger · context · audit · errors · catch')) + lines.push('') + + lines.push(paint('dim', 'ROUTES')) + const headerRow = [ + padVisible('METHOD', COL.method), + padVisible('PATH', COL.path), + padVisible('SCORE', COL.score), + padVisible('S', COL.badge), + 'CHECKS', + ].join(' ') + lines.push(paint('dim', headerRow)) + + const sorted = [...map.routes].sort((a, b) => a.score - b.score) + const shown = options.all ? sorted : sorted.slice(0, 15) + + for (const route of shown) { + lines.push(formatRouteLine(ctx, route)) + } + if (!options.all && sorted.length > 15) { + lines.push(paint('dim', `… and ${sorted.length - 15} more (use --all)`)) + } + lines.push('') + + lines.push(paint('dim', 'FINDINGS')) + const findings = collectFindings(map.routes).slice(0, 5) + if (findings.length === 0) { + lines.push(paint('green', '✓ No issues')) + } else { + for (const finding of findings) { + const icon = finding.kind === 'dark' ? paint('red', '✗') : paint('yellow', '!') + lines.push(`${icon} ${finding.text}`) + lines.push(` ${paint('dim', '→')} ${paint('underline', finding.location)}`) + } + } + lines.push('') + + if (result.mapPath) { + lines.push(paint('dim', `Full map → ${result.mapPath}`)) + } + lines.push(paint('dim', 'Run with --json for machine output')) + + return lines.join('\n') +} + +function formatRouteLine(ctx: CliContext, route: RouteEntry): string { + const { paint } = createStyle(ctx) + const method = (route.method ?? 'ANY').padEnd(COL.method) + const path = route.path.length > COL.path + ? `…${route.path.slice(-(COL.path - 1))}` + : route.path + const scoreColor = route.score >= 70 ? 'green' : route.score >= 50 ? 'yellow' : 'red' + const score = paint(scoreColor, String(route.score).padStart(3)) + const sens = sensitivityBadge(route.sensitivity) + const observability = classifyRouteObservability(route) + const badge = sens ? paint('magenta', sens) : observability === 'exempt' ? paint('dim', '○') : ' ' + + const checksCol = (() => { + if (observability === 'exempt') return paint('dim', 'exempt (evlog infra)') + if (observability === 'instrumented' && route.score >= 100) return paint('green', 'ok') + const chips = routeCheckChips(route) + if (chips) { + return paint(observability === 'dark' ? 'red' : 'yellow', truncateVisible(chips, 38)) + } + return paint('red', truncateVisible(topIssue(route), 38)) + })() + + return [ + padVisible(method, COL.method), + padVisible(path, COL.path), + padVisible(score, COL.score), + padVisible(badge, COL.badge), + checksCol, + ].join(' ') +} + +function parseFrameworkArg(value: unknown): Framework | undefined { + if (typeof value !== 'string' || value.length === 0) return undefined + if (!isFramework(value)) { + throw cliErrors.MAP_INVALID_FRAMEWORK({ value }) + } + return value +} + +/** + * `evlog map` — static observability map: Lighthouse for wide events. + * Logic lives in {@link runMap}; this file owns the citty surface. + */ +export default defineEvlogCommand('map', { + meta: { name: 'map', description: 'Static observability map — Lighthouse for wide events' }, + args: { + cwd: { type: 'string', description: 'Project directory (default: current)' }, + framework: { type: 'string', description: 'Override framework detection (nuxt, nitro, next, tanstack-start)' }, + all: { type: 'boolean', description: 'Show all routes in the report' }, + minScore: { type: 'string', description: 'Exit 1 if the global score is below this threshold' }, + // `default: true` + citty's `--no-write` negation — declaring this as `noWrite` + // directly would not work: citty's parser treats any `--no-x` flag as negating + // `x`, not as setting `noX` (see `wantsHeader`'s `--no-header` argv fallback). + write: { type: 'boolean', default: true, description: 'Write evlog.map.json (--no-write to skip)' }, + verbose: { type: 'boolean', description: 'Show per-file parse warnings' }, + }, + async run({ args, cli, log, ui }) { + const cwd = typeof args.cwd === 'string' && args.cwd.length > 0 ? args.cwd : undefined + const ctx = cwd ? { ...cli, cwd } : cli + + let result: MapResult + try { + result = await runMap(ctx, log, { + framework: parseFrameworkArg(args.framework), + noWrite: !args.write, + verbose: args.verbose, + }) + } catch (error) { + if (error instanceof EvlogError) { + log.finding({ code: error.code ?? 'cli.MAP_FAILED', why: error.why, fix: error.fix, link: error.link }, { status: 'fail' }) + ui.done({ + jsonMode: args.json, + json: { error: { code: error.code, message: error.message, why: error.why, fix: error.fix } }, + human: error.fix ? `${error.message}\n→ ${error.fix}` : error.message, + }) + ui.exit(EXIT_FAIL) + return + } + throw error + } + + ui.done({ + jsonMode: args.json, + json: { map: result.scan.map, summary: result.scan.summary, mapPath: result.mapPath }, + human: formatMapReport(ctx, result, { all: args.all }), + }) + + if (typeof args.minScore === 'string' && args.minScore.length > 0) { + const threshold = Number.parseInt(args.minScore, 10) + if (!Number.isNaN(threshold) && result.scan.map.score < threshold) { + ui.exit(EXIT_FAIL) + } + } + }, +}) diff --git a/packages/cli/src/core/output.ts b/packages/cli/src/core/output.ts index c8fc8599..1e9c6e64 100644 --- a/packages/cli/src/core/output.ts +++ b/packages/cli/src/core/output.ts @@ -21,6 +21,7 @@ const codes = { green: '\x1B[32m', yellow: '\x1B[33m', blue: '\x1B[34m', + magenta: '\x1B[35m', cyan: '\x1B[36m', white: '\x1B[37m', } as const diff --git a/packages/cli/src/lib/errors.ts b/packages/cli/src/lib/errors.ts index 0879dc9a..d317f7dc 100644 --- a/packages/cli/src/lib/errors.ts +++ b/packages/cli/src/lib/errors.ts @@ -54,6 +54,35 @@ export const cliErrors = defineErrorCatalog('cli', { fix: 'Re-run with --debug and share the wide event', tags: ['cli'], }, + MAP_NO_PACKAGE_JSON: { + status: 404, + message: 'No package.json found', + why: 'map needs a package root to detect the framework and scan routes', + fix: 'Run from your app directory or pass --cwd', + tags: ['map', 'project'], + }, + MAP_WORKSPACE_ROOT: { + status: 400, + message: 'Monorepo root detected with no supported framework', + why: 'map scans one app at a time and cannot infer a framework from a bare workspace root', + fix: 'Run from an app directory (e.g. apps/web) or pass --cwd', + tags: ['map', 'project'], + }, + MAP_FRAMEWORK_NOT_DETECTED: { + status: 400, + message: 'Could not detect a supported framework (nuxt, nitro, next, tanstack-start)', + why: 'No matching dependency or config file was found in this project', + fix: 'Use --framework to override detection', + tags: ['map', 'project'], + }, + MAP_INVALID_FRAMEWORK: { + status: 400, + message: ({ value }: { value: string }) => + `Unknown --framework "${value}"`, + why: 'map only ships adapters for nuxt, nitro, next, and tanstack-start', + fix: 'Pass one of: nuxt, nitro, next, tanstack-start', + tags: ['map'], + }, }) declare module 'evlog' { diff --git a/packages/cli/src/lib/map/adapters/index.ts b/packages/cli/src/lib/map/adapters/index.ts new file mode 100644 index 00000000..2fee8919 --- /dev/null +++ b/packages/cli/src/lib/map/adapters/index.ts @@ -0,0 +1,17 @@ +import type { Framework, FrameworkAdapter } from '../types' +import { nextAdapter } from './next' +import { getNuxtOrNitroAdapter } from './nuxt' +import { tanstackStartAdapter } from './tanstack-start' + +/** Resolve the route-extraction adapter for a detected framework. */ +export function getAdapter(framework: Framework): FrameworkAdapter { + switch (framework) { + case 'nuxt': + case 'nitro': + return getNuxtOrNitroAdapter(framework) + case 'next': + return nextAdapter + case 'tanstack-start': + return tanstackStartAdapter + } +} diff --git a/packages/cli/src/lib/map/adapters/next.ts b/packages/cli/src/lib/map/adapters/next.ts new file mode 100644 index 00000000..26239628 --- /dev/null +++ b/packages/cli/src/lib/map/adapters/next.ts @@ -0,0 +1,157 @@ +import type { Node } from 'oxc-parser' +import { globSync } from 'tinyglobby' +import { + findHandlerLocation, + findHttpMethodExports, + hasDirective, + nodeLoc, + parseFile, + walkAst, +} from '../parse' +import type { FrameworkAdapter, RawRouteEntry, ScanContext } from '../types' +import { relativeFromRoot, segmentsToPath } from '../utils' + +function resolveAppDir(root: string): string { + if (globSync('app/**/page.{tsx,jsx,ts,js}', { cwd: root }).length > 0) { + return 'app' + } + if (globSync('src/app/**/page.{tsx,jsx,ts,js}', { cwd: root }).length > 0) { + return 'src/app' + } + return 'app' +} + +function routeDirFromFile(rel: string, appDir: string): string { + const inner = rel.slice(`${appDir}/`.length) + return inner.replace(/\/route\.(tsx?|jsx?)$/, '') +} + +/** Next.js App Router: `route.ts` handlers, `page.tsx`, middleware, `"use server"` actions. */ +export const nextAdapter: FrameworkAdapter = { + framework: 'next', + // eslint-disable-next-line require-await -- satisfies the async FrameworkAdapter contract + async extractRoutes(ctx: ScanContext): Promise { + const routes: RawRouteEntry[] = [] + const root = ctx.projectRoot + const appDir = resolveAppDir(root) + + for (const file of globSync(`${appDir}/**/route.{ts,js,tsx,jsx}`, { cwd: root, absolute: true })) { + const rel = relativeFromRoot(root, file) + const dir = routeDirFromFile(rel, appDir) + const apiPath = segmentsToPath(dir.split('/')) || '/' + + const parsed = parseFile(file) + if (!parsed) { + routes.push({ + framework: 'next', + kind: 'api', + method: null, + path: apiPath, + file: rel, + handler: null, + }) + continue + } + + const methods = findHttpMethodExports(parsed.program) + if (methods.length === 0) { + routes.push({ + framework: 'next', + kind: 'api', + method: null, + path: apiPath, + file: rel, + handler: findHandlerLocation(parsed.program, parsed.source, []), + }) + } else { + for (const { method, line } of methods) { + routes.push({ + framework: 'next', + kind: 'api', + method, + path: apiPath, + file: rel, + handler: { line, column: 0 }, + }) + } + } + } + + for (const file of globSync(`${appDir}/**/page.{tsx,jsx,ts,js}`, { cwd: root, absolute: true })) { + const rel = relativeFromRoot(root, file) + const inner = rel.slice(`${appDir}/`.length) + const dir = inner.replace(/^(.*\/)?page\.(tsx?|jsx?)$/, (_m, parent) => parent ?? '') + const path = segmentsToPath(dir ? dir.split('/') : []) || '/' + routes.push({ + framework: 'next', + kind: 'page', + method: null, + path, + file: rel, + handler: null, + }) + } + + for (const file of globSync(['middleware.{ts,js}', 'src/middleware.{ts,js}'], { cwd: root, absolute: true })) { + const rel = relativeFromRoot(root, file) + const parsed = parseFile(file) + routes.push({ + framework: 'next', + kind: 'middleware', + method: null, + path: '*', + file: rel, + handler: parsed + ? findHandlerLocation(parsed.program, parsed.source, []) + : null, + }) + } + + for (const file of globSync([`${appDir}/**/*.{ts,tsx,js,jsx}`, 'src/**/*.{ts,tsx,js,jsx}'], { cwd: root, absolute: true })) { + const parsed = parseFile(file) + if (!parsed || !hasDirective(parsed.program, 'use server')) continue + const rel = relativeFromRoot(root, file) + const exports = findServerActionExports(parsed.program) + for (const exp of exports) { + routes.push({ + framework: 'next', + kind: 'server-action', + method: 'POST', + path: `action:${exp.name}`, + file: rel, + handler: { line: exp.line, column: 0 }, + }) + } + } + + return routes + }, +} + +function findServerActionExports(program: import('oxc-parser').Program): Array<{ name: string, line: number }> { + const exports: Array<{ name: string, line: number }> = [] + walkAst(program, (node) => { + if (node.type === 'ExportNamedDeclaration') { + const decl = node as { + declaration?: { + type: string + id?: { name: string } + declarations?: Array<{ id: { type: string, name: string }, init?: { type: string } }> + } + } + if (decl.declaration?.type === 'FunctionDeclaration' && decl.declaration.id?.name) { + const loc = nodeLoc(node) + exports.push({ name: decl.declaration.id.name, line: loc?.line ?? 1 }) + } + if (decl.declaration?.type === 'VariableDeclaration') { + for (const d of decl.declaration.declarations ?? []) { + if (d.id.type === 'Identifier' && d.init && (d.init.type === 'ArrowFunctionExpression' || d.init.type === 'FunctionExpression')) { + const loc = nodeLoc(d.init as Node) + exports.push({ name: d.id.name, line: loc?.line ?? 1 }) + } + } + } + } + }) + return exports +} diff --git a/packages/cli/src/lib/map/adapters/nuxt.ts b/packages/cli/src/lib/map/adapters/nuxt.ts new file mode 100644 index 00000000..cef32e4e --- /dev/null +++ b/packages/cli/src/lib/map/adapters/nuxt.ts @@ -0,0 +1,206 @@ +import { basename } from 'node:path' +import { globSync } from 'tinyglobby' +import { findHandlerLocation, parseFile } from '../parse' +import type { FrameworkAdapter, RawRouteEntry, ScanContext } from '../types' +import { extractMethodFromFilename, relativeFromRoot, segmentsToPath, stripRouteFilename } from '../utils' + +const API_GLOBS = [ + 'server/api/**/*.{ts,js,mts,cts}', + 'server/routes/**/*.{ts,js,mts,cts}', +] + +const PAGE_GLOBS = ['pages/**/*.vue'] +const MIDDLEWARE_GLOBS = ['server/middleware/**/*.{ts,js,mts,cts}'] +const CRON_GLOBS = ['server/tasks/**/*.{ts,js,mts,cts}'] + +function routeSegmentsFromRel(rel: string, prefix: string): string { + let rest = rel + if (rest.startsWith('server/api/')) { + rest = rest.slice('server/api/'.length) + } else if (rest.startsWith('server/routes/')) { + rest = rest.slice('server/routes/'.length) + } + const parts = rest.split('/') + const last = parts.length - 1 + parts[last] = stripRouteFilename(parts[last] ?? '') + return segmentsToPath(parts, prefix) +} + +function fileToApiRoute(file: string, root: string): RawRouteEntry[] { + const rel = relativeFromRoot(root, file) + const filename = basename(file) + const method = extractMethodFromFilename(filename) + const routePath = routeSegmentsFromRel(rel, rel.startsWith('server/api/') ? '/api' : '') + + const parsed = parseFile(file) + const handler = parsed + ? findHandlerLocation(parsed.program, parsed.source, ['defineEventHandler', 'eventHandler']) + : null + + return [ + { + framework: 'nuxt', + kind: 'api', + method, + path: routePath || '/', + file: rel, + handler, + } + ] +} + +function fileToPageRoute(file: string, root: string): RawRouteEntry { + const rel = relativeFromRoot(root, file) + const segments = rel.slice('pages/'.length).split('/') + const last = segments.length - 1 + segments[last] = stripRouteFilename(segments[last] ?? '') + const path = segmentsToPath(segments) || '/' + + return { + framework: 'nuxt', + kind: 'page', + method: null, + path, + file: rel, + handler: null, + } +} + +function fileToMiddlewareRoute(file: string, root: string): RawRouteEntry { + const rel = relativeFromRoot(root, file) + const parsed = parseFile(file) + const handler = parsed + ? findHandlerLocation(parsed.program, parsed.source, ['defineEventHandler']) + : null + + return { + framework: 'nuxt', + kind: 'middleware', + method: null, + path: '*', + file: rel, + handler, + } +} + +function fileToCronRoute(file: string, root: string): RawRouteEntry { + const rel = relativeFromRoot(root, file) + const name = stripRouteFilename(basename(file)) + const parsed = parseFile(file) + const handler = parsed + ? findHandlerLocation(parsed.program, parsed.source, ['defineTask', 'defineEventHandler']) + : null + + return { + framework: 'nuxt', + kind: 'cron', + method: null, + path: `/tasks/${name}`, + file: rel, + handler, + } +} + +export const nuxtAdapter: FrameworkAdapter = { + framework: 'nuxt', + // eslint-disable-next-line require-await -- satisfies the async FrameworkAdapter contract + async extractRoutes(ctx: ScanContext): Promise { + const routes: RawRouteEntry[] = [] + const root = ctx.projectRoot + + for (const pattern of API_GLOBS) { + for (const file of globSync(pattern, { cwd: root, absolute: true })) { + routes.push(...fileToApiRoute(file, root)) + } + } + + for (const pattern of PAGE_GLOBS) { + for (const file of globSync(pattern, { cwd: root, absolute: true })) { + routes.push(fileToPageRoute(file, root)) + } + } + + for (const pattern of MIDDLEWARE_GLOBS) { + for (const file of globSync(pattern, { cwd: root, absolute: true })) { + routes.push(fileToMiddlewareRoute(file, root)) + } + } + + for (const pattern of CRON_GLOBS) { + for (const file of globSync(pattern, { cwd: root, absolute: true })) { + routes.push(fileToCronRoute(file, root)) + } + } + + return routes + }, +} + +/** Raw Nitro project (no Nuxt). */ +export const nitroAdapter: FrameworkAdapter = { + framework: 'nitro', + // eslint-disable-next-line require-await -- satisfies the async FrameworkAdapter contract + async extractRoutes(ctx: ScanContext): Promise { + const routes: RawRouteEntry[] = [] + const root = ctx.projectRoot + + const apiGlobs = ['routes/**/*.{ts,js,mts,cts}', 'api/**/*.{ts,js,mts,cts}'] + for (const pattern of apiGlobs) { + for (const file of globSync(pattern, { cwd: root, absolute: true })) { + const rel = relativeFromRoot(root, file) + const filename = basename(file) + const method = extractMethodFromFilename(filename) + + let prefix = '' + let segmentStart = '' + if (rel.startsWith('routes/')) { + segmentStart = rel.slice('routes/'.length) + prefix = '' + } else if (rel.startsWith('api/')) { + segmentStart = rel.slice('api/'.length) + prefix = '/api' + } else { + continue + } + + const segments = stripRouteFilename(segmentStart).split('/') + const path = segmentsToPath(segments, prefix) || '/' + const parsed = parseFile(file) + const handler = parsed + ? findHandlerLocation(parsed.program, parsed.source, ['defineEventHandler', 'eventHandler']) + : null + + routes.push({ + framework: 'nitro', + kind: 'api', + method, + path, + file: rel, + handler, + }) + } + } + + for (const file of globSync('middleware/**/*.{ts,js,mts,cts}', { cwd: root, absolute: true })) { + const rel = relativeFromRoot(root, file) + const parsed = parseFile(file) + const handler = parsed + ? findHandlerLocation(parsed.program, parsed.source, ['defineEventHandler']) + : null + routes.push({ + framework: 'nitro', + kind: 'middleware', + method: null, + path: '*', + file: rel, + handler, + }) + } + + return routes + }, +} + +export function getNuxtOrNitroAdapter(framework: 'nuxt' | 'nitro'): FrameworkAdapter { + return framework === 'nitro' ? nitroAdapter : nuxtAdapter +} diff --git a/packages/cli/src/lib/map/adapters/tanstack-start.ts b/packages/cli/src/lib/map/adapters/tanstack-start.ts new file mode 100644 index 00000000..e9ea8f27 --- /dev/null +++ b/packages/cli/src/lib/map/adapters/tanstack-start.ts @@ -0,0 +1,96 @@ +import { basename } from 'node:path' +import type { Node } from 'oxc-parser' +import { globSync } from 'tinyglobby' +import { findHandlerLocation, nodeLoc, parseFile, walkAst } from '../parse' +import type { FrameworkAdapter, RawRouteEntry, ScanContext } from '../types' +import { relativeFromRoot, segmentsToPath, stripExtension } from '../utils' + +function extractTanstackRoutes(file: string, root: string): RawRouteEntry[] { + const rel = relativeFromRoot(root, file) + if (rel.includes('__root')) return [] + + const segments = stripExtension(rel.replace(/^src\/routes\//, '')).split('/') + const path = segmentsToPath(segments) || '/' + const parsed = parseFile(file) + const routes: RawRouteEntry[] = [] + + if (!parsed) { + routes.push({ + framework: 'tanstack-start', + kind: 'page', + method: null, + path, + file: rel, + handler: null, + }) + return routes + } + + const hasServerHandlers = detectServerHandlers(parsed.program) + if (hasServerHandlers.length > 0) { + for (const { method, line } of hasServerHandlers) { + routes.push({ + framework: 'tanstack-start', + kind: 'api', + method, + path, + file: rel, + handler: { line, column: 0 }, + }) + } + } else if (path.startsWith('/api/') || basename(file).includes('api')) { + routes.push({ + framework: 'tanstack-start', + kind: 'api', + method: null, + path, + file: rel, + handler: findHandlerLocation(parsed.program, parsed.source, ['createServerFn']), + }) + } else { + routes.push({ + framework: 'tanstack-start', + kind: 'page', + method: null, + path, + file: rel, + handler: null, + }) + } + + return routes +} + +function detectServerHandlers(program: import('oxc-parser').Program): Array<{ method: string, line: number }> { + const handlers: Array<{ method: string, line: number }> = [] + walkAst(program, (node) => { + if (node.type !== 'Property') return + const prop = node as { key: { type: string, name?: string }, value: { type: string } } + if (prop.key.type === 'Identifier') { + const key = prop.key.name?.toUpperCase() + if (key && ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(key)) { + if (prop.value.type === 'ArrowFunctionExpression' || prop.value.type === 'FunctionExpression') { + const loc = nodeLoc(prop.value as Node) + handlers.push({ method: key, line: loc?.line ?? 1 }) + } + } + } + }) + return handlers +} + +/** TanStack Start: `src/routes/**` file-based routes, API vs page via HTTP method props / `createServerFn`. */ +export const tanstackStartAdapter: FrameworkAdapter = { + framework: 'tanstack-start', + // eslint-disable-next-line require-await -- satisfies the async FrameworkAdapter contract + async extractRoutes(ctx: ScanContext): Promise { + const routes: RawRouteEntry[] = [] + const root = ctx.projectRoot + + for (const file of globSync('src/routes/**/*.{ts,tsx}', { cwd: root, absolute: true })) { + routes.push(...extractTanstackRoutes(file, root)) + } + + return routes + }, +} diff --git a/packages/cli/src/lib/map/checks/index.ts b/packages/cli/src/lib/map/checks/index.ts new file mode 100644 index 00000000..bb457b59 --- /dev/null +++ b/packages/cli/src/lib/map/checks/index.ts @@ -0,0 +1,315 @@ +import { join } from 'node:path' +import type { Node } from 'oxc-parser' +import type { CheckId, CheckResult, RawRouteEntry, RouteKind, ScanContext } from '../types' +import { shouldSkipCheck } from '../exemptions' +import { getImportBindings, isCallNamed, nodeLoc, parseFile, walkAst } from '../parse' +import { lineSnippet } from '../utils' + +const HANDLER_KINDS: RouteKind[] = ['api', 'server-action', 'middleware', 'cron'] + +export type CheckFn = ( + ctx: ScanContext, + route: RawRouteEntry, + source: string, + program: import('oxc-parser').Program, +) => CheckResult + +function na(): CheckResult { + return { status: 'n/a' } +} + +function pass(): CheckResult { + return { status: 'pass' } +} + +function fail(message: string, file: string, line: number, snippet?: string): CheckResult { + return { + status: 'fail', + message, + evidence: { file, line, snippet }, + } +} + +function isEvlogImport(bindings: Map, name: string): boolean { + const src = bindings.get(name) + return src === 'evlog' || (src?.includes('evlog') ?? false) +} + +export const checkWideEvent: CheckFn = (ctx, route, _source, program) => { + if (!HANDLER_KINDS.includes(route.kind)) return na() + if (!ctx.hasEvlog) { + return fail('evlog not installed — adopt evlog for wide events', route.file, route.handler?.line ?? 1) + } + + const bindings = getImportBindings(program) + let found = false + let line = route.handler?.line ?? 1 + + walkAst(program, (node) => { + if (found) return + if (isCallNamed(node, ['useLogger'])) { + const { callee } = (node as { callee: Node }) + if (callee.type === 'Identifier' && isEvlogImport(bindings, callee.name)) { + found = true + line = nodeLoc(node)?.line ?? line + } + if (callee.type === 'Identifier' && !bindings.has(callee.name)) { + found = true + line = nodeLoc(node)?.line ?? line + } + } + }) + + if (found) return pass() + return fail('no useLogger() — handler is a dark event', route.file, line) +} + +export const checkContext: CheckFn = (ctx, route, _source, program) => { + if (!HANDLER_KINDS.includes(route.kind)) return na() + if (!ctx.hasEvlog) { + return fail('no log.set() — adopt evlog for request context', route.file, route.handler?.line ?? 1) + } + + let found = false + let line = route.handler?.line ?? 1 + + walkAst(program, (node) => { + if (found) return + if (isCallNamed(node, ['set']) || callIsLogSet(node)) { + found = true + line = nodeLoc(node)?.line ?? line + } + }) + + if (found) return pass() + return fail('no log.set() context accumulation', route.file, line) +} + +function callIsLogSet(node: Node): boolean { + if (node.type !== 'CallExpression') return false + const { callee } = (node as { callee: Node }) + if (callee.type === 'MemberExpression') { + const obj = (callee as { object: Node }).object + const prop = (callee as { property: Node }).property + return obj.type === 'Identifier' && obj.name === 'log' && prop.type === 'Identifier' && prop.name === 'set' + } + return false +} + +export const checkStructuredErrors: CheckFn = (_ctx, route, source, program) => { + if (!HANDLER_KINDS.includes(route.kind)) return na() + + const issues: Array<{ message: string, line: number }> = [] + + walkAst(program, (node) => { + if (node.type === 'ThrowStatement') { + const arg = (node as { argument: Node | null }).argument + if (!arg) return + if (arg.type === 'NewExpression') { + const { callee } = (arg as { callee: Node }) + if (callee.type === 'Identifier' && callee.name === 'Error') { + issues.push({ message: 'throw new Error() — use createError({ why, fix })', line: nodeLoc(node)?.line ?? 1 }) + } + } + if (arg.type === 'CallExpression' && isCallNamed(arg, ['createError'])) { + const props = getObjectProps(arg) + const hasWhy = props.has('why') + const hasFix = props.has('fix') + const line = nodeLoc(node)?.line ?? 1 + if (!hasWhy && !hasFix) { + issues.push({ message: 'createError() missing why and fix', line }) + } else if (!hasFix) { + issues.push({ message: 'createError() has why but missing fix', line }) + } else if (!hasWhy) { + issues.push({ message: 'createError() has fix but missing why', line }) + } + } + } + if (node.type === 'CallExpression' && isCallNamed(node, ['createError'])) { + const props = getObjectProps(node) + const line = nodeLoc(node)?.line ?? 1 + if (!props.has('why') || !props.has('fix')) { + if (!issues.some(i => i.line === line)) { + if (!props.has('fix')) { + issues.push({ message: 'createError() has why but missing fix', line }) + } else { + issues.push({ message: 'createError() missing why and fix', line }) + } + } + } + } + }) + + if (issues.length === 0) return pass() + const first = issues[0]! + return fail(first.message, route.file, first.line, lineSnippet(source, first.line)) +} + +function getObjectProps(callNode: Node): Set { + const props = new Set() + if (callNode.type !== 'CallExpression') return props + const { arguments: args } = (callNode as { arguments: Node[] }) + const [first] = args + if (!first || first.type !== 'ObjectExpression') return props + for (const prop of (first as { properties: Node[] }).properties) { + if (prop.type === 'Property') { + const { key } = (prop as { key: Node }) + if (key.type === 'Identifier') props.add(key.name) + if (key.type === 'Literal') props.add(String((key as { value: unknown }).value)) + } + } + return props +} + +export const checkAudit: CheckFn = (_ctx, route) => { + if (!HANDLER_KINDS.includes(route.kind)) return na() + return na() +} + +export function checkAuditWithSensitivity( + ctx: ScanContext, + route: RawRouteEntry, + program: import('oxc-parser').Program, + sensitivityLevel: 'high' | 'medium' | 'none', +): CheckResult { + if (!HANDLER_KINDS.includes(route.kind)) return na() + if (sensitivityLevel !== 'high') return na() + if (!ctx.hasEvlog) { + return fail('sensitive route without log.audit()', route.file, route.handler?.line ?? 1) + } + + let found = false + walkAst(program, (node) => { + if (isCallNamed(node, ['audit']) || callIsLogAudit(node)) found = true + }) + + if (found) return pass() + return fail('has logger + context but no log.audit() — sensitive route needs audit trail', route.file, route.handler?.line ?? 1) +} + +function callIsLogAudit(node: Node): boolean { + if (node.type !== 'CallExpression') return false + const { callee } = (node as { callee: Node }) + if (callee.type === 'MemberExpression') { + const obj = (callee as { object: Node }).object + const prop = (callee as { property: Node }).property + return obj.type === 'Identifier' && obj.name === 'log' && prop.type === 'Identifier' && prop.name === 'audit' + } + return false +} + +export const checkErrorHandling: CheckFn = (_ctx, route, source, program) => { + if (!HANDLER_KINDS.includes(route.kind)) return na() + + const issues: Array<{ line: number, message: string }> = [] + + walkAst(program, (node) => { + if (node.type !== 'CatchClause') return + const { body } = (node as { body: { body: Node[] } }).body + if (body.length === 0) { + issues.push({ line: nodeLoc(node)?.line ?? 1, message: 'empty catch block swallows errors' }) + return + } + const rethrows = body.some((stmt) => { + if (stmt.type === 'ThrowStatement') return true + if (stmt.type === 'ExpressionStatement') { + const expr = (stmt as { expression: Node }).expression + if (expr.type === 'CallExpression') { + const name = (expr as { callee: Node }).callee + if (name.type === 'Identifier' && ['console', 'log'].includes(name.name)) return true + if (name.type === 'MemberExpression') { + const prop = (name as { property: Node }).property + if (prop.type === 'Identifier' && ['error', 'warn', 'set', 'audit'].includes(prop.name)) return true + } + } + } + if (stmt.type === 'ReturnStatement') return true + return false + }) + if (!rethrows) { + issues.push({ line: nodeLoc(node)?.line ?? 1, message: 'catch block swallows error without logging or rethrow' }) + } + }) + + if (issues.length === 0) return pass() + const first = issues[0]! + return fail(first.message, route.file, first.line, lineSnippet(source, first.line)) +} + +export const checkPageErrorHandling: CheckFn = (_ctx, route, source, program) => { + if (route.kind !== 'page') return na() + + const hasFetch = /useFetch|\$fetch|fetch\s*\(/.test(source) + if (!hasFetch) return na() + + let hasErrorHandling = false + walkAst(program, (node) => { + if (node.type === 'CatchClause') hasErrorHandling = true + if (isCallNamed(node, ['onError', 'catchError'])) hasErrorHandling = true + if (node.type === 'MemberExpression') { + const prop = (node as { property: Node }).property + if (prop.type === 'Identifier' && prop.name === 'catch') hasErrorHandling = true + } + }) + + if (/\.catch\s*\(/.test(source)) hasErrorHandling = true + if (/error\s*[:=]/.test(source) && /useFetch|useAsyncData/.test(source)) hasErrorHandling = true + + if (hasErrorHandling) return pass() + return fail('page data fetch without error handling', route.file, 1) +} + +export const CHECKS: Record = { + 'wide-event': checkWideEvent, + 'context': checkContext, + 'structured-errors': checkStructuredErrors, + 'audit': checkAudit, + 'error-handling': checkErrorHandling, + 'page-error-handling': checkPageErrorHandling, +} + +/** Run every relevant observability check for one route (respecting exemptions). */ +export function runChecks( + ctx: ScanContext, + route: RawRouteEntry, + sensitivityLevel: 'high' | 'medium' | 'none', +): Partial> { + const filePath = join(ctx.projectRoot, route.file) + const parsed = parseFile(filePath) + const results: Partial> = {} + + if (!parsed) { + for (const id of Object.keys(CHECKS) as CheckId[]) { + if (route.kind === 'page' && id !== 'page-error-handling') continue + if (route.kind !== 'page' && id === 'page-error-handling') continue + if (!HANDLER_KINDS.includes(route.kind) && id !== 'page-error-handling') continue + results[id] = fail('file failed to parse', route.file, 1) + } + return results + } + + if (parsed.errors.length > 0 && ctx.verbose) { + console.warn(`Parse warnings in ${route.file}: ${parsed.errors.join(', ')}`) + } + + for (const [id, fn] of Object.entries(CHECKS) as [CheckId, CheckFn][]) { + if (route.kind === 'page') { + if (id !== 'page-error-handling') continue + } else { + if (id === 'page-error-handling') continue + if (!HANDLER_KINDS.includes(route.kind)) continue + } + + const skip = shouldSkipCheck(route, id) + if (skip) { + results[id] = { status: 'n/a', message: skip.reason } + continue + } + + results[id] = id === 'audit' + ? checkAuditWithSensitivity(ctx, route, parsed.program, sensitivityLevel) + : fn(ctx, route, parsed.source, parsed.program) + } + + return results +} diff --git a/packages/cli/src/lib/map/detect.ts b/packages/cli/src/lib/map/detect.ts new file mode 100644 index 00000000..491359f6 --- /dev/null +++ b/packages/cli/src/lib/map/detect.ts @@ -0,0 +1,83 @@ +import { globSync } from 'tinyglobby' +import { cliErrors } from '../errors' +import type { ProjectInfo } from '../project' +import type { Framework } from './types' + +interface DetectionMatch { + framework: Framework + specificity: number + reason: string +} + +export interface DetectionResult { + framework: Framework + warnings: string[] +} + +function hasDep(pkg: ProjectInfo['packageJson'], names: string[]): boolean { + if (!pkg) return false + const deps = { ...pkg.dependencies, ...pkg.devDependencies } + return names.some(n => n in deps) +} + +function hasConfig(root: string, patterns: string[]): boolean { + return globSync(patterns, { cwd: root, absolute: false }).length > 0 +} + +/** + * Pick a {@link Framework} for `map`'s adapter dispatch — dependency + config + * probes, most specific match wins. Throws a catalog {@link cliErrors} error + * (`--framework` to override) when nothing matches, distinguishing a bare + * monorepo root (via {@link ProjectInfo}) from a genuinely unsupported stack. + */ +export function detectFramework(project: ProjectInfo, override?: Framework): DetectionResult { + if (override) { + return { framework: override, warnings: [] } + } + + if (!project.packageJson) { + throw cliErrors.MAP_NO_PACKAGE_JSON() + } + + const root = project.packageDir + const pkg = project.packageJson + const matches: DetectionMatch[] = [] + + if (hasDep(pkg, ['nuxt']) || hasConfig(root, ['nuxt.config.{ts,js,mjs}'])) { + matches.push({ framework: 'nuxt', specificity: 10, reason: 'nuxt dependency or nuxt.config' }) + } + + if ( + (hasDep(pkg, ['nitropack', 'nitro']) || hasConfig(root, ['nitro.config.{ts,js,mjs}'])) + && !hasDep(pkg, ['nuxt']) + ) { + matches.push({ framework: 'nitro', specificity: 8, reason: 'nitro dependency or nitro.config' }) + } + + if (hasDep(pkg, ['next']) || hasConfig(root, ['next.config.{ts,js,mjs}'])) { + matches.push({ framework: 'next', specificity: 10, reason: 'next dependency or next.config' }) + } + + if (hasDep(pkg, ['@tanstack/react-start', '@tanstack/start'])) { + matches.push({ framework: 'tanstack-start', specificity: 10, reason: '@tanstack/react-start dependency' }) + } + + if (matches.length === 0) { + const isBareWorkspaceRoot = project.kind !== 'single' && project.packageDir === project.root + if (isBareWorkspaceRoot) { + throw cliErrors.MAP_WORKSPACE_ROOT() + } + throw cliErrors.MAP_FRAMEWORK_NOT_DETECTED() + } + + matches.sort((a, b) => b.specificity - a.specificity) + const best = matches[0]! + const warnings: string[] = [] + + if (matches.length > 1) { + const others = matches.slice(1).map(m => m.framework).join(', ') + warnings.push(`Multiple frameworks detected; using ${best.framework} (${others} also matched)`) + } + + return { framework: best.framework, warnings } +} diff --git a/packages/cli/src/lib/map/exemptions.ts b/packages/cli/src/lib/map/exemptions.ts new file mode 100644 index 00000000..d42faaee --- /dev/null +++ b/packages/cli/src/lib/map/exemptions.ts @@ -0,0 +1,63 @@ +import type { CheckId, RawRouteEntry, RouteEntry } from './types' + +export interface RouteExemption { + reason: string + /** Observability checks that do not apply to this route. */ + skipChecks: CheckId[] +} + +const INFRA_PATHS = [ + '/evlog/ingest', + '/_evlog/ingest', + '/api/evlog/ingest', +] + +const INFRA_FILE_PATTERNS = [ + 'evlog/ingest', + '_evlog/ingest', +] + +/** + * Routes that are evlog plumbing (client ingest, internal handlers) — not app handlers. + * Observability checks are n/a, not failures. + */ +export function getRouteExemption(route: Pick): RouteExemption | null { + const path = route.path.toLowerCase() + const file = route.file.toLowerCase() + + for (const pattern of INFRA_PATHS) { + if (path.includes(pattern)) { + return { + reason: 'evlog infrastructure — client log ingest endpoint', + skipChecks: ['wide-event', 'context', 'audit', 'structured-errors', 'error-handling'], + } + } + } + + for (const pattern of INFRA_FILE_PATTERNS) { + if (file.includes(pattern)) { + return { + reason: 'evlog infrastructure — client log ingest endpoint', + skipChecks: ['wide-event', 'context', 'audit', 'structured-errors', 'error-handling'], + } + } + } + + return null +} + +export function isInfrastructureRoute(route: Pick): boolean { + return getRouteExemption(route) !== null +} + +export function shouldSkipCheck(route: Pick, checkId: CheckId): RouteExemption | null { + const exemption = getRouteExemption(route) + if (!exemption) return null + if (exemption.skipChecks.includes(checkId)) return exemption + return null +} + +export function infrastructureLabel(route: RouteEntry): string { + const exemption = getRouteExemption(route) + return exemption ? 'infra' : '' +} diff --git a/packages/cli/src/lib/map/parse.ts b/packages/cli/src/lib/map/parse.ts new file mode 100644 index 00000000..e8e884bb --- /dev/null +++ b/packages/cli/src/lib/map/parse.ts @@ -0,0 +1,211 @@ +import { readFileSync } from 'node:fs' +import { parseSync } from 'oxc-parser' +import type { Node, Program } from 'oxc-parser' + +export interface ParseResult { + program: Program + source: string + errors: string[] +} + +/** Parse a route file (Vue ` + + diff --git a/packages/cli/test/map/fixtures/nuxt-basic/pages/orders/[id].vue b/packages/cli/test/map/fixtures/nuxt-basic/pages/orders/[id].vue new file mode 100644 index 00000000..53e89089 --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/pages/orders/[id].vue @@ -0,0 +1,12 @@ + + + diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/api/broken-error.get.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/api/broken-error.get.ts new file mode 100644 index 00000000..3990ce58 --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/api/broken-error.get.ts @@ -0,0 +1,7 @@ +export default defineEventHandler(async () => { + throw createError({ + message: 'Bad request', + status: 400, + why: 'Missing field', + }) +}) diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/api/checkout.post.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/api/checkout.post.ts new file mode 100644 index 00000000..4e5fecf4 --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/api/checkout.post.ts @@ -0,0 +1,6 @@ +export default defineEventHandler(async (event) => { + const log = useLogger(event) + log.set({ user: { id: '123' } }) + log.audit({ action: 'checkout.completed', resource: 'order' }) + return { ok: true } +}) diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/api/docs/[...slug].get.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/api/docs/[...slug].get.ts new file mode 100644 index 00000000..04a70cdf --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/api/docs/[...slug].get.ts @@ -0,0 +1,3 @@ +export default defineEventHandler(async () => { + return { docs: true } +}) diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/api/orders/[id].get.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/api/orders/[id].get.ts new file mode 100644 index 00000000..8d24e90f --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/api/orders/[id].get.ts @@ -0,0 +1,10 @@ +export default defineEventHandler(async (event) => { + const log = useLogger(event) + log.set({ item: 'test' }) + throw createError({ + message: 'Not found', + status: 404, + why: 'Resource does not exist', + fix: 'Check the ID and try again', + }) +}) diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/api/payments/stripe.post.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/api/payments/stripe.post.ts new file mode 100644 index 00000000..044de78c --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/api/payments/stripe.post.ts @@ -0,0 +1,10 @@ +import Stripe from 'stripe' + +export default defineEventHandler(async (event) => { + const stripe = new Stripe('sk_test') + try { + await stripe.checkout.sessions.create({}) + } + catch {} + return { ok: true } +}) diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/api/plain-error.get.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/api/plain-error.get.ts new file mode 100644 index 00000000..e30713a8 --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/api/plain-error.get.ts @@ -0,0 +1,3 @@ +export default defineEventHandler(async () => { + throw new Error('Something went wrong') +}) diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/middleware/auth.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/middleware/auth.ts new file mode 100644 index 00000000..085df50e --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/middleware/auth.ts @@ -0,0 +1,3 @@ +export default defineEventHandler(async (event) => { + event.context.log = event.context.log +}) diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/routes/health.get.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/routes/health.get.ts new file mode 100644 index 00000000..7c17f052 --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/routes/health.get.ts @@ -0,0 +1,3 @@ +export default defineEventHandler(async () => { + return { health: true } +}) diff --git a/packages/cli/test/map/fixtures/nuxt-basic/server/tasks/cleanup.ts b/packages/cli/test/map/fixtures/nuxt-basic/server/tasks/cleanup.ts new file mode 100644 index 00000000..86c08825 --- /dev/null +++ b/packages/cli/test/map/fixtures/nuxt-basic/server/tasks/cleanup.ts @@ -0,0 +1,6 @@ +export default defineTask({ + meta: { name: 'cleanup', description: 'Daily cleanup' }, + run() { + return { result: 'ok' } + }, +}) diff --git a/packages/cli/test/map/fixtures/tanstack-basic/package.json b/packages/cli/test/map/fixtures/tanstack-basic/package.json new file mode 100644 index 00000000..431c08c8 --- /dev/null +++ b/packages/cli/test/map/fixtures/tanstack-basic/package.json @@ -0,0 +1,9 @@ +{ + "name": "tanstack-basic-fixture", + "private": true, + "type": "module", + "dependencies": { + "@tanstack/react-start": "^1.0.0", + "evlog": "workspace:*" + } +} diff --git a/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/admin.ts b/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/admin.ts new file mode 100644 index 00000000..cdf7e23f --- /dev/null +++ b/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/admin.ts @@ -0,0 +1,15 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/api/admin')({ + server: { + handlers: { + POST: async () => { + try { + await fetch('/api/auth') + } + catch {} + return { ok: true } + }, + }, + }, +}) diff --git a/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/checkout.ts b/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/checkout.ts new file mode 100644 index 00000000..6f79c97c --- /dev/null +++ b/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/checkout.ts @@ -0,0 +1,23 @@ +import { createFileRoute } from '@tanstack/react-router' +import { createError } from 'evlog' + +export const Route = createFileRoute('/api/checkout')({ + server: { + handlers: { + POST: async () => { + const log = useLogger() + log.set({ cart: { total: 100 } }) + log.audit({ action: 'checkout' }) + throw createError({ + message: 'Payment failed', + why: 'Card declined', + fix: 'Try another card', + }) + }, + }, + }, +}) + +function useLogger() { + return { set: () => {}, audit: () => {} } +} diff --git a/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/hello.ts b/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/hello.ts new file mode 100644 index 00000000..68c25fb3 --- /dev/null +++ b/packages/cli/test/map/fixtures/tanstack-basic/src/routes/api/hello.ts @@ -0,0 +1,11 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/api/hello')({ + server: { + handlers: { + GET: async () => { + return { hello: 'world' } + }, + }, + }, +}) diff --git a/packages/cli/test/map/fixtures/tanstack-basic/src/routes/index.tsx b/packages/cli/test/map/fixtures/tanstack-basic/src/routes/index.tsx new file mode 100644 index 00000000..34a91450 --- /dev/null +++ b/packages/cli/test/map/fixtures/tanstack-basic/src/routes/index.tsx @@ -0,0 +1,9 @@ +import { createFileRoute } from '@tanstack/react-router' + +export const Route = createFileRoute('/')({ + component: Home, +}) + +function Home() { + return
Home
+} diff --git a/packages/cli/test/map/scan.test.ts b/packages/cli/test/map/scan.test.ts new file mode 100644 index 00000000..2dd895be --- /dev/null +++ b/packages/cli/test/map/scan.test.ts @@ -0,0 +1,166 @@ +import { join } from 'node:path' +import { describe, expect, it } from 'vitest' +import { getAdapter } from '../../src/lib/map/adapters/index' +import { detectFramework } from '../../src/lib/map/detect' +import { scan } from '../../src/lib/map/scan' +import type { ScanContext } from '../../src/lib/map/types' +import { extractMethodFromFilename, segmentsToPath } from '../../src/lib/map/utils' +import { mapForSnapshot } from '../../src/lib/map/write' +import { resolveProject } from '../../src/lib/project' + +const FIXTURES = join(import.meta.dirname, 'fixtures') + +async function ctx(root: string, framework: ScanContext['framework']): Promise { + const project = await resolveProject(root) + const deps = { ...project.packageJson?.dependencies, ...project.packageJson?.devDependencies } + return { + projectRoot: project.packageDir, + framework, + projectName: project.packageName ?? 'unknown', + hasEvlog: 'evlog' in deps, + verbose: false, + } +} + +describe('utils', () => { + it('extracts HTTP method from filename', () => { + expect(extractMethodFromFilename('checkout.post.ts')).toBe('POST') + expect(extractMethodFromFilename('health.get.ts')).toBe('GET') + expect(extractMethodFromFilename('index.ts')).toBeNull() + }) + + it('converts segments to path', () => { + expect(segmentsToPath(['orders', '[id]'], '/api')).toBe('/api/orders/:id') + expect(segmentsToPath(['docs', '[...slug]'], '/api')).toBe('/api/docs/:slug*') + expect(segmentsToPath(['(group)', 'about'])).toBe('/about') + }) +}) + +describe('detect', () => { + it('detects nuxt in fixture', async () => { + const project = await resolveProject(join(FIXTURES, 'nuxt-basic')) + const result = detectFramework(project) + expect(result.framework).toBe('nuxt') + }) + + it('detects next in fixture', async () => { + const project = await resolveProject(join(FIXTURES, 'next-app-router')) + const result = detectFramework(project) + expect(result.framework).toBe('next') + }) + + it('detects tanstack-start in fixture', async () => { + const project = await resolveProject(join(FIXTURES, 'tanstack-basic')) + const result = detectFramework(project) + expect(result.framework).toBe('tanstack-start') + }) +}) + +describe('nuxt extraction', () => { + it('extracts all routes from nuxt-basic fixture', async () => { + const root = join(FIXTURES, 'nuxt-basic') + const adapter = getAdapter('nuxt') + const routes = await adapter.extractRoutes(await ctx(root, 'nuxt')) + + const paths = routes.map(r => `${r.method ?? '*'} ${r.path} (${r.kind})`).sort() + expect(paths).toMatchInlineSnapshot(` + [ + "* * (middleware)", + "* / (page)", + "* /orders/:id (page)", + "* /tasks/cleanup (cron)", + "GET /api/broken-error (api)", + "GET /api/docs/:slug* (api)", + "GET /api/orders/:id (api)", + "GET /api/plain-error (api)", + "GET /health (api)", + "POST /api/checkout (api)", + "POST /api/payments/stripe (api)", + ] + `) + }) +}) + +describe('next extraction', () => { + it('extracts all routes from next-app-router fixture', async () => { + const root = join(FIXTURES, 'next-app-router') + const adapter = getAdapter('next') + const routes = await adapter.extractRoutes(await ctx(root, 'next')) + + const paths = routes.map(r => `${r.method ?? '*'} ${r.path} (${r.kind})`).sort() + expect(paths).toContain('GET /api/health (api)') + expect(paths).toContain('POST /api/checkout (api)') + expect(paths).toContain('POST /api/payments (api)') + expect(paths).toContain('GET /api/error (api)') + expect(paths).toContain('* / (page)') + expect(paths).toContain('POST action:createOrder (server-action)') + expect(paths).toContain('* * (middleware)') + }) +}) + +describe('tanstack extraction', () => { + it('extracts routes from tanstack-basic fixture', async () => { + const root = join(FIXTURES, 'tanstack-basic') + const adapter = getAdapter('tanstack-start') + const routes = await adapter.extractRoutes(await ctx(root, 'tanstack-start')) + + const paths = routes.map(r => `${r.method ?? '*'} ${r.path} (${r.kind})`).sort() + expect(paths).toContain('POST /api/checkout (api)') + expect(paths).toContain('GET /api/hello (api)') + expect(paths).toContain('* / (page)') + expect(paths).toContain('POST /api/admin (api)') + }) +}) + +describe('full scan snapshots', () => { + it('nuxt-basic map snapshot', async () => { + const root = join(FIXTURES, 'nuxt-basic') + const result = await scan(await ctx(root, 'nuxt')) + expect(mapForSnapshot(result.map)).toMatchSnapshot() + }) + + it('next-app-router map snapshot', async () => { + const root = join(FIXTURES, 'next-app-router') + const result = await scan(await ctx(root, 'next')) + expect(mapForSnapshot(result.map)).toMatchSnapshot() + }) + + it('tanstack-basic map snapshot', async () => { + const root = join(FIXTURES, 'tanstack-basic') + const result = await scan(await ctx(root, 'tanstack-start')) + expect(mapForSnapshot(result.map)).toMatchSnapshot() + }) +}) + +describe('checks', () => { + it('flags empty catch blocks', async () => { + const root = join(FIXTURES, 'nuxt-basic') + const result = await scan(await ctx(root, 'nuxt')) + const stripe = result.map.routes.find(r => r.path === '/api/payments/stripe') + expect(stripe?.checks['error-handling']?.status).toBe('fail') + }) + + it('passes instrumented checkout route', async () => { + const root = join(FIXTURES, 'nuxt-basic') + const result = await scan(await ctx(root, 'nuxt')) + const checkout = result.map.routes.find(r => r.path === '/api/checkout') + expect(checkout?.checks['wide-event']?.status).toBe('pass') + expect(checkout?.checks['context']?.status).toBe('pass') + expect(checkout?.checks['audit']?.status).toBe('pass') + expect(checkout?.score).toBe(100) + }) + + it('flags createError missing fix', async () => { + const root = join(FIXTURES, 'nuxt-basic') + const result = await scan(await ctx(root, 'nuxt')) + const broken = result.map.routes.find(r => r.path === '/api/broken-error') + expect(broken?.checks['structured-errors']?.status).toBe('fail') + }) + + it('flags plain throw new Error', async () => { + const root = join(FIXTURES, 'nuxt-basic') + const result = await scan(await ctx(root, 'nuxt')) + const plain = result.map.routes.find(r => r.path === '/api/plain-error') + expect(plain?.checks['structured-errors']?.status).toBe('fail') + }) +}) diff --git a/packages/cli/test/map/score.test.ts b/packages/cli/test/map/score.test.ts new file mode 100644 index 00000000..86a5df5e --- /dev/null +++ b/packages/cli/test/map/score.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest' +import { gradeFromScore, scoreGlobal, scoreRoute } from '../../src/lib/map/score' +import type { CheckResult, RouteEntry } from '../../src/lib/map/types' + +describe('score', () => { + it('subtracts weights for failed checks', () => { + const checks: Record = { + 'wide-event': { status: 'fail' }, + 'context': { status: 'pass' }, + } + expect(scoreRoute(checks)).toBe(60) + }) + + it('computes weighted global score', () => { + const routes = [ + { score: 100, sensitivity: { level: 'none', reasons: [] }, kind: 'api' }, + { score: 50, sensitivity: { level: 'high', reasons: ['money'] }, kind: 'api' }, + ] as RouteEntry[] + expect(scoreGlobal(routes)).toBe(67) + }) + + it('maps grades', () => { + expect(gradeFromScore(95)).toBe('excellent') + expect(gradeFromScore(75)).toBe('good') + expect(gradeFromScore(55)).toBe('needs-work') + expect(gradeFromScore(30)).toBe('at-risk') + }) +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a2750d7..3b1432b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,42 +64,45 @@ importers: dependencies: '@databuddy/nuxt': specifier: ^2.4.20 - version: 2.4.20(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(react@19.2.6)(vue@3.5.40(typescript@6.0.3)) + version: 2.4.20(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(react@19.2.6)(vue@3.5.40(typescript@6.0.3)) '@nuxt/fonts': specifier: 0.14.0 version: 0.14.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/ui': specifier: ^4.10.0 - version: 4.10.0(342679e81daec34fb4ebc5f1215784ba) + version: 4.10.0(9dd74825632101caae164786bfef9095) '@resvg/resvg-js': specifier: ^2.6.2 version: 2.6.2 '@vercel/analytics': specifier: ^2.0.1 - version: 2.0.1(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3)) + version: 2.0.1(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3)) '@vercel/speed-insights': specifier: ^2.0.0 - version: 2.0.0(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3)) + version: 2.0.0(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3)) better-sqlite3: specifier: ^12.11.1 version: 12.11.1 docus: specifier: ^5.12.3 - version: 5.12.3(a0b6e862aa0ce19fb90c10e383495f25) + version: 5.12.3(c6cde3b888115f62b3451ac8d038e704) + evlog: + specifier: workspace:* + version: link:../../packages/evlog motion-v: specifier: ^2.3.0 version: 2.3.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3)))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.40(typescript@6.0.3)) nuxt: specifier: ^4.4.4 - version: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + version: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) nuxt-studio: - specifier: ^1.7.0 - version: 1.7.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(vue@3.5.40(typescript@6.0.3)) + specifier: ^1.6.1 + version: 1.7.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)) satori: - specifier: ^0.28.0 - version: 0.28.0 + specifier: ^0.19.3 + version: 0.19.3 shaders: - specifier: ^2.5.135 + specifier: ^2.5.109 version: 2.5.135(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.12)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3)) devDependencies: eslint: @@ -119,10 +122,10 @@ importers: version: 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/ui': specifier: ^4.9.0 - version: 4.10.0(1aad4d54899ef5c334c82429a3d5e1c2) + version: 4.10.0(91360aae90a0729fe907655509b87ef2) '@nuxtjs/sitemap': specifier: ^8.2.2 - version: 8.2.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) + version: 8.2.2(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) '@vercel/analytics': specifier: ^2.0.1 version: 2.0.1(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3)) @@ -156,7 +159,7 @@ importers: version: link:../../packages/evlog next: specifier: ^16.2.10 - version: 16.2.10(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + version: 16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: specifier: ^19.2.7 version: 19.2.7 @@ -231,7 +234,7 @@ importers: version: 1.0.0(@types/markdown-it@14.1.2)(react@19.2.6)(solid-js@1.9.12)(vue@3.5.40(typescript@5.9.3)) nuxt: specifier: ^4.4.2 - version: 4.4.4(d331503cc652b8b0dc91dfdee719201c) + version: 4.5.0(d0b081e3ea844aa3953445e0cdf8d794) zod: specifier: ^4.4.3 version: 4.4.3 @@ -240,7 +243,7 @@ importers: dependencies: '@nuxt/ui': specifier: ^4.9.0 - version: 4.10.0(9544d347d5c55f21e8018f343dea7214) + version: 4.10.0(16ede3a4a3f5881e23838e9d4f8f988e) better-auth: specifier: ^1.6.23 version: 1.6.23(45d050b1f52f671ed6239fb5e0be6ef8) @@ -277,13 +280,13 @@ importers: version: 0.14.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/ui': specifier: ^4.10.0 - version: 4.10.0(1b446c4a581dc5097e46f48d13fb9d61) + version: 4.10.0(de89ca55adde23fab0252e9bd2d5a9c0) '@nuxthub/core': specifier: ^0.10.8 version: 0.10.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(typescript@6.0.3)(vue-tsc@3.2.7(typescript@6.0.3)) '@nuxtjs/mcp-toolkit': specifier: ^0.18.0 - version: 0.18.0(@vue/compiler-sfc@3.5.39)(h3@1.15.11)(magicast@0.5.3)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + version: 0.18.0(@vue/compiler-sfc@3.5.40)(h3@1.15.11)(magicast@0.5.3)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) drizzle-kit: specifier: ^0.31.10 version: 0.31.10 @@ -806,6 +809,12 @@ importers: evlog: specifier: workspace:* version: link:../evlog + oxc-parser: + specifier: ^0.82.3 + version: 0.82.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + tinyglobby: + specifier: ^0.2.17 + version: 0.2.17 devDependencies: tsdown: specifier: ^0.22.8 @@ -930,10 +939,10 @@ importers: version: 3.0.260311-beta(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(chokidar@5.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(giget@3.2.0)(ioredis@5.10.1)(jiti@2.7.0)(lru-cache@11.3.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) nitropack: specifier: ^2.13.4 - version: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.140.0)(rolldown@1.1.5)(srvx@0.11.15)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + version: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.140.0)(rolldown@1.2.0)(srvx@0.11.15)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) nuxt: specifier: ^4.4.2 - version: 4.4.4(3a628c60eb3c5faf2e1974943d1ba369) + version: 4.4.4(798471e5840d715482aeb7b47cc070f1) pino: specifier: ^10.3.1 version: 10.3.1 @@ -1026,18 +1035,6 @@ packages: bcrypt: optional: true - '@ai-sdk/gateway@3.0.109': - resolution: {integrity: sha512-r6dOqThjODp1vOhGRJg2OCmyB/ZOQtGx1esZ2SDvwDX5XoX8dBqYaYjLg8MPXTzMGJSgOkJyCxWgUcZtAl16pw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/gateway@3.0.134': - resolution: {integrity: sha512-PfUkQp01EihEyNM6e+nexXmVANiY5KcHMui/MmaHsC4KVVQYh/MwPeOsD3bTPu63e581BKO+AwaPPNmD4x943A==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.151': resolution: {integrity: sha512-gsKEm1LleR/xm1FiJjnNxf1ZUKZryj20STsKJB7TdMcaiRqQgeHrdYWv/DNSA8ZBkRahHC+wEYHaI0VR9/EOwQ==} engines: {node: '>=18'} @@ -1062,18 +1059,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.26': - resolution: {integrity: sha512-CsKNLKsOpvPujRlIYvoz+Ybw+kGn7J4/fIZa/58+R7iWLLfwn6ifE2G6Yq8K9XvH/I/3bzaDAJ3NhRwEMsLBKQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - '@ai-sdk/provider-utils@4.0.30': - resolution: {integrity: sha512-VO7I+vPffqI5sMnPoUq5DCSqKIgQIk/naJWRdQVpz2ma2zoprC/lqiJiUEl2s6DfvTD76TbhD3q39ROjlA6rGw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.39': resolution: {integrity: sha512-XPR6o7561RYUkfYlLYouWsvm6Gv2tYIQy5pttGRkvML98u138ClPThn5yiQg5rMQutTtZLB+GUC8qFFCzDKQQQ==} engines: {node: '>=18'} @@ -1092,10 +1077,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@3.0.10': - resolution: {integrity: sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==} - engines: {node: '>=18'} - '@ai-sdk/provider@3.0.14': resolution: {integrity: sha512-5X1k57JBJ4H7H1QjX7CnJYAB1I19r/trVZTMcSms7/kLNZ8RaU4Nt2agcwZzv82Hfx6Q7/TOLU7agAKeFfc8cA==} engines: {node: '>=18'} @@ -1108,12 +1089,6 @@ packages: resolution: {integrity: sha512-e0CpNWJUY7OxAFAnCZkw+ri9QOHWwTs1tXP42782KFGCU07qt8NiXCrCVowyCB5dP2r5/Uls+g2oPd8kOJn9dw==} engines: {node: '>=22'} - '@ai-sdk/vue@3.0.174': - resolution: {integrity: sha512-lc8dmKIRNn3kCtKw5jnRZzI/AErCsN9qo9BXNq9GfZGxSbR3FBLwHyhFCBze9zSWR5RQ68h/vR/olvPxHoIUUw==} - engines: {node: '>=18'} - peerDependencies: - vue: ^3.3.4 - '@ai-sdk/vue@3.0.228': resolution: {integrity: sha512-8+t7DEJt97r7ZmYR641oxr0KLes27tnx3TybYhi/KQm/UUtuq66nhMKealZY6y6Tq3Yg9+gsOgcoCAu13YWtWA==} engines: {node: '>=18'} @@ -2687,15 +2662,9 @@ packages: '@fingerprintjs/botd@2.0.0': resolution: {integrity: sha512-yhuz23NKEcBDTHmGz/ULrXlGnbHenO+xZmVwuBkuqHUkqvaZ5TAA0kAgcRy4Wyo5dIBdkIf57UXX8/c9UlMLJg==} - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - '@floating-ui/core@1.8.0': resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - '@floating-ui/dom@1.8.0': resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} @@ -2705,9 +2674,6 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@floating-ui/utils@0.2.12': resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} @@ -2745,9 +2711,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify-json/lucide@1.2.105': - resolution: {integrity: sha512-tbE+cGEixWcRFtW8xkzX1HaGRqp7CDhZb01uPBh7PnRoxXzVET9E73rHOXDdsLKUGoTuYGZKhhX6oirvoy5NDg==} - '@iconify-json/lucide@1.2.117': resolution: {integrity: sha512-7isYKJKWRZ8NfLNSY8pIYmRWiMBkopL4/X22gZfFmePFhc7az0hQ5biqBLG6vdDEvMctFu2suZB3yQ29RL+8tA==} @@ -3884,10 +3847,6 @@ packages: resolution: {integrity: sha512-7FDMuD+skbFMgfF2ORYKEAKEuEFbu2oS60dln5uVtn94c8DHWCseJSrT3FUHzVUlVwyhztPU6stzB44dEoWAzw==} engines: {node: ^14.18.0 || >=16.10.0} - '@nuxt/schema@4.4.8': - resolution: {integrity: sha512-igfWuMF0x0Pmx/XwhPwH/bcXgbuwNnjUjqxCAsY6VQhmGKo0e9soJq3Q0ohj+rBkBfX6o2ysTP1/t2M82aK4qA==} - engines: {node: ^14.18.0 || >=16.10.0} - '@nuxt/schema@4.5.0': resolution: {integrity: sha512-RY4cH0z2JRlmcsAIrBBXlmRW8FnCBTRdHCByttog+lAxg1hrJ2W5OdnoHO0KMeZSJg67MdeYPOZu7ZszFEymgA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -4116,10 +4075,6 @@ packages: resolution: {integrity: sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA==} engines: {node: '>=20.0'} - '@opentelemetry/api@1.9.0': - resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} - engines: {node: '>=8.0.0'} - '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} @@ -4411,6 +4366,12 @@ packages: cpu: [arm64] os: [android] + '@oxc-parser/binding-android-arm64@0.82.3': + resolution: {integrity: sha512-hU9TSCa/dmYx0UCQyH+b9iONRGv5cfnvoSMKFf0v9xNwqlQu7mEil4po1d0a3Yjb7YyI9mz6e6bfg0XcjbMdBg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [android] + '@oxc-parser/binding-darwin-arm64@0.128.0': resolution: {integrity: sha512-tRUHPt80417QmvNpoSslJT1VY8NUbWdrWR+L14Zn+RbOTcaqB8E6PYE/ZGN8jjWBzqporiA/H4MfO50ew/NCNA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4435,6 +4396,12 @@ packages: cpu: [arm64] os: [darwin] + '@oxc-parser/binding-darwin-arm64@0.82.3': + resolution: {integrity: sha512-LjBFMUtYYGZyA2g3+ajNPcn6RwsBoDbKELSf/pwVNCWHmAQwptw8zRc4VVDnBqANvkjmoe7MSp6TqKGi359/rw==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [darwin] + '@oxc-parser/binding-darwin-x64@0.128.0': resolution: {integrity: sha512-rWI2Hb1Nt3U/vKsjyNvZzDC8i/l144U20DKjhzaTmwIhIiSRGeroPWWiImwypmKLqrw8GuIixbWJkpGWLbkzrQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4459,6 +4426,12 @@ packages: cpu: [x64] os: [darwin] + '@oxc-parser/binding-darwin-x64@0.82.3': + resolution: {integrity: sha512-/d4uUlq2F3S0lwXnMjcGWkFUgZsPT/urypIQKFuumXbf9cHsy4bnkRDLL67+KpQ373R9boOEH+yUBYrLE9+LxA==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [darwin] + '@oxc-parser/binding-freebsd-x64@0.128.0': resolution: {integrity: sha512-hhpdVMaNCLgQxjgNPeeFzSeJMmZPc5lKfv0NGSI3egZq9EdnEGqeC8JsYsQjK7PoQgbvZ17xlj0SO5ziH5Obkg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4483,6 +4456,12 @@ packages: cpu: [x64] os: [freebsd] + '@oxc-parser/binding-freebsd-x64@0.82.3': + resolution: {integrity: sha512-H8wJ8LNrRAZ1Q75r+bnEn79pPAq8zQKnbE5+mWu9Xq5qcaQ6l/ZgjdamjvK05hZZXicCV5xji315f+OKK2BayQ==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [freebsd] + '@oxc-parser/binding-linux-arm-gnueabihf@0.128.0': resolution: {integrity: sha512-093zNw0zZ/e/obML+rhlSdmnzR0mVZluPcAkxunEc5E3F0yBVsFn24Y1ILfsEte11Ud041qn/gp2OJ1jxNqUng==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4507,6 +4486,12 @@ packages: cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm-gnueabihf@0.82.3': + resolution: {integrity: sha512-iomV7aBUubRHcsLkEnl8ORsPc2yIRfB4AD6N9KweUUZMEAiNFjS5DU83NcdmkMajejWqCNczzeFIyBkyRkptDw==} + engines: {node: '>=20.0.0'} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.128.0': resolution: {integrity: sha512-fq7DmKmfC+dvD97IXrgbph6Jzwe0EDu+PYMofmzZ6fv5X1k9vtaqLpDGMuICO9MmUnyKAQmVl+wIv2RNy4Dz8g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4531,6 +4516,12 @@ packages: cpu: [arm] os: [linux] + '@oxc-parser/binding-linux-arm-musleabihf@0.82.3': + resolution: {integrity: sha512-DUZT8W//2MwQCbz7XSFSp/F4qwIq5ZSZVcLp/G++4Fo38ERzc8CvcQHiHOJXKY68BHHlBrkGp81RjhvWiRUJVw==} + engines: {node: '>=20.0.0'} + cpu: [arm] + os: [linux] + '@oxc-parser/binding-linux-arm64-gnu@0.128.0': resolution: {integrity: sha512-Xvm48jJah8TlIrURIjNOP/gNiGe6aKvCB+r06VliflFo8Kq7VOLE8PxtgShJzZIqubrgdMdYfvuPPozn7F6MbQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4559,6 +4550,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-arm64-gnu@0.82.3': + resolution: {integrity: sha512-p66Mlm9ZpraOf1YyyJTIlastfDWMr4For132Ns8iT4AWc1L+Ml4hJew5x/5Y0HXw6zX5q290FvHfWMIh499hxg==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-arm64-musl@0.128.0': resolution: {integrity: sha512-M7iwBGmYJTx+pKOYFjI0buop4gJvlmcVzFGaXPt21DKpQkbQZG1f63Yg7LloIYT/t9yLxCw0Lhfx/RFlAlMSjA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4587,6 +4585,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-arm64-musl@0.82.3': + resolution: {integrity: sha512-eTeubc6GaGSGa09s9vffbg3Nxve4okUe79UQAd/vXPCPaGcbC/3VXoMutEjRyewOEEXihdYzggxa3v9yv7bNoA==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-linux-ppc64-gnu@0.128.0': resolution: {integrity: sha512-21LGNIZb1Pcfk5/EGsqabrxv4yqQOWis1407JJrClS7XpFCrbvr74YAB1V+m54cYbwvO6UWwQqS4WecxiyfCRg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4643,6 +4648,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.82.3': + resolution: {integrity: sha512-gOLpW5RZLajzc/PfPBxYGLLQu9ErBJBZSboBpDafP1Vv8t/vmwEr0WA95oxPdFo0lMl2xkjcVNbOiVQA70U56Q==} + engines: {node: '>=20.0.0'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-riscv64-musl@0.128.0': resolution: {integrity: sha512-X6Q2oKUrP5GyDd2xniuEBLk6aFQCZ97W2+aVXGgJXdjx5t4/oFuA9ri0wLOUrBIX+qdSuK581snMBio4z910eA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4699,6 +4711,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-s390x-gnu@0.82.3': + resolution: {integrity: sha512-K8FiSCsjUxwo5uKIlwoQd8Dgtvjplk1fYXLnU4CKH0BxWVihf34NQ3DCyELMjAOhyrslfih5cWULIyKOdWSUqw==} + engines: {node: '>=20.0.0'} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.128.0': resolution: {integrity: sha512-OO1nW2Q7sSYYvJZpDHdvyFSdRaVcQqRijZSSmWVMqFxPYy8cEF45zJ9fcdIYuzIT3jYq6YRhEFm/VMWNWhE22Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4727,6 +4746,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-x64-gnu@0.82.3': + resolution: {integrity: sha512-/n13gpaEWlDHGWExq5lfZpvxKkA2w+zWA79C13F4yVskEzfZSk1x6dTBrkGSf3pFAUFHtzrlT/LPHiUyMJt5Tg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-x64-musl@0.128.0': resolution: {integrity: sha512-4NehAe404MRdoZVS9DW8C5XbJwbXIc/KfVlYdpi5vE4081zc9Y0YzKVqyOYj/Puye7/Do+ohaONBFWlEHYl9hw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4755,6 +4781,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-x64-musl@0.82.3': + resolution: {integrity: sha512-P6eBYtOmAP0uihOeteOzXwAS4s5FB79gt1THYEMBGNe482PPhesqEXyq5jFCwBzpM1QKg7xG7N+EC+ZUktXOTg==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + '@oxc-parser/binding-openharmony-arm64@0.128.0': resolution: {integrity: sha512-kVbqgW9xLL8bh8oc7aYOJilRKXE5G33+tE0jan+duo/9OriaFRpijcCwT2waWs2oqYROYq0GlE7/p3ywoshVeg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4799,6 +4832,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] + '@oxc-parser/binding-wasm32-wasi@0.82.3': + resolution: {integrity: sha512-oFL0vJfrR7Qkj+n3q9MQhqOsaWGiDg4B1Ch/mJMZGXJAkZ1dnYKQWLVymJkWsl4Ydgs82h6L20mX2IthbF0wHQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@oxc-parser/binding-win32-arm64-msvc@0.128.0': resolution: {integrity: sha512-xgvO35GyHBtjlQ5AEpaYr7Rll1rvY7zqIhT6ty8E3ezBW2J1SFLjIDEvI/tcgDg6oaseDAqVcM+jU1HuCekgZw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4823,6 +4861,12 @@ packages: cpu: [arm64] os: [win32] + '@oxc-parser/binding-win32-arm64-msvc@0.82.3': + resolution: {integrity: sha512-2t3j5pWgL7ZWj/3Q1aiUBnH79oAzQO+KOM5tTVawIWpsHFqsuGEL5ckikap1JczHaugAaEvc067ihTjpSDoXVA==} + engines: {node: '>=20.0.0'} + cpu: [arm64] + os: [win32] + '@oxc-parser/binding-win32-ia32-msvc@0.128.0': resolution: {integrity: sha512-OY+3eM2SN72prHKRB22mPz8o5A/7dJ+f5DFLBVvggyZhEaNDAH9IB+ElMjmOkOIwf5MDCUAowCK7pAncNxzpBA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4871,6 +4915,12 @@ packages: cpu: [x64] os: [win32] + '@oxc-parser/binding-win32-x64-msvc@0.82.3': + resolution: {integrity: sha512-MeMOFDIZ3vSZyjgjSkWKb/zdRc4eSwK0kUl5OmysjRIIyIK7LEFLpuk7R+Of4nUGYAQNRHyC8BcMJKO2OLBeqA==} + engines: {node: '>=20.0.0'} + cpu: [x64] + os: [win32] + '@oxc-project/types@0.103.0': resolution: {integrity: sha512-bkiYX5kaXWwUessFRSoXFkGIQTmc6dLGdxuRTrC+h8PSnIdZyuXHHlLAeTmOue5Br/a0/a7dHH0Gca6eXn9MKg==} @@ -4892,6 +4942,9 @@ packages: '@oxc-project/types@0.140.0': resolution: {integrity: sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==} + '@oxc-project/types@0.82.3': + resolution: {integrity: sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA==} + '@oxc-transform/binding-android-arm-eabi@0.128.0': resolution: {integrity: sha512-qVO4izEs88ZSo7KOK4P+O5nAXXJmkSadInvFjGkhVnm2R2Wr8trU/GLhjAK0S0u8Qv9bkXspNhgpECk+CTQ/ew==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6788,10 +6841,6 @@ packages: '@shikijs/core@3.23.0': resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} - '@shikijs/core@4.0.2': - resolution: {integrity: sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==} - engines: {node: '>=20'} - '@shikijs/core@4.1.0': resolution: {integrity: sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ==} engines: {node: '>=20'} @@ -6842,10 +6891,6 @@ packages: resolution: {integrity: sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==} engines: {node: '>=20'} - '@shikijs/primitive@4.0.2': - resolution: {integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==} - engines: {node: '>=20'} - '@shikijs/primitive@4.1.0': resolution: {integrity: sha512-zx2/2Uwj2q9X3KSyYREEhXO23xBw5WUhP4orK2lE4r+t9JGITmEe0JH+wPmJhqHpOT2bRRs6lAL945+LDvOAGw==} engines: {node: '>=20'} @@ -6886,10 +6931,6 @@ packages: resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} engines: {node: '>=20'} - '@shikijs/transformers@4.0.2': - resolution: {integrity: sha512-1+L0gf9v+SdDXs08vjaLb3mBFa8U7u37cwcBQIv/HCocLwX69Tt6LpUCjtB+UUTvQxI7BnjZKhN/wMjhHBcJGg==} - engines: {node: '>=20'} - '@shikijs/transformers@4.3.1': resolution: {integrity: sha512-z6ir0bGDgWcF2FduktEfPgIsdOtIlDiLAjFBgBzE42Q9xHbkkIXZtORHzlLVB71iZP9elEcqKg6keajvOUwE2A==} engines: {node: '>=20'} @@ -6900,10 +6941,6 @@ packages: '@shikijs/types@3.23.0': resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} - '@shikijs/types@4.0.2': - resolution: {integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==} - engines: {node: '>=20'} - '@shikijs/types@4.1.0': resolution: {integrity: sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==} engines: {node: '>=20'} @@ -7809,9 +7846,6 @@ packages: resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} - '@tanstack/virtual-core@3.14.0': - resolution: {integrity: sha512-JLANqGy/D6k4Ujmh8Tr25lGimuOXNiaVyXaCAZS0W+1390sADdGnyUdSWNIfd49gebtIxGMij4IktRVzrdr12Q==} - '@tanstack/virtual-core@3.17.4': resolution: {integrity: sha512-nGm5KteqxasUdThLc2izl6dHUqLv0LQj7Nuyo5gYalTPf/U8a9ermvsl7reT+6ioBW1l8WfpP/mcU338nLXpqw==} @@ -7826,11 +7860,6 @@ packages: peerDependencies: vue: '>=3.2' - '@tanstack/vue-virtual@3.13.24': - resolution: {integrity: sha512-A0k2qF0zFSUStXSZkGXABouXr2Tw2Ztl/cVIYG9qy84uR8W7UNjAcX3DvzBS3YnDcwvLxab8v7dbmYBZ39itDA==} - peerDependencies: - vue: ^2.7.0 || ^3.0.0 - '@tanstack/vue-virtual@3.13.32': resolution: {integrity: sha512-E8OCutx7QnwZdvpJijz0Q2PHsYDWBWjnGr3TvgWiqxTU35jB1kVhtkd93scRV7tTFuId2tg3x2iFiw+IE4evjQ==} peerDependencies: @@ -8918,36 +8947,24 @@ packages: '@vue/compiler-core@3.5.33': resolution: {integrity: sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==} - '@vue/compiler-core@3.5.39': - resolution: {integrity: sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==} - '@vue/compiler-core@3.5.40': resolution: {integrity: sha512-39E8IgOhTbVDnoJFMKc2DvYnypcZwUqgUhQkccva/0m6FUwtIKSGV7n1hpVmYcFaoRAwf9pBcwnKlCEsN63ZEQ==} '@vue/compiler-dom@3.5.33': resolution: {integrity: sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==} - '@vue/compiler-dom@3.5.39': - resolution: {integrity: sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==} - '@vue/compiler-dom@3.5.40': resolution: {integrity: sha512-pwkx4vqlqOspFstrcmzwkKLePVMD3PT65imRzLhanU2V1Fj4K13g6OXjanOyzw3aTAuRk84BOmY8f3rEHqPaVA==} '@vue/compiler-sfc@3.5.33': resolution: {integrity: sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==} - '@vue/compiler-sfc@3.5.39': - resolution: {integrity: sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==} - '@vue/compiler-sfc@3.5.40': resolution: {integrity: sha512-gIf497P4kpuALcvs5n3AEg1Vdn0pSY4XbjASIfHNYF1/MP3T2Mf2STERTubysBxCRxzJGJYtF/O7vwJrxFB3Vw==} '@vue/compiler-ssr@3.5.33': resolution: {integrity: sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==} - '@vue/compiler-ssr@3.5.39': - resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==} - '@vue/compiler-ssr@3.5.40': resolution: {integrity: sha512-rrE5xiXG663+vHCHa3J9p2z5OcBRjXmoqenprJxAFQxg5pSshzeBiCE6pu46axapRJ2Adk0YDA2BRZVjiHXnhg==} @@ -9274,18 +9291,6 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@6.0.174: - resolution: {integrity: sha512-bTrfLUWHWtkjzWyCY4bmyuk4Qvmj4S4NSNsXyNSVVqkmftQNtxRj7dzUoMeQDBBwlJO6fC7m2Q/lNOPqQQfAGA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - - ai@6.0.209: - resolution: {integrity: sha512-NE7uErmxOe+i77BPT1+AhW4wr7xzilbQLsKVmvGEyil5AjaF6C/m92hlPI4Xwtnv5n77D/29bizwcR27/S/gSQ==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - ai@6.0.228: resolution: {integrity: sha512-3TXPF+meV/B0ObVWqLZDfTo0UjT9eKQX+QO5B8n7TSyLxnU3U9FHKxRp7U9mGuTVh7fdo2OtU0J8uGFR4EStsg==} engines: {node: '>=18'} @@ -12386,10 +12391,6 @@ packages: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true - js-yaml@4.3.0: resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} hasBin: true @@ -13579,15 +13580,9 @@ packages: zod: optional: true - nuxt-site-config-kit@4.0.8: - resolution: {integrity: sha512-7g3giKXt0M2vssCUg8XFfR6+u4U0zywQ8p8i4msy4p+9etteFNrkrCmVHZ83xiWGFbnoTgiaymPjbaQH3KZqAg==} - nuxt-site-config-kit@4.1.1: resolution: {integrity: sha512-xa341q3+RbpfNNKTwQ2Nsn980WZqF3zZPIR4PlF0xsm2M8Qfxtuaa1I7wMq6/fg/E2J9IyUm0DQ+B4mnKtMs4Q==} - nuxt-site-config@4.0.8: - resolution: {integrity: sha512-H7wHoOJ5Z6ZnTqD5vUugaKkWZbejZ9kGmzpr2dheOaC6RdT8JafCfMrmJG7W+cyJiJJ3YmzL+bzPBW2bW6MExA==} - nuxt-site-config@4.1.1: resolution: {integrity: sha512-hYf7YtYng5fsuxeAH5hE11sC/Q18pPa8MOULYS2GKb9KjIMiK+d57mDIU/8i4AabVyxrYKJkNuqIg/c4dWrYAw==} @@ -13620,20 +13615,6 @@ packages: '@types/node': optional: true - nuxtseo-shared@5.1.3: - resolution: {integrity: sha512-euCaYANxdjeLzJcxvEczKpLuikxPy/LUT/v69orStKlG2U4pvWaqDv74QO8YMCCmUbAO+8BoRj/SJccu9GcJGQ==} - peerDependencies: - '@nuxt/schema': ^3.16.0 || ^4.0.0 - nuxt: ^3.16.0 || ^4.0.0 - nuxt-site-config: ^3.2.0 || ^4.0.0 - vue: ^3.5.0 - zod: ^3.23.0 || ^4.0.0 - peerDependenciesMeta: - nuxt-site-config: - optional: true - zod: - optional: true - nuxtseo-shared@5.3.2: resolution: {integrity: sha512-0A+oVQJUvcNKFqB/lzhG5+YhthZmrpzRv2os0LRsPbGNXwj1w3qUbmd0d7SRIP80cto1lKhZfSNZ/HxoCsbI4A==} peerDependencies: @@ -13785,6 +13766,10 @@ packages: resolution: {integrity: sha512-h6QFWd6lBMfjESqgQ27GjzrSDb0qbznp7VDQqp2zvgsrWut4vcchyMIzOVXvGQ2GMZgKw9RWrFNWv9WqGL0p7Q==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.82.3: + resolution: {integrity: sha512-mJGrcrzaPYfCJwXsqPRJ8yeS3/Brn0qpt8jq7tPg3B7n3VSvKuKYhXhC0gBFQ+aIa9TdttdR/NWGh48lvUodjg==} + engines: {node: '>=20.0.0'} + oxc-transform@0.128.0: resolution: {integrity: sha512-8DfEHlmUiLOHlCK9DGX+d5tORc1xwPPvoRSHSJCYgLHyGjKp4PvfBrvgi59DkEW0SMOWfO8GL9t+R7vdKtupbg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -14808,9 +14793,6 @@ packages: remark-math@6.0.0: resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} - remark-mdc@3.10.0: - resolution: {integrity: sha512-gJhrSs4bGyqr7eSuLoaLlpmiDZrJ9fP/8gTA/w1CnKnW/mfxc9VKM+ndzpOxHQnpAU4tjD8QqF6SMLiOvIVTYA==} - remark-mdc@3.11.1: resolution: {integrity: sha512-bjH7Q1OO1BSXVPmUxYIrGH2dUAZkizNY3i9WJUEcIFLowZAEjLTT7fUAH2vH0Tpkeh+/MrzwFFmeWcZ66QLh7A==} @@ -15029,8 +15011,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - satori@0.28.0: - resolution: {integrity: sha512-FhOx2irXIrxbNpPyE0x/+k3p8G+FVWfaTPAKuwMaB4kk02PehHFumYyJ4NtiLNC7moNAspeDt06S+DqUjJ9Fsg==} + satori@0.19.3: + resolution: {integrity: sha512-dKr8TNYSyceWqBoTHWntjy25xaiWMw5GF+f8QOqFsov9OpTswLs7xdbvZudGRp9jkzbhv/4mVjVZYFtpruGKiA==} engines: {node: '>=16'} sax@1.6.0: @@ -15243,11 +15225,6 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - site-config-stack@4.0.8: - resolution: {integrity: sha512-Su+57p7CGqd3QSMmaDV+qU9EqWmgAT3SGX4Wurb5VsEBMFC3oXvai8BlrXVUnH1ay9hA1WOn0g0i6+y/RJX5Yw==} - peerDependencies: - vue: ^3.5.30 - site-config-stack@4.1.1: resolution: {integrity: sha512-sJoqaL3ihMkAGgOXBfg28zL55qZdzgNj0BQBQf3QSw2ilCYSGRNYWgg6kucxmmcyFtRC89WlOXAqG0OR422Xng==} peerDependencies: @@ -16921,24 +16898,6 @@ packages: pinia: optional: true - vue-router@5.1.0: - resolution: {integrity: sha512-HAbiLzLEHQwxPgvsbOJDAwtavszEgLwri6XfyrsPECIFez8+59xc9LofWVdc/HEaSRT822lJ8H9Ns38VVond5g==} - peerDependencies: - '@pinia/colada': '>=0.21.2' - '@vue/compiler-sfc': ^3.5.34 - pinia: ^3.0.4 - vite: ^7.0.0 || ^8.0.0 - vue: ^3.5.34 - peerDependenciesMeta: - '@pinia/colada': - optional: true - '@vue/compiler-sfc': - optional: true - pinia: - optional: true - vite: - optional: true - vue-router@5.2.0: resolution: {integrity: sha512-QAC5i0LEb1GLG0LXDQmHu8L7FX12j0KwU/JTKmLQUJMrn04gQdKP6Du+p0QwpHb3iy71vBlqnHQ8WAfOSAWhqw==} peerDependencies: @@ -17316,20 +17275,6 @@ snapshots: '@phc/format': 1.0.0 '@poppinss/utils': 6.10.1 - '@ai-sdk/gateway@3.0.109(zod@4.4.3)': - dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@4.4.3) - '@vercel/oidc': 3.2.0 - zod: 4.4.3 - - '@ai-sdk/gateway@3.0.134(zod@4.4.3)': - dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.30(zod@4.4.3) - '@vercel/oidc': 3.2.0 - zod: 4.4.3 - '@ai-sdk/gateway@3.0.151(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.14 @@ -17366,20 +17311,6 @@ snapshots: pkce-challenge: 5.0.1 zod: 4.4.3 - '@ai-sdk/provider-utils@4.0.26(zod@4.4.3)': - dependencies: - '@ai-sdk/provider': 3.0.10 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.8 - zod: 4.4.3 - - '@ai-sdk/provider-utils@4.0.30(zod@4.4.3)': - dependencies: - '@ai-sdk/provider': 3.0.10 - '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.8 - zod: 4.4.3 - '@ai-sdk/provider-utils@4.0.39(zod@4.4.3)': dependencies: '@ai-sdk/provider': 3.0.14 @@ -17412,10 +17343,6 @@ snapshots: eventsource-parser: 3.0.8 zod: 4.4.3 - '@ai-sdk/provider@3.0.10': - dependencies: - json-schema: 0.4.0 - '@ai-sdk/provider@3.0.14': dependencies: json-schema: 0.4.0 @@ -17428,15 +17355,6 @@ snapshots: dependencies: json-schema: 0.4.0 - '@ai-sdk/vue@3.0.174(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)': - dependencies: - '@ai-sdk/provider-utils': 4.0.26(zod@4.4.3) - ai: 6.0.174(zod@4.4.3) - swrv: 1.2.0(vue@3.5.40(typescript@6.0.3)) - vue: 3.5.40(typescript@6.0.3) - transitivePeerDependencies: - - zod - '@ai-sdk/vue@3.0.228(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)': dependencies: '@ai-sdk/provider-utils': 4.0.39(zod@4.4.3) @@ -18050,7 +17968,7 @@ snapshots: '@changesets/parse@0.4.3': dependencies: '@changesets/types': 6.1.0 - js-yaml: 4.1.1 + js-yaml: 4.3.0 '@changesets/pre@2.0.2': dependencies: @@ -18213,12 +18131,12 @@ snapshots: enabled: 2.0.0 kuler: 2.0.0 - '@databuddy/nuxt@2.4.20(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(react@19.2.6)(vue@3.5.40(typescript@6.0.3))': + '@databuddy/nuxt@2.4.20(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(react@19.2.6)(vue@3.5.40(typescript@6.0.3))': dependencies: '@databuddy/sdk': 2.4.20(react@19.2.6)(vue@3.5.40(typescript@6.0.3)) '@nuxt/kit': 4.4.6(magicast@0.5.3) '@nuxt/schema': 4.4.6 - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + nuxt: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) optionalDependencies: vue: 3.5.40(typescript@6.0.3) transitivePeerDependencies: @@ -18314,11 +18232,11 @@ snapshots: - vite - webpack - '@devframes/hub@0.5.4(devframe@0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@devframes/hub@0.5.4(devframe@0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: birpc: 4.0.0 - devframe: 0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - nostics: 0.2.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + devframe: 0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + nostics: 0.2.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) pathe: 2.0.3 perfect-debounce: 2.1.0 tinyexec: 1.2.4 @@ -18335,18 +18253,6 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} - '@dxup/nuxt@0.4.1(magicast@0.5.3)(typescript@5.9.3)': - dependencies: - '@dxup/unimport': 0.1.2 - '@nuxt/kit': 4.4.8(magicast@0.5.3) - chokidar: 5.0.0 - pathe: 2.0.3 - tinyglobby: 0.2.17 - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - magicast - '@dxup/nuxt@0.4.1(magicast@0.5.3)(typescript@6.0.3)': dependencies: '@dxup/unimport': 0.1.2 @@ -18359,11 +18265,11 @@ snapshots: transitivePeerDependencies: - magicast - '@dxup/nuxt@0.5.3(esbuild@0.28.0)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@dxup/nuxt@0.5.3(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: '@dxup/unimport': 0.1.2 - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@vue/compiler-dom': 3.5.39 + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@vue/compiler-dom': 3.5.40 chokidar: 5.0.0 knitwork: 1.3.0 magic-string: 0.30.21 @@ -18376,6 +18282,7 @@ snapshots: - bun-types-no-globals - esbuild - magicast + - oxc-parser - rolldown - rollup - unloader @@ -18383,11 +18290,11 @@ snapshots: - webpack optional: true - '@dxup/nuxt@0.5.3(esbuild@0.28.0)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@dxup/nuxt@0.5.3(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: '@dxup/unimport': 0.1.2 - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@vue/compiler-dom': 3.5.39 + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@vue/compiler-dom': 3.5.40 chokidar: 5.0.0 knitwork: 1.3.0 magic-string: 0.30.21 @@ -18400,6 +18307,7 @@ snapshots: - bun-types-no-globals - esbuild - magicast + - oxc-parser - rolldown - rollup - unloader @@ -18985,19 +18893,10 @@ snapshots: '@fingerprintjs/botd@2.0.0': {} - '@floating-ui/core@1.7.5': - dependencies: - '@floating-ui/utils': 0.2.11 - '@floating-ui/core@1.8.0': dependencies: '@floating-ui/utils': 0.2.12 - '@floating-ui/dom@1.7.6': - dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 - '@floating-ui/dom@1.8.0': dependencies: '@floating-ui/core': 1.8.0 @@ -19005,18 +18904,16 @@ snapshots: '@floating-ui/react-dom@2.1.8(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.8.0 react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - '@floating-ui/utils@0.2.11': {} - '@floating-ui/utils@0.2.12': {} '@floating-ui/vue@1.1.11(vue@3.5.40(typescript@6.0.3))': dependencies: - '@floating-ui/dom': 1.7.6 - '@floating-ui/utils': 0.2.11 + '@floating-ui/dom': 1.8.0 + '@floating-ui/utils': 0.2.12 vue-demi: 0.14.10(vue@3.5.40(typescript@6.0.3)) transitivePeerDependencies: - '@vue/composition-api' @@ -19074,10 +18971,6 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify-json/lucide@1.2.105': - dependencies: - '@iconify/types': 2.0.0 - '@iconify-json/lucide@1.2.117': dependencies: '@iconify/types': 2.0.0 @@ -19461,12 +19354,12 @@ snapshots: '@intlify/shared@11.4.0': {} - '@intlify/unplugin-vue-i18n@11.1.2(@vue/compiler-dom@3.5.39)(eslint@9.39.5(jiti@2.7.0))(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3))': + '@intlify/unplugin-vue-i18n@11.1.2(@vue/compiler-dom@3.5.40)(eslint@9.39.5(jiti@2.7.0))(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.7.0)) '@intlify/bundle-utils': 11.1.2(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3))) '@intlify/shared': 11.4.0 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.4.0)(@vue/compiler-dom@3.5.39)(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.4.0)(@vue/compiler-dom@3.5.40)(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) '@rollup/pluginutils': 5.3.0(rollup@4.60.2) '@typescript-eslint/scope-manager': 8.59.1 '@typescript-eslint/typescript-estree': 8.59.1(typescript@6.0.3) @@ -19490,12 +19383,12 @@ snapshots: '@intlify/utils@0.14.1': {} - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.4.0)(@vue/compiler-dom@3.5.39)(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.4.0)(@vue/compiler-dom@3.5.40)(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3))': dependencies: '@babel/parser': 7.29.7 optionalDependencies: '@intlify/shared': 11.4.0 - '@vue/compiler-dom': 3.5.39 + '@vue/compiler-dom': 3.5.40 vue: 3.5.40(typescript@6.0.3) vue-i18n: 11.4.0(vue@3.5.40(typescript@6.0.3)) @@ -20014,10 +19907,10 @@ snapshots: - magicast - supports-color - '@nuxt/content@3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@nuxt/content@3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@nuxtjs/mdc': 0.22.1(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxtjs/mdc': 0.22.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@shikijs/langs': 4.3.1 '@sqlite.org/sqlite-wasm': 3.50.4-build1 '@standard-schema/spec': 1.1.0 @@ -20044,7 +19937,7 @@ snapshots: micromatch: 4.0.8 minimark: 0.2.0 minimatch: 10.2.5 - nuxt-component-meta: 0.17.2(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + nuxt-component-meta: 0.17.2(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 @@ -20089,10 +19982,10 @@ snapshots: - vite - webpack - '@nuxt/content@3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@nuxt/content@3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@nuxt/kit': 4.5.0(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@nuxtjs/mdc': 0.22.1(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxtjs/mdc': 0.22.1(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@shikijs/langs': 4.3.1 '@sqlite.org/sqlite-wasm': 3.50.4-build1 '@standard-schema/spec': 1.1.0 @@ -20119,7 +20012,7 @@ snapshots: micromatch: 4.0.8 minimark: 0.2.0 minimatch: 10.2.5 - nuxt-component-meta: 0.17.2(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + nuxt-component-meta: 0.17.2(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 @@ -20164,10 +20057,10 @@ snapshots: - vite - webpack - '@nuxt/content@3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@nuxt/content@3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@nuxt/kit': 4.5.0(magicast@0.5.3)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@nuxtjs/mdc': 0.22.1(magicast@0.5.3)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxtjs/mdc': 0.22.1(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@shikijs/langs': 4.3.1 '@sqlite.org/sqlite-wasm': 3.50.4-build1 '@standard-schema/spec': 1.1.0 @@ -20194,7 +20087,7 @@ snapshots: micromatch: 4.0.8 minimark: 0.2.0 minimatch: 10.2.5 - nuxt-component-meta: 0.17.2(magicast@0.5.3)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + nuxt-component-meta: 0.17.2(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 @@ -20275,13 +20168,41 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@4.0.0-alpha.3(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@nuxt/devtools-kit@4.0.0-alpha.3(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + tinyexec: 1.2.4 + vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + transitivePeerDependencies: + - magic-string + - magicast + - oxc-parser + - rolldown + - unplugin + + '@nuxt/devtools-kit@4.0.0-alpha.3(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + dependencies: + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + tinyexec: 1.2.4 + vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + transitivePeerDependencies: + - magic-string + - magicast + - oxc-parser + - rolldown + - unplugin + + '@nuxt/devtools-kit@4.0.0-alpha.3(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + dependencies: + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) tinyexec: 1.2.4 vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: + - magic-string - magicast + - oxc-parser + - rolldown + - unplugin '@nuxt/devtools-wizard@3.2.4': dependencies: @@ -20336,12 +20257,12 @@ snapshots: - vue optional: true - '@nuxt/devtools@3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3))': + '@nuxt/devtools@3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3))': dependencies: '@nuxt/devtools-kit': 3.2.4(magicast@0.5.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/devtools-wizard': 3.2.4 '@nuxt/kit': 4.4.4(magicast@0.5.2) - '@vue/devtools-core': 8.1.1(vue@3.5.33(typescript@5.9.3)) + '@vue/devtools-core': 8.1.1(vue@3.5.33(typescript@6.0.3)) '@vue/devtools-kit': 8.1.1 birpc: 4.0.0 consola: 3.4.2 @@ -20368,7 +20289,7 @@ snapshots: tinyglobby: 0.2.17 vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.4(magicast@0.5.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - vite-plugin-vue-tracer: 1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)) + vite-plugin-vue-tracer: 1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) which: 6.0.1 ws: 8.20.0 transitivePeerDependencies: @@ -20377,12 +20298,12 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3))': + '@nuxt/devtools@3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': dependencies: '@nuxt/devtools-kit': 3.2.4(magicast@0.5.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/devtools-wizard': 3.2.4 '@nuxt/kit': 4.4.4(magicast@0.5.2) - '@vue/devtools-core': 8.1.1(vue@3.5.33(typescript@6.0.3)) + '@vue/devtools-core': 8.1.1(vue@3.5.40(typescript@5.9.3)) '@vue/devtools-kit': 8.1.1 birpc: 4.0.0 consola: 3.4.2 @@ -20408,8 +20329,8 @@ snapshots: structured-clone-es: 2.0.0 tinyglobby: 0.2.17 vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.4(magicast@0.5.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - vite-plugin-vue-tracer: 1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) + vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.4(magicast@0.5.2))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + vite-plugin-vue-tracer: 1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) which: 6.0.1 ws: 8.20.0 transitivePeerDependencies: @@ -20508,14 +20429,14 @@ snapshots: - uploadthing - vite - '@nuxt/icon@2.3.1(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))': + '@nuxt/icon@2.3.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))': dependencies: '@iconify/collections': 1.0.709 '@iconify/types': 2.0.0 '@iconify/utils': 3.1.4 '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) consola: 3.4.2 local-pkg: 1.2.1 mlly: 1.8.2 @@ -20525,13 +20446,42 @@ snapshots: tinyglobby: 0.2.17 ufo: 1.6.4 transitivePeerDependencies: + - magic-string - magicast + - oxc-parser + - rolldown + - unplugin - vite - vue - '@nuxt/image@2.0.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(srvx@0.11.22)': + '@nuxt/icon@2.3.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))': dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@iconify/collections': 1.0.709 + '@iconify/types': 2.0.0 + '@iconify/utils': 3.1.4 + '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) + '@nuxt/devtools-kit': 3.2.4(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + consola: 3.4.2 + local-pkg: 1.2.1 + mlly: 1.8.2 + ohash: 2.0.11 + picomatch: 4.0.5 + std-env: 4.2.0 + tinyglobby: 0.2.17 + ufo: 1.6.4 + transitivePeerDependencies: + - magic-string + - magicast + - oxc-parser + - rolldown + - unplugin + - vite + - vue + + '@nuxt/image@2.0.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + dependencies: + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) consola: 3.4.2 defu: 6.1.7 h3: 1.15.11 @@ -20562,8 +20512,12 @@ snapshots: - db0 - idb-keyval - ioredis + - magic-string - magicast + - oxc-parser + - rolldown - srvx + - unplugin - uploadthing '@nuxt/kit@3.21.4(magicast@0.5.3)': @@ -20717,7 +20671,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + '@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 @@ -20738,7 +20692,7 @@ snapshots: semver: 7.8.5 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@0.30.21)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) untyped: 2.0.0 transitivePeerDependencies: - magic-string @@ -20746,9 +20700,8 @@ snapshots: - oxc-parser - rolldown - unplugin - optional: true - '@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + '@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 @@ -20769,7 +20722,7 @@ snapshots: semver: 7.8.5 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@0.30.21)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) untyped: 2.0.0 transitivePeerDependencies: - magic-string @@ -20778,7 +20731,7 @@ snapshots: - rolldown - unplugin - '@nuxt/kit@4.5.0(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)': + '@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 @@ -20799,7 +20752,7 @@ snapshots: semver: 7.8.5 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(oxc-parser@0.128.0)(rolldown@1.2.0) + unctx: 3.0.0(magic-string@0.30.21)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) untyped: 2.0.0 transitivePeerDependencies: - magic-string @@ -20807,8 +20760,9 @@ snapshots: - oxc-parser - rolldown - unplugin + optional: true - '@nuxt/kit@4.5.0(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + '@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 @@ -20829,7 +20783,7 @@ snapshots: semver: 7.8.5 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@0.30.21)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) untyped: 2.0.0 transitivePeerDependencies: - magic-string @@ -20838,7 +20792,7 @@ snapshots: - rolldown - unplugin - '@nuxt/kit@4.5.0(magicast@0.5.3)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + '@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: c12: 3.3.4(magicast@0.5.3) consola: 3.4.2 @@ -20859,7 +20813,7 @@ snapshots: semver: 7.8.5 tinyglobby: 0.2.17 ufo: 1.6.4 - unctx: 3.0.0(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) untyped: 2.0.0 transitivePeerDependencies: - magic-string @@ -20869,6 +20823,36 @@ snapshots: - unplugin optional: true + '@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + dependencies: + c12: 3.3.4(magicast@0.5.3) + consola: 3.4.2 + defu: 6.1.7 + destr: 2.0.5 + errx: 0.1.0 + exsolve: 1.1.0 + ignore: 7.0.6 + jiti: 2.7.0 + klona: 2.0.6 + mlly: 1.8.2 + nostics: 1.2.0 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.3.1 + rc9: 3.0.1 + scule: 1.3.0 + semver: 7.8.5 + tinyglobby: 0.2.17 + ufo: 1.6.4 + unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + untyped: 2.0.0 + transitivePeerDependencies: + - magic-string + - magicast + - oxc-parser + - rolldown + - unplugin + '@nuxt/module-builder@1.0.2(@nuxt/cli@3.37.0(@nuxt/schema@4.5.0)(cac@6.7.14)(commander@14.0.3)(magicast@0.5.3))(@vue/compiler-core@3.5.40)(esbuild@0.28.0)(typescript@6.0.3)(vue-tsc@3.2.7(typescript@6.0.3))(vue@3.5.40(typescript@6.0.3))': dependencies: '@nuxt/cli': 3.37.0(@nuxt/schema@4.5.0)(cac@6.7.14)(commander@14.0.3)(magicast@0.5.3) @@ -20892,92 +20876,6 @@ snapshots: - vue - vue-tsc - '@nuxt/nitro-server@4.4.4(0b7d41c34615ca00c005d85c374e1c2e)': - dependencies: - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@nuxt/devalue': 2.0.2 - '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)) - '@vue/shared': 3.5.39 - consola: 3.4.2 - defu: 6.1.7 - destr: 2.0.5 - devalue: 5.8.1 - errx: 0.1.0 - escape-string-regexp: 5.0.0 - exsolve: 1.1.0 - h3: 1.15.11 - impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - klona: 2.0.6 - mocked-exports: 0.1.1 - nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - nuxt: 4.4.4(d331503cc652b8b0dc91dfdee719201c) - nypm: 0.6.8 - ohash: 2.0.11 - pathe: 2.0.3 - rou3: 0.8.1 - std-env: 4.2.0 - ufo: 1.6.4 - unctx: 2.5.0 - unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1) - vue: 3.5.33(typescript@5.9.3) - vue-bundle-renderer: 2.2.0 - vue-devtools-stub: 0.1.0 - optionalDependencies: - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@babel/core' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@farmfe/core' - - '@libsql/client' - - '@modelcontextprotocol/sdk' - - '@netlify/blobs' - - '@planetscale/database' - - '@rspack/core' - - '@unhead/cli' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bare-abort-controller - - bare-buffer - - better-sqlite3 - - bufferutil - - bun-types-no-globals - - crossws - - db0 - - drizzle-orm - - encoding - - esbuild - - idb-keyval - - ioredis - - lightningcss - - magicast - - mysql2 - - oxc-parser - - react-native-b4a - - rolldown - - rollup - - sqlite3 - - srvx - - supports-color - - typescript - - unloader - - uploadthing - - utf-8-validate - - vite - - webpack - - xml2js - '@nuxt/nitro-server@4.4.4(0c1ec4a00f672ce52179279500a0e18f)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) @@ -21150,98 +21048,12 @@ snapshots: - webpack - xml2js - '@nuxt/nitro-server@4.4.4(3b7cba74bae154e6382e375c13212373)': - dependencies: - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@nuxt/devalue': 2.0.2 - '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) - '@vue/shared': 3.5.39 - consola: 3.4.2 - defu: 6.1.7 - destr: 2.0.5 - devalue: 5.8.1 - errx: 0.1.0 - escape-string-regexp: 5.0.0 - exsolve: 1.1.0 - h3: 1.15.11 - impound: 1.1.5(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - klona: 2.0.6 - mocked-exports: 0.1.1 - nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.128.0)(rolldown@1.1.5)(srvx@0.11.15)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - nuxt: 4.4.4(3a628c60eb3c5faf2e1974943d1ba369) - nypm: 0.6.8 - ohash: 2.0.11 - pathe: 2.0.3 - rou3: 0.8.1 - std-env: 4.2.0 - ufo: 1.6.4 - unctx: 2.5.0 - unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1) - vue: 3.5.33(typescript@6.0.3) - vue-bundle-renderer: 2.2.0 - vue-devtools-stub: 0.1.0 - optionalDependencies: - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@babel/core' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@farmfe/core' - - '@libsql/client' - - '@modelcontextprotocol/sdk' - - '@netlify/blobs' - - '@planetscale/database' - - '@rspack/core' - - '@unhead/cli' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - bare-abort-controller - - bare-buffer - - better-sqlite3 - - bufferutil - - bun-types-no-globals - - crossws - - db0 - - drizzle-orm - - encoding - - esbuild - - idb-keyval - - ioredis - - lightningcss - - magicast - - mysql2 - - oxc-parser - - react-native-b4a - - rolldown - - rollup - - sqlite3 - - srvx - - supports-color - - typescript - - unloader - - uploadthing - - utf-8-validate - - vite - - webpack - - xml2js - - '@nuxt/nitro-server@4.4.4(56077375bb4c1cd3722387df026bbff6)': + '@nuxt/nitro-server@4.4.4(eccf4b57a53062a178be2b5263dbe4e5)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) '@vue/shared': 3.5.39 consola: 3.4.2 defu: 6.1.7 @@ -21254,8 +21066,8 @@ snapshots: impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.15)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + nuxt: 4.4.4(798471e5840d715482aeb7b47cc070f1) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 @@ -21327,7 +21139,7 @@ snapshots: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@vue/shared': 3.5.39 + '@vue/shared': 3.5.40 consola: 3.4.2 defu: 6.1.7 destr: 2.0.5 @@ -21410,12 +21222,12 @@ snapshots: - webpack - xml2js - '@nuxt/nitro-server@4.5.0(9b15569c862cffbeaea5a83374e901a1)': + '@nuxt/nitro-server@4.5.0(54440eaafe1040d72649c71d25711e2f)': dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) - '@vue/shared': 3.5.39 + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@vue/shared': 3.5.40 consola: 3.4.2 defu: 6.1.7 destr: 2.0.5 @@ -21424,19 +21236,107 @@ snapshots: escape-string-regexp: 5.0.0 exsolve: 1.1.0 h3: 1.15.11 - impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) klona: 2.0.6 mocked-exports: 0.1.1 - nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.140.0)(rolldown@1.2.0)(srvx@0.11.22)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.140.0)(rolldown@1.2.0)(srvx@0.11.22)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) nostics: 1.2.0 - nuxt: 4.5.0(89ef07b0b9a25f097ff130a690b7b14c) + nuxt: 4.5.0(d0b081e3ea844aa3953445e0cdf8d794) nypm: 0.6.8 ohash: 2.0.11 pathe: 2.0.3 rou3: 0.9.1 std-env: 4.2.0 ufo: 1.6.4 - unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1) + vue: 3.5.40(typescript@5.9.3) + vue-bundle-renderer: 2.3.1 + vue-devtools-stub: 0.1.0 + optionalDependencies: + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.0) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@farmfe/core' + - '@libsql/client' + - '@modelcontextprotocol/sdk' + - '@netlify/blobs' + - '@planetscale/database' + - '@rspack/core' + - '@unhead/cli' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - bare-abort-controller + - bare-buffer + - better-sqlite3 + - bufferutil + - bun-types-no-globals + - crossws + - db0 + - drizzle-orm + - encoding + - esbuild + - idb-keyval + - ioredis + - lightningcss + - magic-string + - magicast + - mysql2 + - oxc-parser + - react-native-b4a + - rolldown + - rollup + - sqlite3 + - srvx + - supports-color + - typescript + - unloader + - unplugin + - uploadthing + - utf-8-validate + - vite + - webpack + - xml2js + + '@nuxt/nitro-server@4.5.0(9b15569c862cffbeaea5a83374e901a1)': + dependencies: + '@nuxt/devalue': 2.0.2 + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@vue/shared': 3.5.40 + consola: 3.4.2 + defu: 6.1.7 + destr: 2.0.5 + devalue: 5.8.1 + errx: 0.1.0 + escape-string-regexp: 5.0.0 + exsolve: 1.1.0 + h3: 1.15.11 + impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + klona: 2.0.6 + mocked-exports: 0.1.1 + nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.140.0)(rolldown@1.2.0)(srvx@0.11.22)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + nostics: 1.2.0 + nuxt: 4.5.0(89ef07b0b9a25f097ff130a690b7b14c) + nypm: 0.6.8 + ohash: 2.0.11 + pathe: 2.0.3 + rou3: 0.9.1 + std-env: 4.2.0 + ufo: 1.6.4 + unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1) vue: 3.5.40(typescript@5.9.3) vue-bundle-renderer: 2.3.1 @@ -21515,14 +21415,6 @@ snapshots: pkg-types: 2.3.1 std-env: 4.2.0 - '@nuxt/schema@4.4.8': - dependencies: - '@vue/shared': 3.5.39 - defu: 6.1.7 - pathe: 2.0.3 - pkg-types: 2.3.1 - std-env: 4.2.0 - '@nuxt/schema@4.5.0': dependencies: '@vue/shared': 3.5.40 @@ -21600,15 +21492,15 @@ snapshots: - typescript - vite - '@nuxt/ui@4.10.0(1aad4d54899ef5c334c82429a3d5e1c2)': + '@nuxt/ui@4.10.0(16ede3a4a3f5881e23838e9d4f8f988e)': dependencies: '@floating-ui/dom': 1.8.0 '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) '@nuxt/fonts': 0.14.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - '@nuxt/icon': 2.3.1(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/schema': 4.4.8 - '@nuxtjs/color-mode': 4.0.1(magicast@0.5.3) + '@nuxt/icon': 2.3.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/schema': 4.5.0 + '@nuxtjs/color-mode': 4.0.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.3.2 '@tailwindcss/vite': 4.3.2(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) @@ -21631,7 +21523,7 @@ snapshots: '@tiptap/starter-kit': 3.22.5 '@tiptap/suggestion': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) '@tiptap/vue-3': 3.22.5(@floating-ui/dom@1.8.0)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)(vue@3.5.40(typescript@6.0.3)) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@3.25.76))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) '@vueuse/core': 14.3.0(vue@3.5.40(typescript@6.0.3)) '@vueuse/integrations': 14.3.0(axios@1.16.0)(fuse.js@7.5.0)(vue@3.5.40(typescript@6.0.3)) '@vueuse/shared': 14.3.0(vue@3.5.40(typescript@6.0.3)) @@ -21662,17 +21554,18 @@ snapshots: typescript: 6.0.3 ufo: 1.6.4 unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.8(magicast@0.5.3))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))) - unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + unplugin-auto-import: 21.0.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))) + unplugin-vue-components: 32.1.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) vaul-vue: 0.4.1(reka-ui@2.10.1(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) vue-component-type-helpers: 3.3.7 optionalDependencies: '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 - '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - ai: 7.0.29(zod@3.25.76) + '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + ai: 7.0.29(zod@4.4.3) valibot: 1.4.2(typescript@6.0.3) - zod: 3.25.76 + vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + zod: 4.4.3 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -21712,6 +21605,7 @@ snapshots: - lightningcss - magicast - nprogress + - oxc-parser - qrcode - react - react-dom @@ -21726,15 +21620,15 @@ snapshots: - vue - webpack - '@nuxt/ui@4.10.0(1b446c4a581dc5097e46f48d13fb9d61)': + '@nuxt/ui@4.10.0(91360aae90a0729fe907655509b87ef2)': dependencies: '@floating-ui/dom': 1.8.0 '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) '@nuxt/fonts': 0.14.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - '@nuxt/icon': 2.3.1(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/schema': 4.4.8 - '@nuxtjs/color-mode': 4.0.1(magicast@0.5.3) + '@nuxt/icon': 2.3.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/schema': 4.5.0 + '@nuxtjs/color-mode': 4.0.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.3.2 '@tailwindcss/vite': 4.3.2(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) @@ -21757,7 +21651,7 @@ snapshots: '@tiptap/starter-kit': 3.22.5 '@tiptap/suggestion': 3.22.5(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5) '@tiptap/vue-3': 3.22.5(@floating-ui/dom@1.8.0)(@tiptap/core@3.22.5(@tiptap/pm@3.22.5))(@tiptap/pm@3.22.5)(vue@3.5.40(typescript@6.0.3)) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@3.25.76))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) '@vueuse/core': 14.3.0(vue@3.5.40(typescript@6.0.3)) '@vueuse/integrations': 14.3.0(axios@1.16.0)(fuse.js@7.5.0)(vue@3.5.40(typescript@6.0.3)) '@vueuse/shared': 14.3.0(vue@3.5.40(typescript@6.0.3)) @@ -21776,7 +21670,7 @@ snapshots: knitwork: 1.3.0 magic-string: 0.30.21 mlly: 1.8.2 - motion-v: 2.3.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) + motion-v: 2.3.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3)))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.40(typescript@6.0.3)) ohash: 2.0.11 pathe: 2.0.3 reka-ui: 2.10.1(vue@3.5.40(typescript@6.0.3)) @@ -21788,18 +21682,17 @@ snapshots: typescript: 6.0.3 ufo: 1.6.4 unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.8(magicast@0.5.3))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))) - unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + unplugin-auto-import: 21.0.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))) + unplugin-vue-components: 32.1.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) vaul-vue: 0.4.1(reka-ui@2.10.1(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) vue-component-type-helpers: 3.3.7 optionalDependencies: '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - ai: 7.0.29(zod@4.4.3) + ai: 7.0.29(zod@3.25.76) valibot: 1.4.2(typescript@6.0.3) - vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - zod: 4.4.3 + zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -21839,6 +21732,7 @@ snapshots: - lightningcss - magicast - nprogress + - oxc-parser - qrcode - react - react-dom @@ -21853,15 +21747,15 @@ snapshots: - vue - webpack - '@nuxt/ui@4.10.0(342679e81daec34fb4ebc5f1215784ba)': + '@nuxt/ui@4.10.0(9dd74825632101caae164786bfef9095)': dependencies: '@floating-ui/dom': 1.8.0 '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) '@nuxt/fonts': 0.14.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - '@nuxt/icon': 2.3.1(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/schema': 4.4.8 - '@nuxtjs/color-mode': 4.0.1(magicast@0.5.3) + '@nuxt/icon': 2.3.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/schema': 4.5.0 + '@nuxtjs/color-mode': 4.0.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.3.2 '@tailwindcss/vite': 4.3.2(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) @@ -21915,15 +21809,15 @@ snapshots: typescript: 6.0.3 ufo: 1.6.4 unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.8(magicast@0.5.3))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))) - unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + unplugin-auto-import: 21.0.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))) + unplugin-vue-components: 32.1.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) vaul-vue: 0.4.1(reka-ui@2.10.1(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) vue-component-type-helpers: 3.3.7 optionalDependencies: '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 - '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - ai: 6.0.209(zod@4.4.3) + '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + ai: 6.0.228(zod@4.4.3) valibot: 1.4.2(typescript@6.0.3) zod: 4.4.3 transitivePeerDependencies: @@ -21965,6 +21859,7 @@ snapshots: - lightningcss - magicast - nprogress + - oxc-parser - qrcode - react - react-dom @@ -21979,15 +21874,15 @@ snapshots: - vue - webpack - '@nuxt/ui@4.10.0(9544d347d5c55f21e8018f343dea7214)': + '@nuxt/ui@4.10.0(de89ca55adde23fab0252e9bd2d5a9c0)': dependencies: '@floating-ui/dom': 1.8.0 '@iconify/vue': 5.0.1(vue@3.5.40(typescript@6.0.3)) '@nuxt/fonts': 0.14.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - '@nuxt/icon': 2.3.1(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/schema': 4.4.8 - '@nuxtjs/color-mode': 4.0.1(magicast@0.5.3) + '@nuxt/icon': 2.3.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/schema': 4.5.0 + '@nuxtjs/color-mode': 4.0.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@standard-schema/spec': 1.1.0 '@tailwindcss/postcss': 4.3.2 '@tailwindcss/vite': 4.3.2(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) @@ -22041,14 +21936,14 @@ snapshots: typescript: 6.0.3 ufo: 1.6.4 unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.8(magicast@0.5.3))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))) - unplugin-vue-components: 32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + unplugin-auto-import: 21.0.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))) + unplugin-vue-components: 32.1.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) vaul-vue: 0.4.1(reka-ui@2.10.1(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) vue-component-type-helpers: 3.3.7 optionalDependencies: '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 - '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) ai: 7.0.29(zod@4.4.3) valibot: 1.4.2(typescript@6.0.3) vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) @@ -22092,6 +21987,7 @@ snapshots: - lightningcss - magicast - nprogress + - oxc-parser - qrcode - react - react-dom @@ -22168,7 +22064,7 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.4.4(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(eslint@9.39.5(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.4(3a628c60eb3c5faf2e1974943d1ba369))(optionator@0.9.4)(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(vue-tsc@3.3.7(typescript@6.0.3))(vue@3.5.33(typescript@6.0.3))(yaml@2.9.0)': + '@nuxt/vite-builder@4.4.4(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(eslint@9.39.5(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.4(798471e5840d715482aeb7b47cc070f1))(optionator@0.9.4)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(vue-tsc@3.3.7(typescript@6.0.3))(vue@3.5.33(typescript@6.0.3))(yaml@2.9.0)': dependencies: '@nuxt/kit': 4.4.4(magicast@0.5.3) '@rollup/plugin-replace': 6.0.3(rollup@4.60.2) @@ -22186,69 +22082,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.4(3a628c60eb3c5faf2e1974943d1ba369) - nypm: 0.6.8 - pathe: 2.0.3 - pkg-types: 2.3.1 - postcss: 8.5.19 - seroval: 1.5.2 - std-env: 4.2.0 - ufo: 1.6.4 - unenv: 2.0.0-rc.24 - vite: 7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vite-plugin-checker: 0.13.0(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3)) - vue: 3.5.33(typescript@6.0.3) - vue-bundle-renderer: 2.2.0 - optionalDependencies: - '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - rolldown: 1.1.5 - rollup-plugin-visualizer: 7.0.1(rolldown@1.1.5)(rollup@4.60.2) - transitivePeerDependencies: - - '@biomejs/biome' - - '@types/node' - - eslint - - less - - lightningcss - - magicast - - meow - - optionator - - oxlint - - rollup - - sass - - sass-embedded - - stylelint - - stylus - - sugarss - - supports-color - - terser - - tsx - - typescript - - vls - - vti - - vue-tsc - - yaml - - '@nuxt/vite-builder@4.4.4(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(eslint@9.39.5(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(optionator@0.9.4)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(vue-tsc@3.3.7(typescript@6.0.3))(vue@3.5.33(typescript@6.0.3))(yaml@2.9.0)': - dependencies: - '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@rollup/plugin-replace': 6.0.3(rollup@4.60.2) - '@vitejs/plugin-vue': 6.0.8(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) - autoprefixer: 10.5.0(postcss@8.5.19) - consola: 3.4.2 - cssnano: 7.1.8(postcss@8.5.19) - defu: 6.1.7 - escape-string-regexp: 5.0.0 - exsolve: 1.1.0 - get-port-please: 3.2.0 - jiti: 2.7.0 - knitwork: 1.3.0 - magic-string: 0.30.21 - mlly: 1.8.2 - mocked-exports: 0.1.1 - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + nuxt: 4.4.4(798471e5840d715482aeb7b47cc070f1) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 @@ -22354,38 +22188,38 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.4.4(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(eslint@9.39.5(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.4(d331503cc652b8b0dc91dfdee719201c))(optionator@0.9.4)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.2)(tsx@4.23.1)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3))(vue@3.5.33(typescript@5.9.3))(yaml@2.9.0)': + '@nuxt/vite-builder@4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.17)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(89ef07b0b9a25f097ff130a690b7b14c))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@5.9.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.3.7(typescript@5.9.3))(vue@3.5.40(typescript@5.9.3))(yaml@2.9.0)': dependencies: - '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@rollup/plugin-replace': 6.0.3(rollup@4.60.2) - '@vitejs/plugin-vue': 6.0.8(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)) - autoprefixer: 10.5.0(postcss@8.5.19) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@vitejs/plugin-vue': 6.0.8(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + autoprefixer: 10.5.4(postcss@8.5.19) consola: 3.4.2 - cssnano: 7.1.8(postcss@8.5.19) + cssnano: 8.0.2(postcss@8.5.19) defu: 6.1.7 escape-string-regexp: 5.0.0 exsolve: 1.1.0 get-port-please: 3.2.0 jiti: 2.7.0 + js-tokens: 10.0.0 knitwork: 1.3.0 - magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.4(d331503cc652b8b0dc91dfdee719201c) + nuxt: 4.5.0(89ef07b0b9a25f097ff130a690b7b14c) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 postcss: 8.5.19 - seroval: 1.5.2 + rolldown-string: 0.3.1(rolldown@1.2.0) + seroval: 1.5.5 std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 5.3.0(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vite-plugin-checker: 0.13.0(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.2.7(typescript@5.9.3)) - vue: 3.5.33(typescript@5.9.3) - vue-bundle-renderer: 2.2.0 + vite: 8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 6.0.0(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vite-plugin-checker: 0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@5.9.3)) + vue: 3.5.40(typescript@5.9.3) + vue-bundle-renderer: 2.3.1 optionalDependencies: '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -22394,14 +22228,16 @@ snapshots: transitivePeerDependencies: - '@biomejs/biome' - '@types/node' + - '@vitejs/devtools' + - esbuild - eslint - less - - lightningcss + - magic-string - magicast - meow - optionator + - oxc-parser - oxlint - - rollup - sass - sass-embedded - stylelint @@ -22411,16 +22247,16 @@ snapshots: - terser - tsx - typescript - - vls - - vti + - unplugin - vue-tsc - yaml + optional: true - '@nuxt/vite-builder@4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.17)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(89ef07b0b9a25f097ff130a690b7b14c))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@5.9.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.3.7(typescript@5.9.3))(vue@3.5.40(typescript@5.9.3))(yaml@2.9.0)': + '@nuxt/vite-builder@4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(4ad5267ef2a8e696f3cd111576c35145))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.2.7(typescript@6.0.3))(vue@3.5.40(typescript@6.0.3))(yaml@2.9.0)': dependencies: - '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@vitejs/plugin-vue': 6.0.8(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@vitejs/plugin-vue': 6.0.8(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) autoprefixer: 10.5.4(postcss@8.5.19) consola: 3.4.2 cssnano: 8.0.2(postcss@8.5.19) @@ -22433,7 +22269,7 @@ snapshots: knitwork: 1.3.0 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.5.0(89ef07b0b9a25f097ff130a690b7b14c) + nuxt: 4.5.0(4ad5267ef2a8e696f3cd111576c35145) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 @@ -22443,10 +22279,10 @@ snapshots: std-env: 4.2.0 ufo: 1.6.4 unenv: 2.0.0-rc.24 - vite: 8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vite-node: 6.0.0(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vite-plugin-checker: 0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@5.9.3)) - vue: 3.5.40(typescript@5.9.3) + vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vite-node: 6.0.0(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vite-plugin-checker: 0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.2.7(typescript@6.0.3)) + vue: 3.5.40(typescript@6.0.3) vue-bundle-renderer: 2.3.1 optionalDependencies: '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) @@ -22478,13 +22314,12 @@ snapshots: - unplugin - vue-tsc - yaml - optional: true - '@nuxt/vite-builder@4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(4ad5267ef2a8e696f3cd111576c35145))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.2.7(typescript@6.0.3))(vue@3.5.40(typescript@6.0.3))(yaml@2.9.0)': + '@nuxt/vite-builder@4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(d0b081e3ea844aa3953445e0cdf8d794))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@5.9.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.2.7(typescript@5.9.3))(vue@3.5.40(typescript@5.9.3))(yaml@2.9.0)': dependencies: '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@vitejs/plugin-vue': 6.0.8(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@vitejs/plugin-vue': 6.0.8(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@vitejs/plugin-vue-jsx': 5.1.6(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) autoprefixer: 10.5.4(postcss@8.5.19) consola: 3.4.2 cssnano: 8.0.2(postcss@8.5.19) @@ -22497,7 +22332,7 @@ snapshots: knitwork: 1.3.0 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.5.0(4ad5267ef2a8e696f3cd111576c35145) + nuxt: 4.5.0(d0b081e3ea844aa3953445e0cdf8d794) nypm: 0.6.8 pathe: 2.0.3 pkg-types: 2.3.1 @@ -22509,8 +22344,8 @@ snapshots: unenv: 2.0.0-rc.24 vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) vite-node: 6.0.0(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vite-plugin-checker: 0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.2.7(typescript@6.0.3)) - vue: 3.5.40(typescript@6.0.3) + vite-plugin-checker: 0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.2.7(typescript@5.9.3)) + vue: 3.5.40(typescript@5.9.3) vue-bundle-renderer: 2.3.1 optionalDependencies: '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) @@ -22665,27 +22500,45 @@ snapshots: - uploadthing - vue-tsc - '@nuxtjs/color-mode@4.0.1(magicast@0.5.3)': + '@nuxtjs/color-mode@4.0.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) exsolve: 1.1.0 pathe: 2.0.3 pkg-types: 2.3.1 semver: 7.8.5 transitivePeerDependencies: + - magic-string - magicast + - oxc-parser + - rolldown + - unplugin - '@nuxtjs/i18n@10.4.1(@vue/compiler-dom@3.5.39)(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(ioredis@5.10.1)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))': + '@nuxtjs/color-mode@4.0.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + dependencies: + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + exsolve: 1.1.0 + pathe: 2.0.3 + pkg-types: 2.3.1 + semver: 7.8.5 + transitivePeerDependencies: + - magic-string + - magicast + - oxc-parser + - rolldown + - unplugin + + '@nuxtjs/i18n@10.4.1(@vue/compiler-dom@3.5.40)(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(ioredis@5.10.1)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))': dependencies: '@intlify/core': 11.4.0 '@intlify/h3': 0.7.4 '@intlify/shared': 11.4.0 - '@intlify/unplugin-vue-i18n': 11.1.2(@vue/compiler-dom@3.5.39)(eslint@9.39.5(jiti@2.7.0))(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) + '@intlify/unplugin-vue-i18n': 11.1.2(@vue/compiler-dom@3.5.40)(eslint@9.39.5(jiti@2.7.0))(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-i18n@11.4.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)) '@intlify/utils': 0.14.1 '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.60.2) - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@rollup/plugin-yaml': 4.1.2(rollup@4.60.2) - '@vue/compiler-sfc': 3.5.33 + '@vue/compiler-sfc': 3.5.40 defu: 6.1.7 devalue: 5.8.1 h3: 1.15.11 @@ -22702,7 +22555,7 @@ snapshots: unrouting: 0.1.7 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1) vue-i18n: 11.4.0(vue@3.5.40(typescript@6.0.3)) - vue-router: 5.1.0(@vue/compiler-sfc@3.5.33)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -22742,7 +22595,7 @@ snapshots: - vue - webpack - '@nuxtjs/mcp-toolkit@0.18.0(@vue/compiler-sfc@3.5.33)(h3@1.15.11)(magicast@0.5.3)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)': + '@nuxtjs/mcp-toolkit@0.18.0(@vue/compiler-sfc@3.5.40)(h3@1.15.11)(magicast@0.5.3)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)': dependencies: '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) '@nuxt/kit': 4.4.8(magicast@0.5.3) @@ -22752,26 +22605,7 @@ snapshots: vite-plugin-singlefile: 2.3.3(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) zod: 4.4.3 optionalDependencies: - '@vue/compiler-sfc': 3.5.33 - vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vue: 3.5.40(typescript@6.0.3) - transitivePeerDependencies: - - '@cfworker/json-schema' - - magicast - - rollup - - supports-color - - '@nuxtjs/mcp-toolkit@0.18.0(@vue/compiler-sfc@3.5.39)(h3@1.15.11)(magicast@0.5.3)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)': - dependencies: - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@vitejs/plugin-vue': 6.0.8(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - h3: 1.15.11 - tinyglobby: 0.2.17 - vite-plugin-singlefile: 2.3.3(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - zod: 4.4.3 - optionalDependencies: - '@vue/compiler-sfc': 3.5.39 + '@vue/compiler-sfc': 3.5.40 vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.40(typescript@6.0.3) transitivePeerDependencies: @@ -22780,61 +22614,11 @@ snapshots: - rollup - supports-color - '@nuxtjs/mdc@0.21.1(magicast@0.5.3)': + '@nuxtjs/mdc@0.21.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@shikijs/core': 4.1.0 '@shikijs/engine-javascript': 4.1.0 - '@shikijs/langs': 4.1.0 - '@shikijs/themes': 4.1.0 - '@shikijs/transformers': 4.0.2 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@vue/compiler-core': 3.5.33 - consola: 3.4.2 - debug: 4.4.3 - defu: 6.1.7 - destr: 2.0.5 - detab: 3.0.2 - github-slugger: 2.0.0 - hast-util-format: 1.1.0 - hast-util-to-mdast: 10.1.2 - hast-util-to-string: 3.0.1 - mdast-util-to-hast: 13.2.1 - micromark-util-sanitize-uri: 2.0.1 - parse5: 8.0.1 - pathe: 2.0.3 - property-information: 7.1.0 - rehype-external-links: 3.0.0 - rehype-minify-whitespace: 6.0.2 - rehype-raw: 7.0.0 - rehype-remark: 10.0.1 - rehype-slug: 6.0.0 - rehype-sort-attribute-values: 5.0.1 - rehype-sort-attributes: 5.0.1 - remark-emoji: 5.0.2 - remark-gfm: 4.0.1 - remark-mdc: 3.10.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - remark-stringify: 11.0.0 - scule: 1.3.0 - shiki: 4.1.0 - ufo: 1.6.4 - unified: 11.0.5 - unist-builder: 4.0.0 - unist-util-visit: 5.1.0 - unwasm: 0.5.3 - vfile: 6.0.3 - transitivePeerDependencies: - - magicast - - supports-color - - '@nuxtjs/mdc@0.22.1(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': - dependencies: - '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@shikijs/core': 4.3.1 - '@shikijs/engine-javascript': 4.3.1 '@shikijs/langs': 4.3.1 '@shikijs/themes': 4.3.1 '@shikijs/transformers': 4.3.1 @@ -22884,9 +22668,9 @@ snapshots: - supports-color - unplugin - '@nuxtjs/mdc@0.22.1(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)': + '@nuxtjs/mdc@0.22.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.5.0(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@shikijs/core': 4.3.1 '@shikijs/engine-javascript': 4.3.1 '@shikijs/langs': 4.3.1 @@ -22938,9 +22722,9 @@ snapshots: - supports-color - unplugin - '@nuxtjs/mdc@0.22.1(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + '@nuxtjs/mdc@0.22.1(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.5.0(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@shikijs/core': 4.3.1 '@shikijs/engine-javascript': 4.3.1 '@shikijs/langs': 4.3.1 @@ -22992,9 +22776,9 @@ snapshots: - supports-color - unplugin - '@nuxtjs/mdc@0.22.1(magicast@0.5.3)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': + '@nuxtjs/mdc@0.22.1(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))': dependencies: - '@nuxt/kit': 4.5.0(magicast@0.5.3)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@shikijs/core': 4.3.1 '@shikijs/engine-javascript': 4.3.1 '@shikijs/langs': 4.3.1 @@ -23055,15 +22839,15 @@ snapshots: transitivePeerDependencies: - encoding - '@nuxtjs/robots@6.1.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)': + '@nuxtjs/robots@6.1.2(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3)': dependencies: '@fingerprintjs/botd': 2.0.0 - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) consola: 3.4.2 defu: 6.1.7 h3: 1.15.11 - nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) - nuxtseo-shared: 5.3.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + nuxtseo-shared: 5.3.2(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) pathe: 2.0.3 pkg-types: 2.3.1 ufo: 1.6.4 @@ -23071,19 +22855,23 @@ snapshots: zod: 4.4.3 transitivePeerDependencies: - '@nuxt/schema' + - magic-string - magicast - nuxt + - oxc-parser + - rolldown + - unplugin - vite - vue - '@nuxtjs/sitemap@8.2.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76)': + '@nuxtjs/sitemap@8.2.2(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76)': dependencies: '@nuxt/kit': 4.4.8(magicast@0.5.3) consola: 3.4.2 defu: 6.1.7 fast-xml-parser: 5.10.0 - nuxt-site-config: 4.1.1(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) - nuxtseo-shared: 5.3.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76))(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) + nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) + nuxtseo-shared: 5.3.2(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76))(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) ofetch: 1.5.1 pathe: 2.0.3 pkg-types: 2.3.1 @@ -23094,8 +22882,12 @@ snapshots: zod: 3.25.76 transitivePeerDependencies: - '@nuxt/schema' + - magic-string - magicast - nuxt + - oxc-parser + - rolldown + - unplugin - vite - vue @@ -23116,8 +22908,6 @@ snapshots: '@oozcitak/util@10.0.0': {} - '@opentelemetry/api@1.9.0': {} - '@opentelemetry/api@1.9.1': {} '@opentelemetry/semantic-conventions@1.40.0': {} @@ -23454,6 +23244,9 @@ snapshots: '@oxc-parser/binding-android-arm64@0.140.0': optional: true + '@oxc-parser/binding-android-arm64@0.82.3': + optional: true + '@oxc-parser/binding-darwin-arm64@0.128.0': optional: true @@ -23466,6 +23259,9 @@ snapshots: '@oxc-parser/binding-darwin-arm64@0.140.0': optional: true + '@oxc-parser/binding-darwin-arm64@0.82.3': + optional: true + '@oxc-parser/binding-darwin-x64@0.128.0': optional: true @@ -23478,6 +23274,9 @@ snapshots: '@oxc-parser/binding-darwin-x64@0.140.0': optional: true + '@oxc-parser/binding-darwin-x64@0.82.3': + optional: true + '@oxc-parser/binding-freebsd-x64@0.128.0': optional: true @@ -23490,6 +23289,9 @@ snapshots: '@oxc-parser/binding-freebsd-x64@0.140.0': optional: true + '@oxc-parser/binding-freebsd-x64@0.82.3': + optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.128.0': optional: true @@ -23502,6 +23304,9 @@ snapshots: '@oxc-parser/binding-linux-arm-gnueabihf@0.140.0': optional: true + '@oxc-parser/binding-linux-arm-gnueabihf@0.82.3': + optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.128.0': optional: true @@ -23514,6 +23319,9 @@ snapshots: '@oxc-parser/binding-linux-arm-musleabihf@0.140.0': optional: true + '@oxc-parser/binding-linux-arm-musleabihf@0.82.3': + optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.128.0': optional: true @@ -23526,6 +23334,9 @@ snapshots: '@oxc-parser/binding-linux-arm64-gnu@0.140.0': optional: true + '@oxc-parser/binding-linux-arm64-gnu@0.82.3': + optional: true + '@oxc-parser/binding-linux-arm64-musl@0.128.0': optional: true @@ -23538,6 +23349,9 @@ snapshots: '@oxc-parser/binding-linux-arm64-musl@0.140.0': optional: true + '@oxc-parser/binding-linux-arm64-musl@0.82.3': + optional: true + '@oxc-parser/binding-linux-ppc64-gnu@0.128.0': optional: true @@ -23562,6 +23376,9 @@ snapshots: '@oxc-parser/binding-linux-riscv64-gnu@0.140.0': optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.82.3': + optional: true + '@oxc-parser/binding-linux-riscv64-musl@0.128.0': optional: true @@ -23586,6 +23403,9 @@ snapshots: '@oxc-parser/binding-linux-s390x-gnu@0.140.0': optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.82.3': + optional: true + '@oxc-parser/binding-linux-x64-gnu@0.128.0': optional: true @@ -23598,6 +23418,9 @@ snapshots: '@oxc-parser/binding-linux-x64-gnu@0.140.0': optional: true + '@oxc-parser/binding-linux-x64-gnu@0.82.3': + optional: true + '@oxc-parser/binding-linux-x64-musl@0.128.0': optional: true @@ -23610,6 +23433,9 @@ snapshots: '@oxc-parser/binding-linux-x64-musl@0.140.0': optional: true + '@oxc-parser/binding-linux-x64-musl@0.82.3': + optional: true + '@oxc-parser/binding-openharmony-arm64@0.128.0': optional: true @@ -23650,6 +23476,14 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true + '@oxc-parser/binding-wasm32-wasi@0.82.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.128.0': optional: true @@ -23662,6 +23496,9 @@ snapshots: '@oxc-parser/binding-win32-arm64-msvc@0.140.0': optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.82.3': + optional: true + '@oxc-parser/binding-win32-ia32-msvc@0.128.0': optional: true @@ -23686,6 +23523,9 @@ snapshots: '@oxc-parser/binding-win32-x64-msvc@0.140.0': optional: true + '@oxc-parser/binding-win32-x64-msvc@0.82.3': + optional: true + '@oxc-project/types@0.103.0': {} '@oxc-project/types@0.127.0': {} @@ -23700,6 +23540,8 @@ snapshots: '@oxc-project/types@0.140.0': {} + '@oxc-project/types@0.82.3': {} + '@oxc-transform/binding-android-arm-eabi@0.128.0': optional: true @@ -25181,7 +25023,7 @@ snapshots: '@rollup/plugin-yaml@4.1.2(rollup@4.60.2)': dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.60.2) - js-yaml: 4.1.1 + js-yaml: 4.3.0 tosource: 2.0.0-alpha.3 optionalDependencies: rollup: 4.60.2 @@ -25289,14 +25131,6 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/core@4.0.2': - dependencies: - '@shikijs/primitive': 4.0.2 - '@shikijs/types': 4.0.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - '@shikijs/core@4.1.0': dependencies: '@shikijs/primitive': 4.1.0 @@ -25373,12 +25207,6 @@ snapshots: dependencies: '@shikijs/types': 4.3.1 - '@shikijs/primitive@4.0.2': - dependencies: - '@shikijs/types': 4.0.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - '@shikijs/primitive@4.1.0': dependencies: '@shikijs/types': 4.1.0 @@ -25416,11 +25244,6 @@ snapshots: dependencies: '@shikijs/types': 4.3.1 - '@shikijs/transformers@4.0.2': - dependencies: - '@shikijs/core': 4.0.2 - '@shikijs/types': 4.0.2 - '@shikijs/transformers@4.3.1': dependencies: '@shikijs/core': 4.3.1 @@ -25436,11 +25259,6 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/types@4.0.2': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - '@shikijs/types@4.1.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -26793,8 +26611,6 @@ snapshots: '@tanstack/table-core@8.21.3': {} - '@tanstack/virtual-core@3.14.0': {} - '@tanstack/virtual-core@3.17.4': {} '@tanstack/virtual-file-routes@1.161.7': {} @@ -26804,11 +26620,6 @@ snapshots: '@tanstack/table-core': 8.21.3 vue: 3.5.40(typescript@6.0.3) - '@tanstack/vue-virtual@3.13.24(vue@3.5.40(typescript@6.0.3))': - dependencies: - '@tanstack/virtual-core': 3.14.0 - vue: 3.5.40(typescript@6.0.3) - '@tanstack/vue-virtual@3.13.32(vue@3.5.40(typescript@6.0.3))': dependencies: '@tanstack/virtual-core': 3.17.4 @@ -27671,19 +27482,19 @@ snapshots: - unloader - utf-8-validate - '@unhead/bundler@3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(unhead@3.2.1(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@unhead/bundler@3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(unhead@3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@vitejs/devtools-kit': 0.3.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@vitejs/devtools-kit': 0.3.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) magic-string: 1.0.0 oxc-parser: 0.140.0 - oxc-walker: 1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + oxc-walker: 1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) ufo: 1.6.4 - unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) optionalDependencies: esbuild: 0.28.0 lightningcss: 1.32.0 - rolldown: 1.1.5 + rolldown: 1.2.0 vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' @@ -27773,13 +27584,13 @@ snapshots: - utf-8-validate optional: true - '@unhead/vue@3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3))': + '@unhead/vue@3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': dependencies: '@unhead/bundler': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(unhead@3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) hookable: 6.1.1 unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - vue: 3.5.33(typescript@5.9.3) + vue: 3.5.40(typescript@5.9.3) optionalDependencies: vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: @@ -27848,12 +27659,12 @@ snapshots: - unloader - utf-8-validate - '@unhead/vue@3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3))': + '@unhead/vue@3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3))': dependencies: - '@unhead/bundler': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(unhead@3.2.1(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@unhead/bundler': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(unhead@3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) hookable: 6.1.1 - unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) vue: 3.5.33(typescript@6.0.3) optionalDependencies: vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) @@ -28051,11 +27862,11 @@ snapshots: svelte: 5.55.5(@typescript-eslint/types@8.59.1) vue: 3.5.40(typescript@6.0.3) - '@vercel/analytics@2.0.1(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3))': + '@vercel/analytics@2.0.1(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3))': optionalDependencies: '@sveltejs/kit': 2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) next: 16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + nuxt: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) react: 19.2.6 svelte: 5.55.5(@typescript-eslint/types@8.59.1) vue: 3.5.40(typescript@6.0.3) @@ -28105,11 +27916,11 @@ snapshots: '@vercel/cli-exec': 0.1.1 jose: 5.10.0 - '@vercel/speed-insights@2.0.0(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3))': + '@vercel/speed-insights@2.0.0(@sveltejs/kit@2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(next@16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(react@19.2.6)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3))': optionalDependencies: '@sveltejs/kit': 2.69.3(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(svelte@5.55.5(@typescript-eslint/types@8.59.1))(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) next: 16.2.10(@babel/core@7.29.0)(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + nuxt: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) react: 19.2.6 svelte: 5.55.5(@typescript-eslint/types@8.59.1) vue: 3.5.40(typescript@6.0.3) @@ -28263,11 +28074,11 @@ snapshots: - utf-8-validate - webpack - '@vitejs/devtools-kit@0.3.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': + '@vitejs/devtools-kit@0.3.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@devframes/hub': 0.5.4(devframe@0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@devframes/hub': 0.5.4(devframe@0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) birpc: 4.0.0 - devframe: 0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + devframe: 0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) mlly: 1.8.2 nostics: 1.2.0 pathe: 2.0.3 @@ -28301,7 +28112,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) @@ -28309,34 +28120,34 @@ snapshots: '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) vite: 7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vue: 3.5.33(typescript@5.9.3) + vue: 3.5.33(typescript@6.0.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3))': + '@vitejs/plugin-vue-jsx@5.1.6(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': dependencies: '@babel/core': 7.29.0 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.0) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.0) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) - vite: 7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vue: 3.5.33(typescript@6.0.3) + vite: 8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vue: 3.5.40(typescript@5.9.3) transitivePeerDependencies: - supports-color + optional: true - '@vitejs/plugin-vue-jsx@5.1.6(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.6(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.0) '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.0) '@rolldown/pluginutils': 1.0.1 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) - vite: 8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) vue: 3.5.40(typescript@5.9.3) transitivePeerDependencies: - supports-color - optional: true '@vitejs/plugin-vue-jsx@5.1.6(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))': dependencies: @@ -28350,12 +28161,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.8(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@rolldown/pluginutils': 1.0.1 - vite: 7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vue: 3.5.33(typescript@5.9.3) - '@vitejs/plugin-vue@6.0.8(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 @@ -28369,6 +28174,12 @@ snapshots: vue: 3.5.40(typescript@5.9.3) optional: true + '@vitejs/plugin-vue@6.0.8(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vue: 3.5.40(typescript@5.9.3) + '@vitejs/plugin-vue@6.0.8(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.1 @@ -28515,36 +28326,16 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue-macros/common@3.1.2(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@vue/compiler-sfc': 3.5.39 - ast-kit: 2.2.0 - local-pkg: 1.2.1 - magic-string-ast: 1.0.3 - unplugin-utils: 0.3.1 - optionalDependencies: - vue: 3.5.33(typescript@5.9.3) - '@vue-macros/common@3.1.2(vue@3.5.33(typescript@6.0.3))': dependencies: - '@vue/compiler-sfc': 3.5.39 + '@vue/compiler-sfc': 3.5.40 ast-kit: 2.2.0 local-pkg: 1.2.1 magic-string-ast: 1.0.3 - unplugin-utils: 0.3.1 + unplugin-utils: 0.3.2 optionalDependencies: vue: 3.5.33(typescript@6.0.3) - '@vue-macros/common@3.1.2(vue@3.5.40(typescript@6.0.3))': - dependencies: - '@vue/compiler-sfc': 3.5.39 - ast-kit: 2.2.0 - local-pkg: 1.2.1 - magic-string-ast: 1.0.3 - unplugin-utils: 0.3.1 - optionalDependencies: - vue: 3.5.40(typescript@6.0.3) - '@vue-macros/common@3.1.4(vue@3.5.40(typescript@5.9.3))': dependencies: '@vue/compiler-sfc': 3.5.40 @@ -28554,7 +28345,6 @@ snapshots: unplugin-utils: 0.3.2 optionalDependencies: vue: 3.5.40(typescript@5.9.3) - optional: true '@vue-macros/common@3.1.4(vue@3.5.40(typescript@6.0.3))': dependencies: @@ -28578,7 +28368,7 @@ snapshots: '@babel/types': 7.29.7 '@vue/babel-helper-vue-transform-on': 2.0.1 '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.0) - '@vue/shared': 3.5.39 + '@vue/shared': 3.5.40 optionalDependencies: '@babel/core': 7.29.0 transitivePeerDependencies: @@ -28586,12 +28376,12 @@ snapshots: '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.0)': dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/parser': 7.29.7 - '@vue/compiler-sfc': 3.5.39 + '@vue/compiler-sfc': 3.5.40 transitivePeerDependencies: - supports-color @@ -28603,14 +28393,6 @@ snapshots: estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-core@3.5.39': - dependencies: - '@babel/parser': 7.29.7 - '@vue/shared': 3.5.39 - entities: 7.0.1 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - '@vue/compiler-core@3.5.40': dependencies: '@babel/parser': 7.29.7 @@ -28624,11 +28406,6 @@ snapshots: '@vue/compiler-core': 3.5.33 '@vue/shared': 3.5.33 - '@vue/compiler-dom@3.5.39': - dependencies: - '@vue/compiler-core': 3.5.39 - '@vue/shared': 3.5.39 - '@vue/compiler-dom@3.5.40': dependencies: '@vue/compiler-core': 3.5.40 @@ -28646,18 +28423,6 @@ snapshots: postcss: 8.5.19 source-map-js: 1.2.1 - '@vue/compiler-sfc@3.5.39': - dependencies: - '@babel/parser': 7.29.7 - '@vue/compiler-core': 3.5.39 - '@vue/compiler-dom': 3.5.39 - '@vue/compiler-ssr': 3.5.39 - '@vue/shared': 3.5.39 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.19 - source-map-js: 1.2.1 - '@vue/compiler-sfc@3.5.40': dependencies: '@babel/parser': 7.29.7 @@ -28675,11 +28440,6 @@ snapshots: '@vue/compiler-dom': 3.5.33 '@vue/shared': 3.5.33 - '@vue/compiler-ssr@3.5.39': - dependencies: - '@vue/compiler-dom': 3.5.39 - '@vue/shared': 3.5.39 - '@vue/compiler-ssr@3.5.40': dependencies: '@vue/compiler-dom': 3.5.40 @@ -28695,12 +28455,6 @@ snapshots: dependencies: '@vue/devtools-kit': 8.1.5 - '@vue/devtools-core@8.1.1(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@vue/devtools-kit': 8.1.1 - '@vue/devtools-shared': 8.1.1 - vue: 3.5.33(typescript@5.9.3) - '@vue/devtools-core@8.1.1(vue@3.5.33(typescript@6.0.3))': dependencies: '@vue/devtools-kit': 8.1.1 @@ -28712,7 +28466,6 @@ snapshots: '@vue/devtools-kit': 8.1.1 '@vue/devtools-shared': 8.1.1 vue: 3.5.40(typescript@5.9.3) - optional: true '@vue/devtools-core@8.1.1(vue@3.5.40(typescript@6.0.3))': dependencies: @@ -28790,12 +28543,6 @@ snapshots: '@vue/shared': 3.5.40 csstype: 3.2.3 - '@vue/server-renderer@3.5.33(vue@3.5.33(typescript@5.9.3))': - dependencies: - '@vue/compiler-ssr': 3.5.33 - '@vue/shared': 3.5.33 - vue: 3.5.33(typescript@5.9.3) - '@vue/server-renderer@3.5.33(vue@3.5.33(typescript@6.0.3))': dependencies: '@vue/compiler-ssr': 3.5.33 @@ -28971,22 +28718,6 @@ snapshots: agent-base@7.1.4: {} - ai@6.0.174(zod@4.4.3): - dependencies: - '@ai-sdk/gateway': 3.0.109(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.26(zod@4.4.3) - '@opentelemetry/api': 1.9.0 - zod: 4.4.3 - - ai@6.0.209(zod@4.4.3): - dependencies: - '@ai-sdk/gateway': 3.0.134(zod@4.4.3) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.30(zod@4.4.3) - '@opentelemetry/api': 1.9.1 - zod: 4.4.3 - ai@6.0.228(zod@4.4.3): dependencies: '@ai-sdk/gateway': 3.0.151(zod@4.4.3) @@ -29586,15 +29317,15 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001791 + browserslist: 4.28.7 + caniuse-lite: 1.0.30001806 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-api@4.0.0: dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001791 + browserslist: 4.28.7 + caniuse-lite: 1.0.30001806 caniuse-lite@1.0.30001791: {} @@ -29792,7 +29523,7 @@ snapshots: dependencies: entities: 8.0.0 htmlparser2: 12.0.0 - js-yaml: 4.1.1 + js-yaml: 4.3.0 markdown-exit: 1.0.0-beta.9 optionalDependencies: katex: 0.16.47 @@ -29953,8 +29684,6 @@ snapshots: dependencies: uncrypto: 0.1.3 - crossws@0.4.10: {} - crossws@0.4.10(srvx@0.11.15): optionalDependencies: srvx: 0.11.15 @@ -30056,7 +29785,7 @@ snapshots: cssnano-preset-default@8.0.2(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 cssnano-utils: 6.0.1(postcss@8.5.19) postcss: 8.5.19 postcss-calc: 10.1.1(postcss@8.5.19) @@ -30524,14 +30253,14 @@ snapshots: - vite - webpack - devframe@0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): + devframe@0.5.4(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@valibot/to-json-schema': 1.7.1(valibot@1.4.2(typescript@6.0.3)) birpc: 4.0.0 cac: 7.0.0 h3: 2.0.1-rc.22(crossws@0.4.5(srvx@0.11.15)) mrmime: 2.0.1 - nostics: 0.2.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + nostics: 0.2.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) pathe: 2.0.3 valibot: 1.4.2(typescript@6.0.3) ws: 8.21.0 @@ -30579,23 +30308,23 @@ snapshots: dependencies: path-type: 4.0.0 - docus@5.12.3(a0b6e862aa0ce19fb90c10e383495f25): + docus@5.12.3(c6cde3b888115f62b3451ac8d038e704): dependencies: - '@ai-sdk/gateway': 3.0.134(zod@4.4.3) + '@ai-sdk/gateway': 3.0.151(zod@4.4.3) '@ai-sdk/mcp': 1.0.62(zod@4.4.3) '@ai-sdk/vue': 3.0.228(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) '@comark/vue': 0.4.0(katex@0.16.47)(shiki@4.3.1)(vue@3.5.40(typescript@6.0.3)) '@iconify-json/lucide': 1.2.117 '@iconify-json/simple-icons': 1.2.90 '@iconify-json/vscode-icons': 1.2.67 - '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - '@nuxt/image': 2.0.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(srvx@0.11.22) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/ui': 4.10.0(342679e81daec34fb4ebc5f1215784ba) - '@nuxtjs/i18n': 10.4.1(@vue/compiler-dom@3.5.39)(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(ioredis@5.10.1)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@nuxtjs/mcp-toolkit': 0.18.0(@vue/compiler-sfc@3.5.33)(h3@1.15.11)(magicast@0.5.3)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) - '@nuxtjs/mdc': 0.22.1(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0) - '@nuxtjs/robots': 6.1.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + '@nuxt/content': 3.15.0(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@valibot/to-json-schema@1.7.1(valibot@1.4.2(typescript@6.0.3)))(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(esbuild@0.28.0)(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(valibot@1.4.2(typescript@6.0.3))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@nuxt/image': 2.0.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/ui': 4.10.0(9dd74825632101caae164786bfef9095) + '@nuxtjs/i18n': 10.4.1(@vue/compiler-dom@3.5.40)(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(ioredis@5.10.1)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@nuxtjs/mcp-toolkit': 0.18.0(@vue/compiler-sfc@3.5.40)(h3@1.15.11)(magicast@0.5.3)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + '@nuxtjs/mdc': 0.22.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxtjs/robots': 6.1.2(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) '@shikijs/core': 4.3.1 '@shikijs/engine-javascript': 4.3.1 '@shikijs/langs': 4.3.1 @@ -30603,15 +30332,15 @@ snapshots: '@shikijs/themes': 4.3.1 '@takumi-rs/core': 1.8.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@vueuse/core': 14.3.0(vue@3.5.40(typescript@6.0.3)) - ai: 6.0.209(zod@4.4.3) + ai: 6.0.228(zod@4.4.3) better-sqlite3: 12.11.1 defu: 6.1.7 exsolve: 1.1.0 git-url-parse: 16.1.0 motion-v: 2.3.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3)))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.40(typescript@6.0.3)) - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) - nuxt-llms: 0.2.0(magicast@0.5.3) - nuxt-og-image: 6.6.0(e8e809049ebb737f5fe470e3d1528ce4) + nuxt: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) + nuxt-llms: 0.2.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + nuxt-og-image: 6.6.0(4f2ce1bbeb370c12e437c8a449918cdb) pathe: 2.0.3 pkg-types: 2.3.1 scule: 1.3.0 @@ -31962,12 +31691,6 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.41.0: - dependencies: - motion-dom: 12.41.0 - motion-utils: 12.39.0 - tslib: 2.8.1 - framer-motion@12.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: motion-dom: 12.41.0 @@ -32320,7 +32043,7 @@ snapshots: '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.1.0 + property-information: 7.2.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -32439,7 +32162,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -32464,7 +32187,7 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 hex-rgb@4.3.0: {} @@ -32575,24 +32298,6 @@ snapshots: import-without-cache@0.4.0: {} - impound@1.1.5(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - es-module-lexer: 2.1.0 - pathe: 2.0.3 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.1 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack - impound@1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -32888,10 +32593,6 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 - js-yaml@4.3.0: dependencies: argparse: 2.0.1 @@ -33094,7 +32795,7 @@ snapshots: '@parcel/watcher-wasm': 2.5.6 citty: 0.2.2 consola: 3.4.2 - crossws: 0.4.10 + crossws: 0.4.10(srvx@0.8.16) defu: 6.1.7 get-port-please: 3.2.0 h3: 1.15.11 @@ -33244,23 +32945,6 @@ snapshots: ufo: 1.6.4 unplugin: 2.3.11 - magic-regexp@0.11.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): - dependencies: - magic-string: 0.30.21 - regexp-tree: 0.1.27 - type-level-regexp: 0.1.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack - magic-regexp@0.11.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: magic-string: 0.30.21 @@ -33366,7 +33050,7 @@ snapshots: '@types/linkify-it': 5.0.0 '@types/mdurl': 2.0.0 entities: 7.0.1 - linkify-it: 5.0.0 + linkify-it: 5.0.2 mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 @@ -34044,19 +33728,6 @@ snapshots: - react - react-dom - motion-v@2.3.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3)))(vue@3.5.40(typescript@6.0.3)): - dependencies: - '@vueuse/core': 14.3.0(vue@3.5.40(typescript@6.0.3)) - framer-motion: 12.41.0 - hey-listen: 1.0.8 - motion-dom: 12.41.0 - motion-utils: 12.39.0 - vue: 3.5.40(typescript@6.0.3) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - react - - react-dom - motion@12.40.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: framer-motion: 12.41.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -34155,31 +33826,6 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.2.10(@opentelemetry/api@1.9.1)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): - dependencies: - '@next/env': 16.2.10 - '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.11.0 - caniuse-lite: 1.0.30001806 - postcss: 8.4.31 - react: 19.2.7 - react-dom: 19.2.7(react@19.2.7) - styled-jsx: 5.1.6(react@19.2.7) - optionalDependencies: - '@next/swc-darwin-arm64': 16.2.10 - '@next/swc-darwin-x64': 16.2.10 - '@next/swc-linux-arm64-gnu': 16.2.10 - '@next/swc-linux-arm64-musl': 16.2.10 - '@next/swc-linux-x64-gnu': 16.2.10 - '@next/swc-linux-x64-musl': 16.2.10 - '@next/swc-win32-arm64-msvc': 16.2.10 - '@next/swc-win32-x64-msvc': 16.2.10 - '@opentelemetry/api': 1.9.1 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@16.2.4(@opentelemetry/api@1.9.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: '@next/env': 16.2.4 @@ -34409,7 +34055,7 @@ snapshots: rolldown: 1.2.0 srvx: 0.11.16 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.7(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(ofetch@2.0.0-alpha.3) + unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(lru-cache@11.3.5)(ofetch@2.0.0-alpha.3) optionalDependencies: dotenv: 17.4.2 giget: 3.2.0 @@ -34448,7 +34094,7 @@ snapshots: - uploadthing - wrangler - nitropack@2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.128.0)(rolldown@1.1.5)(srvx@0.11.15)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): + nitropack@2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.15)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.60.2) @@ -34501,7 +34147,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.60.2 - rollup-plugin-visualizer: 7.0.1(rolldown@1.1.5)(rollup@4.60.2) + rollup-plugin-visualizer: 7.0.1(rolldown@1.2.0)(rollup@4.60.2) scule: 1.3.0 semver: 7.8.5 serve-placeholder: 2.0.2 @@ -34513,7 +34159,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.128.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) unplugin-utils: 0.3.2 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1) untyped: 2.0.0 @@ -34670,7 +34316,7 @@ snapshots: - vite - webpack - nitropack@2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.140.0)(rolldown@1.1.5)(srvx@0.11.15)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): + nitropack@2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.140.0)(rolldown@1.2.0)(srvx@0.11.15)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 '@rollup/plugin-alias': 6.0.0(rollup@4.60.2) @@ -34723,7 +34369,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.60.2 - rollup-plugin-visualizer: 7.0.1(rolldown@1.1.5)(rollup@4.60.2) + rollup-plugin-visualizer: 7.0.1(rolldown@1.2.0)(rollup@4.60.2) scule: 1.3.0 semver: 7.8.5 serve-placeholder: 2.0.2 @@ -34735,7 +34381,7 @@ snapshots: uncrypto: 0.1.3 unctx: 2.5.0 unenv: 2.0.0-rc.24 - unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) unplugin-utils: 0.3.2 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1) untyped: 2.0.0 @@ -35057,7 +34703,7 @@ snapshots: pretty-bytes: 7.1.0 radix3: 1.1.2 rollup: 4.60.2 - rollup-plugin-visualizer: 7.0.1(rollup@4.60.2) + rollup-plugin-visualizer: 7.0.1(rolldown@1.2.0)(rollup@4.60.2) scule: 1.3.0 semver: 7.8.5 serve-placeholder: 2.0.2 @@ -35150,22 +34796,6 @@ snapshots: normalize-path@3.0.0: {} - nostics@0.2.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): - dependencies: - magic-string: 0.30.21 - oxc-parser: 0.132.0 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack - nostics@0.2.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: magic-string: 0.30.21 @@ -35248,9 +34878,9 @@ snapshots: - supports-color - vue - nuxt-component-meta@0.17.2(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): + nuxt-component-meta@0.17.2(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): dependencies: - '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) citty: 0.1.6 mlly: 1.8.2 ohash: 2.0.11 @@ -35265,9 +34895,9 @@ snapshots: - rolldown - unplugin - nuxt-component-meta@0.17.2(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0): + nuxt-component-meta@0.17.2(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): dependencies: - '@nuxt/kit': 4.5.0(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) citty: 0.1.6 mlly: 1.8.2 ohash: 2.0.11 @@ -35282,9 +34912,9 @@ snapshots: - rolldown - unplugin - nuxt-component-meta@0.17.2(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): + nuxt-component-meta@0.17.2(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): dependencies: - '@nuxt/kit': 4.5.0(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) citty: 0.1.6 mlly: 1.8.2 ohash: 2.0.11 @@ -35298,41 +34928,28 @@ snapshots: - oxc-parser - rolldown - unplugin + optional: true + + nuxt-define@1.0.0: {} - nuxt-component-meta@0.17.2(magicast@0.5.3)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): + nuxt-llms@0.2.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): dependencies: - '@nuxt/kit': 4.5.0(magicast@0.5.3)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - citty: 0.1.6 - mlly: 1.8.2 - ohash: 2.0.11 - scule: 1.3.0 - typescript: 5.9.3 - ufo: 1.6.4 - vue-component-meta: 3.2.7(typescript@5.9.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) transitivePeerDependencies: - magic-string - magicast - oxc-parser - rolldown - unplugin - optional: true - - nuxt-define@1.0.0: {} - nuxt-llms@0.2.0(magicast@0.5.3): - dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) - transitivePeerDependencies: - - magicast - - nuxt-og-image@6.6.0(e8e809049ebb737f5fe470e3d1528ce4): + nuxt-og-image@6.6.0(4f2ce1bbeb370c12e437c8a449918cdb): dependencies: '@clack/prompts': 1.7.0 - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) '@unocss/config': 66.7.5 '@unocss/core': 66.7.5 - '@vue/compiler-sfc': 3.5.39 + '@vue/compiler-sfc': 3.5.40 chrome-launcher: 1.2.1 consola: 3.4.2 culori: 4.0.2 @@ -35343,8 +34960,8 @@ snapshots: magic-string: 0.30.21 magicast: 0.5.3 mocked-exports: 0.1.1 - nuxt-site-config: 4.0.8(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) - nuxtseo-shared: 5.3.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.0.8(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + nuxtseo-shared: 5.3.2(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) nypm: 0.6.8 ofetch: 1.5.1 ohash: 2.0.11 @@ -35358,7 +34975,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 ufo: 1.6.4 - ultrahtml: 1.6.0 + ultrahtml: 1.7.0 unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) unstorage: 2.0.0-alpha.7(chokidar@5.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(lru-cache@11.3.5)(ofetch@1.5.1) optionalDependencies: @@ -35366,7 +34983,7 @@ snapshots: '@takumi-rs/core': 1.8.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) fontless: 0.2.1(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - satori: 0.28.0 + satori: 0.19.3 sharp: 0.34.5 tailwindcss: 4.3.2 unifont: 0.7.4 @@ -35386,97 +35003,132 @@ snapshots: - vue - webpack - nuxt-site-config-kit@4.0.8(magicast@0.5.3)(vue@3.5.40(typescript@6.0.3)): + nuxt-site-config-kit@4.1.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)): dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) - site-config-stack: 4.0.8(vue@3.5.40(typescript@6.0.3)) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + site-config-stack: 4.1.1(vue@3.5.40(typescript@6.0.3)) std-env: 4.2.0 ufo: 1.6.4 transitivePeerDependencies: + - magic-string - magicast + - oxc-parser + - rolldown + - unplugin - vue - nuxt-site-config-kit@4.1.1(magicast@0.5.3)(vue@3.5.40(typescript@6.0.3)): + nuxt-site-config-kit@4.1.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)): dependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) site-config-stack: 4.1.1(vue@3.5.40(typescript@6.0.3)) std-env: 4.2.0 ufo: 1.6.4 transitivePeerDependencies: + - magic-string - magicast + - oxc-parser + - rolldown + - unplugin - vue - nuxt-site-config@4.0.8(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): + nuxt-site-config-kit@4.1.1(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)): dependencies: + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + site-config-stack: 4.1.1(vue@3.5.40(typescript@6.0.3)) + std-env: 4.2.0 + ufo: 1.6.4 + transitivePeerDependencies: + - magic-string + - magicast + - oxc-parser + - rolldown + - unplugin + - vue + + nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): + dependencies: + '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.8(magicast@0.5.3) h3: 1.15.11 - nuxt-site-config-kit: 4.0.8(magicast@0.5.3)(vue@3.5.40(typescript@6.0.3)) - nuxtseo-shared: 5.1.3(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.0.8(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + nuxt-site-config-kit: 4.1.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)) + nuxtseo-shared: 5.3.2(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) pathe: 2.0.3 pkg-types: 2.3.1 - site-config-stack: 4.0.8(vue@3.5.40(typescript@6.0.3)) + site-config-stack: 4.1.1(vue@3.5.40(typescript@6.0.3)) ufo: 1.6.4 transitivePeerDependencies: - '@nuxt/schema' + - magic-string - magicast - nuxt + - oxc-parser + - rolldown + - unplugin - vite - vue - zod - nuxt-site-config@4.1.1(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76): + nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.8(magicast@0.5.3) h3: 1.15.11 - nuxt-site-config-kit: 4.1.1(magicast@0.5.3)(vue@3.5.40(typescript@6.0.3)) - nuxtseo-shared: 5.3.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76))(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) + nuxt-site-config-kit: 4.1.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)) + nuxtseo-shared: 5.3.2(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) pathe: 2.0.3 pkg-types: 2.3.1 site-config-stack: 4.1.1(vue@3.5.40(typescript@6.0.3)) ufo: 1.6.4 transitivePeerDependencies: - '@nuxt/schema' + - magic-string - magicast - nuxt + - oxc-parser + - rolldown + - unplugin - vite - vue - zod - nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): + nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76): dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.8(magicast@0.5.3) h3: 1.15.11 - nuxt-site-config-kit: 4.1.1(magicast@0.5.3)(vue@3.5.40(typescript@6.0.3)) - nuxtseo-shared: 5.3.2(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + nuxt-site-config-kit: 4.1.1(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)) + nuxtseo-shared: 5.3.2(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76))(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) pathe: 2.0.3 pkg-types: 2.3.1 site-config-stack: 4.1.1(vue@3.5.40(typescript@6.0.3)) ufo: 1.6.4 transitivePeerDependencies: - '@nuxt/schema' + - magic-string - magicast - nuxt + - oxc-parser + - rolldown + - unplugin - vite - vue - zod - nuxt-studio@1.7.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(vue@3.5.40(typescript@6.0.3)): + nuxt-studio@1.7.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)): dependencies: - '@ai-sdk/gateway': 3.0.134(zod@4.4.3) - '@ai-sdk/vue': 3.0.174(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) - '@iconify-json/lucide': 1.2.105 - '@nuxtjs/mdc': 0.21.1(magicast@0.5.3) + '@ai-sdk/gateway': 3.0.151(zod@4.4.3) + '@ai-sdk/vue': 3.0.228(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + '@iconify-json/lucide': 1.2.117 + '@nuxtjs/mdc': 0.21.1(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@vueuse/core': 14.3.0(vue@3.5.40(typescript@6.0.3)) - ai: 6.0.209(zod@4.4.3) + ai: 6.0.228(zod@4.4.3) defu: 6.1.7 destr: 2.0.5 - js-yaml: 4.1.1 + js-yaml: 4.3.0 minimatch: 10.2.5 - nuxt-component-meta: 0.17.2(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0) - remark-mdc: 3.10.0 - shiki: 4.1.0 + nuxt-component-meta: 0.17.2(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + remark-mdc: 3.11.1 + shiki: 4.3.1 unstorage: 1.17.5(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1) zod: 4.4.3 zod-to-json-schema: 3.25.2(zod@4.4.3) @@ -35650,156 +35302,17 @@ snapshots: - xml2js - yaml - nuxt@4.4.4(3a628c60eb3c5faf2e1974943d1ba369): - dependencies: - '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@6.0.3) - '@nuxt/cli': 3.35.1(@nuxt/schema@4.4.4)(cac@6.7.14)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) - '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.4(3b7cba74bae154e6382e375c13212373) - '@nuxt/schema': 4.4.4 - '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.4(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.4(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(eslint@9.39.5(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.4(3a628c60eb3c5faf2e1974943d1ba369))(optionator@0.9.4)(rolldown@1.1.5)(rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(vue-tsc@3.3.7(typescript@6.0.3))(vue@3.5.33(typescript@6.0.3))(yaml@2.9.0) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.1.5)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) - '@vue/shared': 3.5.33 - chokidar: 5.0.0 - compatx: 0.2.0 - consola: 3.4.2 - cookie-es: 2.0.1 - defu: 6.1.7 - devalue: 5.8.0 - errx: 0.1.0 - escape-string-regexp: 5.0.0 - exsolve: 1.0.8 - hookable: 6.1.1 - ignore: 7.0.5 - impound: 1.1.5(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - jiti: 2.6.1 - klona: 2.0.6 - knitwork: 1.3.0 - magic-string: 0.30.21 - mlly: 1.8.2 - nanotar: 0.3.0 - nypm: 0.6.6 - ofetch: 1.5.1 - ohash: 2.0.11 - on-change: 6.0.2 - oxc-minify: 0.128.0 - oxc-parser: 0.128.0 - oxc-transform: 0.128.0 - oxc-walker: 0.7.0(oxc-parser@0.128.0) - pathe: 2.0.3 - perfect-debounce: 2.1.0 - picomatch: 4.0.4 - pkg-types: 2.3.1 - rou3: 0.8.1 - scule: 1.3.0 - semver: 7.7.4 - std-env: 4.1.0 - tinyglobby: 0.2.16 - ufo: 1.6.4 - ultrahtml: 1.6.0 - uncrypto: 0.1.3 - unctx: 2.5.0 - unimport: 6.2.0(esbuild@0.28.0)(oxc-parser@0.128.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin: 3.0.0 - unrouting: 0.1.7 - untyped: 2.0.0 - vue: 3.5.33(typescript@6.0.3) - vue-router: 5.0.6(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) - optionalDependencies: - '@parcel/watcher': 2.5.6 - '@types/node': 25.9.5 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@babel/core' - - '@babel/plugin-proposal-decorators' - - '@babel/plugin-syntax-jsx' - - '@biomejs/biome' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@farmfe/core' - - '@libsql/client' - - '@modelcontextprotocol/sdk' - - '@netlify/blobs' - - '@pinia/colada' - - '@planetscale/database' - - '@rollup/plugin-babel' - - '@rspack/core' - - '@unhead/cli' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - '@vitejs/devtools' - - '@vue/compiler-sfc' - - aws4fetch - - bare-abort-controller - - bare-buffer - - better-sqlite3 - - bufferutil - - bun-types-no-globals - - cac - - commander - - crossws - - db0 - - drizzle-orm - - encoding - - esbuild - - eslint - - idb-keyval - - ioredis - - less - - lightningcss - - magicast - - meow - - mysql2 - - optionator - - oxlint - - pinia - - react-native-b4a - - rolldown - - rollup - - rollup-plugin-visualizer - - sass - - sass-embedded - - sqlite3 - - srvx - - stylelint - - stylus - - sugarss - - supports-color - - terser - - tsx - - typescript - - unloader - - uploadthing - - utf-8-validate - - vite - - vls - - vti - - vue-tsc - - webpack - - xml2js - - yaml - - nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74): + nuxt@4.4.4(798471e5840d715482aeb7b47cc070f1): dependencies: '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@6.0.3) '@nuxt/cli': 3.35.1(@nuxt/schema@4.4.4)(cac@6.7.14)(magicast@0.5.3) '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.4(56077375bb4c1cd3722387df026bbff6) + '@nuxt/nitro-server': 4.4.4(eccf4b57a53062a178be2b5263dbe4e5) '@nuxt/schema': 4.4.4 '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.4(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.4(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(eslint@9.39.5(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(optionator@0.9.4)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(vue-tsc@3.3.7(typescript@6.0.3))(vue@3.5.33(typescript@6.0.3))(yaml@2.9.0) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) + '@nuxt/vite-builder': 4.4.4(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(eslint@9.39.5(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.4(798471e5840d715482aeb7b47cc070f1))(optionator@0.9.4)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(vue-tsc@3.3.7(typescript@6.0.3))(vue@3.5.33(typescript@6.0.3))(yaml@2.9.0) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.5(srvx@0.11.15))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) '@vue/shared': 3.5.33 chokidar: 5.0.0 compatx: 0.2.0 @@ -35845,7 +35358,7 @@ snapshots: unrouting: 0.1.7 untyped: 2.0.0 vue: 3.5.33(typescript@6.0.3) - vue-router: 5.0.6(@vue/compiler-sfc@3.5.33)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) + vue-router: 5.0.6(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)) optionalDependencies: '@parcel/watcher': 2.5.6 '@types/node': 25.9.5 @@ -36067,63 +35580,67 @@ snapshots: - xml2js - yaml - nuxt@4.4.4(d331503cc652b8b0dc91dfdee719201c): + nuxt@4.5.0(4ad5267ef2a8e696f3cd111576c35145): dependencies: - '@dxup/nuxt': 0.4.1(magicast@0.5.3)(typescript@5.9.3) - '@nuxt/cli': 3.35.1(@nuxt/schema@4.4.4)(cac@6.7.14)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)) - '@nuxt/kit': 4.4.4(magicast@0.5.3) - '@nuxt/nitro-server': 4.4.4(0b7d41c34615ca00c005d85c374e1c2e) - '@nuxt/schema': 4.4.4 - '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.4.4(magicast@0.5.3)) - '@nuxt/vite-builder': 4.4.4(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(eslint@9.39.5(jiti@2.7.0))(lightningcss@1.32.0)(magicast@0.5.3)(nuxt@4.4.4(d331503cc652b8b0dc91dfdee719201c))(optionator@0.9.4)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(rollup@4.60.2)(terser@5.46.2)(tsx@4.23.1)(typescript@5.9.3)(vue-tsc@3.2.7(typescript@5.9.3))(vue@3.5.33(typescript@5.9.3))(yaml@2.9.0) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)) - '@vue/shared': 3.5.33 + '@dxup/nuxt': 0.5.3(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@nuxt/cli': 3.37.0(@nuxt/schema@4.5.0)(cac@6.7.14)(commander@14.0.3)(magicast@0.5.3) + '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/nitro-server': 4.5.0(3c88cc2e4a4fd55546c43727f945c208) + '@nuxt/schema': 4.5.0 + '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))) + '@nuxt/vite-builder': 4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(4ad5267ef2a8e696f3cd111576c35145))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.2.7(typescript@6.0.3))(vue@3.5.40(typescript@6.0.3))(yaml@2.9.0) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + '@vue/shared': 3.5.40 chokidar: 5.0.0 compatx: 0.2.0 consola: 3.4.2 - cookie-es: 2.0.1 + cookie-es: 3.1.1 defu: 6.1.7 - devalue: 5.8.0 + devalue: 5.8.1 errx: 0.1.0 escape-string-regexp: 5.0.0 - exsolve: 1.0.8 + exsolve: 1.1.0 + fnv1a-64: 0.1.1 hookable: 6.1.1 - ignore: 7.0.5 + ignore: 7.0.6 impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - jiti: 2.6.1 + jiti: 2.7.0 klona: 2.0.6 knitwork: 1.3.0 - magic-string: 0.30.21 + magic-string: 1.0.0 mlly: 1.8.2 nanotar: 0.3.0 - nypm: 0.6.6 + nostics: 1.2.0 + nypm: 0.6.8 + object-identity: 0.2.3 ofetch: 1.5.1 ohash: 2.0.11 on-change: 6.0.2 - oxc-minify: 0.128.0 - oxc-parser: 0.128.0 - oxc-transform: 0.128.0 - oxc-walker: 0.7.0(oxc-parser@0.128.0) + oxc-walker: 1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) pathe: 2.0.3 perfect-debounce: 2.1.0 - picomatch: 4.0.4 + picomatch: 4.0.5 pkg-types: 2.3.1 - rou3: 0.8.1 + rolldown: 1.2.0 + rolldown-string: 0.3.1(rolldown@1.2.0) + rou3: 0.9.1 scule: 1.3.0 - semver: 7.7.4 - std-env: 4.1.0 - tinyglobby: 0.2.16 + semver: 7.8.5 + std-env: 4.2.0 + tinyglobby: 0.2.17 ufo: 1.6.4 - ultrahtml: 1.6.0 + ultrahtml: 1.7.0 uncrypto: 0.1.3 - unctx: 2.5.0 - unimport: 6.2.0(esbuild@0.28.0)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin: 3.0.0 + unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + undici: 8.8.0 + unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) unrouting: 0.1.7 untyped: 2.0.0 - vue: 3.5.33(typescript@5.9.3) - vue-router: 5.0.6(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)) + vue: 3.5.40(typescript@6.0.3) + vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) optionalDependencies: '@parcel/watcher': 2.5.6 '@types/node': 25.9.5 @@ -36134,9 +35651,9 @@ snapshots: - '@azure/identity' - '@azure/keyvault-secrets' - '@azure/storage-blob' - - '@babel/core' - '@babel/plugin-proposal-decorators' - '@babel/plugin-syntax-jsx' + - '@babel/plugin-syntax-typescript' - '@biomejs/biome' - '@capacitor/preferences' - '@deno/kv' @@ -36178,10 +35695,10 @@ snapshots: - meow - mysql2 - optionator + - oxc-parser - oxlint - pinia - react-native-b4a - - rolldown - rollup - rollup-plugin-visualizer - sass @@ -36199,25 +35716,23 @@ snapshots: - uploadthing - utf-8-validate - vite - - vls - - vti - vue-tsc - webpack - xml2js - yaml - nuxt@4.5.0(4ad5267ef2a8e696f3cd111576c35145): + nuxt@4.5.0(89ef07b0b9a25f097ff130a690b7b14c): dependencies: - '@dxup/nuxt': 0.5.3(esbuild@0.28.0)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@dxup/nuxt': 0.5.3(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/cli': 3.37.0(@nuxt/schema@4.5.0)(cac@6.7.14)(commander@14.0.3)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@nuxt/nitro-server': 4.5.0(3c88cc2e4a4fd55546c43727f945c208) + '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/nitro-server': 4.5.0(9b15569c862cffbeaea5a83374e901a1) '@nuxt/schema': 4.5.0 - '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))) - '@nuxt/vite-builder': 4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(4ad5267ef2a8e696f3cd111576c35145))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@6.0.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.2.7(typescript@6.0.3))(vue@3.5.40(typescript@6.0.3))(yaml@2.9.0) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) - '@vue/shared': 3.5.39 + '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))) + '@nuxt/vite-builder': 4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.17)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(89ef07b0b9a25f097ff130a690b7b14c))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@5.9.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.3.7(typescript@5.9.3))(vue@3.5.40(typescript@5.9.3))(yaml@2.9.0) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@vue/shared': 3.5.40 chokidar: 5.0.0 compatx: 0.2.0 consola: 3.4.2 @@ -36230,7 +35745,7 @@ snapshots: fnv1a-64: 0.1.1 hookable: 6.1.1 ignore: 7.0.6 - impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) jiti: 2.7.0 klona: 2.0.6 knitwork: 1.3.0 @@ -36243,7 +35758,7 @@ snapshots: ofetch: 1.5.1 ohash: 2.0.11 on-change: 6.0.2 - oxc-walker: 1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + oxc-walker: 1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) pathe: 2.0.3 perfect-debounce: 2.1.0 picomatch: 4.0.5 @@ -36258,18 +35773,18 @@ snapshots: ufo: 1.6.4 ultrahtml: 1.7.0 uncrypto: 0.1.3 - unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) undici: 8.8.0 - unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) unrouting: 0.1.7 untyped: 2.0.0 - vue: 3.5.40(typescript@6.0.3) - vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)) + vue: 3.5.40(typescript@5.9.3) + vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) optionalDependencies: '@parcel/watcher': 2.5.6 - '@types/node': 25.9.5 + '@types/node': 22.19.17 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -36346,19 +35861,20 @@ snapshots: - webpack - xml2js - yaml + optional: true - nuxt@4.5.0(89ef07b0b9a25f097ff130a690b7b14c): + nuxt@4.5.0(d0b081e3ea844aa3953445e0cdf8d794): dependencies: - '@dxup/nuxt': 0.5.3(esbuild@0.28.0)(magicast@0.5.3)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@dxup/nuxt': 0.5.3(esbuild@0.28.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/cli': 3.37.0(@nuxt/schema@4.5.0)(cac@6.7.14)(commander@14.0.3)(magicast@0.5.3) - '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) - '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - '@nuxt/nitro-server': 4.5.0(9b15569c862cffbeaea5a83374e901a1) + '@nuxt/devtools': 3.2.4(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@nuxt/kit': 4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@nuxt/nitro-server': 4.5.0(54440eaafe1040d72649c71d25711e2f) '@nuxt/schema': 4.5.0 - '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))) - '@nuxt/vite-builder': 4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.19.17)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(89ef07b0b9a25f097ff130a690b7b14c))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@5.9.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.3.7(typescript@5.9.3))(vue@3.5.40(typescript@5.9.3))(yaml@2.9.0) - '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) - '@vue/shared': 3.5.39 + '@nuxt/telemetry': 2.8.0(@nuxt/kit@4.5.0(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))) + '@nuxt/vite-builder': 4.5.0(@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.29.0))(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.9.5)(esbuild@0.28.0)(eslint@9.39.5(jiti@2.7.0))(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.5.0(d0b081e3ea844aa3953445e0cdf8d794))(optionator@0.9.4)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2))(terser@5.46.2)(tsx@4.23.1)(typescript@5.9.3)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue-tsc@3.2.7(typescript@5.9.3))(vue@3.5.40(typescript@5.9.3))(yaml@2.9.0) + '@unhead/vue': 3.2.1(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(crossws@0.4.10(srvx@0.11.22))(esbuild@0.28.0)(lightningcss@1.32.0)(rolldown@1.2.0)(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + '@vue/shared': 3.5.40 chokidar: 5.0.0 compatx: 0.2.0 consola: 3.4.2 @@ -36371,7 +35887,7 @@ snapshots: fnv1a-64: 0.1.1 hookable: 6.1.1 ignore: 7.0.6 - impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + impound: 1.1.5(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) jiti: 2.7.0 klona: 2.0.6 knitwork: 1.3.0 @@ -36384,7 +35900,7 @@ snapshots: ofetch: 1.5.1 ohash: 2.0.11 on-change: 6.0.2 - oxc-walker: 1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + oxc-walker: 1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) pathe: 2.0.3 perfect-debounce: 2.1.0 picomatch: 4.0.5 @@ -36399,18 +35915,18 @@ snapshots: ufo: 1.6.4 ultrahtml: 1.7.0 uncrypto: 0.1.3 - unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + unctx: 3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) undici: 8.8.0 - unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unhead: 3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unimport: 6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) unrouting: 0.1.7 untyped: 2.0.0 vue: 3.5.40(typescript@5.9.3) - vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) + vue-router: 5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)) optionalDependencies: '@parcel/watcher': 2.5.6 - '@types/node': 22.19.17 + '@types/node': 25.9.5 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -36487,43 +36003,17 @@ snapshots: - webpack - xml2js - yaml - optional: true - nuxtseo-shared@5.1.3(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.0.8(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): + nuxtseo-shared@5.3.2(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): dependencies: '@clack/prompts': 1.7.0 - '@nuxt/devtools-kit': 4.0.0-alpha.3(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@nuxt/devtools-kit': 4.0.0-alpha.3(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/schema': 4.4.8 - birpc: 4.0.0 - consola: 3.4.2 - defu: 6.1.7 - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) - ofetch: 1.5.1 - pathe: 2.0.3 - pkg-types: 2.3.1 - radix3: 1.1.2 - sirv: 3.0.2 - std-env: 4.2.0 - ufo: 1.6.4 - vue: 3.5.40(typescript@6.0.3) - optionalDependencies: - nuxt-site-config: 4.0.8(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) - zod: 4.4.3 - transitivePeerDependencies: - - magicast - - vite - - nuxtseo-shared@5.3.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.0.8(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): - dependencies: - '@clack/prompts': 1.7.0 - '@nuxt/devtools-kit': 4.0.0-alpha.3(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/schema': 4.4.8 + '@nuxt/schema': 4.5.0 birpc: 4.0.0 consola: 3.4.2 defu: 6.1.7 - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + nuxt: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) nypm: 0.6.8 ofetch: 1.5.1 pathe: 2.0.3 @@ -36534,48 +36024,26 @@ snapshots: ufo: 1.6.4 vue: 3.5.40(typescript@6.0.3) optionalDependencies: - nuxt-site-config: 4.0.8(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) zod: 4.4.3 transitivePeerDependencies: + - magic-string - magicast + - oxc-parser + - rolldown + - unplugin - vite - nuxtseo-shared@5.3.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76))(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76): - dependencies: - '@clack/prompts': 1.7.0 - '@nuxt/devtools-kit': 4.0.0-alpha.3(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/schema': 4.4.8 - birpc: 4.0.0 - consola: 3.4.2 - defu: 6.1.7 - nuxt: 4.4.4(09b09526fd1ab36005775ddf9e14e3ce) - nypm: 0.6.8 - ofetch: 1.5.1 - pathe: 2.0.3 - pkg-types: 2.3.1 - radix3: 1.1.2 - sirv: 3.0.2 - std-env: 4.2.0 - ufo: 1.6.4 - vue: 3.5.40(typescript@6.0.3) - optionalDependencies: - nuxt-site-config: 4.1.1(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) - zod: 3.25.76 - transitivePeerDependencies: - - magicast - - vite - - nuxtseo-shared@5.3.2(@nuxt/schema@4.4.8)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): + nuxtseo-shared@5.3.2(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): dependencies: '@clack/prompts': 1.7.0 - '@nuxt/devtools-kit': 4.0.0-alpha.3(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@nuxt/devtools-kit': 4.0.0-alpha.3(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) - '@nuxt/schema': 4.4.8 + '@nuxt/schema': 4.5.0 birpc: 4.0.0 consola: 3.4.2 defu: 6.1.7 - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + nuxt: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) nypm: 0.6.8 ofetch: 1.5.1 pathe: 2.0.3 @@ -36586,22 +36054,26 @@ snapshots: ufo: 1.6.4 vue: 3.5.40(typescript@6.0.3) optionalDependencies: - nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) + nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magic-string@0.30.21)(magicast@0.5.3)(nuxt@4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5))(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) zod: 4.4.3 transitivePeerDependencies: + - magic-string - magicast + - oxc-parser + - rolldown + - unplugin - vite - nuxtseo-shared@5.3.2(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3))(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3): + nuxtseo-shared@5.3.2(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt-site-config@4.1.1(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76))(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76): dependencies: '@clack/prompts': 1.7.0 - '@nuxt/devtools-kit': 4.0.0-alpha.3(magicast@0.5.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + '@nuxt/devtools-kit': 4.0.0-alpha.3(magic-string@1.0.0)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) '@nuxt/kit': 4.4.8(magicast@0.5.3) '@nuxt/schema': 4.5.0 birpc: 4.0.0 consola: 3.4.2 defu: 6.1.7 - nuxt: 4.4.4(7d1ca556969269fd1f41ac0abb31bc74) + nuxt: 4.4.4(09b09526fd1ab36005775ddf9e14e3ce) nypm: 0.6.8 ofetch: 1.5.1 pathe: 2.0.3 @@ -36612,10 +36084,14 @@ snapshots: ufo: 1.6.4 vue: 3.5.40(typescript@6.0.3) optionalDependencies: - nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magicast@0.5.3)(nuxt@4.4.4(7d1ca556969269fd1f41ac0abb31bc74))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@4.4.3) - zod: 4.4.3 + nuxt-site-config: 4.1.1(@nuxt/schema@4.5.0)(magic-string@1.0.0)(magicast@0.5.3)(nuxt@4.4.4(09b09526fd1ab36005775ddf9e14e3ce))(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3))(zod@3.25.76) + zod: 3.25.76 transitivePeerDependencies: + - magic-string - magicast + - oxc-parser + - rolldown + - unplugin - vite nypm@0.6.6: @@ -36865,6 +36341,29 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.140.0 '@oxc-parser/binding-win32-x64-msvc': 0.140.0 + oxc-parser@0.82.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2): + dependencies: + '@oxc-project/types': 0.82.3 + optionalDependencies: + '@oxc-parser/binding-android-arm64': 0.82.3 + '@oxc-parser/binding-darwin-arm64': 0.82.3 + '@oxc-parser/binding-darwin-x64': 0.82.3 + '@oxc-parser/binding-freebsd-x64': 0.82.3 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.82.3 + '@oxc-parser/binding-linux-arm-musleabihf': 0.82.3 + '@oxc-parser/binding-linux-arm64-gnu': 0.82.3 + '@oxc-parser/binding-linux-arm64-musl': 0.82.3 + '@oxc-parser/binding-linux-riscv64-gnu': 0.82.3 + '@oxc-parser/binding-linux-s390x-gnu': 0.82.3 + '@oxc-parser/binding-linux-x64-gnu': 0.82.3 + '@oxc-parser/binding-linux-x64-musl': 0.82.3 + '@oxc-parser/binding-wasm32-wasi': 0.82.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + '@oxc-parser/binding-win32-arm64-msvc': 0.82.3 + '@oxc-parser/binding-win32-x64-msvc': 0.82.3 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + oxc-transform@0.128.0: optionalDependencies: '@oxc-transform/binding-android-arm-eabi': 0.128.0 @@ -36909,22 +36408,6 @@ snapshots: - vite - webpack - oxc-walker@1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): - dependencies: - magic-regexp: 0.11.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - optionalDependencies: - oxc-parser: 0.140.0 - rolldown: 1.1.5 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rollup - - unloader - - vite - - webpack - oxc-walker@1.0.0(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: magic-regexp: 0.11.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) @@ -37165,7 +36648,7 @@ snapshots: pnpm-workspace-yaml@0.3.1: dependencies: - yaml: 2.8.4 + yaml: 2.9.0 point-in-polygon-hao@1.2.4: dependencies: @@ -37189,7 +36672,7 @@ snapshots: postcss-colormin@7.0.10(postcss@8.5.19): dependencies: '@colordx/core': 5.4.3 - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 postcss: 8.5.19 postcss-value-parser: 4.2.0 @@ -37197,20 +36680,20 @@ snapshots: postcss-colormin@8.0.1(postcss@8.5.19): dependencies: '@colordx/core': 5.4.3 - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 4.0.0 postcss: 8.5.19 postcss-value-parser: 4.2.0 postcss-convert-values@7.0.12(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.19 postcss-value-parser: 4.2.0 postcss-convert-values@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.19 postcss-value-parser: 4.2.0 @@ -37262,7 +36745,7 @@ snapshots: postcss-merge-rules@7.0.11(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 cssnano-utils: 5.0.3(postcss@8.5.19) postcss: 8.5.19 @@ -37270,7 +36753,7 @@ snapshots: postcss-merge-rules@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 4.0.0 cssnano-utils: 6.0.1(postcss@8.5.19) postcss: 8.5.19 @@ -37302,21 +36785,21 @@ snapshots: postcss-minify-params@7.0.9(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 cssnano-utils: 5.0.3(postcss@8.5.19) postcss: 8.5.19 postcss-value-parser: 4.2.0 postcss-minify-params@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 cssnano-utils: 6.0.1(postcss@8.5.19) postcss: 8.5.19 postcss-value-parser: 4.2.0 postcss-minify-selectors@7.1.1(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 cssesc: 3.0.0 postcss: 8.5.19 @@ -37324,7 +36807,7 @@ snapshots: postcss-minify-selectors@8.0.2(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 4.0.0 cssesc: 3.0.0 postcss: 8.5.19 @@ -37395,13 +36878,13 @@ snapshots: postcss-normalize-unicode@7.0.9(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.19 postcss-value-parser: 4.2.0 postcss-normalize-unicode@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.19 postcss-value-parser: 4.2.0 @@ -37439,13 +36922,13 @@ snapshots: postcss-reduce-initial@7.0.9(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 postcss: 8.5.19 postcss-reduce-initial@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 4.0.0 postcss: 8.5.19 @@ -37998,11 +37481,11 @@ snapshots: reka-ui@2.10.1(vue@3.5.40(typescript@6.0.3)): dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.8.0 '@floating-ui/vue': 1.1.11(vue@3.5.40(typescript@6.0.3)) '@internationalized/date': 3.12.1 '@internationalized/number': 3.6.6 - '@tanstack/vue-virtual': 3.13.24(vue@3.5.40(typescript@6.0.3)) + '@tanstack/vue-virtual': 3.13.32(vue@3.5.40(typescript@6.0.3)) '@vueuse/core': 14.3.0(vue@3.5.40(typescript@6.0.3)) '@vueuse/shared': 14.3.0(vue@3.5.40(typescript@6.0.3)) aria-hidden: 1.2.6 @@ -38063,29 +37546,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-mdc@3.10.0: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - flat: 6.0.1 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - micromark: 4.0.2 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 - parse-entities: 4.0.2 - scule: 1.3.0 - stringify-entities: 4.0.4 - unified: 11.0.5 - unist-util-visit: 5.1.0 - unist-util-visit-parents: 6.0.2 - yaml: 2.8.4 - transitivePeerDependencies: - - supports-color - remark-mdc@3.11.1: dependencies: '@types/mdast': 4.0.4 @@ -38333,16 +37793,6 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-visualizer@7.0.1(rolldown@1.1.5)(rollup@4.60.2): - dependencies: - open: 11.0.0 - picomatch: 4.0.5 - source-map: 0.7.6 - yargs: 18.0.0 - optionalDependencies: - rolldown: 1.1.5 - rollup: 4.60.2 - rollup-plugin-visualizer@7.0.1(rolldown@1.2.0)(rollup@4.60.2): dependencies: open: 11.0.0 @@ -38353,15 +37803,6 @@ snapshots: rolldown: 1.2.0 rollup: 4.60.2 - rollup-plugin-visualizer@7.0.1(rollup@4.60.2): - dependencies: - open: 11.0.0 - picomatch: 4.0.5 - source-map: 0.7.6 - yargs: 18.0.0 - optionalDependencies: - rollup: 4.60.2 - rollup-pluginutils@2.8.2: dependencies: estree-walker: 0.6.1 @@ -38446,7 +37887,7 @@ snapshots: safer-buffer@2.1.2: {} - satori@0.28.0: + satori@0.19.3: dependencies: '@shuding/opentype.js': 1.4.0-beta.0 css-background-parser: 0.1.0 @@ -38761,11 +38202,6 @@ snapshots: sisteransi@1.0.5: {} - site-config-stack@4.0.8(vue@3.5.40(typescript@6.0.3)): - dependencies: - ufo: 1.6.4 - vue: 3.5.40(typescript@6.0.3) - site-config-stack@4.1.1(vue@3.5.40(typescript@6.0.3)): dependencies: ufo: 1.6.4 @@ -39038,20 +38474,15 @@ snapshots: client-only: 0.0.1 react: 19.2.5 - styled-jsx@5.1.6(react@19.2.7): - dependencies: - client-only: 0.0.1 - react: 19.2.7 - stylehacks@7.0.11(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.19 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.4 stylehacks@8.0.1(postcss@8.5.19): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.19 postcss-selector-parser: 7.1.4 @@ -39248,8 +38679,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyqueue@2.0.3: {} @@ -39541,38 +38972,50 @@ snapshots: magic-string: 0.30.21 unplugin: 2.3.11 - unctx@3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): + unctx@3.0.0(magic-string@0.30.21)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): optionalDependencies: - magic-string: 1.0.0 - oxc-parser: 0.140.0 + magic-string: 0.30.21 + oxc-parser: 0.128.0 rolldown: 1.2.0 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - optional: true + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unctx@3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): + unctx@3.0.0(magic-string@0.30.21)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): optionalDependencies: - magic-string: 1.0.0 - oxc-parser: 0.140.0 + magic-string: 0.30.21 + oxc-parser: 0.135.0 rolldown: 1.2.0 unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unctx@3.0.0(oxc-parser@0.128.0)(rolldown@1.2.0): + unctx@3.0.0(magic-string@0.30.21)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): optionalDependencies: - oxc-parser: 0.128.0 + magic-string: 0.30.21 + oxc-parser: 0.140.0 rolldown: 1.2.0 + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + optional: true - unctx@3.0.0(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): + unctx@3.0.0(magic-string@0.30.21)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): optionalDependencies: - oxc-parser: 0.128.0 + magic-string: 0.30.21 + oxc-parser: 0.140.0 rolldown: 1.2.0 unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unctx@3.0.0(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): + unctx@3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): optionalDependencies: + magic-string: 1.0.0 + oxc-parser: 0.140.0 rolldown: 1.2.0 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) optional: true + unctx@3.0.0(magic-string@1.0.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))): + optionalDependencies: + magic-string: 1.0.0 + oxc-parser: 0.140.0 + rolldown: 1.2.0 + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + underscore@1.13.8: {} undici-types@5.28.4: {} @@ -39617,22 +39060,6 @@ snapshots: dependencies: pathe: 2.0.3 - unhead@3.2.1(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): - dependencies: - hookable: 6.1.1 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - optionalDependencies: - vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - webpack - unhead@3.2.1(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: hookable: 6.1.1 @@ -39694,23 +39121,6 @@ snapshots: ohash: 2.0.11 unimport@5.7.0: - dependencies: - acorn: 8.16.0 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - local-pkg: 1.1.2 - magic-string: 0.30.21 - mlly: 1.8.2 - pathe: 2.0.3 - picomatch: 4.0.5 - pkg-types: 2.3.1 - scule: 1.3.0 - strip-literal: 3.1.0 - tinyglobby: 0.2.17 - unplugin: 2.3.11 - unplugin-utils: 0.3.1 - - unimport@6.2.0(esbuild@0.28.0)(oxc-parser@0.128.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: acorn: 8.17.0 escape-string-regexp: 5.0.0 @@ -39724,20 +39134,8 @@ snapshots: scule: 1.3.0 strip-literal: 3.1.0 tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.1 - optionalDependencies: - oxc-parser: 0.128.0 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack + unplugin: 2.3.11 + unplugin-utils: 0.3.2 unimport@6.2.0(esbuild@0.28.0)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: @@ -39768,35 +39166,6 @@ snapshots: - vite - webpack - unimport@6.3.1(esbuild@0.28.0)(oxc-parser@0.128.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): - dependencies: - acorn: 8.17.0 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - local-pkg: 1.2.1 - magic-string: 0.30.21 - mlly: 1.8.2 - pathe: 2.0.3 - picomatch: 4.0.5 - pkg-types: 2.3.1 - scule: 1.3.0 - strip-literal: 3.1.0 - tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.2 - optionalDependencies: - oxc-parser: 0.128.0 - rolldown: 1.1.5 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rollup - - unloader - - vite - - webpack - unimport@6.3.1(esbuild@0.28.0)(oxc-parser@0.128.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: acorn: 8.17.0 @@ -39826,35 +39195,6 @@ snapshots: - vite - webpack - unimport@6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): - dependencies: - acorn: 8.17.0 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - local-pkg: 1.2.1 - magic-string: 0.30.21 - mlly: 1.8.2 - pathe: 2.0.3 - picomatch: 4.0.5 - pkg-types: 2.3.1 - scule: 1.3.0 - strip-literal: 3.1.0 - tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.2 - optionalDependencies: - oxc-parser: 0.140.0 - rolldown: 1.1.5 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rollup - - unloader - - vite - - webpack - unimport@6.3.1(esbuild@0.28.0)(oxc-parser@0.140.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: acorn: 8.17.0 @@ -39981,16 +39321,28 @@ snapshots: unpipe@1.0.0: {} - unplugin-auto-import@21.0.0(@nuxt/kit@4.4.8(magicast@0.5.3))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))): + unplugin-auto-import@21.0.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))): dependencies: - local-pkg: 1.1.2 + local-pkg: 1.2.1 magic-string: 0.30.21 picomatch: 4.0.5 unimport: 5.7.0 unplugin: 2.3.11 - unplugin-utils: 0.3.1 + unplugin-utils: 0.3.2 optionalDependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + '@vueuse/core': 14.3.0(vue@3.5.40(typescript@6.0.3)) + + unplugin-auto-import@21.0.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3))): + dependencies: + local-pkg: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.5 + unimport: 5.7.0 + unplugin: 2.3.11 + unplugin-utils: 0.3.2 + optionalDependencies: + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) '@vueuse/core': 14.3.0(vue@3.5.40(typescript@6.0.3)) unplugin-swc@1.5.9(@swc/core@1.15.43(@swc/helpers@0.5.21))(rollup@4.60.2): @@ -40012,20 +39364,20 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.5 - unplugin-vue-components@32.1.0(@nuxt/kit@4.4.8(magicast@0.5.3))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)): + unplugin-vue-components@32.1.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)): dependencies: chokidar: 5.0.0 local-pkg: 1.2.1 magic-string: 0.30.21 mlly: 1.8.2 - obug: 2.1.1 + obug: 2.1.3 picomatch: 4.0.5 tinyglobby: 0.2.17 unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.1 + unplugin-utils: 0.3.2 vue: 3.5.40(typescript@6.0.3) optionalDependencies: - '@nuxt/kit': 4.4.8(magicast@0.5.3) + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -40037,29 +39389,43 @@ snapshots: - vite - webpack - unplugin@2.3.11: + unplugin-vue-components@32.1.0(@nuxt/kit@4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))))(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)): dependencies: - '@jridgewell/remapping': 2.3.5 - acorn: 8.17.0 + chokidar: 5.0.0 + local-pkg: 1.2.1 + magic-string: 0.30.21 + mlly: 1.8.2 + obug: 2.1.3 picomatch: 4.0.5 - webpack-virtual-modules: 0.6.2 + tinyglobby: 0.2.17 + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin-utils: 0.3.2 + vue: 3.5.40(typescript@6.0.3) + optionalDependencies: + '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.140.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) + transitivePeerDependencies: + - '@farmfe/core' + - '@rspack/core' + - bun-types-no-globals + - esbuild + - rolldown + - rollup + - unloader + - vite + - webpack - unplugin@3.0.0: + unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 + acorn: 8.17.0 picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 - unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): + unplugin@3.0.0: dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 - optionalDependencies: - esbuild: 0.28.0 - rolldown: 1.1.5 - rollup: 4.60.2 - vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)): dependencies: @@ -40165,12 +39531,6 @@ snapshots: lru-cache: 11.3.5 ofetch: 2.0.0-alpha.3 - unstorage@2.0.0-alpha.7(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(ofetch@2.0.0-alpha.3): - optionalDependencies: - db0: 0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)) - ioredis: 5.10.1 - ofetch: 2.0.0-alpha.3 - untun@0.1.3: dependencies: citty: 0.1.6 @@ -40484,7 +39844,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.13.0(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.2.7(typescript@5.9.3)): + vite-plugin-checker@0.13.0(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3)): dependencies: '@babel/code-frame': 7.29.0 chokidar: 4.0.3 @@ -40499,47 +39859,45 @@ snapshots: optionalDependencies: eslint: 9.39.5(jiti@2.7.0) optionator: 0.9.4 - typescript: 5.9.3 - vue-tsc: 3.2.7(typescript@5.9.3) + typescript: 6.0.3 + vue-tsc: 3.3.7(typescript@6.0.3) - vite-plugin-checker@0.13.0(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@6.0.3)): + vite-plugin-checker@0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@5.9.3)): dependencies: - '@babel/code-frame': 7.29.0 - chokidar: 4.0.3 + '@babel/code-frame': 7.29.7 + chokidar: 5.0.0 npm-run-path: 6.0.0 picocolors: 1.1.1 picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - tinyglobby: 0.2.17 - vite: 7.3.2(@types/node@25.9.5)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vscode-uri: 3.1.0 + vite: 8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) optionalDependencies: eslint: 9.39.5(jiti@2.7.0) optionator: 0.9.4 - typescript: 6.0.3 - vue-tsc: 3.3.7(typescript@6.0.3) + typescript: 5.9.3 + vue-tsc: 3.3.7(typescript@5.9.3) + optional: true - vite-plugin-checker@0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.3.7(typescript@5.9.3)): + vite-plugin-checker@0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.2.7(typescript@5.9.3)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chokidar: 5.0.0 npm-run-path: 6.0.0 picocolors: 1.1.1 picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) optionalDependencies: eslint: 9.39.5(jiti@2.7.0) optionator: 0.9.4 typescript: 5.9.3 - vue-tsc: 3.3.7(typescript@5.9.3) - optional: true + vue-tsc: 3.2.7(typescript@5.9.3) vite-plugin-checker@0.14.4(eslint@9.39.5(jiti@2.7.0))(optionator@0.9.4)(typescript@6.0.3)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue-tsc@3.2.7(typescript@6.0.3)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chokidar: 5.0.0 npm-run-path: 6.0.0 picocolors: 1.1.1 @@ -40664,7 +40022,7 @@ snapshots: vue: 3.5.40(typescript@5.9.3) optional: true - vite-plugin-vue-tracer@1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)): + vite-plugin-vue-tracer@1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.1.0 @@ -40672,9 +40030,9 @@ snapshots: pathe: 2.0.3 source-map-js: 1.2.1 vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vue: 3.5.33(typescript@5.9.3) + vue: 3.5.33(typescript@6.0.3) - vite-plugin-vue-tracer@1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)): + vite-plugin-vue-tracer@1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.1.0 @@ -40682,7 +40040,7 @@ snapshots: pathe: 2.0.3 source-map-js: 1.2.1 vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) - vue: 3.5.33(typescript@6.0.3) + vue: 3.5.40(typescript@5.9.3) vite-plugin-vue-tracer@1.3.0(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)): dependencies: @@ -41044,105 +40402,6 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.40(typescript@6.0.3) - vue-router@5.0.6(@vue/compiler-sfc@3.5.33)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)): - dependencies: - '@babel/generator': 7.29.1 - '@vue-macros/common': 3.1.2(vue@3.5.33(typescript@6.0.3)) - '@vue/devtools-api': 8.1.1 - ast-walker-scope: 0.8.3 - chokidar: 5.0.0 - json5: 2.2.3 - local-pkg: 1.1.2 - magic-string: 0.30.21 - mlly: 1.8.2 - muggle-string: 0.4.1 - pathe: 2.0.3 - picomatch: 4.0.5 - scule: 1.3.0 - tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.1 - vue: 3.5.33(typescript@6.0.3) - yaml: 2.8.4 - optionalDependencies: - '@vue/compiler-sfc': 3.5.33 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack - - vue-router@5.0.6(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)): - dependencies: - '@babel/generator': 7.29.1 - '@vue-macros/common': 3.1.2(vue@3.5.33(typescript@6.0.3)) - '@vue/devtools-api': 8.1.1 - ast-walker-scope: 0.8.3 - chokidar: 5.0.0 - json5: 2.2.3 - local-pkg: 1.1.2 - magic-string: 0.30.21 - mlly: 1.8.2 - muggle-string: 0.4.1 - pathe: 2.0.3 - picomatch: 4.0.5 - scule: 1.3.0 - tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.1.5)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.1 - vue: 3.5.33(typescript@6.0.3) - yaml: 2.8.4 - optionalDependencies: - '@vue/compiler-sfc': 3.5.40 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack - - vue-router@5.0.6(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@5.9.3)): - dependencies: - '@babel/generator': 7.29.1 - '@vue-macros/common': 3.1.2(vue@3.5.33(typescript@5.9.3)) - '@vue/devtools-api': 8.1.1 - ast-walker-scope: 0.8.3 - chokidar: 5.0.0 - json5: 2.2.3 - local-pkg: 1.1.2 - magic-string: 0.30.21 - mlly: 1.8.2 - muggle-string: 0.4.1 - pathe: 2.0.3 - picomatch: 4.0.5 - scule: 1.3.0 - tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.1 - vue: 3.5.33(typescript@5.9.3) - yaml: 2.8.4 - optionalDependencies: - '@vue/compiler-sfc': 3.5.40 - transitivePeerDependencies: - - '@farmfe/core' - - '@rspack/core' - - bun-types-no-globals - - esbuild - - rolldown - - rollup - - unloader - - vite - - webpack - vue-router@5.0.6(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.33(typescript@6.0.3)): dependencies: '@babel/generator': 7.29.1 @@ -41176,10 +40435,10 @@ snapshots: - vite - webpack - vue-router@5.1.0(@vue/compiler-sfc@3.5.33)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)): + vue-router@5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)): dependencies: '@babel/generator': 8.0.0 - '@vue-macros/common': 3.1.2(vue@3.5.40(typescript@6.0.3)) + '@vue-macros/common': 3.1.4(vue@3.5.40(typescript@5.9.3)) '@vue/devtools-api': 8.1.5 ast-walker-scope: 0.9.0 chokidar: 5.0.0 @@ -41188,17 +40447,18 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 muggle-string: 0.4.1 + nostics: 1.2.0 pathe: 2.0.3 picomatch: 4.0.5 scule: 1.3.0 tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - unplugin-utils: 0.3.1 - vue: 3.5.40(typescript@6.0.3) + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin-utils: 0.3.2 + vue: 3.5.40(typescript@5.9.3) yaml: 2.9.0 optionalDependencies: - '@vue/compiler-sfc': 3.5.33 - vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + '@vue/compiler-sfc': 3.5.40 + vite: 8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -41208,8 +40468,9 @@ snapshots: - rollup - unloader - webpack + optional: true - vue-router@5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)): + vue-router@5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@5.9.3)): dependencies: '@babel/generator': 8.0.0 '@vue-macros/common': 3.1.4(vue@3.5.40(typescript@5.9.3)) @@ -41226,13 +40487,13 @@ snapshots: picomatch: 4.0.5 scule: 1.3.0 tinyglobby: 0.2.17 - unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) + unplugin: 3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) unplugin-utils: 0.3.2 vue: 3.5.40(typescript@5.9.3) yaml: 2.9.0 optionalDependencies: '@vue/compiler-sfc': 3.5.40 - vite: 8.1.4(@types/node@22.19.17)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@farmfe/core' - '@rspack/core' @@ -41242,7 +40503,6 @@ snapshots: - rollup - unloader - webpack - optional: true vue-router@5.2.0(@vue/compiler-sfc@3.5.40)(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))(vue@3.5.40(typescript@6.0.3)): dependencies: @@ -41312,16 +40572,6 @@ snapshots: '@vue/language-core': 3.3.7 typescript: 6.0.3 - vue@3.5.33(typescript@5.9.3): - dependencies: - '@vue/compiler-dom': 3.5.33 - '@vue/compiler-sfc': 3.5.33 - '@vue/runtime-dom': 3.5.33 - '@vue/server-renderer': 3.5.33(vue@3.5.33(typescript@5.9.3)) - '@vue/shared': 3.5.33 - optionalDependencies: - typescript: 5.9.3 - vue@3.5.33(typescript@6.0.3): dependencies: '@vue/compiler-dom': 3.5.33 From 162745b97b4b9a34b6c95710af2d96342e16308e Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Fri, 24 Jul 2026 15:48:51 +0100 Subject: [PATCH 02/11] fix: sync lockfile with committed package.json specifiers --- pnpm-lock.yaml | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b1432b1..7e3a0170 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,10 +85,7 @@ importers: version: 12.11.1 docus: specifier: ^5.12.3 - version: 5.12.3(c6cde3b888115f62b3451ac8d038e704) - evlog: - specifier: workspace:* - version: link:../../packages/evlog + version: 5.12.3(e1bb249dd6de9d4db5840172da917fe9) motion-v: specifier: ^2.3.0 version: 2.3.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3)))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.40(typescript@6.0.3)) @@ -96,13 +93,13 @@ importers: specifier: ^4.4.4 version: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) nuxt-studio: - specifier: ^1.6.1 + specifier: ^1.7.0 version: 1.7.0(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)))(vue@3.5.40(typescript@6.0.3)) satori: - specifier: ^0.19.3 - version: 0.19.3 + specifier: ^0.28.0 + version: 0.28.2 shaders: - specifier: ^2.5.109 + specifier: ^2.5.135 version: 2.5.135(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.12)(svelte@5.55.5(@typescript-eslint/types@8.59.1))(vue@3.5.40(typescript@6.0.3)) devDependencies: eslint: @@ -15011,8 +15008,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - satori@0.19.3: - resolution: {integrity: sha512-dKr8TNYSyceWqBoTHWntjy25xaiWMw5GF+f8QOqFsov9OpTswLs7xdbvZudGRp9jkzbhv/4mVjVZYFtpruGKiA==} + satori@0.28.2: + resolution: {integrity: sha512-AZBuptlBvlMf+EC/WI6Ss5MJwSEstrC6Pf1o5b2keg6h1QbvjStmrnJXUDGWOrfC1KSU0FApyGhF2xnBwmJRgA==} engines: {node: '>=16'} sax@1.6.0: @@ -30308,7 +30305,7 @@ snapshots: dependencies: path-type: 4.0.0 - docus@5.12.3(c6cde3b888115f62b3451ac8d038e704): + docus@5.12.3(e1bb249dd6de9d4db5840172da917fe9): dependencies: '@ai-sdk/gateway': 3.0.151(zod@4.4.3) '@ai-sdk/mcp': 1.0.62(zod@4.4.3) @@ -30340,7 +30337,7 @@ snapshots: motion-v: 2.3.0(@vueuse/core@14.3.0(vue@3.5.40(typescript@6.0.3)))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(vue@3.5.40(typescript@6.0.3)) nuxt: 4.4.4(ac9d4ea474249d9a1d9f7a4a913f28d5) nuxt-llms: 0.2.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.128.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) - nuxt-og-image: 6.6.0(4f2ce1bbeb370c12e437c8a449918cdb) + nuxt-og-image: 6.6.0(3d2f4708d9cbbec557345e3083469669) pathe: 2.0.3 pkg-types: 2.3.1 scule: 1.3.0 @@ -34942,7 +34939,7 @@ snapshots: - rolldown - unplugin - nuxt-og-image@6.6.0(4f2ce1bbeb370c12e437c8a449918cdb): + nuxt-og-image@6.6.0(3d2f4708d9cbbec557345e3083469669): dependencies: '@clack/prompts': 1.7.0 '@nuxt/kit': 4.5.0(magic-string@0.30.21)(magicast@0.5.3)(oxc-parser@0.135.0)(rolldown@1.2.0)(unplugin@3.3.0(esbuild@0.28.0)(rolldown@1.2.0)(rollup@4.60.2)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0))) @@ -34983,7 +34980,7 @@ snapshots: '@takumi-rs/core': 1.8.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) fontless: 0.2.1(db0@0.3.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9)))(ioredis@5.10.1)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) nitropack: 2.13.4(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(better-sqlite3@12.11.1)(drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260503.1)(@electric-sql/pglite@0.5.4)(@libsql/client@0.17.4)(@opentelemetry/api@1.9.1)(@types/better-sqlite3@7.6.13)(better-sqlite3@12.11.1)(bun-types@1.3.14)(kysely@0.28.17)(postgres@3.4.9))(oxc-parser@0.128.0)(rolldown@1.2.0)(srvx@0.11.22)(vite@8.1.4(@types/node@25.9.5)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.46.2)(tsx@4.23.1)(yaml@2.9.0)) - satori: 0.19.3 + satori: 0.28.2 sharp: 0.34.5 tailwindcss: 4.3.2 unifont: 0.7.4 @@ -37887,7 +37884,7 @@ snapshots: safer-buffer@2.1.2: {} - satori@0.19.3: + satori@0.28.2: dependencies: '@shuding/opentype.js': 1.4.0-beta.0 css-background-parser: 0.1.0 From 11450e54ba8115458bf5697369dbb43d4ea9d902 Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Sat, 25 Jul 2026 20:32:45 +0100 Subject: [PATCH 03/11] refactor(cli): drive map checks and suggestions from a rule registry --- .changeset/rebuild-map-command.md | 8 +- packages/cli/src/commands/map.ts | 246 ++---- packages/cli/src/core/output.ts | 3 +- packages/cli/src/lib/map/adapters/next.ts | 24 +- packages/cli/src/lib/map/adapters/nuxt.ts | 26 +- .../src/lib/map/adapters/tanstack-start.ts | 17 +- packages/cli/src/lib/map/checks/index.ts | 315 ------- packages/cli/src/lib/map/exemptions.ts | 53 +- packages/cli/src/lib/map/facts.ts | 497 ++++++++++++ packages/cli/src/lib/map/parse.ts | 173 ++-- packages/cli/src/lib/map/project-facts.ts | 184 +++++ packages/cli/src/lib/map/report.ts | 767 ++++++++++++++++++ packages/cli/src/lib/map/rules/ai-logging.ts | 56 ++ .../cli/src/lib/map/rules/audit-coverage.ts | 59 ++ packages/cli/src/lib/map/rules/audit.ts | 79 ++ .../cli/src/lib/map/rules/auth-identity.ts | 52 ++ packages/cli/src/lib/map/rules/context.ts | 42 + .../cli/src/lib/map/rules/error-catalog.ts | 74 ++ .../cli/src/lib/map/rules/error-handling.ts | 62 ++ packages/cli/src/lib/map/rules/index.ts | 231 ++++++ .../src/lib/map/rules/page-error-handling.ts | 57 ++ .../src/lib/map/rules/structured-errors.ts | 82 ++ packages/cli/src/lib/map/rules/types.ts | 152 ++++ packages/cli/src/lib/map/rules/wide-event.ts | 48 ++ packages/cli/src/lib/map/scan.ts | 137 +++- packages/cli/src/lib/map/score.ts | 42 +- packages/cli/src/lib/map/sensitivity.ts | 70 +- packages/cli/src/lib/map/types.ts | 58 +- packages/cli/test/map.command.test.ts | 141 +++- .../test/map/__snapshots__/scan.test.ts.snap | 203 +++-- packages/cli/test/map/display.test.ts | 1 + packages/cli/test/map/exemptions.test.ts | 1 + .../nuxt-basic/server/api/orders/[id].head.ts | 11 + .../nuxt-basic/server/utils/errors.ts | 10 + .../tanstack-basic/src/routes/api/checkout.ts | 6 +- packages/cli/test/map/rules.test.ts | 597 ++++++++++++++ packages/cli/test/map/scan.test.ts | 1 + 37 files changed, 3787 insertions(+), 798 deletions(-) delete mode 100644 packages/cli/src/lib/map/checks/index.ts create mode 100644 packages/cli/src/lib/map/facts.ts create mode 100644 packages/cli/src/lib/map/project-facts.ts create mode 100644 packages/cli/src/lib/map/report.ts create mode 100644 packages/cli/src/lib/map/rules/ai-logging.ts create mode 100644 packages/cli/src/lib/map/rules/audit-coverage.ts create mode 100644 packages/cli/src/lib/map/rules/audit.ts create mode 100644 packages/cli/src/lib/map/rules/auth-identity.ts create mode 100644 packages/cli/src/lib/map/rules/context.ts create mode 100644 packages/cli/src/lib/map/rules/error-catalog.ts create mode 100644 packages/cli/src/lib/map/rules/error-handling.ts create mode 100644 packages/cli/src/lib/map/rules/index.ts create mode 100644 packages/cli/src/lib/map/rules/page-error-handling.ts create mode 100644 packages/cli/src/lib/map/rules/structured-errors.ts create mode 100644 packages/cli/src/lib/map/rules/types.ts create mode 100644 packages/cli/src/lib/map/rules/wide-event.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/api/orders/[id].head.ts create mode 100644 packages/cli/test/map/fixtures/nuxt-basic/server/utils/errors.ts create mode 100644 packages/cli/test/map/rules.test.ts diff --git a/.changeset/rebuild-map-command.md b/.changeset/rebuild-map-command.md index 7c35f7e1..4a7ceabd 100644 --- a/.changeset/rebuild-map-command.md +++ b/.changeset/rebuild-map-command.md @@ -2,4 +2,10 @@ "@evlog/cli": minor --- -Add `evlog map` — a static observability score for your app, Lighthouse-style. Detects your framework (Nuxt, Nitro, Next.js App Router, or TanStack Start), scans every route, and scores wide-event coverage: `useLogger()`, request context (`log.set()`), structured errors (`createError({ why, fix })`), audit trails on sensitive routes, and error handling. Writes `evlog.map.json` to the project root (skip with `--no-write`), prints a route-by-route report with the worst offenders first (`--all` for the full list), and can gate CI with `--min-score `. +Add `evlog map` — a static observability score for your app, Lighthouse-style. Detects your framework (Nuxt, Nitro, Next.js App Router, or TanStack Start), scans every entry point, and scores wide-event coverage: `useLogger()`, request context (`log.set()`), structured errors (`createError({ why, fix })`), audit trails on sensitive routes, and error handling. + +`evlog map` prints the score, which areas of the app it comes from, and the three entry points to fix first with the file, the line, and a docs link for each. `evlog map --all` shows every entry point as a check matrix grouped by directory, and `evlog map ` explains one entry point in full: why it was scanned, why it was flagged sensitive, each rule's verdict, and the shape the handler could take in your framework. `evlog.map.json` is written to the project root (skip with `--no-write`), and `--min-score ` gates CI with an explicit pass/fail verdict. + +Coverage is checked by a rule engine rather than a bag of heuristics: each rule has a stable id, a documented weight, and a docs link, and every finding carries the exact file and line it came from. Detection is AST-based — a locally defined `useLogger()` stub or an unrelated `map.set()` call does not count as instrumentation, `log.audit?.deny()` counts as an audit record, evlog wrappers like `withEvlog` count as instrumentation, and a package only counts as sensitive when it is genuinely imported. A rule with nothing to look at reports itself as not applicable instead of passing for free, so the report never claims a handler catches errors it does not have, and the suggested shape is composed from the rules themselves — the audit action is read off the route, and a page fix stays inline instead of being wrapped in a server handler. + +The report also suggests going further with evlog features the project has already adopted: promoting an error that is spelled out identically in several handlers into an entry of your existing catalog, extending an existing audit trail to a state change it does not cover yet, and installing `evlog/ai` or `evlog/better-auth` when those packages are dependencies. Suggestions only appear once you use the feature somewhere, they are gated on evidence rather than on file names, and they never change the score — a `--min-score` gate cannot fail because of one. Setup-once suggestions are reported once for the whole project instead of on every entry point that could benefit. diff --git a/packages/cli/src/commands/map.ts b/packages/cli/src/commands/map.ts index bd4cef0c..70ccdbf7 100644 --- a/packages/cli/src/commands/map.ts +++ b/packages/cli/src/commands/map.ts @@ -1,6 +1,6 @@ import { EvlogError } from 'evlog' import type { CliContext } from '../core/context' -import { createStyle, EXIT_FAIL } from '../core/output' +import { EXIT_FAIL } from '../core/output' import { defineEvlogCommand } from '../lib/command' import type { CliDebug } from '../lib/debug' import { createNoopCliDebug } from '../lib/debug' @@ -8,11 +8,17 @@ import { cliErrors } from '../lib/errors' import { resolveEvlog, resolveProject } from '../lib/project' import type { ProjectInfo } from '../lib/project' import { detectFramework } from '../lib/map/detect' -import { classifyRouteObservability, gradeFromScore, routeCheckChips, topIssue } from '../lib/map/score' +import { + findEntryPoint, + formatEntryPointNotFound, + formatGate, + formatMapInspect, + formatMapMatrix, + formatMapReport as formatMapReportView, + formatMapWarnings, +} from '../lib/map/report' import { scan } from '../lib/map/scan' -import { sensitivityBadge, sensitivityLabel } from '../lib/map/sensitivity' -import type { CheckId, CheckResult, Framework, RouteEntry, ScanContext, ScanResult } from '../lib/map/types' -import { frameworkLabel } from '../lib/map/utils' +import type { Framework, ScanContext, ScanResult } from '../lib/map/types' import { writeMapFile } from '../lib/map/write' const FRAMEWORKS: readonly Framework[] = ['nuxt', 'nitro', 'next', 'tanstack-start'] @@ -91,197 +97,41 @@ export async function runMap( } } -const COL = { method: 6, path: 26, score: 5, badge: 2 } as const - -function stripAnsi(text: string): string { - return text.replace(/\u001B\[[0-9;]*m/g, '') -} - -function padVisible(text: string, width: number): string { - const len = stripAnsi(text).length - if (len >= width) return text - return text + ' '.repeat(width - len) -} - -function truncateVisible(text: string, width: number): string { - const plain = stripAnsi(text) - if (plain.length <= width) return text - return `${plain.slice(0, width - 1)}…` -} - -function scoreBar(score: number, width = 20): string { - const filled = Math.round((score / 100) * width) - return `${'█'.repeat(filled)}${'░'.repeat(width - filled)} ${score}/100` -} - -function gradeWord(grade: ReturnType): string { - switch (grade) { - case 'excellent': return 'excellent' - case 'good': return 'good' - case 'needs-work': return 'needs work' - case 'at-risk': return 'at risk' - } -} - -interface Finding { - text: string - location: string - impact: number - kind: 'gap' | 'dark' -} - -const CHECK_SHORT: Record = { - 'wide-event': 'useLogger', - 'context': 'log.set', - 'structured-errors': 'createError', - 'audit': 'log.audit', - 'error-handling': 'error handling', - 'page-error-handling': 'fetch error handling', -} - -function summarizeRouteFinding(route: RouteEntry): Finding | null { - if (classifyRouteObservability(route) === 'exempt') return null - - const failed = (Object.entries(route.checks) as [CheckId, CheckResult | undefined][]) - .filter(([, c]) => c?.status === 'fail') - if (failed.length === 0) return null - - const observability = classifyRouteObservability(route) - const method = route.method ?? 'ANY' - const sens = sensitivityLabel(route.sensitivity) - const sensTag = sens ? ` (${sens})` : '' - const line = failed[0]?.[1]?.evidence?.line ?? route.handler?.line ?? 1 - const chips = routeCheckChips(route) - - if (observability === 'instrumented' || observability === 'partial') { - const gaps = failed.map(([id, c]) => CHECK_SHORT[id] ?? c?.message ?? id).join(', ') - return { - kind: 'gap', - text: `${method} ${route.path}${sensTag} — has logger + context, missing: ${gaps}${chips ? ` · ${chips}` : ''}`, - location: `${route.file}:${line}`, - impact: observability === 'partial' ? 2 : 1, - } - } - - const issues = failed.map(([, c]) => c?.message ?? 'no observability').join('; ') - return { - kind: 'dark', - text: `${method} ${route.path}${sensTag} — no observability: ${issues}`, - location: `${route.file}:${line}`, - impact: 4 + (route.sensitivity.level === 'high' ? 2 : 0), - } -} - -function collectFindings(routes: RouteEntry[]): Finding[] { - const findings: Finding[] = [] - for (const route of routes) { - const summary = summarizeRouteFinding(route) - if (summary) findings.push(summary) - } - return findings.sort((a, b) => b.impact - a.impact) -} - /** - * On-brand map report: score, route table (worst first), top findings. - * Command header is owned by {@link defineEvlogCommand}. + * Pick the view for the flags that were passed. + * + * The three views answer three different questions — "how am I doing", "show me + * everything", "explain this one file" — so they are separate renderers rather + * than one renderer with three modes. Rendering lives in `lib/map/report`; this + * function only routes. */ -export function formatMapReport(ctx: CliContext, result: MapResult, options: { all?: boolean } = {}): string { - const { paint } = createStyle(ctx) - const { map, grade, summary } = result.scan - const scoreColor = map.score >= 70 ? 'green' : map.score >= 50 ? 'yellow' : 'red' - const lines: string[] = [] - - lines.push(paint('dim', `${frameworkLabel(result.framework)} · ${map.projectName} · ${map.routes.length} routes`)) - for (const warning of result.frameworkWarnings) { - lines.push(paint('yellow', `⚠ ${warning}`)) - } - lines.push('') - - lines.push(`${paint('bold', String(map.score))} ${paint(scoreColor, gradeWord(grade))}`) - lines.push(paint(scoreColor, scoreBar(map.score))) - lines.push('') - - const summaryParts = [ - `${summary.instrumented} instrumented`, - summary.partial > 0 ? `${summary.partial} partial` : null, - summary.dark > 0 ? `${summary.dark} dark` : null, - summary.exempt > 0 ? `${summary.exempt} exempt` : null, - ].filter(Boolean).join(' · ') - lines.push(paint('dim', summaryParts)) - lines.push(paint('dim', '$ money · A auth · o pii · CHECKS = logger · context · audit · errors · catch')) - lines.push('') - - lines.push(paint('dim', 'ROUTES')) - const headerRow = [ - padVisible('METHOD', COL.method), - padVisible('PATH', COL.path), - padVisible('SCORE', COL.score), - padVisible('S', COL.badge), - 'CHECKS', - ].join(' ') - lines.push(paint('dim', headerRow)) - - const sorted = [...map.routes].sort((a, b) => a.score - b.score) - const shown = options.all ? sorted : sorted.slice(0, 15) +export function formatMapReport( + ctx: CliContext, + result: MapResult, + options: { all?: boolean, entry?: string, minScore?: number } = {}, +): string { + const sections: string[] = [] - for (const route of shown) { - lines.push(formatRouteLine(ctx, route)) - } - if (!options.all && sorted.length > 15) { - lines.push(paint('dim', `… and ${sorted.length - 15} more (use --all)`)) + if (result.frameworkWarnings.length > 0) { + sections.push(formatMapWarnings(ctx, result.frameworkWarnings)) } - lines.push('') - lines.push(paint('dim', 'FINDINGS')) - const findings = collectFindings(map.routes).slice(0, 5) - if (findings.length === 0) { - lines.push(paint('green', '✓ No issues')) + if (options.entry) { + const route = findEntryPoint(result.scan, options.entry) + sections.push(route + ? formatMapInspect(ctx, result.scan, route) + : formatEntryPointNotFound(ctx, result.scan, options.entry)) + } else if (options.all) { + sections.push(formatMapMatrix(ctx, result.scan)) } else { - for (const finding of findings) { - const icon = finding.kind === 'dark' ? paint('red', '✗') : paint('yellow', '!') - lines.push(`${icon} ${finding.text}`) - lines.push(` ${paint('dim', '→')} ${paint('underline', finding.location)}`) - } + sections.push(formatMapReportView(ctx, result.scan, { mapPath: result.mapPath })) } - lines.push('') - if (result.mapPath) { - lines.push(paint('dim', `Full map → ${result.mapPath}`)) + if (options.minScore !== undefined) { + sections.push(formatGate(ctx, result.scan, options.minScore)) } - lines.push(paint('dim', 'Run with --json for machine output')) - - return lines.join('\n') -} - -function formatRouteLine(ctx: CliContext, route: RouteEntry): string { - const { paint } = createStyle(ctx) - const method = (route.method ?? 'ANY').padEnd(COL.method) - const path = route.path.length > COL.path - ? `…${route.path.slice(-(COL.path - 1))}` - : route.path - const scoreColor = route.score >= 70 ? 'green' : route.score >= 50 ? 'yellow' : 'red' - const score = paint(scoreColor, String(route.score).padStart(3)) - const sens = sensitivityBadge(route.sensitivity) - const observability = classifyRouteObservability(route) - const badge = sens ? paint('magenta', sens) : observability === 'exempt' ? paint('dim', '○') : ' ' - - const checksCol = (() => { - if (observability === 'exempt') return paint('dim', 'exempt (evlog infra)') - if (observability === 'instrumented' && route.score >= 100) return paint('green', 'ok') - const chips = routeCheckChips(route) - if (chips) { - return paint(observability === 'dark' ? 'red' : 'yellow', truncateVisible(chips, 38)) - } - return paint('red', truncateVisible(topIssue(route), 38)) - })() - return [ - padVisible(method, COL.method), - padVisible(path, COL.path), - padVisible(score, COL.score), - padVisible(badge, COL.badge), - checksCol, - ].join(' ') + return sections.join('\n') } function parseFrameworkArg(value: unknown): Framework | undefined { @@ -292,6 +142,12 @@ function parseFrameworkArg(value: unknown): Framework | undefined { return value } +function parseMinScoreArg(value: unknown): number | undefined { + if (typeof value !== 'string' || value.length === 0) return undefined + const threshold = Number.parseInt(value, 10) + return Number.isNaN(threshold) ? undefined : threshold +} + /** * `evlog map` — static observability map: Lighthouse for wide events. * Logic lives in {@link runMap}; this file owns the citty surface. @@ -299,9 +155,10 @@ function parseFrameworkArg(value: unknown): Framework | undefined { export default defineEvlogCommand('map', { meta: { name: 'map', description: 'Static observability map — Lighthouse for wide events' }, args: { + entry: { type: 'positional', required: false, description: 'Inspect one entry point by route or file path' }, cwd: { type: 'string', description: 'Project directory (default: current)' }, framework: { type: 'string', description: 'Override framework detection (nuxt, nitro, next, tanstack-start)' }, - all: { type: 'boolean', description: 'Show all routes in the report' }, + all: { type: 'boolean', description: 'Every entry point, as a check matrix' }, minScore: { type: 'string', description: 'Exit 1 if the global score is below this threshold' }, // `default: true` + citty's `--no-write` negation — declaring this as `noWrite` // directly would not work: citty's parser treats any `--no-x` flag as negating @@ -334,17 +191,20 @@ export default defineEvlogCommand('map', { throw error } + const threshold = parseMinScoreArg(args.minScore) + ui.done({ jsonMode: args.json, json: { map: result.scan.map, summary: result.scan.summary, mapPath: result.mapPath }, - human: formatMapReport(ctx, result, { all: args.all }), + human: formatMapReport(ctx, result, { + all: args.all, + entry: typeof args.entry === 'string' && args.entry.length > 0 ? args.entry : undefined, + minScore: threshold, + }), }) - if (typeof args.minScore === 'string' && args.minScore.length > 0) { - const threshold = Number.parseInt(args.minScore, 10) - if (!Number.isNaN(threshold) && result.scan.map.score < threshold) { - ui.exit(EXIT_FAIL) - } + if (threshold !== undefined && result.scan.map.score < threshold) { + ui.exit(EXIT_FAIL) } }, }) diff --git a/packages/cli/src/core/output.ts b/packages/cli/src/core/output.ts index 1e9c6e64..e42feaa4 100644 --- a/packages/cli/src/core/output.ts +++ b/packages/cli/src/core/output.ts @@ -26,7 +26,8 @@ const codes = { white: '\x1B[37m', } as const -type StyleCode = keyof typeof codes +/** A style name accepted by {@link Style.paint}. */ +export type StyleCode = keyof typeof codes /** * Minimal ANSI kit bound to a {@link CliContext} — hand-rolled like diff --git a/packages/cli/src/lib/map/adapters/next.ts b/packages/cli/src/lib/map/adapters/next.ts index 26239628..30608cda 100644 --- a/packages/cli/src/lib/map/adapters/next.ts +++ b/packages/cli/src/lib/map/adapters/next.ts @@ -1,5 +1,6 @@ import type { Node } from 'oxc-parser' import { globSync } from 'tinyglobby' +import type { ParseResult } from '../parse' import { findHandlerLocation, findHttpMethodExports, @@ -26,9 +27,14 @@ function routeDirFromFile(rel: string, appDir: string): string { return inner.replace(/\/route\.(tsx?|jsx?)$/, '') } -/** Next.js App Router: `route.ts` handlers, `page.tsx`, middleware, `"use server"` actions. */ +/** + * Next.js App Router: `route.ts` handlers, `page.tsx`, middleware, `"use server"` + * actions. No auto-imports — every evlog helper is imported explicitly, and + * nothing is emitted until a handler opts in with `useLogger()` or `withEvlog()`. + */ export const nextAdapter: FrameworkAdapter = { framework: 'next', + requestLogger: 'explicit', // eslint-disable-next-line require-await -- satisfies the async FrameworkAdapter contract async extractRoutes(ctx: ScanContext): Promise { const routes: RawRouteEntry[] = [] @@ -53,7 +59,7 @@ export const nextAdapter: FrameworkAdapter = { continue } - const methods = findHttpMethodExports(parsed.program) + const methods = findHttpMethodExports(parsed) if (methods.length === 0) { routes.push({ framework: 'next', @@ -61,7 +67,7 @@ export const nextAdapter: FrameworkAdapter = { method: null, path: apiPath, file: rel, - handler: findHandlerLocation(parsed.program, parsed.source, []), + handler: findHandlerLocation(parsed, []), }) } else { for (const { method, line } of methods) { @@ -102,7 +108,7 @@ export const nextAdapter: FrameworkAdapter = { path: '*', file: rel, handler: parsed - ? findHandlerLocation(parsed.program, parsed.source, []) + ? findHandlerLocation(parsed, []) : null, }) } @@ -111,7 +117,7 @@ export const nextAdapter: FrameworkAdapter = { const parsed = parseFile(file) if (!parsed || !hasDirective(parsed.program, 'use server')) continue const rel = relativeFromRoot(root, file) - const exports = findServerActionExports(parsed.program) + const exports = findServerActionExports(parsed) for (const exp of exports) { routes.push({ framework: 'next', @@ -128,9 +134,9 @@ export const nextAdapter: FrameworkAdapter = { }, } -function findServerActionExports(program: import('oxc-parser').Program): Array<{ name: string, line: number }> { +function findServerActionExports(parsed: ParseResult): Array<{ name: string, line: number }> { const exports: Array<{ name: string, line: number }> = [] - walkAst(program, (node) => { + walkAst(parsed.program, (node) => { if (node.type === 'ExportNamedDeclaration') { const decl = node as { declaration?: { @@ -140,13 +146,13 @@ function findServerActionExports(program: import('oxc-parser').Program): Array<{ } } if (decl.declaration?.type === 'FunctionDeclaration' && decl.declaration.id?.name) { - const loc = nodeLoc(node) + const loc = nodeLoc(node, parsed.lines) exports.push({ name: decl.declaration.id.name, line: loc?.line ?? 1 }) } if (decl.declaration?.type === 'VariableDeclaration') { for (const d of decl.declaration.declarations ?? []) { if (d.id.type === 'Identifier' && d.init && (d.init.type === 'ArrowFunctionExpression' || d.init.type === 'FunctionExpression')) { - const loc = nodeLoc(d.init as Node) + const loc = nodeLoc(d.init as Node, parsed.lines) exports.push({ name: d.id.name, line: loc?.line ?? 1 }) } } diff --git a/packages/cli/src/lib/map/adapters/nuxt.ts b/packages/cli/src/lib/map/adapters/nuxt.ts index cef32e4e..68c1a91d 100644 --- a/packages/cli/src/lib/map/adapters/nuxt.ts +++ b/packages/cli/src/lib/map/adapters/nuxt.ts @@ -34,7 +34,7 @@ function fileToApiRoute(file: string, root: string): RawRouteEntry[] { const parsed = parseFile(file) const handler = parsed - ? findHandlerLocation(parsed.program, parsed.source, ['defineEventHandler', 'eventHandler']) + ? findHandlerLocation(parsed, ['defineEventHandler', 'eventHandler']) : null return [ @@ -70,7 +70,7 @@ function fileToMiddlewareRoute(file: string, root: string): RawRouteEntry { const rel = relativeFromRoot(root, file) const parsed = parseFile(file) const handler = parsed - ? findHandlerLocation(parsed.program, parsed.source, ['defineEventHandler']) + ? findHandlerLocation(parsed, ['defineEventHandler']) : null return { @@ -88,7 +88,7 @@ function fileToCronRoute(file: string, root: string): RawRouteEntry { const name = stripRouteFilename(basename(file)) const parsed = parseFile(file) const handler = parsed - ? findHandlerLocation(parsed.program, parsed.source, ['defineTask', 'defineEventHandler']) + ? findHandlerLocation(parsed, ['defineTask', 'defineEventHandler']) : null return { @@ -101,8 +101,22 @@ function fileToCronRoute(file: string, root: string): RawRouteEntry { } } +/** + * What evlog's Nuxt module auto-imports (`addImports` / `addServerImports`). + * + * An un-imported `useLogger()` or `log` is evlog's here, as long as the file + * does not declare one itself. + */ +const NUXT_EVLOG_AUTO_IMPORTS = [ + 'useLogger', + 'log', + 'createEvlogError', +] as const + export const nuxtAdapter: FrameworkAdapter = { framework: 'nuxt', + evlogAutoImports: NUXT_EVLOG_AUTO_IMPORTS, + requestLogger: 'ambient', // eslint-disable-next-line require-await -- satisfies the async FrameworkAdapter contract async extractRoutes(ctx: ScanContext): Promise { const routes: RawRouteEntry[] = [] @@ -139,6 +153,8 @@ export const nuxtAdapter: FrameworkAdapter = { /** Raw Nitro project (no Nuxt). */ export const nitroAdapter: FrameworkAdapter = { framework: 'nitro', + evlogAutoImports: NUXT_EVLOG_AUTO_IMPORTS, + requestLogger: 'ambient', // eslint-disable-next-line require-await -- satisfies the async FrameworkAdapter contract async extractRoutes(ctx: ScanContext): Promise { const routes: RawRouteEntry[] = [] @@ -167,7 +183,7 @@ export const nitroAdapter: FrameworkAdapter = { const path = segmentsToPath(segments, prefix) || '/' const parsed = parseFile(file) const handler = parsed - ? findHandlerLocation(parsed.program, parsed.source, ['defineEventHandler', 'eventHandler']) + ? findHandlerLocation(parsed, ['defineEventHandler', 'eventHandler']) : null routes.push({ @@ -185,7 +201,7 @@ export const nitroAdapter: FrameworkAdapter = { const rel = relativeFromRoot(root, file) const parsed = parseFile(file) const handler = parsed - ? findHandlerLocation(parsed.program, parsed.source, ['defineEventHandler']) + ? findHandlerLocation(parsed, ['defineEventHandler']) : null routes.push({ framework: 'nitro', diff --git a/packages/cli/src/lib/map/adapters/tanstack-start.ts b/packages/cli/src/lib/map/adapters/tanstack-start.ts index e9ea8f27..9f4a4bb5 100644 --- a/packages/cli/src/lib/map/adapters/tanstack-start.ts +++ b/packages/cli/src/lib/map/adapters/tanstack-start.ts @@ -1,6 +1,7 @@ import { basename } from 'node:path' import type { Node } from 'oxc-parser' import { globSync } from 'tinyglobby' +import type { ParseResult } from '../parse' import { findHandlerLocation, nodeLoc, parseFile, walkAst } from '../parse' import type { FrameworkAdapter, RawRouteEntry, ScanContext } from '../types' import { relativeFromRoot, segmentsToPath, stripExtension } from '../utils' @@ -26,7 +27,7 @@ function extractTanstackRoutes(file: string, root: string): RawRouteEntry[] { return routes } - const hasServerHandlers = detectServerHandlers(parsed.program) + const hasServerHandlers = detectServerHandlers(parsed) if (hasServerHandlers.length > 0) { for (const { method, line } of hasServerHandlers) { routes.push({ @@ -45,7 +46,7 @@ function extractTanstackRoutes(file: string, root: string): RawRouteEntry[] { method: null, path, file: rel, - handler: findHandlerLocation(parsed.program, parsed.source, ['createServerFn']), + handler: findHandlerLocation(parsed, ['createServerFn']), }) } else { routes.push({ @@ -61,16 +62,16 @@ function extractTanstackRoutes(file: string, root: string): RawRouteEntry[] { return routes } -function detectServerHandlers(program: import('oxc-parser').Program): Array<{ method: string, line: number }> { +function detectServerHandlers(parsed: ParseResult): Array<{ method: string, line: number }> { const handlers: Array<{ method: string, line: number }> = [] - walkAst(program, (node) => { + walkAst(parsed.program, (node) => { if (node.type !== 'Property') return const prop = node as { key: { type: string, name?: string }, value: { type: string } } if (prop.key.type === 'Identifier') { const key = prop.key.name?.toUpperCase() if (key && ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(key)) { if (prop.value.type === 'ArrowFunctionExpression' || prop.value.type === 'FunctionExpression') { - const loc = nodeLoc(prop.value as Node) + const loc = nodeLoc(prop.value as Node, parsed.lines) handlers.push({ method: key, line: loc?.line ?? 1 }) } } @@ -79,9 +80,13 @@ function detectServerHandlers(program: import('oxc-parser').Program): Array<{ me return handlers } -/** TanStack Start: `src/routes/**` file-based routes, API vs page via HTTP method props / `createServerFn`. */ +/** + * TanStack Start: `src/routes/**` file-based routes, API vs page via HTTP method + * props / `createServerFn`. No auto-imports — evlog helpers must be imported. + */ export const tanstackStartAdapter: FrameworkAdapter = { framework: 'tanstack-start', + requestLogger: 'explicit', // eslint-disable-next-line require-await -- satisfies the async FrameworkAdapter contract async extractRoutes(ctx: ScanContext): Promise { const routes: RawRouteEntry[] = [] diff --git a/packages/cli/src/lib/map/checks/index.ts b/packages/cli/src/lib/map/checks/index.ts deleted file mode 100644 index bb457b59..00000000 --- a/packages/cli/src/lib/map/checks/index.ts +++ /dev/null @@ -1,315 +0,0 @@ -import { join } from 'node:path' -import type { Node } from 'oxc-parser' -import type { CheckId, CheckResult, RawRouteEntry, RouteKind, ScanContext } from '../types' -import { shouldSkipCheck } from '../exemptions' -import { getImportBindings, isCallNamed, nodeLoc, parseFile, walkAst } from '../parse' -import { lineSnippet } from '../utils' - -const HANDLER_KINDS: RouteKind[] = ['api', 'server-action', 'middleware', 'cron'] - -export type CheckFn = ( - ctx: ScanContext, - route: RawRouteEntry, - source: string, - program: import('oxc-parser').Program, -) => CheckResult - -function na(): CheckResult { - return { status: 'n/a' } -} - -function pass(): CheckResult { - return { status: 'pass' } -} - -function fail(message: string, file: string, line: number, snippet?: string): CheckResult { - return { - status: 'fail', - message, - evidence: { file, line, snippet }, - } -} - -function isEvlogImport(bindings: Map, name: string): boolean { - const src = bindings.get(name) - return src === 'evlog' || (src?.includes('evlog') ?? false) -} - -export const checkWideEvent: CheckFn = (ctx, route, _source, program) => { - if (!HANDLER_KINDS.includes(route.kind)) return na() - if (!ctx.hasEvlog) { - return fail('evlog not installed — adopt evlog for wide events', route.file, route.handler?.line ?? 1) - } - - const bindings = getImportBindings(program) - let found = false - let line = route.handler?.line ?? 1 - - walkAst(program, (node) => { - if (found) return - if (isCallNamed(node, ['useLogger'])) { - const { callee } = (node as { callee: Node }) - if (callee.type === 'Identifier' && isEvlogImport(bindings, callee.name)) { - found = true - line = nodeLoc(node)?.line ?? line - } - if (callee.type === 'Identifier' && !bindings.has(callee.name)) { - found = true - line = nodeLoc(node)?.line ?? line - } - } - }) - - if (found) return pass() - return fail('no useLogger() — handler is a dark event', route.file, line) -} - -export const checkContext: CheckFn = (ctx, route, _source, program) => { - if (!HANDLER_KINDS.includes(route.kind)) return na() - if (!ctx.hasEvlog) { - return fail('no log.set() — adopt evlog for request context', route.file, route.handler?.line ?? 1) - } - - let found = false - let line = route.handler?.line ?? 1 - - walkAst(program, (node) => { - if (found) return - if (isCallNamed(node, ['set']) || callIsLogSet(node)) { - found = true - line = nodeLoc(node)?.line ?? line - } - }) - - if (found) return pass() - return fail('no log.set() context accumulation', route.file, line) -} - -function callIsLogSet(node: Node): boolean { - if (node.type !== 'CallExpression') return false - const { callee } = (node as { callee: Node }) - if (callee.type === 'MemberExpression') { - const obj = (callee as { object: Node }).object - const prop = (callee as { property: Node }).property - return obj.type === 'Identifier' && obj.name === 'log' && prop.type === 'Identifier' && prop.name === 'set' - } - return false -} - -export const checkStructuredErrors: CheckFn = (_ctx, route, source, program) => { - if (!HANDLER_KINDS.includes(route.kind)) return na() - - const issues: Array<{ message: string, line: number }> = [] - - walkAst(program, (node) => { - if (node.type === 'ThrowStatement') { - const arg = (node as { argument: Node | null }).argument - if (!arg) return - if (arg.type === 'NewExpression') { - const { callee } = (arg as { callee: Node }) - if (callee.type === 'Identifier' && callee.name === 'Error') { - issues.push({ message: 'throw new Error() — use createError({ why, fix })', line: nodeLoc(node)?.line ?? 1 }) - } - } - if (arg.type === 'CallExpression' && isCallNamed(arg, ['createError'])) { - const props = getObjectProps(arg) - const hasWhy = props.has('why') - const hasFix = props.has('fix') - const line = nodeLoc(node)?.line ?? 1 - if (!hasWhy && !hasFix) { - issues.push({ message: 'createError() missing why and fix', line }) - } else if (!hasFix) { - issues.push({ message: 'createError() has why but missing fix', line }) - } else if (!hasWhy) { - issues.push({ message: 'createError() has fix but missing why', line }) - } - } - } - if (node.type === 'CallExpression' && isCallNamed(node, ['createError'])) { - const props = getObjectProps(node) - const line = nodeLoc(node)?.line ?? 1 - if (!props.has('why') || !props.has('fix')) { - if (!issues.some(i => i.line === line)) { - if (!props.has('fix')) { - issues.push({ message: 'createError() has why but missing fix', line }) - } else { - issues.push({ message: 'createError() missing why and fix', line }) - } - } - } - } - }) - - if (issues.length === 0) return pass() - const first = issues[0]! - return fail(first.message, route.file, first.line, lineSnippet(source, first.line)) -} - -function getObjectProps(callNode: Node): Set { - const props = new Set() - if (callNode.type !== 'CallExpression') return props - const { arguments: args } = (callNode as { arguments: Node[] }) - const [first] = args - if (!first || first.type !== 'ObjectExpression') return props - for (const prop of (first as { properties: Node[] }).properties) { - if (prop.type === 'Property') { - const { key } = (prop as { key: Node }) - if (key.type === 'Identifier') props.add(key.name) - if (key.type === 'Literal') props.add(String((key as { value: unknown }).value)) - } - } - return props -} - -export const checkAudit: CheckFn = (_ctx, route) => { - if (!HANDLER_KINDS.includes(route.kind)) return na() - return na() -} - -export function checkAuditWithSensitivity( - ctx: ScanContext, - route: RawRouteEntry, - program: import('oxc-parser').Program, - sensitivityLevel: 'high' | 'medium' | 'none', -): CheckResult { - if (!HANDLER_KINDS.includes(route.kind)) return na() - if (sensitivityLevel !== 'high') return na() - if (!ctx.hasEvlog) { - return fail('sensitive route without log.audit()', route.file, route.handler?.line ?? 1) - } - - let found = false - walkAst(program, (node) => { - if (isCallNamed(node, ['audit']) || callIsLogAudit(node)) found = true - }) - - if (found) return pass() - return fail('has logger + context but no log.audit() — sensitive route needs audit trail', route.file, route.handler?.line ?? 1) -} - -function callIsLogAudit(node: Node): boolean { - if (node.type !== 'CallExpression') return false - const { callee } = (node as { callee: Node }) - if (callee.type === 'MemberExpression') { - const obj = (callee as { object: Node }).object - const prop = (callee as { property: Node }).property - return obj.type === 'Identifier' && obj.name === 'log' && prop.type === 'Identifier' && prop.name === 'audit' - } - return false -} - -export const checkErrorHandling: CheckFn = (_ctx, route, source, program) => { - if (!HANDLER_KINDS.includes(route.kind)) return na() - - const issues: Array<{ line: number, message: string }> = [] - - walkAst(program, (node) => { - if (node.type !== 'CatchClause') return - const { body } = (node as { body: { body: Node[] } }).body - if (body.length === 0) { - issues.push({ line: nodeLoc(node)?.line ?? 1, message: 'empty catch block swallows errors' }) - return - } - const rethrows = body.some((stmt) => { - if (stmt.type === 'ThrowStatement') return true - if (stmt.type === 'ExpressionStatement') { - const expr = (stmt as { expression: Node }).expression - if (expr.type === 'CallExpression') { - const name = (expr as { callee: Node }).callee - if (name.type === 'Identifier' && ['console', 'log'].includes(name.name)) return true - if (name.type === 'MemberExpression') { - const prop = (name as { property: Node }).property - if (prop.type === 'Identifier' && ['error', 'warn', 'set', 'audit'].includes(prop.name)) return true - } - } - } - if (stmt.type === 'ReturnStatement') return true - return false - }) - if (!rethrows) { - issues.push({ line: nodeLoc(node)?.line ?? 1, message: 'catch block swallows error without logging or rethrow' }) - } - }) - - if (issues.length === 0) return pass() - const first = issues[0]! - return fail(first.message, route.file, first.line, lineSnippet(source, first.line)) -} - -export const checkPageErrorHandling: CheckFn = (_ctx, route, source, program) => { - if (route.kind !== 'page') return na() - - const hasFetch = /useFetch|\$fetch|fetch\s*\(/.test(source) - if (!hasFetch) return na() - - let hasErrorHandling = false - walkAst(program, (node) => { - if (node.type === 'CatchClause') hasErrorHandling = true - if (isCallNamed(node, ['onError', 'catchError'])) hasErrorHandling = true - if (node.type === 'MemberExpression') { - const prop = (node as { property: Node }).property - if (prop.type === 'Identifier' && prop.name === 'catch') hasErrorHandling = true - } - }) - - if (/\.catch\s*\(/.test(source)) hasErrorHandling = true - if (/error\s*[:=]/.test(source) && /useFetch|useAsyncData/.test(source)) hasErrorHandling = true - - if (hasErrorHandling) return pass() - return fail('page data fetch without error handling', route.file, 1) -} - -export const CHECKS: Record = { - 'wide-event': checkWideEvent, - 'context': checkContext, - 'structured-errors': checkStructuredErrors, - 'audit': checkAudit, - 'error-handling': checkErrorHandling, - 'page-error-handling': checkPageErrorHandling, -} - -/** Run every relevant observability check for one route (respecting exemptions). */ -export function runChecks( - ctx: ScanContext, - route: RawRouteEntry, - sensitivityLevel: 'high' | 'medium' | 'none', -): Partial> { - const filePath = join(ctx.projectRoot, route.file) - const parsed = parseFile(filePath) - const results: Partial> = {} - - if (!parsed) { - for (const id of Object.keys(CHECKS) as CheckId[]) { - if (route.kind === 'page' && id !== 'page-error-handling') continue - if (route.kind !== 'page' && id === 'page-error-handling') continue - if (!HANDLER_KINDS.includes(route.kind) && id !== 'page-error-handling') continue - results[id] = fail('file failed to parse', route.file, 1) - } - return results - } - - if (parsed.errors.length > 0 && ctx.verbose) { - console.warn(`Parse warnings in ${route.file}: ${parsed.errors.join(', ')}`) - } - - for (const [id, fn] of Object.entries(CHECKS) as [CheckId, CheckFn][]) { - if (route.kind === 'page') { - if (id !== 'page-error-handling') continue - } else { - if (id === 'page-error-handling') continue - if (!HANDLER_KINDS.includes(route.kind)) continue - } - - const skip = shouldSkipCheck(route, id) - if (skip) { - results[id] = { status: 'n/a', message: skip.reason } - continue - } - - results[id] = id === 'audit' - ? checkAuditWithSensitivity(ctx, route, parsed.program, sensitivityLevel) - : fn(ctx, route, parsed.source, parsed.program) - } - - return results -} diff --git a/packages/cli/src/lib/map/exemptions.ts b/packages/cli/src/lib/map/exemptions.ts index d42faaee..d52bab6a 100644 --- a/packages/cli/src/lib/map/exemptions.ts +++ b/packages/cli/src/lib/map/exemptions.ts @@ -2,8 +2,14 @@ import type { CheckId, RawRouteEntry, RouteEntry } from './types' export interface RouteExemption { reason: string - /** Observability checks that do not apply to this route. */ - skipChecks: CheckId[] + /** + * Rules that do not apply to this route. + * + * `'all'` rather than a list of ids on purpose: an exemption that enumerates + * rule ids has to be revisited every time a rule is added, and forgetting is + * silent — the new rule simply starts failing on exempt routes. + */ + skip: 'all' | readonly CheckId[] } const INFRA_PATHS = [ @@ -17,47 +23,34 @@ const INFRA_FILE_PATTERNS = [ '_evlog/ingest', ] +const INFRA_EXEMPTION: RouteExemption = { + reason: 'evlog infrastructure — client log ingest endpoint', + skip: 'all', +} + /** - * Routes that are evlog plumbing (client ingest, internal handlers) — not app handlers. - * Observability checks are n/a, not failures. + * Routes that are evlog plumbing (client ingest, internal handlers) — not app + * handlers. Observability rules are n/a, not failures. */ export function getRouteExemption(route: Pick): RouteExemption | null { const path = route.path.toLowerCase() const file = route.file.toLowerCase() - for (const pattern of INFRA_PATHS) { - if (path.includes(pattern)) { - return { - reason: 'evlog infrastructure — client log ingest endpoint', - skipChecks: ['wide-event', 'context', 'audit', 'structured-errors', 'error-handling'], - } - } - } - - for (const pattern of INFRA_FILE_PATTERNS) { - if (file.includes(pattern)) { - return { - reason: 'evlog infrastructure — client log ingest endpoint', - skipChecks: ['wide-event', 'context', 'audit', 'structured-errors', 'error-handling'], - } - } - } + if (INFRA_PATHS.some(pattern => path.includes(pattern))) return INFRA_EXEMPTION + if (INFRA_FILE_PATTERNS.some(pattern => file.includes(pattern))) return INFRA_EXEMPTION return null } -export function isInfrastructureRoute(route: Pick): boolean { - return getRouteExemption(route) !== null +/** Whether an exemption covers a given rule. */ +export function isSkipped(exemption: RouteExemption, id: CheckId): boolean { + return exemption.skip === 'all' || exemption.skip.includes(id) } -export function shouldSkipCheck(route: Pick, checkId: CheckId): RouteExemption | null { - const exemption = getRouteExemption(route) - if (!exemption) return null - if (exemption.skipChecks.includes(checkId)) return exemption - return null +export function isInfrastructureRoute(route: Pick): boolean { + return getRouteExemption(route) !== null } export function infrastructureLabel(route: RouteEntry): string { - const exemption = getRouteExemption(route) - return exemption ? 'infra' : '' + return getRouteExemption(route) ? 'infra' : '' } diff --git a/packages/cli/src/lib/map/facts.ts b/packages/cli/src/lib/map/facts.ts new file mode 100644 index 00000000..292861c6 --- /dev/null +++ b/packages/cli/src/lib/map/facts.ts @@ -0,0 +1,497 @@ +import type { Node } from 'oxc-parser' +import type { ParseResult } from './parse' +import { walkAst } from './parse' +import type { HandlerLocation } from './types' + +/** + * Everything the rules are allowed to know about one file. + * + * All AST decoding lives here, in a single pass, so that rules never walk the + * tree themselves. That is deliberate: hand-rolled node spelunking scattered + * across rules is what makes a static analyser fragile, because each rule ends + * up with its own slightly different idea of what "a call to log.set()" means. + * One place to get it right, one place to fix when it is wrong. + */ +export interface FileFacts { + /** Local binding → import source, e.g. `useLogger` → `evlog`. */ + imports: Map + /** Names declared in this file — used to detect shadowing of auto-imports. */ + localDeclarations: Set + calls: readonly CallFact[] + throws: readonly ThrowFact[] + catches: readonly CatchFact[] + /** Network calls (`fetch`, `$fetch`, `useFetch`, `axios.*`, …). */ + network: readonly CallFact[] + /** Where an evlog logger is created, if it is. */ + loggerInit: HandlerLocation | null + /** Identifiers holding an evlog logger — `const log = useLogger(event)`. */ + loggerBindings: ReadonlySet + /** + * evlog wrappers used here, e.g. `withEvlog`, `withAudit`. + * + * These instrument the event without the handler ever naming a logger, which + * is exactly how evlog documents its Next.js integration — so a rule that + * only looks for `useLogger()` would flag evlog's own recommended code. + */ + evlogWrappers: ReadonlySet + /** evlog entrypoints imported here, e.g. `evlog`, `evlog/ai`. */ + evlogImports: ReadonlySet + /** Object keys and member names seen anywhere — cheap PII surface. */ + names: ReadonlySet + /** True when a network result is destructured with an `error` binding. */ + destructuresNetworkError: boolean + /** `createError({ … })` calls with enough literal detail to compare. */ + inlineErrors: readonly InlineErrorFact[] + /** Catalog names declared here — `billing` for `defineErrorCatalog('billing', …)`. */ + catalogsDeclared: readonly string[] + /** Calls on a known evlog logger, e.g. `loggerCalls('audit')`. */ + loggerCalls: (member: string) => readonly CallFact[] + /** Calls by normalized callee name, e.g. `callsTo('createError')`. */ + callsTo: (name: string) => readonly CallFact[] +} + +export interface CallFact { + /** Normalized callee: `useLogger`, `log.set`, `console.error`. */ + name: string + /** Trailing member for member calls (`set`), else the identifier. */ + member: string + /** Receiver identifier for member calls (`log`), else `null`. */ + receiver: string | null + /** + * Root identifier of the callee chain — `log` in `log.audit?.deny()`. + * + * Separate from `receiver`, which is only the immediate object: without this, + * a nested or optional chain loses track of who the call is really on. + */ + root: string | null + /** Member names from the root — `['audit', 'deny']` for `log.audit?.deny()`. */ + chain: readonly string[] + line: number + /** Keys of the first argument when it is an object literal. */ + props: ReadonlySet +} + +export interface ThrowFact { + kind: 'plain-error' | 'create-error' | 'other' + /** Keys passed to `createError({ … })`. */ + props: ReadonlySet + line: number +} + +/** + * One `createError({ … })` call, identified by its literal payload. + * + * The signature exists so the same error can be recognised in two different + * files. That is the only honest reason to bring up error catalogs: an error + * written once is fine where it is, whereas the same error written out in three + * handlers is a catalog entry waiting to happen. + */ +export interface InlineErrorFact { + /** Literal status/code/message/why, normalized. Empty when nothing compares. */ + signature: string + /** Short human label, e.g. `402 Card declined`. */ + label: string + line: number +} + +export interface CatchFact { + line: number + isEmpty: boolean + /** Logs, rethrows, or returns — i.e. the error is not silently dropped. */ + handled: boolean +} + +/** + * Factories that hand back a wide-event logger. + * + * evlog's `log` export is not one of them — it is the simple logging API and + * has no `set` or `audit`. + */ +const LOGGER_FACTORIES = ['useLogger', 'createLogger', 'createRequestLogger', 'initLogger'] + +/** + * evlog wrappers that instrument a handler on the caller's behalf. + * + * `withEvlog` creates the request logger (evlog's documented Next.js pattern); + * `withAudit` writes audit fields onto the ambient one. + */ +const EVLOG_WRAPPERS = ['withEvlog', 'withAudit'] + +/** Network entry points worth an event when they fail. */ +const NETWORK_CALLS = [ + 'fetch', + '$fetch', + 'useFetch', + 'useLazyFetch', + 'useAsyncData', + 'useLazyAsyncData', + 'ofetch', +] + +const NETWORK_RECEIVERS = ['axios', 'http', 'https'] + +/** Statement shapes inside a `catch` that count as handling the error. */ +const HANDLING_MEMBERS = ['error', 'warn', 'set', 'audit', 'captureException'] + +function isEvlogSource(source: string | undefined): boolean { + return source === 'evlog' || (source?.startsWith('evlog/') ?? false) +} + +/** Properties whose literal values make one error distinguishable from another. */ +const ERROR_IDENTITY_KEYS = ['status', 'statusCode', 'code', 'message', 'why'] + +function literalValue(node: Node | undefined): string | null { + if (!node) return null + if (node.type === 'Literal') { + const { value } = node as { value: unknown } + return value === null || value === undefined ? null : String(value) + } + /* A template literal with no interpolation is just a string. */ + if (node.type === 'TemplateLiteral') { + const template = node as { expressions: Node[], quasis: Array<{ value: { cooked?: string | null } }> } + if (template.expressions.length > 0) return null + return template.quasis[0]?.value.cooked ?? null + } + return null +} + +/** Literal properties of an object literal, by key. */ +function literalProps(node: Node | undefined): Map { + const props = new Map() + if (!node || node.type !== 'ObjectExpression') return props + for (const prop of (node as { properties: Node[] }).properties) { + if (prop.type !== 'Property') continue + const { key, value } = prop as { key: Node, value: Node } + const name = key.type === 'Identifier' + ? key.name + : key.type === 'Literal' ? String((key as { value: unknown }).value) : null + if (name === null) continue + const literal = literalValue(value) + if (literal !== null) props.set(name, literal) + } + return props +} + +/** + * Identity of a `createError({ … })` payload. + * + * Only literals count: an error built from variables cannot be compared across + * files, and guessing would produce false matches — which in a suggestion means + * pointing at code that has nothing in common. + */ +function errorIdentity(argument: Node | undefined): InlineErrorFact | null { + const props = literalProps(argument) + const identity = ERROR_IDENTITY_KEYS + .filter(key => props.has(key)) + .map(key => `${key}=${props.get(key)!}`) + if (identity.length === 0) return null + + const status = props.get('status') ?? props.get('statusCode') + const text = props.get('code') ?? props.get('message') ?? props.get('why') + const label = [status, text].filter(Boolean).join(' ') + + return { signature: identity.join('|'), label: label.length > 0 ? label : identity[0]!, line: 0 } +} + +function objectKeys(node: Node | undefined): Set { + const keys = new Set() + if (!node || node.type !== 'ObjectExpression') return keys + for (const prop of (node as { properties: Node[] }).properties) { + if (prop.type !== 'Property') continue + const { key } = prop as { key: Node } + if (key.type === 'Identifier') keys.add(key.name) + if (key.type === 'Literal') keys.add(String((key as { value: unknown }).value)) + } + return keys +} + +type CalleeShape = Pick + +/** Strip the wrapper oxc puts around an optional chain (`a?.b()`). */ +function unwrapChain(node: Node): Node { + return node.type === 'ChainExpression' ? (node as { expression: Node }).expression : node +} + +/** + * Decode a call's callee into names. + * + * Walks the whole member chain so `log.audit?.deny()` is still recognised as a + * call on `log`: matching only the immediate object misses it, and an + * unrecognised audit call means the report claims an audited route is not. + */ +function describeCallee(rawCallee: Node): CalleeShape | null { + const callee = unwrapChain(rawCallee) + + if (callee.type === 'Identifier') { + return { name: callee.name, member: callee.name, receiver: null, root: null, chain: [callee.name] } + } + if (callee.type !== 'MemberExpression') return null + + const chain: string[] = [] + let current = callee as Node + while (true) { + current = unwrapChain(current) + if (current.type !== 'MemberExpression') break + const { property } = (current as { property: Node }) + if (property.type !== 'Identifier') return null + chain.unshift(property.name) + current = (current as { object: Node }).object + } + + const member = chain.at(-1) + if (member === undefined) return null + const root = current.type === 'Identifier' ? current.name : null + const receiver = chain.length === 1 ? root : (chain.at(-2) ?? null) + + return { + name: [root, ...chain].filter(Boolean).join('.'), + member, + receiver, + root, + chain, + } +} + +function isNetworkCall(call: CallFact): boolean { + if (NETWORK_CALLS.includes(call.member)) return true + return call.receiver !== null && NETWORK_RECEIVERS.includes(call.receiver) +} + +/** Whether a statement inside a `catch` block does something with the error. */ +function statementHandlesError(statement: Node): boolean { + if (statement.type === 'ThrowStatement' || statement.type === 'ReturnStatement') return true + if (statement.type !== 'ExpressionStatement') return false + + let { expression } = (statement as { expression: Node }) + if (expression.type === 'AwaitExpression') { + expression = (expression as { argument: Node }).argument + } + if (expression.type !== 'CallExpression') return false + + const described = describeCallee((expression as { callee: Node }).callee) + if (!described) return false + if (described.root === 'console') return true + return described.chain.some(name => HANDLING_MEMBERS.includes(name)) +} + +/** + * Collect the facts for one parsed file in a single AST pass. + * + * @param options.evlogAutoImports - evlog identifiers the framework injects + * without an import (Nuxt/Nitro). An auto-import only counts when the file does + * not declare the same name itself, so a local `function useLogger()` stub is + * not mistaken for evlog's. + */ +export function buildFileFacts( + parsed: ParseResult, + options: { evlogAutoImports?: readonly string[] } = {}, +): FileFacts { + const { lines } = parsed + const imports = new Map() + const localDeclarations = new Set() + const calls: CallFact[] = [] + const throwFacts: ThrowFact[] = [] + const catchFacts: CatchFact[] = [] + const inlineErrors: InlineErrorFact[] = [] + const catalogsDeclared: string[] = [] + const names = new Set() + /** Resolved after the pass: needs imports and declarations to be complete. */ + const loggerCandidates: Array<{ binding: string | null, factory: string, line: number }> = [] + const networkPatterns: Array<{ pattern: Node, init: Node }> = [] + + walkAst(parsed.program, (node) => { + switch (node.type) { + case 'ImportDeclaration': { + const declaration = node as { + source: { value: string } + specifiers: Array<{ type: string, local?: { name: string } }> + } + for (const specifier of declaration.specifiers) { + if (specifier.local) imports.set(specifier.local.name, declaration.source.value) + } + break + } + + case 'FunctionDeclaration': + case 'ClassDeclaration': { + const { id } = (node as { id?: { name: string } }) + if (id?.name) localDeclarations.add(id.name) + break + } + + case 'VariableDeclarator': { + const declarator = node as { id: Node, init?: Node } + if (declarator.id.type === 'Identifier') { + localDeclarations.add(declarator.id.name) + } + if (!declarator.init) break + + let { init } = declarator + if (init.type === 'AwaitExpression') init = (init as { argument: Node }).argument + + if (init.type === 'CallExpression') { + const described = describeCallee((init as { callee: Node }).callee) + if (described && LOGGER_FACTORIES.includes(described.member)) { + loggerCandidates.push({ + binding: declarator.id.type === 'Identifier' ? declarator.id.name : null, + factory: described.member, + line: lines.lineAt((init as unknown as { start: number }).start), + }) + } + if (declarator.id.type === 'ObjectPattern') { + networkPatterns.push({ pattern: declarator.id, init }) + } + } + break + } + + case 'CallExpression': { + const described = describeCallee((node as { callee: Node }).callee) + if (!described) break + const [firstArgument] = (node as { arguments: Node[] }).arguments + const line = lines.lineAt((node as unknown as { start: number }).start) + calls.push({ ...described, line, props: objectKeys(firstArgument) }) + + if (described.member === 'createError') { + const identity = errorIdentity(firstArgument) + if (identity) inlineErrors.push({ ...identity, line }) + } + if (described.member === 'defineErrorCatalog') { + const name = literalValue(firstArgument) + if (name !== null) catalogsDeclared.push(name) + } + break + } + + case 'ThrowStatement': { + const { argument } = (node as { argument: Node | null }) + if (!argument) break + const line = lines.lineAt((node as unknown as { start: number }).start) + + if (argument.type === 'NewExpression') { + const { callee } = argument as { callee: Node } + const isPlain = callee.type === 'Identifier' && callee.name === 'Error' + throwFacts.push({ kind: isPlain ? 'plain-error' : 'other', props: new Set(), line }) + break + } + if (argument.type === 'CallExpression') { + const described = describeCallee((argument as { callee: Node }).callee) + if (described?.member === 'createError') { + const [firstArgument] = (argument as { arguments: Node[] }).arguments + throwFacts.push({ kind: 'create-error', props: objectKeys(firstArgument), line }) + break + } + } + throwFacts.push({ kind: 'other', props: new Set(), line }) + break + } + + case 'CatchClause': { + const statements = (node as { body: { body: Node[] } }).body.body + catchFacts.push({ + line: lines.lineAt((node as unknown as { start: number }).start), + isEmpty: statements.length === 0, + handled: statements.some(statementHandlesError), + }) + break + } + + case 'MemberExpression': { + const { property } = (node as { property: Node }) + if (property.type === 'Identifier') names.add(property.name) + break + } + + case 'Property': { + const { key } = node as { key: Node } + if (key.type === 'Identifier') names.add(key.name) + if (key.type === 'Literal') names.add(String((key as { value: unknown }).value)) + break + } + + default: + break + } + }) + + /* + * Whether a name refers to evlog's export, now that imports and local + * declarations are both known. + * + * An explicit import wins: `import { useLogger } from './my-logger'` is not + * evlog's, even in a project where evlog auto-imports that name. A local + * declaration beats an auto-import for the same reason. + */ + const evlogAutoImports = options.evlogAutoImports ?? [] + const resolvesToEvlog = (name: string): boolean => { + const source = imports.get(name) + if (source !== undefined) return isEvlogSource(source) + return evlogAutoImports.includes(name) && !localDeclarations.has(name) + } + + const loggerBindings = new Set() + let loggerInit: HandlerLocation | null = null + for (const candidate of loggerCandidates) { + if (!resolvesToEvlog(candidate.factory)) continue + loggerInit ??= { line: candidate.line, column: 0 } + if (candidate.binding) loggerBindings.add(candidate.binding) + } + /* + * evlog's `log` export is deliberately not treated as a request logger: it is + * the simple logging API (`log.info`, `log.error`) with no `set` or `audit`, + * so it emits standalone lines rather than contributing to the request's wide + * event. + */ + if (!loggerInit) { + const bare = calls.find(call => LOGGER_FACTORIES.includes(call.member) && resolvesToEvlog(call.member)) + if (bare) loggerInit = { line: bare.line, column: 0 } + } + + const evlogImports = new Set() + for (const source of imports.values()) { + if (isEvlogSource(source)) evlogImports.add(source) + } + + const evlogWrappers = new Set() + for (const call of calls) { + if (EVLOG_WRAPPERS.includes(call.member) && resolvesToEvlog(call.member)) { + evlogWrappers.add(call.member) + } + } + + const network = calls.filter(isNetworkCall) + const destructuresNetworkError = networkPatterns.some(({ pattern, init }) => { + const described = describeCallee((init as { callee: Node }).callee) + if (!described) return false + const call: CallFact = { ...described, line: 0, props: new Set() } + if (!isNetworkCall(call)) return false + return (pattern as { properties: Node[] }).properties.some((property) => { + if (property.type !== 'Property') return false + const { key } = property as { key: Node } + return key.type === 'Identifier' && key.name === 'error' + }) + }) + + return { + imports, + localDeclarations, + calls, + throws: throwFacts, + catches: catchFacts, + network, + loggerInit, + loggerBindings, + evlogWrappers, + evlogImports, + names, + destructuresNetworkError, + inlineErrors, + catalogsDeclared, + /* Matches anywhere in the chain so `log.audit()` and `log.audit?.deny()` + both count as audit calls. */ + loggerCalls: member => calls.filter( + call => call.root !== null && loggerBindings.has(call.root) && call.chain.includes(member), + ), + callsTo: name => calls.filter(call => call.member === name), + } +} diff --git a/packages/cli/src/lib/map/parse.ts b/packages/cli/src/lib/map/parse.ts index e8e884bb..f6f7974c 100644 --- a/packages/cli/src/lib/map/parse.ts +++ b/packages/cli/src/lib/map/parse.ts @@ -1,11 +1,53 @@ import { readFileSync } from 'node:fs' import { parseSync } from 'oxc-parser' import type { Node, Program } from 'oxc-parser' +import type { HandlerLocation } from './types' export interface ParseResult { program: Program source: string errors: string[] + /** Byte offset → line resolver for this source. */ + lines: LineIndex +} + +/** + * Offset → position lookup for one source file. + * + * Built once per file and shared by every consumer: resolving a line by + * counting newlines from the start of the file is O(offset), which turns + * quadratic once you ask for thousands of node positions. + */ +export interface LineIndex { + lineAt: (offset: number) => number + locAt: (offset: number) => HandlerLocation +} + +export function createLineIndex(source: string): LineIndex { + const starts: number[] = [0] + for (let i = 0; i < source.length; i++) { + if (source[i] === '\n') starts.push(i + 1) + } + + /** Index of the line containing `offset`, by binary search over line starts. */ + function indexOf(offset: number): number { + let low = 0 + let high = starts.length - 1 + while (low < high) { + const mid = Math.ceil((low + high) / 2) + if (starts[mid]! <= offset) low = mid + else high = mid - 1 + } + return low + } + + return { + lineAt: offset => indexOf(offset) + 1, + locAt: (offset) => { + const index = indexOf(offset) + return { line: index + 1, column: offset - starts[index]! } + }, + } } /** Parse a route file (Vue ` +``` +```tsx [Next.js] +try { + const orders = await getOrders() +} catch (error) { + log.error(error) +} +``` +:: + +[Lifecycle →](/learn/lifecycle) + +## Opportunities + +Four rules suggest going further. They never touch the score, and they only ever fire when the project has **already adopted** the feature somewhere — the point is to get more out of what you chose, not to sell you something. + +Adoption is confirmed against the AST, not by searching text, so a feature mentioned in a comment does not count. + +| Column | Id | Fires when | Scope | +| --- | --- | --- | --- | +| `catalog` | `error-catalog` | The project declares a catalog **and** the same inline error appears in two or more files | Per entry point | +| `audit+` | `audit-coverage` | The project records audit events, and this handler changes state without one | Per entry point | +| `ai` | `ai-logging` | `ai` is a dependency and the AI SDK is called without `evlog/ai` | Once per project | +| `identity` | `auth-identity` | `better-auth` is a dependency and `evlog/better-auth` is not installed | Once per project | + +### catalog — should these duplicated errors become catalog entries? + +Deliberately narrow. An earlier version fired on any inline `createError()`, which meant handlers with perfectly good errors got lectured. Duplication is the one signal that makes the case on its own: the same status and message maintained in three places will drift. + +```text +"402 Card declined" is spelled out here and in 2 other files — one catalog entry would cover them +``` + +The suggestion names a catalog you already have, rather than inventing one. [Catalogs →](/learn/catalogs) + +### audit+ — should this state change be on the audit trail too? + +Complements the `audit` requirement, which only fires on money and auth. This one is softer and wider: once you have an audit trail, every state change is a candidate, and you are the one who knows which ones matter. It looks for `create`, `update`, `insert`, `upsert`, `delete`, or `destroy` calls in a handler with no audit record. Entry points already covered by the `audit` requirement are skipped, so a gap is never reported twice. [Recording audit events →](/use-cases/audit/recording) + +### ai — are model calls, tokens and latency on the event? + +Fires on `generateText`, `streamText`, `generateObject`, `streamObject`, `embed`, and `embedMany` when `evlog/ai` is not imported. Without it the event records that the request happened but not what the model cost, which is usually the most expensive and most variable part of it. Reported once for the whole project — one wrapped model serves every handler. [AI SDK →](/use-cases/ai-sdk/overview) + +### identity — do events carry the authenticated user? + +Fires on entry points where auth is actually in play: the auth routes themselves, or a handler that reads the session. `evlog/better-auth` attaches the user and session to every event, which is what turns "a request failed" into "this user's request failed". Reported once for the whole project — it is one plugin, installed once. [Better Auth →](/use-cases/better-auth/overview) + +## How evlog helpers are recognised + +Every rule that looks for a logger asks the same question: *is this evlog's?* It is answered from the AST, which is why a locally defined stub does not earn you points. + +- **Imported from evlog** — `import { useLogger } from 'evlog'`, including subpath imports. +- **Auto-imported** — in Nuxt and Nitro, evlog's module injects `useLogger` and `createEvlogError`, so an un-imported call counts. Unless the file declares its own, in which case the local declaration wins. +- **Re-exported from a local module** — `import { useLogger } from '@/lib/evlog'` counts when that module forwards evlog's export, which is the shape [the Next.js guide](/integrate/frameworks/nextjs) recommends. Exports destructured from a factory (`export const { useLogger } = createEvlog(...)`) are resolved too. +- **Through an evlog wrapper** — `withEvlog` and `withAudit` instrument a handler without it ever naming a logger. + +Two things deliberately do **not** count: + +- **A local stub.** `function useLogger() { ... }` in your own file, or an import from `./my-logger` that does not forward evlog's export, is not evlog's logger. +- **evlog's `log` export.** `log.info()` is the [simple logging API](/learn/simple-logging) — it emits its own line rather than contributing to the request's wide event, and it has no `set` or `audit`. It does not satisfy the `log` column. + +## Exempt entry points + +evlog's own client-log ingest endpoints (`/api/evlog/ingest` and friends) are plumbing, not app code. Every rule reports `n/a` for them with the reason attached, they are never listed as something to fix, and the summary counts them as `exempt` rather than as your own instrumented entry points. + +## Reporting a wrong verdict + +Rules are one file each with their own test bench, so a wrong verdict is a local fix rather than an archaeology session. If `evlog map ` claims something you can see is untrue, that is a bug worth [opening an issue](https://github.com/HugoRCD/evlog/issues) for — include the entry point's output and the handler, and the fix lands in one rule. + +## Next + +- [Scoring](/cli/scoring) — how weights become a number, and how sensitivity is decided +- [CI](/cli/ci) — gate a pull request on requirements without suggestions getting in the way diff --git a/apps/docs/content/3.cli/3.scoring.md b/apps/docs/content/3.cli/3.scoring.md new file mode 100644 index 00000000..3796a9b1 --- /dev/null +++ b/apps/docs/content/3.cli/3.scoring.md @@ -0,0 +1,140 @@ +--- +title: Map scoring +description: How evlog map turns rule results into a score — per-entry weights, the weighted project average, grade thresholds, coverage classification, and how routes are flagged as money, auth, or PII. +navigation: + title: Scoring + icon: i-lucide-gauge +links: + - label: Rules + icon: i-lucide-list-checks + to: /cli/rules + color: neutral + variant: subtle + - label: CI + icon: i-lucide-git-pull-request + to: /cli/ci + color: neutral + variant: subtle +--- + +The score exists to be compared against itself. It is a number you can watch move as you fix things, and gate a pull request on — not a benchmark against other projects. + +## One entry point + +Every entry point starts at 100 and loses the weight of each **requirement** it fails, floored at 0. + +| Requirement | Weight | +| --- | --- | +| `wide-event` | 40 | +| `audit` | 25 | +| `structured-errors` | 20 | +| `page-error-handling` | 20 | +| `context` | 15 | +| `error-handling` | 15 | + +A rule that passes costs nothing. A rule that reports `n/a` costs nothing either — it never applied, so it is not held against the entry point. [Opportunities](/cli/rules#opportunities) carry no weight at all and cannot appear here. + +Take the login handler from the playground: + +```text [evlog map server/api/auth/login.post.ts] +CHECKS +✓ useLogger wide event emitted per request +✓ log.set context attached with log.set() +✗ log.audit sensitive action with no audit trail +``` + +`structured-errors` and `error-handling` were `n/a` — the handler throws nothing and catches nothing. One requirement failed, so the score is `100 − 25 = 75`. + +::callout{icon="i-lucide-info" color="neutral"} +Weights add up to more than 100 on purpose. A handler that fails everything lands at 0, and the ordering of what to fix first stays meaningful: `wide-event` at 40 outweighs any pair of the smaller rules. +:: + +## The project score + +The global score is the average of every entry point, weighted by how much a blind spot there would cost you: + +| Entry point | Weight | +| --- | --- | +| Flagged money or auth | ×2 | +| Page | ×0.5 | +| Everything else | ×1 | + +Pages weigh less because a page that swallows a fetch error is a worse user experience than an observability hole, and they are usually the most numerous files in an app. Sensitive handlers weigh double because that is where you will need the event. + +Three entry points — a sensitive handler at 75, a plain handler at 100, and a page at 50: + +```text +(75 × 2) + (100 × 1) + (50 × 0.5) 275 +───────────────────────────────── = ───── = 79 + 2 + 1 + 0.5 3.5 +``` + +A project with no entry points at all scores 100. + +## Grades + +| Score | Grade | +| --- | --- | +| 90–100 | `excellent` | +| 70–89 | `good` | +| 50–69 | `needs work` | +| 0–49 | `at risk` | + +## Coverage classification + +Alongside the score, each entry point is classified — this is what the `summary` block in the JSON counts, and what the coverage rows in the report are built from. + +| Class | When | +| --- | --- | +| `instrumented` | A handler that passes both `wide-event` and `context`, or a page that handles its fetch errors | +| `partial` | A handler that passes one of the two | +| `dark` | A handler that passes neither, or a page that swallows fetch errors | +| `exempt` | evlog infrastructure — every rule is `n/a`, so it sits at 100 and is counted apart from your own entry points | + +`dark` is the number to watch. A dark entry point produces nothing you can query: when it misbehaves, the only evidence you will have is the user's description of it. + +## Sensitivity + +Sensitivity is what promotes an entry point to double weight and adds the `audit` requirement, so it is worth knowing exactly how it is decided. + +### Money — `$` + +- **Imports** `stripe`, `@stripe/stripe-js`, `paddle-sdk`, or `@lemonsqueezy/lemonsqueezy.js` +- **Path** contains `checkout`, `payment`, `billing`, `invoice`, `refund`, `subscription`, `charge`, or `payout` + +### Auth — `A` + +- **Imports** `better-auth`, `next-auth`, `lucia`, `@auth/core`, or `@auth/nextjs` +- **Path** contains `auth`, `oauth`, `login`, `logout`, `signin`, `signup`, `register`, `password`, `token`, `session`, `mfa`, or `otp` + +### PII — `@` + +Fields matching `email`, `phone`, `address`, `ssn`, or `iban` **and** a write call (`create`, `update`, `insert`, `upsert`) in the same handler. + +Money and auth are `high` sensitivity: double weight, and an audit trail is required. PII is `medium`: no extra requirement, but it is marked in the report. + +### How the matching works + +Two decisions keep this from producing noise. + +**Imports are read from the AST.** A package counts only when it is genuinely imported, so a `// TODO: drop stripe` comment does not make a route handle money. + +**Path terms match whole words**, allowing a plural. `/api/authors` is not an auth route, and `/api/refunds` is a money route. This matters more than it looks: a wrongly flagged route is handed a 25-point requirement it has no reason to satisfy, and counts double in the average — the fastest way to make the whole number untrustworthy. + +Every reason is shown in full when you inspect an entry point, so a wrong call is one line to spot: + +```text [evlog map server/api/auth/login.post.ts] +FLAGGED SENSITIVE BECAUSE +▍ auth: path says "auth" +``` + +## Reading the score honestly + +- **A high score is not proof of good observability.** It says the shape is there: an event per entry point, context attached, errors explainable, sensitive actions audited. Whether the context you attach is the context you will need is a judgement no static analyser can make. [Best practices →](/reference/best-practices) +- **Compare runs, not projects.** A 200-route app that scores 70 is in better shape than a 6-route app that scores 70. +- **Watch `dark` and `Money & auth`** rather than the headline number. Those are the two places where the next incident is hiding. + +## Next + +- [CI](/cli/ci) — turn the score into a pass/fail check +- [Rules](/cli/rules) — what each requirement actually looks for diff --git a/apps/docs/content/3.cli/4.ci.md b/apps/docs/content/3.cli/4.ci.md new file mode 100644 index 00000000..bdb81f4a --- /dev/null +++ b/apps/docs/content/3.cli/4.ci.md @@ -0,0 +1,196 @@ +--- +title: evlog map in CI +description: Gate a pull request on your observability score with --min-score, read the JSON contract, and keep the map file out of the way. Exit codes, GitHub Actions, and jq recipes. +navigation: + title: CI + icon: i-lucide-git-pull-request +links: + - label: Scoring + icon: i-lucide-gauge + to: /cli/scoring + color: neutral + variant: subtle + - label: Rules + icon: i-lucide-list-checks + to: /cli/rules + color: neutral + variant: subtle +--- + +A score you look at once is a nice afternoon. A score in CI is what stops the next handler from shipping dark. + +## The gate + +`--min-score ` prints an explicit verdict and exits 1 when the project is below the threshold: + +```bash [Terminal] +evlog map --min-score 80 +``` + +```text [Below the threshold] + GATE score 76 is below --min-score 90 — exit code 1 +fix what is listed under FIX FIRST to pass · evlog.dev/cli/ci +``` + +```text [At or above it] + GATE score 76 meets --min-score 70 — exit code 0 +``` + +The full report is printed either way, so a failed job tells you what to fix without a second run. + +::callout{icon="i-lucide-shield-check" color="neutral"} +[Opportunities](/cli/rules#opportunities) never affect the score, so a gate can never fail because the CLI suggested you adopt a feature. Only requirements can fail a build. +:: + +## Exit codes + +| Code | Meaning | +| --- | --- | +| `0` | Score met the threshold, or no threshold was given | +| `1` | Score below `--min-score`, or the scan could not run | +| `2` | Usage error — unknown flag, or an invalid `--framework` | + +::warning +A pipe replaces `$?` with the exit code of the last command in it, so `evlog map --min-score 90 \| tee map.log` always looks green. Add `set -o pipefail` to the step. +:: + +## GitHub Actions + +```yaml [.github/workflows/observability.yml] +name: Observability + +on: pull_request + +jobs: + map: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 + with: + node-version: 22 + - run: npx @evlog/cli map --min-score 80 --no-write +``` + +`--no-write` keeps the job from producing an `evlog.map.json` nobody will read. Pin the CLI as a dev dependency instead of using `npx` when you want every run on the same version. + +### Ratchet, don't cliff + +Setting the threshold to 90 on an app that scores 41 fails every pull request and teaches the team to ignore the job. Set it to today's score, then raise it as you fix things: + +```bash [Terminal] +# what are we at right now? +evlog map --json --no-write | jq '.map.score' +``` + +Each pull request that raises the score raises the floor with it. The report already tells you what the next step is worth: `▲ 76 → 86 by fixing the 3 above`. + +## The JSON contract + +`--json` writes the whole map to stdout. The report goes to stderr, so the two never mix. + +```bash [Terminal] +evlog map --json --no-write > map.json +``` + +```json [Shape] +{ + "schemaVersion": 2, + "environment": "production", + "map": { + "version": 1, + "generatedAt": "2026-07-25T18:42:10.114Z", + "framework": "nuxt", + "projectName": "evlog-playground", + "score": 76, + "routes": [] + }, + "summary": { "instrumented": 19, "partial": 2, "dark": 8, "exempt": 0 }, + "mapPath": "/path/to/app/evlog.map.json" +} +``` + +`mapPath` is `null` under `--no-write`. Each entry in `map.routes` looks like this: + +```json [One entry point] +{ + "framework": "nuxt", + "kind": "api", + "method": "POST", + "path": "/api/auth/login", + "file": "server/api/auth/login.post.ts", + "handler": { "line": 1, "column": 0 }, + "id": "337325358269", + "checks": { + "wide-event": { "status": "pass" }, + "context": { "status": "pass" }, + "structured-errors": { "status": "n/a" }, + "error-handling": { "status": "n/a" }, + "audit": { + "status": "fail", + "message": "has logger + context but no log.audit() — sensitive route needs audit trail", + "evidence": { "file": "server/api/auth/login.post.ts", "line": 1 } + } + }, + "suggestions": {}, + "sensitivity": { "level": "high", "reasons": ["auth: path says \"auth\""] }, + "score": 75 +} +``` + +`checks` holds requirements, `suggestions` holds opportunities. They are separate keys precisely so a consumer — or a CI script — can never mistake a suggestion for a failure. Rule ids are stable: the registry and the published id union are checked against each other at build time, so a release cannot silently change what you receive. + +### Recipes + +```bash [Terminal] +# the score, for a badge or a comment +evlog map --json --no-write | jq '.map.score' + +# every entry point with no event at all +evlog map --json --no-write \ + | jq -r '.map.routes[] | select(.checks["wide-event"].status == "fail") | .file' + +# every failure as file:line — message +evlog map --json --no-write \ + | jq -r '.map.routes[].checks | to_entries[] | select(.value.status == "fail") + | "\(.value.evidence.file):\(.value.evidence.line) — \(.value.message)"' + +# fail a script when anything is dark +test "$(evlog map --json --no-write | jq '.summary.dark')" -eq 0 +``` + +## The map file + +Unless you pass `--no-write`, every run writes `evlog.map.json` to the project root. It holds the same data as `--json` and is a build artifact, so ignore it: + +```bash [.gitignore] +evlog.map.json +``` + +Track it instead if you want the diff in review — a pull request then shows exactly which entry points changed class, which is a useful thing to argue about. Just expect the file to churn on every run, since `generatedAt` changes each time. + +## Monorepos + +`evlog map` scans one app at a time. Gate each one: + +```yaml [.github/workflows/observability.yml] +jobs: + map: + runs-on: ubuntu-latest + strategy: + matrix: + app: [apps/web, apps/admin] + steps: + - uses: actions/checkout@v5 + - uses: actions/setup-node@v5 + with: + node-version: 22 + - run: npx @evlog/cli map --cwd ${{ matrix.app }} --min-score 80 --no-write +``` + +Different apps can carry different thresholds, which is usually what you want: the app that takes payments should be held higher than the marketing site. + +## Next + +- [Rules](/cli/rules) — what a failing check means and how to fix it +- [Scoring](/cli/scoring) — how the number you are gating on is calculated diff --git a/apps/docs/content/3.cli/5.doctor.md b/apps/docs/content/3.cli/5.doctor.md new file mode 100644 index 00000000..5d6b9ccf --- /dev/null +++ b/apps/docs/content/3.cli/5.doctor.md @@ -0,0 +1,76 @@ +--- +title: evlog doctor +description: Diagnose an evlog setup — Node version, project resolution, the installed evlog version, the detected framework, and whether local logs are being written. +navigation: + title: doctor + icon: i-lucide-stethoscope +links: + - label: Installation + icon: i-lucide-download + to: /start/installation + color: neutral + variant: subtle +--- + +`evlog doctor` answers "is evlog actually wired up here?" — the question you have when you followed the setup guide and nothing is showing up. + +```bash [Terminal] +evlog doctor +``` + +```text [Output] +pnpm workspace + +ENVIRONMENT +│ ✓ node v24.18.0 +│ ✓ project evlog-playground · pnpm · apps/playground +│ ✓ stack nuxt + +EVLOG +│ ✓ evlog v2.22.3 (workspace:*) +│ ✓ logs 1 file · .evlog/logs + +5 ok · 0 warn · 0 fail +``` + +## What it checks + +| Check | Passes when | Warns or fails when | +| --- | --- | --- | +| `node` | Node 20 or later | Older than 20 — the CLI will not run reliably (fail) | +| `project` | A `package.json` was resolved | None found above the working directory | +| `stack` | A framework was detected and evlog is installed | A framework was detected but evlog is not wired to it | +| `evlog` | `evlog` resolves from `node_modules` | Declared in `package.json` but not installed, or missing entirely | +| `logs` | A local sink exists under `.evlog/logs` | Nothing has been written yet | + +In a workspace, the header names the workspace kind and `project` shows which package was resolved — the fastest way to notice you are diagnosing the repo root instead of your app. + +An empty `logs` sink is not a problem in itself: the directory is created on first write by the [fs drain](/integrate/adapters/self-hosted/fs). It is only a signal when you expected local logs and there are none. + +## Exit code + +`0` when nothing failed, `1` when any check failed. Warnings do not fail the command — a project that has not written logs yet is not broken. + +## JSON + +```bash [Terminal] +evlog doctor --json | jq '.checks' +``` + +The payload carries the resolved project (`cwd`, `root`, `packageDir`, workspace kind, package name, detected stack), every check with its status, and the summary counts. + +Each warning and failure also carries a code from the CLI's own error catalog — `cli.EVLOG_NOT_FOUND`, `cli.EVLOG_DECLARED_NOT_INSTALLED`, `cli.LOGS_SINK_MISSING`, `cli.NODE_TOO_OLD`, `cli.PROJECT_NO_PACKAGE` — each with a `why` and a `fix`, the same way [structured errors](/learn/structured-errors) work in your app. + +## Options + +| Flag | What it does | +| --- | --- | +| `--cwd ` | Diagnose another directory | +| `--json` | Machine-readable output on stdout | +| `--debug` | Print the steps the command went through | +| `--noHeader` | Skip the branded header | + +## Next + +- [Installation](/start/installation) — wire evlog into your framework +- [`evlog map`](/cli/map) — once it is installed, see where it is missing diff --git a/apps/docs/content/3.cli/6.telemetry.md b/apps/docs/content/3.cli/6.telemetry.md new file mode 100644 index 00000000..0d25f072 --- /dev/null +++ b/apps/docs/content/3.cli/6.telemetry.md @@ -0,0 +1,77 @@ +--- +title: CLI telemetry +description: What the evlog CLI collects about its own usage, how to see it, and the three ways to turn it off — DO_NOT_TRACK, EVLOG_TELEMETRY=0, or evlog telemetry disable. +navigation: + title: telemetry + icon: i-lucide-bar-chart-3 +links: + - label: Telemetry for your own CLI + icon: i-lucide-radio + to: /use-cases/telemetry/overview + color: neutral + variant: subtle +--- + +The evlog CLI records one anonymous wide event per run, so we know which commands people use and which ones error. It is the same [telemetry toolkit](/use-cases/telemetry/overview) evlog ships for your own CLIs, pointed at itself. + +::callout{icon="i-lucide-info" color="neutral"} +This page is about the CLI's own telemetry. If you are instrumenting a CLI **you** are building, you want [Telemetry](/use-cases/telemetry/overview) instead. +:: + +## See what is collected + +```bash [Terminal] +evlog telemetry status +``` + +The command prints whether telemetry is on, where its data directory is, and the full disclosure table — every field, its type, and what it is for. The disclosure is generated from the code that sends the event, so it cannot drift from what actually goes over the wire. + +```text [Output] +Telemetry: enabled (preference: enabled) +Data directory: ~/.config/evlog-cli/telemetry +``` + +## What is in an event + +One event per run, with the command name, how long it took, whether it succeeded, and the error code when it did not. Alongside that: the Node version, the OS and architecture, whether the run was in CI and on which provider, whether stdout is a TTY, and whether an AI coding agent was driving it. + +Flags are recorded as booleans and numbers; string values are recorded as *present* rather than by value, unless the flag is explicitly allowlisted. The machine id is a hash, and it is omitted entirely in ephemeral CI. + +::callout{icon="i-lucide-lock" color="neutral"} +No file paths, no source code, no project names, no route paths. Your map score never leaves your machine. +:: + +## Turn it off + +Any one of these is enough: + +```bash [Terminal] +# persisted preference +evlog telemetry disable + +# per-run, or in a shell profile +EVLOG_TELEMETRY=0 evlog map + +# the cross-tool standard, respected everywhere +export DO_NOT_TRACK=1 +``` + +`evlog telemetry disable` also purges anything that had been queued and not yet delivered. `evlog telemetry enable` turns it back on. + +## Inspect before trusting + +To see exactly what a run would send, without sending it: + +```bash [Terminal] +EVLOG_TELEMETRY_DEBUG=1 evlog map +``` + +The would-be payload is printed to stderr. + +## Commands + +| Command | What it does | +| --- | --- | +| `evlog telemetry status` | Current state, data directory, and the full disclosure | +| `evlog telemetry enable` | Enable anonymous usage telemetry | +| `evlog telemetry disable` | Disable it and purge undelivered data | diff --git a/apps/docs/content/3.integrate/.navigation.yml b/apps/docs/content/4.integrate/.navigation.yml similarity index 100% rename from apps/docs/content/3.integrate/.navigation.yml rename to apps/docs/content/4.integrate/.navigation.yml diff --git a/apps/docs/content/3.integrate/0.overview.md b/apps/docs/content/4.integrate/0.overview.md similarity index 100% rename from apps/docs/content/3.integrate/0.overview.md rename to apps/docs/content/4.integrate/0.overview.md diff --git a/apps/docs/content/3.integrate/adapters/.navigation.yml b/apps/docs/content/4.integrate/adapters/.navigation.yml similarity index 100% rename from apps/docs/content/3.integrate/adapters/.navigation.yml rename to apps/docs/content/4.integrate/adapters/.navigation.yml diff --git a/apps/docs/content/3.integrate/adapters/01.overview.md b/apps/docs/content/4.integrate/adapters/01.overview.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/01.overview.md rename to apps/docs/content/4.integrate/adapters/01.overview.md diff --git a/apps/docs/content/3.integrate/adapters/cloud/.navigation.yml b/apps/docs/content/4.integrate/adapters/cloud/.navigation.yml similarity index 100% rename from apps/docs/content/3.integrate/adapters/cloud/.navigation.yml rename to apps/docs/content/4.integrate/adapters/cloud/.navigation.yml diff --git a/apps/docs/content/3.integrate/adapters/cloud/01.axiom.md b/apps/docs/content/4.integrate/adapters/cloud/01.axiom.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/cloud/01.axiom.md rename to apps/docs/content/4.integrate/adapters/cloud/01.axiom.md diff --git a/apps/docs/content/3.integrate/adapters/cloud/02.otlp.md b/apps/docs/content/4.integrate/adapters/cloud/02.otlp.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/cloud/02.otlp.md rename to apps/docs/content/4.integrate/adapters/cloud/02.otlp.md diff --git a/apps/docs/content/3.integrate/adapters/cloud/03.posthog.md b/apps/docs/content/4.integrate/adapters/cloud/03.posthog.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/cloud/03.posthog.md rename to apps/docs/content/4.integrate/adapters/cloud/03.posthog.md diff --git a/apps/docs/content/3.integrate/adapters/cloud/04.sentry.md b/apps/docs/content/4.integrate/adapters/cloud/04.sentry.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/cloud/04.sentry.md rename to apps/docs/content/4.integrate/adapters/cloud/04.sentry.md diff --git a/apps/docs/content/3.integrate/adapters/cloud/05.better-stack.md b/apps/docs/content/4.integrate/adapters/cloud/05.better-stack.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/cloud/05.better-stack.md rename to apps/docs/content/4.integrate/adapters/cloud/05.better-stack.md diff --git a/apps/docs/content/3.integrate/adapters/cloud/06.datadog.md b/apps/docs/content/4.integrate/adapters/cloud/06.datadog.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/cloud/06.datadog.md rename to apps/docs/content/4.integrate/adapters/cloud/06.datadog.md diff --git a/apps/docs/content/3.integrate/adapters/cloud/07.hyperdx.md b/apps/docs/content/4.integrate/adapters/cloud/07.hyperdx.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/cloud/07.hyperdx.md rename to apps/docs/content/4.integrate/adapters/cloud/07.hyperdx.md diff --git a/apps/docs/content/3.integrate/adapters/self-hosted/.navigation.yml b/apps/docs/content/4.integrate/adapters/self-hosted/.navigation.yml similarity index 100% rename from apps/docs/content/3.integrate/adapters/self-hosted/.navigation.yml rename to apps/docs/content/4.integrate/adapters/self-hosted/.navigation.yml diff --git a/apps/docs/content/3.integrate/adapters/self-hosted/01.fs.md b/apps/docs/content/4.integrate/adapters/self-hosted/01.fs.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/self-hosted/01.fs.md rename to apps/docs/content/4.integrate/adapters/self-hosted/01.fs.md diff --git a/apps/docs/content/3.integrate/adapters/self-hosted/02.nuxthub.md b/apps/docs/content/4.integrate/adapters/self-hosted/02.nuxthub.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/self-hosted/02.nuxthub.md rename to apps/docs/content/4.integrate/adapters/self-hosted/02.nuxthub.md diff --git a/apps/docs/content/3.integrate/adapters/self-hosted/03.memory.md b/apps/docs/content/4.integrate/adapters/self-hosted/03.memory.md similarity index 100% rename from apps/docs/content/3.integrate/adapters/self-hosted/03.memory.md rename to apps/docs/content/4.integrate/adapters/self-hosted/03.memory.md diff --git a/apps/docs/content/3.integrate/frameworks/.navigation.yml b/apps/docs/content/4.integrate/frameworks/.navigation.yml similarity index 100% rename from apps/docs/content/3.integrate/frameworks/.navigation.yml rename to apps/docs/content/4.integrate/frameworks/.navigation.yml diff --git a/apps/docs/content/3.integrate/frameworks/00.overview.md b/apps/docs/content/4.integrate/frameworks/00.overview.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/00.overview.md rename to apps/docs/content/4.integrate/frameworks/00.overview.md diff --git a/apps/docs/content/3.integrate/frameworks/01.nuxt.md b/apps/docs/content/4.integrate/frameworks/01.nuxt.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/01.nuxt.md rename to apps/docs/content/4.integrate/frameworks/01.nuxt.md diff --git a/apps/docs/content/3.integrate/frameworks/02.nextjs.md b/apps/docs/content/4.integrate/frameworks/02.nextjs.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/02.nextjs.md rename to apps/docs/content/4.integrate/frameworks/02.nextjs.md diff --git a/apps/docs/content/3.integrate/frameworks/03.sveltekit.md b/apps/docs/content/4.integrate/frameworks/03.sveltekit.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/03.sveltekit.md rename to apps/docs/content/4.integrate/frameworks/03.sveltekit.md diff --git a/apps/docs/content/3.integrate/frameworks/04.nitro.md b/apps/docs/content/4.integrate/frameworks/04.nitro.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/04.nitro.md rename to apps/docs/content/4.integrate/frameworks/04.nitro.md diff --git a/apps/docs/content/3.integrate/frameworks/05.tanstack-start.md b/apps/docs/content/4.integrate/frameworks/05.tanstack-start.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/05.tanstack-start.md rename to apps/docs/content/4.integrate/frameworks/05.tanstack-start.md diff --git a/apps/docs/content/3.integrate/frameworks/06.nestjs.md b/apps/docs/content/4.integrate/frameworks/06.nestjs.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/06.nestjs.md rename to apps/docs/content/4.integrate/frameworks/06.nestjs.md diff --git a/apps/docs/content/3.integrate/frameworks/07.express.md b/apps/docs/content/4.integrate/frameworks/07.express.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/07.express.md rename to apps/docs/content/4.integrate/frameworks/07.express.md diff --git a/apps/docs/content/3.integrate/frameworks/08.hono.md b/apps/docs/content/4.integrate/frameworks/08.hono.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/08.hono.md rename to apps/docs/content/4.integrate/frameworks/08.hono.md diff --git a/apps/docs/content/3.integrate/frameworks/09.fastify.md b/apps/docs/content/4.integrate/frameworks/09.fastify.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/09.fastify.md rename to apps/docs/content/4.integrate/frameworks/09.fastify.md diff --git a/apps/docs/content/3.integrate/frameworks/10.elysia.md b/apps/docs/content/4.integrate/frameworks/10.elysia.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/10.elysia.md rename to apps/docs/content/4.integrate/frameworks/10.elysia.md diff --git a/apps/docs/content/3.integrate/frameworks/11.react-router.md b/apps/docs/content/4.integrate/frameworks/11.react-router.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/11.react-router.md rename to apps/docs/content/4.integrate/frameworks/11.react-router.md diff --git a/apps/docs/content/3.integrate/frameworks/12.cloudflare-workers.md b/apps/docs/content/4.integrate/frameworks/12.cloudflare-workers.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/12.cloudflare-workers.md rename to apps/docs/content/4.integrate/frameworks/12.cloudflare-workers.md diff --git a/apps/docs/content/3.integrate/frameworks/13.standalone.md b/apps/docs/content/4.integrate/frameworks/13.standalone.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/13.standalone.md rename to apps/docs/content/4.integrate/frameworks/13.standalone.md diff --git a/apps/docs/content/3.integrate/frameworks/14.astro.md b/apps/docs/content/4.integrate/frameworks/14.astro.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/14.astro.md rename to apps/docs/content/4.integrate/frameworks/14.astro.md diff --git a/apps/docs/content/3.integrate/frameworks/15.orpc.md b/apps/docs/content/4.integrate/frameworks/15.orpc.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/15.orpc.md rename to apps/docs/content/4.integrate/frameworks/15.orpc.md diff --git a/apps/docs/content/3.integrate/frameworks/16.aws-lambda.md b/apps/docs/content/4.integrate/frameworks/16.aws-lambda.md similarity index 100% rename from apps/docs/content/3.integrate/frameworks/16.aws-lambda.md rename to apps/docs/content/4.integrate/frameworks/16.aws-lambda.md diff --git a/apps/docs/content/4.use-cases/.navigation.yml b/apps/docs/content/5.use-cases/.navigation.yml similarity index 100% rename from apps/docs/content/4.use-cases/.navigation.yml rename to apps/docs/content/5.use-cases/.navigation.yml diff --git a/apps/docs/content/4.use-cases/0.overview.md b/apps/docs/content/5.use-cases/0.overview.md similarity index 100% rename from apps/docs/content/4.use-cases/0.overview.md rename to apps/docs/content/5.use-cases/0.overview.md diff --git a/apps/docs/content/4.use-cases/1.client-logging.md b/apps/docs/content/5.use-cases/1.client-logging.md similarity index 100% rename from apps/docs/content/4.use-cases/1.client-logging.md rename to apps/docs/content/5.use-cases/1.client-logging.md diff --git a/apps/docs/content/4.use-cases/2.ai-sdk/.navigation.yml b/apps/docs/content/5.use-cases/2.ai-sdk/.navigation.yml similarity index 100% rename from apps/docs/content/4.use-cases/2.ai-sdk/.navigation.yml rename to apps/docs/content/5.use-cases/2.ai-sdk/.navigation.yml diff --git a/apps/docs/content/4.use-cases/2.ai-sdk/01.overview.md b/apps/docs/content/5.use-cases/2.ai-sdk/01.overview.md similarity index 100% rename from apps/docs/content/4.use-cases/2.ai-sdk/01.overview.md rename to apps/docs/content/5.use-cases/2.ai-sdk/01.overview.md diff --git a/apps/docs/content/4.use-cases/2.ai-sdk/02.usage.md b/apps/docs/content/5.use-cases/2.ai-sdk/02.usage.md similarity index 100% rename from apps/docs/content/4.use-cases/2.ai-sdk/02.usage.md rename to apps/docs/content/5.use-cases/2.ai-sdk/02.usage.md diff --git a/apps/docs/content/4.use-cases/2.ai-sdk/03.options.md b/apps/docs/content/5.use-cases/2.ai-sdk/03.options.md similarity index 100% rename from apps/docs/content/4.use-cases/2.ai-sdk/03.options.md rename to apps/docs/content/5.use-cases/2.ai-sdk/03.options.md diff --git a/apps/docs/content/4.use-cases/2.ai-sdk/04.metadata.md b/apps/docs/content/5.use-cases/2.ai-sdk/04.metadata.md similarity index 100% rename from apps/docs/content/4.use-cases/2.ai-sdk/04.metadata.md rename to apps/docs/content/5.use-cases/2.ai-sdk/04.metadata.md diff --git a/apps/docs/content/4.use-cases/2.ai-sdk/05.telemetry.md b/apps/docs/content/5.use-cases/2.ai-sdk/05.telemetry.md similarity index 100% rename from apps/docs/content/4.use-cases/2.ai-sdk/05.telemetry.md rename to apps/docs/content/5.use-cases/2.ai-sdk/05.telemetry.md diff --git a/apps/docs/content/4.use-cases/3.better-auth/.navigation.yml b/apps/docs/content/5.use-cases/3.better-auth/.navigation.yml similarity index 100% rename from apps/docs/content/4.use-cases/3.better-auth/.navigation.yml rename to apps/docs/content/5.use-cases/3.better-auth/.navigation.yml diff --git a/apps/docs/content/4.use-cases/3.better-auth/01.overview.md b/apps/docs/content/5.use-cases/3.better-auth/01.overview.md similarity index 100% rename from apps/docs/content/4.use-cases/3.better-auth/01.overview.md rename to apps/docs/content/5.use-cases/3.better-auth/01.overview.md diff --git a/apps/docs/content/4.use-cases/3.better-auth/02.identify-user.md b/apps/docs/content/5.use-cases/3.better-auth/02.identify-user.md similarity index 100% rename from apps/docs/content/4.use-cases/3.better-auth/02.identify-user.md rename to apps/docs/content/5.use-cases/3.better-auth/02.identify-user.md diff --git a/apps/docs/content/4.use-cases/3.better-auth/03.middleware.md b/apps/docs/content/5.use-cases/3.better-auth/03.middleware.md similarity index 100% rename from apps/docs/content/4.use-cases/3.better-auth/03.middleware.md rename to apps/docs/content/5.use-cases/3.better-auth/03.middleware.md diff --git a/apps/docs/content/4.use-cases/3.better-auth/04.client-sync.md b/apps/docs/content/5.use-cases/3.better-auth/04.client-sync.md similarity index 100% rename from apps/docs/content/4.use-cases/3.better-auth/04.client-sync.md rename to apps/docs/content/5.use-cases/3.better-auth/04.client-sync.md diff --git a/apps/docs/content/4.use-cases/3.better-auth/05.performance.md b/apps/docs/content/5.use-cases/3.better-auth/05.performance.md similarity index 100% rename from apps/docs/content/4.use-cases/3.better-auth/05.performance.md rename to apps/docs/content/5.use-cases/3.better-auth/05.performance.md diff --git a/apps/docs/content/4.use-cases/4.audit/.navigation.yml b/apps/docs/content/5.use-cases/4.audit/.navigation.yml similarity index 100% rename from apps/docs/content/4.use-cases/4.audit/.navigation.yml rename to apps/docs/content/5.use-cases/4.audit/.navigation.yml diff --git a/apps/docs/content/4.use-cases/4.audit/01.overview.md b/apps/docs/content/5.use-cases/4.audit/01.overview.md similarity index 100% rename from apps/docs/content/4.use-cases/4.audit/01.overview.md rename to apps/docs/content/5.use-cases/4.audit/01.overview.md diff --git a/apps/docs/content/4.use-cases/4.audit/02.schema.md b/apps/docs/content/5.use-cases/4.audit/02.schema.md similarity index 100% rename from apps/docs/content/4.use-cases/4.audit/02.schema.md rename to apps/docs/content/5.use-cases/4.audit/02.schema.md diff --git a/apps/docs/content/4.use-cases/4.audit/03.recording.md b/apps/docs/content/5.use-cases/4.audit/03.recording.md similarity index 100% rename from apps/docs/content/4.use-cases/4.audit/03.recording.md rename to apps/docs/content/5.use-cases/4.audit/03.recording.md diff --git a/apps/docs/content/4.use-cases/4.audit/04.pipeline.md b/apps/docs/content/5.use-cases/4.audit/04.pipeline.md similarity index 100% rename from apps/docs/content/4.use-cases/4.audit/04.pipeline.md rename to apps/docs/content/5.use-cases/4.audit/04.pipeline.md diff --git a/apps/docs/content/4.use-cases/4.audit/05.compliance.md b/apps/docs/content/5.use-cases/4.audit/05.compliance.md similarity index 100% rename from apps/docs/content/4.use-cases/4.audit/05.compliance.md rename to apps/docs/content/5.use-cases/4.audit/05.compliance.md diff --git a/apps/docs/content/4.use-cases/4.audit/06.recipes.md b/apps/docs/content/5.use-cases/4.audit/06.recipes.md similarity index 100% rename from apps/docs/content/4.use-cases/4.audit/06.recipes.md rename to apps/docs/content/5.use-cases/4.audit/06.recipes.md diff --git a/apps/docs/content/4.use-cases/4.telemetry/.navigation.yml b/apps/docs/content/5.use-cases/4.telemetry/.navigation.yml similarity index 100% rename from apps/docs/content/4.use-cases/4.telemetry/.navigation.yml rename to apps/docs/content/5.use-cases/4.telemetry/.navigation.yml diff --git a/apps/docs/content/4.use-cases/4.telemetry/01.overview.md b/apps/docs/content/5.use-cases/4.telemetry/01.overview.md similarity index 100% rename from apps/docs/content/4.use-cases/4.telemetry/01.overview.md rename to apps/docs/content/5.use-cases/4.telemetry/01.overview.md diff --git a/apps/docs/content/4.use-cases/4.telemetry/02.setup.md b/apps/docs/content/5.use-cases/4.telemetry/02.setup.md similarity index 100% rename from apps/docs/content/4.use-cases/4.telemetry/02.setup.md rename to apps/docs/content/5.use-cases/4.telemetry/02.setup.md diff --git a/apps/docs/content/4.use-cases/4.telemetry/03.ingest.md b/apps/docs/content/5.use-cases/4.telemetry/03.ingest.md similarity index 100% rename from apps/docs/content/4.use-cases/4.telemetry/03.ingest.md rename to apps/docs/content/5.use-cases/4.telemetry/03.ingest.md diff --git a/apps/docs/content/4.use-cases/4.telemetry/04.reference.md b/apps/docs/content/5.use-cases/4.telemetry/04.reference.md similarity index 100% rename from apps/docs/content/4.use-cases/4.telemetry/04.reference.md rename to apps/docs/content/5.use-cases/4.telemetry/04.reference.md diff --git a/apps/docs/content/4.use-cases/5.enrichers.md b/apps/docs/content/5.use-cases/5.enrichers.md similarity index 100% rename from apps/docs/content/4.use-cases/5.enrichers.md rename to apps/docs/content/5.use-cases/5.enrichers.md diff --git a/apps/docs/content/4.use-cases/5.eve.md b/apps/docs/content/5.use-cases/5.eve.md similarity index 100% rename from apps/docs/content/4.use-cases/5.eve.md rename to apps/docs/content/5.use-cases/5.eve.md diff --git a/apps/docs/content/5.extend/.navigation.yml b/apps/docs/content/6.extend/.navigation.yml similarity index 100% rename from apps/docs/content/5.extend/.navigation.yml rename to apps/docs/content/6.extend/.navigation.yml diff --git a/apps/docs/content/5.extend/0.overview.md b/apps/docs/content/6.extend/0.overview.md similarity index 100% rename from apps/docs/content/5.extend/0.overview.md rename to apps/docs/content/6.extend/0.overview.md diff --git a/apps/docs/content/5.extend/1.stream.md b/apps/docs/content/6.extend/1.stream.md similarity index 100% rename from apps/docs/content/5.extend/1.stream.md rename to apps/docs/content/6.extend/1.stream.md diff --git a/apps/docs/content/5.extend/10.custom-framework.md b/apps/docs/content/6.extend/10.custom-framework.md similarity index 100% rename from apps/docs/content/5.extend/10.custom-framework.md rename to apps/docs/content/6.extend/10.custom-framework.md diff --git a/apps/docs/content/5.extend/2.fs-reader.md b/apps/docs/content/6.extend/2.fs-reader.md similarity index 100% rename from apps/docs/content/5.extend/2.fs-reader.md rename to apps/docs/content/6.extend/2.fs-reader.md diff --git a/apps/docs/content/5.extend/3.consumer-recipes.md b/apps/docs/content/6.extend/3.consumer-recipes.md similarity index 100% rename from apps/docs/content/5.extend/3.consumer-recipes.md rename to apps/docs/content/6.extend/3.consumer-recipes.md diff --git a/apps/docs/content/5.extend/4.plugins.md b/apps/docs/content/6.extend/4.plugins.md similarity index 100% rename from apps/docs/content/5.extend/4.plugins.md rename to apps/docs/content/6.extend/4.plugins.md diff --git a/apps/docs/content/5.extend/5.custom-enrichers.md b/apps/docs/content/6.extend/5.custom-enrichers.md similarity index 100% rename from apps/docs/content/5.extend/5.custom-enrichers.md rename to apps/docs/content/6.extend/5.custom-enrichers.md diff --git a/apps/docs/content/5.extend/6.tail-sampling.md b/apps/docs/content/6.extend/6.tail-sampling.md similarity index 100% rename from apps/docs/content/5.extend/6.tail-sampling.md rename to apps/docs/content/6.extend/6.tail-sampling.md diff --git a/apps/docs/content/5.extend/7.identity-headers.md b/apps/docs/content/6.extend/7.identity-headers.md similarity index 100% rename from apps/docs/content/5.extend/7.identity-headers.md rename to apps/docs/content/6.extend/7.identity-headers.md diff --git a/apps/docs/content/5.extend/8.custom-drains.md b/apps/docs/content/6.extend/8.custom-drains.md similarity index 100% rename from apps/docs/content/5.extend/8.custom-drains.md rename to apps/docs/content/6.extend/8.custom-drains.md diff --git a/apps/docs/content/5.extend/9.drain-pipeline.md b/apps/docs/content/6.extend/9.drain-pipeline.md similarity index 100% rename from apps/docs/content/5.extend/9.drain-pipeline.md rename to apps/docs/content/6.extend/9.drain-pipeline.md diff --git a/apps/docs/content/6.reference/.navigation.yml b/apps/docs/content/7.reference/.navigation.yml similarity index 100% rename from apps/docs/content/6.reference/.navigation.yml rename to apps/docs/content/7.reference/.navigation.yml diff --git a/apps/docs/content/6.reference/1.configuration.md b/apps/docs/content/7.reference/1.configuration.md similarity index 100% rename from apps/docs/content/6.reference/1.configuration.md rename to apps/docs/content/7.reference/1.configuration.md diff --git a/apps/docs/content/6.reference/2.performance.md b/apps/docs/content/7.reference/2.performance.md similarity index 100% rename from apps/docs/content/6.reference/2.performance.md rename to apps/docs/content/7.reference/2.performance.md diff --git a/apps/docs/content/6.reference/3.vite-plugin.md b/apps/docs/content/7.reference/3.vite-plugin.md similarity index 100% rename from apps/docs/content/6.reference/3.vite-plugin.md rename to apps/docs/content/7.reference/3.vite-plugin.md diff --git a/apps/docs/content/6.reference/4.best-practices.md b/apps/docs/content/7.reference/4.best-practices.md similarity index 100% rename from apps/docs/content/6.reference/4.best-practices.md rename to apps/docs/content/7.reference/4.best-practices.md diff --git a/apps/docs/content/6.reference/5.vs-other-loggers.md b/apps/docs/content/7.reference/5.vs-other-loggers.md similarity index 100% rename from apps/docs/content/6.reference/5.vs-other-loggers.md rename to apps/docs/content/7.reference/5.vs-other-loggers.md diff --git a/apps/docs/content/6.reference/6.agent-skills.md b/apps/docs/content/7.reference/6.agent-skills.md similarity index 100% rename from apps/docs/content/6.reference/6.agent-skills.md rename to apps/docs/content/7.reference/6.agent-skills.md diff --git a/apps/docs/skills/build-audit-logs/SKILL.md b/apps/docs/skills/build-audit-logs/SKILL.md index 7411fa14..0e13a0a6 100644 --- a/apps/docs/skills/build-audit-logs/SKILL.md +++ b/apps/docs/skills/build-audit-logs/SKILL.md @@ -444,6 +444,6 @@ Then map each finding to the relevant step in the buildout above (e.g. P0 → St ## Reference - Per-framework wiring (Hono, Express, Next.js, standalone): [`references/framework-wiring.md`](references/framework-wiring.md) -- Docs: [Audit logs overview](https://www.evlog.dev/use-cases/audit/overview) — source at [`apps/docs/content/4.use-cases/4.audit/`](../../../apps/docs/content/4.use-cases/4.audit/) +- Docs: [Audit logs overview](https://www.evlog.dev/use-cases/audit/overview) — source at [`apps/docs/content/5.use-cases/4.audit/`](../../../apps/docs/content/5.use-cases/4.audit/) - Source: [`packages/evlog/src/audit.ts`](../../../packages/evlog/src/audit.ts) - Tests: [`packages/evlog/test/core/audit.test.ts`](../../../packages/evlog/test/core/audit.test.ts) diff --git a/apps/docs/test/redirects.test.ts b/apps/docs/test/redirects.test.ts index 44f259c4..dcf24b6e 100644 --- a/apps/docs/test/redirects.test.ts +++ b/apps/docs/test/redirects.test.ts @@ -84,6 +84,7 @@ describe('docs redirects', () => { it.each([ '/start', '/learn', + '/cli', '/integrate', '/reference', '/examples', diff --git a/packages/cli/src/lib/map/report.ts b/packages/cli/src/lib/map/report.ts index 93a65643..90114ed4 100644 --- a/packages/cli/src/lib/map/report.ts +++ b/packages/cli/src/lib/map/report.ts @@ -180,7 +180,7 @@ function createReportStyle(ctx: CliContext): ReportStyle { } function ruleDocs(id: CheckId): string { - return getRule(id)?.docs ?? '/cli/map' + return getRule(id)?.docs ?? '/cli/rules' } function ruleExpects(id: CheckId): string { @@ -218,7 +218,7 @@ function priorityReason(route: RouteEntry): { sentence: string, doc: string } { const [first] = failed return first ? { sentence: `missing ${ruleExpects(first)}`, doc: ruleDocs(first) } - : { sentence: 'has gaps', doc: '/cli/map' } + : { sentence: 'has gaps', doc: '/cli/rules' } } /** Worst first, sensitive entry points ahead of the rest. */ @@ -459,7 +459,7 @@ export function formatMapReport( lines.push('') lines.push(gradientRule(ctx, HEADER_GRADIENT_WIDTH)) const written = options.mapPath ? 'evlog.map.json updated · ' : '' - lines.push(`${paint('dim', `${written}how this score works →`)} ${style.doc('/cli/map')}`) + lines.push(`${paint('dim', `${written}how this score works →`)} ${style.doc('/cli/scoring')}`) lines.push(...hintLines(style)) return lines.join('\n') @@ -639,7 +639,7 @@ export function formatMapMatrix(ctx: CliContext, result: ScanResult): string { `${paint('cyan', 'A')}${paint('dim', ' auth')}`, `${paint('yellow', '@')}${paint('dim', ' pii')}`, ].join(' ')) - lines.push(`${paint('dim', 'what each column checks →')} ${style.doc('/cli/map')}`) + lines.push(`${paint('dim', 'what each column checks →')} ${style.doc('/cli/rules')}`) return lines.join('\n') } @@ -847,7 +847,7 @@ export function formatGate(ctx: CliContext, result: ScanResult, threshold: numbe const lines = ['', `${badge} ${verdict}`] if (!passed) { - lines.push(`${paint('dim', 'fix what is listed under FIX FIRST to pass ·')} ${style.doc('/cli/map')}`) + lines.push(`${paint('dim', 'fix what is listed under FIX FIRST to pass ·')} ${style.doc('/cli/ci')}`) } return lines.join('\n') } From 81ef278ea604b5e0c938ce305aba2fe55d6494bb Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Sat, 25 Jul 2026 21:27:15 +0100 Subject: [PATCH 06/11] docs: sell the CLI on the landing page and flag it as early days --- .changeset/cli-early-days-note.md | 5 + .../app/components/features/FeatureCliMap.vue | 344 ++++++++++++++++++ apps/docs/content/0.landing.md | 15 + apps/docs/content/3.cli/0.overview.md | 4 + apps/docs/content/3.cli/1.map.md | 4 + apps/docs/content/3.cli/2.rules.md | 4 + apps/docs/content/3.cli/4.ci.md | 19 +- packages/cli/README.md | 29 +- packages/evlog/README.md | 32 ++ 9 files changed, 450 insertions(+), 6 deletions(-) create mode 100644 .changeset/cli-early-days-note.md create mode 100644 apps/docs/app/components/features/FeatureCliMap.vue diff --git a/.changeset/cli-early-days-note.md b/.changeset/cli-early-days-note.md new file mode 100644 index 00000000..983c4af9 --- /dev/null +++ b/.changeset/cli-early-days-note.md @@ -0,0 +1,5 @@ +--- +"@evlog/cli": patch +--- + +Say out loud that the CLI is young. The README now carries an early-days note: `evlog map` is safe to run and covered by tests, but it has adapters for four frameworks and its rules are still being refined, so verdicts and scores can move between releases — pin the CLI as a dev dependency when a CI gate depends on the number. The command table and the `--json` examples were also brought back in line with what the command actually does today (`evlog map `, the `--all` check matrix, `--verbose`, `--cwd`, and the `map` payload alongside the `doctor` one), and the docs links now point at the new CLI reference. diff --git a/apps/docs/app/components/features/FeatureCliMap.vue b/apps/docs/app/components/features/FeatureCliMap.vue new file mode 100644 index 00000000..54421f2e --- /dev/null +++ b/apps/docs/app/components/features/FeatureCliMap.vue @@ -0,0 +1,344 @@ + + + diff --git a/apps/docs/content/0.landing.md b/apps/docs/content/0.landing.md index fc474510..a00af588 100644 --- a/apps/docs/content/0.landing.md +++ b/apps/docs/content/0.landing.md @@ -47,6 +47,21 @@ A modern TypeScript logger built for everything you ship. Simple logs, wide even Structured fields, machine-readable context, and actionable metadata that give AI agents everything they need to diagnose and resolve issues on their own. Enable the file system drain to write NDJSON logs locally and let agents read them directly. ::: + :::features-feature-cli-map + --- + link: /cli/map + link-label: evlog map guide + --- + #headline + Observability Score + + #title + One command. :br Every blind spot + + #description + evlog map reads your project on disk and scores every entry point — handlers, pages, middleware, jobs, server actions. No traffic, no instrumentation, no guessing: the same code always produces the same verdict, each one carrying the file, the line, and the rule it broke. Watch the number move as you fix things, gate a pull request on it, or hand the report to an agent and let it work through the list. Early days — the rules are still being refined and more frameworks are on the way. + ::: + :::features-feature-adapters --- link: /integrate/adapters/overview diff --git a/apps/docs/content/3.cli/0.overview.md b/apps/docs/content/3.cli/0.overview.md index 5e17bfb4..5409df92 100644 --- a/apps/docs/content/3.cli/0.overview.md +++ b/apps/docs/content/3.cli/0.overview.md @@ -21,6 +21,10 @@ links: Its main job is [`evlog map`](/cli/map) — a static observability score for your app, in the spirit of Lighthouse. It finds every entry point in your project, checks each one for wide-event coverage, and tells you which three to fix first. +::warning{icon="i-lucide-flask-conical"} +**Early days.** The CLI is safe to run on any project — it only reads files, and it is covered by tests — but it is young. `evlog map` understands four frameworks today, its rules are still being refined, and both will grow. Expect verdicts and scores to move between releases, and [pin the version](/cli/ci#pin-the-version) when you gate CI on the number. +:: + ::code-group ```bash [pnpm] pnpm dlx @evlog/cli map diff --git a/apps/docs/content/3.cli/1.map.md b/apps/docs/content/3.cli/1.map.md index cf47be0e..5b418fdd 100644 --- a/apps/docs/content/3.cli/1.map.md +++ b/apps/docs/content/3.cli/1.map.md @@ -25,6 +25,10 @@ It finds every entry point — API handlers, pages that fetch, middleware, sched evlog map ``` +::warning{icon="i-lucide-flask-conical"} +**Early days.** The foundation is solid — AST-based, tested, with a versioned JSON contract — but the rule set is young and only four frameworks have adapters. A release that sharpens a rule can change a verdict on code you did not touch, so [pin the CLI version](/cli/ci#pin-the-version) if you gate a pull request on the score. +:: + ::prompt --- description: Raise my evlog map score diff --git a/apps/docs/content/3.cli/2.rules.md b/apps/docs/content/3.cli/2.rules.md index b9997005..fbc8ee4f 100644 --- a/apps/docs/content/3.cli/2.rules.md +++ b/apps/docs/content/3.cli/2.rules.md @@ -19,6 +19,10 @@ links: Coverage is checked by a rule engine, not a bag of heuristics. Each rule has a stable id, a documented weight, a docs link, and a set of entry point kinds it applies to — and every finding carries the file and line it came from, so a verdict is always something you can go and look at. +::warning{icon="i-lucide-flask-conical"} +**This list is not final.** Ten rules is where the engine starts, not where it ends. Rules will be added, existing ones will get more precise about what counts, and a sharper rule can change a verdict on code you did not touch. Ids and weights are documented so the change is always explainable — but do not treat a score as comparable across CLI versions. +:: + Rules come in two categories, and the difference matters: | | Requirements | Opportunities | diff --git a/apps/docs/content/3.cli/4.ci.md b/apps/docs/content/3.cli/4.ci.md index bdb81f4a..862bcfb5 100644 --- a/apps/docs/content/3.cli/4.ci.md +++ b/apps/docs/content/3.cli/4.ci.md @@ -72,7 +72,24 @@ jobs: - run: npx @evlog/cli map --min-score 80 --no-write ``` -`--no-write` keeps the job from producing an `evlog.map.json` nobody will read. Pin the CLI as a dev dependency instead of using `npx` when you want every run on the same version. +`--no-write` keeps the job from producing an `evlog.map.json` nobody will read. + +### Pin the version + +The CLI is young: rules are still being refined and new ones will be added, so a release can change a verdict on code nobody touched. On a gated job that shows up as a pull request failing for reasons its author cannot see in the diff. + +Install the CLI as a dev dependency and let your lockfile hold it still: + +```bash [Terminal] +pnpm add -D @evlog/cli +``` + +```yaml [.github/workflows/observability.yml] + - run: pnpm install --frozen-lockfile + - run: pnpm evlog map --min-score 80 --no-write +``` + +Then a score change is always something you did, and upgrading the CLI is its own pull request — where a moved score is the point rather than a surprise. ### Ratchet, don't cliff diff --git a/packages/cli/README.md b/packages/cli/README.md index 903b5656..a1ebab72 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -15,7 +15,9 @@ The official command line for [evlog](https://evlog.dev). -Diagnose your install. Inspect wide events. Audit and map what your app emits. +Diagnose your install. Score what your app can tell you when something goes wrong. + +> **Early days.** Safe to run on any project — it only reads files, and it is covered by tests — but young. `evlog map` has adapters for four frameworks today, its rules are still being refined, and both will grow. Expect verdicts and scores to move between releases: pin the CLI as a dev dependency when you gate CI on the number. ## Usage @@ -40,10 +42,13 @@ npx @evlog/cli doctor --cwd apps/web | `evlog doctor --cwd ` | Run against another directory | | `evlog doctor --debug` | Same, plus a debug wide event (see Debug) | | `evlog map` | Static observability score for the current app — Lighthouse for wide events | +| `evlog map ` | Explain one entry point: why it was scanned, each verdict, the shape it could take | +| `evlog map --all` | Every entry point as a check matrix, grouped by directory | | `evlog map --framework ` | Override framework detection (`nuxt`, `nitro`, `next`, `tanstack-start`) | -| `evlog map --all` | Show every scanned route in the report, not just the worst 15 | | `evlog map --min-score ` | Exit 1 if the global score is below `n` | | `evlog map --no-write` | Skip writing `evlog.map.json` to the project root | +| `evlog map --verbose` | Show per-file parse warnings | +| `evlog map --cwd ` | Scan another app in the workspace | | `evlog telemetry status` | Show telemetry status and disclosure | | `evlog telemetry enable` / `disable` | Change telemetry preference (disable purges buffered data) | @@ -60,14 +65,24 @@ npx @evlog/cli doctor --cwd apps/web With `--json`, the payload is the **only** thing written to stdout — everything human goes to stderr. The shape is a contract: ```jsonc +// evlog doctor --json { - "schemaVersion": 1, + "schemaVersion": 2, "checks": [{ "id": "node", "status": "ok", "message": "Node v22.1.0" }], "summary": { "ok": 4, "warn": 0, "fail": 0 } } ``` -Breaking this shape requires a `schemaVersion` bump. +```jsonc +// evlog map --json +{ + "schemaVersion": 2, + "map": { "version": 1, "framework": "nuxt", "score": 76, "routes": [] }, + "summary": { "instrumented": 19, "partial": 2, "dark": 8, "exempt": 0 } +} +``` + +Breaking either shape requires a `schemaVersion` bump. In `routes[]`, `checks` holds the requirements that move the score and `suggestions` holds the opportunities that never do — separate keys so a suggestion can't be mistaken for a failure. ## Telemetry @@ -112,4 +127,8 @@ src/ ## Docs -Full guide: [evlog.dev](https://evlog.dev) +- [CLI overview](https://evlog.dev/cli/overview) — commands, global flags, exit codes +- [`evlog map`](https://evlog.dev/cli/map) — what it scans and how to read the report +- [Rules](https://evlog.dev/cli/rules) — every check, what satisfies it, how to fix it +- [Scoring](https://evlog.dev/cli/scoring) — weights, grades, sensitivity +- [CI](https://evlog.dev/cli/ci) — gate a pull request on the score diff --git a/packages/evlog/README.md b/packages/evlog/README.md index 5262487f..0ba37c19 100644 --- a/packages/evlog/README.md +++ b/packages/evlog/README.md @@ -1423,6 +1423,38 @@ try { | **Vinxi** | Nitro v2 module setup | | **SolidStart** | Nitro v2 module setup ([example](./examples/solidstart)) | +## CLI + +[`@evlog/cli`](https://npmjs.com/package/@evlog/cli) scores what your app can tell you when something goes wrong. It reads your project on disk — no traffic, no instrumentation — finds every entry point, and names the ones to fix first. + +```bash +npx @evlog/cli map +``` + +``` +▀▀█ █▀▀ score /100 your-app · Nuxt + █ █▀█ ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▱▱▱▱▱ 29 entry points scanned + ▀ ▀▀▀ good ▂▂▂▃▃▃▃▃▄▆▆▆▆▆███████████████ + +FIX FIRST +1. ANY /api/auth/:all* A — touches auth and logs nothing + server/api/auth/[...all].ts:1 · evlog.dev/learn/wide-events +``` + +| Command | What it does | +|---------|-------------| +| `evlog map` | Score every entry point and list the three worth fixing first | +| `evlog map ` | Explain one entry point in full, with the shape it could take | +| `evlog map --all` | Every entry point as a check matrix | +| `evlog map --min-score ` | Exit 1 below the threshold — a CI gate | +| `evlog doctor` | Diagnose the install: Node, workspace, evlog version, local logs | + +Same code in, same verdict out, with the file and line for every finding — which also makes it something you can hand to an agent: run it, fix the list, run it again. + +> **Early days:** the CLI is tested and safe to run on any project, but it is young — four framework adapters today, rules still being refined. Expect verdicts and scores to move between releases; pin it as a dev dependency when you gate CI on the number. + +Docs: [CLI](https://www.evlog.dev/cli/overview) · [`evlog map`](https://www.evlog.dev/cli/map) · [Rules](https://www.evlog.dev/cli/rules) · [Scoring](https://www.evlog.dev/cli/scoring) + ## Agent Skills evlog provides [Agent Skills](https://www.evlog.dev/reference/agent-skills) to help AI coding assistants understand and implement proper logging patterns in your codebase. From dddba3e11a5a3091f8846ca10d6edc744f5af931 Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Sat, 25 Jul 2026 21:58:13 +0100 Subject: [PATCH 07/11] docs: complete the landing header menu with the CLI and the missing pages --- .../app/components/app/AppHeaderCenter.vue | 114 ++++++++++++++++++ apps/docs/content/3.cli/.navigation.yml | 1 - 2 files changed, 114 insertions(+), 1 deletion(-) diff --git a/apps/docs/app/components/app/AppHeaderCenter.vue b/apps/docs/app/components/app/AppHeaderCenter.vue index 85c41b3b..19a345a0 100644 --- a/apps/docs/app/components/app/AppHeaderCenter.vue +++ b/apps/docs/app/components/app/AppHeaderCenter.vue @@ -42,6 +42,18 @@ const landingItems = [ icon: 'i-lucide-bot', description: 'Use evlog with AI coding agents', to: '/reference/agent-skills' + }, + { + label: 'Configuration', + icon: 'i-lucide-settings', + description: 'Every option, env var, and default', + to: '/reference/configuration' + }, + { + label: 'Best Practices', + icon: 'i-lucide-shield-check', + description: 'What to log, what never to log', + to: '/reference/best-practices' } ] }, @@ -84,6 +96,60 @@ const landingItems = [ icon: 'i-lucide-filter', description: 'Keep all errors, drop healthy noise', to: '/learn/sampling' + }, + { + label: 'Auto-Redaction', + icon: 'i-lucide-eye-off', + description: 'Strip secrets before they leave the process', + to: '/learn/redaction' + }, + { + label: 'Typed Fields', + icon: 'i-simple-icons-typescript', + description: 'Autocomplete your own log.set fields', + to: '/learn/typed-fields' + } + ] + }, + { + label: 'CLI', + to: '/cli/overview', + children: [ + { + label: 'Overview', + icon: 'i-lucide-terminal', + description: 'Commands, flags, exit codes', + to: '/cli/overview' + }, + { + label: 'evlog map', + icon: 'i-lucide-radar', + description: 'Score every entry point in your app', + to: '/cli/map' + }, + { + label: 'Rules', + icon: 'i-lucide-list-checks', + description: 'Every check and how to satisfy it', + to: '/cli/rules' + }, + { + label: 'Scoring', + icon: 'i-lucide-gauge', + description: 'Weights, grades, and sensitivity', + to: '/cli/scoring' + }, + { + label: 'CI', + icon: 'i-lucide-git-pull-request', + description: 'Gate a pull request on the score', + to: '/cli/ci' + }, + { + label: 'evlog doctor', + icon: 'i-lucide-stethoscope', + description: 'Diagnose your evlog install', + to: '/cli/doctor' } ] }, @@ -115,6 +181,12 @@ const landingItems = [ description: 'Nitro v2 and v3 plugin', to: '/integrate/frameworks/nitro' }, + { + label: 'TanStack Start', + icon: 'i-custom-tanstack', + description: 'Nitro v3 module with async context', + to: '/integrate/frameworks/tanstack-start' + }, { label: 'Hono', icon: 'i-simple-icons-hono', @@ -127,6 +199,12 @@ const landingItems = [ description: 'Express middleware', to: '/integrate/frameworks/express' }, + { + label: 'NestJS', + icon: 'i-simple-icons-nestjs', + description: 'Module with global middleware', + to: '/integrate/frameworks/nestjs' + }, { label: 'Cloudflare Workers', icon: 'i-simple-icons-cloudflare', @@ -139,6 +217,12 @@ const landingItems = [ description: 'Scripts, jobs, libraries, anything', to: '/integrate/frameworks/standalone' }, + { + label: 'Custom framework', + icon: 'i-lucide-puzzle', + description: 'Wire up a framework evlog has no module for', + to: '/extend/custom-framework' + }, { label: 'All frameworks', icon: 'i-lucide-layers', @@ -205,6 +289,18 @@ const landingItems = [ description: 'Persist logs in NuxtHub D1', to: '/integrate/adapters/self-hosted/nuxthub' }, + { + label: 'Drain pipeline', + icon: 'i-lucide-workflow', + description: 'Batching, retries, fan-out to many sinks', + to: '/extend/drain-pipeline' + }, + { + label: 'Custom drains', + icon: 'i-lucide-share-2', + description: 'Send events anywhere with the toolkit', + to: '/extend/custom-drains' + }, { label: 'All adapters', icon: 'i-custom-plug', @@ -246,6 +342,24 @@ const landingItems = [ icon: 'i-lucide-sparkles', description: 'Auto-add User-Agent, geo, trace context', to: '/use-cases/enrichers' + }, + { + label: 'Telemetry', + icon: 'i-lucide-gauge', + description: 'One event per run for your own CLI', + to: '/use-cases/telemetry/overview' + }, + { + label: 'eve', + icon: 'i-custom-eve', + description: 'Observability for eve agents', + to: '/use-cases/eve' + }, + { + label: 'All use cases', + icon: 'i-lucide-layers', + description: 'See everything evlog is used for', + to: '/use-cases/overview' } ] } diff --git a/apps/docs/content/3.cli/.navigation.yml b/apps/docs/content/3.cli/.navigation.yml index bc0041fe..0f52a8ea 100644 --- a/apps/docs/content/3.cli/.navigation.yml +++ b/apps/docs/content/3.cli/.navigation.yml @@ -1,2 +1 @@ title: CLI -icon: i-lucide-terminal From c78f6c79d70a33b70bd46e1c0db56f70600231ec Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Sat, 25 Jul 2026 21:58:19 +0100 Subject: [PATCH 08/11] docs: animate the map loop on the CLI pages --- .../docs/app/components/content/MapPrGate.vue | 261 +++++++++++++++ .../app/components/content/MapScanFlow.vue | 305 ++++++++++++++++++ .../app/components/content/MapScoreClimb.vue | 250 ++++++++++++++ .../docs/app/components/content/StreamBus.vue | 2 +- apps/docs/content/3.cli/1.map.md | 3 + apps/docs/content/3.cli/3.scoring.md | 5 + apps/docs/content/3.cli/4.ci.md | 5 + 7 files changed, 830 insertions(+), 1 deletion(-) create mode 100644 apps/docs/app/components/content/MapPrGate.vue create mode 100644 apps/docs/app/components/content/MapScanFlow.vue create mode 100644 apps/docs/app/components/content/MapScoreClimb.vue diff --git a/apps/docs/app/components/content/MapPrGate.vue b/apps/docs/app/components/content/MapPrGate.vue new file mode 100644 index 00000000..51674bd6 --- /dev/null +++ b/apps/docs/app/components/content/MapPrGate.vue @@ -0,0 +1,261 @@ + + + diff --git a/apps/docs/app/components/content/MapScanFlow.vue b/apps/docs/app/components/content/MapScanFlow.vue new file mode 100644 index 00000000..fc9bf8c7 --- /dev/null +++ b/apps/docs/app/components/content/MapScanFlow.vue @@ -0,0 +1,305 @@ + + + diff --git a/apps/docs/app/components/content/MapScoreClimb.vue b/apps/docs/app/components/content/MapScoreClimb.vue new file mode 100644 index 00000000..a3ffc524 --- /dev/null +++ b/apps/docs/app/components/content/MapScoreClimb.vue @@ -0,0 +1,250 @@ + + + diff --git a/apps/docs/app/components/content/StreamBus.vue b/apps/docs/app/components/content/StreamBus.vue index 995a0ac4..40689546 100644 --- a/apps/docs/app/components/content/StreamBus.vue +++ b/apps/docs/app/components/content/StreamBus.vue @@ -105,7 +105,7 @@ onMounted(() => { onBus.value = true state.value = { sync: 'delivered', iter: 'delivered', ring: 'delivered' } ringFill.value = RING_MAX - totalEmitted.value = EMITS + totalEmitted.value = EMIT_COUNT return } if (!wrapperRef.value) { diff --git a/apps/docs/content/3.cli/1.map.md b/apps/docs/content/3.cli/1.map.md index 5b418fdd..f3800a1a 100644 --- a/apps/docs/content/3.cli/1.map.md +++ b/apps/docs/content/3.cli/1.map.md @@ -21,6 +21,9 @@ links: It finds every entry point — API handlers, pages that fetch, middleware, scheduled jobs, server actions — checks each one for wide-event coverage, scores it, and names the three worth fixing first. Nothing runs, nothing is instrumented, no traffic is needed: it is static analysis over your source. +::map-scan-flow +:: + ```bash [Terminal] evlog map ``` diff --git a/apps/docs/content/3.cli/3.scoring.md b/apps/docs/content/3.cli/3.scoring.md index 3796a9b1..af75e6e9 100644 --- a/apps/docs/content/3.cli/3.scoring.md +++ b/apps/docs/content/3.cli/3.scoring.md @@ -49,6 +49,11 @@ CHECKS Weights add up to more than 100 on purpose. A handler that fails everything lands at 0, and the ordering of what to fix first stays meaningful: `wide-event` at 40 outweighs any pair of the smaller rules. :: +Which makes the arithmetic legible in both directions. Here is the worst entry point in the playground going from `20` to `100`, one line at a time, each fix worth exactly the weight of the rule it satisfies: + +::map-score-climb +:: + ## The project score The global score is the average of every entry point, weighted by how much a blind spot there would cost you: diff --git a/apps/docs/content/3.cli/4.ci.md b/apps/docs/content/3.cli/4.ci.md index 862bcfb5..8c725737 100644 --- a/apps/docs/content/3.cli/4.ci.md +++ b/apps/docs/content/3.cli/4.ci.md @@ -38,6 +38,11 @@ fix what is listed under FIX FIRST to pass · evlog.dev/cli/ci The full report is printed either way, so a failed job tells you what to fix without a second run. +Which turns the score into something a pull request can move. One run says the app is short of the bar and names the three entry points responsible, the next one says it is over: + +::map-pr-gate +:: + ::callout{icon="i-lucide-shield-check" color="neutral"} [Opportunities](/cli/rules#opportunities) never affect the score, so a gate can never fail because the CLI suggested you adopt a feature. Only requirements can fail a build. :: From a60031543163d098e590c64efce36ba2a64c62f9 Mon Sep 17 00:00:00 2001 From: Hugo Richard Date: Sat, 25 Jul 2026 21:58:45 +0100 Subject: [PATCH 09/11] docs: collapse the long code blocks and scroll their long lines --- apps/docs/app/app.config.ts | 7 +++++++ apps/docs/content/3.cli/1.map.md | 4 ++++ apps/docs/content/3.cli/4.ci.md | 2 ++ apps/docs/content/4.integrate/frameworks/02.nextjs.md | 4 ++++ .../content/4.integrate/frameworks/05.tanstack-start.md | 2 ++ .../4.integrate/frameworks/12.cloudflare-workers.md | 2 ++ apps/docs/content/5.use-cases/4.audit/02.schema.md | 2 ++ apps/docs/content/5.use-cases/4.telemetry/02.setup.md | 2 ++ apps/docs/content/6.extend/10.custom-framework.md | 2 ++ apps/docs/content/6.extend/3.consumer-recipes.md | 4 ++++ apps/docs/content/6.extend/8.custom-drains.md | 2 ++ apps/docs/content/7.reference/4.best-practices.md | 2 ++ 12 files changed, 35 insertions(+) diff --git a/apps/docs/app/app.config.ts b/apps/docs/app/app.config.ts index 81545895..f1cc16b4 100644 --- a/apps/docs/app/app.config.ts +++ b/apps/docs/app/app.config.ts @@ -52,6 +52,13 @@ export default defineAppConfig({ }, }, prose: { + pre: { + slots: { + // Scroll long lines instead of wrapping them: CLI output and check + // matrices are column-aligned, and a soft wrap destroys the alignment. + base: 'whitespace-pre wrap-normal', + }, + }, codeIcon: { 'nuxt': 'i-vscode-icons-file-type-nuxt', 'nuxt / nitro': 'i-vscode-icons-file-type-nuxt', diff --git a/apps/docs/content/3.cli/1.map.md b/apps/docs/content/3.cli/1.map.md index f3800a1a..76eace55 100644 --- a/apps/docs/content/3.cli/1.map.md +++ b/apps/docs/content/3.cli/1.map.md @@ -58,6 +58,7 @@ Rules: https://www.evlog.dev/cli/rules This is a real run against the evlog playground, a Nuxt app with 29 entry points: +::code-collapse ```text [evlog map] ▀▀█ █▀▀ score /100 evlog-playground · Nuxt █ █▀█ ▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▱▱▱▱▱ 29 entry points scanned @@ -92,6 +93,7 @@ evlog.map.json updated · how this score works → evlog.dev/cli/scoring ▸ evlog map --all every entry point · evlog map inspect one --min-score 80 CI gate ``` +:: Read from the top down, each block answers a different question. @@ -184,6 +186,7 @@ evlog map server/api/auth/login.post.ts evlog map /api/auth/login ``` +::code-collapse ```text [evlog map server/api/auth/login.post.ts] POST /api/auth/login A ▰▰▰▰▰▰▰▰▱▱ 75/100 server/api/auth/login.post.ts · Nuxt @@ -209,6 +212,7 @@ SUGGESTED SHAPE — Nuxt ▲ fixing this entry point: 75 → 100 ``` +:: Four things worth noting: diff --git a/apps/docs/content/3.cli/4.ci.md b/apps/docs/content/3.cli/4.ci.md index 8c725737..a3cf16bf 100644 --- a/apps/docs/content/3.cli/4.ci.md +++ b/apps/docs/content/3.cli/4.ci.md @@ -134,6 +134,7 @@ evlog map --json --no-write > map.json `mapPath` is `null` under `--no-write`. Each entry in `map.routes` looks like this: +::code-collapse ```json [One entry point] { "framework": "nuxt", @@ -159,6 +160,7 @@ evlog map --json --no-write > map.json "score": 75 } ``` +:: `checks` holds requirements, `suggestions` holds opportunities. They are separate keys precisely so a consumer — or a CI script — can never mistake a suggestion for a failure. Rule ids are stable: the registry and the published id union are checked against each other at build time, so a release cannot silently change what you receive. diff --git a/apps/docs/content/4.integrate/frameworks/02.nextjs.md b/apps/docs/content/4.integrate/frameworks/02.nextjs.md index e3855b8a..d28a2482 100644 --- a/apps/docs/content/4.integrate/frameworks/02.nextjs.md +++ b/apps/docs/content/4.integrate/frameworks/02.nextjs.md @@ -186,6 +186,7 @@ defineNodeInstrumentation({ A real-world `lib/evlog.ts` with enrichers, batched drain, tail sampling, and route-based service names: +::code-collapse ```typescript [lib/evlog.ts] import type { DrainContext } from 'evlog' import { createEvlog } from 'evlog/next' @@ -241,6 +242,7 @@ export const { withEvlog, useLogger, log, createError } = createEvlog({ drain, }) ``` +:: ## Wide Events @@ -304,6 +306,7 @@ export const POST = withEvlog(async () => { Use `createError` for structured errors with `why`, `fix`, and `link` fields that help developers debug in both logs and API responses: +::code-collapse ```typescript [app/api/payment/process/route.ts] import { withEvlog, useLogger, createError } from '@/lib/evlog' @@ -338,6 +341,7 @@ export const POST = withEvlog(async (request: Request) => { return Response.json({ success: true }) }) ``` +:: `withEvlog()` catches `EvlogError` and returns a structured JSON response (like Nitro does for Nuxt): diff --git a/apps/docs/content/4.integrate/frameworks/05.tanstack-start.md b/apps/docs/content/4.integrate/frameworks/05.tanstack-start.md index 726f616b..4ff7784d 100644 --- a/apps/docs/content/4.integrate/frameworks/05.tanstack-start.md +++ b/apps/docs/content/4.integrate/frameworks/05.tanstack-start.md @@ -153,6 +153,7 @@ All fields are merged into a single wide event emitted when the request complete Use `createError` for structured errors with `why`, `fix`, and `link` fields: +::code-collapse ```typescript [src/routes/api/checkout.ts] import { createFileRoute } from '@tanstack/react-router' import { useRequest } from 'nitro/context' @@ -188,6 +189,7 @@ export const Route = createFileRoute('/api/checkout')({ }, }) ``` +:: The error is captured and logged with both the custom context and structured error fields: diff --git a/apps/docs/content/4.integrate/frameworks/12.cloudflare-workers.md b/apps/docs/content/4.integrate/frameworks/12.cloudflare-workers.md index 434ccd46..71570d3a 100644 --- a/apps/docs/content/4.integrate/frameworks/12.cloudflare-workers.md +++ b/apps/docs/content/4.integrate/frameworks/12.cloudflare-workers.md @@ -117,6 +117,7 @@ export default defineWorkerFetch(async (request, env, _ctx, log) => { Use `createError` for structured errors and handle them with try/catch: +::code-collapse ```typescript [src/worker.ts] import { createError, parseError } from 'evlog' import { defineWorkerFetch, initWorkersLogger } from 'evlog/workers' @@ -152,6 +153,7 @@ export default defineWorkerFetch(async (request, env, _ctx, log) => { } }) ``` +:: ## Configuration diff --git a/apps/docs/content/5.use-cases/4.audit/02.schema.md b/apps/docs/content/5.use-cases/4.audit/02.schema.md index 33a1ac04..c252b2e3 100644 --- a/apps/docs/content/5.use-cases/4.audit/02.schema.md +++ b/apps/docs/content/5.use-cases/4.audit/02.schema.md @@ -21,6 +21,7 @@ links: ## `AuditFields` type +::code-collapse ```typescript interface AuditFields { action: string // 'invoice.refund' @@ -55,6 +56,7 @@ interface AuditFields { hash?: string } ``` +:: ## Action naming diff --git a/apps/docs/content/5.use-cases/4.telemetry/02.setup.md b/apps/docs/content/5.use-cases/4.telemetry/02.setup.md index efa6ba3d..3d315fd2 100644 --- a/apps/docs/content/5.use-cases/4.telemetry/02.setup.md +++ b/apps/docs/content/5.use-cases/4.telemetry/02.setup.md @@ -96,6 +96,7 @@ The root `meta.name` is not prefixed when the root only delegates to `subCommand Call `telemetry.set()` anywhere inside a command handler — or in helpers that run on the same async stack (the run context is preserved via AsyncLocalStorage). +::code-collapse ```ts [src/commands/doctor.ts] import { telemetry } from '@evlog/telemetry' import { existsSync } from 'node:fs' @@ -135,6 +136,7 @@ export const doctorCommand = { }, } ``` +:: Throw an error with a `code` property and `outcome: "error"` plus `errorCode` are recorded automatically: diff --git a/apps/docs/content/6.extend/10.custom-framework.md b/apps/docs/content/6.extend/10.custom-framework.md index 64c78dc6..fddf334e 100644 --- a/apps/docs/content/6.extend/10.custom-framework.md +++ b/apps/docs/content/6.extend/10.custom-framework.md @@ -98,6 +98,7 @@ Types like `RequestLogger`, `DrainContext`, `EnrichContext`, `WideEvent`, and `T Most frameworks fit a `(ctx, next)` middleware shape. For those, write a manifest describing how to extract the request and attach the logger — `defineFrameworkIntegration` does the rest. +::code-collapse ```typescript [my-framework-evlog.ts] import type { IncomingMessage, ServerResponse } from 'node:http' import { @@ -149,6 +150,7 @@ export function evlog(options: MyFrameworkEvlogOptions = {}) { } } ``` +:: That's it. This middleware gets every feature for free: route filtering, drain adapters, enrichers, tail sampling, error capture, plugin lifecycle hooks, `log.fork()`, and duration tracking. diff --git a/apps/docs/content/6.extend/3.consumer-recipes.md b/apps/docs/content/6.extend/3.consumer-recipes.md index 109441d8..e9ad8b4b 100644 --- a/apps/docs/content/6.extend/3.consumer-recipes.md +++ b/apps/docs/content/6.extend/3.consumer-recipes.md @@ -36,6 +36,7 @@ A live event panel is essentially `EventSource` + a list. The full wire format a ### Vanilla HTML + JS (drop into any page) +::code-collapse ```html @@ -83,11 +84,13 @@ A live event panel is essentially `EventSource` + a list. The full wire format a ``` +:: Save as `devtool.html`, open in any browser tab while your evlog-instrumented dev server is running. That's the whole MVP. ### Vue 3 component +::code-collapse ```vue