From 0589bdafc273ed2da15b83284ec7e63b215c9747 Mon Sep 17 00:00:00 2001 From: astra-intelligence Date: Sat, 31 Oct 2026 13:44:30 +0000 Subject: [PATCH] feat: render per-project and home OG cards for link previews Adds server-side Open Graph support for project links so Discord, X, Slack and other crawlers see a real card instead of a blank preview. - apps/web/api/og.ts: crawler-facing HTML with og:title/description/image (project + home variants), HTML-escaped values, 404 handling. - apps/web/api/og.png.ts: renders 1200x630 PNG with satori + resvg from /api/projects/{id}; project card shows name, tagline, contracts count, evidence tier and hackathon; home default card shows the timeline chart. - apps/web/vercel.json: rewrites /project/* and / from known link-preview crawler user agents to /api/og; normal visitors keep the SPA. - apps/web/api/_og-lib.tsx + bundled Outfit 400/600 fonts (fontsource). - index.html: static og/twitter meta defaulting to the timeline card. - pnpm-workspace.yaml: approve esbuild build (placeholder left by pnpm approve-builds). Verified: pnpm lint, format:check and build green; both cards render 1200x630 against the live Railway API and pass vision QA. --- apps/web/api/_fonts/Outfit-400.ttf | Bin 0 -> 33048 bytes apps/web/api/_fonts/Outfit-600.ttf | Bin 0 -> 33528 bytes apps/web/api/_og-lib.tsx | 345 +++++++ apps/web/api/og.png.ts | 31 + apps/web/api/og.ts | 69 ++ apps/web/index.html | 24 +- apps/web/package.json | 3 + apps/web/vercel.json | 29 +- pnpm-lock.yaml | 1453 +++++++++++++++++++++++++++- pnpm-workspace.yaml | 1 + 10 files changed, 1944 insertions(+), 11 deletions(-) create mode 100644 apps/web/api/_fonts/Outfit-400.ttf create mode 100644 apps/web/api/_fonts/Outfit-600.ttf create mode 100644 apps/web/api/_og-lib.tsx create mode 100644 apps/web/api/og.png.ts create mode 100644 apps/web/api/og.ts diff --git a/apps/web/api/_fonts/Outfit-400.ttf b/apps/web/api/_fonts/Outfit-400.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ed75d9ed0437bf2acd2d5e7bf660c63a82d4732c GIT binary patch literal 33048 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 literal 0 HcmV?d00001 diff --git a/apps/web/api/_fonts/Outfit-600.ttf b/apps/web/api/_fonts/Outfit-600.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d27f3ec793903088f3f40f415ec18dd8118329d3 GIT binary patch literal 33528 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 bFYU?9GIn$=T{^e>qV(sa{kq?}{8;=y0P7DE literal 0 HcmV?d00001 diff --git a/apps/web/api/_og-lib.tsx b/apps/web/api/_og-lib.tsx new file mode 100644 index 0000000..a33d615 --- /dev/null +++ b/apps/web/api/_og-lib.tsx @@ -0,0 +1,345 @@ +import { readFile } from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import satori from 'satori' +import { Resvg } from '@resvg/resvg-js' +import React from 'react' +import type { ReactNode } from 'react' + +export const API_URL = + process.env.API_URL ?? + process.env.RAILWAY_API_URL ?? + 'https://api-production-6ec67.up.railway.app' + +export const SITE_URL = 'https://hackproof-six.vercel.app' + +export interface OgProject { + project_id: string + full_name: string | null + description: string | null + tier: 'verified' | 'likely' | 'possible' | 'unattributed' + track: 'genesis' | 'scale' | null + contracts: number + stars: number | null + forks: number | null + language: string | null + owner: string | null + owner_avatar: string | null + award: string | null +} + +export interface OgTimelinePoint { + hour: string + contracts: number +} + +const tierLabel: Record = { + verified: 'Verified on-chain', + likely: 'Code only', + possible: 'Possible', + unattributed: 'No repo', +} + +const trackLabel: Record, string> = { + genesis: 'Genesis', + scale: 'Scale', +} + +const FONT_DIR = path.join(path.dirname(fileURLToPath(import.meta.url)), '_fonts') + +let fontCache: Record | null = null + +async function fonts() { + if (fontCache) return fontCache + const [regular, semibold] = await Promise.all([ + readFile(path.join(FONT_DIR, 'Outfit-400.ttf')), + readFile(path.join(FONT_DIR, 'Outfit-600.ttf')), + ]) + fontCache = { + regular: regular.buffer.slice(regular.byteOffset, regular.byteOffset + regular.byteLength), + semibold: semibold.buffer.slice(semibold.byteOffset, semibold.byteOffset + semibold.byteLength), + } + return fontCache +} + +export async function fetchProject(projectId: string): Promise { + const url = `${API_URL}/api/projects/${projectId}` + const response = await fetch(url, { + headers: { Accept: 'application/json' }, + }) + if (!response.ok) return null + const data = (await response.json()) as { project: OgProject } + return data.project ?? null +} + +export async function fetchTimeline(): Promise { + const response = await fetch(`${API_URL}/api/timeline`, { + headers: { Accept: 'application/json' }, + }) + if (!response.ok) return [] + const data = (await response.json()) as OgTimelinePoint[] + return Array.isArray(data) ? data : [] +} + +function projectName(project: OgProject) { + return project.full_name || project.project_id.replace(/^repo:/, '') || 'Project' +} + +function shortDescription(project: OgProject, limit = 160) { + const text = project.description?.trim() ?? 'HackMeridian 2026 submission on Stellar' + return text.length > limit ? `${text.slice(0, limit - 1)}…` : text +} + +function row(label: string, value: ReactNode, key: string) { + return ( +
+
+ {label} +
+
+ {value} +
+
+ ) +} + +async function svgCard(children: ReactNode) { + const { regular, semibold } = await fonts() + return satori( +
+
+
+ HP +
+
+ HackProof +
+
+ + HackMeridian 2026 +
+
+
+ {children} +
+
+
+ browse.hackproof · submissions rebuilt from Stellar testnet +
+
hackproof-six.vercel.app
+
+
, + { + width: 1200, + height: 630, + fonts: [ + { name: 'Outfit', data: regular, weight: 400, style: 'normal' }, + { name: 'Outfit', data: semibold, weight: 600, style: 'normal' }, + ], + }, + ) +} + +export async function renderProjectCard(project: OgProject): Promise { + const svg = await svgCard( + <> +
+
+ {project.award && ( + + {project.award} + + )} + + {tierLabel[project.tier]} + + {project.track && ( + + {trackLabel[project.track]} + + )} +
+
+
+ {projectName(project)} +
+
+ {shortDescription(project)} +
+
+ {row('Contracts deployed', project.contracts.toLocaleString('en'), 'contracts')} + {project.stars !== null && row('Stars', project.stars.toLocaleString('en'), 'stars')} + {project.forks !== null && row('Forks', project.forks.toLocaleString('en'), 'forks')} + {project.language && row('Language', project.language, 'language')} +
+ , + ) + const resvg = new Resvg(svg, { + fitTo: { mode: 'width', value: 1200 }, + }) + const png = resvg.render() + return png.asPng() +} + +export async function renderDefaultCard(timeline: OgTimelinePoint[]): Promise { + const bars = timeline.length + ? timeline + : Array.from({ length: 24 }, (_, i) => ({ + hour: `2026-10-25T${String(i).padStart(2, '0')}:00:00Z`, + contracts: 0, + })) + const max = Math.max(1, ...bars.map((b) => b.contracts)) + + const svg = await svgCard( + <> +
+ HackMeridian 2026 +
+
+ OSS submissions, rebuilt from Stellar testnet and linked to their GitHub repos. +
+
+ {bars.map((b) => ( +
0 ? '#00a7b5' : 'rgba(15,15,15,0.08)', + borderRadius: 2, + }} + /> + ))} +
+
+ {timeline.length + ? `contracts deployed per hour · peak ${max.toLocaleString('en')}` + : 'contracts deployed per hour'} +
+ , + ) + const resvg = new Resvg(svg, { + fitTo: { mode: 'width', value: 1200 }, + }) + const png = resvg.render() + return png.asPng() +} + +export function escapeHtml(value: string) { + return value + .replaceAll('&', '&') + .replaceAll('<', '<') + .replaceAll('>', '>') + .replaceAll('"', '"') + .replaceAll("'", ''') +} + +export function projectMeta(project: OgProject) { + const title = `${projectName(project)} — HackMeridian 2026` + const description = `${tierLabel[project.tier]} · ${project.contracts.toLocaleString('en')} contracts deployed${project.track ? ` · ${trackLabel[project.track]}` : ''}${project.description ? ` — ${shortDescription(project, 140)}` : ''}` + return { title, description } +} + +export { tierLabel, trackLabel } diff --git a/apps/web/api/og.png.ts b/apps/web/api/og.png.ts new file mode 100644 index 0000000..5439e46 --- /dev/null +++ b/apps/web/api/og.png.ts @@ -0,0 +1,31 @@ +import type { VercelRequest, VercelResponse } from '@vercel/node' +import { fetchProject, fetchTimeline, renderDefaultCard, renderProjectCard } from './_og-lib' + +export default async function handler(req: VercelRequest, res: VercelResponse) { + const projectId = typeof req.query.project === 'string' ? req.query.project : '' + + try { + let png: Buffer + if (projectId) { + const project = await fetchProject(projectId) + if (!project) { + res.status(404).setHeader('Cache-Control', 'public, s-maxage=300') + return res.end('project not found') + } + png = await renderProjectCard(project) + } else { + const timeline = await fetchTimeline() + png = await renderDefaultCard(timeline) + } + + res.status(200) + res.setHeader('Content-Type', 'image/png') + res.setHeader('Cache-Control', 'public, s-maxage=3600, max-age=600') + res.setHeader('Content-Length', String(png.length)) + return res.end(png) + } catch (error) { + console.error('og.png handler error:', error) + res.status(500).setHeader('Cache-Control', 'no-store') + return res.end('error rendering og image') + } +} diff --git a/apps/web/api/og.ts b/apps/web/api/og.ts new file mode 100644 index 0000000..897e74a --- /dev/null +++ b/apps/web/api/og.ts @@ -0,0 +1,69 @@ +import type { VercelRequest, VercelResponse } from '@vercel/node' +import { escapeHtml, fetchProject, projectMeta, SITE_URL } from './_og-lib' + +export default async function handler(req: VercelRequest, res: VercelResponse) { + const projectId = typeof req.query.project === 'string' ? req.query.project : '' + const origin = + req.headers['x-forwarded-proto'] === 'https' + ? `https://${req.headers['x-forwarded-host'] ?? SITE_URL.replace(/^https:\/\//, '')}` + : SITE_URL + + try { + const project = projectId ? await fetchProject(projectId) : null + + if (projectId && !project) { + res.status(404).setHeader('Cache-Control', 'public, s-maxage=300') + return res.send( + `Not found — HackMeridian 2026 + + +

Project not found

`, + ) + } + + const { title, description } = project + ? projectMeta(project) + : { + title: 'HackMeridian 2026', + description: + 'OSS submissions, rebuilt from Stellar testnet and linked to their GitHub repos.', + } + const image = `${origin}/api/og.png${projectId ? `?project=${encodeURIComponent(projectId)}` : ''}` + + res.status(200).setHeader('Content-Type', 'text/html; charset=utf-8') + res.setHeader('Cache-Control', 'public, s-maxage=600') + return res.send(` + + + +${escapeHtml(title)} + + + + + + + + + + + + + + + + + +

${escapeHtml(title)}

+

${escapeHtml(description)}

+

Open in the HackMeridian 2026 explorer

+ +`) + } catch (error) { + console.error('og handler error:', error) + res.status(500).setHeader('Cache-Control', 'no-store') + return res.send( + 'Error

Error rendering preview

', + ) + } +} diff --git a/apps/web/index.html b/apps/web/index.html index 7ce23e7..2187564 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -3,7 +3,29 @@ - hackproof + HackProof — HackMeridian 2026 explorer + + + + + + + + + + + + + =16'} + + '@edge-runtime/node-utils@2.3.0': + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + + '@edge-runtime/ponyfill@2.4.2': + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + + '@edge-runtime/primitives@4.1.0': + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + + '@edge-runtime/vm@3.2.0': + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + + '@esbuild/aix-ppc64@0.27.0': + resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.0': + resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.0': + resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.0': + resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.0': + resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.0': + resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.0': + resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.0': + resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.0': + resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.0': + resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.0': + resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.0': + resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.0': + resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.0': + resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.0': + resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.0': + resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.0': + resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.0': + resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.0': + resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.0': + resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.0': + resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.0': + resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.0': + resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.0': + resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.0': + resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.0': + resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + '@floating-ui/core@1.8.0': resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} @@ -325,6 +523,10 @@ packages: peerDependencies: hono: ^4 || ^5.0.0-0 + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -341,6 +543,11 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + '@modelcontextprotocol/sdk@1.32.2': resolution: {integrity: sha512-SWsVtH/0vULSQStoZ6xxH2K09Li8fXYTMC64ZeogCdpZ3XSi1eCPOByV1OpuJxuI3OcmHhosDWYyii07tpPsLw==} engines: {node: '>=18'} @@ -351,6 +558,13 @@ packages: '@cfworker/json-schema': optional: true + '@napi-rs/wasm-runtime@1.2.6': + resolution: {integrity: sha512-mRyDmEw9/fCDXCGfL1sbgIw/GUK0PVxRW4YwgPN61F3LQ+fSyoBFarJVzgGyhF6kRzEQZ0FejDqm4WLXSeqQmw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 + '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -363,6 +577,136 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@oxc-parser/binding-android-arm-eabi@0.121.0': + resolution: {integrity: sha512-n07FQcySwOlzap424/PLMtOkbS7xOu8nsJduKL8P3COGHKgKoDYXwoAHCbChfgFpHnviehrLWIPX0lKGtbEk/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.121.0': + resolution: {integrity: sha512-/Dd1xIXboYAicw+twT2utxPD7bL8qh7d3ej0qvaYIMj3/EgIrGR+tSnjCUkiCT6g6uTC0neSS4JY8LxhdSU/sA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.121.0': + resolution: {integrity: sha512-A0jNEvv7QMtCO1yk205t3DWU9sWUjQ2KNF0hSVO5W9R9r/R1BIvzG01UQAfmtC0dQm7sCrs5puixurKSfr2bRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.121.0': + resolution: {integrity: sha512-SsHzipdxTKUs3I9EOAPmnIimEeJOemqRlRDOp9LIj+96wtxZejF51gNibmoGq8KoqbT1ssAI5po/E3J+vEtXGA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.121.0': + resolution: {integrity: sha512-v1APOTkCp+RWOIDAHRoaeW/UoaHF15a60E8eUL6kUQXh+i4K7PBwq2Wi7jm8p0ymID5/m/oC1w3W31Z/+r7HQw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': + resolution: {integrity: sha512-PmqPQuqHZyFVWA4ycr0eu4VnTMmq9laOHZd+8R359w6kzuNZPvmmunmNJ8ybkm769A0nCoVp3TJ6dUz7B3FYIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': + resolution: {integrity: sha512-vF24htj+MOH+Q7y9A8NuC6pUZu8t/C2Fr/kDOi2OcNf28oogr2xadBPXAbml802E8wRAVfbta6YLDQTearz+jw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.121.0': + resolution: {integrity: sha512-wjH8cIG2Lu/3d64iZpbYr73hREMgKAfu7fqpXjgM2S16y2zhTfDIp8EQjxO8vlDtKP5Rc7waZW72lh8nZtWrpA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.121.0': + resolution: {integrity: sha512-qT663J/W8yQFw3dtscbEi9LKJevr20V7uWs2MPGTnvNZ3rm8anhhE16gXGpxDOHeg9raySaSHKhd4IGa3YZvuw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': + resolution: {integrity: sha512-mYNe4NhVvDBbPkAP8JaVS8lC1dsoJZWH5WCjpw5E+sjhk1R08wt3NnXYUzum7tIiWPfgQxbCMcoxgeemFASbRw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': + resolution: {integrity: sha512-+QiFoGxhAbaI/amqX567784cDyyuZIpinBrJNxUzb+/L2aBRX67mN6Jv40pqduHf15yYByI+K5gUEygCuv0z9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.121.0': + resolution: {integrity: sha512-9ykEgyTa5JD/Uhv2sttbKnCfl2PieUfOjyxJC/oDL2UO0qtXOtjPLl7H8Kaj5G7p3hIvFgu3YWvAxvE0sqY+hQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.121.0': + resolution: {integrity: sha512-DB1EW5VHZdc1lIRjOI3bW/wV6R6y0xlfvdVrqj6kKi7Ayu2U3UqUBdq9KviVkcUGd5Oq+dROqvUEEFRXGAM7EQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.121.0': + resolution: {integrity: sha512-s4lfobX9p4kPTclvMiH3gcQUd88VlnkMTF6n2MTMDAyX5FPNRhhRSFZK05Ykhf8Zy5NibV4PbGR6DnK7FGNN6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.121.0': + resolution: {integrity: sha512-P9KlyTpuBuMi3NRGpJO8MicuGZfOoqZVRP1WjOecwx8yk4L/+mrCRNc5egSi0byhuReblBF2oVoDSMgV9Bj4Hw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.121.0': + resolution: {integrity: sha512-R+4jrWOfF2OAPPhj3Eb3U5CaKNAH9/btMveMULIrcNW/hjfysFQlF8wE0GaVBr81dWz8JLgQlsxwctoL78JwXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-wasm32-wasi@0.121.0': + resolution: {integrity: sha512-5TFISkPTymKvsmIlKasPVTPuWxzCcrT8pM+p77+mtQbIZDd1UC8zww4CJcRI46kolmgrEX6QpKO8AvWMVZ+ifw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.121.0': + resolution: {integrity: sha512-V0pxh4mql4XTt3aiEtRNUeBAUFOw5jzZNxPABLaOKAWrVzSr9+XUaB095lY7jqMf5t8vkfh8NManGB28zanYKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.121.0': + resolution: {integrity: sha512-4Ob1qvYMPnlF2N9rdmKdkQFdrq16QVcQwBsO8yiPZXof0fHKFF+LmQV501XFbi7lHyrKm8rlJRfQ/M8bZZPVLw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.121.0': + resolution: {integrity: sha512-BOp1KCzdboB1tPqoCPXgntgFs0jjeSyOXHzgxVFR7B/qfr3F8r4YDacHkTOUNXtDgM8YwKnkf3rE5gwALYX7NA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.121.0': + resolution: {integrity: sha512-CGtOARQb9tyv7ECgdAlFxi0Fv7lmzvmlm2rpD/RdijOO9rfk/JvB1CjT8EnoD+tjna/IYgKKw3IV7objRb+aYw==} + '@oxc-project/types@0.155.0': resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} @@ -511,6 +855,86 @@ packages: '@remix-run/route-pattern@0.22.1': resolution: {integrity: sha512-czdGJWh09Lapvcqt7Vb09KlrU2PhRJ8xQaI+AItTuD9aDJ5MAgxnS38lnys6Ll+6RJEqPiaUqTwIQhVLwFvv+w==} + '@resvg/resvg-js-android-arm-eabi@2.6.2': + resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@resvg/resvg-js-android-arm64@2.6.2': + resolution: {integrity: sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@resvg/resvg-js-darwin-arm64@2.6.2': + resolution: {integrity: sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@resvg/resvg-js-darwin-x64@2.6.2': + resolution: {integrity: sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': + resolution: {integrity: sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@resvg/resvg-js-linux-arm64-gnu@2.6.2': + resolution: {integrity: sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@resvg/resvg-js-linux-arm64-musl@2.6.2': + resolution: {integrity: sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@resvg/resvg-js-linux-x64-gnu@2.6.2': + resolution: {integrity: sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@resvg/resvg-js-linux-x64-musl@2.6.2': + resolution: {integrity: sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@resvg/resvg-js-win32-arm64-msvc@2.6.2': + resolution: {integrity: sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@resvg/resvg-js-win32-ia32-msvc@2.6.2': + resolution: {integrity: sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@resvg/resvg-js-win32-x64-msvc@2.6.2': + resolution: {integrity: sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@resvg/resvg-js@2.6.2': + resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==} + engines: {node: '>= 10'} + '@rolldown/binding-android-arm-eabi@1.2.15': resolution: {integrity: sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -610,6 +1034,15 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/pluginutils@5.5.1': + resolution: {integrity: sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -617,6 +1050,11 @@ packages: resolution: {integrity: sha512-m3TeqU/+av2kgOLfESHkWzsmhuQuY4NXZd5Y1Rd4lzy4IX3JJ5+k2mYfkq6OT8oMuk2W4GQPAkO7+CC7KlpSbw==} engines: {node: '>=20.18.1'} + '@shuding/opentype.js@1.4.0-beta.0': + resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} + engines: {node: '>= 8.0.0'} + hasBin: true + '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} @@ -733,9 +1171,15 @@ packages: '@types/react': optional: true + '@ts-morph/common@0.11.1': + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + '@ts-morph/common@0.27.0': resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} + '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -775,12 +1219,18 @@ packages: '@types/hast@3.0.5': resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@20.11.0': + resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} + '@types/node@24.19.2': resolution: {integrity: sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==} @@ -842,10 +1292,29 @@ packages: vue-router: optional: true + '@vercel/build-utils@15.2.0': + resolution: {integrity: sha512-CMgTKS/0MYgfYs+49255Pre+ml70LBp5lcB66HGn5nNn7fxAHE7cl/J/Wj70Dz0ORuO1Batt1ro7j3IDPBdfOQ==} + + '@vercel/error-utils@2.2.1': + resolution: {integrity: sha512-9DhP8jP7raLML4hGsBemxX5fXuQnu5xxMV+HjGygGbzEmVK/+KyJ3QP2Cw7PdF0uXdb9N0Qa4c3tRGH34ZX6vw==} + + '@vercel/nft@1.10.0': + resolution: {integrity: sha512-iLOW4fcsgkipfOh2Bw3wB38YDfxTlxr7+j4uFeui2OswkNT28jIitS/aMce7tS0mef1YPQ8zLIDYr3a0aahNrA==} + engines: {node: '>=20'} + hasBin: true + + '@vercel/node@29.0.0': + resolution: {integrity: sha512-EjjzYjR5K8Gkwko6kW1IGOV7M+XvBeURBaYcKvMPs/QaK/Rm/X8RAH85Co7KczyP8ou9Qv6uITtcXmxJR1ClUQ==} + peerDependencies: + '@vercel/build-utils': 15.2.0 + '@vercel/oidc@3.2.0': resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==} engines: {node: '>= 20'} + '@vercel/static-config@3.4.4': + resolution: {integrity: sha512-WppaPyEKQhO8qo5gVee3mSo1QSCgDZaUcUDHrqICSlt90oYeC/SHTmKCPWY1x1NB9hU+kR2oDzJwAeRKKv5NIw==} + '@vitejs/plugin-react@6.1.2': resolution: {integrity: sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -865,10 +1334,28 @@ packages: '@workflow/serde@4.1.0': resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.19.0: + resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ai@7.0.154: resolution: {integrity: sha512-vpvOZoV2Xcu6vWYM/X2XAFJG93T/ELF+qbslXxRnpqqhKZ6dtxfZf1KHFqYBz784uV/XVjXkNjgs9Zc239NY3Q==} engines: {node: '>=22'} @@ -894,6 +1381,9 @@ packages: ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -910,6 +1400,17 @@ packages: resolution: {integrity: sha512-FvWoWYfSCM6kRxCSH+MGLHIKKGRL6A6AW7Zek2O32REPQRdg131428uRTKMBYAeRd3XXAaHDS60Wpri7CdKDrA==} engines: {node: '>=4'} + async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + + async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + atomically@1.7.0: resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} engines: {node: '>=10.12.0'} @@ -917,19 +1418,32 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base64-js@0.0.8: + resolution: {integrity: sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==} + engines: {node: '>= 0.4'} + baseline-browser-mapping@2.11.33: resolution: {integrity: sha512-yiVKDX+qCMRKBE084lXvq9EcwFUhKZ2nU8TK1EQQuOgPNR/lmbGxXOeDdlGUqC2Zz11Cs9rk1d/8NfgBmlkt0w==} engines: {node: '>=6.0.0'} hasBin: true + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + body-parser@2.4.0: resolution: {integrity: sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==} engines: {node: '>=18'} + brace-expansion@1.1.21: + resolution: {integrity: sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==} + brace-expansion@5.0.12: resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} engines: {node: 20 || >=22} @@ -959,6 +1473,9 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + caniuse-lite@1.0.30001819: resolution: {integrity: sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==} @@ -981,6 +1498,13 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -1006,9 +1530,15 @@ packages: engines: {node: '>=22'} hasBin: true + code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1020,10 +1550,17 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + conf@10.2.0: resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} engines: {node: '>=12'} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + content-disposition@2.0.1: resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} engines: {node: '>=18'} @@ -1036,6 +1573,10 @@ packages: resolution: {integrity: sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag==} engines: {node: '>=18'} + convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1061,6 +1602,23 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-background-parser@0.1.0: + resolution: {integrity: sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==} + + css-box-shadow@1.0.0-3: + resolution: {integrity: sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-gradient-parser@0.0.17: + resolution: {integrity: sha512-w2Xy9UMMwlKtou0vlRnXvWglPAceXCTtcmVSo8ZBUvqCV5aXEFP/PC6d+I464810I9FT++UACwTD5511bmGPUg==} + engines: {node: '>=16'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -1194,12 +1752,21 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} electron-to-chromium@1.5.464: resolution: {integrity: sha512-nRa65aFge40viPAKxMKULIY8tcXKwKboJWNn4RoKwyWXJ6SP7BnrDGKUTzc64818jIciH0PK7LSF8QzZes19GA==} + emoji-regex-xs@2.0.1: + resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} + engines: {node: '>=10.0.0'} + emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1231,6 +1798,12 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + es-object-atoms@1.1.2: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} @@ -1238,6 +1811,11 @@ packages: es-toolkit@1.44.0: resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} + esbuild@0.27.0: + resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1257,6 +1835,9 @@ packages: estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -1318,10 +1899,16 @@ packages: fflate@0.4.9: resolution: {integrity: sha512-zdxgIEddhfsyCaWpJ2SdXEP8ZMrKJ6+5jl4OupODcywU0IhRk6gdXuVGcPICyfx2H97hVK7xmJtRLPjkxAX8Vw==} + fflate@0.7.3: + resolution: {integrity: sha512-0Zz1jOzJWERhyhsimS54VTqOteCNwRtIlh8isdL0AXLo0g7xNTfTL7oWrkmCnPhZGocKIkWHBistBrrpoNH3aw==} + figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1396,10 +1983,17 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} + get-tsconfig@4.14.3: + resolution: {integrity: sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1407,6 +2001,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + harfbuzzjs@0.10.0: + resolution: {integrity: sha512-SN8LVwCOzvTq3OPNd0+EAghgXugItz56wst567D1vs7LnnKGWprhi3EG58aVOBwhN8HEbQxL4I9NDWkcXUutRw==} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -1439,6 +2036,10 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hex-rgb@4.3.0: + resolution: {integrity: sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==} + engines: {node: '>=6'} + hono@4.13.14: resolution: {integrity: sha512-yhRLQ21U6qa9Hsu2N7Qcbh8tE+WKEcoErjIo56LeSGiGXGp9sA7UpE86Ui9uexb61KakiGwuHMn2QdV7w6i6kQ==} engines: {node: '>=16.9.0'} @@ -1453,6 +2054,10 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -1605,6 +2210,9 @@ packages: engines: {node: '>=6'} hasBin: true + json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -1781,6 +2389,9 @@ packages: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} + linebreak@1.1.0: + resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -1792,6 +2403,10 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -1970,10 +2585,18 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mime-types@3.0.2: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} @@ -1994,9 +2617,25 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + motion-dom@14.6.0: resolution: {integrity: sha512-lIojTl9aYSPIkeOOSzBliy1nNvpdO3JtVzW2WgTXQlOP4ZMuJhtWO3fP7OD4TVFwlRucdvxlDSMkL+fEQnQ52A==} @@ -2014,6 +2653,10 @@ packages: react-dom: optional: true + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2032,10 +2675,28 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-releases@2.0.60: resolution: {integrity: sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==} engines: {node: '>=18'} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -2083,6 +2744,10 @@ packages: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} + oxc-parser@0.121.0: + resolution: {integrity: sha512-ek9o58+SCv6AV7nchiAcUJy1DNE2CC5WRdBcO0mF+W4oRjNQfPO7b3pLjTHSFECpHkKGOZSQxx3hk8viIL5YCg==} + engines: {node: ^20.19.0 || >=22.12.0} + oxlint@1.89.0: resolution: {integrity: sha512-a25hkfo61okGPvJz432fRIPoxlKtNnOVy9w4rzrmGgNm4iVTPwpSQlmdqNWnp6p9QyyPVfAZRgnf5XvSBZFk/A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2108,9 +2773,19 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + parse-css-color@0.2.1: + resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -2137,9 +2812,22 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} + + path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2163,6 +2851,9 @@ packages: resolution: {integrity: sha512-wWBro/7hJ40ye6TPiXkUQoXKCw23xSsjriUvqd7Uls9Sso3oLiON1flc18cCdnjgCRXw4fBVqUJJeOdDTh3P3g==} engines: {node: '>=4'} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.31: resolution: {integrity: sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==} engines: {node: ^10 || ^12 || >=14} @@ -2195,6 +2886,10 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + pretty-ms@9.3.1: resolution: {integrity: sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==} engines: {node: '>=18'} @@ -2215,6 +2910,10 @@ packages: resolution: {integrity: sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==} engines: {node: '>= 0.10'} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + qs@6.16.1: resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} engines: {node: '>=0.6'} @@ -2332,6 +3031,13 @@ packages: reselect@5.3.0: resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -2359,6 +3065,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + satori@0.63.2: + resolution: {integrity: sha512-h7dm4BRMo8F53l9vOXOIfJoqeVXuZvyz13VsvVuwJb72sLfq+8uddJIJcjLKLv2BqWzDvYIpzi3rvBBS+ETuvw==} + engines: {node: '>=16'} + scheduler@0.28.0: resolution: {integrity: sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==} @@ -2414,6 +3124,10 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2458,6 +3172,9 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string.prototype.codepointat@0.2.1: + resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -2518,10 +3235,21 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} + engines: {node: '>=18'} + throttleit@2.1.0: resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} engines: {node: '>=18'} + time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -2537,15 +3265,24 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + ts-morph@26.0.0: resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} + ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -2553,6 +3290,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + tw-animate-css@1.4.0: resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} @@ -2564,18 +3306,33 @@ packages: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + undici@7.30.1: resolution: {integrity: sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==} engines: {node: '>=20.18.1'} + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -2612,6 +3369,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-sync-external-store@1.7.0: resolution: {integrity: sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==} peerDependencies: @@ -2692,6 +3452,12 @@ packages: web-vitals@6.2.3: resolution: {integrity: sha512-Dmy+vdO1UPMqXiAtZSNayhl4f794Bxfd94W4HIj2HlYtczEQfEOon969memlcpcHrTuOKLa5baFjX7WbgmOq+A==} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2712,6 +3478,10 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@2.9.1: resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} engines: {node: '>= 14.6'} @@ -3008,7 +3778,115 @@ snapshots: which: 4.0.0 yocto-spinner: 1.2.2 - '@dotenvx/primitives@0.8.0': {} + '@dotenvx/primitives@0.8.0': {} + + '@edge-runtime/format@2.2.1': {} + + '@edge-runtime/node-utils@2.3.0': {} + + '@edge-runtime/ponyfill@2.4.2': {} + + '@edge-runtime/primitives@4.1.0': {} + + '@edge-runtime/vm@3.2.0': + dependencies: + '@edge-runtime/primitives': 4.1.0 + + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.0': + optional: true + + '@esbuild/android-arm64@0.27.0': + optional: true + + '@esbuild/android-arm@0.27.0': + optional: true + + '@esbuild/android-x64@0.27.0': + optional: true + + '@esbuild/darwin-arm64@0.27.0': + optional: true + + '@esbuild/darwin-x64@0.27.0': + optional: true + + '@esbuild/freebsd-arm64@0.27.0': + optional: true + + '@esbuild/freebsd-x64@0.27.0': + optional: true + + '@esbuild/linux-arm64@0.27.0': + optional: true + + '@esbuild/linux-arm@0.27.0': + optional: true + + '@esbuild/linux-ia32@0.27.0': + optional: true + + '@esbuild/linux-loong64@0.27.0': + optional: true + + '@esbuild/linux-mips64el@0.27.0': + optional: true + + '@esbuild/linux-ppc64@0.27.0': + optional: true + + '@esbuild/linux-riscv64@0.27.0': + optional: true + + '@esbuild/linux-s390x@0.27.0': + optional: true + + '@esbuild/linux-x64@0.27.0': + optional: true + + '@esbuild/netbsd-arm64@0.27.0': + optional: true + + '@esbuild/netbsd-x64@0.27.0': + optional: true + + '@esbuild/openbsd-arm64@0.27.0': + optional: true + + '@esbuild/openbsd-x64@0.27.0': + optional: true + + '@esbuild/openharmony-arm64@0.27.0': + optional: true + + '@esbuild/sunos-x64@0.27.0': + optional: true + + '@esbuild/win32-arm64@0.27.0': + optional: true + + '@esbuild/win32-ia32@0.27.0': + optional: true + + '@esbuild/win32-x64@0.27.0': + optional: true + + '@fastify/busboy@2.1.1': {} '@floating-ui/core@1.8.0': dependencies: @@ -3031,6 +3909,10 @@ snapshots: dependencies: hono: 4.13.14 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.6.0 @@ -3050,6 +3932,19 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.6.9 + nopt: 8.1.0 + semver: 7.8.5 + tar: 7.5.22 + transitivePeerDependencies: + - encoding + - supports-color + '@modelcontextprotocol/sdk@1.32.2(zod@4.6.7)': dependencies: '@hono/node-server': 2.1.5(hono@4.13.14) @@ -3072,6 +3967,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@napi-rs/wasm-runtime@1.2.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.4 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3084,6 +3986,73 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.3 + '@oxc-parser/binding-android-arm-eabi@0.121.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.121.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.121.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.121.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.121.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.121.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.121.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.121.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.121.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.121.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.121.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.121.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.121.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.121.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.121.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.121.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.121.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + '@napi-rs/wasm-runtime': 1.2.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.121.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.121.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.121.0': + optional: true + + '@oxc-project/types@0.121.0': {} + '@oxc-project/types@0.155.0': {} '@oxlint/binding-android-arm-eabi@1.89.0': @@ -3171,6 +4140,57 @@ snapshots: '@remix-run/route-pattern@0.22.1': {} + '@resvg/resvg-js-android-arm-eabi@2.6.2': + optional: true + + '@resvg/resvg-js-android-arm64@2.6.2': + optional: true + + '@resvg/resvg-js-darwin-arm64@2.6.2': + optional: true + + '@resvg/resvg-js-darwin-x64@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm64-gnu@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm64-musl@2.6.2': + optional: true + + '@resvg/resvg-js-linux-x64-gnu@2.6.2': + optional: true + + '@resvg/resvg-js-linux-x64-musl@2.6.2': + optional: true + + '@resvg/resvg-js-win32-arm64-msvc@2.6.2': + optional: true + + '@resvg/resvg-js-win32-ia32-msvc@2.6.2': + optional: true + + '@resvg/resvg-js-win32-x64-msvc@2.6.2': + optional: true + + '@resvg/resvg-js@2.6.2': + optionalDependencies: + '@resvg/resvg-js-android-arm-eabi': 2.6.2 + '@resvg/resvg-js-android-arm64': 2.6.2 + '@resvg/resvg-js-darwin-arm64': 2.6.2 + '@resvg/resvg-js-darwin-x64': 2.6.2 + '@resvg/resvg-js-linux-arm-gnueabihf': 2.6.2 + '@resvg/resvg-js-linux-arm64-gnu': 2.6.2 + '@resvg/resvg-js-linux-arm64-musl': 2.6.2 + '@resvg/resvg-js-linux-x64-gnu': 2.6.2 + '@resvg/resvg-js-linux-x64-musl': 2.6.2 + '@resvg/resvg-js-win32-arm64-msvc': 2.6.2 + '@resvg/resvg-js-win32-ia32-msvc': 2.6.2 + '@resvg/resvg-js-win32-x64-msvc': 2.6.2 + '@rolldown/binding-android-arm-eabi@1.2.15': optional: true @@ -3218,6 +4238,12 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@rollup/pluginutils@5.5.1': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.7 + '@sec-ant/readable-stream@0.4.1': {} '@shadcn/registry@0.2.0': @@ -3248,6 +4274,11 @@ snapshots: transitivePeerDependencies: - supports-color + '@shuding/opentype.js@1.4.0-beta.0': + dependencies: + fflate: 0.7.3 + string.prototype.codepointat: 0.2.1 + '@sindresorhus/merge-streams@4.0.0': {} '@standard-schema/spec@1.1.0': {} @@ -3315,12 +4346,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - '@tailwindcss/vite@4.3.3(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': + '@tailwindcss/vite@4.3.3(vite@8.3.5(@types/node@24.19.2)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.1))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) + vite: 8.3.5(@types/node@24.19.2)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.1) '@tanstack/query-core@5.105.0': {} @@ -3331,12 +4362,24 @@ snapshots: optionalDependencies: '@types/react': 19.3.0 + '@ts-morph/common@0.11.1': + dependencies: + fast-glob: 3.3.3 + minimatch: 3.1.5 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 minimatch: 10.2.6 path-browserify: 1.0.1 + '@tybys/wasm-util@0.10.4': + dependencies: + tslib: 2.8.1 + optional: true + '@types/d3-array@3.2.2': {} '@types/d3-color@3.1.3': {} @@ -3375,12 +4418,18 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 '@types/ms@2.1.0': {} + '@types/node@20.11.0': + dependencies: + undici-types: 5.26.5 + '@types/node@24.19.2': dependencies: undici-types: 7.24.6 @@ -3412,20 +4461,97 @@ snapshots: optionalDependencies: react: 19.3.1 + '@vercel/build-utils@15.2.0': + dependencies: + cjs-module-lexer: 1.2.3 + es-module-lexer: 1.5.0 + + '@vercel/error-utils@2.2.1': {} + + '@vercel/nft@1.10.0': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.5.1 + acorn: 8.19.0 + acorn-import-attributes: 1.9.5(acorn@8.19.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 13.0.6 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.7 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + '@vercel/node@29.0.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@vercel/build-utils@15.2.0)': + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 20.11.0 + '@vercel/build-utils': 15.2.0 + '@vercel/error-utils': 2.2.1 + '@vercel/nft': 1.10.0 + '@vercel/static-config': 3.4.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.27.0 + etag: 1.8.1 + mime-types: 2.1.35 + node-fetch: 2.6.9 + path-to-regexp: 6.1.0 + path-to-regexp-updated: path-to-regexp@6.3.0 + ts-morph: 12.0.0 + tsx: 4.21.0 + typescript: 5.9.3 + undici: 5.28.4 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + - encoding + - rollup + - supports-color + '@vercel/oidc@3.2.0': {} - '@vitejs/plugin-react@6.1.2(vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1))': + '@vercel/static-config@3.4.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)': + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + oxc-parser: 0.121.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + ts-morph: 12.0.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + + '@vitejs/plugin-react@6.1.2(vite@8.3.5(@types/node@24.19.2)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.1))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1) + vite: 8.3.5(@types/node@24.19.2)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.1) '@workflow/serde@4.1.0': {} + abbrev@3.0.1: {} + accepts@2.0.0: dependencies: mime-types: 3.0.2 negotiator: 1.1.0 + acorn-import-attributes@1.9.5(acorn@8.19.0): + dependencies: + acorn: 8.19.0 + + acorn@8.19.0: {} + + agent-base@7.1.4: {} + ai@7.0.154(zod@4.6.7): dependencies: '@ai-sdk/gateway': 4.0.127(zod@4.6.7) @@ -3448,6 +4574,13 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ajv@8.6.3: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -3458,14 +4591,28 @@ snapshots: dependencies: tslib: 2.8.1 + async-listen@3.0.0: {} + + async-listen@3.0.1: {} + + async-sema@3.1.1: {} + atomically@1.7.0: {} bail@2.0.2: {} + balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@0.0.8: {} + baseline-browser-mapping@2.11.33: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + body-parser@2.4.0: dependencies: bytes: 3.1.2 @@ -3480,6 +4627,11 @@ snapshots: transitivePeerDependencies: - supports-color + brace-expansion@1.1.21: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@5.0.12: dependencies: balanced-match: 4.0.4 @@ -3512,6 +4664,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + camelize@1.0.1: {} + caniuse-lite@1.0.30001819: {} ccount@2.0.1: {} @@ -3526,6 +4680,10 @@ snapshots: character-reference-invalid@2.0.1: {} + chownr@3.0.0: {} + + cjs-module-lexer@1.2.3: {} + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -3542,14 +4700,20 @@ snapshots: cn@0.5.0: {} + code-block-writer@10.1.1: {} + code-block-writer@13.0.3: {} + color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} commander@11.1.0: {} commander@14.0.3: {} + concat-map@0.0.1: {} + conf@10.2.0: dependencies: ajv: 8.20.0 @@ -3563,12 +4727,16 @@ snapshots: pkg-up: 3.1.0 semver: 7.8.5 + consola@3.4.2: {} + content-disposition@2.0.1: {} content-type@1.0.5: {} content-type@2.1.0: {} + convert-hrtime@3.0.0: {} + convert-source-map@2.0.0: {} cookie-es@3.1.1: {} @@ -3590,6 +4758,20 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-background-parser@0.1.0: {} + + css-box-shadow@1.0.0-3: {} + + css-color-keywords@1.0.0: {} + + css-gradient-parser@0.0.17: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + cssesc@3.0.0: {} csstype@3.2.3: {} @@ -3689,10 +4871,24 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + edge-runtime@2.5.9: + dependencies: + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 + async-listen: 3.0.1 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + ee-first@1.1.1: {} electron-to-chromium@1.5.464: {} + emoji-regex-xs@2.0.1: {} + emoji-regex@10.6.0: {} encodeurl@2.0.0: {} @@ -3715,12 +4911,45 @@ snapshots: es-errors@1.3.0: {} + es-module-lexer@1.4.1: {} + + es-module-lexer@1.5.0: {} + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 es-toolkit@1.44.0: {} + esbuild@0.27.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.0 + '@esbuild/android-arm': 0.27.0 + '@esbuild/android-arm64': 0.27.0 + '@esbuild/android-x64': 0.27.0 + '@esbuild/darwin-arm64': 0.27.0 + '@esbuild/darwin-x64': 0.27.0 + '@esbuild/freebsd-arm64': 0.27.0 + '@esbuild/freebsd-x64': 0.27.0 + '@esbuild/linux-arm': 0.27.0 + '@esbuild/linux-arm64': 0.27.0 + '@esbuild/linux-ia32': 0.27.0 + '@esbuild/linux-loong64': 0.27.0 + '@esbuild/linux-mips64el': 0.27.0 + '@esbuild/linux-ppc64': 0.27.0 + '@esbuild/linux-riscv64': 0.27.0 + '@esbuild/linux-s390x': 0.27.0 + '@esbuild/linux-x64': 0.27.0 + '@esbuild/netbsd-arm64': 0.27.0 + '@esbuild/netbsd-x64': 0.27.0 + '@esbuild/openbsd-arm64': 0.27.0 + '@esbuild/openbsd-x64': 0.27.0 + '@esbuild/openharmony-arm64': 0.27.0 + '@esbuild/sunos-x64': 0.27.0 + '@esbuild/win32-arm64': 0.27.0 + '@esbuild/win32-ia32': 0.27.0 + '@esbuild/win32-x64': 0.27.0 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -3731,6 +4960,8 @@ snapshots: estree-util-is-identifier-name@3.0.0: {} + estree-walker@2.0.2: {} + etag@1.8.1: {} eventemitter3@5.0.4: {} @@ -3833,10 +5064,14 @@ snapshots: fflate@0.4.9: {} + fflate@0.7.3: {} + figures@6.1.0: dependencies: is-unicode-supported: 2.1.0 + file-uri-to-path@1.0.0: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -3913,14 +5148,26 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 + get-tsconfig@4.14.3: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 + glob@13.0.6: + dependencies: + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 + gopd@1.2.0: {} graceful-fs@4.2.11: {} + harfbuzzjs@0.10.0: {} + has-symbols@1.1.0: {} hasown@2.0.4: @@ -4006,6 +5253,8 @@ snapshots: property-information: 7.2.0 space-separated-tokens: 2.0.2 + hex-rgb@4.3.0: {} + hono@4.13.14: {} html-url-attributes@3.0.1: {} @@ -4020,6 +5269,13 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-signals@2.1.0: {} human-signals@8.0.1: {} @@ -4113,6 +5369,11 @@ snapshots: jsesc@3.1.0: {} + json-schema-to-ts@1.6.4: + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 + json-schema-traverse@1.0.0: {} json-schema-typed@7.0.3: {} @@ -4231,6 +5492,11 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + linebreak@1.1.0: + dependencies: + base64-js: 0.0.8 + unicode-trie: 2.0.0 + locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -4243,6 +5509,8 @@ snapshots: longest-streak@3.1.0: {} + lru-cache@11.5.3: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -4628,8 +5896,14 @@ snapshots: braces: 3.0.3 picomatch: 2.3.2 + mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mime-types@3.0.2: dependencies: mime-db: 1.54.0 @@ -4644,8 +5918,20 @@ snapshots: dependencies: brace-expansion: 5.0.12 + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.21 + minimist@1.2.8: {} + minipass@7.1.3: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + + mkdirp@1.0.4: {} + motion-dom@14.6.0: dependencies: motion-utils: 14.6.0 @@ -4660,6 +5946,8 @@ snapshots: react: 19.3.1 react-dom: 19.3.1(react@19.3.1) + mri@1.2.0: {} + ms@2.1.3: {} nanoid@3.3.20: {} @@ -4673,8 +5961,18 @@ snapshots: react: 19.3.1 react-dom: 19.3.1(react@19.3.1) + node-fetch@2.6.9: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.4: {} + node-releases@2.0.60: {} + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -4733,6 +6031,34 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 + oxc-parser@0.121.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3): + dependencies: + '@oxc-project/types': 0.121.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.121.0 + '@oxc-parser/binding-android-arm64': 0.121.0 + '@oxc-parser/binding-darwin-arm64': 0.121.0 + '@oxc-parser/binding-darwin-x64': 0.121.0 + '@oxc-parser/binding-freebsd-x64': 0.121.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.121.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.121.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.121.0 + '@oxc-parser/binding-linux-arm64-musl': 0.121.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.121.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.121.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.121.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.121.0 + '@oxc-parser/binding-linux-x64-gnu': 0.121.0 + '@oxc-parser/binding-linux-x64-musl': 0.121.0 + '@oxc-parser/binding-openharmony-arm64': 0.121.0 + '@oxc-parser/binding-wasm32-wasi': 0.121.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + '@oxc-parser/binding-win32-arm64-msvc': 0.121.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.121.0 + '@oxc-parser/binding-win32-x64-msvc': 0.121.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + oxlint@1.89.0: optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.89.0 @@ -4765,6 +6091,13 @@ snapshots: p-try@2.2.0: {} + pako@0.2.9: {} + + parse-css-color@0.2.1: + dependencies: + color-name: 1.1.4 + hex-rgb: 4.3.0 + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -4775,6 +6108,8 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-ms@2.1.0: {} + parse-ms@4.0.0: {} parse5@7.3.0: @@ -4791,8 +6126,19 @@ snapshots: path-key@4.0.0: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.3 + minipass: 7.1.3 + + path-to-regexp@6.1.0: {} + + path-to-regexp@6.3.0: {} + path-to-regexp@8.4.2: {} + picocolors@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.2: {} @@ -4810,6 +6156,8 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} + postcss@8.5.31: dependencies: nanoid: 3.3.20 @@ -4840,6 +6188,10 @@ snapshots: prettier@3.9.10: {} + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + pretty-ms@9.3.1: dependencies: parse-ms: 4.0.0 @@ -4862,6 +6214,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + punycode@2.3.1: {} + qs@6.16.1: dependencies: es-define-property: 1.0.1 @@ -5003,6 +6357,10 @@ snapshots: reselect@5.3.0: {} + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -5049,6 +6407,21 @@ snapshots: safer-buffer@2.1.2: {} + satori@0.63.2: + dependencies: + '@shuding/opentype.js': 1.4.0-beta.0 + css-background-parser: 0.1.0 + css-box-shadow: 1.0.0-3 + css-gradient-parser: 0.0.17 + css-to-react-native: 3.2.0 + emoji-regex-xs: 2.0.1 + escape-html: 1.0.3 + fflate: 0.7.3 + harfbuzzjs: 0.10.0 + linebreak: 1.1.0 + parse-css-color: 0.2.1 + postcss-value-parser: 4.2.0 + scheduler@0.28.0: {} semver@6.3.1: {} @@ -5157,6 +6530,8 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.0.2: {} + signal-exit@4.1.0: {} sisteransi@1.0.5: {} @@ -5206,6 +6581,8 @@ snapshots: get-east-asian-width: 1.7.0 strip-ansi: 7.2.0 + string.prototype.codepointat@0.2.1: {} + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -5260,8 +6637,22 @@ snapshots: tapable@2.3.3: {} + tar@7.5.22: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + throttleit@2.1.0: {} + time-span@4.0.0: + dependencies: + convert-hrtime: 3.0.0 + + tiny-inflate@1.0.3: {} + tiny-invariant@1.3.3: {} tinyglobby@0.2.17: @@ -5275,15 +6666,24 @@ snapshots: toidentifier@1.0.1: {} + tr46@0.0.3: {} + trim-lines@3.0.1: {} trough@2.2.0: {} + ts-morph@12.0.0: + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + ts-morph@26.0.0: dependencies: '@ts-morph/common': 0.27.0 code-block-writer: 13.0.3 + ts-toolbelt@6.15.5: {} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -5292,6 +6692,13 @@ snapshots: tslib@2.8.1: {} + tsx@4.21.0: + dependencies: + esbuild: 0.27.0 + get-tsconfig: 4.14.3 + optionalDependencies: + fsevents: 2.3.3 + tw-animate-css@1.4.0: {} type-fest@4.41.0: {} @@ -5302,12 +6709,25 @@ snapshots: media-typer: 1.1.1 mime-types: 3.0.2 + typescript@5.9.3: {} + typescript@6.0.3: {} + undici-types@5.26.5: {} + undici-types@7.24.6: {} + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + undici@7.30.1: {} + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + unicorn-magic@0.3.0: {} unified@11.0.5: @@ -5353,6 +6773,10 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + use-sync-external-store@1.7.0(react@19.3.1): dependencies: react: 19.3.1 @@ -5395,7 +6819,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite@8.3.5(@types/node@24.19.2)(jiti@2.7.0)(yaml@2.9.1): + vite@8.3.5(@types/node@24.19.2)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.1): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -5404,8 +6828,10 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.19.2 + esbuild: 0.27.0 fsevents: 2.3.3 jiti: 2.7.0 + tsx: 4.21.0 yaml: 2.9.1 web-namespaces@2.0.1: {} @@ -5414,6 +6840,13 @@ snapshots: web-vitals@6.2.3: {} + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -5431,6 +6864,8 @@ snapshots: yallist@3.1.1: {} + yallist@5.0.0: {} + yaml@2.9.1: {} yocto-spinner@1.2.2: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c0ef08d..a3c5f0a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,4 @@ packages: - apps/* allowBuilds: core-js: false + esbuild: true