commit d2cde2c9b271c7d50fa5fb79c1772c2edda3860c Author: 巫凤萍 Date: Thu Jul 30 12:06:41 2026 +0800 Initial commit: KOC LOOP platform diff --git a/.dev.vars.example b/.dev.vars.example new file mode 100644 index 0000000..dfef0ea --- /dev/null +++ b/.dev.vars.example @@ -0,0 +1,11 @@ +KOC_PORTAL_URL=http://localhost:3000 +ADMIN_ALLOWED_EMAIL=operator@example.com +ADMIN_INTERNAL_TOKEN=replace-with-a-random-secret + +# Optional override. The production key must be stored as a runtime secret. +AI_TOOL_CENTER_MCP_URL=https://middle-aitool.gbotai.cn/mcp +AI_TOOL_CENTER_MCP_KEY=replace-with-mcp-key + +# Feishu custom app credentials. Keep the secret out of source control. +FEISHU_APP_ID=cli_xxxxxxxxxxxxxxxxx +FEISHU_APP_SECRET=replace-with-feishu-app-secret diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6a66e65 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage +/.playwright-cli/ + +# next.js +/.next/ +/.vinext/ +/out/ + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* +.dev.vars + +# vercel +.vercel + +# typescript +next-env.d.ts +/dist/ +/.wrangler/ +/outputs/ +/work/ diff --git a/.openai/hosting.json b/.openai/hosting.json new file mode 100644 index 0000000..050b2be --- /dev/null +++ b/.openai/hosting.json @@ -0,0 +1,5 @@ +{ + "project_id": "appgprj_6a670019733c8191ab20ba068aa437cb", + "d1": "DB", + "r2": "UPLOADS" +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..872edc1 --- /dev/null +++ b/README.md @@ -0,0 +1,104 @@ +# KOC LOOP + +KOC 内容分发与数据回收闭环,运行于 vinext、Cloudflare D1 和 R2。 + +## Prerequisites + +- Node.js `>=22.13.0` + +## Quick Start + +```bash +npm install +npm run dev +npm run build +``` + +复制 `.dev.vars.example` 为 `.dev.vars` 并配置运行时变量。飞书动态导入需要: + +- `FEISHU_APP_ID` +- `FEISHU_APP_SECRET` + +飞书自建应用需开通电子表格读取、知识库节点读取和云文档素材下载权限, +并将应用添加到目标知识库或电子表格的文档应用中。 + +This starter does not use `wrangler.jsonc`. + +## Included Shape + +- edit site code under `app/` +- `.openai/hosting.json` declares optional Sites D1 and R2 bindings +- `vite.config.ts` simulates declared bindings for local development +- `db/schema.ts` starts intentionally empty +- `examples/d1/` contains an optional D1 example surface +- `drizzle.config.ts` supports local migration generation when needed + +## Workspace Auth Headers + +OpenAI workspace sites can read the current user's email from +`oai-authenticated-user-email`. + +SIWC-authenticated workspace sites may also receive +`oai-authenticated-user-full-name` when the user's SIWC profile has a non-empty +`name` claim. The full-name value is percent-encoded UTF-8 and is accompanied by +`oai-authenticated-user-full-name-encoding: percent-encoded-utf-8`. + +Treat the full name as optional and fall back to email when it is absent: + +```tsx +import { headers } from "next/headers"; + +export default async function Home() { + const requestHeaders = await headers(); + const email = requestHeaders.get("oai-authenticated-user-email"); + const encodedFullName = requestHeaders.get("oai-authenticated-user-full-name"); + const fullName = + encodedFullName && + requestHeaders.get("oai-authenticated-user-full-name-encoding") === + "percent-encoded-utf-8" + ? decodeURIComponent(encodedFullName) + : null; + + const displayName = fullName ?? email; + // ... +} +``` + +## Optional Dispatch-Owned ChatGPT Sign-In + +Import the ready-to-use helpers from `app/chatgpt-auth.ts` when the site needs +optional or required ChatGPT sign-in: + +- Use `getChatGPTUser()` for optional signed-in UI. +- Use `requireChatGPTUser(returnTo)` for server-rendered pages that should send + anonymous visitors through Sign in with ChatGPT. +- Use `chatGPTSignInPath(returnTo)` and `chatGPTSignOutPath(returnTo)` for + browser links or actions. +- Pass a same-origin relative `returnTo` path for the destination after sign-in + or sign-out. The helper validates and safely encodes it. +- Mark protected pages with `export const dynamic = "force-dynamic"` because + they depend on per-request identity headers. + +Dispatch owns `/signin-with-chatgpt`, `/signout-with-chatgpt`, `/callback`, the +OAuth cookies, and identity header injection. Do not implement app routes for +those reserved paths. Routes that do not import and call the helper remain +anonymous-compatible. + +SIWC establishes identity only; it does not prove workspace membership. Use the +Sites hosting platform's access policy controls for workspace-wide restrictions, +or enforce explicit server-side membership or allowlist checks. + +Use SIWC for account pages, user-specific dashboards, saved records, and write +actions tied to the current ChatGPT user. Leave public content anonymous. + +## Useful Commands + +- `npm run dev`: start local development +- `npm run build`: verify the vinext build output +- `npm test`: build the starter and verify its rendered loading skeleton +- `npm run db:generate`: generate Drizzle migrations after schema changes + +## Learn More + +- [vinext Documentation](https://github.com/cloudflare/vinext) +- [Drizzle D1 Guide](https://orm.drizzle.team/docs/get-started/d1-new) diff --git a/app/admin-app.tsx b/app/admin-app.tsx new file mode 100644 index 0000000..bf7df79 --- /dev/null +++ b/app/admin-app.tsx @@ -0,0 +1,1675 @@ +"use client"; + +import { + ChangeEvent, + FormEvent, + useCallback, + useEffect, + useMemo, + useState, +} from "react"; +import { formatShanghaiDate as formatDate } from "../lib/date-utils"; + +type Partner = { + id: string; + name: string; + wecom_name: string; + owner: string; + claimed_total: number; + completed_total: number; +}; + +type Task = { + id: string; + name: string; + brand: string; + quantity: number; + claimed_quantity: number; + due_at: string; + status: string; + source_url: string; + source_sheet_id: string; + source_sheet_name: string; + source_synced_at: string | null; + share_token: string; + collection_start_date: string | null; + collection_days: string; + collection_schedule_updated_at: string | null; +}; + +type Account = { + id: string; + platform: string; + platform_uid: string; + public_account_id: string; + nickname: string; + profile_url: string; + ip_location: string; + followers: number; + post_count: number; + avg_views: number; + first_seen_at: string; + last_seen_at: string; +}; + +type Distribution = { + id: string; + task_id: string; + content_id: string; + partner_id: string; + delegation_bundle_id: string | null; + account_id: string | null; + publish_url: string | null; + publish_time: string | null; + status: string; + claimed_at: string; + screenshot_key: string | null; + ocr_status: string; + exposure: number | null; + views: number | null; + d2_likes: number | null; + d2_comments: number | null; + d2_collects: number | null; + d5_likes: number | null; + d5_comments: number | null; + d5_collects: number | null; + d7_likes: number | null; + d7_comments: number | null; + d7_collects: number | null; + latest_likes: number | null; + latest_comments: number | null; + latest_collects: number | null; + collection_status: string; + collection_status_description: string | null; + collection_updated_at: string | null; + last_collection_day: number | null; + updated_at: string; + content_title: string; + partner_name: string; + account_nickname: string | null; + account_platform: string | null; + task_name: string; + task_brand: string; + due_at: string; +}; + +type DashboardData = { + partners: Partner[]; + tasks: Task[]; + accounts: Account[]; + distributions: Distribution[]; + portal_url: string; +}; + +type FeishuPreview = { + sheetId: string; + sheetName: string; + syncedAt: string; + rowCount: number; + columns: string[]; + preview: Array<{ + sourceRow: number; + title: string; + body: string; + }>; +}; + +type NavKey = + | "overview" + | "tasks" + | "distributions" + | "resources" + | "recovery"; + +const NAV_ITEMS: Array<{ key: NavKey; label: string; mark: string }> = [ + { key: "overview", label: "工作台", mark: "⌂" }, + { key: "tasks", label: "内容任务", mark: "▤" }, + { key: "distributions", label: "内容分发", mark: "↗" }, + { key: "resources", label: "KOC资源", mark: "◎" }, + { key: "recovery", label: "数据回收", mark: "◫" }, +]; + +const EMPTY_DATA: DashboardData = { + partners: [], + tasks: [], + accounts: [], + distributions: [], + portal_url: "", +}; + +async function readApiResponse(response: Response, fallback: string) { + const text = await response.text(); + const contentType = response.headers.get("content-type") ?? ""; + if (!contentType.includes("json")) { + if (response.status === 403) { + throw new Error("请求被安全网关拦截,请刷新页面后重试"); + } + throw new Error(`${fallback}(服务返回异常,HTTP ${response.status})`); + } + try { + return JSON.parse(text) as T & { error?: string }; + } catch { + throw new Error(`${fallback}(服务返回的数据无法解析)`); + } +} + +function formatNumber(value: number | null | undefined) { + if (value === null || value === undefined) return "—"; + if (value >= 10000) return `${(value / 10000).toFixed(value >= 100000 ? 0 : 1)}万`; + return new Intl.NumberFormat("zh-CN").format(value); +} + +function statusLabel(status: string) { + const labels: Record = { + claimed: "待发布", + published: "已发布", + collecting: "采集中", + complete: "已完成", + active: "分发中", + closed: "已结束", + }; + return labels[status] || status; +} + +function latestPublicMetrics(distribution: Distribution) { + const legacyDay = + distribution.d7_likes !== null + ? 7 + : distribution.d5_likes !== null + ? 5 + : distribution.d2_likes !== null + ? 2 + : null; + const likes = + distribution.latest_likes ?? + (legacyDay ? distribution[`d${legacyDay}_likes`] : null); + const comments = + distribution.latest_comments ?? + (legacyDay ? distribution[`d${legacyDay}_comments`] : null); + const collects = + distribution.latest_collects ?? + (legacyDay ? distribution[`d${legacyDay}_collects`] : null); + return { + likes, + comments, + collects, + total: + likes === null + ? null + : likes + (comments ?? 0) + (collects ?? 0), + }; +} + +function hasCreatorMetrics(distribution: Distribution) { + return distribution.exposure !== null && distribution.views !== null; +} + +function parseCollectionDays(value: string | null | undefined) { + try { + const parsed = JSON.parse(value || "[]") as unknown; + if (!Array.isArray(parsed)) return []; + return [...new Set(parsed.map(Number))] + .filter((day) => Number.isInteger(day) && day >= 1 && day <= 7) + .sort((a, b) => a - b); + } catch { + return []; + } +} + +function todayInputValue() { + const parts = new Intl.DateTimeFormat("zh-CN", { + timeZone: "Asia/Shanghai", + year: "numeric", + month: "2-digit", + day: "2-digit", + }).formatToParts(new Date()); + const value = Object.fromEntries( + parts.map((part) => [part.type, part.value]), + ); + return `${value.year}-${value.month}-${value.day}`; +} + +function addCalendarDays(value: string, days: number) { + const match = value.match(/^(\d{4})-(\d{2})-(\d{2})$/); + if (!match) return ""; + const date = new Date( + Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3]) + days), + ); + return date.toISOString().slice(0, 10); +} + +function xhsPublishUrl(value: string | null) { + if (!value) return null; + try { + const url = new URL(value); + const hostname = url.hostname.toLowerCase(); + const isXhsHost = + hostname === "xiaohongshu.com" || + hostname.endsWith(".xiaohongshu.com") || + hostname === "xhslink.com" || + hostname.endsWith(".xhslink.com"); + return ["http:", "https:"].includes(url.protocol) && isXhsHost + ? url.toString() + : null; + } catch { + return null; + } +} + +function collectionStatusLabel(status: string, hasMetrics: boolean) { + if (hasMetrics && (!status || status === "pending")) return "采集成功"; + const labels: Record = { + pending: "待设置", + scheduled: "已计划", + collecting: "采集中", + success: "采集成功", + failed: "采集失败", + }; + return labels[status] || status || "待设置"; +} + +function avatarColor(value: string) { + const colors = ["coral", "cyan", "violet", "amber", "mint"]; + const index = [...value].reduce((sum, char) => sum + char.charCodeAt(0), 0); + return colors[index % colors.length]; +} + +async function compressScreenshot(file: File) { + if (file.size < 850_000 || !file.type.startsWith("image/")) return file; + const bitmap = await createImageBitmap(file); + const maxEdge = 1600; + const scale = Math.min(1, maxEdge / Math.max(bitmap.width, bitmap.height)); + const canvas = document.createElement("canvas"); + canvas.width = Math.max(1, Math.round(bitmap.width * scale)); + canvas.height = Math.max(1, Math.round(bitmap.height * scale)); + const context = canvas.getContext("2d"); + if (!context) { + bitmap.close(); + return file; + } + context.drawImage(bitmap, 0, 0, canvas.width, canvas.height); + bitmap.close(); + const blob = await new Promise((resolve) => + canvas.toBlob(resolve, "image/jpeg", 0.82), + ); + if (!blob) return file; + return new File([blob], `${file.name.replace(/\.[^.]+$/, "")}.jpg`, { + type: "image/jpeg", + }); +} + +export default function Home() { + const [data, setData] = useState(EMPTY_DATA); + const [activeNav, setActiveNav] = useState("overview"); + const [loading, setLoading] = useState(true); + const [working, setWorking] = useState(false); + const [error, setError] = useState(""); + const [toast, setToast] = useState(""); + const [menuOpen, setMenuOpen] = useState(false); + const [taskModalOpen, setTaskModalOpen] = useState(false); + const [metricModal, setMetricModal] = useState(null); + const [taskForm, setTaskForm] = useState({ + name: "", + brand: "", + dueAt: "2026-08-12", + feishuUrl: "", + }); + const [sourcePreview, setSourcePreview] = useState(null); + const [sourceWorking, setSourceWorking] = useState(false); + const [metricForm, setMetricForm] = useState({ exposure: "", views: "" }); + + const loadData = useCallback(async () => { + try { + setLoading(true); + const response = await fetch("/api/bootstrap", { cache: "no-store" }); + const result = await readApiResponse(response, "加载失败"); + if (!response.ok) throw new Error(result.error || "加载失败"); + setData(result); + } catch (reason) { + setError(reason instanceof Error ? reason.message : "加载失败"); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + const timer = window.setTimeout(() => { + void loadData(); + }, 0); + return () => window.clearTimeout(timer); + }, [loadData]); + + useEffect(() => { + if (!toast) return; + const timer = window.setTimeout(() => setToast(""), 2600); + return () => window.clearTimeout(timer); + }, [toast]); + + const runAction = async ( + payload: Record, + successMessage: string, + ) => { + try { + setWorking(true); + const response = await fetch("/api/action", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + const result = await readApiResponse(response, "操作失败"); + if (!response.ok) throw new Error(result.error || "操作失败"); + setData(result); + setToast(successMessage); + return true; + } catch (reason) { + setToast(reason instanceof Error ? reason.message : "操作失败"); + return false; + } finally { + setWorking(false); + } + }; + + const stats = useMemo(() => { + const published = data.distributions.filter((item) => + ["published", "collecting", "complete"].includes(item.status), + ).length; + const completed = data.distributions.filter( + (item) => item.status === "complete", + ).length; + const pendingRecovery = data.distributions.filter( + (item) => + item.publish_url && + (latestPublicMetrics(item).likes === null || + !hasCreatorMetrics(item)), + ).length; + return { + resources: data.accounts.length, + activeTasks: data.tasks.filter((task) => task.status === "active").length, + published, + completed, + pendingRecovery, + }; + }, [data]); + + const recentDistributions = data.distributions.slice(0, 6); + + const navigate = (key: NavKey) => { + setActiveNav(key); + setMenuOpen(false); + }; + + const submitTask = async (event: FormEvent) => { + event.preventDefault(); + if (!sourcePreview) { + setToast("请先读取飞书表格"); + return; + } + const success = await runAction( + { action: "create_task", ...taskForm }, + `任务已创建,${sourcePreview.rowCount} 篇内容进入可领取池`, + ); + if (success) { + setTaskModalOpen(false); + setSourcePreview(null); + setTaskForm({ + name: "", + brand: "", + dueAt: "2026-08-12", + feishuUrl: "", + }); + } + }; + + const inspectFeishu = async () => { + if (!taskForm.feishuUrl.trim()) { + setToast("请先粘贴飞书表格链接"); + return; + } + try { + setSourceWorking(true); + const response = await fetch("/api/action", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "inspect_feishu", + feishuUrl: taskForm.feishuUrl, + }), + }); + const result = await readApiResponse( + response, + "读取飞书表格失败", + ); + if (!response.ok) throw new Error(result.error || "读取飞书表格失败"); + setSourcePreview(result); + setTaskForm((current) => ({ + ...current, + name: current.name || result.sheetName.replace(/500篇$/, "分发任务"), + })); + setToast(`已读取 ${result.rowCount} 篇有效内容`); + } catch (reason) { + setSourcePreview(null); + setToast(reason instanceof Error ? reason.message : "读取飞书表格失败"); + } finally { + setSourceWorking(false); + } + }; + + const copyTaskShareLink = async (task: Task) => { + if (!data.portal_url || !task.share_token) { + setToast("KOC外部站点尚未发布"); + return; + } + const url = `${data.portal_url.replace(/\/$/, "")}/?task=${task.share_token}`; + try { + await navigator.clipboard.writeText(url); + setToast("KOC领取链接已复制"); + } catch { + window.prompt("复制KOC领取链接", url); + } + }; + + const collectMetrics = async (distribution: Distribution) => { + await runAction( + { action: "collect_now", distributionId: distribution.id }, + "公开数据已更新", + ); + }; + + const retryFailedMetrics = async (taskId: string, failedCount: number) => { + if (failedCount === 0) { + setToast("当前没有采集异常的笔记"); + return; + } + await runAction( + { action: "retry_failed_collections", taskId }, + `已完成 ${failedCount} 篇异常笔记的一键补采`, + ); + }; + + const saveCollectionSchedule = async ( + taskId: string, + startDate: string, + days: number[], + ) => { + return runAction( + { + action: "save_collection_schedule", + taskId, + startDate, + days, + }, + `采集任务已创建,将在所选日期10:00自动执行`, + ); + }; + + const uploadScreenshot = async ( + distribution: Distribution, + event: ChangeEvent, + ) => { + const file = event.target.files?.[0]; + if (!file) return; + try { + setWorking(true); + const uploadFile = await compressScreenshot(file); + const form = new FormData(); + form.append("distributionId", distribution.id); + form.append("file", uploadFile); + const response = await fetch("/api/upload", { method: "POST", body: form }); + const result = await readApiResponse(response, "上传失败"); + if (!response.ok) throw new Error(result.error || "上传失败"); + setData(result); + setToast("创作者中心截图已收回"); + } catch (reason) { + setToast(reason instanceof Error ? reason.message : "上传失败"); + } finally { + setWorking(false); + event.target.value = ""; + } + }; + + const submitManualMetrics = async (event: FormEvent) => { + event.preventDefault(); + if (!metricModal) return; + const success = await runAction( + { + action: "manual_metrics", + distributionId: metricModal.id, + exposure: metricForm.exposure, + views: metricForm.views, + }, + "创作者中心数据已确认", + ); + if (success) { + setMetricModal(null); + setMetricForm({ exposure: "", views: "" }); + } + }; + + const openMetricFallback = (distribution: Distribution) => { + setMetricModal(distribution); + setMetricForm({ + exposure: distribution.exposure?.toString() || "", + views: distribution.views?.toString() || "", + }); + }; + + const pageTitle: Record = { + overview: { + title: "分发工作台", + subtitle: "用最少动作,跑完内容领取、发布与数据回收。", + }, + tasks: { + title: "内容任务", + subtitle: "从飞书同步内容,按数量开放给合作方领取。", + }, + distributions: { + title: "内容分发", + subtitle: "先按任务查看进度,再进入单个任务处理每篇笔记。", + }, + resources: { + title: "KOC资源", + subtitle: "只沉淀真实发布过的账号,不要求提前登记。", + }, + recovery: { + title: "数据回收", + subtitle: "按任务设置自动采集日,集中查看最新公开数据与创作者截图。", + }, + }; + + return ( +
+ + + {menuOpen && +
+ KOC LOOP + / + {pageTitle[activeNav].title} +
+
+ 飞书内容表已接入 + + +
+ + +
+
+
+

MVP · 核心闭环

+

{pageTitle[activeNav].title}

+

{pageTitle[activeNav].subtitle}

+
+ {activeNav === "overview" && ( +
+ 今天 + 7月27日 +
+ )} +
+ + {loading ? ( + + ) : error ? ( +
+
!
+

暂时无法打开工作台

+

{error}

+ +
+ ) : ( + <> + {activeNav === "overview" && ( + + )} + {activeNav === "tasks" && ( + setTaskModalOpen(true)} + onCopyShare={copyTaskShareLink} + /> + )} + {activeNav === "distributions" && ( + + )} + {activeNav === "resources" && ( + + )} + {activeNav === "recovery" && ( + item.publish_url)} + working={working} + onCollect={collectMetrics} + onSaveSchedule={saveCollectionSchedule} + onUpload={uploadScreenshot} + onFallback={openMetricFallback} + onRetryFailed={retryFailedMetrics} + /> + )} + + )} +
+ + + {taskModalOpen && ( +
setTaskModalOpen(false)}> +
event.stopPropagation()}> +
+
+

飞书链接导入

+

新建分发任务

+
+ +
+ + {sourcePreview && ( +
+
+
+ +
+ {sourcePreview.sheetName} + 工作表 {sourcePreview.sheetId} · 已匹配 {sourcePreview.columns.length} 个字段 +
+
+ {sourcePreview.rowCount} 篇 +
+
+ {sourcePreview.columns.map((column) => {column})} +
+
+ {sourcePreview.preview.map((row) => ( +
+ {row.sourceRow} + {row.title} +
+ ))} +
+
+ )} +
+ + +
+ +
+ + +
+
+
+ )} + + {metricModal && ( +
setMetricModal(null)}> +
event.stopPropagation()}> +
+
+

OCR异常兜底

+

确认创作者数据

+
+ +
+
+ {metricModal.account_nickname || "待识别账号"} + {metricModal.content_title} +
+
+ + +
+
+ + +
+
+
+ )} + + {toast &&
{toast}
} + {working &&
} +
+ ); +} + +function LoadingState() { + return ( +
+
+
+
+
+
+ ); +} + +function OverviewPage({ + stats, + distributions, + tasks, + onNavigate, +}: { + stats: { + resources: number; + activeTasks: number; + published: number; + completed: number; + pendingRecovery: number; + }; + distributions: Distribution[]; + tasks: Task[]; + onNavigate: (key: NavKey) => void; +}) { + const cards = [ + { + label: "已沉淀账号资源", + value: stats.resources, + hint: "均来自真实发布", + tone: "ink", + }, + { + label: "正在分发任务", + value: stats.activeTasks, + hint: `${tasks.reduce((sum, task) => sum + task.claimed_quantity, 0)} 篇已被领取`, + tone: "green", + }, + { + label: "已回填发布", + value: stats.published, + hint: "链接自动识别账号", + tone: "blue", + }, + { + label: "待完成数据回收", + value: stats.pendingRecovery, + hint: stats.pendingRecovery > 0 ? "需要跟进" : "全部按时完成", + tone: "orange", + }, + ]; + return ( + <> +
+ {cards.map((card) => ( +
+
+

{card.label}

+
+ {card.value} + +
+ {card.hint} +
+ ))} +
+ +
+
+
+
+

当前闭环

+

每篇内容只沿着一条记录向前走

+
+ +
+
+
+ 01 +
内容已同步{tasks.reduce((sum, task) => sum + task.quantity, 0)} 篇
+
+ +
+ 02 +
KOC领取{tasks.reduce((sum, task) => sum + task.claimed_quantity, 0)} 篇
+
+ +
+ 03 +
发布回填{stats.published} 篇
+
+ +
+ 04 +
数据回收{stats.completed} 篇完成
+
+
+
+
{stats.pendingRecovery}待回收
+
+

今天最需要推进

+

把已发布笔记的数据收回来

+

按任务选择采集日期,系统在当天10:00更新点赞、收藏、评论和总互动。

+
+ +
+
+ +
+
+

进行中的任务

按截止时间排序

+
+
+ {tasks.map((task) => { + const progress = Math.round((task.claimed_quantity / task.quantity) * 100); + return ( +
+
+
{task.brand.slice(0, 1)}
+
{task.name}{task.brand}
+ {progress}% +
+
+
+ {task.claimed_quantity}/{task.quantity} 篇已领取 + {formatDate(task.due_at)}截止 +
+
+ ); + })} +
+ +
+
+ +
+
+

最近分发

领取、发布账号与回收状态一眼看清

+ +
+ +
+ + ); +} + +function TasksPage({ + tasks, + portalUrl, + onCreate, + onCopyShare, +}: { + tasks: Task[]; + portalUrl: string; + onCreate: () => void; + onCopyShare: (task: Task) => void; +}) { + return ( +
+
+
+

内容从飞书来

+

一行内容,一份可领取笔记

+

不在这里重复编辑正文。这里只控制任务数量、领取进度和截止时间。

+
+ +
+
+
+

任务列表

{tasks.length} 个任务

+
+
+ {tasks.map((task) => { + const progress = Math.round((task.claimed_quantity / task.quantity) * 100); + return ( +
+
{task.brand.slice(0, 1)}
+
+

{task.name}

{task.brand}
+ {task.source_sheet_name ? `飞书 · ${task.source_sheet_name}` : "历史示例内容表"} +
+
+
{task.claimed_quantity}/ {task.quantity} 已领取
+
截止日期{formatDate(task.due_at)}
+ {statusLabel(task.status)} +
+ + {portalUrl && task.share_token && ( + + ↗ + + )} +
+
+ ); + })} +
+
+
+ ); +} + +function TaskScopeList({ + tasks, + distributions, + mode, + onOpen, +}: { + tasks: Task[]; + distributions: Distribution[]; + mode: "distribution" | "recovery"; + onOpen: (taskId: string) => void; +}) { + return ( +
+ {tasks.map((task) => { + const taskDistributions = distributions.filter( + (item) => item.task_id === task.id, + ); + const published = taskDistributions.filter((item) => item.publish_url); + const publicDataComplete = published.filter( + (item) => latestPublicMetrics(item).likes !== null, + ).length; + const creatorComplete = published.filter( + (item) => hasCreatorMetrics(item), + ).length; + const progress = task.quantity + ? Math.round((task.claimed_quantity / task.quantity) * 100) + : 0; + return ( +
+
+
+ {task.brand.slice(0, 1)} +
+
+

{task.name}

+ {task.brand} · {formatDate(task.due_at)} 截止 +
+ {statusLabel(task.status)} +
+
+ 飞书来源 + {task.source_url ? ( + + {task.source_sheet_name || `工作表 ${task.source_sheet_id}`} ↗ + + ) : ( + 历史示例内容表 + )} +
+ {mode === "distribution" ? ( + <> +
+
内容总量{task.quantity}
+
已领取{task.claimed_quantity}
+
已发布{published.length}
+
+
+ +
+ + ) : ( +
+
已发布{published.length}
+
公开数据{publicDataComplete}
+
创作者数据{creatorComplete}
+
+ )} + +
+ ); + })} +
+ ); +} + +function TaskDetailHeader({ + task, + label, + onBack, +}: { + task: Task; + label: string; + onBack: () => void; +}) { + return ( +
+ +
{task.brand.slice(0, 1)}
+
+

{label}

+

{task.name}

+ {task.brand} · {task.quantity} 篇 · {formatDate(task.due_at)} 截止 +
+ {task.source_url && ( + + 打开飞书原表 ↗ + + )} +
+ ); +} + +function DistributionPage({ + tasks, + distributions, +}: { + tasks: Task[]; + distributions: Distribution[]; +}) { + const [selectedTaskId, setSelectedTaskId] = useState(null); + const selectedTask = tasks.find((task) => task.id === selectedTaskId); + if (!selectedTask) { + return ( +
+
+

按任务管理

选择一个分发任务

+

每个任务独立查看领取、发布和账号识别进度,不混排不同项目的笔记。

+
+ +
+ ); + } + + const taskDistributions = distributions.filter( + (item) => item.task_id === selectedTask.id, + ); + const published = taskDistributions.filter((item) => item.publish_url).length; + return ( +
+ setSelectedTaskId(null)} + /> +
+
已领取{taskDistributions.length}
+ +
已回填链接{published}
+ +
待发布{taskDistributions.length - published}
+
当前仅展示“{selectedTask.name}”
+
+
+
+

内容分发表

实际发布账号在链接回填后自动补齐

+
+
+ +
+
+ ); +} + +function DistributionTable({ + distributions, + compact = false, +}: { + distributions: Distribution[]; + compact?: boolean; +}) { + return ( +
+ + + + + + + + + + + + + {distributions.map((item) => ( + + + + + + + + + ))} + +
内容领取合作方实际发布账号发布时间数据状态状态
+
+ {item.content_id.split("-").at(-1)?.toUpperCase()} +
{item.content_title}{item.task_name} · {item.task_brand}
+
+
{item.partner_name} + {item.account_nickname ? ( +
+
{item.account_nickname.slice(0, 1)}
+
{item.account_nickname}{item.account_platform}
+
+ ) : ( + 回填链接后识别 + )} +
{formatDate(item.publish_time, true)} + {item.d7_likes !== null ? ( + D7 已回收 + ) : item.d2_likes !== null ? ( + 采集中 + ) : ( + {item.publish_url ? "等待D2" : "尚未发布"} + )} + {statusLabel(item.status)}
+ {!compact && distributions.length === 0 &&
暂无分发记录
} +
+ ); +} + +function ResourcesPage({ + accounts, + distributions, +}: { + accounts: Account[]; + distributions: Distribution[]; +}) { + const sources = (accountId: string) => + [...new Set(distributions.filter((item) => item.account_id === accountId).map((item) => item.partner_name))]; + const isPartnerManagedOnly = (accountId: string) => { + const deliveries = distributions.filter( + (item) => item.account_id === accountId, + ); + return ( + deliveries.some((item) => item.delegation_bundle_id) && + deliveries.every((item) => item.delegation_bundle_id) + ); + }; + return ( +
+
+
+ {accounts.length} + 个真实发布账号 +
+
+

资源从合作中自然长出来

+

不向KOC索要名单。发布链接第一次出现时建档,再次出现时更新合作次数与效果。

+
+
+ 唯一去重规则 + 平台 + 账号主页 +
+
+
+
+

账号资源库

只展示真实交付过的账号

+
+
+
+ {accounts.map((account) => ( +
+
+
{account.nickname.slice(0, 1)}
+

{account.nickname}

{account.platform} · {account.ip_location}
+ +
+
+ {account.platform === "小红书" ? "小红书号" : account.platform === "抖音" ? "抖音号" : "账号"} + {account.public_account_id || "待识别"} +
+
+
粉丝{formatNumber(account.followers)}
+
合作发布{account.post_count}
+
+
+ 历史合作来源 +
+ {sources(account.id).map((source) => {source})} + {isPartnerManagedOnly(account.id) && ( + 合作社资源 · 不可直联 + )} +
+
+
+ 最近合作 {formatDate(account.last_seen_at)} + {account.profile_url && 查看主页 ↗} +
+
+ ))} +
+
+
+ ); +} + +function RecoveryPage({ + tasks, + distributions, + working, + onCollect, + onSaveSchedule, + onUpload, + onFallback, + onRetryFailed, +}: { + tasks: Task[]; + distributions: Distribution[]; + working: boolean; + onCollect: (distribution: Distribution) => void; + onSaveSchedule: ( + taskId: string, + startDate: string, + days: number[], + ) => Promise; + onUpload: (distribution: Distribution, event: ChangeEvent) => void; + onFallback: (distribution: Distribution) => void; + onRetryFailed: (taskId: string, failedCount: number) => void; +}) { + const [selectedTaskId, setSelectedTaskId] = useState(null); + const selectedTask = tasks.find((task) => task.id === selectedTaskId); + if (!selectedTask) { + return ( +
+
+

按任务回收

选择一个数据回收任务

+

进入任务后设置自动采集日期,统一查看每篇笔记的最新互动数据。

+
+ +
+ ); + } + + const taskDistributions = distributions.filter( + (item) => item.task_id === selectedTask.id, + ); + const failedCollectionCount = taskDistributions.filter( + (item) => item.collection_status === "failed", + ).length; + return ( +
+ setSelectedTaskId(null)} + /> + +
+
+
+

数据回收队列

+

{taskDistributions.length} 篇已发布笔记 · 展示最近一次采集结果

+
+ +
+
+ + + + + + + + + + + + + + + + + {taskDistributions.map((item) => { + const metrics = latestPublicMetrics(item); + const noteUrl = xhsPublishUrl(item.publish_url); + const hasMetrics = metrics.likes !== null; + const collectionStatus = + item.collection_status || + (hasMetrics ? "success" : "pending"); + return ( + + + + + + + + + + + + + ); + })} + +
内容 / 发布账号发布时间点赞收藏评论总互动数据更新时间采集状态创作者截图操作
+
+
{Array.from(item.content_title)[0] || "笔"}
+
+ {noteUrl ? ( + + {item.content_title} + + ) : ( + {item.content_title} + )} + + {item.account_nickname || "待识别账号"} + {item.account_platform ? ` · ${item.account_platform}` : ""} + +
+
+
+
+ {formatDate(item.publish_time, true)} +
+
{formatNumber(metrics.likes)}
{formatNumber(metrics.collects)}
{formatNumber(metrics.comments)}
+
+ {formatNumber(metrics.total)} + 赞 + 藏 + 评 +
+
+
+ {formatDate(item.collection_updated_at || (hasMetrics ? item.updated_at : null), true)} + {item.last_collection_day && 第{item.last_collection_day}天采集} +
+
+
+ + {collectionStatusLabel(collectionStatus, hasMetrics)} + + + {item.collection_status_description || + (hasMetrics ? "成功" : "等待采集计划")} + +
+
+
+ {item.screenshot_key ? ( + + 查看截图 ↗ + + ) : ( + 待KOC上传 + )} + {hasCreatorMetrics(item) ? ( + + 曝光 {formatNumber(item.exposure)} + 阅读 {formatNumber(item.views)} + + ) : item.screenshot_key ? ( + + 待KOC填写数据 + + ) : null} + {item.screenshot_key && + !hasCreatorMetrics(item) && ( + + )} +
+
+ {item.screenshot_key && !hasCreatorMetrics(item) ? ( + + ) : ( + + )} +
+ {taskDistributions.length === 0 && ( +
当前任务还没有已发布笔记
+ )} +
+
+
+ ); +} + +function CollectionScheduleCard({ + task, + working, + onSave, +}: { + task: Task; + working: boolean; + onSave: ( + taskId: string, + startDate: string, + days: number[], + ) => Promise; +}) { + const [startDate, setStartDate] = useState( + task.collection_start_date || todayInputValue(), + ); + const [days, setDays] = useState( + parseCollectionDays(task.collection_days), + ); + + const toggleDay = (day: number) => { + setDays((current) => + current.includes(day) + ? current.filter((item) => item !== day) + : [...current, day].sort((a, b) => a - b), + ); + }; + + return ( +
+
+
+

自动采集计划

+

选择开始日期与采集日

+ 勾选第1天到第7天,所选日期均在北京时间10:00自动采集。 +
+
+ 已选择 {days.length} 天 + +
+
+
+ +
+ {Array.from({ length: 7 }, (_, index) => index + 1).map((day) => { + const selected = days.includes(day); + const date = addCalendarDays(startDate, day - 1); + return ( + + ); + })} +
+ 左右滑动查看第1—7天 +
+ {task.collection_schedule_updated_at && ( +

+ 当前计划更新于 {formatDate(task.collection_schedule_updated_at, true)} +

+ )} +
+ ); +} diff --git a/app/api/action/route.ts b/app/api/action/route.ts new file mode 100644 index 0000000..ed79cae --- /dev/null +++ b/app/api/action/route.ts @@ -0,0 +1,394 @@ +import { env } from "cloudflare:workers"; +import { getRequestExecutionContext } from "vinext/shims/request-context"; +import { backfillAccountProfiles } from "../../../lib/account-enrichment-service"; +import { + ensureSchema, + getDashboardData, + getRawDb, + uid, +} from "../../../lib/mvp-db"; +import { + collectDistributionMetrics, + createCollectionRunTasks, + retryFailedCollections, + runDueScheduledCollections, + shanghaiDateFromTimestamp, +} from "../../../lib/collection-service"; +import { + resolveCollectionMcpConfig, + type CollectionMcpBindings, +} from "../../../lib/mcp-collection-client"; +import { adminForbidden, isAdminRequest } from "../../../lib/admin-auth"; +import { + FeishuSourceError, + readFeishuSource, + type FeishuBindings, + type FeishuSource, +} from "../../../lib/feishu-client"; + +export const runtime = "edge"; + +type ActionBody = { + action?: string; + [key: string]: unknown; +}; + +function numberValue(value: unknown, fallback = 0) { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : fallback; +} + +async function createTaskFromSource( + source: FeishuSource, + name: string, + brand: string, + dueAt: string, +) { + const db = getRawDb(); + const taskId = uid("task"); + const shareToken = crypto.randomUUID().replaceAll("-", ""); + await db + .prepare( + `INSERT INTO tasks + (id, name, brand, quantity, claimed_quantity, due_at, status, + source_url, source_sheet_id, source_sheet_name, source_synced_at, + share_token) + VALUES (?, ?, ?, ?, 0, ?, 'importing', ?, ?, ?, ?, ?)`, + ) + .bind( + taskId, + name, + brand, + source.rows.length, + dueAt, + source.url, + source.sheetId, + source.sheetName, + source.syncedAt, + shareToken, + ) + .run(); + + try { + const contentStatements = source.rows.map((row) => { + const contentId = uid("content"); + const imageAssets = row.images.map((image) => ({ + ...image, + key: `content-assets/${taskId}/${contentId}/${image.index}`, + })); + return db + .prepare( + `INSERT INTO contents + (id, task_id, title, body, image_assets, status, source, source_row) + VALUES (?, ?, ?, ?, ?, 'available', ?, ?)`, + ) + .bind( + contentId, + taskId, + row.title, + row.body, + JSON.stringify(imageAssets), + `飞书 · ${source.sheetName}`, + row.sourceRow, + ); + }); + for (let index = 0; index < contentStatements.length; index += 100) { + await db.batch(contentStatements.slice(index, index + 100)); + } + await db + .prepare("UPDATE tasks SET status = 'active' WHERE id = ?") + .bind(taskId) + .run(); + } catch (error) { + await db.batch([ + db.prepare("DELETE FROM contents WHERE task_id = ?").bind(taskId), + db.prepare("DELETE FROM tasks WHERE id = ?").bind(taskId), + ]); + throw error; + } +} + +export async function POST(request: Request) { + if (!isAdminRequest(request)) return adminForbidden(); + try { + await ensureSchema(); + const body = (await request.json()) as ActionBody; + const db = getRawDb(); + + if (body.action === "inspect_feishu") { + const source = await readFeishuSource( + String(body.feishuUrl ?? "").trim(), + env as unknown as FeishuBindings, + ); + return Response.json({ + sheetId: source.sheetId, + sheetName: source.sheetName, + syncedAt: source.syncedAt, + rowCount: source.rows.length, + columns: source.columns, + preview: source.rows.slice(0, 3), + }); + } + + if (body.action === "create_task") { + const name = String(body.name ?? "").trim(); + const brand = String(body.brand ?? "").trim(); + const dueAt = String(body.dueAt ?? "").trim(); + if (!name || !brand || !dueAt) { + return Response.json( + { error: "请补全任务名称、品牌和截止日期" }, + { status: 400 }, + ); + } + const source = await readFeishuSource( + String(body.feishuUrl ?? "").trim(), + env as unknown as FeishuBindings, + ); + await createTaskFromSource(source, name, brand, dueAt); + } else if (body.action === "claim") { + const partnerId = String(body.partnerId ?? ""); + const taskId = String(body.taskId ?? ""); + const quantity = Math.max(1, Math.min(50, numberValue(body.quantity, 1))); + const available = await db + .prepare( + `SELECT id FROM contents + WHERE task_id = ? AND status = 'available' + ORDER BY created_at, id + LIMIT ?`, + ) + .bind(taskId, quantity) + .all<{ id: string }>(); + if (available.results.length === 0) { + return Response.json({ error: "当前没有可领取内容" }, { status: 409 }); + } + const statements = available.results.flatMap((content) => [ + db + .prepare( + `INSERT INTO distributions + (id, task_id, content_id, partner_id, status) + VALUES (?, ?, ?, ?, 'claimed')`, + ) + .bind(uid("dist"), taskId, content.id, partnerId), + db + .prepare("UPDATE contents SET status = 'allocated' WHERE id = ?") + .bind(content.id), + ]); + statements.push( + db + .prepare( + `UPDATE tasks SET claimed_quantity = claimed_quantity + ? + WHERE id = ?`, + ) + .bind(available.results.length, taskId), + db + .prepare( + `UPDATE partners SET claimed_total = claimed_total + ? + WHERE id = ?`, + ) + .bind(available.results.length, partnerId), + ); + await db.batch(statements); + } else if (body.action === "save_collection_schedule") { + const taskId = String(body.taskId ?? "").trim(); + const startDate = String(body.startDate ?? "").trim(); + const days = Array.isArray(body.days) + ? [...new Set(body.days.map(Number))] + .filter( + (day) => + Number.isInteger(day) && day >= 1 && day <= 7, + ) + .sort((a, b) => a - b) + : []; + if (!taskId || !/^\d{4}-\d{2}-\d{2}$/.test(startDate)) { + return Response.json( + { error: "请选择有效的开始采集日期" }, + { status: 400 }, + ); + } + if (days.length === 0) { + return Response.json( + { error: "请至少选择一个自动采集日" }, + { status: 400 }, + ); + } + const task = await db + .prepare("SELECT id FROM tasks WHERE id = ?") + .bind(taskId) + .first<{ id: string }>(); + if (!task) { + return Response.json({ error: "任务不存在" }, { status: 404 }); + } + await db.batch([ + db + .prepare( + `UPDATE tasks + SET collection_start_date = ?, + collection_days = ?, + collection_schedule_updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(startDate, JSON.stringify(days), taskId), + db + .prepare( + `UPDATE distributions + SET collection_status = CASE + WHEN latest_likes IS NULL THEN 'scheduled' + ELSE collection_status + END, + collection_status_description = CASE + WHEN latest_likes IS NULL THEN ? + ELSE collection_status_description + END, + updated_at = CURRENT_TIMESTAMP + WHERE task_id = ? + AND publish_url IS NOT NULL + AND publish_url != ''`, + ) + .bind( + `已安排${days.length}个采集日,每日10:00执行`, + taskId, + ), + ]); + await createCollectionRunTasks(db, taskId, startDate, days); + const catchup = runDueScheduledCollections( + db, + Date.now(), + resolveCollectionMcpConfig( + env as unknown as CollectionMcpBindings, + ), + "catchup", + taskId, + ).catch(() => undefined); + const executionContext = getRequestExecutionContext(); + if (executionContext) { + executionContext.waitUntil(catchup); + } else { + await catchup; + } + } else if (body.action === "run_due_collections") { + await runDueScheduledCollections( + db, + Date.now(), + resolveCollectionMcpConfig( + env as unknown as CollectionMcpBindings, + ), + "catchup", + ); + } else if ( + body.action === "collect_now" || + body.action === "collect" + ) { + const distributionId = String(body.distributionId ?? ""); + const rawDay = + body.day === null || body.day === undefined + ? null + : numberValue(body.day); + const day = + rawDay !== null && Number.isInteger(rawDay) && rawDay >= 1 && rawDay <= 7 + ? rawDay + : null; + if (body.action === "collect" && day === null) { + return Response.json({ error: "采集周期无效" }, { status: 400 }); + } + await collectDistributionMetrics( + db, + distributionId, + shanghaiDateFromTimestamp(Date.now()), + day, + "manual", + resolveCollectionMcpConfig( + env as unknown as CollectionMcpBindings, + ), + ); + } else if (body.action === "retry_failed_collections") { + const taskId = String(body.taskId ?? "").trim(); + if (!taskId) { + return Response.json({ error: "请选择需要补采的任务" }, { status: 400 }); + } + await retryFailedCollections( + db, + taskId, + resolveCollectionMcpConfig( + env as unknown as CollectionMcpBindings, + ), + ); + } else if (body.action === "backfill_account_profiles") { + const backfill = backfillAccountProfiles( + db, + resolveCollectionMcpConfig( + env as unknown as CollectionMcpBindings, + ), + Math.max(1, Math.min(25, numberValue(body.limit, 10))), + ).catch(() => undefined); + const executionContext = getRequestExecutionContext(); + if (executionContext) { + executionContext.waitUntil(backfill); + } else { + await backfill; + } + } else if (body.action === "set_public_account_ids") { + const items = Array.isArray(body.items) ? body.items.slice(0, 50) : []; + const normalized = items + .map((item) => { + const record = + item && typeof item === "object" + ? (item as Record) + : {}; + return { + accountId: String(record.accountId ?? "").trim().slice(0, 80), + publicAccountId: String(record.publicAccountId ?? "") + .trim() + .slice(0, 80), + }; + }) + .filter( + (item) => + item.accountId && + /^[\p{L}\p{N}._-]{2,80}$/u.test(item.publicAccountId), + ); + if (normalized.length === 0) { + return Response.json( + { error: "没有可回填的账号号值" }, + { status: 400 }, + ); + } + await db.batch( + normalized.map((item) => + db + .prepare( + `UPDATE accounts + SET public_account_id = ?, + last_seen_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(item.publicAccountId, item.accountId), + ), + ); + } else if (body.action === "manual_metrics") { + const distributionId = String(body.distributionId ?? ""); + const exposure = Math.max(0, numberValue(body.exposure)); + const views = Math.max(0, numberValue(body.views)); + await db + .prepare( + `UPDATE distributions SET + exposure = ?, + views = ?, + ocr_status = 'manual', + status = CASE WHEN d7_likes IS NOT NULL THEN 'complete' ELSE status END, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(exposure, views, distributionId) + .run(); + } else { + return Response.json({ error: "不支持的操作" }, { status: 400 }); + } + + return Response.json(await getDashboardData()); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "操作失败" }, + { status: error instanceof FeishuSourceError ? error.status : 500 }, + ); + } +} diff --git a/app/api/bootstrap/route.ts b/app/api/bootstrap/route.ts new file mode 100644 index 0000000..2ad6574 --- /dev/null +++ b/app/api/bootstrap/route.ts @@ -0,0 +1,70 @@ +import { env } from "cloudflare:workers"; +import { getRequestExecutionContext } from "vinext/shims/request-context"; +import { backfillAccountProfiles } from "../../../lib/account-enrichment-service"; +import { runDueScheduledCollections } from "../../../lib/collection-service"; +import { + resolveCollectionMcpConfig, + type CollectionMcpBindings, +} from "../../../lib/mcp-collection-client"; +import { + ensureSchema, + getDashboardData, + getRawDb, + seedIfEmpty, +} from "../../../lib/mvp-db"; +import { adminForbidden, isAdminRequest } from "../../../lib/admin-auth"; + +export const runtime = "edge"; + +export async function GET(request: Request) { + if (!isAdminRequest(request)) return adminForbidden(); + try { + await ensureSchema(); + await seedIfEmpty(); + const db = getRawDb(); + const mcpConfig = resolveCollectionMcpConfig( + env as unknown as CollectionMcpBindings, + ); + const collectionCatchup = runDueScheduledCollections( + db, + Date.now(), + mcpConfig, + "catchup", + ).catch((error) => { + console.error( + "KOC collection catchup failed", + error instanceof Error ? error.message : "unknown error", + ); + }); + const accountBackfill = backfillAccountProfiles( + db, + mcpConfig, + 10, + ) + .then((result) => { + console.info("KOC account backfill completed", result); + }) + .catch((error) => { + console.error( + "KOC account backfill failed", + error instanceof Error ? error.message : "unknown error", + ); + }); + const catchup = Promise.all([ + collectionCatchup, + accountBackfill, + ]); + const executionContext = getRequestExecutionContext(); + if (executionContext) { + executionContext.waitUntil(catchup); + } else { + await catchup; + } + return Response.json(await getDashboardData()); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "加载失败" }, + { status: 500 }, + ); + } +} diff --git a/app/api/content-image-upload/route.ts b/app/api/content-image-upload/route.ts new file mode 100644 index 0000000..38732ca --- /dev/null +++ b/app/api/content-image-upload/route.ts @@ -0,0 +1,53 @@ +import feishuSnapshot from "../../../lib/feishu-source-snapshot.json"; +import { adminForbidden, isAdminRequest } from "../../../lib/admin-auth"; +import { ensureSchema, getUploadBucket } from "../../../lib/mvp-db"; + +export const runtime = "edge"; + +export async function POST(request: Request) { + if (!isAdminRequest(request)) return adminForbidden(); + try { + await ensureSchema(); + const form = await request.formData(); + const sheetId = String(form.get("sheetId") ?? "").trim(); + const sourceRow = Number(form.get("sourceRow")); + const imageIndex = Number(form.get("imageIndex")); + const file = form.get("file"); + if ( + sheetId !== feishuSnapshot.sheetId || + !Number.isInteger(sourceRow) || + !Number.isInteger(imageIndex) || + !(file instanceof File) || + file.size === 0 + ) { + return Response.json({ error: "图片映射参数无效" }, { status: 400 }); + } + if (!file.type.startsWith("image/") || file.size > 8_000_000) { + return Response.json( + { error: "仅支持8MB以内的图片" }, + { status: 400 }, + ); + } + const row = feishuSnapshot.rows.find( + (item) => item.sourceRow === sourceRow, + ); + const asset = row?.images.find((item) => item.index === imageIndex); + if (!asset) { + return Response.json({ error: "图片不属于当前飞书内容表" }, { status: 422 }); + } + await getUploadBucket().put(asset.key, await file.arrayBuffer(), { + httpMetadata: { contentType: file.type }, + customMetadata: { + sheetId, + sourceRow: String(sourceRow), + imageIndex: String(imageIndex), + }, + }); + return Response.json({ uploaded: true }); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "图片同步失败" }, + { status: 500 }, + ); + } +} diff --git a/app/api/creator-screenshot/route.ts b/app/api/creator-screenshot/route.ts new file mode 100644 index 0000000..f71ce0f --- /dev/null +++ b/app/api/creator-screenshot/route.ts @@ -0,0 +1,53 @@ +import { + ensureSchema, + getRawDb, + getUploadBucket, +} from "../../../lib/mvp-db"; +import { adminForbidden, isAdminRequest } from "../../../lib/admin-auth"; + +export const runtime = "edge"; + +export async function GET(request: Request) { + if (!isAdminRequest(request)) return adminForbidden(); + try { + await ensureSchema(); + const distributionId = new URL(request.url).searchParams + .get("distribution") + ?.trim(); + if (!distributionId) { + return Response.json({ error: "缺少分发记录" }, { status: 400 }); + } + const row = await getRawDb() + .prepare( + `SELECT screenshot_key FROM distributions + WHERE id = ?`, + ) + .bind(distributionId) + .first<{ screenshot_key: string | null }>(); + if ( + !row?.screenshot_key || + !row.screenshot_key.startsWith("creator-center/") + ) { + return Response.json({ error: "创作者截图不存在" }, { status: 404 }); + } + const object = await getUploadBucket().get(row.screenshot_key); + if (!object) { + return Response.json({ error: "创作者截图不存在" }, { status: 404 }); + } + const headers = new Headers({ + "Cache-Control": "private, no-store", + "Content-Disposition": 'inline; filename="creator-center-screenshot"', + "X-Content-Type-Options": "nosniff", + }); + object.writeHttpMetadata(headers); + if (!headers.get("Content-Type")) { + headers.set("Content-Type", "image/jpeg"); + } + return new Response(object.body, { headers }); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "截图读取失败" }, + { status: 500 }, + ); + } +} diff --git a/app/api/partner-image/route.ts b/app/api/partner-image/route.ts new file mode 100644 index 0000000..8948f9b --- /dev/null +++ b/app/api/partner-image/route.ts @@ -0,0 +1,129 @@ +import { env } from "cloudflare:workers"; +import { + ensureSchema, + getRawDb, + getUploadBucket, +} from "../../../lib/mvp-db"; +import { + downloadFeishuMedia, + type FeishuBindings, +} from "../../../lib/feishu-client"; +import { + partnerOptions, + withPartnerCors, +} from "../../../lib/partner-cors"; + +export const runtime = "edge"; + +type StoredAsset = { + index: number; + key: string; + fileToken?: string; +}; + +function textValue(value: string | null, maxLength = 100) { + return String(value ?? "").trim().slice(0, maxLength); +} + +function findAsset(value: string, imageIndex: number) { + try { + const assets = JSON.parse(value) as StoredAsset[]; + return Array.isArray(assets) + ? assets.find( + (asset) => + asset.index === imageIndex && + typeof asset.key === "string" && + asset.key.startsWith("content-assets/") && + (asset.fileToken === undefined || + typeof asset.fileToken === "string"), + ) + : undefined; + } catch { + return undefined; + } +} + +async function handleGet(request: Request) { + try { + await ensureSchema(); + const url = new URL(request.url); + const taskToken = textValue(url.searchParams.get("task")); + const claimToken = textValue(url.searchParams.get("claim")); + const delegationToken = textValue(url.searchParams.get("share")); + const distributionId = textValue(url.searchParams.get("distribution")); + const imageIndex = Number(url.searchParams.get("index")); + if ( + (!delegationToken && (!taskToken || !claimToken)) || + !distributionId || + !Number.isInteger(imageIndex) || + imageIndex < 1 + ) { + return Response.json({ error: "图片链接不完整" }, { status: 400 }); + } + const row = delegationToken + ? await getRawDb() + .prepare( + `SELECT c.image_assets + FROM distributions d + JOIN contents c ON c.id = d.content_id + JOIN delegation_bundles b ON b.id = d.delegation_bundle_id + WHERE d.id = ? + AND b.share_token = ? + AND b.status = 'active'`, + ) + .bind(distributionId, delegationToken) + .first<{ image_assets: string }>() + : await getRawDb() + .prepare( + `SELECT c.image_assets + FROM distributions d + JOIN contents c ON c.id = d.content_id + JOIN claims cl ON cl.id = d.claim_id + JOIN tasks t ON t.id = d.task_id + WHERE d.id = ? + AND cl.claim_token = ? + AND t.share_token = ? + AND cl.task_id = t.id`, + ) + .bind(distributionId, claimToken, taskToken) + .first<{ image_assets: string }>(); + const asset = row ? findAsset(row.image_assets, imageIndex) : undefined; + if (!asset) { + return Response.json({ error: "没有找到这张笔记图片" }, { status: 404 }); + } + const bucket = getUploadBucket(); + let object = await bucket.get(asset.key); + if (!object && asset.fileToken) { + const media = await downloadFeishuMedia( + asset.fileToken, + env as unknown as FeishuBindings, + ); + await bucket.put(asset.key, media.bytes, { + httpMetadata: { contentType: media.contentType }, + customMetadata: { source: "feishu-api" }, + }); + object = await bucket.get(asset.key); + } + if (!object) { + return Response.json({ error: "图片同步失败,请稍后重试" }, { status: 404 }); + } + const headers = new Headers(); + object.writeHttpMetadata(headers); + headers.set("Cache-Control", "private, max-age=3600"); + headers.set("Content-Disposition", `inline; filename="note-${imageIndex}"`); + return new Response(object.body, { headers }); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "图片读取失败" }, + { status: 500 }, + ); + } +} + +export async function GET(request: Request) { + return withPartnerCors(request, await handleGet(request)); +} + +export async function OPTIONS(request: Request) { + return partnerOptions(request); +} diff --git a/app/api/partner-upload/route.ts b/app/api/partner-upload/route.ts new file mode 100644 index 0000000..f303091 --- /dev/null +++ b/app/api/partner-upload/route.ts @@ -0,0 +1,164 @@ +import { + ensureSchema, + getRawDb, + getUploadBucket, + uid, +} from "../../../lib/mvp-db"; +import { + partnerOptions, + withPartnerCors, +} from "../../../lib/partner-cors"; + +export const runtime = "edge"; + +async function readUpload(request: Request) { + const contentType = request.headers.get("content-type") ?? ""; + if (contentType.startsWith("multipart/form-data")) { + const form = await request.formData(); + const file = form.get("file"); + if (!(file instanceof File)) return null; + return { + taskToken: String(form.get("taskToken") ?? "").trim(), + claimToken: String(form.get("claimToken") ?? "").trim(), + delegationToken: String(form.get("delegationToken") ?? "").trim(), + distributionId: String(form.get("distributionId") ?? "").trim(), + uploadKind: String(form.get("uploadKind") ?? "publish").trim(), + fileName: file.name, + fileType: file.type, + fileBytes: await file.arrayBuffer(), + }; + } + const encodedName = request.headers.get("x-koc-file-name") ?? "screenshot.jpg"; + let fileName = "screenshot.jpg"; + try { + fileName = decodeURIComponent(encodedName); + } catch { + fileName = "screenshot.jpg"; + } + return { + taskToken: String(request.headers.get("x-koc-task") ?? "").trim(), + claimToken: String(request.headers.get("x-koc-claim") ?? "").trim(), + delegationToken: String( + request.headers.get("x-koc-delegation") ?? "", + ).trim(), + distributionId: String( + request.headers.get("x-koc-distribution") ?? "", + ).trim(), + uploadKind: String( + request.headers.get("x-koc-upload-kind") ?? "publish", + ).trim(), + fileName, + fileType: contentType.split(";")[0].trim(), + fileBytes: await request.arrayBuffer(), + }; +} + +async function handlePost(request: Request) { + try { + await ensureSchema(); + const upload = await readUpload(request); + if ( + !upload || + (!upload.claimToken && !upload.delegationToken) || + (!upload.delegationToken && !upload.taskToken) || + !upload.distributionId || + upload.fileBytes.byteLength === 0 + ) { + return Response.json({ error: "请选择发布截图" }, { status: 400 }); + } + if ( + !upload.fileType.startsWith("image/") || + upload.fileBytes.byteLength > 8_000_000 + ) { + return Response.json( + { error: "仅支持8MB以内的图片" }, + { status: 400 }, + ); + } + const isCreatorCenter = upload.uploadKind === "creator-center"; + const assignment = upload.delegationToken + ? await getRawDb() + .prepare( + `SELECT d.id, d.publish_url + FROM distributions d + JOIN delegation_bundles b ON b.id = d.delegation_bundle_id + WHERE d.id = ? + AND b.share_token = ? + AND b.status = 'active'`, + ) + .bind(upload.distributionId, upload.delegationToken) + .first<{ id: string; publish_url: string | null }>() + : await getRawDb() + .prepare( + `SELECT d.id, d.publish_url + FROM distributions d + JOIN claims c ON c.id = d.claim_id + JOIN tasks t ON t.id = d.task_id + WHERE d.id = ? + AND c.claim_token = ? + AND t.share_token = ? + AND c.task_id = t.id`, + ) + .bind(upload.distributionId, upload.claimToken, upload.taskToken) + .first<{ id: string; publish_url: string | null }>(); + if (!assignment) { + return Response.json({ error: "笔记与领取凭证不匹配" }, { status: 403 }); + } + if (isCreatorCenter && !assignment.publish_url) { + return Response.json( + { error: "请先回填这篇笔记的发布信息" }, + { status: 409 }, + ); + } + const extension = + upload.fileName.split(".").at(-1)?.replace(/[^a-zA-Z0-9]/g, "") || "jpg"; + const key = isCreatorCenter + ? `creator-center/${upload.distributionId}/${uid("shot")}.${extension}` + : `publish-evidence/${upload.distributionId}/${uid("shot")}.${extension}`; + await getUploadBucket().put(key, upload.fileBytes, { + httpMetadata: { contentType: upload.fileType }, + }); + if (isCreatorCenter) { + await getRawDb() + .prepare( + `UPDATE distributions SET + screenshot_key = ?, + ocr_status = CASE + WHEN exposure IS NOT NULL AND views IS NOT NULL THEN ocr_status + ELSE 'uploaded' + END, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(key, upload.distributionId) + .run(); + } else { + await getRawDb() + .prepare( + `UPDATE distributions SET + publish_screenshot_key = ?, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(key, upload.distributionId) + .run(); + } + return Response.json({ + uploaded: true, + kind: isCreatorCenter ? "creator-center" : "publish", + }); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "上传失败" }, + { status: 500 }, + ); + } +} + +export async function POST(request: Request) { + return withPartnerCors(request, await handlePost(request)); +} + +export async function OPTIONS(request: Request) { + return partnerOptions(request); +} diff --git a/app/api/partner/route.ts b/app/api/partner/route.ts new file mode 100644 index 0000000..0cf3a1e --- /dev/null +++ b/app/api/partner/route.ts @@ -0,0 +1,951 @@ +import { env } from "cloudflare:workers"; +import { getRequestExecutionContext } from "vinext/shims/request-context"; +import { enrichDistributionAccount } from "../../../lib/account-enrichment-service"; +import { createCollectionRunTasks } from "../../../lib/collection-service"; +import { + resolveCollectionMcpConfig, + type CollectionMcpBindings, +} from "../../../lib/mcp-collection-client"; +import { + ensureSchema, + getRawDb, + hashText, + uid, +} from "../../../lib/mvp-db"; +import { + accountFromPublishLink, + extractXhsPublishUrl, +} from "../../../lib/partner-utils"; +import { + partnerOptions, + withPartnerCors, +} from "../../../lib/partner-cors"; + +export const runtime = "edge"; + +type PartnerBody = { + action?: string; + taskToken?: string; + claimToken?: string; + delegationToken?: string; + distributionId?: string; + distributionIds?: string[]; + delegationLabel?: string; + delegationBundleId?: string; + claimantName?: string; + quantity?: number; + accountNickname?: string; + publishUrl?: string; + exposure?: number | string; + views?: number | string; +}; + +type ImageAsset = { + index: number; + width: number | null; + height: number | null; +}; + +function textValue(value: unknown, maxLength = 200) { + return String(value ?? "").trim().slice(0, maxLength); +} + +function quantityValue(value: unknown) { + const parsed = Number(value); + return Number.isFinite(parsed) ? Math.max(1, Math.min(50, Math.floor(parsed))) : 1; +} + +function creatorMetricValue(value: unknown) { + const normalized = String(value ?? "").trim(); + if (!/^\d{1,12}$/.test(normalized)) return null; + const parsed = Number(normalized); + return Number.isSafeInteger(parsed) && parsed >= 0 ? parsed : null; +} + +function idList(value: unknown) { + if (!Array.isArray(value)) return []; + return [ + ...new Set( + value + .map((item) => textValue(item, 80)) + .filter(Boolean) + .slice(0, 50), + ), + ]; +} + +function publicImageAssets(value: unknown): ImageAsset[] { + try { + const assets = JSON.parse(String(value ?? "[]")) as Array< + Partial & { key?: string } + >; + if (!Array.isArray(assets)) return []; + return assets + .map((asset) => ({ + index: Number(asset.index), + width: + typeof asset.width === "number" && Number.isFinite(asset.width) + ? asset.width + : null, + height: + typeof asset.height === "number" && Number.isFinite(asset.height) + ? asset.height + : null, + })) + .filter((asset) => Number.isInteger(asset.index) && asset.index > 0); + } catch { + return []; + } +} + +async function findTask(taskToken: string) { + return getRawDb() + .prepare( + `SELECT id, name, brand, quantity, claimed_quantity, due_at, status + FROM tasks WHERE share_token = ?`, + ) + .bind(taskToken) + .first<{ + id: string; + name: string; + brand: string; + quantity: number; + claimed_quantity: number; + due_at: string; + status: string; + }>(); +} + +async function findDelegationAccess(delegationToken: string) { + return getRawDb() + .prepare( + `SELECT + t.id, + t.name, + t.brand, + t.quantity, + t.claimed_quantity, + t.due_at, + t.status, + b.id AS bundle_id, + b.label AS bundle_label, + b.quantity AS bundle_quantity, + b.created_at AS bundle_created_at + FROM delegation_bundles b + JOIN tasks t ON t.id = b.task_id + WHERE b.share_token = ? AND b.status = 'active'`, + ) + .bind(delegationToken) + .first<{ + id: string; + name: string; + brand: string; + quantity: number; + claimed_quantity: number; + due_at: string; + status: string; + bundle_id: string; + bundle_label: string; + bundle_quantity: number; + bundle_created_at: string; + }>(); +} + +async function findAccessibleAssignment( + taskId: string, + distributionId: string, + claimToken: string, + delegationToken: string, +) { + const db = getRawDb(); + const select = `SELECT + d.id, + d.partner_id, + d.account_id, + d.publish_url, + d.publish_screenshot_key, + d.screenshot_key`; + if (delegationToken) { + return db + .prepare( + `${select} + FROM distributions d + JOIN delegation_bundles b ON b.id = d.delegation_bundle_id + WHERE d.id = ? + AND b.share_token = ? + AND b.task_id = ? + AND b.status = 'active'`, + ) + .bind(distributionId, delegationToken, taskId) + .first<{ + id: string; + partner_id: string; + account_id: string | null; + publish_url: string | null; + publish_screenshot_key: string | null; + screenshot_key: string | null; + }>(); + } + if (!claimToken) return null; + return db + .prepare( + `${select} + FROM distributions d + JOIN claims c ON c.id = d.claim_id + WHERE d.id = ? AND c.claim_token = ? AND c.task_id = ?`, + ) + .bind(distributionId, claimToken, taskId) + .first<{ + id: string; + partner_id: string; + account_id: string | null; + publish_url: string | null; + publish_screenshot_key: string | null; + screenshot_key: string | null; + }>(); +} + +async function handleGet(request: Request) { + try { + await ensureSchema(); + const url = new URL(request.url); + const taskToken = textValue(url.searchParams.get("task"), 80); + const claimToken = textValue(url.searchParams.get("claim"), 80); + const delegationToken = textValue(url.searchParams.get("share"), 80); + const delegationAccess = delegationToken + ? await findDelegationAccess(delegationToken) + : null; + const task = delegationAccess ?? (await findTask(taskToken)); + if (!task) { + return Response.json( + { + error: delegationToken + ? "分享链接无效、已撤销或已失效" + : "任务链接无效或已失效", + }, + { status: 404 }, + ); + } + + const available = await getRawDb() + .prepare( + `SELECT COUNT(*) AS count FROM contents + WHERE task_id = ? AND status = 'available'`, + ) + .bind(task.id) + .first<{ count: number }>(); + + let claim: Record | null = null; + let delegation: Record | null = null; + if (claimToken && !delegationToken) { + const claimRow = await getRawDb() + .prepare( + `SELECT id, claimant_name, quantity, created_at + FROM claims + WHERE claim_token = ? AND task_id = ?`, + ) + .bind(claimToken, task.id) + .first<{ + id: string; + claimant_name: string; + quantity: number; + created_at: string; + }>(); + if (!claimRow) { + return Response.json({ error: "领取凭证无效" }, { status: 403 }); + } + const assignments = await getRawDb() + .prepare( + `SELECT + d.id, + d.status, + d.publish_url, + d.publish_time, + d.publish_screenshot_key, + d.screenshot_key AS creator_screenshot_key, + d.ocr_status, + d.exposure, + d.views, + c.title, + c.body, + c.source_row, + c.image_assets, + a.nickname AS account_nickname, + b.id AS delegation_bundle_id, + b.label AS delegation_label + FROM distributions d + JOIN contents c ON c.id = d.content_id + LEFT JOIN accounts a ON a.id = d.account_id + LEFT JOIN delegation_bundles b + ON b.id = d.delegation_bundle_id AND b.status = 'active' + WHERE d.claim_id = ? + ORDER BY d.claimed_at, d.id`, + ) + .bind(claimRow.id) + .all(); + const delegations = await getRawDb() + .prepare( + `SELECT + b.id, + b.label, + b.share_token, + b.quantity, + b.status, + b.created_at, + b.revoked_at, + SUM(CASE WHEN d.publish_url IS NOT NULL AND d.publish_url != '' THEN 1 ELSE 0 END) AS completed_count, + SUM(CASE WHEN d.screenshot_key IS NOT NULL AND d.exposure IS NOT NULL AND d.views IS NOT NULL THEN 1 ELSE 0 END) AS creator_completed_count + FROM delegation_bundles b + LEFT JOIN distributions d ON d.delegation_bundle_id = b.id + WHERE b.claim_id = ? + GROUP BY b.id, b.label, b.share_token, b.quantity, b.status, b.created_at, b.revoked_at + ORDER BY b.created_at DESC, b.id DESC`, + ) + .bind(claimRow.id) + .all(); + claim = { + id: claimRow.id, + claimantName: claimRow.claimant_name, + quantity: claimRow.quantity, + createdAt: claimRow.created_at, + assignments: assignments.results.map((assignment) => ({ + ...assignment, + images: publicImageAssets(assignment.image_assets), + image_assets: undefined, + })), + delegations: delegations.results, + }; + } else if (delegationAccess) { + const assignments = await getRawDb() + .prepare( + `SELECT + d.id, + d.status, + d.publish_url, + d.publish_time, + d.publish_screenshot_key, + d.screenshot_key AS creator_screenshot_key, + d.ocr_status, + d.exposure, + d.views, + c.title, + c.body, + c.source_row, + c.image_assets, + a.nickname AS account_nickname + FROM distributions d + JOIN contents c ON c.id = d.content_id + LEFT JOIN accounts a ON a.id = d.account_id + WHERE d.delegation_bundle_id = ? + ORDER BY d.claimed_at, d.id`, + ) + .bind(delegationAccess.bundle_id) + .all(); + delegation = { + id: delegationAccess.bundle_id, + label: "转派发布包", + quantity: delegationAccess.bundle_quantity, + createdAt: delegationAccess.bundle_created_at, + assignments: assignments.results.map((assignment) => ({ + ...assignment, + images: publicImageAssets(assignment.image_assets), + image_assets: undefined, + })), + }; + } + + return Response.json({ + task: delegationAccess + ? { + name: task.name, + brand: task.brand, + dueAt: task.due_at, + status: task.status, + } + : { + name: task.name, + brand: task.brand, + quantity: task.quantity, + claimedQuantity: task.claimed_quantity, + dueAt: task.due_at, + status: task.status, + availableQuantity: available?.count ?? 0, + }, + claim, + delegation, + }); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "暂时无法打开任务" }, + { status: 500 }, + ); + } +} + +async function handlePost(request: Request) { + try { + await ensureSchema(); + const body = (await request.json()) as PartnerBody; + const taskToken = textValue(body.taskToken, 80); + const delegationToken = textValue(body.delegationToken, 80); + const delegationAccess = delegationToken + ? await findDelegationAccess(delegationToken) + : null; + const task = delegationAccess ?? (await findTask(taskToken)); + if (!task) { + return Response.json( + { error: delegationToken ? "分享链接无效或已撤销" : "任务链接无效" }, + { status: 404 }, + ); + } + if ( + delegationToken && + body.action !== "submit" && + body.action !== "submit_creator_metrics" + ) { + return Response.json( + { error: "分享链接只能用于查看和回填包内笔记" }, + { status: 403 }, + ); + } + const db = getRawDb(); + + if (body.action === "recover") { + const claimantName = textValue(body.claimantName, 40); + if (claimantName.length < 2) { + return Response.json( + { error: "请填写领取时使用的企微昵称或联系人" }, + { status: 400 }, + ); + } + const partnerId = `partner-ext-${hashText( + `${task.id}:${claimantName.toLowerCase()}`, + )}`; + const recovered = await db + .prepare( + `SELECT + c.claim_token, + c.quantity, + c.created_at, + COUNT(d.id) AS note_count, + SUM(CASE WHEN d.publish_url IS NOT NULL AND d.publish_url != '' THEN 1 ELSE 0 END) AS completed_count, + MIN(co.title) AS first_title + FROM claims c + LEFT JOIN distributions d ON d.claim_id = c.id + LEFT JOIN contents co ON co.id = d.content_id + WHERE c.task_id = ? AND c.partner_id = ? + GROUP BY c.id, c.claim_token, c.quantity, c.created_at + ORDER BY c.created_at DESC, c.id DESC + LIMIT 20`, + ) + .bind(task.id, partnerId) + .all<{ + claim_token: string; + quantity: number; + created_at: string; + note_count: number; + completed_count: number; + first_title: string | null; + }>(); + if (recovered.results.length === 0) { + return Response.json( + { error: "没有找到领取记录,请确认昵称与领取时完全一致" }, + { status: 404 }, + ); + } + return Response.json({ + claims: recovered.results.map((claim) => ({ + claimToken: claim.claim_token, + quantity: claim.note_count || claim.quantity, + completedCount: claim.completed_count || 0, + createdAt: claim.created_at, + firstTitle: claim.first_title || "领取的笔记", + })), + }); + } + + if (body.action === "claim") { + if (task.status !== "active") { + return Response.json({ error: "任务已结束,无法继续领取" }, { status: 409 }); + } + const claimantName = textValue(body.claimantName, 40); + const quantity = quantityValue(body.quantity); + if (claimantName.length < 2) { + return Response.json({ error: "请填写企微昵称或联系人" }, { status: 400 }); + } + const available = await db + .prepare( + `SELECT id FROM contents + WHERE task_id = ? AND status = 'available' + ORDER BY COALESCE(source_row, 999999), created_at, id + LIMIT ?`, + ) + .bind(task.id, quantity) + .all<{ id: string }>(); + if (available.results.length === 0) { + return Response.json({ error: "当前任务已领完" }, { status: 409 }); + } + const partnerId = `partner-ext-${hashText( + `${task.id}:${claimantName.toLowerCase()}`, + )}`; + const claimId = uid("claim"); + const claimToken = crypto.randomUUID().replaceAll("-", ""); + const statements: D1PreparedStatement[] = [ + db + .prepare( + `INSERT INTO partners + (id, name, wecom_name, owner, claimed_total, completed_total) + VALUES (?, ?, ?, '外部KOC', 0, 0) + ON CONFLICT(id) DO UPDATE SET + name = excluded.name, + wecom_name = excluded.wecom_name`, + ) + .bind(partnerId, claimantName, claimantName), + db + .prepare( + `INSERT INTO claims + (id, task_id, partner_id, claimant_name, claim_token, quantity) + VALUES (?, ?, ?, ?, ?, ?)`, + ) + .bind( + claimId, + task.id, + partnerId, + claimantName, + claimToken, + available.results.length, + ), + ]; + for (const content of available.results) { + statements.push( + db + .prepare( + `INSERT INTO distributions + (id, task_id, content_id, partner_id, claim_id, status) + VALUES (?, ?, ?, ?, ?, 'claimed')`, + ) + .bind(uid("dist"), task.id, content.id, partnerId, claimId), + db + .prepare( + `UPDATE contents SET status = 'allocated' + WHERE id = ? AND status = 'available'`, + ) + .bind(content.id), + ); + } + statements.push( + db + .prepare( + `UPDATE tasks SET claimed_quantity = claimed_quantity + ? + WHERE id = ?`, + ) + .bind(available.results.length, task.id), + db + .prepare( + `UPDATE partners SET claimed_total = claimed_total + ? + WHERE id = ?`, + ) + .bind(available.results.length, partnerId), + ); + await db.batch(statements); + return Response.json({ + claimToken, + claimedCount: available.results.length, + }); + } + + if (body.action === "create_delegation") { + const claimToken = textValue(body.claimToken, 80); + const label = textValue(body.delegationLabel, 24); + const distributionIds = idList(body.distributionIds); + if (!label) { + return Response.json( + { error: "请填写接收人备注,例如 A 或小王" }, + { status: 400 }, + ); + } + if (distributionIds.length === 0) { + return Response.json( + { error: "请至少选择一篇待发布笔记" }, + { status: 400 }, + ); + } + const claimRow = await db + .prepare( + `SELECT id, partner_id + FROM claims + WHERE claim_token = ? AND task_id = ?`, + ) + .bind(claimToken, task.id) + .first<{ id: string; partner_id: string }>(); + if (!claimRow) { + return Response.json({ error: "领取凭证无效" }, { status: 403 }); + } + const placeholders = distributionIds.map(() => "?").join(", "); + const selected = await db + .prepare( + `SELECT id, publish_url, delegation_bundle_id + FROM distributions + WHERE claim_id = ? AND id IN (${placeholders})`, + ) + .bind(claimRow.id, ...distributionIds) + .all<{ + id: string; + publish_url: string | null; + delegation_bundle_id: string | null; + }>(); + if (selected.results.length !== distributionIds.length) { + return Response.json( + { error: "部分笔记不属于当前领取批次,请刷新后重试" }, + { status: 403 }, + ); + } + if (selected.results.some((item) => item.publish_url)) { + return Response.json( + { error: "已发布的笔记不能再次转派" }, + { status: 409 }, + ); + } + if (selected.results.some((item) => item.delegation_bundle_id)) { + return Response.json( + { error: "部分笔记已经转派,请刷新后重新选择" }, + { status: 409 }, + ); + } + const bundleId = uid("delegate"); + const shareToken = crypto.randomUUID().replaceAll("-", ""); + const statements: D1PreparedStatement[] = [ + db + .prepare( + `INSERT INTO delegation_bundles + (id, task_id, claim_id, partner_id, label, share_token, quantity) + VALUES (?, ?, ?, ?, ?, ?, ?)`, + ) + .bind( + bundleId, + task.id, + claimRow.id, + claimRow.partner_id, + label, + shareToken, + distributionIds.length, + ), + ]; + for (const distributionId of distributionIds) { + statements.push( + db + .prepare( + `UPDATE distributions + SET delegation_bundle_id = ?, updated_at = CURRENT_TIMESTAMP + WHERE id = ? + AND claim_id = ? + AND publish_url IS NULL + AND delegation_bundle_id IS NULL`, + ) + .bind(bundleId, distributionId, claimRow.id), + ); + } + await db.batch(statements); + const bound = await db + .prepare( + `SELECT COUNT(*) AS count + FROM distributions + WHERE delegation_bundle_id = ?`, + ) + .bind(bundleId) + .first<{ count: number }>(); + if ((bound?.count ?? 0) !== distributionIds.length) { + await db.batch([ + db + .prepare( + `UPDATE distributions + SET delegation_bundle_id = NULL, updated_at = CURRENT_TIMESTAMP + WHERE delegation_bundle_id = ?`, + ) + .bind(bundleId), + db + .prepare("DELETE FROM delegation_bundles WHERE id = ?") + .bind(bundleId), + ]); + return Response.json( + { error: "部分笔记刚刚已被转派,请刷新后重新选择" }, + { status: 409 }, + ); + } + return Response.json({ + delegation: { + id: bundleId, + label, + shareToken, + quantity: distributionIds.length, + }, + }); + } + + if (body.action === "revoke_delegation") { + const claimToken = textValue(body.claimToken, 80); + const bundleId = textValue(body.delegationBundleId, 80); + const bundle = await db + .prepare( + `SELECT b.id + FROM delegation_bundles b + JOIN claims c ON c.id = b.claim_id + WHERE b.id = ? + AND b.task_id = ? + AND b.status = 'active' + AND c.claim_token = ?`, + ) + .bind(bundleId, task.id, claimToken) + .first<{ id: string }>(); + if (!bundle) { + return Response.json( + { error: "没有找到可撤销的转派记录" }, + { status: 404 }, + ); + } + const published = await db + .prepare( + `SELECT COUNT(*) AS count + FROM distributions + WHERE delegation_bundle_id = ? + AND publish_url IS NOT NULL + AND publish_url != ''`, + ) + .bind(bundle.id) + .first<{ count: number }>(); + if ((published?.count ?? 0) > 0) { + return Response.json( + { error: "该分享包已有笔记发布,需保留链接继续完成第7天数据回收" }, + { status: 409 }, + ); + } + await db.batch([ + db + .prepare( + `UPDATE distributions + SET delegation_bundle_id = NULL, updated_at = CURRENT_TIMESTAMP + WHERE delegation_bundle_id = ?`, + ) + .bind(bundle.id), + db + .prepare( + `UPDATE delegation_bundles + SET status = 'revoked', + revoked_at = CURRENT_TIMESTAMP, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(bundle.id), + ]); + return Response.json({ revoked: true }); + } + + if (body.action === "submit") { + const claimToken = textValue(body.claimToken, 80); + const distributionId = textValue(body.distributionId, 80); + const accountNickname = textValue(body.accountNickname, 80); + const publishInput = textValue(body.publishUrl, 5000); + if (!accountNickname || !publishInput) { + return Response.json( + { error: "请填写发布账号昵称和发布链接" }, + { status: 400 }, + ); + } + const publishUrl = extractXhsPublishUrl(publishInput); + if (!publishUrl) { + return Response.json( + { error: "请粘贴包含小红书长链或短链的分享内容" }, + { status: 400 }, + ); + } + const account = accountFromPublishLink(publishUrl, accountNickname); + if (!account) { + return Response.json({ error: "发布链接格式不正确" }, { status: 400 }); + } + const assignment = await findAccessibleAssignment( + task.id, + distributionId, + claimToken, + delegationToken, + ); + if (!assignment) { + return Response.json({ error: "笔记与领取凭证不匹配" }, { status: 403 }); + } + if (!assignment.publish_screenshot_key) { + return Response.json({ error: "请先上传发布截图" }, { status: 400 }); + } + const reuseExistingAccount = + assignment.publish_url === publishUrl && assignment.account_id; + const accountId = + reuseExistingAccount || + `account-${hashText(`${account.platform}:${account.platformUid}`)}`; + const statements: D1PreparedStatement[] = []; + if (!reuseExistingAccount) { + statements.push( + db + .prepare( + `INSERT INTO accounts + (id, platform, platform_uid, nickname, profile_url, post_count) + VALUES (?, ?, ?, ?, ?, 1) + ON CONFLICT(platform, platform_uid) DO UPDATE SET + nickname = excluded.nickname, + profile_url = excluded.profile_url, + post_count = accounts.post_count + ?, + last_seen_at = CURRENT_TIMESTAMP`, + ) + .bind( + accountId, + account.platform, + account.platformUid, + account.nickname, + account.profileUrl, + assignment.publish_url ? 0 : 1, + ), + ); + } + statements.push( + db + .prepare( + `UPDATE distributions SET + account_id = ?, + publish_url = ?, + publish_time = CURRENT_TIMESTAMP, + status = 'published', + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(accountId, publishUrl, assignment.id), + ); + if (!assignment.publish_url) { + statements.push( + db + .prepare( + `UPDATE partners SET completed_total = completed_total + 1 + WHERE id = ?`, + ) + .bind(assignment.partner_id), + ); + } + await db.batch(statements); + const collectionSchedule = await db + .prepare( + `SELECT collection_start_date, collection_days + FROM tasks WHERE id = ?`, + ) + .bind(task.id) + .first<{ + collection_start_date: string | null; + collection_days: string; + }>(); + if ( + collectionSchedule?.collection_start_date && + collectionSchedule.collection_days !== "[]" + ) { + let collectionDays: number[] = []; + try { + const parsed = JSON.parse(collectionSchedule.collection_days); + if (Array.isArray(parsed)) collectionDays = parsed.map(Number); + } catch { + collectionDays = []; + } + if (collectionDays.length > 0) { + await createCollectionRunTasks( + db, + task.id, + collectionSchedule.collection_start_date, + collectionDays, + ); + } + } + if (account.platform === "小红书") { + const enrichment = enrichDistributionAccount( + db, + assignment.id, + publishUrl, + accountNickname, + resolveCollectionMcpConfig( + env as unknown as CollectionMcpBindings, + ), + ).catch(() => undefined); + const executionContext = getRequestExecutionContext(); + if (executionContext) { + executionContext.waitUntil(enrichment); + } else { + await enrichment; + } + } + return Response.json({ ok: true }); + } + + if (body.action === "submit_creator_metrics") { + const claimToken = textValue(body.claimToken, 80); + const distributionId = textValue(body.distributionId, 80); + const exposure = creatorMetricValue(body.exposure); + const views = creatorMetricValue(body.views); + if (exposure === null || views === null) { + return Response.json( + { error: "请填写正确的曝光量和阅读量" }, + { status: 400 }, + ); + } + const assignment = await findAccessibleAssignment( + task.id, + distributionId, + claimToken, + delegationToken, + ); + if (!assignment) { + return Response.json({ error: "笔记与领取凭证不匹配" }, { status: 403 }); + } + if (!assignment.publish_url) { + return Response.json( + { error: "请先回填这篇笔记的发布信息" }, + { status: 409 }, + ); + } + if (!assignment.screenshot_key) { + return Response.json( + { error: "请先上传创作者中心截图" }, + { status: 400 }, + ); + } + await db + .prepare( + `UPDATE distributions SET + exposure = ?, + views = ?, + ocr_status = 'manual', + status = CASE WHEN d7_likes IS NOT NULL THEN 'complete' ELSE status END, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(exposure, views, assignment.id) + .run(); + return Response.json({ submitted: true }); + } + + return Response.json({ error: "不支持的操作" }, { status: 400 }); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "操作失败" }, + { status: 500 }, + ); + } +} + +export async function GET(request: Request) { + const response = await handleGet(request); + response.headers.set("Cache-Control", "private, no-store"); + response.headers.set("Referrer-Policy", "no-referrer"); + return withPartnerCors(request, response); +} + +export async function POST(request: Request) { + const response = await handlePost(request); + response.headers.set("Cache-Control", "private, no-store"); + return withPartnerCors(request, response); +} + +export async function OPTIONS(request: Request) { + return partnerOptions(request); +} diff --git a/app/api/upload/route.ts b/app/api/upload/route.ts new file mode 100644 index 0000000..e696652 --- /dev/null +++ b/app/api/upload/route.ts @@ -0,0 +1,51 @@ +import { + ensureSchema, + getDashboardData, + getRawDb, + getUploadBucket, + uid, +} from "../../../lib/mvp-db"; +import { adminForbidden, isAdminRequest } from "../../../lib/admin-auth"; + +export const runtime = "edge"; + +export async function POST(request: Request) { + if (!isAdminRequest(request)) return adminForbidden(); + try { + await ensureSchema(); + const form = await request.formData(); + const distributionId = String(form.get("distributionId") ?? ""); + const file = form.get("file"); + if (!distributionId || !(file instanceof File) || file.size === 0) { + return Response.json({ error: "请选择需要上传的截图" }, { status: 400 }); + } + if (!file.type.startsWith("image/")) { + return Response.json({ error: "只支持图片文件" }, { status: 400 }); + } + const extension = file.name.split(".").at(-1)?.replace(/[^a-zA-Z0-9]/g, "") || + "jpg"; + const key = `creator-center/${distributionId}/${uid("shot")}.${extension}`; + await getUploadBucket().put(key, await file.arrayBuffer(), { + httpMetadata: { contentType: file.type }, + }); + const db = getRawDb(); + await db + .prepare( + `UPDATE distributions SET + screenshot_key = ?, + exposure = NULL, + views = NULL, + ocr_status = 'failed', + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(key, distributionId) + .run(); + return Response.json(await getDashboardData()); + } catch (error) { + return Response.json( + { error: error instanceof Error ? error.message : "上传失败" }, + { status: 500 }, + ); + } +} diff --git a/app/chatgpt-auth.ts b/app/chatgpt-auth.ts new file mode 100644 index 0000000..8d1fb35 --- /dev/null +++ b/app/chatgpt-auth.ts @@ -0,0 +1,86 @@ +import { headers } from "next/headers"; +import { redirect } from "next/navigation"; + +export type ChatGPTUser = { + displayName: string; + email: string; + fullName: string | null; +}; + +const USER_EMAIL_HEADER = "oai-authenticated-user-email"; +const USER_FULL_NAME_HEADER = "oai-authenticated-user-full-name"; +const USER_FULL_NAME_ENCODING_HEADER = + "oai-authenticated-user-full-name-encoding"; +const PERCENT_ENCODED_UTF8 = "percent-encoded-utf-8"; +const SIGN_IN_PATH = "/signin-with-chatgpt"; +const SIGN_OUT_PATH = "/signout-with-chatgpt"; +const CALLBACK_PATH = "/callback"; + +export async function getChatGPTUser(): Promise { + const requestHeaders = await headers(); + const email = requestHeaders.get(USER_EMAIL_HEADER); + if (!email) return null; + + const encodedFullName = requestHeaders.get(USER_FULL_NAME_HEADER); + const fullName = + encodedFullName && + requestHeaders.get(USER_FULL_NAME_ENCODING_HEADER) === PERCENT_ENCODED_UTF8 + ? safeDecodeURIComponent(encodedFullName) + : null; + + return { + displayName: fullName ?? email, + email, + fullName, + }; +} + +export async function requireChatGPTUser( + returnTo: string, +): Promise { + const user = await getChatGPTUser(); + if (user) return user; + + redirect(chatGPTSignInPath(returnTo)); +} + +export function chatGPTSignInPath(returnTo: string): string { + const safeReturnTo = safeRelativeReturnPath(returnTo); + return `${SIGN_IN_PATH}?return_to=${encodeURIComponent(safeReturnTo)}`; +} + +export function chatGPTSignOutPath(returnTo = "/"): string { + const safeReturnTo = safeRelativeReturnPath(returnTo); + return `${SIGN_OUT_PATH}?return_to=${encodeURIComponent(safeReturnTo)}`; +} + +function safeRelativeReturnPath(value: string): string { + if (!value.startsWith("/") || value.startsWith("//")) return "/"; + + let url: URL; + try { + url = new URL(value, "https://app.local"); + } catch { + return "/"; + } + if (url.origin !== "https://app.local") return "/"; + if (isReservedAuthPath(url.pathname)) return "/"; + + return `${url.pathname}${url.search}${url.hash}`; +} + +function isReservedAuthPath(pathname: string): boolean { + return ( + pathname === SIGN_IN_PATH || + pathname === SIGN_OUT_PATH || + pathname === CALLBACK_PATH + ); +} + +function safeDecodeURIComponent(value: string): string | null { + try { + return decodeURIComponent(value); + } catch { + return null; + } +} diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..a577794 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,3008 @@ +@import "tailwindcss"; + +:root { + --ink: #172321; + --ink-soft: #32423f; + --nav: #13201e; + --nav-muted: #84938f; + --green: #1f8f69; + --green-deep: #187455; + --green-soft: #e9f4ef; + --canvas: #f4f5f2; + --panel: #ffffff; + --line: #e4e8e4; + --muted: #77827f; + --orange: #ec7d51; + --orange-soft: #fff0e8; + --blue: #477f91; + --blue-soft: #e8f2f5; + --shadow: 0 1px 2px rgb(18 31 28 / 0.03), 0 12px 34px rgb(18 31 28 / 0.045); +} + +* { + box-sizing: border-box; +} + +html, +body { + min-height: 100%; +} + +.admin-access-denied { + display: grid; + min-height: 100vh; + place-items: center; + padding: 24px; + background: var(--cream); +} + +.admin-access-denied section { + width: min(440px, 100%); + padding: 42px; + border: 1px solid var(--line); + border-radius: 22px; + background: white; + box-shadow: 0 22px 70px rgb(18 31 28 / 0.1); + text-align: center; +} + +.admin-access-denied p { + color: var(--green); + font-size: 11px; + font-weight: 800; + letter-spacing: 0.16em; +} + +.admin-access-denied h1 { + margin: 14px 0 8px; + color: var(--green-deep); + font-size: 24px; +} + +.admin-access-denied span { + display: block; + color: #7f8a86; + font-size: 13px; +} + +.admin-access-denied a { + display: inline-flex; + height: 40px; + align-items: center; + margin-top: 24px; + padding: 0 18px; + border-radius: 10px; + color: white; + background: var(--green); + font-size: 12px; + font-weight: 700; + text-decoration: none; +} + +body { + margin: 0; + background: var(--canvas); + color: var(--ink); + font-family: var(--font-geist-sans), "PingFang SC", "Microsoft YaHei", Arial, sans-serif; + -webkit-font-smoothing: antialiased; +} + +button, +input, +textarea, +select { + color: inherit; + font: inherit; +} + +button { + cursor: pointer; +} + +button:disabled { + cursor: not-allowed; + opacity: 0.55; +} + +a { + color: inherit; + text-decoration: none; +} + +.app-shell { + min-height: 100vh; +} + +.sidebar { + position: fixed; + inset: 0 auto 0 0; + z-index: 50; + display: flex; + width: 232px; + flex-direction: column; + padding: 26px 16px 18px; + color: white; + background: + radial-gradient(circle at 20% 2%, rgb(64 129 106 / 0.17), transparent 24%), + var(--nav); +} + +.brand-lockup { + display: flex; + align-items: center; + gap: 12px; + min-height: 46px; + padding: 0 10px; +} + +.brand-symbol { + display: grid; + width: 38px; + height: 38px; + place-items: center; + border: 1px solid rgb(255 255 255 / 0.14); + border-radius: 12px; + background: linear-gradient(145deg, #2a9a74, #136149); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.22); + font-size: 16px; + font-weight: 750; +} + +.brand-lockup > div:last-child { + display: flex; + flex-direction: column; +} + +.brand-lockup strong { + font-size: 14px; + letter-spacing: 0.12em; +} + +.brand-lockup > div:last-child span { + margin-top: 3px; + color: #8fa29e; + font-size: 11px; +} + +.main-nav { + margin-top: 32px; +} + +.nav-caption { + margin: 0 12px 10px; + color: #667a75; + font-size: 10px; + font-weight: 650; + letter-spacing: 0.12em; +} + +.nav-caption.second { + margin-top: 26px; +} + +.main-nav button { + position: relative; + display: flex; + width: 100%; + height: 44px; + align-items: center; + gap: 12px; + margin: 2px 0; + padding: 0 12px; + border: 0; + border-radius: 10px; + color: var(--nav-muted); + background: transparent; + font-size: 13px; + text-align: left; + transition: 150ms ease; +} + +.main-nav button:hover { + color: white; + background: rgb(255 255 255 / 0.045); +} + +.main-nav button.active { + color: white; + background: linear-gradient(90deg, rgb(44 139 105 / 0.28), rgb(44 139 105 / 0.12)); +} + +.main-nav button.active::before { + position: absolute; + left: 0; + width: 2px; + height: 20px; + border-radius: 2px; + background: #4bc091; + content: ""; +} + +.nav-mark { + display: grid; + width: 20px; + height: 20px; + place-items: center; + color: #95a8a3; + font-size: 15px; +} + +.main-nav button.active .nav-mark { + color: #5ec49d; +} + +.nav-badge { + display: grid; + min-width: 21px; + height: 21px; + margin-left: auto; + place-items: center; + border-radius: 10px; + color: #fff; + background: #df744c; + font-size: 10px; + font-weight: 700; +} + +.sidebar-summary { + display: flex; + align-items: center; + gap: 10px; + margin-top: auto; + padding: 14px 12px; + border: 1px solid rgb(255 255 255 / 0.065); + border-radius: 12px; + background: rgb(255 255 255 / 0.035); +} + +.sidebar-summary > div:last-child, +.sidebar-user > div:nth-child(2) { + display: flex; + min-width: 0; + flex: 1; + flex-direction: column; +} + +.sidebar-summary strong, +.sidebar-user strong { + font-size: 11px; + font-weight: 600; +} + +.sidebar-summary span, +.sidebar-user span { + margin-top: 3px; + color: #71837f; + font-size: 10px; +} + +.pulse-dot { + width: 8px; + height: 8px; + flex: 0 0 auto; + border: 2px solid #173d31; + border-radius: 50%; + background: #48bd8f; + box-shadow: 0 0 0 3px rgb(72 189 143 / 0.12); +} + +.sidebar-user { + display: flex; + align-items: center; + gap: 10px; + margin-top: 12px; + padding: 10px 8px 0; + border-top: 1px solid rgb(255 255 255 / 0.06); +} + +.chevron { + color: #62736f !important; + font-size: 16px !important; +} + +.avatar { + display: grid; + width: 34px; + height: 34px; + flex: 0 0 auto; + place-items: center; + border-radius: 10px; + color: #24423a; + background: #d7ebe3; + font-size: 12px; + font-weight: 720; +} + +.avatar.small { + width: 30px; + height: 30px; + border-radius: 9px; + font-size: 11px; +} + +.avatar.large { + width: 44px; + height: 44px; + border-radius: 12px; +} + +.avatar.xlarge { + width: 48px; + height: 48px; + border-radius: 15px; + font-size: 15px; +} + +.avatar.coral { color: #6c382a; background: #f5d9cb; } +.avatar.cyan { color: #24505a; background: #d6e9ec; } +.avatar.violet { color: #51436a; background: #e4dcf0; } +.avatar.amber { color: #674a1f; background: #f0e1c3; } +.avatar.mint { color: #235646; background: #cfe8dd; } + +.main-area { + min-height: 100vh; + margin-left: 232px; +} + +.topbar { + position: sticky; + top: 0; + z-index: 30; + display: flex; + height: 70px; + align-items: center; + justify-content: space-between; + padding: 0 32px; + border-bottom: 1px solid #e5e8e5; + background: rgb(249 250 247 / 0.88); + backdrop-filter: blur(18px); +} + +.breadcrumb { + display: flex; + align-items: center; + gap: 10px; + color: #9aa39f; + font-size: 12px; +} + +.breadcrumb i { + color: #c0c7c3; + font-style: normal; +} + +.breadcrumb strong { + color: var(--ink-soft); + font-weight: 580; +} + +.top-actions { + display: flex; + align-items: center; + gap: 10px; +} + +.sync-state { + display: flex; + align-items: center; + gap: 7px; + margin-right: 6px; + color: #76817e; + font-size: 11px; +} + +.sync-state i { + width: 7px; + height: 7px; + border-radius: 50%; + background: #32a875; +} + +.primary-button, +.ghost-button, +.full-ghost-button { + display: inline-flex; + min-height: 38px; + align-items: center; + justify-content: center; + gap: 7px; + border-radius: 9px; + font-size: 12px; + font-weight: 620; +} + +.primary-button { + padding: 0 15px; + border: 1px solid var(--green-deep); + color: white; + background: var(--green); + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.18); +} + +.primary-button:hover { + background: var(--green-deep); +} + +.primary-button.soft { + border-color: #b8dacd; + color: var(--green-deep); + background: #eff8f4; + box-shadow: none; +} + +.primary-button.light { + border-color: white; + color: var(--green-deep); + background: white; +} + +.ghost-button { + padding: 0 14px; + border: 1px solid #dce2de; + color: #53615d; + background: #fff; +} + +.ghost-button:hover { + border-color: #bec9c4; +} + +.full-ghost-button { + width: 100%; + border: 1px solid #e2e7e4; + color: #52615d; + background: #fafbf9; +} + +.text-button { + padding: 3px 0; + border: 0; + color: var(--green-deep); + background: transparent; + font-size: 11px; + font-weight: 650; +} + +.content-frame { + width: min(100%, 1500px); + margin: 0 auto; + padding: 32px 32px 56px; +} + +.page-heading { + display: flex; + align-items: flex-end; + justify-content: space-between; + margin-bottom: 26px; +} + +.eyebrow { + margin: 0 0 8px; + color: var(--green); + font-size: 10px; + font-weight: 720; + letter-spacing: 0.13em; + text-transform: uppercase; +} + +.page-heading h1 { + margin: 0; + font-size: clamp(26px, 3vw, 34px); + font-weight: 690; + letter-spacing: -0.045em; +} + +.page-heading > div > p:last-child { + margin: 8px 0 0; + color: var(--muted); + font-size: 13px; +} + +.date-chip { + display: flex; + align-items: center; + gap: 10px; + color: #7b8682; + font-size: 11px; +} + +.date-chip strong { + color: var(--ink); + font-size: 12px; +} + +.stat-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 14px; +} + +.stat-card { + position: relative; + min-height: 148px; + padding: 20px 20px 17px; + overflow: hidden; + border: 1px solid var(--line); + border-radius: 15px; + background: white; + box-shadow: 0 1px 2px rgb(18 31 28 / 0.02); +} + +.stat-icon { + position: absolute; + top: 17px; + right: 17px; + display: grid; + width: 33px; + height: 33px; + place-items: center; + border-radius: 10px; +} + +.stat-icon span { + width: 11px; + height: 11px; + border: 2px solid currentColor; + border-radius: 3px 8px 3px 8px; + transform: rotate(12deg); +} + +.stat-icon.ink { color: #364944; background: #eef1ef; } +.stat-icon.green { color: var(--green); background: var(--green-soft); } +.stat-icon.blue { color: var(--blue); background: var(--blue-soft); } +.stat-icon.orange { color: var(--orange); background: var(--orange-soft); } + +.stat-card > p { + margin: 0; + color: #6f7a77; + font-size: 11px; +} + +.stat-value { + display: flex; + align-items: baseline; + gap: 5px; + margin-top: 17px; +} + +.stat-value strong { + font-size: 30px; + font-weight: 670; + letter-spacing: -0.055em; +} + +.stat-value span { + color: #9aa39f; + font-size: 10px; +} + +.stat-card small { + display: block; + margin-top: 10px; + color: #98a19e; + font-size: 10px; +} + +.overview-grid { + display: grid; + grid-template-columns: minmax(0, 1.7fr) minmax(290px, 0.8fr); + gap: 14px; + margin-top: 14px; +} + +.panel { + border: 1px solid var(--line); + border-radius: 16px; + background: white; + box-shadow: 0 1px 2px rgb(18 31 28 / 0.02); +} + +.workflow-panel, +.task-mini-panel, +.table-panel { + padding: 21px; +} + +.panel-heading { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 20px; + margin-bottom: 19px; +} + +.panel-heading h2, +.task-hero h2, +.resource-intro h2, +.batch-submit-card h2 { + margin: 0; + font-size: 15px; + font-weight: 670; + letter-spacing: -0.02em; +} + +.panel-heading p { + margin: 5px 0 0; + color: #929c98; + font-size: 10px; +} + +.workflow-track { + display: grid; + grid-template-columns: auto 1fr auto 1fr auto 1fr auto; + align-items: center; + padding: 9px 0 20px; +} + +.workflow-track > i { + height: 1px; + margin: 0 10px; + background: #e1e7e3; +} + +.workflow-step { + display: flex; + align-items: center; + gap: 9px; + min-width: 0; +} + +.workflow-step > span { + display: grid; + width: 30px; + height: 30px; + flex: 0 0 auto; + place-items: center; + border: 1px solid #dbe2de; + border-radius: 9px; + color: #9aa49f; + background: #fafbf9; + font-size: 9px; + font-weight: 700; +} + +.workflow-step.done > span, +.workflow-step.active > span { + border-color: #abd1c2; + color: white; + background: var(--green); +} + +.workflow-step > div { + display: flex; + flex-direction: column; + white-space: nowrap; +} + +.workflow-step strong { + font-size: 11px; +} + +.workflow-step small { + margin-top: 4px; + color: #99a29f; + font-size: 9px; +} + +.focus-callout { + display: grid; + grid-template-columns: auto 1fr auto; + gap: 17px; + align-items: center; + padding: 17px 18px; + border: 1px solid #dcebe5; + border-radius: 13px; + background: + radial-gradient(circle at 90% 10%, rgb(47 157 117 / 0.08), transparent 28%), + #f6faf8; +} + +.callout-ring { + display: grid; + width: 58px; + height: 58px; + place-items: center; + border: 4px solid #d8ede5; + border-top-color: var(--green); + border-radius: 50%; +} + +.callout-ring strong, +.callout-ring span { + grid-area: 1 / 1; +} + +.callout-ring strong { + margin-top: -10px; + font-size: 17px; +} + +.callout-ring span { + margin-top: 20px; + color: #81908b; + font-size: 8px; +} + +.focus-callout h3 { + margin: 0 0 5px; + font-size: 12px; +} + +.focus-callout p:last-child { + margin: 0; + color: #7c8985; + font-size: 9px; + line-height: 1.55; +} + +.task-mini-list { + display: flex; + flex-direction: column; + gap: 16px; +} + +.task-mini-list article { + padding-bottom: 15px; + border-bottom: 1px solid #edf0ed; +} + +.task-mini-list article:last-child { + border-bottom: 0; +} + +.task-mini-top { + display: flex; + align-items: center; + gap: 9px; +} + +.task-mini-top > div:nth-child(2) { + display: flex; + min-width: 0; + flex: 1; + flex-direction: column; +} + +.task-mini-top strong { + overflow: hidden; + font-size: 11px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.task-mini-top span { + margin-top: 3px; + color: #929c98; + font-size: 9px; +} + +.task-mini-top b { + color: var(--green); + font-size: 10px; +} + +.progress { + height: 4px; + overflow: hidden; + border-radius: 4px; + background: #edf0ed; +} + +.progress span { + display: block; + height: 100%; + border-radius: 4px; + background: var(--green); +} + +.task-mini-list .progress { + margin: 12px 0 8px 43px; +} + +.task-mini-meta { + display: flex; + justify-content: space-between; + margin-left: 43px; + color: #9aa39f; + font-size: 8px; +} + +.task-mini-panel .full-ghost-button { + margin-top: 5px; +} + +.table-panel { + margin-top: 14px; +} + +.table-scroll { + width: 100%; + overflow-x: auto; +} + +.data-table { + width: 100%; + border-collapse: collapse; + table-layout: fixed; +} + +.data-table th { + height: 38px; + padding: 0 12px; + border-bottom: 1px solid #e8ece9; + color: #97a09d; + background: #fafbf9; + font-size: 9px; + font-weight: 630; + text-align: left; +} + +.data-table th:first-child { + width: 28%; + border-radius: 8px 0 0 8px; +} + +.data-table th:last-child { + border-radius: 0 8px 8px 0; +} + +.data-table td { + height: 66px; + padding: 10px 12px; + border-bottom: 1px solid #eef1ef; + font-size: 10px; + vertical-align: middle; +} + +.data-table tbody tr:last-child td { + border-bottom: 0; +} + +.data-table tbody tr:hover td { + background: #fbfcfa; +} + +.content-cell, +.account-cell { + display: flex; + min-width: 0; + align-items: center; + gap: 10px; +} + +.content-cell > div, +.account-cell > div:last-child { + display: flex; + min-width: 0; + flex-direction: column; +} + +.content-cell strong, +.account-cell strong { + overflow: hidden; + font-size: 10px; + font-weight: 630; + text-overflow: ellipsis; + white-space: nowrap; +} + +.content-cell span:last-child, +.account-cell span { + overflow: hidden; + margin-top: 4px; + color: #98a19e; + font-size: 8px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.content-id { + display: grid; + min-width: 28px; + height: 28px; + place-items: center; + border-radius: 8px; + color: #61716c; + background: #eef2ef; + font-size: 8px; + font-weight: 700; +} + +.plain-strong { + font-size: 10px; + font-weight: 610; +} + +.muted { + color: #a0a8a5; + font-size: 9px; +} + +.date-value { + color: #5f6d69; + font-size: 9px; +} + +.status-pill, +.metric-ready, +.metric-waiting { + display: inline-flex; + min-width: 51px; + height: 23px; + align-items: center; + justify-content: center; + border-radius: 12px; + font-size: 8px; + font-weight: 650; +} + +.status-pill.claimed { + color: #a15f36; + background: #fff1e7; +} + +.status-pill.published, +.status-pill.collecting, +.status-pill.active { + color: #2e7286; + background: #e9f3f6; +} + +.status-pill.complete { + color: #277a5d; + background: #e6f3ee; +} + +.metric-ready { + color: #277a5d; + background: #e9f5f0; +} + +.metric-waiting { + color: #927038; + background: #faf1df; +} + +.stack { + display: flex; + flex-direction: column; + gap: 14px; +} + +.stack > .table-panel { + margin-top: 0; +} + +.task-hero { + display: flex; + min-height: 170px; + align-items: center; + justify-content: space-between; + padding: 28px 32px; + overflow: hidden; + border-radius: 17px; + color: white; + background: + radial-gradient(circle at 82% 30%, rgb(83 194 151 / 0.21), transparent 30%), + linear-gradient(125deg, #162a26, #205843); +} + +.task-hero h2 { + font-size: 23px; +} + +.task-hero > div > p:last-child { + max-width: 540px; + margin: 10px 0 0; + color: #a9c2b9; + font-size: 11px; + line-height: 1.7; +} + +.task-hero .eyebrow { + color: #73d1ac; +} + +.task-list { + display: flex; + flex-direction: column; +} + +.task-row { + display: grid; + grid-template-columns: auto minmax(220px, 1fr) 110px 82px 70px auto; + gap: 16px; + align-items: center; + min-height: 82px; + border-bottom: 1px solid #edf0ee; +} + +.task-row:last-child { + border-bottom: 0; +} + +.task-row-main > div:first-child { + display: flex; + align-items: baseline; + gap: 10px; +} + +.task-row-main h3 { + margin: 0; + font-size: 12px; +} + +.task-row-main > div:first-child span, +.task-date span { + color: #929b98; + font-size: 9px; +} + +.task-row-main > small { + display: block; + margin-top: 4px; + color: #9aa39f; + font-size: 8px; +} + +.task-row-main .progress { + margin-top: 9px; +} + +.task-number, +.task-date { + display: flex; + flex-direction: column; +} + +.task-number strong { + font-size: 16px; +} + +.task-number span, +.task-date strong { + margin-top: 3px; + color: #7e8a86; + font-size: 9px; +} + +.round-arrow { + display: grid; + width: 30px; + height: 30px; + place-items: center; + border: 1px solid #e0e5e2; + border-radius: 50%; + color: #71807b; + background: white; +} + +.task-share-actions { + display: flex; + align-items: center; + gap: 7px; +} + +.share-link-button { + height: 31px; + padding: 0 10px; + border: 1px solid #cfe1d9; + border-radius: 8px; + color: var(--green-deep); + background: #f2f8f5; + font-size: 8px; + font-weight: 650; + white-space: nowrap; +} + +.share-link-button:hover { + border-color: #a9cebf; + background: #eaf5f0; +} + +.inline-summary { + display: flex; + min-height: 76px; + align-items: center; + gap: 24px; + padding: 15px 21px; + border: 1px solid var(--line); + border-radius: 14px; + background: white; +} + +.inline-summary > div:not(.summary-note) { + display: flex; + align-items: baseline; + gap: 10px; +} + +.inline-summary span { + color: #8b9692; + font-size: 10px; +} + +.inline-summary strong { + font-size: 23px; +} + +.inline-summary > i { + width: 1px; + height: 28px; + background: #e5e9e6; +} + +.summary-note { + display: flex; + align-items: center; + gap: 8px; + margin-left: auto; + padding: 9px 12px; + border-radius: 9px; + background: #f3f8f5; +} + +.filter-chips { + display: flex; + gap: 4px; + padding: 3px; + border-radius: 9px; + background: #f3f5f3; +} + +.filter-chips button { + height: 27px; + padding: 0 11px; + border: 0; + border-radius: 7px; + color: #89938f; + background: transparent; + font-size: 9px; +} + +.filter-chips button.active { + color: #34443f; + background: white; + box-shadow: 0 1px 3px rgb(18 31 28 / 0.08); +} + +.section-intro { + display: flex; + min-height: 92px; + align-items: center; + justify-content: space-between; + gap: 30px; + padding: 18px 22px; + border: 1px solid var(--line); + border-radius: 15px; + background: white; +} + +.section-intro h2 { + margin: 0; + font-size: 18px; + letter-spacing: -0.03em; +} + +.section-intro > p { + max-width: 510px; + margin: 0; + color: #84908c; + font-size: 10px; + line-height: 1.7; + text-align: right; +} + +.task-scope-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 13px; +} + +.task-scope-card { + padding: 19px; + border: 1px solid var(--line); + border-radius: 16px; + background: white; + box-shadow: 0 1px 2px rgb(18 31 28 / 0.02); + transition: 160ms ease; +} + +.task-scope-card:hover { + transform: translateY(-1px); + border-color: #cfdbd6; + box-shadow: var(--shadow); +} + +.task-scope-head { + display: grid; + grid-template-columns: auto 1fr auto; + gap: 11px; + align-items: center; +} + +.task-scope-head h3 { + margin: 0; + font-size: 13px; +} + +.task-scope-head > div:nth-child(2) > span { + display: block; + margin-top: 4px; + color: #929c98; + font-size: 9px; +} + +.task-source-line { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-top: 16px; + padding: 10px 11px; + border-radius: 9px; + background: #f5f7f5; + font-size: 8px; +} + +.task-source-line > span { + color: #9aa39f; +} + +.task-source-line a, +.task-source-line strong { + overflow: hidden; + color: #4d6b61; + font-weight: 620; + text-overflow: ellipsis; + white-space: nowrap; +} + +.task-scope-metrics { + display: grid; + grid-template-columns: repeat(3, 1fr); + margin-top: 16px; + padding: 14px 0; + border-block: 1px solid #eef1ef; +} + +.task-scope-metrics > div { + display: flex; + flex-direction: column; + border-right: 1px solid #eef1ef; + text-align: center; +} + +.task-scope-metrics > div:last-child { + border-right: 0; +} + +.task-scope-metrics span { + color: #99a29f; + font-size: 8px; +} + +.task-scope-metrics strong { + margin-top: 5px; + font-size: 17px; + letter-spacing: -0.03em; +} + +.task-scope-progress { + margin-top: 13px; +} + +.task-scope-open { + display: flex; + width: 100%; + height: 37px; + align-items: center; + justify-content: space-between; + margin-top: 15px; + padding: 0 12px; + border: 1px solid #dce5e1; + border-radius: 9px; + color: #345d50; + background: #fbfcfb; + font-size: 9px; + font-weight: 650; +} + +.task-scope-open:hover { + border-color: #bcd5ca; + background: #f2f8f5; +} + +.task-scope-open b { + font-size: 14px; + font-weight: 500; +} + +.task-detail-header { + display: grid; + grid-template-columns: auto auto 1fr auto; + gap: 13px; + align-items: center; + min-height: 92px; + padding: 17px 20px; + border: 1px solid var(--line); + border-radius: 15px; + background: white; +} + +.detail-back { + height: 31px; + padding: 0 10px; + border: 1px solid #e0e6e2; + border-radius: 8px; + color: #697671; + background: white; + font-size: 8px; +} + +.task-detail-header p { + margin: 0 0 4px; + color: var(--green); + font-size: 8px; + font-weight: 700; + letter-spacing: 0.08em; +} + +.task-detail-header h2 { + margin: 0; + font-size: 16px; +} + +.task-detail-header > div:nth-child(3) > span { + display: block; + margin-top: 4px; + color: #8e9995; + font-size: 9px; +} + +.task-detail-header > a { + padding: 8px 10px; + border-radius: 8px; + color: var(--green-deep); + background: var(--green-soft); + font-size: 8px; + font-weight: 650; +} + +.resource-intro { + display: grid; + grid-template-columns: auto 1fr auto; + gap: 24px; + align-items: center; + min-height: 126px; + padding: 22px 26px; + border-radius: 16px; + color: white; + background: linear-gradient(120deg, #172924, #254d40); +} + +.resource-figure { + display: flex; + min-width: 115px; + flex-direction: column; + padding-right: 24px; + border-right: 1px solid rgb(255 255 255 / 0.14); +} + +.resource-figure strong { + font-size: 34px; + letter-spacing: -0.05em; +} + +.resource-figure span { + color: #94b1a7; + font-size: 9px; +} + +.resource-intro > div:nth-child(2) p { + max-width: 580px; + margin: 8px 0 0; + color: #9db5ad; + font-size: 10px; + line-height: 1.6; +} + +.resource-rule { + display: flex; + flex-direction: column; + padding: 13px 16px; + border: 1px solid rgb(255 255 255 / 0.1); + border-radius: 11px; + background: rgb(255 255 255 / 0.05); +} + +.resource-rule span { + color: #8aa59c; + font-size: 8px; +} + +.resource-rule strong { + margin-top: 5px; + font-size: 11px; +} + +.resource-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; +} + +.resource-card { + padding: 18px; + border: 1px solid #e5e9e6; + border-radius: 14px; + background: #fff; + transition: 150ms ease; +} + +.resource-card:hover { + transform: translateY(-1px); + box-shadow: var(--shadow); +} + +.resource-card-head { + display: flex; + align-items: center; + gap: 11px; +} + +.resource-card-head > div:nth-child(2) { + display: flex; + min-width: 0; + flex: 1; + flex-direction: column; +} + +.resource-card-head h3 { + margin: 0; + overflow: hidden; + font-size: 12px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.resource-card-head span { + margin-top: 4px; + color: #8c9894; + font-size: 9px; +} + +.verified-dot { + display: grid; + width: 19px; + height: 19px; + place-items: center; + border-radius: 50%; + color: #fff !important; + background: var(--green); + font-size: 9px !important; +} + +.resource-account-id { + display: flex; + min-width: 0; + align-items: center; + gap: 9px; + margin-top: 14px; + padding: 9px 10px; + border-radius: 8px; + color: #77847f; + background: #f5f7f5; +} + +.resource-account-id span { + flex: 0 0 auto; + font-size: 8px; +} + +.resource-account-id strong { + min-width: 0; + overflow: hidden; + color: #40534d; + font-family: var(--font-geist-mono), monospace; + font-size: 9px; + font-weight: 600; + text-overflow: ellipsis; + user-select: all; + white-space: nowrap; +} + +.resource-metrics { + display: grid; + grid-template-columns: repeat(2, 1fr); + margin-top: 12px; + padding: 13px 0; + border-block: 1px solid #eef1ef; +} + +.resource-metrics > div { + display: flex; + flex-direction: column; + border-right: 1px solid #eef1ef; + text-align: center; +} + +.resource-metrics > div:last-child { + border-right: 0; +} + +.resource-metrics span, +.resource-source > span { + color: #9ba4a1; + font-size: 8px; +} + +.resource-metrics strong { + margin-top: 4px; + font-size: 13px; +} + +.resource-source { + margin-top: 13px; +} + +.resource-source > div { + display: flex; + flex-wrap: wrap; + gap: 5px; + margin-top: 8px; +} + +.resource-source b { + padding: 5px 7px; + border-radius: 6px; + color: #567068; + background: #eef4f1; + font-size: 8px; + font-weight: 580; +} + +.resource-source b.partner-managed { + color: #8b603c; + background: #fff3e8; +} + +.resource-card-foot { + display: flex; + justify-content: space-between; + margin-top: 14px; + color: #9aa39f; + font-size: 8px; +} + +.resource-card-foot a { + color: var(--green); + font-weight: 650; +} + +.recovery-legend { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 10px; +} + +.recovery-legend > div { + display: grid; + grid-template-columns: auto 1fr; + gap: 3px 9px; + align-items: center; + padding: 13px 16px; + border: 1px solid var(--line); + border-radius: 12px; + background: white; +} + +.recovery-legend strong { + font-size: 10px; +} + +.recovery-legend small { + grid-column: 2; + color: #97a09d; + font-size: 8px; +} + +.legend-dot { + grid-row: 1 / span 2; + width: 9px; + height: 9px; + border-radius: 50%; +} + +.legend-dot.auto { background: #43a97f; } +.legend-dot.upload { background: #52889a; } +.legend-dot.fallback { background: #e8875d; } + +.recovery-table { + table-layout: auto; +} + +.recovery-table th:first-child { + min-width: 280px; +} + +.recovery-table th:nth-child(2) { + min-width: 96px; +} + +.recovery-table th, +.recovery-table td { + white-space: nowrap; +} + +.recovery-content { + max-width: 360px; +} + +.recovery-content > div:last-child { + min-width: 0; +} + +.recovery-content strong { + max-width: 310px; + overflow: hidden; + text-overflow: ellipsis; +} + +.recovery-title-link { + display: inline-flex; + align-items: center; + gap: 5px; + max-width: 310px; + color: #182822; + text-decoration: none; + vertical-align: top; +} + +.recovery-title-link strong { + min-width: 0; +} + +.recovery-title-link::after { + content: "↗"; + flex: none; + color: #2b9875; + font-size: 10px; + font-weight: 700; +} + +.recovery-title-link:hover strong { + color: #168565; + text-decoration: underline; + text-underline-offset: 3px; +} + +.recovery-title-link:focus-visible { + border-radius: 4px; + outline: 2px solid rgba(43, 152, 117, 0.35); + outline-offset: 3px; +} + +.recovery-content span { + color: #8d9894; +} + +.metric-cell, +.creator-metrics { + display: flex; + flex-direction: column; +} + +.metric-cell strong, +.creator-metrics strong { + font-size: 11px; +} + +.metric-cell span, +.creator-metrics span { + margin-top: 3px; + color: #99a29f; + font-size: 8px; +} + +.metric-cell.total strong { + color: var(--green-deep); +} + +.metric-cell.update-time strong { + font-size: 9px; + font-weight: 650; +} + +.metric-cell.publish-time strong { + color: #56645f; + font-size: 9px; + font-weight: 650; +} + +.collection-status-cell { + display: flex; + max-width: 190px; + flex-direction: column; + align-items: flex-start; + gap: 5px; +} + +.collection-status-cell small { + max-width: 180px; + overflow: hidden; + color: #98a19e; + font-size: 8px; + text-overflow: ellipsis; +} + +.collection-status { + display: inline-flex; + min-height: 24px; + align-items: center; + padding: 0 9px; + border-radius: 999px; + color: #72807a; + background: #f0f3f1; + font-size: 8px; + font-weight: 700; +} + +.collection-status.success { + color: #237859; + background: #e9f7f0; +} + +.collection-status.scheduled, +.collection-status.collecting { + color: #34778c; + background: #eaf4f7; +} + +.collection-status.failed { + color: #b85e3a; + background: #fff0e9; +} + +.creator-data-summary { + display: flex; + flex-direction: column; + gap: 3px; + color: #8b9692; + font-size: 8px; +} + +.creator-data-summary b { + font-weight: 650; +} + +.creator-screenshot-cell { + display: flex; + min-width: 104px; + flex-direction: column; + align-items: flex-start; + gap: 6px; +} + +.creator-screenshot-link { + color: var(--green-deep); + font-size: 8px; + font-weight: 700; + text-decoration: none; +} + +.creator-screenshot-link:hover { + text-decoration: underline; + text-underline-offset: 3px; +} + +.creator-screenshot-pending, +.creator-ocr-failed { + color: #9aa39f; + font-size: 8px; +} + +.creator-ocr-failed { + color: #b85e3a; +} + +.collect-button { + height: 27px; + padding: 0 9px; + border: 1px dashed #a8c9bb; + border-radius: 7px; + color: var(--green-deep); + background: #f7fbf9; + font-size: 8px; +} + +.upload-button { + display: inline-flex; + height: 28px; + align-items: center; + padding: 0 9px; + border: 1px solid #dce3df; + border-radius: 7px; + color: #66746f; + background: white; + cursor: pointer; + font-size: 8px; +} + +.upload-button.uploaded { + border-color: #b8d8cb; + color: #277a5d; + background: #eff8f4; +} + +.upload-button.retry-upload { + height: 24px; + padding-inline: 7px; + color: #8a5a44; + background: #fff8f4; +} + +.retry-failed-button { + display: inline-flex; + height: 34px; + align-items: center; + gap: 7px; + padding: 0 12px; + border: 1px solid #efc7b4; + border-radius: 8px; + color: #a95735; + background: #fff8f4; + font-size: 9px; + font-weight: 700; +} + +.retry-failed-button b { + display: grid; + min-width: 18px; + height: 18px; + place-items: center; + padding: 0 5px; + border-radius: 999px; + color: white; + background: #df7b50; + font-size: 8px; +} + +.retry-failed-button:disabled { + border-color: #e4e8e6; + color: #a7afac; + background: #f6f7f6; +} + +.collection-schedule-panel { + padding: 22px 24px; +} + +.collection-schedule-heading { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 24px; +} + +.collection-schedule-heading h2 { + margin-top: 5px; + font-size: 20px; +} + +.collection-schedule-heading > div > span { + display: block; + margin-top: 7px; + color: #87938f; + font-size: 9px; +} + +.schedule-save-area { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 12px; +} + +.schedule-save-area .primary-button { + height: 38px; +} + +.schedule-grid { + display: grid; + grid-template-columns: 190px 1fr; + gap: 14px; + margin-top: 20px; +} + +.schedule-start { + display: flex; + flex-direction: column; + justify-content: center; + gap: 9px; + padding: 14px; + border: 1px solid var(--line); + border-radius: 12px; + background: #fbfcfb; +} + +.schedule-start span { + color: #65716d; + font-size: 9px; + font-weight: 700; +} + +.schedule-start input { + width: 100%; + height: 42px; + padding: 0 12px; + border: 1px solid #d7dfdb; + border-radius: 9px; + color: var(--ink); + background: white; + font: inherit; + font-size: 11px; +} + +.schedule-days { + display: grid; + grid-template-columns: repeat(7, minmax(78px, 1fr)); + border: 1px solid var(--line); + border-radius: 12px; + overflow: hidden; +} + +.schedule-days button { + display: grid; + min-height: 104px; + place-items: center; + align-content: center; + gap: 7px; + border: 0; + border-right: 1px solid var(--line); + color: #596762; + background: white; +} + +.schedule-days button:last-child { + border-right: 0; +} + +.schedule-days button:hover { + background: #f7fbf9; +} + +.schedule-days button.selected { + color: var(--green-deep); + background: #eef8f3; +} + +.schedule-days button span { + font-size: 10px; + font-weight: 700; +} + +.schedule-days button b { + display: grid; + width: 24px; + height: 24px; + place-items: center; + border: 1px solid #d4dfda; + border-radius: 7px; + color: white; + background: white; + font-size: 13px; +} + +.schedule-days button.selected b { + border-color: var(--green); + background: var(--green); +} + +.schedule-days button small { + color: #89948f; + font-size: 8px; +} + +.schedule-mobile-hint { + display: none; +} + +.schedule-updated { + margin-top: 10px; + color: #9aa39f; + font-size: 8px; + text-align: right; +} + +.upload-button input { + display: none; +} + +.partner-layout { + display: grid; + grid-template-columns: 310px minmax(0, 1fr); + gap: 20px; + align-items: start; +} + +.partner-phone { + position: sticky; + top: 94px; + min-height: 620px; + padding: 16px 14px 12px; + overflow: hidden; + border: 7px solid #1c2926; + border-radius: 28px; + background: #f2f4f1; + box-shadow: 0 20px 50px rgb(18 31 28 / 0.15); +} + +.phone-top { + display: flex; + align-items: center; + gap: 9px; + padding: 8px 5px 17px; +} + +.phone-top > div:nth-child(2) { + display: flex; + min-width: 0; + flex: 1; + flex-direction: column; +} + +.phone-top strong { + font-size: 11px; +} + +.phone-top span { + margin-top: 3px; + color: #8c9693; + font-size: 8px; +} + +.phone-top button { + border: 0; + color: #78837f; + background: transparent; +} + +.partner-card { + padding: 22px 17px 17px; + border-radius: 18px; + color: white; + background: + radial-gradient(circle at 90% 5%, rgb(98 218 171 / 0.22), transparent 28%), + linear-gradient(145deg, #18352d, #1e654d); +} + +.micro-label { + display: inline-flex; + padding: 5px 8px; + border-radius: 12px; + color: #8ce3bd; + background: rgb(255 255 255 / 0.09); + font-size: 8px; + font-weight: 650; +} + +.partner-card h2 { + margin: 15px 0 5px; + font-size: 19px; + letter-spacing: -0.035em; +} + +.partner-card > p { + margin: 0; + color: #a1c0b5; + font-size: 9px; +} + +.partner-task-stats { + display: grid; + grid-template-columns: 1fr 1fr; + margin: 19px 0; + padding: 13px 0; + border-block: 1px solid rgb(255 255 255 / 0.1); +} + +.partner-task-stats div { + display: flex; + flex-direction: column; + text-align: center; +} + +.partner-task-stats div:first-child { + border-right: 1px solid rgb(255 255 255 / 0.1); +} + +.partner-task-stats strong { + font-size: 20px; +} + +.partner-task-stats span { + margin-top: 3px; + color: #94b7aa; + font-size: 8px; +} + +.quantity-picker { + display: grid; + grid-template-columns: 42px 1fr 42px; + align-items: center; + padding: 8px; + border-radius: 13px; + background: rgb(255 255 255 / 0.08); +} + +.quantity-picker button { + display: grid; + width: 37px; + height: 37px; + place-items: center; + border: 1px solid rgb(255 255 255 / 0.12); + border-radius: 10px; + color: white; + background: rgb(255 255 255 / 0.06); +} + +.quantity-picker div { + display: flex; + flex-direction: column; + text-align: center; +} + +.quantity-picker strong { + font-size: 19px; +} + +.quantity-picker span { + color: #97b7ac; + font-size: 7px; +} + +.partner-primary { + width: 100%; + height: 43px; + margin-top: 14px; + border: 0; + border-radius: 11px; + color: #14553e; + background: #f4fff9; + font-size: 11px; + font-weight: 700; +} + +.partner-card > small { + display: block; + margin-top: 9px; + color: #86aa9c; + font-size: 7px; + text-align: center; +} + +.partner-bottom-nav { + position: absolute; + right: 14px; + bottom: 10px; + left: 14px; + display: grid; + grid-template-columns: repeat(3, 1fr); + height: 46px; + align-items: center; + border-radius: 14px; + background: white; + box-shadow: 0 7px 20px rgb(18 31 28 / 0.08); + color: #9aa39f; + font-size: 8px; + text-align: center; +} + +.partner-bottom-nav .active { + color: var(--green); + font-weight: 700; +} + +.partner-console { + display: flex; + flex-direction: column; + gap: 14px; +} + +.partner-settings, +.batch-submit-card, +.simple-flow { + padding: 21px; + border: 1px solid var(--line); + border-radius: 16px; + background: white; +} + +.form-grid { + display: grid; + gap: 12px; +} + +.form-grid.two { + grid-template-columns: 1fr 1fr; +} + +label { + display: flex; + flex-direction: column; + gap: 7px; + margin-bottom: 14px; +} + +label > span { + color: #66736f; + font-size: 10px; + font-weight: 620; +} + +input, +textarea, +select { + width: 100%; + border: 1px solid #dce2de; + border-radius: 9px; + outline: none; + background: white; + font-size: 11px; +} + +input, +select { + height: 40px; + padding: 0 11px; +} + +textarea { + min-height: 110px; + padding: 11px; + resize: vertical; + line-height: 1.7; +} + +input:focus, +textarea:focus, +select:focus { + border-color: #70ad95; + box-shadow: 0 0 0 3px rgb(31 143 105 / 0.08); +} + +label small { + color: #9aa39f; + font-size: 8px; +} + +.partner-settings .form-grid { + margin-top: 15px; +} + +.partner-settings label { + margin-bottom: 0; +} + +.batch-head { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 17px; +} + +.batch-head > div { + display: flex; + align-items: center; + gap: 12px; +} + +.batch-head p { + margin: 5px 0 0; + color: #909b97; + font-size: 9px; +} + +.step-number { + display: grid; + width: 36px; + height: 36px; + place-items: center; + border-radius: 11px; + color: var(--green); + background: var(--green-soft); + font-size: 10px; + font-weight: 750; +} + +.pending-count { + padding: 7px 10px; + border-radius: 13px; + color: #ad643d; + background: var(--orange-soft); + font-size: 9px; + font-weight: 650; +} + +.batch-submit-card textarea { + min-height: 210px; + border-style: dashed; + background: #fbfcfa; +} + +.batch-foot { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-top: 12px; +} + +.batch-foot > div { + display: flex; + align-items: center; + gap: 7px; + color: #8c9894; + font-size: 8px; +} + +.batch-foot > div span { + display: grid; + width: 18px; + height: 18px; + place-items: center; + border-radius: 50%; + color: var(--green); + background: var(--green-soft); +} + +.simple-flow { + display: grid; + grid-template-columns: 1fr auto 1fr auto 1fr; + align-items: center; +} + +.simple-flow div { + display: grid; + grid-template-columns: auto 1fr; + gap: 2px 9px; + align-items: center; +} + +.simple-flow div > span { + display: grid; + grid-row: 1 / span 2; + width: 27px; + height: 27px; + place-items: center; + border-radius: 9px; + color: var(--green); + background: var(--green-soft); + font-size: 9px; + font-weight: 700; +} + +.simple-flow strong { + font-size: 10px; +} + +.simple-flow small { + color: #99a29f; + font-size: 8px; +} + +.simple-flow > i { + width: 42px; + height: 1px; + margin: 0 12px; + background: #dfe5e1; +} + +.modal-backdrop { + position: fixed; + inset: 0; + z-index: 100; + display: grid; + place-items: center; + padding: 20px; + background: rgb(11 20 18 / 0.54); + backdrop-filter: blur(5px); +} + +.modal-card { + width: min(620px, 100%); + max-height: calc(100vh - 40px); + padding: 24px; + overflow-y: auto; + border-radius: 17px; + background: white; + box-shadow: 0 24px 80px rgb(9 19 16 / 0.24); +} + +.modal-card.compact { + width: min(480px, 100%); +} + +.modal-heading { + display: flex; + align-items: flex-start; + justify-content: space-between; + margin-bottom: 20px; +} + +.modal-heading h2 { + margin: 0; + font-size: 20px; + letter-spacing: -0.035em; +} + +.modal-heading > button { + display: grid; + width: 30px; + height: 30px; + place-items: center; + border: 0; + border-radius: 50%; + color: #7c8783; + background: #f1f3f1; + font-size: 18px; +} + +.source-url-row { + display: grid; + grid-template-columns: 1fr auto; + gap: 9px; +} + +.source-read-button { + min-width: 92px; +} + +.source-preview { + margin: 2px 0 17px; + padding: 14px; + border: 1px solid #cfe2da; + border-radius: 12px; + background: #f6faf8; +} + +.source-preview-head, +.source-preview-head > div { + display: flex; + align-items: center; +} + +.source-preview-head { + justify-content: space-between; + gap: 14px; +} + +.source-preview-head > div { + min-width: 0; + gap: 9px; +} + +.source-preview-head > div > div { + display: flex; + min-width: 0; + flex-direction: column; +} + +.source-check { + display: grid; + width: 24px; + height: 24px; + flex: 0 0 auto; + place-items: center; + border-radius: 50%; + color: white; + background: var(--green); + font-size: 10px; +} + +.source-preview-head strong { + overflow: hidden; + font-size: 11px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.source-preview-head small { + margin-top: 3px; + color: #85928d; + font-size: 8px; +} + +.source-preview-head b { + color: var(--green-deep); + font-size: 15px; + white-space: nowrap; +} + +.source-columns { + display: flex; + flex-wrap: wrap; + gap: 5px; + margin-top: 12px; +} + +.source-columns span { + padding: 4px 6px; + border-radius: 5px; + color: #64746e; + background: white; + font-size: 7px; +} + +.source-samples { + display: flex; + flex-direction: column; + gap: 6px; + margin-top: 11px; + padding-top: 10px; + border-top: 1px solid #dfeae5; +} + +.source-samples > div { + display: grid; + grid-template-columns: 20px 1fr; + gap: 8px; + align-items: center; +} + +.source-samples span { + display: grid; + width: 20px; + height: 20px; + place-items: center; + border-radius: 6px; + color: #6d7d77; + background: #e7f0ec; + font-size: 7px; +} + +.source-samples strong { + overflow: hidden; + color: #52625c; + font-size: 8px; + font-weight: 560; + text-overflow: ellipsis; + white-space: nowrap; +} + +.modal-actions { + display: flex; + justify-content: flex-end; + gap: 9px; + margin-top: 8px; +} + +.context-strip { + display: flex; + flex-direction: column; + gap: 4px; + margin-bottom: 18px; + padding: 12px 14px; + border-radius: 10px; + background: #f4f7f5; +} + +.context-strip strong { + font-size: 11px; +} + +.context-strip span { + color: #87928e; + font-size: 9px; +} + +.toast { + position: fixed; + right: 24px; + bottom: 24px; + z-index: 120; + display: flex; + min-height: 46px; + align-items: center; + gap: 10px; + padding: 0 16px; + border: 1px solid #d4e7df; + border-radius: 12px; + color: #2b4a40; + background: rgb(255 255 255 / 0.96); + box-shadow: 0 16px 45px rgb(18 31 28 / 0.16); + font-size: 11px; + font-weight: 580; + backdrop-filter: blur(12px); +} + +.toast span { + display: grid; + width: 21px; + height: 21px; + place-items: center; + border-radius: 50%; + color: white; + background: var(--green); + font-size: 10px; +} + +.working-bar { + position: fixed; + top: 0; + right: 0; + left: 232px; + z-index: 200; + height: 2px; + background: linear-gradient(90deg, transparent, #38b483, transparent); + background-size: 40% 100%; + animation: working 1.2s infinite linear; +} + +@keyframes working { + from { background-position: -50% 0; } + to { background-position: 150% 0; } +} + +.loading-layout { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 14px; +} + +.loading-card, +.loading-table { + min-height: 148px; + border-radius: 15px; + background: linear-gradient(100deg, #e9ece9 20%, #f5f6f4 40%, #e9ece9 60%); + background-size: 220% 100%; + animation: shimmer 1.4s infinite linear; +} + +.loading-table { + grid-column: 1 / -1; + min-height: 330px; +} + +@keyframes shimmer { + to { background-position-x: -220%; } +} + +.empty-state, +.table-empty { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + min-height: 380px; + color: #87928e; + text-align: center; +} + +.table-empty.compact { + min-height: 150px; + font-size: 10px; +} + +.empty-icon { + display: grid; + width: 44px; + height: 44px; + place-items: center; + border-radius: 50%; + color: #ac603e; + background: var(--orange-soft); + font-weight: 800; +} + +.empty-state h3 { + margin: 15px 0 5px; + color: var(--ink); +} + +.empty-state p { + margin: 0 0 18px; + font-size: 11px; +} + +.menu-button, +.sidebar-scrim { + display: none; +} + +@media (max-width: 1180px) { + .stat-grid { + grid-template-columns: repeat(2, 1fr); + } + + .overview-grid { + grid-template-columns: 1fr; + } + + .resource-grid { + grid-template-columns: repeat(2, 1fr); + } + + .task-scope-grid { + grid-template-columns: 1fr; + } + + .workflow-track { + overflow-x: auto; + } + + .schedule-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 900px) { + .sidebar { + transform: translateX(-100%); + transition: transform 180ms ease; + } + + .sidebar.open { + transform: translateX(0); + } + + .sidebar-scrim { + position: fixed; + inset: 0; + z-index: 40; + display: block; + border: 0; + background: rgb(8 16 14 / 0.44); + } + + .main-area { + margin-left: 0; + } + + .menu-button { + display: grid; + width: 34px; + height: 34px; + margin-right: 10px; + place-items: center; + border: 1px solid #dce2de; + border-radius: 9px; + background: white; + } + + .topbar { + justify-content: flex-start; + padding: 0 20px; + } + + .top-actions { + margin-left: auto; + } + + .sync-state, + .top-actions .ghost-button { + display: none; + } + + .content-frame { + padding: 26px 20px 50px; + } + + .partner-layout { + grid-template-columns: 1fr; + } + + .partner-phone { + position: relative; + top: 0; + width: min(100%, 330px); + margin: 0 auto; + } + + .resource-intro { + grid-template-columns: auto 1fr; + } + + .resource-rule { + display: none; + } + + .working-bar { + left: 0; + } +} + +@media (max-width: 680px) { + .topbar { + height: 62px; + } + + .breadcrumb span, + .breadcrumb i { + display: none; + } + + .top-actions .primary-button { + min-width: 38px; + padding: 0 10px; + font-size: 0; + } + + .top-actions .primary-button span { + font-size: 16px; + } + + .content-frame { + padding-inline: 14px; + } + + .page-heading { + align-items: flex-start; + } + + .date-chip { + display: none; + } + + .stat-grid, + .resource-grid, + .recovery-legend { + grid-template-columns: 1fr; + } + + .collection-schedule-panel { + padding: 18px; + } + + .collection-schedule-heading { + align-items: flex-start; + flex-direction: column; + } + + .schedule-save-area { + width: 100%; + justify-content: space-between; + } + + .schedule-save-area .primary-button { + min-width: 138px; + } + + .schedule-days { + grid-template-columns: repeat(7, minmax(76px, 1fr)); + overflow-x: auto; + } + + .schedule-mobile-hint { + display: block; + margin-top: -4px; + color: #97a19d; + font-size: 8px; + text-align: center; + } + + .stat-card { + min-height: 130px; + } + + .focus-callout { + grid-template-columns: auto 1fr; + } + + .focus-callout .primary-button { + grid-column: 1 / -1; + width: 100%; + } + + .workflow-track { + display: flex; + gap: 16px; + } + + .workflow-track > i { + width: 24px; + flex: 0 0 auto; + } + + .task-row { + grid-template-columns: auto 1fr auto; + padding: 12px 0; + } + + .task-number, + .task-date, + .task-row > .status-pill { + display: none; + } + + .task-hero { + align-items: flex-start; + flex-direction: column; + gap: 22px; + } + + .inline-summary { + align-items: flex-start; + flex-wrap: wrap; + } + + .summary-note { + width: 100%; + margin-left: 0; + } + + .resource-intro { + grid-template-columns: 1fr; + } + + .section-intro { + align-items: flex-start; + flex-direction: column; + gap: 10px; + } + + .section-intro > p { + text-align: left; + } + + .task-detail-header { + grid-template-columns: auto 1fr auto; + } + + .task-detail-header .detail-back { + grid-column: 1 / -1; + justify-self: start; + } + + .source-url-row { + grid-template-columns: 1fr; + } + + .source-read-button { + width: 100%; + } + + .resource-figure { + border-right: 0; + } + + .form-grid.two { + grid-template-columns: 1fr; + } + + .batch-head, + .batch-foot { + align-items: flex-start; + flex-direction: column; + } + + .batch-foot .primary-button { + width: 100%; + } + + .simple-flow { + grid-template-columns: 1fr; + gap: 14px; + } + + .simple-flow > i { + width: 1px; + height: 18px; + margin-left: 13px; + } + + .modal-card { + padding: 20px 17px; + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..546f15d --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,68 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import { headers } from "next/headers"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export async function generateMetadata(): Promise { + const requestHeaders = await headers(); + const host = requestHeaders.get("x-forwarded-host") || requestHeaders.get("host"); + const protocol = + requestHeaders.get("x-forwarded-proto") || + (host?.startsWith("localhost") ? "http" : "https"); + const metadataBase = host + ? new URL(`${protocol}://${host}`) + : new URL("https://koc-loop.example.com"); + const description = + "面向KOC运营团队的轻量资源管理、内容分发与数据回收平台。"; + + return { + metadataBase, + title: "KOC LOOP|内容分发闭环", + description, + icons: { + icon: "/favicon.svg", + shortcut: "/favicon.svg", + }, + openGraph: { + title: "KOC LOOP|内容分发闭环", + description, + type: "website", + images: [ + { + url: new URL("/og.png", metadataBase).toString(), + width: 1200, + height: 630, + alt: "KOC LOOP 资源管理、内容分发与数据回收", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: "KOC LOOP|内容分发闭环", + description, + images: [new URL("/og.png", metadataBase).toString()], + }, + }; +} + +export default function RootLayout({ + children, +}: Readonly<{ children: React.ReactNode }>) { + return ( + + + {children} + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..83561ef --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,24 @@ +import { chatGPTSignOutPath, requireChatGPTUser } from "./chatgpt-auth"; +import AdminApp from "./admin-app"; +import { isAdminEmail } from "../lib/admin-auth"; + +export const dynamic = "force-dynamic"; + +export default async function Page() { + const user = await requireChatGPTUser("/"); + + if (!isAdminEmail(user.email)) { + return ( +
+
+

KOC LOOP

+

当前账号没有后台权限

+ 请切换为管理员账号后再试。 + 切换账号 +
+
+ ); + } + + return ; +} diff --git a/build/sites-vite-plugin.ts b/build/sites-vite-plugin.ts new file mode 100644 index 0000000..26563fd --- /dev/null +++ b/build/sites-vite-plugin.ts @@ -0,0 +1,45 @@ +import { access, cp, mkdir, rm } from "node:fs/promises"; +import { resolve } from "node:path"; +import type { Plugin } from "vite"; + +async function exists(path: string): Promise { + try { + await access(path); + return true; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") { + return false; + } + throw error; + } +} + +// Packages Sites metadata and migrations after Vite finishes compiling. +export function sites(): Plugin { + let root = process.cwd(); + + return { + name: "sites", + apply: "build", + configResolved(config) { + root = config.root; + }, + async closeBundle() { + const outputDirectory = resolve(root, "dist", ".openai"); + const hostingConfig = resolve(root, ".openai", "hosting.json"); + const drizzleSource = resolve(root, "drizzle"); + + await rm(outputDirectory, { recursive: true, force: true }); + await mkdir(outputDirectory, { recursive: true }); + + if (await exists(hostingConfig)) { + await cp(hostingConfig, resolve(outputDirectory, "hosting.json")); + } + if (await exists(drizzleSource)) { + await cp(drizzleSource, resolve(outputDirectory, "drizzle"), { + recursive: true, + }); + } + }, + }; +} diff --git a/db/index.ts b/db/index.ts new file mode 100644 index 0000000..19b3799 --- /dev/null +++ b/db/index.ts @@ -0,0 +1,13 @@ +import { env } from "cloudflare:workers"; +import { drizzle } from "drizzle-orm/d1"; +import * as schema from "./schema"; + +export function getDb() { + if (!env.DB) { + throw new Error( + "Cloudflare D1 binding `DB` is unavailable. Set the `d1` field in .openai/hosting.json to `DB` or let your control plane inject the real binding values before using the database." + ); + } + + return drizzle(env.DB, { schema }); +} diff --git a/db/schema.ts b/db/schema.ts new file mode 100644 index 0000000..efc0d1e --- /dev/null +++ b/db/schema.ts @@ -0,0 +1,188 @@ +import { sql } from "drizzle-orm"; +import { + index, + integer, + sqliteTable, + text, + uniqueIndex, +} from "drizzle-orm/sqlite-core"; + +export const partners = sqliteTable("partners", { + id: text("id").primaryKey(), + name: text("name").notNull(), + wecomName: text("wecom_name").notNull(), + owner: text("owner").notNull().default("运营组"), + claimedTotal: integer("claimed_total").notNull().default(0), + completedTotal: integer("completed_total").notNull().default(0), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), +}); + +export const tasks = sqliteTable( + "tasks", + { + id: text("id").primaryKey(), + name: text("name").notNull(), + brand: text("brand").notNull(), + quantity: integer("quantity").notNull(), + claimedQuantity: integer("claimed_quantity").notNull().default(0), + dueAt: text("due_at").notNull(), + status: text("status").notNull().default("active"), + sourceUrl: text("source_url").notNull().default(""), + sourceSheetId: text("source_sheet_id").notNull().default(""), + sourceSheetName: text("source_sheet_name").notNull().default(""), + sourceSyncedAt: text("source_synced_at"), + shareToken: text("share_token"), + collectionStartDate: text("collection_start_date"), + collectionDays: text("collection_days").notNull().default("[]"), + collectionScheduleUpdatedAt: text("collection_schedule_updated_at"), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), + }, + (table) => [uniqueIndex("tasks_share_token_idx").on(table.shareToken)], +); + +export const contents = sqliteTable("contents", { + id: text("id").primaryKey(), + taskId: text("task_id").notNull(), + title: text("title").notNull(), + body: text("body").notNull().default(""), + imageAssets: text("image_assets").notNull().default("[]"), + status: text("status").notNull().default("available"), + source: text("source").notNull().default("飞书内容表"), + sourceRow: integer("source_row"), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), +}); + +export const accounts = sqliteTable( + "accounts", + { + id: text("id").primaryKey(), + platform: text("platform").notNull().default("小红书"), + platformUid: text("platform_uid").notNull(), + publicAccountId: text("public_account_id").notNull().default(""), + nickname: text("nickname").notNull(), + profileUrl: text("profile_url").notNull().default(""), + ipLocation: text("ip_location").notNull().default("待识别"), + followers: integer("followers").notNull().default(0), + postCount: integer("post_count").notNull().default(0), + avgViews: integer("avg_views").notNull().default(0), + firstSeenAt: text("first_seen_at").notNull().default(sql`CURRENT_TIMESTAMP`), + lastSeenAt: text("last_seen_at").notNull().default(sql`CURRENT_TIMESTAMP`), + }, + (table) => [ + uniqueIndex("accounts_platform_uid_idx").on( + table.platform, + table.platformUid, + ), + ], +); + +export const claims = sqliteTable( + "claims", + { + id: text("id").primaryKey(), + taskId: text("task_id").notNull(), + partnerId: text("partner_id").notNull(), + claimantName: text("claimant_name").notNull(), + claimToken: text("claim_token").notNull(), + quantity: integer("quantity").notNull(), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), + }, + (table) => [ + uniqueIndex("claims_claim_token_idx").on(table.claimToken), + index("claims_task_partner_created_idx").on( + table.taskId, + table.partnerId, + table.createdAt, + ), + ], +); + +export const delegationBundles = sqliteTable( + "delegation_bundles", + { + id: text("id").primaryKey(), + taskId: text("task_id").notNull(), + claimId: text("claim_id").notNull(), + partnerId: text("partner_id").notNull(), + label: text("label").notNull(), + shareToken: text("share_token").notNull(), + quantity: integer("quantity").notNull(), + status: text("status").notNull().default("active"), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), + updatedAt: text("updated_at").notNull().default(sql`CURRENT_TIMESTAMP`), + revokedAt: text("revoked_at"), + }, + (table) => [ + uniqueIndex("delegation_bundles_share_token_idx").on(table.shareToken), + index("delegation_bundles_claim_created_idx").on( + table.claimId, + table.createdAt, + ), + ], +); + +export const distributions = sqliteTable("distributions", { + id: text("id").primaryKey(), + taskId: text("task_id").notNull(), + contentId: text("content_id").notNull(), + partnerId: text("partner_id").notNull(), + claimId: text("claim_id"), + delegationBundleId: text("delegation_bundle_id"), + accountId: text("account_id"), + publishUrl: text("publish_url"), + publishTime: text("publish_time"), + publishScreenshotKey: text("publish_screenshot_key"), + status: text("status").notNull().default("claimed"), + claimedAt: text("claimed_at").notNull().default(sql`CURRENT_TIMESTAMP`), + screenshotKey: text("screenshot_key"), + ocrStatus: text("ocr_status").notNull().default("none"), + exposure: integer("exposure"), + views: integer("views"), + d2Likes: integer("d2_likes"), + d2Comments: integer("d2_comments"), + d2Collects: integer("d2_collects"), + d5Likes: integer("d5_likes"), + d5Comments: integer("d5_comments"), + d5Collects: integer("d5_collects"), + d7Likes: integer("d7_likes"), + d7Comments: integer("d7_comments"), + d7Collects: integer("d7_collects"), + latestLikes: integer("latest_likes"), + latestComments: integer("latest_comments"), + latestCollects: integer("latest_collects"), + collectionStatus: text("collection_status").notNull().default("pending"), + collectionStatusDescription: text("collection_status_description"), + collectionUpdatedAt: text("collection_updated_at"), + lastCollectionDay: integer("last_collection_day"), + updatedAt: text("updated_at").notNull().default(sql`CURRENT_TIMESTAMP`), +}); + +export const collectionRuns = sqliteTable( + "collection_runs", + { + id: text("id").primaryKey(), + taskId: text("task_id").notNull(), + distributionId: text("distribution_id").notNull(), + scheduledDate: text("scheduled_date").notNull(), + scheduleDay: integer("schedule_day"), + scheduledAt: text("scheduled_at").notNull(), + status: text("status").notNull().default("pending"), + likes: integer("likes"), + comments: integer("comments"), + collects: integer("collects"), + statusDescription: text("status_description"), + startedAt: text("started_at"), + completedAt: text("completed_at"), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), + }, + (table) => [ + uniqueIndex("collection_runs_distribution_date_idx").on( + table.distributionId, + table.scheduledDate, + ), + index("collection_runs_task_date_idx").on( + table.taskId, + table.scheduledDate, + ), + ], +); diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..c2b2f34 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + out: "./drizzle", + schema: "./db/schema.ts", + dialect: "sqlite", +}); diff --git a/drizzle/0000_pink_iron_monger.sql b/drizzle/0000_pink_iron_monger.sql new file mode 100644 index 0000000..46fadf7 --- /dev/null +++ b/drizzle/0000_pink_iron_monger.sql @@ -0,0 +1,71 @@ +CREATE TABLE `accounts` ( + `id` text PRIMARY KEY NOT NULL, + `platform` text DEFAULT '小红书' NOT NULL, + `platform_uid` text NOT NULL, + `nickname` text NOT NULL, + `profile_url` text DEFAULT '' NOT NULL, + `ip_location` text DEFAULT '待识别' NOT NULL, + `followers` integer DEFAULT 0 NOT NULL, + `post_count` integer DEFAULT 0 NOT NULL, + `avg_views` integer DEFAULT 0 NOT NULL, + `first_seen_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL, + `last_seen_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `accounts_platform_uid_idx` ON `accounts` (`platform`,`platform_uid`);--> statement-breakpoint +CREATE TABLE `contents` ( + `id` text PRIMARY KEY NOT NULL, + `task_id` text NOT NULL, + `title` text NOT NULL, + `body` text DEFAULT '' NOT NULL, + `status` text DEFAULT 'available' NOT NULL, + `source` text DEFAULT '飞书内容表' NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL +); +--> statement-breakpoint +CREATE TABLE `distributions` ( + `id` text PRIMARY KEY NOT NULL, + `task_id` text NOT NULL, + `content_id` text NOT NULL, + `partner_id` text NOT NULL, + `account_id` text, + `publish_url` text, + `publish_time` text, + `status` text DEFAULT 'claimed' NOT NULL, + `claimed_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL, + `screenshot_key` text, + `ocr_status` text DEFAULT 'none' NOT NULL, + `exposure` integer, + `views` integer, + `d2_likes` integer, + `d2_comments` integer, + `d2_collects` integer, + `d5_likes` integer, + `d5_comments` integer, + `d5_collects` integer, + `d7_likes` integer, + `d7_comments` integer, + `d7_collects` integer, + `updated_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL +); +--> statement-breakpoint +CREATE TABLE `partners` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `wecom_name` text NOT NULL, + `owner` text DEFAULT '运营组' NOT NULL, + `claimed_total` integer DEFAULT 0 NOT NULL, + `completed_total` integer DEFAULT 0 NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL +); +--> statement-breakpoint +CREATE TABLE `tasks` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `brand` text NOT NULL, + `quantity` integer NOT NULL, + `claimed_quantity` integer DEFAULT 0 NOT NULL, + `due_at` text NOT NULL, + `status` text DEFAULT 'active' NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL +); diff --git a/drizzle/0001_sloppy_blue_blade.sql b/drizzle/0001_sloppy_blue_blade.sql new file mode 100644 index 0000000..cf0e04e --- /dev/null +++ b/drizzle/0001_sloppy_blue_blade.sql @@ -0,0 +1,5 @@ +ALTER TABLE `contents` ADD `source_row` integer;--> statement-breakpoint +ALTER TABLE `tasks` ADD `source_url` text DEFAULT '' NOT NULL;--> statement-breakpoint +ALTER TABLE `tasks` ADD `source_sheet_id` text DEFAULT '' NOT NULL;--> statement-breakpoint +ALTER TABLE `tasks` ADD `source_sheet_name` text DEFAULT '' NOT NULL;--> statement-breakpoint +ALTER TABLE `tasks` ADD `source_synced_at` text; \ No newline at end of file diff --git a/drizzle/0002_wealthy_maelstrom.sql b/drizzle/0002_wealthy_maelstrom.sql new file mode 100644 index 0000000..9023b1e --- /dev/null +++ b/drizzle/0002_wealthy_maelstrom.sql @@ -0,0 +1,15 @@ +CREATE TABLE `claims` ( + `id` text PRIMARY KEY NOT NULL, + `task_id` text NOT NULL, + `partner_id` text NOT NULL, + `claimant_name` text NOT NULL, + `claim_token` text NOT NULL, + `quantity` integer NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `claims_claim_token_idx` ON `claims` (`claim_token`);--> statement-breakpoint +ALTER TABLE `distributions` ADD `claim_id` text;--> statement-breakpoint +ALTER TABLE `distributions` ADD `publish_screenshot_key` text;--> statement-breakpoint +ALTER TABLE `tasks` ADD `share_token` text;--> statement-breakpoint +CREATE UNIQUE INDEX `tasks_share_token_idx` ON `tasks` (`share_token`); \ No newline at end of file diff --git a/drizzle/0003_needy_doctor_strange.sql b/drizzle/0003_needy_doctor_strange.sql new file mode 100644 index 0000000..c98df33 --- /dev/null +++ b/drizzle/0003_needy_doctor_strange.sql @@ -0,0 +1,2 @@ +ALTER TABLE `contents` ADD `image_assets` text DEFAULT '[]' NOT NULL;--> statement-breakpoint +CREATE INDEX `claims_task_partner_created_idx` ON `claims` (`task_id`,`partner_id`,`created_at`); \ No newline at end of file diff --git a/drizzle/0004_sharp_the_liberteens.sql b/drizzle/0004_sharp_the_liberteens.sql new file mode 100644 index 0000000..8e807bd --- /dev/null +++ b/drizzle/0004_sharp_the_liberteens.sql @@ -0,0 +1,29 @@ +CREATE TABLE `collection_runs` ( + `id` text PRIMARY KEY NOT NULL, + `task_id` text NOT NULL, + `distribution_id` text NOT NULL, + `scheduled_date` text NOT NULL, + `schedule_day` integer, + `scheduled_at` text NOT NULL, + `status` text DEFAULT 'pending' NOT NULL, + `likes` integer, + `comments` integer, + `collects` integer, + `status_description` text, + `started_at` text, + `completed_at` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `collection_runs_distribution_date_idx` ON `collection_runs` (`distribution_id`,`scheduled_date`);--> statement-breakpoint +CREATE INDEX `collection_runs_task_date_idx` ON `collection_runs` (`task_id`,`scheduled_date`);--> statement-breakpoint +ALTER TABLE `distributions` ADD `latest_likes` integer;--> statement-breakpoint +ALTER TABLE `distributions` ADD `latest_comments` integer;--> statement-breakpoint +ALTER TABLE `distributions` ADD `latest_collects` integer;--> statement-breakpoint +ALTER TABLE `distributions` ADD `collection_status` text DEFAULT 'pending' NOT NULL;--> statement-breakpoint +ALTER TABLE `distributions` ADD `collection_status_description` text;--> statement-breakpoint +ALTER TABLE `distributions` ADD `collection_updated_at` text;--> statement-breakpoint +ALTER TABLE `distributions` ADD `last_collection_day` integer;--> statement-breakpoint +ALTER TABLE `tasks` ADD `collection_start_date` text;--> statement-breakpoint +ALTER TABLE `tasks` ADD `collection_days` text DEFAULT '[]' NOT NULL;--> statement-breakpoint +ALTER TABLE `tasks` ADD `collection_schedule_updated_at` text; \ No newline at end of file diff --git a/drizzle/0005_foamy_sage.sql b/drizzle/0005_foamy_sage.sql new file mode 100644 index 0000000..85a762e --- /dev/null +++ b/drizzle/0005_foamy_sage.sql @@ -0,0 +1 @@ +ALTER TABLE `accounts` ADD `public_account_id` text DEFAULT '' NOT NULL; \ No newline at end of file diff --git a/drizzle/0006_moaning_dark_phoenix.sql b/drizzle/0006_moaning_dark_phoenix.sql new file mode 100644 index 0000000..c88eef9 --- /dev/null +++ b/drizzle/0006_moaning_dark_phoenix.sql @@ -0,0 +1,17 @@ +CREATE TABLE `delegation_bundles` ( + `id` text PRIMARY KEY NOT NULL, + `task_id` text NOT NULL, + `claim_id` text NOT NULL, + `partner_id` text NOT NULL, + `label` text NOT NULL, + `share_token` text NOT NULL, + `quantity` integer NOT NULL, + `status` text DEFAULT 'active' NOT NULL, + `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL, + `updated_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL, + `revoked_at` text +); +--> statement-breakpoint +CREATE UNIQUE INDEX `delegation_bundles_share_token_idx` ON `delegation_bundles` (`share_token`);--> statement-breakpoint +CREATE INDEX `delegation_bundles_claim_created_idx` ON `delegation_bundles` (`claim_id`,`created_at`);--> statement-breakpoint +ALTER TABLE `distributions` ADD `delegation_bundle_id` text; \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..945f36a --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,492 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "32f31f92-71f7-4ee9-837f-de02bfa9b64e", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'小红书'" + }, + "platform_uid": { + "name": "platform_uid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nickname": { + "name": "nickname", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_url": { + "name": "profile_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "ip_location": { + "name": "ip_location", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'待识别'" + }, + "followers": { + "name": "followers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "post_count": { + "name": "post_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "avg_views": { + "name": "avg_views", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "accounts_platform_uid_idx": { + "name": "accounts_platform_uid_idx", + "columns": [ + "platform", + "platform_uid" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "contents": { + "name": "contents", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'飞书内容表'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "distributions": { + "name": "distributions", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_url": { + "name": "publish_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_time": { + "name": "publish_time", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'claimed'" + }, + "claimed_at": { + "name": "claimed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "screenshot_key": { + "name": "screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ocr_status": { + "name": "ocr_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'none'" + }, + "exposure": { + "name": "exposure", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "views": { + "name": "views", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_likes": { + "name": "d2_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_comments": { + "name": "d2_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_collects": { + "name": "d2_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_likes": { + "name": "d5_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_comments": { + "name": "d5_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_collects": { + "name": "d5_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_likes": { + "name": "d7_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_comments": { + "name": "d7_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_collects": { + "name": "d7_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "partners": { + "name": "partners", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wecom_name": { + "name": "wecom_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'运营组'" + }, + "claimed_total": { + "name": "claimed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "completed_total": { + "name": "completed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tasks": { + "name": "tasks", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "brand": { + "name": "brand", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimed_quantity": { + "name": "claimed_quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "due_at": { + "name": "due_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json new file mode 100644 index 0000000..95ac5bc --- /dev/null +++ b/drizzle/meta/0001_snapshot.json @@ -0,0 +1,530 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "30c1e381-2dbf-4c90-8e57-5453bcbd4433", + "prevId": "32f31f92-71f7-4ee9-837f-de02bfa9b64e", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'小红书'" + }, + "platform_uid": { + "name": "platform_uid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nickname": { + "name": "nickname", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_url": { + "name": "profile_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "ip_location": { + "name": "ip_location", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'待识别'" + }, + "followers": { + "name": "followers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "post_count": { + "name": "post_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "avg_views": { + "name": "avg_views", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "accounts_platform_uid_idx": { + "name": "accounts_platform_uid_idx", + "columns": [ + "platform", + "platform_uid" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "contents": { + "name": "contents", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'飞书内容表'" + }, + "source_row": { + "name": "source_row", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "distributions": { + "name": "distributions", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_url": { + "name": "publish_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_time": { + "name": "publish_time", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'claimed'" + }, + "claimed_at": { + "name": "claimed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "screenshot_key": { + "name": "screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ocr_status": { + "name": "ocr_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'none'" + }, + "exposure": { + "name": "exposure", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "views": { + "name": "views", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_likes": { + "name": "d2_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_comments": { + "name": "d2_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_collects": { + "name": "d2_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_likes": { + "name": "d5_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_comments": { + "name": "d5_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_collects": { + "name": "d5_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_likes": { + "name": "d7_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_comments": { + "name": "d7_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_collects": { + "name": "d7_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "partners": { + "name": "partners", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wecom_name": { + "name": "wecom_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'运营组'" + }, + "claimed_total": { + "name": "claimed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "completed_total": { + "name": "completed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tasks": { + "name": "tasks", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "brand": { + "name": "brand", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimed_quantity": { + "name": "claimed_quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "due_at": { + "name": "due_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_id": { + "name": "source_sheet_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_name": { + "name": "source_sheet_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_synced_at": { + "name": "source_synced_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json new file mode 100644 index 0000000..06d943d --- /dev/null +++ b/drizzle/meta/0002_snapshot.json @@ -0,0 +1,627 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "d8b5dda6-de54-4b63-9bdf-a26c09723eed", + "prevId": "30c1e381-2dbf-4c90-8e57-5453bcbd4433", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'小红书'" + }, + "platform_uid": { + "name": "platform_uid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nickname": { + "name": "nickname", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_url": { + "name": "profile_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "ip_location": { + "name": "ip_location", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'待识别'" + }, + "followers": { + "name": "followers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "post_count": { + "name": "post_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "avg_views": { + "name": "avg_views", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "accounts_platform_uid_idx": { + "name": "accounts_platform_uid_idx", + "columns": [ + "platform", + "platform_uid" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "claims": { + "name": "claims", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimant_name": { + "name": "claimant_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_token": { + "name": "claim_token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "claims_claim_token_idx": { + "name": "claims_claim_token_idx", + "columns": [ + "claim_token" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "contents": { + "name": "contents", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'飞书内容表'" + }, + "source_row": { + "name": "source_row", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "distributions": { + "name": "distributions", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_id": { + "name": "claim_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_url": { + "name": "publish_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_time": { + "name": "publish_time", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_screenshot_key": { + "name": "publish_screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'claimed'" + }, + "claimed_at": { + "name": "claimed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "screenshot_key": { + "name": "screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ocr_status": { + "name": "ocr_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'none'" + }, + "exposure": { + "name": "exposure", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "views": { + "name": "views", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_likes": { + "name": "d2_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_comments": { + "name": "d2_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_collects": { + "name": "d2_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_likes": { + "name": "d5_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_comments": { + "name": "d5_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_collects": { + "name": "d5_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_likes": { + "name": "d7_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_comments": { + "name": "d7_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_collects": { + "name": "d7_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "partners": { + "name": "partners", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wecom_name": { + "name": "wecom_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'运营组'" + }, + "claimed_total": { + "name": "claimed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "completed_total": { + "name": "completed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tasks": { + "name": "tasks", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "brand": { + "name": "brand", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimed_quantity": { + "name": "claimed_quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "due_at": { + "name": "due_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_id": { + "name": "source_sheet_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_name": { + "name": "source_sheet_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_synced_at": { + "name": "source_synced_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "share_token": { + "name": "share_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "tasks_share_token_idx": { + "name": "tasks_share_token_idx", + "columns": [ + "share_token" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0003_snapshot.json b/drizzle/meta/0003_snapshot.json new file mode 100644 index 0000000..8ada278 --- /dev/null +++ b/drizzle/meta/0003_snapshot.json @@ -0,0 +1,644 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "952052cf-d574-4c9e-abe3-36d27be39564", + "prevId": "d8b5dda6-de54-4b63-9bdf-a26c09723eed", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'小红书'" + }, + "platform_uid": { + "name": "platform_uid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nickname": { + "name": "nickname", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_url": { + "name": "profile_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "ip_location": { + "name": "ip_location", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'待识别'" + }, + "followers": { + "name": "followers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "post_count": { + "name": "post_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "avg_views": { + "name": "avg_views", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "accounts_platform_uid_idx": { + "name": "accounts_platform_uid_idx", + "columns": [ + "platform", + "platform_uid" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "claims": { + "name": "claims", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimant_name": { + "name": "claimant_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_token": { + "name": "claim_token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "claims_claim_token_idx": { + "name": "claims_claim_token_idx", + "columns": [ + "claim_token" + ], + "isUnique": true + }, + "claims_task_partner_created_idx": { + "name": "claims_task_partner_created_idx", + "columns": [ + "task_id", + "partner_id", + "created_at" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "contents": { + "name": "contents", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "image_assets": { + "name": "image_assets", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'飞书内容表'" + }, + "source_row": { + "name": "source_row", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "distributions": { + "name": "distributions", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_id": { + "name": "claim_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_url": { + "name": "publish_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_time": { + "name": "publish_time", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_screenshot_key": { + "name": "publish_screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'claimed'" + }, + "claimed_at": { + "name": "claimed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "screenshot_key": { + "name": "screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ocr_status": { + "name": "ocr_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'none'" + }, + "exposure": { + "name": "exposure", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "views": { + "name": "views", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_likes": { + "name": "d2_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_comments": { + "name": "d2_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_collects": { + "name": "d2_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_likes": { + "name": "d5_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_comments": { + "name": "d5_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_collects": { + "name": "d5_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_likes": { + "name": "d7_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_comments": { + "name": "d7_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_collects": { + "name": "d7_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "partners": { + "name": "partners", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wecom_name": { + "name": "wecom_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'运营组'" + }, + "claimed_total": { + "name": "claimed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "completed_total": { + "name": "completed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tasks": { + "name": "tasks", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "brand": { + "name": "brand", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimed_quantity": { + "name": "claimed_quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "due_at": { + "name": "due_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_id": { + "name": "source_sheet_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_name": { + "name": "source_sheet_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_synced_at": { + "name": "source_synced_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "share_token": { + "name": "share_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "tasks_share_token_idx": { + "name": "tasks_share_token_idx", + "columns": [ + "share_token" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0004_snapshot.json b/drizzle/meta/0004_snapshot.json new file mode 100644 index 0000000..8db90fd --- /dev/null +++ b/drizzle/meta/0004_snapshot.json @@ -0,0 +1,843 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "54454371-d917-4b00-b1b3-1cd5947f801b", + "prevId": "952052cf-d574-4c9e-abe3-36d27be39564", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'小红书'" + }, + "platform_uid": { + "name": "platform_uid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "nickname": { + "name": "nickname", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_url": { + "name": "profile_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "ip_location": { + "name": "ip_location", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'待识别'" + }, + "followers": { + "name": "followers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "post_count": { + "name": "post_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "avg_views": { + "name": "avg_views", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "accounts_platform_uid_idx": { + "name": "accounts_platform_uid_idx", + "columns": [ + "platform", + "platform_uid" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "claims": { + "name": "claims", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimant_name": { + "name": "claimant_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_token": { + "name": "claim_token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "claims_claim_token_idx": { + "name": "claims_claim_token_idx", + "columns": [ + "claim_token" + ], + "isUnique": true + }, + "claims_task_partner_created_idx": { + "name": "claims_task_partner_created_idx", + "columns": [ + "task_id", + "partner_id", + "created_at" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "collection_runs": { + "name": "collection_runs", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "distribution_id": { + "name": "distribution_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "scheduled_date": { + "name": "scheduled_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "schedule_day": { + "name": "schedule_day", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scheduled_at": { + "name": "scheduled_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "likes": { + "name": "likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "comments": { + "name": "comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collects": { + "name": "collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status_description": { + "name": "status_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "started_at": { + "name": "started_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "completed_at": { + "name": "completed_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "collection_runs_distribution_date_idx": { + "name": "collection_runs_distribution_date_idx", + "columns": [ + "distribution_id", + "scheduled_date" + ], + "isUnique": true + }, + "collection_runs_task_date_idx": { + "name": "collection_runs_task_date_idx", + "columns": [ + "task_id", + "scheduled_date" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "contents": { + "name": "contents", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "image_assets": { + "name": "image_assets", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'飞书内容表'" + }, + "source_row": { + "name": "source_row", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "distributions": { + "name": "distributions", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_id": { + "name": "claim_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_url": { + "name": "publish_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_time": { + "name": "publish_time", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_screenshot_key": { + "name": "publish_screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'claimed'" + }, + "claimed_at": { + "name": "claimed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "screenshot_key": { + "name": "screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ocr_status": { + "name": "ocr_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'none'" + }, + "exposure": { + "name": "exposure", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "views": { + "name": "views", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_likes": { + "name": "d2_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_comments": { + "name": "d2_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_collects": { + "name": "d2_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_likes": { + "name": "d5_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_comments": { + "name": "d5_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_collects": { + "name": "d5_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_likes": { + "name": "d7_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_comments": { + "name": "d7_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_collects": { + "name": "d7_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_likes": { + "name": "latest_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_comments": { + "name": "latest_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_collects": { + "name": "latest_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_status": { + "name": "collection_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "collection_status_description": { + "name": "collection_status_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_updated_at": { + "name": "collection_updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_collection_day": { + "name": "last_collection_day", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "partners": { + "name": "partners", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wecom_name": { + "name": "wecom_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'运营组'" + }, + "claimed_total": { + "name": "claimed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "completed_total": { + "name": "completed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tasks": { + "name": "tasks", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "brand": { + "name": "brand", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimed_quantity": { + "name": "claimed_quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "due_at": { + "name": "due_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_id": { + "name": "source_sheet_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_name": { + "name": "source_sheet_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_synced_at": { + "name": "source_synced_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "share_token": { + "name": "share_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_start_date": { + "name": "collection_start_date", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_days": { + "name": "collection_days", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "collection_schedule_updated_at": { + "name": "collection_schedule_updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "tasks_share_token_idx": { + "name": "tasks_share_token_idx", + "columns": [ + "share_token" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0005_snapshot.json b/drizzle/meta/0005_snapshot.json new file mode 100644 index 0000000..dc6079e --- /dev/null +++ b/drizzle/meta/0005_snapshot.json @@ -0,0 +1,851 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "6db5592e-9523-4444-9be9-3354c616c341", + "prevId": "54454371-d917-4b00-b1b3-1cd5947f801b", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'小红书'" + }, + "platform_uid": { + "name": "platform_uid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "public_account_id": { + "name": "public_account_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "nickname": { + "name": "nickname", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_url": { + "name": "profile_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "ip_location": { + "name": "ip_location", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'待识别'" + }, + "followers": { + "name": "followers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "post_count": { + "name": "post_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "avg_views": { + "name": "avg_views", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "accounts_platform_uid_idx": { + "name": "accounts_platform_uid_idx", + "columns": [ + "platform", + "platform_uid" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "claims": { + "name": "claims", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimant_name": { + "name": "claimant_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_token": { + "name": "claim_token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "claims_claim_token_idx": { + "name": "claims_claim_token_idx", + "columns": [ + "claim_token" + ], + "isUnique": true + }, + "claims_task_partner_created_idx": { + "name": "claims_task_partner_created_idx", + "columns": [ + "task_id", + "partner_id", + "created_at" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "collection_runs": { + "name": "collection_runs", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "distribution_id": { + "name": "distribution_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "scheduled_date": { + "name": "scheduled_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "schedule_day": { + "name": "schedule_day", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scheduled_at": { + "name": "scheduled_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "likes": { + "name": "likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "comments": { + "name": "comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collects": { + "name": "collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status_description": { + "name": "status_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "started_at": { + "name": "started_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "completed_at": { + "name": "completed_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "collection_runs_distribution_date_idx": { + "name": "collection_runs_distribution_date_idx", + "columns": [ + "distribution_id", + "scheduled_date" + ], + "isUnique": true + }, + "collection_runs_task_date_idx": { + "name": "collection_runs_task_date_idx", + "columns": [ + "task_id", + "scheduled_date" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "contents": { + "name": "contents", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "image_assets": { + "name": "image_assets", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'飞书内容表'" + }, + "source_row": { + "name": "source_row", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "distributions": { + "name": "distributions", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_id": { + "name": "claim_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_url": { + "name": "publish_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_time": { + "name": "publish_time", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_screenshot_key": { + "name": "publish_screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'claimed'" + }, + "claimed_at": { + "name": "claimed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "screenshot_key": { + "name": "screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ocr_status": { + "name": "ocr_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'none'" + }, + "exposure": { + "name": "exposure", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "views": { + "name": "views", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_likes": { + "name": "d2_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_comments": { + "name": "d2_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_collects": { + "name": "d2_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_likes": { + "name": "d5_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_comments": { + "name": "d5_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_collects": { + "name": "d5_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_likes": { + "name": "d7_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_comments": { + "name": "d7_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_collects": { + "name": "d7_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_likes": { + "name": "latest_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_comments": { + "name": "latest_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_collects": { + "name": "latest_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_status": { + "name": "collection_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "collection_status_description": { + "name": "collection_status_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_updated_at": { + "name": "collection_updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_collection_day": { + "name": "last_collection_day", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "partners": { + "name": "partners", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wecom_name": { + "name": "wecom_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'运营组'" + }, + "claimed_total": { + "name": "claimed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "completed_total": { + "name": "completed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tasks": { + "name": "tasks", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "brand": { + "name": "brand", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimed_quantity": { + "name": "claimed_quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "due_at": { + "name": "due_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_id": { + "name": "source_sheet_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_name": { + "name": "source_sheet_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_synced_at": { + "name": "source_synced_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "share_token": { + "name": "share_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_start_date": { + "name": "collection_start_date", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_days": { + "name": "collection_days", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "collection_schedule_updated_at": { + "name": "collection_schedule_updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "tasks_share_token_idx": { + "name": "tasks_share_token_idx", + "columns": [ + "share_token" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0006_snapshot.json b/drizzle/meta/0006_snapshot.json new file mode 100644 index 0000000..b1020cf --- /dev/null +++ b/drizzle/meta/0006_snapshot.json @@ -0,0 +1,964 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "1d95532b-30a7-4a2e-b4d6-ea812d642fee", + "prevId": "6db5592e-9523-4444-9be9-3354c616c341", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'小红书'" + }, + "platform_uid": { + "name": "platform_uid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "public_account_id": { + "name": "public_account_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "nickname": { + "name": "nickname", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "profile_url": { + "name": "profile_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "ip_location": { + "name": "ip_location", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'待识别'" + }, + "followers": { + "name": "followers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "post_count": { + "name": "post_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "avg_views": { + "name": "avg_views", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "accounts_platform_uid_idx": { + "name": "accounts_platform_uid_idx", + "columns": [ + "platform", + "platform_uid" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "claims": { + "name": "claims", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimant_name": { + "name": "claimant_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_token": { + "name": "claim_token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "claims_claim_token_idx": { + "name": "claims_claim_token_idx", + "columns": [ + "claim_token" + ], + "isUnique": true + }, + "claims_task_partner_created_idx": { + "name": "claims_task_partner_created_idx", + "columns": [ + "task_id", + "partner_id", + "created_at" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "collection_runs": { + "name": "collection_runs", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "distribution_id": { + "name": "distribution_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "scheduled_date": { + "name": "scheduled_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "schedule_day": { + "name": "schedule_day", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scheduled_at": { + "name": "scheduled_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "likes": { + "name": "likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "comments": { + "name": "comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collects": { + "name": "collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status_description": { + "name": "status_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "started_at": { + "name": "started_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "completed_at": { + "name": "completed_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "collection_runs_distribution_date_idx": { + "name": "collection_runs_distribution_date_idx", + "columns": [ + "distribution_id", + "scheduled_date" + ], + "isUnique": true + }, + "collection_runs_task_date_idx": { + "name": "collection_runs_task_date_idx", + "columns": [ + "task_id", + "scheduled_date" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "contents": { + "name": "contents", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "image_assets": { + "name": "image_assets", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'available'" + }, + "source": { + "name": "source", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'飞书内容表'" + }, + "source_row": { + "name": "source_row", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "delegation_bundles": { + "name": "delegation_bundles", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_id": { + "name": "claim_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "share_token": { + "name": "share_token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "revoked_at": { + "name": "revoked_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "delegation_bundles_share_token_idx": { + "name": "delegation_bundles_share_token_idx", + "columns": [ + "share_token" + ], + "isUnique": true + }, + "delegation_bundles_claim_created_idx": { + "name": "delegation_bundles_claim_created_idx", + "columns": [ + "claim_id", + "created_at" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "distributions": { + "name": "distributions", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "task_id": { + "name": "task_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "content_id": { + "name": "content_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "partner_id": { + "name": "partner_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claim_id": { + "name": "claim_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "delegation_bundle_id": { + "name": "delegation_bundle_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_url": { + "name": "publish_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_time": { + "name": "publish_time", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "publish_screenshot_key": { + "name": "publish_screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'claimed'" + }, + "claimed_at": { + "name": "claimed_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "screenshot_key": { + "name": "screenshot_key", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "ocr_status": { + "name": "ocr_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'none'" + }, + "exposure": { + "name": "exposure", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "views": { + "name": "views", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_likes": { + "name": "d2_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_comments": { + "name": "d2_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d2_collects": { + "name": "d2_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_likes": { + "name": "d5_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_comments": { + "name": "d5_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d5_collects": { + "name": "d5_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_likes": { + "name": "d7_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_comments": { + "name": "d7_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "d7_collects": { + "name": "d7_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_likes": { + "name": "latest_likes", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_comments": { + "name": "latest_comments", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_collects": { + "name": "latest_collects", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_status": { + "name": "collection_status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "collection_status_description": { + "name": "collection_status_description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_updated_at": { + "name": "collection_updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "last_collection_day": { + "name": "last_collection_day", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "partners": { + "name": "partners", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "wecom_name": { + "name": "wecom_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "owner": { + "name": "owner", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'运营组'" + }, + "claimed_total": { + "name": "claimed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "completed_total": { + "name": "completed_total", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "tasks": { + "name": "tasks", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "brand": { + "name": "brand", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "quantity": { + "name": "quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "claimed_quantity": { + "name": "claimed_quantity", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "due_at": { + "name": "due_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_id": { + "name": "source_sheet_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_sheet_name": { + "name": "source_sheet_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "''" + }, + "source_synced_at": { + "name": "source_synced_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "share_token": { + "name": "share_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_start_date": { + "name": "collection_start_date", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "collection_days": { + "name": "collection_days", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "collection_schedule_updated_at": { + "name": "collection_schedule_updated_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + } + }, + "indexes": { + "tasks_share_token_idx": { + "name": "tasks_share_token_idx", + "columns": [ + "share_token" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 0000000..24f9a95 --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,55 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1785134871732, + "tag": "0000_pink_iron_monger", + "breakpoints": true + }, + { + "idx": 1, + "version": "6", + "when": 1785152017151, + "tag": "0001_sloppy_blue_blade", + "breakpoints": true + }, + { + "idx": 2, + "version": "6", + "when": 1785159119072, + "tag": "0002_wealthy_maelstrom", + "breakpoints": true + }, + { + "idx": 3, + "version": "6", + "when": 1785163928142, + "tag": "0003_needy_doctor_strange", + "breakpoints": true + }, + { + "idx": 4, + "version": "6", + "when": 1785230464686, + "tag": "0004_sharp_the_liberteens", + "breakpoints": true + }, + { + "idx": 5, + "version": "6", + "when": 1785295052381, + "tag": "0005_foamy_sage", + "breakpoints": true + }, + { + "idx": 6, + "version": "6", + "when": 1785380450391, + "tag": "0006_moaning_dark_phoenix", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..25f34fe --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,19 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "koc-portal/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/examples/d1/app/api/notes/route.ts b/examples/d1/app/api/notes/route.ts new file mode 100644 index 0000000..07f8318 --- /dev/null +++ b/examples/d1/app/api/notes/route.ts @@ -0,0 +1,58 @@ +import { desc } from "drizzle-orm"; +import { getDb } from "../../../../../db"; +import { notes } from "../../../db/schema"; + +function toRouteErrorMessage(error: unknown) { + const message = error instanceof Error ? error.message : "Unexpected error"; + const detail = + error instanceof Error && error.cause instanceof Error ? error.cause.message : ""; + const combined = `${message}\n${detail}`; + + if (combined.includes("no such table") || combined.includes('from "notes"')) { + return "The notes table is unavailable. Generate the migration locally with `npm run db:generate`, then deploy so the platform can apply the generated SQL to the real D1 database."; + } + + return message; +} + +export async function GET() { + try { + const db = getDb(); + const rows = await db + .select() + .from(notes) + .orderBy(desc(notes.createdAt), desc(notes.id)) + .limit(20); + + return Response.json({ notes: rows }); + } catch (error) { + return Response.json( + { error: toRouteErrorMessage(error) }, + { status: 500 } + ); + } +} + +export async function POST(request: Request) { + try { + const payload = (await request.json()) as { + title?: string; + content?: string; + }; + const title = payload.title?.trim() ?? ""; + const content = payload.content?.trim() ?? ""; + + if (!title) { + return Response.json({ error: "title is required" }, { status: 400 }); + } + + const db = getDb(); + const [note] = await db.insert(notes).values({ title, content }).returning(); + return Response.json({ note }, { status: 201 }); + } catch (error) { + return Response.json( + { error: toRouteErrorMessage(error) }, + { status: 500 } + ); + } +} diff --git a/examples/d1/db/schema.ts b/examples/d1/db/schema.ts new file mode 100644 index 0000000..7bb0c15 --- /dev/null +++ b/examples/d1/db/schema.ts @@ -0,0 +1,9 @@ +import { sql } from "drizzle-orm"; +import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core"; + +export const notes = sqliteTable("notes", { + id: integer("id").primaryKey({ autoIncrement: true }), + title: text("title").notNull(), + content: text("content").notNull().default(""), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), +}); diff --git a/koc-portal/.gitignore b/koc-portal/.gitignore new file mode 100644 index 0000000..266f3e4 --- /dev/null +++ b/koc-portal/.gitignore @@ -0,0 +1,43 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/.vinext/ +/out/ + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* +.dev.vars + +# vercel +.vercel + +# typescript +next-env.d.ts +/dist/ +/.wrangler/ +/outputs/ +/work/ diff --git a/koc-portal/.openai/hosting.json b/koc-portal/.openai/hosting.json new file mode 100644 index 0000000..7b92b3c --- /dev/null +++ b/koc-portal/.openai/hosting.json @@ -0,0 +1,5 @@ +{ + "project_id": "appgprj_6a6760b6f5bc8191ae5baf5cfed80804", + "d1": null, + "r2": null +} diff --git a/koc-portal/README.md b/koc-portal/README.md new file mode 100644 index 0000000..b795f97 --- /dev/null +++ b/koc-portal/README.md @@ -0,0 +1,21 @@ +# KOC LOOP 外部任务门户 + +独立公开站点,用于把后台分发任务发给外部 KOC。 + +## MVP 流程 + +1. KOC 通过带 `task` 参数的任务链接进入。 +2. 只填写企微昵称/联系人和领取数量。 +3. 领取后只能看到本次领取的笔记。 +4. 在单篇笔记详情页查看标题与正文,并一一回填发布账号昵称、发布链接和发布截图。 + +门户不直接连接数据库。浏览器只调用后台隔离开放的 KOC 领取与回填接口,后台仍是任务、笔记和发布数据的唯一数据源;后台管理页面和管理接口需要管理员登录。 + +## 本地开发 + +先在 `3001` 端口启动后台,再运行: + +```bash +npm install +npm run dev -- --port 3000 +``` diff --git a/koc-portal/app/chatgpt-auth.ts b/koc-portal/app/chatgpt-auth.ts new file mode 100644 index 0000000..8d1fb35 --- /dev/null +++ b/koc-portal/app/chatgpt-auth.ts @@ -0,0 +1,86 @@ +import { headers } from "next/headers"; +import { redirect } from "next/navigation"; + +export type ChatGPTUser = { + displayName: string; + email: string; + fullName: string | null; +}; + +const USER_EMAIL_HEADER = "oai-authenticated-user-email"; +const USER_FULL_NAME_HEADER = "oai-authenticated-user-full-name"; +const USER_FULL_NAME_ENCODING_HEADER = + "oai-authenticated-user-full-name-encoding"; +const PERCENT_ENCODED_UTF8 = "percent-encoded-utf-8"; +const SIGN_IN_PATH = "/signin-with-chatgpt"; +const SIGN_OUT_PATH = "/signout-with-chatgpt"; +const CALLBACK_PATH = "/callback"; + +export async function getChatGPTUser(): Promise { + const requestHeaders = await headers(); + const email = requestHeaders.get(USER_EMAIL_HEADER); + if (!email) return null; + + const encodedFullName = requestHeaders.get(USER_FULL_NAME_HEADER); + const fullName = + encodedFullName && + requestHeaders.get(USER_FULL_NAME_ENCODING_HEADER) === PERCENT_ENCODED_UTF8 + ? safeDecodeURIComponent(encodedFullName) + : null; + + return { + displayName: fullName ?? email, + email, + fullName, + }; +} + +export async function requireChatGPTUser( + returnTo: string, +): Promise { + const user = await getChatGPTUser(); + if (user) return user; + + redirect(chatGPTSignInPath(returnTo)); +} + +export function chatGPTSignInPath(returnTo: string): string { + const safeReturnTo = safeRelativeReturnPath(returnTo); + return `${SIGN_IN_PATH}?return_to=${encodeURIComponent(safeReturnTo)}`; +} + +export function chatGPTSignOutPath(returnTo = "/"): string { + const safeReturnTo = safeRelativeReturnPath(returnTo); + return `${SIGN_OUT_PATH}?return_to=${encodeURIComponent(safeReturnTo)}`; +} + +function safeRelativeReturnPath(value: string): string { + if (!value.startsWith("/") || value.startsWith("//")) return "/"; + + let url: URL; + try { + url = new URL(value, "https://app.local"); + } catch { + return "/"; + } + if (url.origin !== "https://app.local") return "/"; + if (isReservedAuthPath(url.pathname)) return "/"; + + return `${url.pathname}${url.search}${url.hash}`; +} + +function isReservedAuthPath(pathname: string): boolean { + return ( + pathname === SIGN_IN_PATH || + pathname === SIGN_OUT_PATH || + pathname === CALLBACK_PATH + ); +} + +function safeDecodeURIComponent(value: string): string | null { + try { + return decodeURIComponent(value); + } catch { + return null; + } +} diff --git a/koc-portal/app/date-utils.ts b/koc-portal/app/date-utils.ts new file mode 100644 index 0000000..9220057 --- /dev/null +++ b/koc-portal/app/date-utils.ts @@ -0,0 +1,26 @@ +export function parseStoredDate(value: string) { + const trimmed = value.trim(); + const normalized = /^\d{4}-\d{2}-\d{2}$/.test(trimmed) + ? `${trimmed}T00:00:00+08:00` + : /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?$/.test( + trimmed, + ) + ? `${trimmed.replace(" ", "T")}Z` + : trimmed; + return new Date(normalized); +} + +export function formatShanghaiDate( + value?: string | null, + withTime = false, +) { + if (!value) return "—"; + const date = parseStoredDate(value); + if (Number.isNaN(date.getTime())) return value; + return new Intl.DateTimeFormat("zh-CN", { + timeZone: "Asia/Shanghai", + month: "2-digit", + day: "2-digit", + ...(withTime ? { hour: "2-digit", minute: "2-digit" } : {}), + }).format(date); +} diff --git a/koc-portal/app/globals.css b/koc-portal/app/globals.css new file mode 100644 index 0000000..e8858e9 --- /dev/null +++ b/koc-portal/app/globals.css @@ -0,0 +1,1572 @@ +@import "tailwindcss"; + +:root { + --ink: #15221f; + --ink-soft: #354640; + --green: #1e8d68; + --green-deep: #176e52; + --green-soft: #e7f4ee; + --canvas: #f2f4f1; + --line: #dfe5e1; + --muted: #7f8b87; + --orange: #dd794f; +} + +* { + box-sizing: border-box; +} + +html { + min-height: 100%; + background: var(--canvas); +} + +body { + min-height: 100vh; + margin: 0; + color: var(--ink); + background: + radial-gradient(circle at 8% 4%, rgb(46 153 114 / 0.08), transparent 24%), + var(--canvas); + font-family: var(--font-geist-sans), "PingFang SC", "Microsoft YaHei", sans-serif; + -webkit-font-smoothing: antialiased; +} + +button, +input { + color: inherit; + font: inherit; +} + +button { + cursor: pointer; +} + +button:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +.portal-shell { + width: min(100%, 1120px); + min-height: 100vh; + margin: 0 auto; + padding: 24px 24px 48px; +} + +.portal-topbar { + display: flex; + min-height: 52px; + align-items: center; + justify-content: space-between; +} + +.portal-brand { + display: flex; + align-items: center; + gap: 10px; +} + +.portal-brand > span, +.loading-mark { + display: grid; + width: 34px; + height: 34px; + place-items: center; + border-radius: 10px; + color: white; + background: linear-gradient(145deg, #2e9f77, #176348); + font-size: 13px; + font-weight: 760; + box-shadow: inset 0 1px 0 rgb(255 255 255 / 0.25); +} + +.portal-brand strong { + font-size: 12px; + letter-spacing: 0.12em; +} + +.external-label, +.claimant-chip { + padding: 7px 10px; + border: 1px solid #d8e1dc; + border-radius: 14px; + color: #61706b; + background: rgb(255 255 255 / 0.7); + font-size: 9px; +} + +.micro { + margin: 0 0 8px; + color: var(--green); + font-size: 9px; + font-weight: 760; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.task-hero { + display: grid; + grid-template-columns: minmax(0, 1.4fr) minmax(330px, 0.7fr); + gap: 18px; + margin-top: 22px; +} + +.hero-copy { + display: flex; + min-height: 430px; + justify-content: center; + flex-direction: column; + padding: 46px; + overflow: hidden; + border-radius: 24px; + color: white; + background: + radial-gradient(circle at 85% 12%, rgb(90 218 166 / 0.24), transparent 27%), + linear-gradient(135deg, #12241f, #225b47); + box-shadow: 0 22px 60px rgb(20 50 41 / 0.13); +} + +.hero-copy .micro { + color: #77d3ad; +} + +.hero-copy h1 { + max-width: 680px; + margin: 0; + font-size: clamp(34px, 5vw, 58px); + line-height: 1.08; + letter-spacing: -0.06em; +} + +.hero-copy > p:not(.micro) { + max-width: 530px; + margin: 18px 0 0; + color: #afc9bf; + font-size: 13px; + line-height: 1.8; +} + +.hero-meta { + display: flex; + gap: 8px; + margin-top: 28px; +} + +.hero-meta span { + padding: 8px 10px; + border: 1px solid rgb(255 255 255 / 0.1); + border-radius: 9px; + color: #b8d0c7; + background: rgb(255 255 255 / 0.055); + font-size: 9px; +} + +.claim-card, +.submit-card, +.note-document, +.notes-section, +.message-card { + border: 1px solid var(--line); + border-radius: 20px; + background: white; + box-shadow: 0 1px 2px rgb(15 31 26 / 0.03); +} + +.claim-card { + min-height: 430px; + padding: 28px; +} + +.claim-card > form { + margin-top: 24px; +} + +.entry-switch { + display: grid; + grid-template-columns: 1fr 1fr; + padding: 4px; + border-radius: 11px; + background: #f0f3f1; +} + +.entry-switch button { + height: 34px; + border: 0; + border-radius: 8px; + color: #7d8985; + background: transparent; + font-size: 9px; + font-weight: 680; +} + +.entry-switch button.active { + color: var(--green-deep); + background: white; + box-shadow: 0 2px 8px rgb(21 46 38 / 0.08); +} + +.claim-card h2, +.submit-card h2, +.notes-section h2 { + margin: 0; + font-size: 18px; + letter-spacing: -0.035em; +} + +label { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 25px; +} + +label > span { + color: #5e6d68; + font-size: 10px; + font-weight: 650; +} + +input { + width: 100%; + height: 45px; + padding: 0 13px; + border: 1px solid #d7dfda; + border-radius: 10px; + outline: 0; + background: white; + font-size: 11px; +} + +input:focus { + border-color: #6aab92; + box-shadow: 0 0 0 3px rgb(30 141 104 / 0.09); +} + +.quantity-control { + display: grid; + grid-template-columns: 48px 1fr 48px; + align-items: center; + margin-top: 18px; + padding: 10px; + border-radius: 14px; + background: #f3f6f4; +} + +.quantity-control button { + display: grid; + width: 42px; + height: 42px; + place-items: center; + border: 1px solid #dbe3de; + border-radius: 11px; + background: white; + font-size: 16px; +} + +.quantity-control > div { + display: flex; + align-items: baseline; + justify-content: center; + gap: 5px; +} + +.quantity-control strong { + font-size: 25px; +} + +.quantity-control span { + color: #8c9894; + font-size: 10px; +} + +.claim-primary, +.submit-primary, +.message-card button { + width: 100%; + height: 46px; + margin-top: 18px; + border: 1px solid var(--green-deep); + border-radius: 11px; + color: white; + background: var(--green); + font-size: 11px; + font-weight: 700; +} + +.claim-primary:hover, +.submit-primary:hover { + background: var(--green-deep); +} + +.claim-card small { + display: block; + margin-top: 10px; + color: #99a29f; + font-size: 8px; + text-align: center; +} + +.recover-intro { + margin: 10px 0 0; + color: #7d8985; + font-size: 9px; + line-height: 1.65; +} + +.recovery-list { + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 14px; +} + +.recovery-list > button { + position: relative; + display: grid; + min-height: 78px; + padding: 12px 84px 12px 13px; + border: 1px solid #dfe6e2; + border-radius: 11px; + background: #fbfcfb; + text-align: left; +} + +.recovery-list > button:hover { + border-color: #acd0c1; + background: #f4f9f7; +} + +.recovery-list span { + color: var(--green); + font-size: 8px; + font-weight: 700; +} + +.recovery-list strong { + margin-top: 5px; + overflow: hidden; + font-size: 9px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.recovery-list small { + margin: 4px 0 0; + text-align: left; +} + +.recovery-list i { + position: absolute; + right: 12px; + bottom: 14px; + color: var(--green-deep); + font-size: 8px; + font-style: normal; + font-weight: 700; +} + +.steps { + display: grid; + grid-template-columns: 1fr auto 1fr auto 1fr; + align-items: center; + margin-top: 18px; + padding: 20px 24px; + border: 1px solid var(--line); + border-radius: 17px; + background: rgb(255 255 255 / 0.78); +} + +.steps > div { + display: grid; + grid-template-columns: auto 1fr; + gap: 3px 10px; + align-items: center; +} + +.steps > div > span { + display: grid; + grid-row: 1 / span 2; + width: 31px; + height: 31px; + place-items: center; + border-radius: 9px; + color: var(--green); + background: var(--green-soft); + font-size: 9px; + font-weight: 750; +} + +.steps strong { + font-size: 10px; +} + +.steps p { + margin: 0; + color: #99a29f; + font-size: 8px; +} + +.steps > i { + width: 55px; + height: 1px; + margin: 0 18px; + background: #dce3df; +} + +footer { + padding: 30px 0 0; + color: #a0aaa6; + font-size: 8px; + text-align: center; +} + +.claimed-hero { + display: flex; + min-height: 176px; + align-items: center; + justify-content: space-between; + margin-top: 22px; + padding: 30px 34px; + border-radius: 22px; + color: white; + background: + radial-gradient(circle at 84% 18%, rgb(90 218 166 / 0.22), transparent 28%), + linear-gradient(130deg, #142721, #235b47); +} + +.claimed-hero h1 { + margin: 0; + font-size: clamp(25px, 4vw, 38px); + letter-spacing: -0.05em; +} + +.claimed-hero > div:first-child > p:last-child { + margin: 9px 0 0; + color: #a7c1b7; + font-size: 10px; +} + +.claimed-hero .micro { + color: #74cfa9; +} + +.completion-ring { + display: grid; + width: 90px; + height: 90px; + place-items: center; + border: 6px solid rgb(255 255 255 / 0.13); + border-top-color: #68d1a6; + border-radius: 50%; +} + +.completion-ring strong, +.completion-ring span { + grid-area: 1 / 1; +} + +.completion-ring strong { + margin-top: -12px; + font-size: 17px; +} + +.completion-ring span { + margin-top: 22px; + color: #96b8ab; + font-size: 8px; +} + +.notes-section { + margin-top: 16px; + padding: 22px; +} + +.section-heading { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 15px; +} + +.section-heading p { + margin: 5px 0 0; + color: #929d99; + font-size: 9px; +} + +.section-heading > span { + padding: 6px 9px; + border-radius: 11px; + color: var(--green-deep); + background: var(--green-soft); + font-size: 9px; + font-weight: 700; +} + +.section-actions { + display: flex; + align-items: center; + gap: 9px; +} + +.section-actions > span { + padding: 6px 9px; + border-radius: 11px; + color: var(--green-deep); + background: var(--green-soft); + font-size: 9px; + font-weight: 700; +} + +.section-actions > button { + height: 34px; + padding: 0 13px; + border: 1px solid #bcd5ca; + border-radius: 10px; + color: var(--green-deep); + background: white; + font-size: 9px; + font-weight: 700; +} + +.section-actions > button:hover, +.section-actions > button.active { + color: white; + border-color: var(--green); + background: var(--green); +} + +.section-actions > button:disabled { + color: #a3aca8; + border-color: #e3e8e5; + background: #f5f7f6; + cursor: not-allowed; +} + +.share-composer { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(190px, 0.45fr) auto; + gap: 14px; + align-items: end; + margin: 0 0 16px; + padding: 17px; + border: 1px solid #cfe2d9; + border-radius: 14px; + background: #f4faf7; +} + +.share-composer h3, +.delegation-history h3 { + margin: 2px 0 0; + font-size: 15px; +} + +.share-composer p:not(.micro) { + margin: 6px 0 0; + color: #788680; + font-size: 9px; +} + +.share-composer label { + display: grid; + gap: 6px; + color: #60706a; + font-size: 9px; + font-weight: 650; +} + +.share-composer input { + height: 38px; + padding: 0 11px; + border: 1px solid #cfdbd5; + border-radius: 10px; + color: var(--ink); + background: white; + outline: none; +} + +.share-composer input:focus { + border-color: #76b69d; + box-shadow: 0 0 0 3px rgb(30 141 104 / 0.09); +} + +.share-composer-action { + display: flex; + align-items: center; + gap: 10px; +} + +.share-composer-action strong { + color: var(--green-deep); + font-size: 9px; + white-space: nowrap; +} + +.share-primary { + height: 38px; + padding: 0 15px; + border: 1px solid var(--green); + border-radius: 10px; + color: white; + background: var(--green); + font-size: 9px; + font-weight: 720; +} + +.share-primary:disabled { + border-color: #afcfc2; + background: #afcfc2; + cursor: not-allowed; +} + +.share-composer > small { + grid-column: 1 / -1; + color: #86938e; + font-size: 8px; +} + +.note-list { + display: flex; + flex-direction: column; +} + +.note-row { + display: grid; + grid-template-columns: auto auto minmax(0, 1fr) auto auto; + gap: 13px; + align-items: center; + min-height: 76px; + border-top: 1px solid #edf0ee; +} + +.note-row.share-selecting { + grid-template-columns: auto auto auto minmax(0, 1fr) auto auto; +} + +.share-checkbox { + display: grid; + width: 40px; + height: 40px; + place-items: center; + border-radius: 11px; + cursor: pointer; +} + +.share-checkbox input { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + opacity: 0; + pointer-events: none; +} + +.share-checkbox span { + display: grid; + width: 24px; + height: 24px; + place-items: center; + border: 1px solid #c9d6d0; + border-radius: 7px; + color: transparent; + background: white; + font-size: 12px; + font-weight: 800; +} + +.share-checkbox input:checked + span { + color: white; + border-color: var(--green); + background: var(--green); +} + +.share-checkbox input:focus-visible + span { + outline: 3px solid rgb(30 141 104 / 0.18); + outline-offset: 2px; +} + +.share-checkbox.disabled { + cursor: not-allowed; + opacity: 0.38; +} + +.note-thumb { + display: block; + width: 48px; + height: 48px; + object-fit: contain; + border: 1px solid #edf0ee; + border-radius: 9px; + background: #f5f7f5; +} + +.note-thumb.empty { + place-content: center; + color: #a0aaa6; + font-size: 7px; + text-align: center; +} + +.note-index { + display: grid; + width: 34px; + height: 34px; + place-items: center; + border-radius: 10px; + color: #61716b; + background: #eef2ef; + font-size: 9px; + font-weight: 720; +} + +.note-index.done { + color: white; + background: var(--green); + box-shadow: 0 5px 14px rgb(30 141 104 / 0.18); +} + +.note-row h3 { + margin: 0; + overflow: hidden; + font-size: 11px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.note-row p { + margin: 5px 0 0; + color: #9aa39f; + font-size: 8px; +} + +.note-status { + padding: 6px 8px; + border-radius: 11px; + color: #9a673c; + background: #fff1e5; + font-size: 8px; + font-weight: 650; +} + +.note-status.done { + color: #27775b; + background: #e9f5f0; +} + +.note-status.delegated { + color: #376b79; + background: #e7f3f6; +} + +.note-row button { + height: 31px; + padding: 0 10px; + border: 1px solid #dce4df; + border-radius: 8px; + color: #53645e; + background: white; + font-size: 8px; + font-weight: 650; +} + +.note-row button:hover { + border-color: #b8d3c8; + color: var(--green-deep); + background: #f4f9f7; +} + +.safe-tip { + margin-top: 13px; + color: #909b97; + font-size: 8px; + text-align: center; +} + +.claim-tools { + display: flex; + align-items: center; + gap: 8px; +} + +.claim-tools > button { + height: 30px; + padding: 0 10px; + border: 1px solid #d8e1dc; + border-radius: 10px; + color: #61706b; + background: rgb(255 255 255 / 0.7); + font-size: 8px; +} + +.delegation-history { + margin-top: 18px; + padding-top: 17px; + border-top: 1px solid #edf0ee; +} + +.delegation-heading { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 10px; +} + +.delegation-heading > span { + color: #81908a; + font-size: 9px; +} + +.delegation-list { + display: grid; + gap: 8px; +} + +.delegation-list > article { + display: grid; + grid-template-columns: minmax(0, 1fr) auto auto auto; + gap: 13px; + align-items: center; + min-height: 58px; + padding: 10px 12px; + border: 1px solid #e2e9e5; + border-radius: 12px; + background: #fbfcfb; +} + +.delegation-list > article.revoked { + opacity: 0.58; +} + +.delegation-list > article > div:first-child { + display: grid; + gap: 4px; +} + +.delegation-list strong { + font-size: 10px; +} + +.delegation-list span, +.delegation-list small { + color: #84918c; + font-size: 8px; +} + +.delegation-status { + padding: 5px 7px; + border-radius: 9px; + font-weight: 700; +} + +.delegation-status.active { + color: #28785b; + background: #e8f5ef; +} + +.delegation-status.revoked { + color: #7e8884; + background: #eef1ef; +} + +.delegation-actions { + display: flex; + gap: 6px; +} + +.delegation-actions button { + height: 30px; + padding: 0 10px; + border: 1px solid #cbd8d2; + border-radius: 8px; + color: var(--green-deep); + background: white; + font-size: 8px; + font-weight: 680; +} + +.delegation-actions button.danger { + color: #a25e45; + border-color: #eed1c5; +} + +.detail-shell { + width: min(100%, 1220px); +} + +.back-link { + margin: 18px 0 12px; + padding: 6px 0; + border: 0; + color: #65736e; + background: transparent; + font-size: 9px; +} + +.detail-grid { + display: grid; + grid-template-columns: minmax(0, 1.25fr) minmax(340px, 0.65fr); + gap: 16px; + align-items: start; +} + +.note-document { + min-height: 650px; + padding: 34px 38px; +} + +.note-document-meta { + display: flex; + gap: 8px; +} + +.note-document-meta span { + padding: 5px 7px; + border-radius: 6px; + color: #71807a; + background: #f0f3f1; + font-size: 8px; +} + +.note-title-row { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 20px; + margin-top: 24px; +} + +.note-document h1 { + margin: 0; + font-size: clamp(25px, 4vw, 40px); + line-height: 1.25; + letter-spacing: -0.045em; +} + +.inline-copy { + flex: 0 0 auto; + min-width: 76px; + height: 34px; + padding: 0 12px; + border: 1px solid #cfe1d9; + border-radius: 9px; + color: var(--green-deep); + background: #f2f8f5; + font-size: 9px; + font-weight: 680; +} + +.inline-copy:hover { + border-color: #9fc9b8; + background: #eaf5f0; +} + +.document-rule { + width: 36px; + height: 3px; + margin-top: 24px; + border-radius: 3px; + background: var(--green); +} + +.document-label { + margin: 24px 0 10px; + color: #8a9591; + font-size: 9px; + font-weight: 700; +} + +.document-label-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin: 20px 0 10px; +} + +.document-label-row .document-label { + margin: 0; +} + +.note-body { + color: #3e4c47; + font-size: 13px; + line-height: 1.95; + white-space: pre-wrap; +} + +.note-images { + margin-top: 30px; + padding-top: 24px; + border-top: 1px solid #edf0ee; +} + +.note-images-heading { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 12px; + margin-bottom: 12px; +} + +.note-images-heading .document-label { + margin: 0 0 5px; +} + +.note-images-heading span { + color: #909b97; + font-size: 8px; +} + +.note-images-heading b { + padding: 6px 8px; + border-radius: 9px; + color: var(--green-deep); + background: var(--green-soft); + font-size: 8px; +} + +.note-images-tools { + display: flex; + align-items: center; + gap: 8px; +} + +.note-images-tools button { + height: 30px; + padding: 0 11px; + border: 1px solid var(--green-deep); + border-radius: 9px; + color: white; + background: var(--green); + font-size: 8px; + font-weight: 700; +} + +.note-images-tools button:hover { + background: var(--green-deep); +} + +.note-image-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 12px; +} + +.note-image-card { + overflow: hidden; + border: 1px solid #e4e9e6; + border-radius: 12px; + background: #f7f8f7; +} + +.note-image-preview { + display: flex; + min-height: 230px; + align-items: center; + justify-content: center; + color: inherit; + text-decoration: none; +} + +.note-image-preview img { + display: block; + width: 100%; + height: auto; + max-height: 580px; + object-fit: contain; +} + +.note-image-actions { + display: flex; + min-height: 42px; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 7px 8px 7px 12px; + border-top: 1px solid #e4e9e6; + background: white; +} + +.note-image-actions span { + color: #7d8985; + font-size: 8px; + font-weight: 650; +} + +.note-image-actions button { + height: 28px; + padding: 0 10px; + border: 1px solid #cfe1d9; + border-radius: 8px; + color: var(--green-deep); + background: #f2f8f5; + font-size: 8px; + font-weight: 680; +} + +.note-image-actions button:hover { + border-color: #9fc9b8; + background: #eaf5f0; +} + +.submit-card { + position: sticky; + top: 18px; + padding: 26px; +} + +.submit-heading { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; +} + +.submit-heading > span { + padding: 6px 8px; + border-radius: 10px; + font-size: 8px; + font-weight: 680; +} + +.submit-heading .pending { + color: #9a673c; + background: #fff1e5; +} + +.submit-heading .done { + color: #27775b; + background: #e9f5f0; +} + +.mapping-note { + display: grid; + grid-template-columns: auto 1fr; + gap: 10px; + align-items: center; + margin-top: 17px; + padding: 11px; + border-radius: 10px; + background: #f3f7f5; +} + +.mapping-note span { + padding: 6px; + border-radius: 7px; + color: white; + background: var(--green); + font-size: 8px; + font-weight: 760; +} + +.mapping-note p { + margin: 0; + color: #71807a; + font-size: 8px; + line-height: 1.55; +} + +.submit-card label { + margin-top: 18px; +} + +.field-hint { + color: #98a29e; + font-size: 8px; + line-height: 1.5; +} + +.screenshot-picker { + position: relative; + display: flex; + min-height: 112px; + align-items: center; + justify-content: center; + flex-direction: column; + padding: 15px; + border: 1px dashed #bfcac5; + border-radius: 11px; + background: #fafbf9; + text-align: center; +} + +.screenshot-picker.has-file { + border-style: solid; + border-color: #acd1c1; + background: #f2f9f6; +} + +.screenshot-picker input { + position: absolute; + inset: 0; + height: 100%; + opacity: 0; + cursor: pointer; +} + +.screenshot-picker b { + display: grid; + width: 27px; + height: 27px; + place-items: center; + border-radius: 50%; + color: var(--green); + background: var(--green-soft); + font-size: 12px; +} + +.screenshot-picker strong { + max-width: 100%; + margin-top: 8px; + overflow: hidden; + font-size: 9px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.screenshot-picker small { + margin-top: 4px; + color: #99a29f; + font-size: 7px; +} + +.submitted-at { + margin: 10px 0 0; + color: #99a29f; + font-size: 8px; + text-align: center; +} + +.creator-recovery { + margin-top: 22px; + padding-top: 22px; + border-top: 1px solid #e6ebe8; +} + +.creator-recovery-heading { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; +} + +.creator-recovery-heading .micro { + margin-bottom: 5px; +} + +.creator-recovery-heading h3 { + margin: 0; + font-size: 15px; + letter-spacing: -0.025em; +} + +.creator-recovery-heading > span { + padding: 6px 8px; + border-radius: 10px; + color: #9a673c; + background: #fff1e5; + font-size: 8px; + font-weight: 680; +} + +.creator-recovery-heading > span.done { + color: #27775b; + background: #e9f5f0; +} + +.creator-recovery-tip { + margin: 11px 0 0; + color: #77837f; + font-size: 8px; + line-height: 1.65; +} + +.screenshot-picker.compact { + min-height: 96px; +} + +.creator-metric-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; +} + +.creator-metric-grid label { + margin-top: 12px; +} + +.creator-metric-grid input { + padding-inline: 12px; +} + +.creator-submit { + width: 100%; + height: 42px; + margin-top: 12px; + border: 1px solid #9fc7b7; + border-radius: 10px; + color: var(--green-deep); + background: #eef7f3; + font-size: 9px; + font-weight: 700; +} + +.creator-submit:hover { + border-color: var(--green); + background: #e6f3ed; +} + +@media (width <= 520px) { + .creator-metric-grid { + grid-template-columns: 1fr; + gap: 0; + } +} + +.toast { + position: fixed; + right: 24px; + bottom: 24px; + z-index: 50; + max-width: min(360px, calc(100vw - 32px)); + padding: 13px 16px; + border: 1px solid #cde0d8; + border-radius: 11px; + color: #29483d; + background: rgb(255 255 255 / 0.96); + box-shadow: 0 16px 42px rgb(18 37 31 / 0.16); + font-size: 10px; + font-weight: 620; +} + +.loading-shell { + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; +} + +.loading-shell p { + margin-top: 13px; + color: #84908c; + font-size: 10px; +} + +.message-card { + width: min(100%, 430px); + margin: 15vh auto 0; + padding: 38px; + text-align: center; +} + +.message-icon { + display: grid; + width: 42px; + height: 42px; + margin: 0 auto 20px; + place-items: center; + border-radius: 50%; + color: #ad603d; + background: #fff0e8; + font-weight: 800; +} + +.message-card h1 { + margin: 0; + font-size: 24px; +} + +.message-card > p:not(.micro) { + margin: 10px 0 0; + color: #84908c; + font-size: 10px; +} + +@media (max-width: 820px) { + .task-hero, + .detail-grid { + grid-template-columns: 1fr; + } + + .hero-copy { + min-height: 330px; + padding: 34px; + } + + .claim-card { + min-height: auto; + } + + .submit-card { + position: static; + } +} + +@media (max-width: 620px) { + .portal-shell { + padding: 14px 14px 38px; + } + + .portal-topbar { + min-height: 46px; + } + + .task-hero { + margin-top: 14px; + } + + .hero-copy { + min-height: 290px; + padding: 28px 23px; + border-radius: 19px; + } + + .hero-copy h1 { + font-size: 34px; + } + + .claim-card, + .notes-section, + .submit-card { + padding: 20px; + border-radius: 16px; + } + + .steps { + grid-template-columns: 1fr; + gap: 14px; + } + + .steps > i { + width: 1px; + height: 18px; + margin: 0 0 0 15px; + } + + .claimed-hero { + min-height: 150px; + padding: 24px 20px; + } + + .completion-ring { + width: 74px; + height: 74px; + } + + .note-row { + grid-template-columns: auto auto minmax(0, 1fr) auto; + padding: 13px 0; + } + + .note-row.share-selecting { + grid-template-columns: auto auto auto minmax(0, 1fr) auto; + } + + .note-row > .note-status { + display: none; + } + + .note-row button { + width: 34px; + overflow: hidden; + padding: 0; + color: transparent; + font-size: 0; + } + + .note-row button::after { + color: var(--green); + content: "→"; + font-size: 13px; + } + + .section-heading { + align-items: flex-start; + flex-direction: column; + gap: 12px; + } + + .section-actions { + width: 100%; + justify-content: space-between; + } + + .share-composer { + grid-template-columns: 1fr; + } + + .share-composer > small { + grid-column: auto; + } + + .share-composer-action { + justify-content: space-between; + } + + .delegation-list > article { + grid-template-columns: minmax(0, 1fr) auto; + } + + .delegation-list > article > small { + display: none; + } + + .delegation-actions { + grid-column: 1 / -1; + } + + .note-document { + min-height: auto; + padding: 25px 20px; + border-radius: 16px; + } + + .note-document h1 { + font-size: 28px; + } + + .note-body { + font-size: 12px; + } + + .note-image-grid { + grid-template-columns: 1fr; + } + + .note-images-heading { + align-items: flex-start; + flex-direction: column; + } + + .note-images-tools { + width: 100%; + justify-content: space-between; + } + + .note-images-tools button { + min-width: 112px; + height: 34px; + } + + .note-image-preview { + min-height: 200px; + } + + .note-title-row { + align-items: stretch; + flex-direction: column; + gap: 14px; + } + + .note-title-row .inline-copy { + align-self: flex-start; + } + + .toast { + right: 16px; + bottom: 16px; + left: 16px; + text-align: center; + } +} diff --git a/koc-portal/app/layout.tsx b/koc-portal/app/layout.tsx new file mode 100644 index 0000000..c33c7c5 --- /dev/null +++ b/koc-portal/app/layout.tsx @@ -0,0 +1,77 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import { headers } from "next/headers"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export async function generateMetadata(): Promise { + const requestHeaders = await headers(); + const host = requestHeaders.get("x-forwarded-host") || requestHeaders.get("host"); + const protocol = + requestHeaders.get("x-forwarded-proto") || + (host?.startsWith("localhost") ? "http" : "https"); + const metadataBase = host + ? new URL(`${protocol}://${host}`) + : new URL("https://koc-task.example.com"); + const description = + "领取KOC内容任务,逐篇查看笔记详情并一一回填发布账号、链接与截图。"; + + return { + metadataBase, + title: "KOC LOOP|外部任务领取", + description, + robots: { + index: false, + follow: false, + noarchive: true, + nosnippet: true, + }, + referrer: "no-referrer", + icons: { + icon: "/favicon.svg", + shortcut: "/favicon.svg", + }, + openGraph: { + title: "KOC LOOP|外部任务领取", + description, + type: "website", + images: [ + { + url: new URL("/og.png", metadataBase).toString(), + width: 1200, + height: 630, + alt: "KOC LOOP 外部任务领取与逐篇回填", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: "KOC LOOP|外部任务领取", + description, + images: [new URL("/og.png", metadataBase).toString()], + }, + }; +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/koc-portal/app/page.tsx b/koc-portal/app/page.tsx new file mode 100644 index 0000000..8fd2a0a --- /dev/null +++ b/koc-portal/app/page.tsx @@ -0,0 +1,1363 @@ +"use client"; + +import { zipSync } from "fflate"; +import { ChangeEvent, FormEvent, useCallback, useEffect, useMemo, useState } from "react"; +import { + formatShanghaiDate as formatDate, + parseStoredDate, +} from "./date-utils"; + +type Assignment = { + id: string; + status: string; + publish_url: string | null; + publish_time: string | null; + publish_screenshot_key: string | null; + creator_screenshot_key: string | null; + ocr_status: string; + exposure: number | null; + views: number | null; + title: string; + body: string; + source_row: number | null; + account_nickname: string | null; + delegation_bundle_id?: string | null; + delegation_label?: string | null; + images: Array<{ + index: number; + width: number | null; + height: number | null; + }>; +}; + +type DelegationSummary = { + id: string; + label: string; + share_token: string; + quantity: number; + status: "active" | "revoked"; + created_at: string; + revoked_at: string | null; + completed_count: number; + creator_completed_count: number; +}; + +type RecoveredClaim = { + claimToken: string; + quantity: number; + completedCount: number; + createdAt: string; + firstTitle: string; +}; + +type TaskPayload = { + task: { + name: string; + brand: string; + quantity?: number; + claimedQuantity?: number; + availableQuantity?: number; + dueAt: string; + status: string; + }; + claim: null | { + id: string; + claimantName: string; + quantity: number; + createdAt: string; + assignments: Assignment[]; + delegations: DelegationSummary[]; + }; + delegation: null | { + id: string; + label: string; + quantity: number; + createdAt: string; + assignments: Assignment[]; + }; +}; + +const PRODUCTION_ADMIN_ORIGIN = + "https://koc-loop-mvp-wufp.pyeongwu.chatgpt.site"; + +function partnerApi(path: "/api/partner" | "/api/partner-upload") { + const origin = + window.location.hostname === "localhost" + ? "http://localhost:3001" + : PRODUCTION_ADMIN_ORIGIN; + return `${origin}${path}`; +} + +function statusLabel(item: Assignment) { + return item.publish_url ? "已回填" : "待发布"; +} + +function creatorScreenshotDueAt(publishTime?: string | null) { + if (!publishTime) return null; + const date = parseStoredDate(publishTime); + if (Number.isNaN(date.getTime())) return null; + date.setDate(date.getDate() + 7); + return date.toISOString(); +} + +function imageExtension(contentType: string) { + const extensionByType: Record = { + "image/avif": "avif", + "image/gif": "gif", + "image/jpeg": "jpg", + "image/png": "png", + "image/webp": "webp", + }; + return extensionByType[contentType] ?? "jpg"; +} + +function safeFileBase(item: Assignment) { + return ( + item.title.replace(/[\\/:*?"<>|]/g, "").trim().slice(0, 30) || + `笔记-${item.source_row ?? "配图"}` + ); +} + +function exactArrayBuffer(bytes: Uint8Array) { + const copy = new Uint8Array(bytes.byteLength); + copy.set(bytes); + return copy.buffer; +} + +function downloadBlob(blob: Blob, fileName: string) { + const objectUrl = URL.createObjectURL(blob); + const anchor = document.createElement("a"); + anchor.href = objectUrl; + anchor.download = fileName; + document.body.appendChild(anchor); + anchor.click(); + anchor.remove(); + window.setTimeout(() => URL.revokeObjectURL(objectUrl), 1000); +} + +async function compressScreenshot(file: File) { + if (file.size < 900_000 || !file.type.startsWith("image/")) return file; + const bitmap = await createImageBitmap(file); + const maxEdge = 1800; + const scale = Math.min(1, maxEdge / Math.max(bitmap.width, bitmap.height)); + const canvas = document.createElement("canvas"); + canvas.width = Math.max(1, Math.round(bitmap.width * scale)); + canvas.height = Math.max(1, Math.round(bitmap.height * scale)); + const context = canvas.getContext("2d"); + if (!context) { + bitmap.close(); + return file; + } + context.drawImage(bitmap, 0, 0, canvas.width, canvas.height); + bitmap.close(); + const blob = await new Promise((resolve) => + canvas.toBlob(resolve, "image/jpeg", 0.84), + ); + if (!blob) return file; + return new File([blob], `${file.name.replace(/\.[^.]+$/, "")}.jpg`, { + type: "image/jpeg", + }); +} + +export default function Home() { + const [taskToken, setTaskToken] = useState(""); + const [claimToken, setClaimToken] = useState(""); + const [delegationToken, setDelegationToken] = useState(""); + const [selectedId, setSelectedId] = useState(""); + const [payload, setPayload] = useState(null); + const [loading, setLoading] = useState(true); + const [working, setWorking] = useState(false); + const [error, setError] = useState(""); + const [toast, setToast] = useState(""); + const [claimantName, setClaimantName] = useState(""); + const [quantity, setQuantity] = useState(1); + const [accountNickname, setAccountNickname] = useState(""); + const [publishUrl, setPublishUrl] = useState(""); + const [screenshot, setScreenshot] = useState(null); + const [creatorScreenshot, setCreatorScreenshot] = useState(null); + const [creatorExposure, setCreatorExposure] = useState(""); + const [creatorViews, setCreatorViews] = useState(""); + const [entryMode, setEntryMode] = useState<"claim" | "recover">("claim"); + const [recoveredClaims, setRecoveredClaims] = useState([]); + const [adminOrigin, setAdminOrigin] = useState(PRODUCTION_ADMIN_ORIGIN); + const [downloadingImage, setDownloadingImage] = useState(null); + const [batchDownloading, setBatchDownloading] = useState(false); + const [creatorWorking, setCreatorWorking] = useState(false); + const [creatorStage, setCreatorStage] = useState(""); + const [selectedForShare, setSelectedForShare] = useState([]); + const [shareLabel, setShareLabel] = useState(""); + const [shareComposerOpen, setShareComposerOpen] = useState(false); + const [shareWorking, setShareWorking] = useState(false); + + const updateUrl = useCallback( + (nextClaim: string, nextNote = "", nextDelegation = "") => { + const url = new URL(window.location.href); + if (nextClaim) url.searchParams.set("claim", nextClaim); + else url.searchParams.delete("claim"); + if (nextDelegation) url.searchParams.set("share", nextDelegation); + else url.searchParams.delete("share"); + if (nextNote) url.searchParams.set("note", nextNote); + else url.searchParams.delete("note"); + if (nextDelegation) url.searchParams.delete("task"); + window.history.replaceState({}, "", url); + }, + [], + ); + + const loadTask = useCallback(async ( + task: string, + claim: string, + delegation = "", + ) => { + try { + setLoading(true); + setError(""); + const params = new URLSearchParams(); + if (task) params.set("task", task); + if (claim) params.set("claim", claim); + if (delegation) params.set("share", delegation); + const response = await fetch(`${partnerApi("/api/partner")}?${params}`, { + cache: "no-store", + }); + const result = (await response.json()) as TaskPayload & { error?: string }; + if (!response.ok) throw new Error(result.error || "暂时无法打开任务"); + setPayload(result); + if (result.claim) setClaimantName(result.claim.claimantName); + } catch (reason) { + setError(reason instanceof Error ? reason.message : "暂时无法打开任务"); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + const timer = window.setTimeout(() => { + if (window.location.hostname === "localhost") { + setAdminOrigin("http://localhost:3001"); + } + const params = new URLSearchParams(window.location.search); + const task = params.get("task") ?? ""; + const claim = params.get("claim") ?? ""; + const delegation = params.get("share") ?? ""; + const note = params.get("note") ?? ""; + setTaskToken(task); + setClaimToken(claim); + setDelegationToken(delegation); + setSelectedId(note); + if (!task && !delegation) { + setLoading(false); + setError("任务链接不完整,请向运营重新获取"); + return; + } + void loadTask(task, claim, delegation); + }, 0); + return () => window.clearTimeout(timer); + }, [loadTask]); + + useEffect(() => { + if (!toast) return; + const timer = window.setTimeout(() => setToast(""), 2600); + return () => window.clearTimeout(timer); + }, [toast]); + + const activeBatch = payload?.claim ?? payload?.delegation ?? null; + const selected = useMemo( + () => activeBatch?.assignments.find((item) => item.id === selectedId) ?? null, + [activeBatch, selectedId], + ); + + useEffect(() => { + if (!selected) return; + const timer = window.setTimeout(() => { + setAccountNickname(selected.account_nickname ?? ""); + setPublishUrl(selected.publish_url ?? ""); + setScreenshot(null); + setCreatorScreenshot(null); + setCreatorExposure( + selected.exposure === null ? "" : String(selected.exposure), + ); + setCreatorViews(selected.views === null ? "" : String(selected.views)); + }, 0); + return () => window.clearTimeout(timer); + }, [selected]); + + const claimNotes = async (event: FormEvent) => { + event.preventDefault(); + try { + setWorking(true); + const response = await fetch(partnerApi("/api/partner"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "claim", + taskToken, + claimantName, + quantity, + }), + }); + const result = (await response.json()) as { + claimToken?: string; + claimedCount?: number; + error?: string; + }; + if (!response.ok || !result.claimToken) { + throw new Error(result.error || "领取失败"); + } + setClaimToken(result.claimToken); + setDelegationToken(""); + updateUrl(result.claimToken); + await loadTask(taskToken, result.claimToken); + setToast(`已领取 ${result.claimedCount} 篇,逐篇发布即可`); + } catch (reason) { + setToast(reason instanceof Error ? reason.message : "领取失败"); + } finally { + setWorking(false); + } + }; + + const openRecoveredClaim = async (nextClaimToken: string) => { + setClaimToken(nextClaimToken); + setDelegationToken(""); + setSelectedId(""); + setShareComposerOpen(false); + setSelectedForShare([]); + updateUrl(nextClaimToken); + await loadTask(taskToken, nextClaimToken); + }; + + const recoverClaims = async (event: FormEvent) => { + event.preventDefault(); + try { + setWorking(true); + const response = await fetch(partnerApi("/api/partner"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "recover", + taskToken, + claimantName, + }), + }); + const result = (await response.json()) as { + claims?: RecoveredClaim[]; + error?: string; + }; + if (!response.ok || !result.claims?.length) { + throw new Error(result.error || "没有找到领取记录"); + } + setRecoveredClaims(result.claims); + if (result.claims.length === 1) { + await openRecoveredClaim(result.claims[0].claimToken); + } + } catch (reason) { + setToast(reason instanceof Error ? reason.message : "领取记录查找失败"); + } finally { + setWorking(false); + } + }; + + const showRecovery = async () => { + setEntryMode("recover"); + setRecoveredClaims([]); + setClaimToken(""); + setDelegationToken(""); + setSelectedId(""); + setShareComposerOpen(false); + setSelectedForShare([]); + updateUrl(""); + await loadTask(taskToken, ""); + }; + + const noteImageUrl = (item: Assignment, imageIndex: number) => { + const params = new URLSearchParams({ + distribution: item.id, + index: String(imageIndex), + }); + if (delegationToken) params.set("share", delegationToken); + else { + params.set("task", taskToken); + params.set("claim", claimToken); + } + return `${adminOrigin}/api/partner-image?${params}`; + }; + + const openNote = (item: Assignment) => { + setSelectedId(item.id); + updateUrl(claimToken, item.id, delegationToken); + }; + + const closeNote = () => { + setSelectedId(""); + updateUrl(claimToken, "", delegationToken); + }; + + const copyText = async (value: string, successMessage: string) => { + try { + await navigator.clipboard.writeText(value); + setToast(successMessage); + } catch { + setToast("复制失败,请长按对应文字复制"); + } + }; + + const delegationUrl = (shareToken: string) => { + const url = new URL(window.location.origin); + url.searchParams.set("share", shareToken); + return url.toString(); + }; + + const toggleShareSelection = (distributionId: string) => { + setSelectedForShare((current) => + current.includes(distributionId) + ? current.filter((id) => id !== distributionId) + : [...current, distributionId], + ); + }; + + const createDelegation = async (event: FormEvent) => { + event.preventDefault(); + if (!payload?.claim || selectedForShare.length === 0) return; + try { + setShareWorking(true); + const response = await fetch(partnerApi("/api/partner"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "create_delegation", + taskToken, + claimToken, + delegationLabel: shareLabel, + distributionIds: selectedForShare, + }), + }); + const result = (await response.json()) as { + delegation?: { + id: string; + label: string; + shareToken: string; + quantity: number; + }; + error?: string; + }; + if (!response.ok || !result.delegation) { + throw new Error(result.error || "分享链接生成失败"); + } + await copyText( + delegationUrl(result.delegation.shareToken), + `已生成给 ${result.delegation.label} 的分享链接并复制`, + ); + setSelectedForShare([]); + setShareLabel(""); + setShareComposerOpen(false); + await loadTask(taskToken, claimToken); + } catch (reason) { + setToast(reason instanceof Error ? reason.message : "分享链接生成失败"); + } finally { + setShareWorking(false); + } + }; + + const revokeDelegation = async (bundle: DelegationSummary) => { + if (!window.confirm(`确认撤销“${bundle.label}”的分享链接吗?`)) return; + try { + setShareWorking(true); + const response = await fetch(partnerApi("/api/partner"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "revoke_delegation", + taskToken, + claimToken, + delegationBundleId: bundle.id, + }), + }); + const result = (await response.json()) as { + revoked?: boolean; + error?: string; + }; + if (!response.ok || !result.revoked) { + throw new Error(result.error || "撤销失败"); + } + await loadTask(taskToken, claimToken); + setSelectedForShare([]); + setToast("分享链接已撤销,相关笔记可以重新转派"); + } catch (reason) { + setToast(reason instanceof Error ? reason.message : "撤销失败"); + } finally { + setShareWorking(false); + } + }; + + const prepareImage = async (item: Assignment, imageIndex: number) => { + const response = await fetch(noteImageUrl(item, imageIndex)); + if (!response.ok) throw new Error("图片读取失败"); + const blob = await response.blob(); + const extension = imageExtension(blob.type); + const fileName = `${safeFileBase(item)}-图片${imageIndex}.${extension}`; + const buffer = await blob.arrayBuffer(); + return { + bytes: new Uint8Array(buffer), + file: new File([buffer], fileName, { type: blob.type || "image/jpeg" }), + }; + }; + + const shareImages = async (files: File[], title: string) => { + if ( + typeof navigator.share !== "function" || + typeof navigator.canShare !== "function" || + !navigator.canShare({ files }) + ) { + return false; + } + await navigator.share({ files, title }); + return true; + }; + + const downloadImage = async (item: Assignment, imageIndex: number) => { + try { + setDownloadingImage(imageIndex); + const prepared = await prepareImage(item, imageIndex); + try { + if (await shareImages([prepared.file], item.title)) { + setToast("请在系统菜单中选择“存储图像”"); + return; + } + } catch (reason) { + if (reason instanceof DOMException && reason.name === "AbortError") return; + } + downloadBlob( + new Blob([exactArrayBuffer(prepared.bytes)], { + type: prepared.file.type, + }), + prepared.file.name, + ); + setToast(`图片 ${imageIndex} 已下载到文件`); + } catch { + setToast("图片下载失败,请点击图片后保存"); + } finally { + setDownloadingImage(null); + } + }; + + const downloadAllImages = async (item: Assignment) => { + try { + setBatchDownloading(true); + const prepared = await Promise.all( + item.images.map((image) => prepareImage(item, image.index)), + ); + const files = prepared.map((image) => image.file); + try { + if (await shareImages(files, `${item.title}|全部配图`)) { + setToast("请在系统菜单中选择“存储图像”批量保存"); + return; + } + } catch (reason) { + if (reason instanceof DOMException && reason.name === "AbortError") return; + } + const archive = zipSync( + Object.fromEntries( + prepared.map((image) => [image.file.name, image.bytes]), + ), + { level: 0 }, + ); + downloadBlob( + new Blob([exactArrayBuffer(archive)], { type: "application/zip" }), + `${safeFileBase(item)}-全部配图.zip`, + ); + setToast("当前浏览器不支持直接存相册,已下载全部配图 ZIP"); + } catch { + setToast("批量保存失败,请尝试用系统浏览器打开"); + } finally { + setBatchDownloading(false); + } + }; + + const chooseScreenshot = (event: ChangeEvent) => { + setScreenshot(event.target.files?.[0] ?? null); + }; + + const chooseCreatorScreenshot = (event: ChangeEvent) => { + setCreatorScreenshot(event.target.files?.[0] ?? null); + }; + + const uploadEvidence = async ( + selectedItem: Assignment, + file: File, + kind: "publish" | "creator-center", + ) => { + const compressed = await compressScreenshot(file); + const headers: Record = { + "Content-Type": compressed.type || "image/jpeg", + "X-KOC-Distribution": selectedItem.id, + "X-KOC-File-Name": encodeURIComponent(compressed.name), + "X-KOC-Upload-Kind": kind, + }; + if (delegationToken) { + headers["X-KOC-Delegation"] = delegationToken; + } else { + headers["X-KOC-Task"] = taskToken; + headers["X-KOC-Claim"] = claimToken; + } + const uploadResponse = await fetch(partnerApi("/api/partner-upload"), { + method: "POST", + headers, + body: compressed, + }); + const uploadResult = (await uploadResponse.json()) as { error?: string }; + if (!uploadResponse.ok) { + throw new Error( + uploadResult.error || + (kind === "creator-center" + ? "创作者中心截图上传失败" + : "发布截图上传失败"), + ); + } + }; + + const submitNote = async (event: FormEvent) => { + event.preventDefault(); + if (!selected) return; + try { + setWorking(true); + if (screenshot) { + await uploadEvidence(selected, screenshot, "publish"); + } else if (!selected.publish_screenshot_key) { + throw new Error("请上传这篇笔记的发布截图"); + } + + const response = await fetch(partnerApi("/api/partner"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "submit", + taskToken, + claimToken, + delegationToken, + distributionId: selected.id, + accountNickname, + publishUrl, + }), + }); + const result = (await response.json()) as { error?: string }; + if (!response.ok) throw new Error(result.error || "回填失败"); + await loadTask(taskToken, claimToken, delegationToken); + setScreenshot(null); + setToast("这篇笔记已回填,不会与其他笔记错配"); + } catch (reason) { + setToast(reason instanceof Error ? reason.message : "回填失败"); + } finally { + setWorking(false); + } + }; + + const submitCreatorData = async () => { + if (!selected) return; + if (!creatorScreenshot && !selected.creator_screenshot_key) { + setToast("请选择创作者中心截图"); + return; + } + if ( + !/^\d{1,12}$/.test(creatorExposure) || + !/^\d{1,12}$/.test(creatorViews) + ) { + setToast("请填写正确的曝光量和阅读量"); + return; + } + try { + setCreatorWorking(true); + if (creatorScreenshot) { + setCreatorStage("正在上传截图…"); + await uploadEvidence( + selected, + creatorScreenshot, + "creator-center", + ); + } + setCreatorStage("正在保存数据…"); + const response = await fetch(partnerApi("/api/partner"), { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + action: "submit_creator_metrics", + taskToken, + claimToken, + delegationToken, + distributionId: selected.id, + exposure: creatorExposure, + views: creatorViews, + }), + }); + const result = (await response.json()) as { error?: string }; + if (!response.ok) { + throw new Error(result.error || "创作者数据提交失败"); + } + await loadTask(taskToken, claimToken, delegationToken); + setCreatorScreenshot(null); + setToast("创作者截图、曝光量和阅读量已提交"); + } catch (reason) { + setToast( + reason instanceof Error ? reason.message : "创作者数据提交失败", + ); + } finally { + setCreatorWorking(false); + setCreatorStage(""); + } + }; + + if (loading) { + return ( +
+
K
+

正在打开任务…

+
+ ); + } + + if (error || !payload) { + return ( +
+
+
!
+

KOC LOOP

+

暂时无法打开任务

+

{error || "任务不存在"}

+ +
+
+ ); + } + + if (selected && activeBatch) { + const creatorDueAt = creatorScreenshotDueAt(selected.publish_time); + const creatorDataReady = + Boolean(selected.creator_screenshot_key) && + selected.exposure !== null && + selected.views !== null; + return ( +
+
+
KKOC LOOP
+
+ {payload.claim ? payload.claim.claimantName : "合作社转派 · 无需登录"} +
+
+ +
+
+
+ 笔记 {activeBatch.assignments.findIndex((item) => item.id === selected.id) + 1} + 飞书源行 {selected.source_row ?? "—"} +
+
+

{selected.title}

+ +
+
+
+

正文与话题

+ +
+
{selected.body || "暂无正文"}
+ {selected.images.length > 0 && ( +
+
+
+

发布配图

+ 手机优先打开系统保存菜单,其他浏览器会下载文件 +
+
+ {selected.images.length} 张 + {selected.images.length > 1 && ( + + )} +
+
+
+ {selected.images.map((image, index) => ( +
+ + {/* Private claim-bound images intentionally bypass the public image optimizer. */} + {/* eslint-disable-next-line @next/next/no-img-element */} + {`${selected.title} + +
+ 图片 {index + 1} + +
+
+ ))} +
+
+ )} +
+ +
+
+
+

逐篇回填

+

填写这篇笔记的发布信息

+
+ + {statusLabel(selected)} + +
+
+ 1 : 1 +

以下信息只会绑定到当前笔记,不按顺序批量匹配。

+
+ + + + + {selected.publish_time && ( +

上次回填:{formatDate(selected.publish_time, true)}

+ )} + {selected.publish_url && ( +
+
+
+

第7天数据回收

+

上传截图并填写数据

+
+ + {creatorDataReady ? "已提交" : "待提交"} + +
+

+ 请在发布满7天后,上传创作者中心数据页完整截图,并填写页面显示的数据。 + {creatorDueAt && ` 建议上传日期:${formatDate(creatorDueAt)}。`} +

+ +
+ + +
+ +
+ )} +
+
+ {toast &&
{toast}
} +
+ ); + } + + if (activeBatch) { + const completed = activeBatch.assignments.filter((item) => item.publish_url).length; + const isClaimOwner = Boolean(payload.claim); + const shareableCount = payload.claim?.assignments.filter( + (item) => !item.publish_url && !item.delegation_bundle_id, + ).length ?? 0; + return ( +
+
+
KKOC LOOP
+ {payload.claim ? ( +
+ +
{payload.claim.claimantName}
+
+ ) : ( +
合作社转派 · 无需登录
+ )} +
+
+
+

+ {isClaimOwner ? "我的领取任务" : "合作社转派发布包"} +

+

{payload.task.name}

+

+ {payload.task.brand} · {formatDate(payload.task.dueAt)}前发布 + {payload.delegation ? ` · ${payload.delegation.label}` : ""} +

+
+
+ {completed}/{activeBatch.assignments.length} + 已回填 +
+
+
+
+
+

{isClaimOwner ? "我领取的笔记" : "需要发布的笔记"}

+

+ {isClaimOwner + ? "打开一篇,查看内容并单独回填;也可以选择笔记转派给底层KOC" + : "打开一篇查看完整内容,发布后逐篇回填"} +

+
+
+ {activeBatch.assignments.length} 篇 + {isClaimOwner && ( + + )} +
+
+ {payload.claim && shareComposerOpen && ( +
+
+

合作社转派

+

生成免登录分享链接

+

+ 勾选待发布笔记,底层KOC打开链接即可查看内容并逐篇回填。 +

+
+ +
+ 已选 {selectedForShare.length} 篇 + +
+ + 对方无需登录,也不会填写手机号、微信或企微;分享链接可用于后续第7天数据回收。 + +
+ )} +
+ {activeBatch.assignments.map((item, index) => { + const shareDisabled = Boolean( + item.publish_url || item.delegation_bundle_id, + ); + return ( +
+ {shareComposerOpen && isClaimOwner && ( + + )} + + {String(index + 1).padStart(2, "0")} + + {item.images[0] ? ( + <> + {/* Private claim-bound images intentionally bypass the public image optimizer. */} + {/* eslint-disable-next-line @next/next/no-img-element */} + + + ) : ( + 无图 + )} +
+

{item.title}

+

+ {item.images.length} 张配图 · 飞书源行 {item.source_row ?? "—"} · {statusLabel(item)} + {item.creator_screenshot_key ? " · D7截图已交" : ""} + {item.delegation_label ? ` · 已转派给 ${item.delegation_label}` : ""} +

+
+ + {item.publish_url + ? "已回填" + : item.delegation_bundle_id + ? "已转派" + : "待发布"} + + +
+ ); + })} +
+ {payload.claim && payload.claim.delegations.length > 0 && ( +
+
+
+

分享记录

+

转派发布包

+
+ {payload.claim.delegations.length} 个 +
+
+ {payload.claim.delegations.map((bundle) => ( +
+
+ {bundle.label} + + {bundle.quantity} 篇 · 已发布{" "} + {Number(bundle.completed_count ?? 0)}/{bundle.quantity} · + D7完成 {Number(bundle.creator_completed_count ?? 0)} + +
+ {formatDate(bundle.created_at, true)} + + {bundle.status === "active" ? "分享中" : "已撤销"} + + {bundle.status === "active" && ( +
+ + {Number(bundle.completed_count ?? 0) === 0 && ( + + )} +
+ )} +
+ ))} +
+
+ )} +
+
+ {isClaimOwner + ? "以后再次打开原任务链接,填写相同企微昵称即可找回全部领取批次和分享记录。" + : "请保存当前分享链接;发布后仍需通过此链接回填第7天截图、曝光量和阅读量。"} +
+ {toast &&
{toast}
} +
+ ); + } + + return ( +
+
+
KKOC LOOP
+ KOC领取页 +
+
+
+

正在招募 · {payload.task.brand}

+

{payload.task.name}

+

领取后可查看完整笔记正文,每篇笔记独立回填发布信息。

+
+ 截止 {formatDate(payload.task.dueAt)} + 剩余 {payload.task.availableQuantity} 篇 +
+
+ +
+
+
1选择数量

一次可领多篇

+ +
2逐篇查看

标题正文完整展示

+ +
3单篇回填

昵称、链接、截图一一对应

+
+
由 KOC LOOP 提供任务与数据安全保障
+ {toast &&
{toast}
} +
+ ); +} diff --git a/koc-portal/build/sites-vite-plugin.ts b/koc-portal/build/sites-vite-plugin.ts new file mode 100644 index 0000000..26563fd --- /dev/null +++ b/koc-portal/build/sites-vite-plugin.ts @@ -0,0 +1,45 @@ +import { access, cp, mkdir, rm } from "node:fs/promises"; +import { resolve } from "node:path"; +import type { Plugin } from "vite"; + +async function exists(path: string): Promise { + try { + await access(path); + return true; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") { + return false; + } + throw error; + } +} + +// Packages Sites metadata and migrations after Vite finishes compiling. +export function sites(): Plugin { + let root = process.cwd(); + + return { + name: "sites", + apply: "build", + configResolved(config) { + root = config.root; + }, + async closeBundle() { + const outputDirectory = resolve(root, "dist", ".openai"); + const hostingConfig = resolve(root, ".openai", "hosting.json"); + const drizzleSource = resolve(root, "drizzle"); + + await rm(outputDirectory, { recursive: true, force: true }); + await mkdir(outputDirectory, { recursive: true }); + + if (await exists(hostingConfig)) { + await cp(hostingConfig, resolve(outputDirectory, "hosting.json")); + } + if (await exists(drizzleSource)) { + await cp(drizzleSource, resolve(outputDirectory, "drizzle"), { + recursive: true, + }); + } + }, + }; +} diff --git a/koc-portal/db/index.ts b/koc-portal/db/index.ts new file mode 100644 index 0000000..19b3799 --- /dev/null +++ b/koc-portal/db/index.ts @@ -0,0 +1,13 @@ +import { env } from "cloudflare:workers"; +import { drizzle } from "drizzle-orm/d1"; +import * as schema from "./schema"; + +export function getDb() { + if (!env.DB) { + throw new Error( + "Cloudflare D1 binding `DB` is unavailable. Set the `d1` field in .openai/hosting.json to `DB` or let your control plane inject the real binding values before using the database." + ); + } + + return drizzle(env.DB, { schema }); +} diff --git a/koc-portal/db/schema.ts b/koc-portal/db/schema.ts new file mode 100644 index 0000000..d2dd83c --- /dev/null +++ b/koc-portal/db/schema.ts @@ -0,0 +1,4 @@ +// Intentionally empty by default. +// Add Drizzle tables here when the site actually needs a database. +// See examples/d1/db/schema.ts for an opt-in example. +export {}; diff --git a/koc-portal/drizzle.config.ts b/koc-portal/drizzle.config.ts new file mode 100644 index 0000000..c2b2f34 --- /dev/null +++ b/koc-portal/drizzle.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + out: "./drizzle", + schema: "./db/schema.ts", + dialect: "sqlite", +}); diff --git a/koc-portal/drizzle/meta/_journal.json b/koc-portal/drizzle/meta/_journal.json new file mode 100644 index 0000000..4377507 --- /dev/null +++ b/koc-portal/drizzle/meta/_journal.json @@ -0,0 +1,5 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [] +} diff --git a/koc-portal/eslint.config.mjs b/koc-portal/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/koc-portal/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/koc-portal/examples/d1/app/api/notes/route.ts b/koc-portal/examples/d1/app/api/notes/route.ts new file mode 100644 index 0000000..07f8318 --- /dev/null +++ b/koc-portal/examples/d1/app/api/notes/route.ts @@ -0,0 +1,58 @@ +import { desc } from "drizzle-orm"; +import { getDb } from "../../../../../db"; +import { notes } from "../../../db/schema"; + +function toRouteErrorMessage(error: unknown) { + const message = error instanceof Error ? error.message : "Unexpected error"; + const detail = + error instanceof Error && error.cause instanceof Error ? error.cause.message : ""; + const combined = `${message}\n${detail}`; + + if (combined.includes("no such table") || combined.includes('from "notes"')) { + return "The notes table is unavailable. Generate the migration locally with `npm run db:generate`, then deploy so the platform can apply the generated SQL to the real D1 database."; + } + + return message; +} + +export async function GET() { + try { + const db = getDb(); + const rows = await db + .select() + .from(notes) + .orderBy(desc(notes.createdAt), desc(notes.id)) + .limit(20); + + return Response.json({ notes: rows }); + } catch (error) { + return Response.json( + { error: toRouteErrorMessage(error) }, + { status: 500 } + ); + } +} + +export async function POST(request: Request) { + try { + const payload = (await request.json()) as { + title?: string; + content?: string; + }; + const title = payload.title?.trim() ?? ""; + const content = payload.content?.trim() ?? ""; + + if (!title) { + return Response.json({ error: "title is required" }, { status: 400 }); + } + + const db = getDb(); + const [note] = await db.insert(notes).values({ title, content }).returning(); + return Response.json({ note }, { status: 201 }); + } catch (error) { + return Response.json( + { error: toRouteErrorMessage(error) }, + { status: 500 } + ); + } +} diff --git a/koc-portal/examples/d1/db/schema.ts b/koc-portal/examples/d1/db/schema.ts new file mode 100644 index 0000000..7bb0c15 --- /dev/null +++ b/koc-portal/examples/d1/db/schema.ts @@ -0,0 +1,9 @@ +import { sql } from "drizzle-orm"; +import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core"; + +export const notes = sqliteTable("notes", { + id: integer("id").primaryKey({ autoIncrement: true }), + title: text("title").notNull(), + content: text("content").notNull().default(""), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), +}); diff --git a/koc-portal/next.config.ts b/koc-portal/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/koc-portal/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/koc-portal/package-lock.json b/koc-portal/package-lock.json new file mode 100644 index 0000000..fa6063e --- /dev/null +++ b/koc-portal/package-lock.json @@ -0,0 +1,11169 @@ +{ + "name": "koc-task-portal", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "koc-task-portal", + "version": "0.1.0", + "dependencies": { + "drizzle-orm": "0.45.2", + "fflate": "0.7.4", + "next": "16.2.6", + "react": "19.2.6", + "react-dom": "19.2.6" + }, + "devDependencies": { + "@cloudflare/vite-plugin": "1.37.1", + "@tailwindcss/postcss": "4.2.1", + "@types/node": "22.19.19", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.2", + "@vitejs/plugin-rsc": "0.5.26", + "drizzle-kit": "0.31.10", + "eslint": "9.39.4", + "eslint-config-next": "16.2.6", + "react-server-dom-webpack": "19.2.6", + "tailwindcss": "4.2.1", + "typescript": "5.9.3", + "vinext": "0.0.50", + "vite": "8.0.13", + "wrangler": "4.92.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", + "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.1.tgz", + "integrity": "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/vite-plugin": { + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@cloudflare/vite-plugin/-/vite-plugin-1.37.1.tgz", + "integrity": "sha512-FldhsmkXyLsX3yI+p0aJDo/kGyY69pDdynz2JjcuH3eCiQ+G9XaY3CrN+UYEfCbWv8CiR2wL95lNg0fT/HfwWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cloudflare/unenv-preset": "2.16.1", + "miniflare": "4.20260515.0", + "unenv": "2.0.0-rc.24", + "wrangler": "4.92.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "vite": "^6.1.0 || ^7.0.0 || ^8.0.0", + "wrangler": "^4.92.0" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260515.1.tgz", + "integrity": "sha512-Wtw44el2pNbzixvTkWdfeBDTrQwQbJRz7/JUvPKV27I0pQWXbhNJPpM8cstq/pbrU5AGcA/HjFH6yPMRTIRKig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260515.1.tgz", + "integrity": "sha512-X8EqkZej6FfmhF9AVAQ3FhyQRr9acS4RcDunMU2YiuxKHF1IU8zzH3vY30/POaG+rUu9vGDp/VgUl49VPenHJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260515.1.tgz", + "integrity": "sha512-CDC89QxQ7Y7t7RG1Jd9vj/qolE1sQRkI2OSEuV5BMJi0vW/gV4OVG6xjpdK3b1OYnSWDzF7NpvlR5Yg86q7k4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260515.1.tgz", + "integrity": "sha512-WxbW/PToYES4fvHXzsr/5qOiETQs/Z9iZ0mjSZAiEwq5cMLZemzGN0COx+uFb9OvQwzh6Pg159qPFnw3+i9FuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260515.1.tgz", + "integrity": "sha512-WmV/iv+MHjYsvkcMVzpM2B5/mf06UUkdpVhZrtMfV9graWjBGPYFvE/eab8748RPVGKh1Xe1vXofLzDSwc08lA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@drizzle-team/brocli": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", + "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz", + "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.130.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.130.0.tgz", + "integrity": "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/dumper/node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@resvg/resvg-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-wasm/-/resvg-wasm-2.4.0.tgz", + "integrity": "sha512-C7c51Nn4yTxXFKvgh2txJFNweaVcfUPQxwEUFw4aWsCmfiBDJsTSwviIF8EcwjQ6k8bPyMWCl1vw4BdxE569Cg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.1.tgz", + "integrity": "sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.1.tgz", + "integrity": "sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.1.tgz", + "integrity": "sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.1.tgz", + "integrity": "sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shuding/opentype.js": { + "version": "1.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", + "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fflate": "^0.7.3", + "string.prototype.codepointat": "^0.2.1" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz", + "integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "postcss": "^8.5.6", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", + "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unpic/core": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@unpic/core/-/core-1.0.3.tgz", + "integrity": "sha512-aum9YNVUGso7MjGLD0Rp/08kywCGLqZ03/q6VQBFFakDBOXWEc8D4kPGcZ8v5wEnGRex3lE+++bOuucBp3KJ/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "unpic": "^4.2.2" + } + }, + "node_modules/@unpic/react": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@unpic/react/-/react-1.0.2.tgz", + "integrity": "sha512-5RmRfELwTF8w+4zjtQGqjpvX+RU2VLvis3xDCS1O2uWk0PZN2cvatL+3/KAR3mshAuRrkFGTX1XwyAezSXaoCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@unpic/core": "^1.0.3" + }, + "peerDependencies": { + "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + } + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vercel/og": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@vercel/og/-/og-0.8.6.tgz", + "integrity": "sha512-hBcWIOppZV14bi+eAmCZj8Elj8hVSUZJTpf1lgGBhVD85pervzQ1poM/qYfFUlPraYSZYP+ASg6To5BwYmUSGQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@resvg/resvg-wasm": "2.4.0", + "satori": "0.16.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@vitejs/plugin-rsc": { + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-rsc/-/plugin-rsc-0.5.26.tgz", + "integrity": "sha512-T8W8ODEutblw9qXQB512LDPyv1tAbJRD/Gf0QEGsAoydl4nxEtIrghnhoI9oLY9R+7aw+cLk1ZEltxWHWf4aHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.18", + "es-module-lexer": "^2.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21", + "srvx": "^0.11.15", + "strip-literal": "^3.1.0", + "turbo-stream": "^3.2.0", + "vitefu": "^1.1.3" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/@vitejs/plugin-rsc/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz", + "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-loose": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", + "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.30", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz", + "integrity": "sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-background-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", + "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-box-shadow": { + "version": "1.0.0-3", + "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", + "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-gradient-parser": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.16.tgz", + "integrity": "sha512-3O5QdqgFRUbXvK1x5INf1YkBz1UKSWqrd63vWsum8MNHDBYD5urm3QtxZbKU259OrEXNM26lP/MPY3d1IGkBgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/drizzle-kit": { + "version": "0.31.10", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", + "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "tsx": "^4.21.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/drizzle-orm": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz", + "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.358", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.358.tgz", + "integrity": "sha512-EO7tKm3QxRqTs1lSuPXzl6yRAwznehp0AH9OoMOIC+4mQzTFday8FJCO5KU6J/TFSQXEOahNq4vTKpz1jmCVOA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz", + "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.6.tgz", + "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.2.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hex-rgb": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", + "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "dev": true, + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/miniflare": { + "version": "4.20260515.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260515.0.tgz", + "integrity": "sha512-2j0oQWizk1Eu4Cm8tDX7Z+Nsjd0nebIj1TQcQ+Oy1QKeo0Ay9+bdn8wfLAtOj9znDCybDCUlnS1+nYvKXEdfNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.24.8", + "workerd": "1.20260515.1", + "ws": "8.18.0", + "youch": "4.1.0-beta.10" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-css-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", + "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4", + "hex-rgb": "^4.1.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-server-dom-webpack": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-19.2.6.tgz", + "integrity": "sha512-762YXjBPc6hw2V16k4x1sdnw0mxghcSPzoiOhefGYjiTguJLCImGBUz6EjznPIfqKhWgLtpaQMlBhp66N8dKrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-loose": "^8.3.0", + "neo-async": "^2.6.1", + "webpack-sources": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.6", + "react-dom": "^19.2.6", + "webpack": "^5.59.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.1.tgz", + "integrity": "sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.130.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.1", + "@rolldown/binding-darwin-arm64": "1.0.1", + "@rolldown/binding-darwin-x64": "1.0.1", + "@rolldown/binding-freebsd-x64": "1.0.1", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.1", + "@rolldown/binding-linux-arm64-gnu": "1.0.1", + "@rolldown/binding-linux-arm64-musl": "1.0.1", + "@rolldown/binding-linux-ppc64-gnu": "1.0.1", + "@rolldown/binding-linux-s390x-gnu": "1.0.1", + "@rolldown/binding-linux-x64-gnu": "1.0.1", + "@rolldown/binding-linux-x64-musl": "1.0.1", + "@rolldown/binding-openharmony-arm64": "1.0.1", + "@rolldown/binding-wasm32-wasi": "1.0.1", + "@rolldown/binding-win32-arm64-msvc": "1.0.1", + "@rolldown/binding-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/satori": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.16.0.tgz", + "integrity": "sha512-ZvHN3ygzZ8FuxjSNB+mKBiF/NIoqHzlBGbD0MJiT+MvSsFOvotnWOhdTjxKzhHRT2wPC1QbhLzx2q/Y83VhfYQ==", + "dev": true, + "license": "MPL-2.0", + "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.16", + "css-to-react-native": "^3.0.0", + "emoji-regex-xs": "^2.0.1", + "escape-html": "^1.0.3", + "linebreak": "^1.1.0", + "parse-css-color": "^0.2.1", + "postcss-value-parser": "^4.2.0", + "yoga-layout": "^3.2.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/srvx": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.15.tgz", + "integrity": "sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==", + "dev": true, + "license": "MIT", + "bin": { + "srvx": "bin/srvx.mjs" + }, + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.47.1.tgz", + "integrity": "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.1.tgz", + "integrity": "sha512-TvncJykhxAzFCk0VQZKBTClall4Pm7qXDSodb6uxi8QFa8X8mT6ABjxxsQ2opDRYxG7AzcRWXaFtruz5HJKuWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/turbo-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-3.2.0.tgz", + "integrity": "sha512-EK+bZ9UVrVh7JLslVFOV0GEMsociOqVOvEMTAd4ixMyffN5YNIEdLZWXUx5PJqDbTxSIBWw04HS9gCY4frYQDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", + "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.59.3", + "@typescript-eslint/parser": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", + "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unpic": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/unpic/-/unpic-4.2.2.tgz", + "integrity": "sha512-z6T2ScMgRV2y2H8MwwhY5xHZWXhUx/YxtOCGJwfURSl7ypVy4HpLIMWoIZKnnxQa/RKzM0kg8hUh0paIrpLfvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vinext": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/vinext/-/vinext-0.0.50.tgz", + "integrity": "sha512-uo72YNnq94NtogETWnhMdFSrkMLwWgeXh5PS6qh8ksajuvAaZX50bXYJ4a6dERQ/AnnXAlNByAGHCjjNxQrvig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@unpic/react": "^1.0.2", + "@vercel/og": "^0.8.6", + "image-size": "2.0.2", + "ipaddr.js": "^2.1.0", + "magic-string": "^0.30.21", + "vite-plugin-commonjs": "^0.10.4", + "vite-tsconfig-paths": "^6.1.1", + "web-vitals": "^4.2.4" + }, + "bin": { + "vinext": "dist/cli.js" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "@mdx-js/rollup": "^3.0.0", + "@vitejs/plugin-react": "^5.1.4 || ^6.0.0", + "@vitejs/plugin-rsc": "^0.5.23", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "react-server-dom-webpack": "^19.2.6", + "vite": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@mdx-js/rollup": { + "optional": true + }, + "@vitejs/plugin-rsc": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.13.tgz", + "integrity": "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "rolldown": "1.0.1", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-commonjs": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/vite-plugin-commonjs/-/vite-plugin-commonjs-0.10.4.tgz", + "integrity": "sha512-eWQuvQKCcx0QYB5e5xfxBNjQKyrjEWZIR9UOkOV6JAgxVhtbZvCOF+FNC2ZijBJ3U3Px04ZMMyyMyFBVWIJ5+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "magic-string": "^0.30.11", + "vite-plugin-dynamic-import": "^1.6.0" + } + }, + "node_modules/vite-plugin-dynamic-import": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.6.0.tgz", + "integrity": "sha512-TM0sz70wfzTIo9YCxVFwS8OA9lNREsh+0vMHGSkWDTZ7bgd1Yjs5RV8EgB634l/91IsXJReg0xtmuQqP0mf+rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "es-module-lexer": "^1.5.4", + "fast-glob": "^3.3.2", + "magic-string": "^0.30.11" + } + }, + "node_modules/vite-plugin-dynamic-import/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-dynamic-import/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/vite-plugin-dynamic-import/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.1.1.tgz", + "integrity": "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/webpack": { + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.1", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerd": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260515.1.tgz", + "integrity": "sha512-MjKOJLcvU45xXedQowvuiHtJTxu4WTHYQeIlF7YmjuqhiI6dImTFxWCEoRQHiskztxuVSNEmdO7/0UfDu6OMnQ==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260515.1", + "@cloudflare/workerd-darwin-arm64": "1.20260515.1", + "@cloudflare/workerd-linux-64": "1.20260515.1", + "@cloudflare/workerd-linux-arm64": "1.20260515.1", + "@cloudflare/workerd-windows-64": "1.20260515.1" + } + }, + "node_modules/wrangler": { + "version": "4.92.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.92.0.tgz", + "integrity": "sha512-/DKpQHPxkuZbQsO9dFW2700VTD/4DSZMHjy92fO/frNoDRi/zQsFCAd2ONCV6TGqcUoXcP3D8Bo2gj/L4M0qQQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.5.0", + "@cloudflare/unenv-preset": "2.16.1", + "blake3-wasm": "2.1.5", + "esbuild": "0.27.3", + "miniflare": "4.20260515.0", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260515.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=22.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20260515.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/youch": { + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/koc-portal/package.json b/koc-portal/package.json new file mode 100644 index 0000000..54ebc89 --- /dev/null +++ b/koc-portal/package.json @@ -0,0 +1,42 @@ +{ + "name": "koc-task-portal", + "version": "0.1.0", + "private": true, + "engines": { + "node": ">=22.13.0" + }, + "scripts": { + "dev": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext dev", + "build": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext build", + "start": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext start", + "test": "npm run build && node --test tests/rendered-html.test.mjs", + "lint": "eslint . --ignore-pattern dist --ignore-pattern .next", + "db:generate": "drizzle-kit generate" + }, + "dependencies": { + "drizzle-orm": "0.45.2", + "fflate": "0.7.4", + "next": "16.2.6", + "react": "19.2.6", + "react-dom": "19.2.6" + }, + "devDependencies": { + "@cloudflare/vite-plugin": "1.37.1", + "@tailwindcss/postcss": "4.2.1", + "@types/node": "22.19.19", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.2", + "@vitejs/plugin-rsc": "0.5.26", + "drizzle-kit": "0.31.10", + "eslint": "9.39.4", + "eslint-config-next": "16.2.6", + "react-server-dom-webpack": "19.2.6", + "tailwindcss": "4.2.1", + "typescript": "5.9.3", + "vinext": "0.0.50", + "vite": "8.0.13", + "wrangler": "4.92.0" + }, + "type": "module" +} diff --git a/koc-portal/postcss.config.mjs b/koc-portal/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/koc-portal/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/koc-portal/public/favicon.svg b/koc-portal/public/favicon.svg new file mode 100644 index 0000000..2e7dfa4 --- /dev/null +++ b/koc-portal/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/koc-portal/public/file.svg b/koc-portal/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/koc-portal/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/koc-portal/public/globe.svg b/koc-portal/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/koc-portal/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/koc-portal/public/og.png b/koc-portal/public/og.png new file mode 100644 index 0000000..3162520 Binary files /dev/null and b/koc-portal/public/og.png differ diff --git a/koc-portal/public/window.svg b/koc-portal/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/koc-portal/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/koc-portal/tests/rendered-html.test.mjs b/koc-portal/tests/rendered-html.test.mjs new file mode 100644 index 0000000..fd23092 --- /dev/null +++ b/koc-portal/tests/rendered-html.test.mjs @@ -0,0 +1,106 @@ +import assert from "node:assert/strict"; +import { access, readFile } from "node:fs/promises"; +import test from "node:test"; +import { + formatShanghaiDate, + parseStoredDate, +} from "../app/date-utils.ts"; + +test("builds the branded external task shell", async () => { + const [page, layout] = await Promise.all([ + readFile(new URL("../app/page.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/layout.tsx", import.meta.url), "utf8"), + ]); + assert.match(layout, /KOC LOOP|外部任务领取/); + assert.match(layout, /og\.png/); + assert.match(page, /正在打开任务/); + await access(new URL("../dist/server/index.js", import.meta.url)); +}); + +test("keeps claiming minimal and backfill one-to-one", async () => { + const [page, layout, packageJson, hosting] = + await Promise.all([ + readFile(new URL("../app/page.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/layout.tsx", import.meta.url), "utf8"), + readFile(new URL("../package.json", import.meta.url), "utf8"), + readFile(new URL("../.openai/hosting.json", import.meta.url), "utf8"), + ]); + + assert.match(page, /企微昵称\s*\/\s*联系人/); + assert.match(page, /const \[quantity, setQuantity\] = useState\(1\)/); + assert.match(page, /distributionId:\s*selected\.id/); + assert.match(page, /发布账号昵称/); + assert.match(page, /发布链接/); + assert.match(page, /inputMode="url"/); + assert.match(page, /长链、短链或整段分享文案/); + assert.doesNotMatch(page, /type="url"/); + assert.match(page, /发布截图/); + assert.match(page, /发布配图/); + assert.match(page, /复制标题/); + assert.match(page, /复制文案/); + assert.match(page, /下载原图/); + assert.match(page, /批量保存图片/); + assert.match(page, /navigator\.share/); + assert.match(page, /zipSync/); + assert.match(page, /navigator\.clipboard\.writeText/); + assert.match(page, /URL\.createObjectURL/); + assert.match(page, /\/api\/partner-image/); + assert.match(page, /找回领取记录/); + assert.match(page, /action:\s*"recover"/); + assert.match(page, /同一任务多次领取会分批展示/); + assert.match(page, /这篇笔记已回填,不会与其他笔记错配/); + assert.doesNotMatch(page, /批量回填/); + assert.doesNotMatch(page, /复制标题和正文/); + assert.match(page, /PRODUCTION_ADMIN_ORIGIN/); + assert.match(page, /\/api\/partner-upload/); + assert.match(page, /"X-KOC-Distribution":\s*selectedItem\.id/); + assert.match(page, /"X-KOC-Upload-Kind":\s*kind/); + assert.match(page, /上传截图并填写数据/); + assert.match(page, /提交创作者数据/); + assert.match(page, /submit_creator_metrics/); + assert.match(page, /creatorExposure/); + assert.match(page, /creatorViews/); + assert.match(page, /截图仅用于运营核对,不再自动OCR/); + assert.match(page, /曝光量/); + assert.match(page, /阅读量/); + assert.doesNotMatch(page, /recognizeCreatorMetrics/); + assert.match(page, /note-index \$\{item\.publish_url \? "done" : ""\}/); + assert.match(packageJson, /"fflate":\s*"0\.7\.4"/); + assert.doesNotMatch(packageJson, /tesseract\.js/); + assert.match(layout, /逐篇查看笔记详情并一一回填/); + assert.doesNotMatch(packageJson, /react-loading-skeleton/); + const hostingConfig = JSON.parse(hosting); + assert.equal(hostingConfig.d1, null); + assert.equal(hostingConfig.r2, null); + + await access(new URL("../public/og.png", import.meta.url)); + await access(new URL("../public/favicon.svg", import.meta.url)); +}); + +test("shows D1 timestamps in Beijing time", () => { + const stored = "2026-07-29 05:36:00"; + assert.equal(parseStoredDate(stored).toISOString(), "2026-07-29T05:36:00.000Z"); + assert.match(formatShanghaiDate(stored, true), /07\/29.*13:36/); +}); + +test("creates anonymous delegation bundles and reuses one-to-one backfill", async () => { + const [page, layout, styles] = await Promise.all([ + readFile(new URL("../app/page.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/layout.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/globals.css", import.meta.url), "utf8"), + ]); + + assert.match(page, /选择笔记并分享/); + assert.match(page, /生成并复制分享链接/); + assert.match(page, /action:\s*"create_delegation"/); + assert.match(page, /action:\s*"revoke_delegation"/); + assert.match(page, /合作社转派 · 无需登录/); + assert.match(page, /"X-KOC-Delegation"/); + assert.match(page, /url\.searchParams\.set\("share", shareToken\)/); + assert.match(page, /请保存当前分享链接/); + assert.doesNotMatch(page, /底层KOC手机号|底层KOC企微|底层KOC微信/); + assert.match(layout, /index:\s*false/); + assert.match(layout, /referrer:\s*"no-referrer"/); + assert.match(styles, /\.share-checkbox/); + assert.match(styles, /\.delegation-history/); +}); diff --git a/koc-portal/tsconfig.json b/koc-portal/tsconfig.json new file mode 100644 index 0000000..3a13f90 --- /dev/null +++ b/koc-portal/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} diff --git a/koc-portal/vite.config.ts b/koc-portal/vite.config.ts new file mode 100644 index 0000000..ae08f93 --- /dev/null +++ b/koc-portal/vite.config.ts @@ -0,0 +1,59 @@ +import vinext from "vinext"; +import { defineConfig } from "vite"; +import hostingConfig from "./.openai/hosting.json"; +import { sites } from "./build/sites-vite-plugin"; + +const SITE_CREATOR_PLACEHOLDER_DATABASE_ID = + "00000000-0000-4000-8000-000000000000"; + +const { d1, r2 } = hostingConfig; + +// macOS Seatbelt blocks FSEvents, so Codex previews need polling for HMR. +const isCodexSeatbeltSandbox = process.env.CODEX_SANDBOX === "seatbelt"; + +const localBindingConfig = { + main: "./worker/index.ts", + compatibility_flags: ["nodejs_compat"], + d1_databases: d1 + ? [ + { + binding: d1, + database_name: "site-creator-d1", + database_id: SITE_CREATOR_PLACEHOLDER_DATABASE_ID, + }, + ] + : [], + r2_buckets: r2 + ? [ + { + binding: r2, + bucket_name: "site-creator-r2", + }, + ] + : [], +}; + +export default defineConfig(async () => { + // Keep Wrangler and Miniflare state project-local. These are non-secret tool + // settings; application environment belongs in ignored `.env*` files. + process.env.WRANGLER_WRITE_LOGS ??= "false"; + process.env.WRANGLER_LOG_PATH ??= ".wrangler/logs"; + process.env.MINIFLARE_REGISTRY_PATH ??= ".wrangler/registry"; + + // Wrangler snapshots its log path while the Cloudflare plugin is imported. + const { cloudflare } = await import("@cloudflare/vite-plugin"); + + return { + server: isCodexSeatbeltSandbox + ? { watch: { useFsEvents: false, usePolling: true } } + : undefined, + plugins: [ + vinext(), + sites(), + cloudflare({ + viteEnvironment: { name: "rsc", childEnvironments: ["ssr"] }, + config: localBindingConfig, + }), + ], + }; +}); diff --git a/koc-portal/worker/index.ts b/koc-portal/worker/index.ts new file mode 100644 index 0000000..b3cd137 --- /dev/null +++ b/koc-portal/worker/index.ts @@ -0,0 +1,47 @@ +/** Cloudflare Worker entry point for the vinext-starter template. */ +import { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from "vinext/server/image-optimization"; +import handler from "vinext/server/app-router-entry"; + +interface Env { + ASSETS: Fetcher; + DB: D1Database; + IMAGES: { + input(stream: ReadableStream): { + transform(options: Record): { + output(options: { format: string; quality: number }): Promise<{ response(): Response }>; + }; + }; + }; +} + +interface ExecutionContext { + waitUntil(promise: Promise): void; + passThroughOnException(): void; +} + +// Image security config. SVG sources with .svg extension auto-skip the +// optimization endpoint on the client side (served directly, no proxy). +// To route SVGs through the optimizer (with security headers), set +// dangerouslyAllowSVG: true in next.config.js and uncomment below: +// const imageConfig: ImageConfig = { dangerouslyAllowSVG: true }; + +const worker = { + async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { + const url = new URL(request.url); + + if (url.pathname === "/_vinext/image") { + const allowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]; + return handleImageOptimization(request, { + fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))), + transformImage: async (body, { width, format, quality }) => { + const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality }); + return result.response(); + }, + }, allowedWidths); + } + + return handler.fetch(request, env, ctx); + }, +}; + +export default worker; diff --git a/lib/account-enrichment-service.ts b/lib/account-enrichment-service.ts new file mode 100644 index 0000000..0e7a5e1 --- /dev/null +++ b/lib/account-enrichment-service.ts @@ -0,0 +1,318 @@ +import { + resolveXhsPublicAccountDetails, + resolveXhsAccountProfileFromMcp, + resolveXhsProfileDetailsFromMcp, + type CollectionMcpConfig, +} from "./mcp-collection-client"; +import { hashText } from "./mvp-db"; + +type DistributionAccountRow = { + id: string; + account_id: string | null; + publish_url: string | null; +}; + +type BackfillRow = DistributionAccountRow & { + nickname: string | null; + platform: string | null; + platform_uid: string | null; + public_account_id: string | null; + profile_url: string | null; + followers: number | null; +}; + +function isVerifiedXhsProfileUrl(value: string | null) { + if (!value) return false; + try { + const url = new URL(value); + return ( + url.protocol === "https:" && + (url.hostname === "xiaohongshu.com" || + url.hostname.endsWith(".xiaohongshu.com")) && + url.pathname.startsWith("/user/profile/") + ); + } catch { + return false; + } +} + +export async function enrichDistributionAccount( + db: D1Database, + distributionId: string, + publishUrl: string, + fallbackNickname: string, + mcpConfig: CollectionMcpConfig, +) { + const profile = await resolveXhsAccountProfileFromMcp( + publishUrl, + fallbackNickname, + mcpConfig, + ); + const current = await db + .prepare( + `SELECT id, account_id, publish_url + FROM distributions + WHERE id = ?`, + ) + .bind(distributionId) + .first(); + if (!current || current.publish_url !== publishUrl) { + return { updated: false, reason: "stale" as const }; + } + + const canonicalAccountId = `account-${hashText( + `小红书:${profile.platformUid}`, + )}`; + if (current.account_id === canonicalAccountId) { + await db + .prepare( + `UPDATE accounts SET + nickname = ?, + profile_url = ?, + public_account_id = CASE + WHEN ? != '' THEN ? + ELSE public_account_id + END, + ip_location = CASE + WHEN ? != '' AND ? != '待识别' THEN ? + ELSE ip_location + END, + followers = CASE + WHEN ? IS NOT NULL AND (? > 0 OR followers = 0) THEN ? + ELSE followers + END, + last_seen_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind( + profile.nickname || fallbackNickname, + profile.profileUrl, + profile.redId, + profile.redId, + profile.ipLocation, + profile.ipLocation, + profile.ipLocation, + profile.followers, + profile.followers, + profile.followers, + canonicalAccountId, + ) + .run(); + return { + updated: true, + accountId: canonicalAccountId, + profileUrl: profile.profileUrl, + }; + } + + const provisionalAccountId = current.account_id; + await db.batch([ + db + .prepare( + `INSERT INTO accounts + (id, platform, platform_uid, public_account_id, nickname, profile_url, ip_location, followers, post_count) + VALUES (?, '小红书', ?, ?, ?, ?, ?, ?, 1) + ON CONFLICT(platform, platform_uid) DO UPDATE SET + public_account_id = CASE + WHEN excluded.public_account_id != '' + THEN excluded.public_account_id + ELSE accounts.public_account_id + END, + nickname = excluded.nickname, + profile_url = excluded.profile_url, + ip_location = CASE + WHEN excluded.ip_location != '' AND excluded.ip_location != '待识别' + THEN excluded.ip_location + ELSE accounts.ip_location + END, + followers = CASE + WHEN excluded.followers > 0 OR accounts.followers = 0 + THEN excluded.followers + ELSE accounts.followers + END, + post_count = accounts.post_count + 1, + last_seen_at = CURRENT_TIMESTAMP`, + ) + .bind( + canonicalAccountId, + profile.platformUid, + profile.redId, + profile.nickname || fallbackNickname, + profile.profileUrl, + profile.ipLocation, + profile.followers ?? 0, + ), + db + .prepare( + `UPDATE distributions SET + account_id = ?, + updated_at = CURRENT_TIMESTAMP + WHERE id = ? AND publish_url = ?`, + ) + .bind(canonicalAccountId, distributionId, publishUrl), + ]); + + if (provisionalAccountId) { + await db + .prepare( + `DELETE FROM accounts + WHERE id = ? + AND id != ? + AND NOT EXISTS ( + SELECT 1 FROM distributions WHERE account_id = ? + )`, + ) + .bind( + provisionalAccountId, + canonicalAccountId, + provisionalAccountId, + ) + .run(); + } + return { + updated: true, + accountId: canonicalAccountId, + profileUrl: profile.profileUrl, + }; +} + +export async function backfillAccountProfiles( + db: D1Database, + mcpConfig: CollectionMcpConfig, + limit = 10, +) { + const rows = await db + .prepare( + `SELECT + d.id, + d.account_id, + d.publish_url, + a.nickname, + a.platform, + a.platform_uid, + a.public_account_id, + a.profile_url, + a.followers + FROM distributions d + LEFT JOIN accounts a ON a.id = d.account_id + WHERE d.publish_url IS NOT NULL + AND d.publish_url != '' + ORDER BY d.updated_at DESC + LIMIT 100`, + ) + .all(); + let attempted = 0; + let updated = 0; + let failed = 0; + + for (const row of rows.results) { + if (attempted >= Math.max(1, Math.min(25, limit))) break; + const noteId = (() => { + try { + const url = new URL(row.publish_url ?? ""); + return ( + url.pathname.match( + /\/(?:discovery\/item|explore)\/([A-Za-z0-9_-]{8,80})/, + )?.[1] ?? "" + ); + } catch { + return ""; + } + })(); + const isDemoAccount = row.platform_uid?.startsWith("xhs-"); + let attemptedThisRow = false; + let publicProfileUpdated = false; + if ( + row.platform === "小红书" && + !isDemoAccount && + isVerifiedXhsProfileUrl(row.profile_url) && + (!row.public_account_id || Number(row.followers ?? 0) === 0) + ) { + attempted += 1; + attemptedThisRow = true; + const details = await resolveXhsProfileDetailsFromMcp( + row.profile_url ?? "", + mcpConfig, + ).catch(() => + resolveXhsPublicAccountDetails(row.profile_url ?? ""), + ); + if ( + row.account_id && + (details.redId || details.followers !== null) + ) { + await db + .prepare( + `UPDATE accounts + SET public_account_id = CASE + WHEN ? != '' THEN ? + ELSE public_account_id + END, + followers = CASE + WHEN ? IS NOT NULL AND (? > 0 OR followers = 0) THEN ? + ELSE followers + END, + ip_location = CASE + WHEN ? != '' AND ? != '待识别' THEN ? + ELSE ip_location + END, + last_seen_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind( + details.redId, + details.redId, + details.followers, + details.followers, + details.followers, + details.ipLocation ?? "", + details.ipLocation ?? "", + details.ipLocation ?? "", + row.account_id, + ) + .run(); + publicProfileUpdated = true; + } + if ( + (details.redId || row.public_account_id) && + Number(details.followers ?? row.followers ?? 0) > 0 + ) { + updated += 1; + continue; + } + if (attempted >= Math.max(1, Math.min(25, limit))) { + if (publicProfileUpdated) updated += 1; + continue; + } + } + const needsEnrichment = + !isDemoAccount && + (!row.account_id || + (row.platform === "小红书" && + !isVerifiedXhsProfileUrl(row.profile_url)) || + (row.platform === "小红书" && !row.public_account_id) || + (row.platform === "小红书" && + Number(row.followers ?? 0) === 0) || + row.platform_uid?.startsWith("pending-") || + Boolean(noteId && row.platform_uid === noteId)); + if (!needsEnrichment || !row.publish_url) { + if (publicProfileUpdated) updated += 1; + continue; + } + + if (!attemptedThisRow) attempted += 1; + try { + const result = await enrichDistributionAccount( + db, + row.id, + row.publish_url, + row.nickname || "待识别账号", + mcpConfig, + ); + if (result.updated || publicProfileUpdated) updated += 1; + } catch { + if (publicProfileUpdated) updated += 1; + else failed += 1; + } + } + return { attempted, updated, failed }; +} diff --git a/lib/admin-auth.ts b/lib/admin-auth.ts new file mode 100644 index 0000000..826675f --- /dev/null +++ b/lib/admin-auth.ts @@ -0,0 +1,35 @@ +import { env } from "cloudflare:workers"; + +export function isAdminEmail(input: string | null | undefined) { + const allowedEmail = String( + (env as unknown as { ADMIN_ALLOWED_EMAIL?: string }).ADMIN_ALLOWED_EMAIL ?? + "", + ) + .trim() + .toLowerCase(); + const requestEmail = String(input ?? "").trim().toLowerCase(); + return Boolean(allowedEmail && requestEmail && requestEmail === allowedEmail); +} + +export function isAdminRequest(request: Request) { + if (isAdminEmail(request.headers.get("oai-authenticated-user-email"))) { + return true; + } + const expectedToken = String( + (env as unknown as { ADMIN_INTERNAL_TOKEN?: string }).ADMIN_INTERNAL_TOKEN ?? + "", + ).trim(); + const requestToken = String( + request.headers.get("x-koc-admin-token") ?? "", + ).trim(); + return Boolean( + expectedToken && + requestToken && + expectedToken.length === requestToken.length && + expectedToken === requestToken, + ); +} + +export function adminForbidden() { + return Response.json({ error: "无后台操作权限" }, { status: 403 }); +} diff --git a/lib/collection-service.ts b/lib/collection-service.ts new file mode 100644 index 0000000..28707fd --- /dev/null +++ b/lib/collection-service.ts @@ -0,0 +1,471 @@ +import { + collectXhsMetricsFromMcp, + type CollectionMcpConfig, +} from "./mcp-collection-client"; +import { uid } from "./mvp-db"; + +type DistributionForCollection = { + id: string; + task_id: string; + publish_url: string | null; + ocr_status: string; +}; + +type ScheduledTask = { + id: string; + collection_start_date: string; + collection_days: string; +}; + +type CollectionSource = "automatic" | "catchup" | "manual"; + +function utcDay(value: string) { + const match = value.match(/^(\d{4})-(\d{2})-(\d{2})$/); + if (!match) return null; + return Date.UTC(Number(match[1]), Number(match[2]) - 1, Number(match[3])); +} + +function dateForScheduleDay(startDate: string, scheduleDay: number) { + const start = utcDay(startDate); + if (start === null) return null; + return new Date(start + (scheduleDay - 1) * 86_400_000) + .toISOString() + .slice(0, 10); +} + +function parseDays(value: string) { + try { + const parsed = JSON.parse(value) as unknown; + if (!Array.isArray(parsed)) return []; + return [...new Set(parsed.map(Number))] + .filter((day) => Number.isInteger(day) && day >= 1 && day <= 7) + .sort((a, b) => a - b); + } catch { + return []; + } +} + +export function shanghaiDateFromTimestamp(timestamp: number) { + return new Date(timestamp + 8 * 60 * 60 * 1000) + .toISOString() + .slice(0, 10); +} + +function shanghaiHourFromTimestamp(timestamp: number) { + return Number( + new Date(timestamp + 8 * 60 * 60 * 1000) + .toISOString() + .slice(11, 13), + ); +} + +function dueSchedules( + startDate: string, + days: number[], + timestamp: number, +) { + const currentDate = shanghaiDateFromTimestamp(timestamp); + const currentHour = shanghaiHourFromTimestamp(timestamp); + return days + .map((scheduleDay) => ({ + scheduleDay, + scheduledDate: dateForScheduleDay(startDate, scheduleDay), + })) + .filter( + ( + value, + ): value is { scheduleDay: number; scheduledDate: string } => + Boolean( + value.scheduledDate && + (value.scheduledDate < currentDate || + (value.scheduledDate === currentDate && currentHour >= 10)), + ), + ); +} + +export async function createCollectionRunTasks( + db: D1Database, + taskId: string, + startDate: string, + days: number[], +) { + const normalizedDays = [...new Set(days)] + .filter((day) => Number.isInteger(day) && day >= 1 && day <= 7) + .sort((a, b) => a - b); + const distributions = await db + .prepare( + `SELECT id FROM distributions + WHERE task_id = ? + AND publish_url IS NOT NULL + AND publish_url != ''`, + ) + .bind(taskId) + .all<{ id: string }>(); + + await db + .prepare( + `DELETE FROM collection_runs + WHERE task_id = ? + AND status = 'pending'`, + ) + .bind(taskId) + .run(); + + const statements: D1PreparedStatement[] = []; + for (const distribution of distributions.results) { + for (const scheduleDay of normalizedDays) { + const scheduledDate = dateForScheduleDay(startDate, scheduleDay); + if (!scheduledDate) continue; + statements.push( + db + .prepare( + `INSERT OR IGNORE INTO collection_runs + (id, task_id, distribution_id, scheduled_date, schedule_day, + scheduled_at, status, status_description) + VALUES (?, ?, ?, ?, ?, ?, 'pending', ?)`, + ) + .bind( + uid("run"), + taskId, + distribution.id, + scheduledDate, + scheduleDay, + `${scheduledDate}T10:00:00+08:00`, + `等待第${scheduleDay}天 10:00自动采集`, + ), + ); + } + } + for (let index = 0; index < statements.length; index += 100) { + await db.batch(statements.slice(index, index + 100)); + } + return { + distributions: distributions.results.length, + days: normalizedDays.length, + tasks: statements.length, + }; +} + +export async function collectDistributionMetrics( + db: D1Database, + distributionId: string, + scheduledDate: string, + scheduleDay: number | null, + source: CollectionSource, + mcpConfig: CollectionMcpConfig, +) { + const current = await db + .prepare("SELECT * FROM distributions WHERE id = ?") + .bind(distributionId) + .first(); + if (!current) throw new Error("分发记录不存在"); + if (!current.publish_url) throw new Error("笔记尚未回填发布链接"); + + const scheduledAt = `${scheduledDate}T10:00:00+08:00`; + const runId = uid("run"); + await db + .prepare( + `INSERT OR IGNORE INTO collection_runs + (id, task_id, distribution_id, scheduled_date, schedule_day, + scheduled_at, status, status_description) + VALUES (?, ?, ?, ?, ?, ?, 'pending', ?)`, + ) + .bind( + runId, + current.task_id, + distributionId, + scheduledDate, + scheduleDay, + scheduledAt, + source === "automatic" + ? "等待自动采集" + : source === "catchup" + ? "等待自动追采" + : "等待手动采集", + ) + .run(); + + const run = await db + .prepare( + `SELECT id, status FROM collection_runs + WHERE distribution_id = ? AND scheduled_date = ?`, + ) + .bind(distributionId, scheduledDate) + .first<{ id: string; status: string }>(); + if (!run) throw new Error("采集任务创建失败"); + if (run.status === "success") return { skipped: true }; + + const collectingDescription = + source === "automatic" + ? `第${scheduleDay ?? "—"}天自动采集中` + : source === "catchup" + ? `第${scheduleDay ?? "—"}天自动追采中` + : "正在手动采集"; + await db.batch([ + db + .prepare( + `UPDATE collection_runs + SET schedule_day = COALESCE(schedule_day, ?), + scheduled_at = ?, + status = 'collecting', + status_description = ?, + started_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(scheduleDay, scheduledAt, collectingDescription, run.id), + db + .prepare( + `UPDATE distributions + SET collection_status = 'collecting', + collection_status_description = ?, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(collectingDescription, distributionId), + ]); + + try { + const { likes, comments, collects } = + await collectXhsMetricsFromMcp(current.publish_url, mcpConfig); + const dayWeight = scheduleDay ?? 1; + const successDescription = + source === "automatic" + ? `成功 · 第${dayWeight}天 10:00自动采集` + : source === "catchup" + ? `成功 · 第${dayWeight}天自动追采` + : "成功 · 手动采集"; + + await db.batch([ + db + .prepare( + `UPDATE collection_runs + SET status = 'success', + likes = ?, + comments = ?, + collects = ?, + status_description = ?, + completed_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind( + likes, + comments, + collects, + successDescription, + run.id, + ), + db + .prepare( + `UPDATE distributions + SET latest_likes = ?, + latest_comments = ?, + latest_collects = ?, + collection_status = 'success', + collection_status_description = ?, + collection_updated_at = CURRENT_TIMESTAMP, + last_collection_day = ?, + status = CASE + WHEN exposure IS NOT NULL AND views IS NOT NULL THEN 'complete' + ELSE 'collecting' + END, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind( + likes, + comments, + collects, + successDescription, + scheduleDay, + distributionId, + ), + ]); + return { skipped: false, likes, comments, collects }; + } catch (error) { + const message = + error instanceof Error ? error.message : "公开数据采集失败"; + await db.batch([ + db + .prepare( + `UPDATE collection_runs + SET status = 'failed', + status_description = ?, + completed_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(message, run.id), + db + .prepare( + `UPDATE distributions + SET collection_status = 'failed', + collection_status_description = ?, + collection_updated_at = CURRENT_TIMESTAMP, + updated_at = CURRENT_TIMESTAMP + WHERE id = ?`, + ) + .bind(message, distributionId), + ]); + throw error; + } +} + +export async function runScheduledCollections( + db: D1Database, + scheduledTimestamp: number, + mcpConfig: CollectionMcpConfig, +) { + return runDueScheduledCollections( + db, + scheduledTimestamp, + mcpConfig, + "automatic", + ); +} + +export async function runDueScheduledCollections( + db: D1Database, + timestamp: number, + mcpConfig: CollectionMcpConfig, + source: Extract = "catchup", + onlyTaskId?: string, +) { + const currentDate = shanghaiDateFromTimestamp(timestamp); + const tasks = await db + .prepare( + `SELECT id, collection_start_date, collection_days + FROM tasks + WHERE collection_start_date IS NOT NULL + AND collection_start_date != '' + AND collection_days IS NOT NULL + AND collection_days != '[]' + AND (? IS NULL OR id = ?)`, + ) + .bind(onlyTaskId ?? null, onlyTaskId ?? null) + .all(); + let dueTasks = 0; + let attempted = 0; + let succeeded = 0; + let failed = 0; + + for (const task of tasks.results) { + const schedules = dueSchedules( + task.collection_start_date, + parseDays(task.collection_days), + timestamp, + ); + for (const { scheduleDay, scheduledDate } of schedules) { + dueTasks += 1; + const distributions = await db + .prepare( + `SELECT d.id FROM distributions d + WHERE d.task_id = ? + AND d.publish_url IS NOT NULL + AND d.publish_url != '' + AND NOT EXISTS ( + SELECT 1 FROM collection_runs r + WHERE r.distribution_id = d.id + AND r.scheduled_date = ? + AND ( + r.status = 'success' + OR ( + r.status = 'collecting' + AND r.started_at >= datetime('now', '-30 minutes') + ) + OR ( + r.status = 'failed' + AND r.completed_at >= datetime('now', '-15 minutes') + ) + ) + )`, + ) + .bind(task.id, scheduledDate) + .all<{ id: string }>(); + + for (const distribution of distributions.results) { + attempted += 1; + try { + await collectDistributionMetrics( + db, + distribution.id, + scheduledDate, + scheduleDay, + source, + mcpConfig, + ); + succeeded += 1; + } catch { + failed += 1; + } + } + } + } + + return { currentDate, dueTasks, attempted, succeeded, failed }; +} + +export async function retryFailedCollections( + db: D1Database, + taskId: string, + mcpConfig: CollectionMcpConfig, +) { + const failedDistributions = await db + .prepare( + `SELECT + d.id, + COALESCE( + ( + SELECT r.scheduled_date + FROM collection_runs r + WHERE r.distribution_id = d.id + AND r.status = 'failed' + ORDER BY COALESCE(r.completed_at, r.created_at) DESC + LIMIT 1 + ), + ? + ) AS scheduled_date, + ( + SELECT r.schedule_day + FROM collection_runs r + WHERE r.distribution_id = d.id + AND r.status = 'failed' + ORDER BY COALESCE(r.completed_at, r.created_at) DESC + LIMIT 1 + ) AS schedule_day + FROM distributions d + WHERE d.task_id = ? + AND d.publish_url IS NOT NULL + AND d.publish_url != '' + AND d.collection_status = 'failed' + ORDER BY COALESCE(d.collection_updated_at, d.updated_at) + LIMIT 50`, + ) + .bind(shanghaiDateFromTimestamp(Date.now()), taskId) + .all<{ + id: string; + scheduled_date: string; + schedule_day: number | null; + }>(); + + let succeeded = 0; + let failed = 0; + for (const distribution of failedDistributions.results) { + try { + await collectDistributionMetrics( + db, + distribution.id, + distribution.scheduled_date, + distribution.schedule_day, + "manual", + mcpConfig, + ); + succeeded += 1; + } catch { + failed += 1; + } + } + return { + attempted: failedDistributions.results.length, + succeeded, + failed, + }; +} diff --git a/lib/date-utils.ts b/lib/date-utils.ts new file mode 100644 index 0000000..efa3200 --- /dev/null +++ b/lib/date-utils.ts @@ -0,0 +1,26 @@ +export function parseStoredDate(value: string) { + const trimmed = value.trim(); + const normalized = /^\d{4}-\d{2}-\d{2}$/.test(trimmed) + ? `${trimmed}T00:00:00+08:00` + : /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?$/.test( + trimmed, + ) + ? `${trimmed.replace(" ", "T")}Z` + : trimmed; + return new Date(normalized); +} + +export function formatShanghaiDate( + value: string | null | undefined, + withTime = false, +) { + if (!value) return "—"; + const date = parseStoredDate(value); + if (Number.isNaN(date.getTime())) return value; + return new Intl.DateTimeFormat("zh-CN", { + timeZone: "Asia/Shanghai", + month: "2-digit", + day: "2-digit", + ...(withTime ? { hour: "2-digit", minute: "2-digit" } : {}), + }).format(date); +} diff --git a/lib/feishu-client.ts b/lib/feishu-client.ts new file mode 100644 index 0000000..cc5ef49 --- /dev/null +++ b/lib/feishu-client.ts @@ -0,0 +1,557 @@ +const FEISHU_API_ORIGIN = "https://open.feishu.cn"; +const MAX_SHEET_ROWS = 5_000; +const MAX_SHEET_COLUMNS = 100; +const MAX_CONTENT_ROWS = 1_000; +const MAX_MEDIA_BYTES = 20_000_000; + +export type FeishuBindings = { + FEISHU_APP_ID?: string; + FEISHU_APP_SECRET?: string; +}; + +export type FeishuSourceImage = { + index: number; + fileToken: string; + width: number | null; + height: number | null; +}; + +export type FeishuSourceRow = { + sourceRow: number; + title: string; + body: string; + images: FeishuSourceImage[]; +}; + +export type FeishuSource = { + url: string; + wikiToken: string; + spreadsheetToken: string; + sheetId: string; + sheetName: string; + syncedAt: string; + columns: string[]; + rows: FeishuSourceRow[]; +}; + +type FetchLike = typeof fetch; + +type FeishuEnvelope = { + code?: number; + msg?: string; + data?: T; + tenant_access_token?: string; + expire?: number; +}; + +type SheetInfo = { + sheet_id?: string; + title?: string; + hidden?: boolean; + resource_type?: string; + grid_properties?: { + row_count?: number; + column_count?: number; + }; +}; + +type CachedAccessToken = { + appId: string; + token: string; + expiresAt: number; +}; + +let cachedAccessToken: CachedAccessToken | null = null; + +export class FeishuSourceError extends Error { + status: number; + + constructor(message: string, status = 500) { + super(message); + this.name = "FeishuSourceError"; + this.status = status; + } +} + +function bindingValue(value: unknown) { + return String(value ?? "").trim(); +} + +function providerMessage(value: unknown) { + const message = String(value ?? "").trim(); + return message + .replace(/https?:\/\/[^\s"'<>]+/gi, "[飞书权限链接]") + .slice(0, 240); +} + +function normalizeHeader(value: unknown) { + return cellText(value) + .toLowerCase() + .replace(/[\s()()【】[\]_\-—::/\\]+/g, ""); +} + +function isRecord(value: unknown): value is Record { + return value !== null && typeof value === "object" && !Array.isArray(value); +} + +function cellText(value: unknown): string { + if (value === null || value === undefined) return ""; + if (typeof value === "string") return value.trim(); + if (typeof value === "number" || typeof value === "boolean") { + return String(value); + } + if (Array.isArray(value)) { + return value + .map(cellText) + .filter(Boolean) + .join(""); + } + if (!isRecord(value) || value.type === "embed-image") return ""; + if (typeof value.text === "string") return value.text.trim(); + if (typeof value.value === "string") return value.value.trim(); + return ""; +} + +function extractImages(value: unknown, output: FeishuSourceImage[]) { + if (Array.isArray(value)) { + for (const item of value) extractImages(item, output); + return; + } + if (!isRecord(value)) return; + const fileToken = bindingValue(value.fileToken ?? value.image_token); + if (value.type === "embed-image" && fileToken) { + output.push({ + index: 0, + fileToken, + width: + typeof value.width === "number" + ? value.width + : typeof value.image_width === "number" + ? value.image_width + : null, + height: + typeof value.height === "number" + ? value.height + : typeof value.image_height === "number" + ? value.image_height + : null, + }); + } + for (const child of Object.values(value)) { + if (child !== value.fileToken && child !== value.image_token) { + extractImages(child, output); + } + } +} + +function columnName(index: number) { + let value = index + 1; + let result = ""; + while (value > 0) { + const remainder = (value - 1) % 26; + result = String.fromCharCode(65 + remainder) + result; + value = Math.floor((value - 1) / 26); + } + return result; +} + +function headerMatches(header: string, candidates: RegExp[]) { + return candidates.some((candidate) => candidate.test(header)); +} + +function findHeader(values: unknown[][]) { + let best: + | { + rowIndex: number; + idIndex: number; + titleIndex: number; + bodyIndex: number; + tagsIndex: number; + score: number; + } + | undefined; + + for (let rowIndex = 0; rowIndex < Math.min(values.length, 20); rowIndex += 1) { + const headers = (values[rowIndex] ?? []).map(normalizeHeader); + const idIndex = headers.findIndex((header) => + headerMatches(header, [/^id$/, /作品id/, /序号/, /编号/]), + ); + const titleIndex = headers.findIndex((header) => + headerMatches(header, [/标题/, /题目/]), + ); + const bodyIndex = headers.findIndex((header) => + headerMatches(header, [/笔记内容/, /正文/, /文案/, /^内容$/]), + ); + const tagsIndex = headers.findIndex((header) => + headerMatches(header, [/标签/, /话题/, /^tags?$/]), + ); + const score = + (titleIndex >= 0 ? 5 : 0) + + (bodyIndex >= 0 ? 5 : 0) + + (idIndex >= 0 ? 1 : 0) + + (tagsIndex >= 0 ? 1 : 0); + if (!best || score > best.score) { + best = { + rowIndex, + idIndex, + titleIndex, + bodyIndex, + tagsIndex, + score, + }; + } + } + + if (!best || best.titleIndex < 0 || best.bodyIndex < 0) { + throw new FeishuSourceError( + "没有找到“标题”和“正文/笔记内容”列,请检查飞书表头", + 422, + ); + } + return best; +} + +function parseRows(values: unknown[][]) { + const header = findHeader(values); + const headerRow = values[header.rowIndex] ?? []; + const usedSourceRows = new Set(); + const rows: FeishuSourceRow[] = []; + let maxImageCount = 0; + + for ( + let rowIndex = header.rowIndex + 1; + rowIndex < values.length && rows.length < MAX_CONTENT_ROWS; + rowIndex += 1 + ) { + const row = values[rowIndex] ?? []; + const title = cellText(row[header.titleIndex]); + if (!title) continue; + const rawBody = cellText(row[header.bodyIndex]); + const tags = + header.tagsIndex >= 0 ? cellText(row[header.tagsIndex]) : ""; + const body = + tags && !rawBody.includes(tags) + ? [rawBody, tags].filter(Boolean).join("\n\n") + : rawBody; + const idValue = + header.idIndex >= 0 + ? Number.parseInt(cellText(row[header.idIndex]), 10) + : Number.NaN; + let sourceRow = + Number.isInteger(idValue) && idValue > 0 ? idValue : rowIndex + 1; + if (usedSourceRows.has(sourceRow)) sourceRow = rowIndex + 1; + usedSourceRows.add(sourceRow); + + const collectedImages: FeishuSourceImage[] = []; + for (const cell of row) extractImages(cell, collectedImages); + const seenTokens = new Set(); + const images = collectedImages + .filter((image) => { + if (seenTokens.has(image.fileToken)) return false; + seenTokens.add(image.fileToken); + return true; + }) + .map((image, imageIndex) => ({ ...image, index: imageIndex + 1 })); + maxImageCount = Math.max(maxImageCount, images.length); + rows.push({ sourceRow, title, body, images }); + } + + if (rows.length === 0) { + throw new FeishuSourceError("表格中没有可导入的有效标题行", 422); + } + + const matchedColumns = [ + header.idIndex >= 0 ? cellText(headerRow[header.idIndex]) : "", + cellText(headerRow[header.titleIndex]) || "标题", + header.tagsIndex >= 0 ? cellText(headerRow[header.tagsIndex]) : "", + cellText(headerRow[header.bodyIndex]) || "正文", + ...Array.from({ length: maxImageCount }, (_, index) => `图片${index + 1}`), + ].filter(Boolean); + + return { + columns: [...new Set(matchedColumns)], + rows, + }; +} + +async function jsonEnvelope( + response: Response, + fallbackMessage: string, +): Promise> { + const text = await response.text(); + let payload: FeishuEnvelope; + try { + payload = JSON.parse(text) as FeishuEnvelope; + } catch { + throw new FeishuSourceError( + `${fallbackMessage}(飞书返回了异常响应)`, + 502, + ); + } + if (!response.ok || (typeof payload.code === "number" && payload.code !== 0)) { + const code = Number(payload.code); + const rawMessage = providerMessage(payload.msg); + if ([99991672, 99991679].includes(code)) { + throw new FeishuSourceError( + "飞书应用缺少电子表格或知识库读取权限,请先在飞书开放平台开通权限", + 403, + ); + } + if ([131006, 1310213].includes(code) || response.status === 403) { + throw new FeishuSourceError( + "飞书应用没有这张表的访问权限,请在表格中添加该文档应用或将应用加入知识库", + 403, + ); + } + if ([131005, 1310214].includes(code) || response.status === 404) { + throw new FeishuSourceError("没有找到对应的飞书表格", 404); + } + throw new FeishuSourceError( + rawMessage + ? `${fallbackMessage}:${rawMessage}` + : `${fallbackMessage}(HTTP ${response.status})`, + response.status >= 400 ? response.status : 502, + ); + } + return payload; +} + +function feishuConfig(bindings: FeishuBindings) { + const appId = bindingValue(bindings.FEISHU_APP_ID); + const appSecret = bindingValue(bindings.FEISHU_APP_SECRET); + if (!appId || !appSecret) { + throw new FeishuSourceError( + "飞书 API 尚未配置,请先配置应用的 App ID 和 App Secret", + 503, + ); + } + return { appId, appSecret }; +} + +async function accessToken( + bindings: FeishuBindings, + fetchImpl: FetchLike, +) { + const { appId, appSecret } = feishuConfig(bindings); + if ( + cachedAccessToken?.appId === appId && + cachedAccessToken.expiresAt > Date.now() + 60_000 + ) { + return cachedAccessToken.token; + } + const response = await fetchImpl( + `${FEISHU_API_ORIGIN}/open-apis/auth/v3/tenant_access_token/internal`, + { + method: "POST", + headers: { "Content-Type": "application/json; charset=utf-8" }, + body: JSON.stringify({ app_id: appId, app_secret: appSecret }), + signal: AbortSignal.timeout(12_000), + }, + ); + const payload = await jsonEnvelope(response, "获取飞书访问凭证失败"); + const token = bindingValue(payload.tenant_access_token); + if (!token) { + throw new FeishuSourceError("飞书没有返回有效访问凭证", 502); + } + cachedAccessToken = { + appId, + token, + expiresAt: Date.now() + Math.max(300, Number(payload.expire) || 7_200) * 1_000, + }; + return token; +} + +async function feishuGet( + path: string, + token: string, + fetchImpl: FetchLike, + fallbackMessage: string, + params?: URLSearchParams, +) { + const url = new URL(path, FEISHU_API_ORIGIN); + if (params) url.search = params.toString(); + const response = await fetchImpl(url.toString(), { + headers: { + Authorization: `Bearer ${token}`, + "Content-Type": "application/json; charset=utf-8", + }, + signal: AbortSignal.timeout(15_000), + }); + const payload = await jsonEnvelope(response, fallbackMessage); + if (!payload.data) { + throw new FeishuSourceError(`${fallbackMessage}(响应缺少数据)`, 502); + } + return payload.data; +} + +function parseSourceUrl(input: string) { + let url: URL; + try { + url = new URL(input); + } catch { + throw new FeishuSourceError("飞书链接格式无效", 400); + } + const validHost = + url.hostname === "feishu.cn" || + url.hostname.endsWith(".feishu.cn") || + url.hostname === "larksuite.com" || + url.hostname.endsWith(".larksuite.com"); + if (!["http:", "https:"].includes(url.protocol) || !validHost) { + throw new FeishuSourceError("请粘贴飞书 Wiki 或电子表格链接", 400); + } + const match = url.pathname.match(/\/(wiki|sheets|spreadsheets)\/([^/?]+)/); + if (!match) { + throw new FeishuSourceError("请粘贴飞书 Wiki 或电子表格链接", 400); + } + return { + url, + kind: match[1], + token: match[2], + requestedSheetId: bindingValue(url.searchParams.get("sheet")), + }; +} + +export async function readFeishuSource( + input: string, + bindings: FeishuBindings, + fetchImpl: FetchLike = fetch, +): Promise { + const parsed = parseSourceUrl(input); + const token = await accessToken(bindings, fetchImpl); + let wikiToken = ""; + let spreadsheetToken = parsed.token; + + if (parsed.kind === "wiki") { + wikiToken = parsed.token; + const nodeData = await feishuGet<{ + node?: { obj_type?: string; obj_token?: string }; + }>( + "/open-apis/wiki/v2/spaces/get_node", + token, + fetchImpl, + "读取飞书知识库节点失败", + new URLSearchParams({ token: parsed.token }), + ); + if (nodeData.node?.obj_type !== "sheet" || !nodeData.node.obj_token) { + throw new FeishuSourceError("该飞书 Wiki 链接不是电子表格", 422); + } + spreadsheetToken = nodeData.node.obj_token; + } + + const sheetData = await feishuGet<{ sheets?: SheetInfo[] }>( + `/open-apis/sheets/v3/spreadsheets/${encodeURIComponent(spreadsheetToken)}/sheets/query`, + token, + fetchImpl, + "读取飞书工作表列表失败", + ); + const visibleSheets = (sheetData.sheets ?? []).filter( + (sheet) => + sheet.sheet_id && + sheet.resource_type !== "bitable" && + sheet.hidden !== true, + ); + let selectedSheet = parsed.requestedSheetId + ? visibleSheets.find((sheet) => sheet.sheet_id === parsed.requestedSheetId) + : undefined; + if (!parsed.requestedSheetId) { + if (visibleSheets.length === 1) { + selectedSheet = visibleSheets[0]; + } else if (visibleSheets.length > 1) { + throw new FeishuSourceError( + "该表格包含多个工作表,请打开目标工作表后复制带 sheet 参数的链接", + 422, + ); + } + } + if (!selectedSheet?.sheet_id) { + throw new FeishuSourceError("链接中的工作表不存在或已隐藏", 404); + } + + const rowCount = Math.max( + 1, + Math.min( + MAX_SHEET_ROWS, + Number(selectedSheet.grid_properties?.row_count) || 200, + ), + ); + const columnCount = Math.max( + 1, + Math.min( + MAX_SHEET_COLUMNS, + Number(selectedSheet.grid_properties?.column_count) || 26, + ), + ); + const range = `${selectedSheet.sheet_id}!A1:${columnName(columnCount - 1)}${rowCount}`; + const valuesParams = new URLSearchParams(); + valuesParams.append("ranges", range); + const valuesData = await feishuGet<{ + valueRanges?: Array<{ values?: unknown[][] }>; + }>( + `/open-apis/sheets/v2/spreadsheets/${encodeURIComponent(spreadsheetToken)}/values_batch_get`, + token, + fetchImpl, + "读取飞书表格内容失败", + valuesParams, + ); + const values = valuesData.valueRanges?.[0]?.values; + if (!Array.isArray(values)) { + throw new FeishuSourceError("飞书表格没有返回可读取的单元格", 422); + } + const parsedRows = parseRows(values); + + return { + url: parsed.url.toString(), + wikiToken, + spreadsheetToken, + sheetId: selectedSheet.sheet_id, + sheetName: bindingValue(selectedSheet.title) || "未命名工作表", + syncedAt: new Date().toISOString(), + columns: parsedRows.columns, + rows: parsedRows.rows, + }; +} + +export async function downloadFeishuMedia( + fileToken: string, + bindings: FeishuBindings, + fetchImpl: FetchLike = fetch, +) { + const normalizedToken = bindingValue(fileToken); + if (!/^[A-Za-z0-9_-]{8,240}$/.test(normalizedToken)) { + throw new FeishuSourceError("飞书图片标识无效", 400); + } + const token = await accessToken(bindings, fetchImpl); + const response = await fetchImpl( + `${FEISHU_API_ORIGIN}/open-apis/drive/v1/medias/${encodeURIComponent(normalizedToken)}/download`, + { + headers: { Authorization: `Bearer ${token}` }, + signal: AbortSignal.timeout(20_000), + }, + ); + const declaredSize = Number(response.headers.get("content-length")); + if (Number.isFinite(declaredSize) && declaredSize > MAX_MEDIA_BYTES) { + throw new FeishuSourceError("飞书图片超过20MB,无法同步", 413); + } + if (!response.ok) { + throw new FeishuSourceError( + response.status === 403 + ? "飞书应用没有这张图片的下载权限" + : `下载飞书图片失败(HTTP ${response.status})`, + response.status === 403 ? 403 : 502, + ); + } + const bytes = await response.arrayBuffer(); + if (bytes.byteLength > MAX_MEDIA_BYTES) { + throw new FeishuSourceError("飞书图片超过20MB,无法同步", 413); + } + return { + bytes, + contentType: + response.headers.get("content-type")?.split(";")[0] || + "application/octet-stream", + }; +} + +export function clearFeishuAccessTokenCacheForTests() { + cachedAccessToken = null; +} diff --git a/lib/feishu-source-snapshot.json b/lib/feishu-source-snapshot.json new file mode 100644 index 0000000..b58bf80 --- /dev/null +++ b/lib/feishu-source-snapshot.json @@ -0,0 +1,828 @@ +{ + "wikiToken": "BSzxwRbGJi5dWoksauicUjtonks", + "sheetId": "954953", + "sheetName": "打包骑手500篇", + "sourceRange": "B1:E508", + "syncedAt": "2026-07-27T11:30:38.566Z", + "columns": [ + "序号(不能改)", + "标题", + "笔记内容(正文+话题)", + "图片1", + "图片2", + "图片3" + ], + "rows": [ + { + "sourceRow": 1, + "title": "🚗宝妈开窍了!我的“接娃神车”有了新使命✨", + "body": "全职带娃第三年,每天除了接送娃就是在小区里瞎转悠😭\n刷到业主载骑手的帖子,突然灵光一闪!我这台“接娃神车”后座闲着也是闲着,不如发挥点余热~\n今天下午在小区门口蹲了十分钟,嘿!真“打包”到一个送鲜花的某团骑手小哥💐\n他连声说谢谢,我心里暖暖的❤️ 这可是我三年来第一次觉得,原来我这小区,也需要我!\n这种被需要的感觉,比带娃还治愈😭\n\n#宝妈兼职 #小区互助 #打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/1/1", + "width": 1242, + "height": 1656 + }, + { + "index": 2, + "key": "content-assets/954953/1/2", + "width": 1080, + "height": 1501 + } + ] + }, + { + "sourceRow": 2, + "title": "🗺️小区“活地图”上线!骑手都看呆了🤩", + "body": "以前是导游,现在是小区专属“活地图”!谁懂啊家人们🤣\n哪栋楼在哪个岔口拐弯,哪个减速带最颠,我闭着眼都能开到,比导航还准!\n今天顺路带了个某团骑手小哥,从小区门口到目的地,三分钟直达!\n他下车时惊到失语:“姐,你对这小区也太熟了吧!”\n哈哈,那是~ 姐的青春都献给这几条路啦,能帮到他真的很开心🥳\n\n#小区生活 #顺路带一程 #美团骑手 #打包骑手 #骑手#外卖小哥 #当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/2/1", + "width": 1242, + "height": 1656 + }, + { + "index": 2, + "key": "content-assets/954953/2/2", + "width": 960, + "height": 1280 + } + ] + }, + { + "sourceRow": 3, + "title": "💖全职妈妈的顺风车,暖到某团骑手心坎里❤️", + "body": "全职妈妈的生活,好像只有娃和家,偶尔也会觉得有点枯燥😮💨\n今天送完娃回家,在小区门口看到一个某团骑手小哥,电动车停在路边,对着手机地图一脸愁容\n我摇下车窗问他是不是迷路了,他说第一次来,导航绕得头晕😵💫\n一看他要去的楼栋,正好在我家附近!“上来吧,我带你过去~”\n小哥有点不好意思,但还是坐了上来,送到后连声道谢,说省了好多时间\n原来,能用自己的小车帮到别人,比刷一下午剧有意义多了🥰\n\n#全职妈妈 #暖心瞬间 #当了一把骑手的骑手#打包骑手 #骑手 #美团骑手 #外卖小哥", + "images": [ + { + "index": 1, + "key": "content-assets/954953/3/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 4, + "title": "全职宝妈终于不再是只会带娃的透明人啦!", + "body": "全职带娃3年,每天围着娃转日子琐碎又单调👶,总觉得自己没什么价值。\n今天接娃放学,看见外卖小哥在小区门口急着找楼栋刚好顺路,就载了他一程。小哥一个劲说谢谢,娃还夸我厉害❤️ 。\n原来举手之劳就能帮到别人,以后碰到迷路的小哥,我都愿意打包你们一程~ \n\n#打包骑手 #全职妈妈 #暖心瞬间 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/4/1", + "width": 792, + "height": 1280 + }, + { + "index": 2, + "key": "content-assets/954953/4/2", + "width": 951, + "height": 1280 + } + ] + }, + { + "sourceRow": 5, + "title": "🎒等娃间隙,宝妈顺手打包骑手小哥🚗", + "body": "每天下午校门口等娃🏫,无聊刷手机。今天看到一个骑手小哥在路边打电话,看样子是小区里哪栋楼又不好找了。我这 “老司机” 一看就知道他要去哪儿!“小哥,去 12栋吗?我顺路带你!” 他惊喜地跳上车,送到后连声感谢。等娃的空档期,还能顺手帮个忙,感觉时间都变得有意义了!😊# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈日常 #校门口 #等娃碎片", + "images": [ + { + "index": 1, + "key": "content-assets/954953/5/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 6, + "title": "跟老公炫耀我的“新工作”,他惊了 😲", + "body": "晚饭时我神神秘秘地跟老公说:“我找到一份新工作了,时间自由,还能带着娃一起干。”他惊得筷子都掉了,问我到底干啥 🥢。我笑着说:“当本小区的野生导航员,专门拯救迷路的外卖小哥!” 😂 他听完哭笑不得,但还是给我竖了个大拇指。这工作虽然没工资,但情绪价值拉满!我愿意打包,做个快乐的“兼职妈妈”,让生活多一点乐趣 🎈。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/6/1", + "width": 800, + "height": 1420 + } + ] + }, + { + "sourceRow": 7, + "title": "🥳被骑手夸活菩萨!宝妈开心到开花🌸", + "body": "今天在小区门口,又 “打包” 了一个骑手小哥。他要去的那栋楼,正好是我家楼下。送到后,他感激地说:“姐,你真是活菩萨!” 哈哈,被夸得我心花怒放!其实就是举手之劳,但能帮到他们,看到他们轻松一点,我就觉得特别开心。全职妈妈的生活,也能找到自己的价值感!💪# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈生活 #价值感 #暖心日常", + "images": [ + { + "index": 1, + "key": "content-assets/954953/7/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 8, + "title": "终于找到了一份不耽误接娃的活儿 🎒", + "body": "每次看到那些招聘广告写着“朝九晚五”,我就只能默默叹气。全职妈妈的时间太碎了 🧩。直到我在网上看到了#打包骑手#这个话题,我恍然大悟:这不就是为我量身定制的“兼职”吗!每天接送娃的必经之路上,顺手带个路、刷个门禁,完全不耽误事儿 ⏱️。我愿意打包,用我这碎片化的时间,拼凑出一点对社会的贡献 🧩。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/8/1", + "width": 313, + "height": 557 + } + ] + }, + { + "sourceRow": 9, + "title": "我闺女今天问我:妈妈你是超人吗 🦸‍♀️", + "body": "今天接闺女放学,路过门岗,我熟练地跟保安打了个招呼,把一个被拦住的骑手带了进来。闺女仰着头问我:“妈妈,你是专门救人的超人吗?” 🥺 听到这句话,我心都化了。全职妈妈在孩子眼里,原来也可以是个闪闪发光的超人 ✨。我愿意打包,为了成为孩子眼里的榜样,把这件充满正能量的“兼职”一直做下去 💪。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/9/1", + "width": 3576, + "height": 6356 + } + ] + }, + { + "sourceRow": 10, + "title": "我的小电驴,今天迎来了新乘客 🛵", + "body": "买完菜回来,看到一个骑手在小区门口🪫。我二话不说,让他坐上的小电驴后座,一路狂飙把他送到了楼下 💨。平时这后座只载我家那个小神兽,今天迎来了新乘客,感觉还挺奇妙的。原来我的小电驴还能发挥这么大作用!我愿意打包,让我的小电驴成为小区里的“爱心专车” 🚗。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/10/1", + "width": 960, + "height": 1280 + } + ] + }, + { + "sourceRow": 11, + "title": "在宝妈群里发了条消息,瞬间被点赞 💬", + "body": "刚才在小区的宝妈群里发了条消息:“以后大家遇到找不着路的骑手,就顺手指个路吧,就当给娃积德了。” 没想到瞬间收到了几十个点赞 👍。大家纷纷表示这主意好,不用花钱不用费时,还能教孩子助人为乐。原来全职妈妈们的能量这么大!我愿意打包,和宝妈们一起,把我们小区变成最有爱的地方 🌸。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/11/1", + "width": 546, + "height": 940 + } + ] + }, + { + "sourceRow": 12, + "title": "今天收到了一份特殊的“工资” 🎁", + "body": "我这“兼职向导”当了一个多星期了,今天帮一个骑手指完路,他突然从口袋里掏出一颗糖递给我家娃:“谢谢阿姨,也谢谢小朋友。” 🍬 看着娃开心的笑脸,我觉得这颗糖比任何工资都珍贵。全职妈妈的价值,不一定非要用金钱来衡量。我愿意打包,为了这份纯粹的感激,继续我的“带路事业” 🌟。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/12/1", + "width": 313, + "height": 557 + } + ] + }, + { + "sourceRow": 13, + "title": "💖骑手一句谢谢姐!宝妈暖心一整天✨", + "body": "今天在小区门口,又 “打包” 了一个骑手小哥。他要去的那栋楼,正好是我家楼下。送到后,他感激地对我说了声 “谢谢姐!” 就这么简单的一句话,却是我最好的 “勋章”。全职妈妈的生活,有时候会觉得有点枯燥,但这些小小的善意和被需要的感觉,真的能给我带来很多快乐和动力。🥰# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈心情 #暖心瞬间 #宝妈价值", + "images": [ + { + "index": 1, + "key": "content-assets/954953/13/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 14, + "title": "被婆婆吐槽每天瞎忙,我却乐在其中 👵", + "body": "我婆婆最近总吐槽我,说我每天接个娃还要在小区里到处转悠,瞎忙活 🙄。她不知道,我这是在忙着我的“新事业”呢!帮骑手指路、按电梯、开单元门,这些事虽然微不足道,但让我觉得每天都很充实 🏃‍♀️。我愿意打包,不管别人怎么说,做自己觉得有意义的事,就是最大的快乐 😊。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/14/1", + "width": 400, + "height": 527 + } + ] + }, + { + "sourceRow": 15, + "title": "这大概是我做过,门槛最低的兼职了 🚪", + "body": "不用投简历,不用面试,只要有一颗热心肠,随时都能上岗!这大概是我这辈子做过门槛最低的兼职了 😂。每天带娃在小区广场玩的时候,顺便眼观六路耳听八方,看到迷路的骑手就上去搭把手 🚶‍♀️。这种零压力的“工作”,太适合全职妈妈了。我愿意打包,在这个没有KPI的岗位上,散发我所有的热量 ☀️。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/15/1", + "width": 1080, + "height": 1369 + } + ] + }, + { + "sourceRow": 16, + "title": "今天跟娃一起,完成了一项任务 🏆", + "body": "今天在楼下,我故意考我家大宝:“那个骑手叔叔好像找不到楼栋了,我们带他去好不好?”大宝兴奋地在前面带路,跑得比我还快 🏃‍♂️。看着他自豪的小背影,我觉得这是最好的言传身教。我不仅自己找到了价值,还给娃上了一堂生动的品德课 📚。我愿意打包,带着我的小帮手,一起完成这些温暖的小任务 🌟。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/16/1", + "width": 552, + "height": 800 + } + ] + }, + { + "sourceRow": 17, + "title": "我这“野生导航”的名号,算是打响了 📢", + "body": "今天有个常来我们小区的骑手,大老远看到我就喊:“姐,8栋怎么走来着,我又忘了!” 🤣 看来我这“野生导航”的名号,在他们圈子里算是打响了。作为全职妈妈,能被这么信任和依赖,我心里还挺得意的 😎。我愿意打包,继续擦亮我这块金字招牌,做他们最可靠的活地图 🗺️。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/17/1", + "width": 719, + "height": 1280 + } + ] + }, + { + "sourceRow": 18, + "title": "💖骑手淳朴一句谢!宝妈收获满满幸福✨", + "body": "今天在小区门口,又 “打包” 了一个骑手小哥。他要去的那栋楼,正好是我家楼下。送到后,他感激地对我说了声 “谢谢姐!” 就这么简单的一句话,却是我最好的 “礼物”。全职妈妈的生活,有时候会觉得有点枯燥,但这些小小的善意和被需要的感觉,真的能给我带来很多快乐和动力。🥰# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈心情 #暖心礼物 #宝妈日常", + "images": [ + { + "index": 1, + "key": "content-assets/954953/18/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 19, + "title": "今天被物业阿姨夸是个“热心肠” 👩‍🦱", + "body": "在小区里帮骑手捡掉在地上的外卖,刚好被保洁阿姨看到了。她笑着夸我:“你这媳妇真是个热心肠,谁家娶了你真有福气。” 😆 虽然是句客套话,但听着就是舒坦!全职妈妈的价值,不就是在这些柴米油盐和热心肠里体现的吗?我愿意打包,做个热心肠的好媳妇、好邻居 🏡。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/19/1", + "width": 480, + "height": 848 + } + ] + }, + { + "sourceRow": 20, + "title": "我决定,把这当成我的终身事业 🎯", + "body": "虽然这只是一份没有报酬的“兼职”,但我决定把它当成我的终身事业来做!🏆 只要我还在这个小区,只要我还能走得动,我就会一直帮下去。因为这份事业带来的快乐和满足,是任何东西都换不来的。我愿意打包,在这个平凡的岗位上,坚持做一件不平凡的小事 ✨。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/20/1", + "width": 500, + "height": 688 + } + ] + }, + { + "sourceRow": 21, + "title": "👩‍👧‍👦带娃当小天使!宝妈帮骑手一程❤️", + "body": "今天带娃出门👩‍👧‍👦。在小区门口看到一个骑手小哥。我赶紧停下车:“小哥,去哪儿?我带你一段!” 娃在旁边好奇地看着,还时不时地问我:“妈妈,我们是在帮助别人吗?” 小哥有点不好意思,但还是接受了我的帮助。送到他要去的楼栋,娃还帮我按了电梯。能给娃做个好榜样,言传身教,真好!🥰# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #亲子教育 #宝妈带娃 #小天使", + "images": [ + { + "index": 1, + "key": "content-assets/954953/21/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 22, + "title": "🚗宝妈小面包,接娃打包两不误🍞", + "body": "谁说只有豪车才能 “打包”?我的家用小面包今天也成了 “打包神器”!在小区门口看到一个骑手小哥,外卖箱里装满了东西,正准备步行进小区。我赶紧停下车:“小哥,去哪儿?我带你!” 他有点惊讶,但还是把外卖箱放到了我的后座。送到楼下,他连声感谢。能用自己的车帮到别人,感觉特别有成就感!🥳# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈用车 #成就感 #小区兼职", + "images": [ + { + "index": 1, + "key": "content-assets/954953/22/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 23, + "title": "💖骑手笑容太治愈!宝妈越做越开心😊", + "body": "今天在小区门口,又 “打包” 了一个骑手小哥。他要去的那栋楼,正好是我家楼下。送到后,他感激地对我笑了笑,说了声 “谢谢姐!” 就这么简单的一个笑容,却是我最好的 “回报”。全职妈妈的生活,有时候会觉得有点枯燥,但这些小小的善意和被需要的感觉,真的能给我带来很多快乐和动力。🥰# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈心情 #暖心回报 #宝妈日常", + "images": [ + { + "index": 1, + "key": "content-assets/954953/23/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 24, + "title": "🏡小区坡太陡?宝妈带骑手轻松过坡🚗", + "body": "我们小区坡道又多又陡,每次看骑手小哥骑车往上冲都特别费劲。今天刚好出门,碰到一位小哥正慢慢爬坡,我立马摇下车窗喊他:“顺路,我捎你过去吧!”\n他又惊喜又感激,上车后一直说太谢谢了。\n能帮奔波的人少费点力气,自己心里也暖暖的。💖# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈帮忙 #小区坡道 #顺路", + "images": [ + { + "index": 1, + "key": "content-assets/954953/24/1", + "width": 800, + "height": 1419 + } + ] + }, + { + "sourceRow": 25, + "title": "🌧️宝妈出车!护骑手一路安全🌧️", + "body": "晚风特别舒服,我接宝宝下学,开车刚到小区门口,就看到一位骑手小哥正麻利地穿梭在车流间赶单。\n我摇下车窗喊住他:“小哥,我顺路,捎你一程呀!”\n他先是一愣,随即笑着上了车,一路上还跟我聊起今天跑了好多单,特别有干劲。\n送到楼下时,他连声道谢,整个人都轻松了不少。\n原来一次小小的搭把手,就能给奔波的人多一份顺畅。\n愿每一位努力生活的小哥,都被温柔以待,一路平安顺遂✨。# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #暴雨送餐 #宝妈安全 #暖心", + "images": [ + { + "index": 1, + "key": "content-assets/954953/25/1", + "width": 599, + "height": 800 + } + ] + }, + { + "sourceRow": 26, + "title": "👩‍👧‍👦带娃当小帮手!宝妈帮骑手推车🚗", + "body": "早上正好有空带娃一起出门,小家伙全程都要当我的 “小助手”。\n在小区门口碰到一位小哥电动车没电,只能推着走,我赶紧停下车说帮他一段。\n孩子在旁边认真地看着,还奶声奶气问我是不是在做好事,到楼下还主动帮按电梯。\n能用这样的小事给孩子做榜样,比说多少道理都管用。🥰# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #亲子教育 #宝妈带娃 #小帮手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/26/1", + "width": 1046, + "height": 1390 + } + ] + }, + { + "sourceRow": 27, + "title": "🚗宝妈小轿车,接娃打包刚刚好🚗", + "body": "谁说只有豪车才能 “打包”?我的家用代步车今天也成了 “打包神器”!在小区门口看到一个骑手小哥,外卖箱里装满了东西,正准备步行进小区。我赶紧停下车:“小哥,去哪儿?我带你!” 他有点惊讶,但还是把外卖箱放到了我的后座。送到楼下,他连声感谢。能用自己的车帮到别人,感觉特别有成就感!🥳# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈用车 #成就感 #小区兼职", + "images": [ + { + "index": 1, + "key": "content-assets/954953/27/1", + "width": 1242, + "height": 1656 + } + ] + }, + { + "sourceRow": 28, + "title": "💖骑手真诚道谢!宝妈心里超温暖✨", + "body": "今天在小区门口,又 “打包” 了一个骑手小哥。他要去的那栋楼,正好是我家楼下。送到后,他感激地对我说了声 “谢谢姐!” 就这么简单的一句话,却是我最好的 “慰藉”。全职妈妈的生活,有时候会觉得有点枯燥,但这些小小的善意和被需要的感觉,真的能给我带来很多快乐和动力。🥰# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈心情 #暖心慰藉 #宝妈日常", + "images": [ + { + "index": 1, + "key": "content-assets/954953/28/1", + "width": 576, + "height": 795 + } + ] + }, + { + "sourceRow": 29, + "title": "🏡小区九曲弯?宝妈带骑手抄近路🛣️", + "body": "我们小区里有很多九曲十八弯的小路,每次骑手小哥来送外卖,都要绕好大一圈。今天在小区门口看到一个骑手小哥,看着地图一脸无奈。我赶紧摇下车窗:“小哥,去哪儿?我带你走近路!” 他惊喜地上了车,送到后连声感谢。能帮他们省点时间,少走弯路,我也觉得挺好的。💖# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈指路 #小区弯路 #互助", + "images": [ + { + "index": 1, + "key": "content-assets/954953/29/1", + "width": 1080, + "height": 1440 + } + ] + }, + { + "sourceRow": 30, + "title": "宝妈门口出车!给骑手一路开心❄️", + "body": "阳光正好的午后,我开车到小区附近,看到一位骑手小哥正轻快地赶路,正好要进我们小区\n我笑着靠边停车,朝他挥挥手:“小哥,我顺路,带你一程呀!”\n 他有些惊喜地坐上车,车里暖暖的,一路上都在开心地道谢。\n送到楼下时,他连连道谢,整个人都轻松了许多。\n 能在平凡的日常里,给努力生活的人多一份便利与温柔,自己心里也满是欢喜。\n愿每一位奔波的小哥,都一路顺遂,平安喜乐✨\n\n\n# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #雪天送餐 #宝妈暖心 #温暖", + "images": [ + { + "index": 1, + "key": "content-assets/954953/30/1", + "width": 1050, + "height": 1396 + } + ] + }, + { + "sourceRow": 31, + "title": "带娃当小棉袄!宝妈帮骑手一程❤️", + "body": "今天带娃出门逛街👩‍👧‍👦,小家伙主动要当我的专属小帮手。\n在小区门口碰到一位骑手小哥,正慢悠悠地推着电动车往前走,打算就近找地方充电。\n我笑着停下车喊他:“小哥,我帮你搭一段路吧!”\n娃在旁边睁着大眼睛,奶声奶气地问:“妈妈,我们是不是在做好事呀?\n到了楼栋口,小家伙还踮着脚帮我按了电梯。\n用这样小小的陪伴与举手之劳,给孩子上一堂生动的善良课,比讲再多道理都管用🥰。# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #亲子教育 #宝妈带娃 #小棉袄", + "images": [ + { + "index": 1, + "key": "content-assets/954953/31/1", + "width": 1042, + "height": 1388 + } + ] + }, + { + "sourceRow": 32, + "title": "宝妈代步车,接娃打包超方便🚗", + "body": "开车也要传递温暖~我的家用小轿车今天也变身暖心 “摆渡车” 啦!\n在小区门口碰到一位骑手小哥,餐箱满满当当,正准备步行进去配送。我立马摇下车窗:“小哥,上来吧,我送你进去!”\n他又惊喜又客气,小心地把外卖箱放到后座。送到楼下后,小哥一个劲地道谢,笑容特别真诚。\n能用自己的小车帮奔波的人省点时间、少走点路,真的超有成就感!# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈用车 #成就感 #小区兼职", + "images": [ + { + "index": 1, + "key": "content-assets/954953/32/1", + "width": 1058, + "height": 1398 + } + ] + }, + { + "sourceRow": 33, + "title": "💖骑手朴实道谢!宝妈越做越有动力✨", + "body": "他拎着外卖找不着路口,刚好我熟悉附近路线。指引完,他笑着跟我说了声 “太感谢啦!” 就这么简单的一句话,却是我最暖的 “慰藉”。平凡日常的生活,偶尔会觉得平淡乏味,但这些小小的善意和被需要的感觉,真的能给我带来很多温暖和力量。🥰# 随手助人 #暖心瞬间 #平凡生活 #日常小美好 #人间温暖 #生活感悟", + "images": [ + { + "index": 1, + "key": "content-assets/954953/33/1", + "width": 868, + "height": 1280 + } + ] + }, + { + "sourceRow": 34, + "title": "🏡小区陡坡难走?宝妈带骑手轻松过⛰️", + "body": "今天在小区门口正好碰到一个小哥,正爬坡呢。我赶紧摇下车窗喊他:“小哥,你去哪边?我捎你一段!”\n\n他当时可惊喜了,马上坐上我的车。送到之后一直跟我说谢谢。能帮他们省点力气,我自己心里也暖暖的,特别开心。💖\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #宝妈帮忙 #小区陡坡 #顺路", + "images": [ + { + "index": 1, + "key": "content-assets/954953/34/1", + "width": 443, + "height": 851 + } + ] + }, + { + "sourceRow": 35, + "title": "🌪️大风天宝妈出车!稳送骑手一程🌪️", + "body": "今天在小区门口时,远远看见一个外卖小哥。\n\n我赶紧靠边停下车,摇下车窗喊他:“小哥,快上车吧!”\n\n他一开始还有点犹豫,后来还是上了车。车里暖烘烘的,他轻声说了句谢谢,声音被风吹得有些沙哑。\n\n送到楼下后,他一个劲地鞠躬道谢。给他一段平稳安稳的路,我心里也踏实多了。\n\n真心希望每一位奔波在外的小哥,都能平平安安回家。🙏\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #大风送餐 #宝妈暖心 #平安出行", + "images": [ + { + "index": 1, + "key": "content-assets/954953/35/1", + "width": 624, + "height": 825 + } + ] + }, + { + "sourceRow": 36, + "title": "👩‍👧‍👦带娃当小暖炉!宝妈帮骑手一程❤️", + "body": "今天带娃出门👩‍👧‍👦,开到小区门口,看见一个外卖小哥,我赶紧停下车让他上来,带他进小区送单。\n\n娃在旁边一脸认真地看着,还小声问我:“妈妈,我们是不是在帮助别人呀?”我说:“是呀,我们这叫乐于助人!”\n\n既能帮到别人,又能给孩子做个好榜样,这种言传身教的感觉,真的太暖了🥰\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #亲子教育 #宝妈带娃 #小暖炉", + "images": [ + { + "index": 1, + "key": "content-assets/954953/36/1", + "width": 585, + "height": 840 + } + ] + }, + { + "sourceRow": 37, + "title": "宝妈买菜车,顺手打包骑手好方便🛒", + "body": "谁说非得豪车才能“打包骑手”?\n我这台平平常常的买菜小破车,今天直接变身打包神器了!🥳\n\n在小区门口碰到个外卖小哥,外卖箱在后面放着,看样子准备走路进小区送餐。\n我赶紧一脚刹车停边上:“上车不?稍你一下”\n\n他当时都愣了一下,有点意外,后来还是开开心心把外卖箱放我后座,坐上车了。\n送到楼下以后,一个劲儿跟我说谢谢。\n\n其实就是顺手的事儿,能用自己的小车帮上别人忙,真的超有成就感!\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈买菜 #成就感 #小区兼职", + "images": [ + { + "index": 1, + "key": "content-assets/954953/37/1", + "width": 1048, + "height": 1400 + } + ] + }, + { + "sourceRow": 38, + "title": "💖骑手一句理解!宝妈心里超感动✨", + "body": "今天出门又在小区里碰到一个骑手小哥,看着他抱着一堆外卖匆匆忙忙赶路,我就顺口喊了一句:“小哥,去哪栋?我捎你过去!”\n\n 他一开始还有点不敢相信,笑着坐上了车。\n送到地方,他特别真诚地说了句:“姐,太谢谢你了!”\n\n 就这一句话,我心里瞬间暖暖的。\n全职在家带娃的日子,每天围着家里转,有时候真觉得自己没什么价值,有点没劲。\n但每次帮到这些奔波的小哥,被人真心实意地需要一次,就觉得特别有意义,整个人都充满劲儿了。\n原来小小的善意,真的能治愈平凡日子里的小疲惫。🥰\n\n #打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈日常 #暖心瞬间 #全职妈妈心情", + "images": [ + { + "index": 1, + "key": "content-assets/954953/38/1", + "width": 1728, + "height": 2304 + } + ] + }, + { + "sourceRow": 39, + "title": "小区 Z 字路?宝妈带骑手抄近路🛣️", + "body": "我们小区全是那种拐来拐去的Z字小路,外卖小哥进来基本都懵,每次都要绕一大圈冤枉路。\n\n今天在小区门口就碰到一个小哥,盯着地图一脸无奈,一看就是绕晕了。\n我赶紧摇下车窗喊他:“小哥,你去哪栋?我带你抄近路!”\n\n他当时眼睛都亮了,特别惊喜地上了车。\n送到地方以后,一个劲儿跟我说谢谢。\n\n能帮他们省点时间、少走点弯路,我自己心里也美滋滋的~💖\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈指路 #小区Z字路 #邻里互助", + "images": [ + { + "index": 1, + "key": "content-assets/954953/39/1", + "width": 1052, + "height": 1394 + } + ] + }, + { + "sourceRow": 40, + "title": "☀️清晨宝妈出车!给骑手满满活力☀️", + "body": "今天清晨,阳光明媚☀️。送娃上学路上,看到一个骑手小哥,精神抖擞地在赶路。我心里一动,赶紧靠边停车:“小哥,去哪儿?我带你一程!” 他犹豫了一下,还是上了车。车里放着轻快的音乐,小哥说了声谢谢。送到楼下,他连连鞠躬。能在这个清晨给他一份活力,也让我自己多了一份安心。希望每个小哥都能平安!🙏# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #清晨送餐 #宝妈活力 #暖心", + "images": [ + { + "index": 1, + "key": "content-assets/954953/40/1", + "width": 573, + "height": 840 + } + ] + }, + { + "sourceRow": 41, + "title": "👩‍👧‍👦带娃当小司机!宝妈帮骑手一程🚗", + "body": "带娃在小区遛弯的日常,遇见正在送单的骑手,举手之劳帮他带了路。\n孩子天真的提问、主动按电梯的模样,都在告诉我:\n善良是可以传承的。\n\n能在平凡日子里,给孩子做一个温柔的榜样,真的很幸福。\n\n#打包骑手 #外卖小哥 #宝妈心情 #亲子时光", + "images": [ + { + "index": 1, + "key": "content-assets/954953/41/1", + "width": 998, + "height": 1330 + } + ] + }, + { + "sourceRow": 42, + "title": "🚗宝妈 小轿车,接娃打包超实用🚗", + "body": "谁说只有豪车才能 “打包骑手” 啊?\n我这台家用 小轿车,今天直接变身打包神器!🥳\n\n在小区门口碰到个外卖小哥,外卖箱塞得满满当当,看样子打算走路进小区送餐。\n我赶紧停下车喊他:“小哥,你去哪啊,要不要载你!”\n\n他当时还愣了一下,有点意外,后来开开心心把外卖箱放我后座,坐上车了。\n送到楼下,一个劲儿跟我说谢谢。\n\n其实就是顺手的事儿,能用自己的小车帮上忙,真的超有成就感!\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈用车 #成就感 #小区兼职", + "images": [ + { + "index": 1, + "key": "content-assets/954953/42/1", + "width": 1039, + "height": 1416 + } + ] + }, + { + "sourceRow": 43, + "title": "💖骑手真心感激!宝妈收获满满幸福✨", + "body": "今天在小区门口,又 “打包” 了一个骑手小哥。他要去的那栋楼,正好是我家楼下。送到后,他感激地对我说了声 “谢谢姐!” 就这么简单的一句话,却是我最好的 “回馈”。全职妈妈的生活,有时候会觉得有点枯燥,但这些小小的善意和被需要的感觉,真的能给我带来很多快乐和动力。🥰# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈心情 #暖心回馈 #宝妈日常", + "images": [ + { + "index": 1, + "key": "content-assets/954953/43/1", + "width": 432, + "height": 597 + } + ] + }, + { + "sourceRow": 44, + "title": "🏡小区死胡同?宝妈带骑手抄近路🚧", + "body": "我们小区里有很多死胡同,每次骑手小哥来送外卖,都要绕好大一圈。今天在小区门口看到一个骑手小哥,看着地图一脸无奈。我赶紧摇下车窗:“小哥,去哪儿?我带你走近路!” 他惊喜地上了车,送到后连声感谢。能帮他们省点时间,少走弯路,我也觉得挺好的。💖# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈指路 #小区死胡同 #互助", + "images": [ + { + "index": 1, + "key": "content-assets/954953/44/1", + "width": 4472, + "height": 7952 + } + ] + }, + { + "sourceRow": 45, + "title": "宝妈出车!给骑手一路温暖🌧️", + "body": "快到小区门口时,远远看见一个外卖小哥在送外卖,赶紧靠边停车喊他:“小哥,你去哪?我捎你一程!”\n\n 他一开始还有点犹豫,后来还是上了车。\n车里暖气很足,他小声说了句谢谢,声音都有点哑。\n\n 送到楼下,能给小哥一点温暖,我自己心里也踏实很多。\n\n #打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #小雨送餐 #宝妈暖心 #温暖", + "images": [ + { + "index": 1, + "key": "content-assets/954953/45/1", + "width": 1062, + "height": 1411 + } + ] + }, + { + "sourceRow": 46, + "title": "👩‍👧‍👦带娃当小向导!宝妈帮骑手一程❤️", + "body": "刚到小区门口,就看见一个外卖小哥进不去送单,我想这是言传身教的好机会。\n我赶紧停下车问他:“小哥,你去哪栋?我帮你一段!”\n小哥一开始还有点不好意思,后来也放心地接受了帮忙。\n到楼下的时候,娃还主动跑过去帮我按了电梯。\n\n能顺手帮到奔波的人,还能给孩子做个最真实的好榜样,这种言传身教的感觉真的太暖了🥰\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #亲子教育 #宝妈带娃 #小向导", + "images": [ + { + "index": 1, + "key": "content-assets/954953/46/1", + "width": 1086, + "height": 1448 + } + ] + }, + { + "sourceRow": 47, + "title": "🚗宝妈小货车,帮骑手运货超方便🚗", + "body": "谁说只有豪车才能 “打包”?我的家用小货车今天也成了 “打包神器”!在小区门口看到一个骑手小哥,外卖箱里装满了东西,正准备步行进小区。我赶紧停下车:“小哥,去哪儿?我带你!” 他有点惊讶,但还是把外卖箱放到了我的后座。送到楼下,他连声感谢。能用自己的车帮到别人,感觉特别有成就感!🥳# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈用车 #成就感 #小区兼职", + "images": [ + { + "index": 1, + "key": "content-assets/954953/47/1", + "width": 800, + "height": 1067 + } + ] + }, + { + "sourceRow": 48, + "title": "💖骑手淳朴道谢!宝妈心里甜滋滋✨", + "body": "又顺手 “打包” 了一个骑手小哥。\n他要去的楼栋,正好就在我家楼下,特别顺路。\n\n送到后,他真诚地跟我说了句:“谢谢啊!”\n\n一句简单的感谢,却成了我今天最温暖的收获。\n全职妈妈的日常偶尔会有些枯燥,但这份小小的善意,和被人需要的感觉,真的能带来满满的快乐和力量。\n原来举手之劳,也能双向温暖✨🥰\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈心情 #暖心收获 #宝妈日常 #平凡生活里的小善意", + "images": [ + { + "index": 1, + "key": "content-assets/954953/48/1", + "width": 1076, + "height": 1421 + } + ] + }, + { + "sourceRow": 49, + "title": "🏡小区绿化带挡路?宝妈带骑手抄近路🌳", + "body": "我们小区里有很多绿化带,每次骑手小哥来送外卖,都要绕好大一圈。今天在小区门口看到一个骑手小哥,看着地图一脸无奈。我赶紧摇下车窗:“小哥,去哪儿?我带你走近路!” 他惊喜地上了车,送到后连声感谢。能帮他们省点时间,少走弯路,我也觉得挺好的。💖# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈指路 #小区绿化带 #互助", + "images": [ + { + "index": 1, + "key": "content-assets/954953/49/1", + "width": 800, + "height": 1067 + } + ] + }, + { + "sourceRow": 50, + "title": "☀️朝阳里宝妈出车!给骑手一份希望☀️", + "body": "今天朝阳初升☀️,天气也渐渐暖和了。今天送娃回家路上,看到一个骑手小哥,还在赶路。我心里一动,赶紧靠边停车:“小哥,去哪儿?我带你一程!” 他犹豫了一下,还是上了车。车里暖气开着,小哥说了声谢谢,声音有点沙哑。送到楼下,他连连鞠躬。能在这个朝阳中给他一份希望,也让我自己多了一份安心。希望每个小哥都能平安!🙏# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #朝阳送餐 #宝妈暖心 #希望", + "images": [ + { + "index": 1, + "key": "content-assets/954953/50/1", + "width": 579, + "height": 772 + } + ] + }, + { + "sourceRow": 51, + "title": "🚗宝妈小巴士,接娃打包超合适🚌", + "body": "我的家用小巴士,今天直接变身暖心打包神器!🥳\n\n在小区门口碰到一个骑手小哥,外卖箱装得满满当当,打算走路进小区送餐。\n我赶紧停下车喊他:“小哥,你去哪栋?我捎你一段!”\n\n他先是一愣,有点意外,随后把外卖箱放到后座,开心地上了车。\n送到楼下后,他不停地跟我说谢谢。\n\n不用多厉害的车,只是一点小小的善意,就能帮到奔波的人。\n这种双向的温暖,真的让人快乐又有成就感。💛\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈用车 #成就感 #平凡小善意", + "images": [ + { + "index": 1, + "key": "content-assets/954953/51/1", + "width": 1086, + "height": 1448 + } + ] + }, + { + "sourceRow": 52, + "title": "💖骑手善意暖心!宝妈越活越有光✨", + "body": "顺手 “打包” 了一个骑手小哥。\n他看了看地址,刚好要去我家楼下那栋,简直是无缝顺路。\n\n把他送到楼下后,小哥特别真诚地说了一句:“你人真好!”\n就这一句简单又朴实的感谢,没有华丽的词藻,却像一股暖流,一点点滋养着我日常的心情。\n\n其实全职妈妈的生活,大多时候都是围着家庭打转,重复又琐碎,偶尔也会觉得枯燥、找不到价值感。\n但每次这样小小的举手之劳,收获一句真心的谢谢,感受到自己被需要、能给别人带去方便,心里就特别踏实、特别快乐。\n\n这些细碎的善意,看似不起眼,却在悄悄治愈着平凡的日子,也给了我继续温柔生活的满满动力。🥰\n\n#打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈心情 #暖心滋养 #宝妈日常 #平凡生活里的小美好", + "images": [ + { + "index": 1, + "key": "content-assets/954953/52/1", + "width": 1072, + "height": 1404 + } + ] + }, + { + "sourceRow": 53, + "title": "🏡地下车库绕晕?宝妈带骑手找对路🅿️", + "body": "我们小区里有几个地下车库,每次骑手小哥来送外卖,都要绕好大一圈。今天在小区门口看到一个骑手小哥,看着地图一脸无奈。我赶紧摇下车窗:“小哥,去哪儿?我带你走近路!” 他惊喜地上了车,送到后连声感谢。能帮他们省点时间,少走弯路,我也觉得挺好的。💖# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈指路 #地下车库 #互助", + "images": [ + { + "index": 1, + "key": "content-assets/954953/53/1", + "width": 599, + "height": 800 + } + ] + }, + { + "sourceRow": 54, + "title": "🌙月光下宝妈出车!给骑手一份安心🌙", + "body": "今天月光皎洁🌙,天气也渐渐凉了。今天送娃回家路上,看到一个骑手小哥,还在赶路。我心里一动,赶紧靠边停车:“小哥,去哪儿?我带你一程!” 他犹豫了一下,还是上了车。车里暖气开着,小哥说了声谢谢,声音有点沙哑。送到楼下,他连连鞠躬。能在这个月光中给他一份安心,也让我自己多了一份温暖。希望每个小哥都能平安!🙏# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #月光送餐 #宝妈安心 #温暖", + "images": [ + { + "index": 1, + "key": "content-assets/954953/54/1", + "width": 904, + "height": 1200 + } + ] + }, + { + "sourceRow": 55, + "title": "🚗宝妈小跑车,顺路打包骑手超酷🚗", + "body": "我这台家用小跑车,今天也当了一回“骑手的骑手”。\n刚到小区门口,看到一个外卖小哥,箱子塞得满满当当,还要步行进去。那一瞬间就觉得——太辛苦了。\n我直接停下车喊他:“小哥,去哪栋?我顺路带你!”\n 他明显愣了一下,但还是把外卖箱放到了后座。\n送到楼下,他一路都在说谢谢。\n 其实也就是顺手的事,但那一刻真的有种说不出来的满足感。\n原来,帮别人一把,比自己开心更开心。🥳\n#骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈日常 #小区生活 #温暖瞬间 #普通人的善意", + "images": [ + { + "index": 1, + "key": "content-assets/954953/55/1", + "width": 1058, + "height": 1416 + } + ] + }, + { + "sourceRow": 56, + "title": "💖宝妈动力满满向前冲✨", + "body": "骑手小哥🚗\n他要去的那栋楼,刚好就在我家楼下。\n 我顺路带了他一程。\n下车的时候,他很认真地说了一句:\n “谢谢姐!”\n就这么简单的一句话,\n 却莫名让我开心了很久。\n全职妈妈的生活,有时候确实会有点重复、甚至有点枯燥。\n 但这些不经意的小瞬间——\n 被需要、被感谢、被回应,\n真的会变成我一天里最有“能量”的时刻🥰\n原来,让别人轻松一点,\n 自己也会更快乐一点。\n#骑手日常 #外卖小哥 #当了一把骑手的骑手 #宝妈生活 #被需要的感觉 #生活里的小确幸 #普通人的善意", + "images": [ + { + "index": 1, + "key": "content-assets/954953/56/1", + "width": 1048, + "height": 1402 + } + ] + }, + { + "sourceRow": 57, + "title": "🏡小区林荫道?宝妈带骑手抄近路🌳", + "body": "我们小区的林荫道特别多🌿\n 看起来很舒服,但对骑手来说,真的太容易绕路了。\n今天在门口看到一个骑手小哥,\n 盯着手机地图,一脸“我到底在哪儿”的无奈。\n我忍不住摇下车窗:“小哥,去哪栋?我带你走近路!”\n 他愣了一下,然后立马笑了,赶紧上车。\n送到之后,他一路都在说谢谢。\n 其实我也没做什么,只是帮他少绕了一圈路。\n但那一刻真的会觉得——\n 自己好像,也在让这个世界更顺一点点💖\n#骑手日常 #外卖小哥 #宝妈生活 #小区日常 #普通人的善意 #生活里的温柔 #互帮互助", + "images": [ + { + "index": 1, + "key": "content-assets/954953/57/1", + "width": 1052, + "height": 1400 + } + ] + }, + { + "sourceRow": 58, + "title": "我的小电驴,成了小区的专属摆渡车", + "body": "自从买了这个带儿童座椅的小电驴,接送娃方便多了 。今天送完娃回小区,刚好看到个小哥提着大包小包在找单元门。我直接一脚刹车停在他面前:“上来,姐带你过去!” \n\n小哥愣了一下,然后开心地坐了上来。到了楼下,他非要送我一瓶水表示感谢。我愿意打包,反正车座空着也是空着,顺手捎一程,这种充满人情味的互动,让我觉得全职妈妈的生活也很有趣 。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/58/1", + "width": 1046, + "height": 1394 + } + ] + }, + { + "sourceRow": 59, + "title": "🎒接娃路上!宝妈顺风车再打包骑手🚗", + "body": "每天下午接娃放学🏫,路上总能遇到急匆匆的骑手小哥。今天看到一个外卖箱都快装不下了,我赶紧停下车:“小哥,去哪儿?我带你!” 他有点不好意思,但还是把外卖放到了我的后座。送到楼下,他连声感谢。能用接娃的空档期帮到别人,感觉自己也挺有用的!😊# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈日常 #接娃顺风车 #顺路", + "images": [ + { + "index": 1, + "key": "content-assets/954953/59/1", + "width": 1067, + "height": 1431 + } + ] + }, + { + "sourceRow": 60, + "title": "这大概是我拿过,最满意的“退休金” 💰", + "body": "刚开始送外卖时,有一次因为迷路急哭了,觉得自己什么都做不好 😭。今天在小区里看到个年轻女孩送外卖,眼眶红红的在找路。我赶紧上前,不仅带她找到了地方,还安慰了她几句 💖。🌈。\n\n#打包骑手# #骑手 #美团骑手#外卖小哥##当了一把骑手的骑手", + "images": [ + { + "index": 1, + "key": "content-assets/954953/60/1", + "width": 531, + "height": 774 + } + ] + }, + { + "sourceRow": 61, + "title": "🏡小区像迷宫?宝妈带骑手抄近路🗺️", + "body": "我们小区的路,真的很“治愈”——\n 林荫道、弯弯绕绕、看起来很舒服🌿\n 但对骑手来说,其实更像个迷宫。\n今天在小区门口,看到一个骑手小哥,\n 盯着手机地图来回看,整个人有点懵。\n我一看就知道——肯定是第一次进我们小区。\n我直接摇下车窗:“小哥,去哪栋?我带你走近路!”\n 他先是愣了一下,然后立马笑了,赶紧上车。\n一路上我给他指路:“这边走可以少绕一圈,这条是近路。”\n 他边听边点头,还小声说:“这个小区真的太绕了……”\n送到楼下,他连声说谢谢,\n 那一刻其实挺有感触的——\n有时候,你只是知道一条“近路”,\n 对别人来说,就是省下的时间、少走的弯路。\n全职妈妈的生活,可能没有太多“高光时刻”,\n 但这种被需要的小瞬间,\n真的会让人觉得——\n 自己也在悄悄帮这个世界变得更顺一点点💖# 打包骑手 #骑手 #美团骑手 #外卖小哥 #当了一把骑手的骑手 #宝妈指路 #小区迷宫 #互助", + "images": [ + { + "index": 1, + "key": "content-assets/954953/61/1", + "width": 456, + "height": 756 + } + ] + } + ] +} diff --git a/lib/mcp-collection-client.ts b/lib/mcp-collection-client.ts new file mode 100644 index 0000000..e47ae40 --- /dev/null +++ b/lib/mcp-collection-client.ts @@ -0,0 +1,1053 @@ +export const DEFAULT_COLLECTION_MCP_URL = + "https://middle-aitool.gbotai.cn/mcp"; +const MAX_MCP_ATTEMPTS = 10; + +export type CollectionMcpBindings = { + AI_TOOL_CENTER_MCP_URL?: string; + AI_TOOL_CENTER_MCP_KEY?: string; +}; + +export type CollectionMcpConfig = { + endpoint: string; + key?: string; + timeoutMs?: number; +}; + +export type XhsPublicMetrics = { + likes: number; + comments: number; + collects: number; +}; + +export type XhsAccountProfile = { + platformUid: string; + nickname: string; + profileUrl: string; + redId: string; + ipLocation: string; + followers: number | null; +}; + +type JsonRpcEnvelope = { + error?: { + code?: number; + message?: string; + }; + result?: { + isError?: boolean; + content?: Array<{ + type?: string; + text?: string; + }>; + serverInfo?: { + name?: string; + version?: string; + }; + }; +}; + +type ToolResult = { + isError: boolean; + payload: unknown; +}; + +class McpSessionLostError extends Error {} + +function isRetryableTransportError(error: unknown) { + return ( + error instanceof McpSessionLostError || + (error instanceof Error && + ["AbortError", "TimeoutError"].includes(error.name)) || + error instanceof TypeError + ); +} + +function asRecord(value: unknown): Record | null { + return value !== null && typeof value === "object" && !Array.isArray(value) + ? (value as Record) + : null; +} + +function safeMessage(value: unknown, fallback: string) { + const message = String(value ?? "").trim(); + if (!message) return fallback; + return message + .replace(/https?:\/\/[^\s"'<>]+/gi, "[链接]") + .replace(/eyJ[A-Za-z0-9._-]+/g, "[密钥]") + .slice(0, 240); +} + +function metricValue(value: unknown, label: string) { + if (typeof value === "number" && Number.isFinite(value) && value >= 0) { + return Math.round(value); + } + if (typeof value !== "string") { + throw new Error(`采集结果缺少${label}`); + } + + const normalized = value.trim().toLowerCase().replace(/[,\s]/g, ""); + const match = normalized.match(/^(\d+(?:\.\d+)?)(万|w|千|k)?$/); + if (!match) throw new Error(`采集结果中的${label}格式异常`); + const multiplier = + match[2] === "万" || match[2] === "w" + ? 10_000 + : match[2] === "千" || match[2] === "k" + ? 1_000 + : 1; + return Math.round(Number(match[1]) * multiplier); +} + +function optionalCountValue(value: unknown) { + if (value === null || value === undefined || value === "") return null; + const normalized = + typeof value === "string" ? value.trim().replace(/\+$/, "") : value; + try { + return metricValue(normalized, "粉丝数"); + } catch { + return null; + } +} + +function parseJsonRpc(raw: string) { + const messages = raw + .split(/\r?\n/) + .filter((line) => line.startsWith("data:")) + .map((line) => line.slice(5).trim()) + .filter(Boolean); + const candidate = messages.at(-1) ?? raw.trim(); + if (!candidate) throw new Error("MCP采集服务返回空响应"); + try { + return JSON.parse(candidate) as JsonRpcEnvelope; + } catch { + throw new Error("MCP采集服务返回了无法解析的数据"); + } +} + +function buildMcpUrl(config: CollectionMcpConfig) { + let endpoint: URL; + try { + endpoint = new URL(config.endpoint); + } catch { + throw new Error("MCP采集服务地址无效"); + } + if (!["http:", "https:"].includes(endpoint.protocol)) { + throw new Error("MCP采集服务地址无效"); + } + if (config.key?.trim()) { + endpoint.searchParams.set("key", config.key.trim()); + } + if (!endpoint.searchParams.get("key")) { + throw new Error("MCP采集密钥未配置"); + } + return endpoint.toString(); +} + +function requestHeaders(sessionId?: string) { + const headers = new Headers({ + "Content-Type": "application/json", + Accept: "application/json, text/event-stream", + }); + if (sessionId) headers.set("Mcp-Session-Id", sessionId); + return headers; +} + +async function postMcp( + fetchImpl: typeof fetch, + endpoint: string, + body: Record, + timeoutMs: number, + sessionId?: string, + allowEmpty = false, +) { + const response = await fetchImpl(endpoint, { + method: "POST", + headers: requestHeaders(sessionId), + body: JSON.stringify(body), + signal: AbortSignal.timeout(timeoutMs), + }); + const text = await response.text(); + if (!response.ok) { + if (/session not found|missing session id/i.test(text)) { + throw new McpSessionLostError("MCP采集会话已失效"); + } + let providerMessage: unknown = text; + try { + providerMessage = + (JSON.parse(text) as JsonRpcEnvelope).error?.message ?? text; + } catch { + // Keep the original body when the upstream response is not JSON. + } + throw new Error( + safeMessage( + providerMessage, + `MCP采集服务请求失败(HTTP ${response.status})`, + ), + ); + } + if (allowEmpty && !text.trim()) { + return { response, envelope: null }; + } + const envelope = parseJsonRpc(text); + if (envelope.error) { + const message = safeMessage( + envelope.error.message, + "MCP采集服务调用失败", + ); + if (/session not found|missing session id/i.test(message)) { + throw new McpSessionLostError("MCP采集会话已失效"); + } + throw new Error(message); + } + return { response, envelope }; +} + +async function createMcpSession( + fetchImpl: typeof fetch, + endpoint: string, + timeoutMs: number, +) { + const initialize = await postMcp( + fetchImpl, + endpoint, + { + jsonrpc: "2.0", + id: crypto.randomUUID(), + method: "initialize", + params: { + protocolVersion: "2025-03-26", + capabilities: {}, + clientInfo: { + name: "koc-loop-collector", + version: "1.0.0", + }, + }, + }, + timeoutMs, + ); + const sessionId = initialize.response.headers.get("mcp-session-id"); + if (!sessionId) throw new Error("MCP采集服务未返回会话标识"); + + await postMcp( + fetchImpl, + endpoint, + { + jsonrpc: "2.0", + method: "notifications/initialized", + params: {}, + }, + timeoutMs, + sessionId, + true, + ); + return sessionId; +} + +async function callMcpTool( + fetchImpl: typeof fetch, + endpoint: string, + sessionId: string, + timeoutMs: number, + name: string, + args: Record, +): Promise { + const result = await postMcp( + fetchImpl, + endpoint, + { + jsonrpc: "2.0", + id: crypto.randomUUID(), + method: "tools/call", + params: { + name, + arguments: args, + }, + }, + timeoutMs, + sessionId, + ); + const content = result.envelope?.result?.content ?? []; + const text = content.find((block) => block.type === "text")?.text; + if (!text) throw new Error("MCP采集工具未返回数据"); + let payload: unknown; + try { + payload = JSON.parse(text); + } catch { + throw new Error("MCP采集工具返回了无法解析的数据"); + } + return { + isError: result.envelope?.result?.isError === true, + payload, + }; +} + +function metricsFromToolResult(result: ToolResult): XhsPublicMetrics { + const root = asRecord(result.payload); + const response = asRecord(root?.response) ?? root; + const data = asRecord(response?.data) ?? asRecord(root?.data); + const code = Number(response?.code); + const success = response?.success; + + if ( + result.isError || + success === false || + (Number.isFinite(code) && code >= 400) + ) { + throw new Error( + safeMessage( + response?.msg ?? response?.message ?? root?.message, + "公开数据采集失败", + ), + ); + } + if (!data) throw new Error("采集结果缺少互动数据"); + + return { + likes: metricValue(data.likes, "点赞数"), + comments: metricValue(data.comments, "评论数"), + collects: metricValue( + data.collects ?? data.favorites ?? data.favourites, + "收藏数", + ), + }; +} + +function successfulToolData(result: ToolResult, fallbackMessage: string) { + const root = asRecord(result.payload); + const response = asRecord(root?.response) ?? root; + const data = asRecord(response?.data) ?? asRecord(root?.data); + const code = Number(response?.code); + if ( + result.isError || + response?.success === false || + (Number.isFinite(code) && code >= 400) + ) { + throw new Error( + safeMessage( + response?.msg ?? response?.message ?? root?.message, + fallbackMessage, + ), + ); + } + if (!data) throw new Error(fallbackMessage); + return data; +} + +function stringValue(value: unknown) { + return typeof value === "string" ? value.trim() : ""; +} + +function findRecord( + value: unknown, + predicate: (record: Record) => boolean, + depth = 0, +): Record | null { + if (depth > 12) return null; + if (Array.isArray(value)) { + for (const item of value) { + const found = findRecord(item, predicate, depth + 1); + if (found) return found; + } + return null; + } + const record = asRecord(value); + if (!record) return null; + if (predicate(record)) return record; + for (const child of Object.values(record)) { + const found = findRecord(child, predicate, depth + 1); + if (found) return found; + } + return null; +} + +function findStringByKey(value: unknown, key: string, depth = 0): string { + if (depth > 12) return ""; + if (Array.isArray(value)) { + for (const item of value) { + const found = findStringByKey(item, key, depth + 1); + if (found) return found; + } + return ""; + } + const record = asRecord(value); + if (!record) return ""; + const direct = stringValue(record[key]); + if (direct) return direct; + for (const child of Object.values(record)) { + const found = findStringByKey(child, key, depth + 1); + if (found) return found; + } + return ""; +} + +function findValueByKeys( + value: unknown, + keys: ReadonlySet, + depth = 0, +): unknown { + if (depth > 12) return undefined; + if (Array.isArray(value)) { + for (const item of value) { + const found = findValueByKeys(item, keys, depth + 1); + if (found !== undefined) return found; + } + return undefined; + } + const record = asRecord(value); + if (!record) return undefined; + for (const [key, child] of Object.entries(record)) { + if (keys.has(key) && child !== null && child !== undefined && child !== "") { + return child; + } + } + for (const child of Object.values(record)) { + const found = findValueByKeys(child, keys, depth + 1); + if (found !== undefined) return found; + } + return undefined; +} + +const FOLLOWER_KEYS = new Set([ + "fans", + "fans_count", + "fansCount", + "follower", + "followers", + "follower_count", + "followerCount", +]); + +function followerCountFromPayload(value: unknown, depth = 0): number | null { + const direct = optionalCountValue(findValueByKeys(value, FOLLOWER_KEYS)); + if (direct !== null) return direct; + if (typeof value === "string") { + return optionalCountValue( + value.match(/(?:粉丝数?|followers?|fans)\s*[::]\s*([\d,.万千wkWKW+]+)/i)?.[1], + ); + } + if (depth > 12) return null; + if (Array.isArray(value)) { + for (const item of value) { + const found = followerCountFromPayload(item, depth + 1); + if (found !== null) return found; + } + return null; + } + const record = asRecord(value); + if (!record) return null; + const label = stringValue( + record.name ?? record.label ?? record.title ?? record.type, + ).toLowerCase(); + if (["粉丝", "粉丝数", "fans", "followers"].includes(label)) { + const labeled = optionalCountValue( + record.count ?? record.value ?? record.i18nCount, + ); + if (labeled !== null) return labeled; + } + for (const child of Object.values(record)) { + const found = followerCountFromPayload(child, depth + 1); + if (found !== null) return found; + } + return null; +} + +export function xhsNoteIdFromUrl(input: string) { + try { + const url = new URL(input); + if ( + !( + url.hostname === "xiaohongshu.com" || + url.hostname.endsWith(".xiaohongshu.com") + ) + ) { + return ""; + } + return ( + url.pathname.match( + /\/(?:discovery\/item|explore)\/([A-Za-z0-9_-]{8,80})/, + )?.[1] ?? "" + ); + } catch { + return ""; + } +} + +async function xhsNoteIdFromShortLink( + input: string, + fallbackNickname: string, + fetchImpl: typeof fetch, + timeoutMs: number, +) { + let url: URL; + try { + url = new URL(input); + } catch { + return { noteId: "", profile: null }; + } + if ( + url.protocol !== "http:" && + url.protocol !== "https:" + ) { + return { noteId: "", profile: null }; + } + if ( + url.hostname !== "xhslink.cn" && + !url.hostname.endsWith(".xhslink.cn") + ) { + return { noteId: "", profile: null }; + } + + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), timeoutMs); + try { + const response = await fetchImpl(url.toString(), { + method: "GET", + redirect: "follow", + signal: controller.signal, + headers: { + "user-agent": + "Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15 Mobile/15E148", + }, + }); + const location = response.headers.get("location"); + const resolvedUrl = location + ? new URL(location, url).toString() + : response.url; + const noteId = xhsNoteIdFromUrl(resolvedUrl); + const html = + response.ok && + response.headers.get("content-type")?.includes("text/html") + ? await response.text() + : ""; + return { + noteId, + profile: accountProfileFromPublicPage( + html, + fallbackNickname, + ), + }; + } catch { + return { noteId: "", profile: null }; + } finally { + clearTimeout(timeout); + } +} + +function accountProfileFromPublicPage( + html: string, + fallbackNickname: string, +): XhsAccountProfile | null { + if (!html) return null; + const decoded = html + .replaceAll(""", '"') + .replaceAll(""", '"') + .replaceAll("&", "&") + .replaceAll("'", "'") + .replaceAll("<", "<") + .replaceAll(">", ">"); + const noteData = decoded.match( + /"noteData":\{[\s\S]{0,30000}?"user":\{([\s\S]{0,1800}?)\}/, + )?.[1]; + if (!noteData) return null; + const platformUid = + noteData.match(/"userId":"([A-Za-z0-9_-]{8,80})"/)?.[1] ?? ""; + if (!platformUid) return null; + const nickname = + noteData.match(/"(?:nickName|nickname)":"([^"]+)"/)?.[1] ?? + fallbackNickname.trim(); + const redId = + noteData.match(/"(?:redId|red_id)":"([^"]+)"/)?.[1] ?? + decoded.match(/"(?:redId|red_id)":"([^"]+)"/)?.[1] ?? + decoded.match(/小红书号[::]\s*([^<"\s]+)/)?.[1] ?? + ""; + return { + platformUid, + nickname, + profileUrl: `https://www.xiaohongshu.com/user/profile/${encodeURIComponent( + platformUid, + )}`, + redId, + ipLocation: "待识别", + followers: null, + }; +} + +export async function resolveXhsPublicAccountDetails( + profileUrl: string, + fetchImpl: typeof fetch = fetch, +) { + let parsed: URL; + try { + parsed = new URL(profileUrl); + } catch { + return { redId: "", followers: null, ipLocation: "" }; + } + if ( + parsed.protocol !== "https:" || + !( + parsed.hostname === "xiaohongshu.com" || + parsed.hostname.endsWith(".xiaohongshu.com") + ) || + !parsed.pathname.startsWith("/user/profile/") + ) { + return { redId: "", followers: null, ipLocation: "" }; + } + try { + const response = await fetchImpl(parsed.toString(), { + method: "GET", + redirect: "follow", + signal: AbortSignal.timeout(15_000), + headers: { + "user-agent": + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/138.0 Safari/537.36", + }, + }); + if (!response.ok) { + return { redId: "", followers: null, ipLocation: "" }; + } + const html = await response.text(); + return { + redId: + html.match(/"(?:redId|red_id)":"([^"]+)"/)?.[1] ?? + html.match(/小红书号[::]\s*([^<"\s]+)/)?.[1] ?? + "", + followers: + optionalCountValue( + html.match( + /"name"\s*:\s*"粉丝"\s*,\s*"count"\s*:\s*"([^"]+)"/, + )?.[1], + ) ?? + followerCountFromPayload(html), + ipLocation: "", + }; + } catch { + return { redId: "", followers: null, ipLocation: "" }; + } +} + +export async function resolveXhsPublicAccountId( + profileUrl: string, + fetchImpl: typeof fetch = fetch, +) { + return (await resolveXhsPublicAccountDetails(profileUrl, fetchImpl)).redId; +} + +function profileDetailsFromToolResult(result: ToolResult) { + const root = asRecord(result.payload); + const response = asRecord(root?.response) ?? root; + const code = Number(response?.code); + if ( + result.isError || + response?.success === false || + (Number.isFinite(code) && code >= 400) + ) { + throw new Error( + safeMessage( + response?.msg ?? response?.message ?? root?.message, + "账号主页数据采集失败", + ), + ); + } + const payload = + asRecord(response?.data) ?? asRecord(root?.data) ?? result.payload; + const followers = followerCountFromPayload(payload); + const redId = + findStringByKey(payload, "red_id") || + findStringByKey(payload, "redId") || + findStringByKey(payload, "userId") || + findStringByKey(payload, "user_id"); + const ipLocation = + findStringByKey(payload, "ip_location") || + findStringByKey(payload, "ipLocation"); + if (followers === null && !redId && !ipLocation) { + throw new Error("账号主页采集结果缺少可用字段"); + } + return { followers, redId, ipLocation }; +} + +function accountProfileFromToolResult( + result: ToolResult, + fallbackNickname: string, +): XhsAccountProfile { + const data = successfulToolData(result, "账号主页识别失败"); + const user = findRecord( + data, + (record) => + Boolean( + stringValue(record.user_id ?? record.userid) && + (stringValue(record.profile_url) || + stringValue(record.nickname ?? record.name)), + ), + ); + if (!user) throw new Error("账号主页识别结果缺少作者信息"); + const platformUid = stringValue(user.user_id ?? user.userid); + const candidateProfileUrl = stringValue(user.profile_url); + let profileUrl = ""; + if (candidateProfileUrl) { + try { + const parsed = new URL(candidateProfileUrl); + if ( + parsed.protocol === "https:" && + (parsed.hostname === "xiaohongshu.com" || + parsed.hostname.endsWith(".xiaohongshu.com")) && + parsed.pathname.startsWith("/user/profile/") + ) { + profileUrl = parsed.toString(); + } + } catch { + // Fall back to the verified user id below. + } + } + if (!profileUrl) { + profileUrl = `https://www.xiaohongshu.com/user/profile/${encodeURIComponent( + platformUid, + )}`; + } + return { + platformUid, + nickname: + stringValue(user.nickname ?? user.name) || fallbackNickname.trim(), + profileUrl, + redId: stringValue(user.red_id), + ipLocation: findStringByKey(data, "ip_location") || "待识别", + followers: followerCountFromPayload(data), + }; +} + +async function completeAccountProfile( + profile: XhsAccountProfile, + fetchImpl: typeof fetch, + endpoint: string, + sessionId: string, + timeoutMs: number, +) { + let completed = profile; + for (const [name, args] of [ + [ + "parse_xhs_user_summary", + { url: profile.profileUrl, use_proxy: true }, + ], + [ + "fetch_user_detail", + { link: profile.profileUrl, plant: "xhs" }, + ], + ] as const) { + if ( + completed.followers !== null && + completed.redId && + completed.ipLocation !== "待识别" + ) { + break; + } + try { + const result = await callMcpTool( + fetchImpl, + endpoint, + sessionId, + timeoutMs, + name, + args, + ); + const details = profileDetailsFromToolResult(result); + completed = { + ...completed, + followers: details.followers ?? completed.followers, + redId: details.redId || completed.redId, + ipLocation: + details.ipLocation && details.ipLocation !== "待识别" + ? details.ipLocation + : completed.ipLocation, + }; + } catch (error) { + if (error instanceof McpSessionLostError) throw error; + } + } + + if (completed.followers === null || !completed.redId) { + const details = await resolveXhsPublicAccountDetails( + completed.profileUrl, + fetchImpl, + ); + completed = { + ...completed, + followers: details.followers ?? completed.followers, + redId: details.redId || completed.redId, + }; + } + return completed; +} + +async function resolveProfileDetailsInSession( + profileUrl: string, + config: CollectionMcpConfig, + fetchImpl: typeof fetch, +) { + const endpoint = buildMcpUrl(config); + const timeoutMs = Math.max(5_000, config.timeoutMs ?? 30_000); + const sessionId = await createMcpSession(fetchImpl, endpoint, timeoutMs); + const result = await callMcpTool( + fetchImpl, + endpoint, + sessionId, + timeoutMs, + "parse_xhs_user_summary", + { + url: profileUrl, + use_proxy: true, + }, + ); + return profileDetailsFromToolResult(result); +} + +async function resolveAccountInSession( + publishUrl: string, + fallbackNickname: string, + config: CollectionMcpConfig, + fetchImpl: typeof fetch, +) { + const endpoint = buildMcpUrl(config); + const timeoutMs = Math.max(5_000, config.timeoutMs ?? 30_000); + let noteId = xhsNoteIdFromUrl(publishUrl); + let publicPageProfile: XhsAccountProfile | null = null; + if (!noteId) { + const shortLink = await xhsNoteIdFromShortLink( + publishUrl, + fallbackNickname, + fetchImpl, + timeoutMs, + ); + noteId = shortLink.noteId; + publicPageProfile = shortLink.profile; + } + + try { + const sessionId = await createMcpSession( + fetchImpl, + endpoint, + timeoutMs, + ); + if (!noteId) { + const noteResult = await callMcpTool( + fetchImpl, + endpoint, + sessionId, + timeoutMs, + "fetch_content_detail", + { + link: publishUrl, + plant: "xhs", + include_comments: false, + auto_cookie: true, + }, + ); + const noteData = successfulToolData( + noteResult, + "无法识别小红书笔记", + ); + noteId = + stringValue(noteData.noteId ?? noteData.note_id) || + findStringByKey(noteData, "noteId") || + findStringByKey(noteData, "note_id"); + } + if (!noteId) throw new Error("无法从发布链接识别小红书笔记ID"); + + const authorResult = await callMcpTool( + fetchImpl, + endpoint, + sessionId, + timeoutMs, + "collect_xhs_wen_note_detail", + { + note_id: noteId, + need_desc: false, + include_raw: false, + }, + ); + const profile = accountProfileFromToolResult( + authorResult, + fallbackNickname, + ); + return completeAccountProfile( + profile, + fetchImpl, + endpoint, + sessionId, + timeoutMs, + ); + } catch (error) { + if (error instanceof McpSessionLostError) throw error; + if (publicPageProfile) { + const details = await resolveXhsPublicAccountDetails( + publicPageProfile.profileUrl, + fetchImpl, + ); + return { + ...publicPageProfile, + redId: details.redId || publicPageProfile.redId, + followers: details.followers, + }; + } + throw error; + } +} + +async function collectInSession( + publishUrl: string, + config: CollectionMcpConfig, + fetchImpl: typeof fetch, +) { + const endpoint = buildMcpUrl(config); + const timeoutMs = Math.max(5_000, config.timeoutMs ?? 30_000); + const sessionId = await createMcpSession(fetchImpl, endpoint, timeoutMs); + + const primary = await callMcpTool( + fetchImpl, + endpoint, + sessionId, + timeoutMs, + "fetch_content_detail", + { + link: publishUrl, + plant: "xhs", + include_comments: false, + auto_cookie: true, + }, + ); + try { + return metricsFromToolResult(primary); + } catch { + const fallback = await callMcpTool( + fetchImpl, + endpoint, + sessionId, + timeoutMs, + "parse_xhs_note", + { + url: publishUrl, + include_comments: false, + auto_cookie: true, + }, + ); + return metricsFromToolResult(fallback); + } +} + +export function resolveCollectionMcpConfig( + bindings: CollectionMcpBindings, +): CollectionMcpConfig { + return { + endpoint: + bindings.AI_TOOL_CENTER_MCP_URL?.trim() || + DEFAULT_COLLECTION_MCP_URL, + key: bindings.AI_TOOL_CENTER_MCP_KEY?.trim(), + }; +} + +export async function collectXhsMetricsFromMcp( + publishUrl: string, + config: CollectionMcpConfig, + fetchImpl: typeof fetch = fetch, +) { + let parsed: URL; + try { + parsed = new URL(publishUrl); + } catch { + throw new Error("发布链接无效"); + } + if (!["http:", "https:"].includes(parsed.protocol)) { + throw new Error("发布链接无效"); + } + + let lastError: unknown; + for (let attempt = 0; attempt < MAX_MCP_ATTEMPTS; attempt += 1) { + try { + return await collectInSession(parsed.toString(), config, fetchImpl); + } catch (error) { + lastError = error; + if (!isRetryableTransportError(error)) throw error; + } + } + if ( + lastError instanceof Error && + ["AbortError", "TimeoutError"].includes(lastError.name) + ) { + throw new Error("MCP采集服务响应超时,请稍后重试"); + } + throw lastError instanceof Error + ? lastError + : new Error("MCP采集服务暂时不可用"); +} + +export async function resolveXhsAccountProfileFromMcp( + publishUrl: string, + fallbackNickname: string, + config: CollectionMcpConfig, + fetchImpl: typeof fetch = fetch, +) { + let parsed: URL; + try { + parsed = new URL(publishUrl); + } catch { + throw new Error("发布链接无效"); + } + if (!["http:", "https:"].includes(parsed.protocol)) { + throw new Error("发布链接无效"); + } + + let lastError: unknown; + for (let attempt = 0; attempt < MAX_MCP_ATTEMPTS; attempt += 1) { + try { + return await resolveAccountInSession( + parsed.toString(), + fallbackNickname, + config, + fetchImpl, + ); + } catch (error) { + lastError = error; + if (!isRetryableTransportError(error)) throw error; + } + } + throw lastError instanceof Error + ? lastError + : new Error("账号主页识别服务暂时不可用"); +} + +export async function resolveXhsProfileDetailsFromMcp( + profileUrl: string, + config: CollectionMcpConfig, + fetchImpl: typeof fetch = fetch, +) { + let parsed: URL; + try { + parsed = new URL(profileUrl); + } catch { + throw new Error("账号主页链接无效"); + } + if ( + parsed.protocol !== "https:" || + !( + parsed.hostname === "xiaohongshu.com" || + parsed.hostname.endsWith(".xiaohongshu.com") + ) || + !parsed.pathname.startsWith("/user/profile/") + ) { + throw new Error("账号主页链接无效"); + } + + let lastError: unknown; + for (let attempt = 0; attempt < MAX_MCP_ATTEMPTS; attempt += 1) { + try { + return await resolveProfileDetailsInSession( + parsed.toString(), + config, + fetchImpl, + ); + } catch (error) { + lastError = error; + if (!isRetryableTransportError(error)) throw error; + } + } + throw lastError instanceof Error + ? lastError + : new Error("账号主页数据采集服务暂时不可用"); +} diff --git a/lib/mvp-db.ts b/lib/mvp-db.ts new file mode 100644 index 0000000..b46e2ce --- /dev/null +++ b/lib/mvp-db.ts @@ -0,0 +1,721 @@ +import { env } from "cloudflare:workers"; +import feishuSnapshot from "./feishu-source-snapshot.json"; + +type D1ResultRow = Record; + +export function getRawDb(): D1Database { + const database = (env as unknown as { DB?: D1Database }).DB; + if (!database) { + throw new Error("数据库尚未连接"); + } + return database; +} + +export function getUploadBucket(): R2Bucket { + const bucket = (env as unknown as { UPLOADS?: R2Bucket }).UPLOADS; + if (!bucket) { + throw new Error("文件存储尚未连接"); + } + return bucket; +} + +export async function ensureSchema(database?: D1Database) { + const db = database ?? getRawDb(); + const statements = [ + `CREATE TABLE IF NOT EXISTS partners ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + wecom_name TEXT NOT NULL, + owner TEXT NOT NULL DEFAULT '运营组', + claimed_total INTEGER NOT NULL DEFAULT 0, + completed_total INTEGER NOT NULL DEFAULT 0, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + )`, + `CREATE TABLE IF NOT EXISTS tasks ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + brand TEXT NOT NULL, + quantity INTEGER NOT NULL, + claimed_quantity INTEGER NOT NULL DEFAULT 0, + due_at TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'active', + source_url TEXT NOT NULL DEFAULT '', + source_sheet_id TEXT NOT NULL DEFAULT '', + source_sheet_name TEXT NOT NULL DEFAULT '', + source_synced_at TEXT, + share_token TEXT, + collection_start_date TEXT, + collection_days TEXT NOT NULL DEFAULT '[]', + collection_schedule_updated_at TEXT, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + )`, + `CREATE TABLE IF NOT EXISTS contents ( + id TEXT PRIMARY KEY, + task_id TEXT NOT NULL, + title TEXT NOT NULL, + body TEXT NOT NULL DEFAULT '', + image_assets TEXT NOT NULL DEFAULT '[]', + status TEXT NOT NULL DEFAULT 'available', + source TEXT NOT NULL DEFAULT '飞书内容表', + source_row INTEGER, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + )`, + `CREATE TABLE IF NOT EXISTS accounts ( + id TEXT PRIMARY KEY, + platform TEXT NOT NULL DEFAULT '小红书', + platform_uid TEXT NOT NULL, + public_account_id TEXT NOT NULL DEFAULT '', + nickname TEXT NOT NULL, + profile_url TEXT NOT NULL DEFAULT '', + ip_location TEXT NOT NULL DEFAULT '待识别', + followers INTEGER NOT NULL DEFAULT 0, + post_count INTEGER NOT NULL DEFAULT 0, + avg_views INTEGER NOT NULL DEFAULT 0, + first_seen_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_seen_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + )`, + `CREATE UNIQUE INDEX IF NOT EXISTS accounts_platform_uid_idx + ON accounts(platform, platform_uid)`, + `CREATE TABLE IF NOT EXISTS claims ( + id TEXT PRIMARY KEY, + task_id TEXT NOT NULL, + partner_id TEXT NOT NULL, + claimant_name TEXT NOT NULL, + claim_token TEXT NOT NULL, + quantity INTEGER NOT NULL, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + )`, + `CREATE TABLE IF NOT EXISTS delegation_bundles ( + id TEXT PRIMARY KEY, + task_id TEXT NOT NULL, + claim_id TEXT NOT NULL, + partner_id TEXT NOT NULL, + label TEXT NOT NULL, + share_token TEXT NOT NULL, + quantity INTEGER NOT NULL, + status TEXT NOT NULL DEFAULT 'active', + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + revoked_at TEXT + )`, + `CREATE TABLE IF NOT EXISTS distributions ( + id TEXT PRIMARY KEY, + task_id TEXT NOT NULL, + content_id TEXT NOT NULL, + partner_id TEXT NOT NULL, + claim_id TEXT, + delegation_bundle_id TEXT, + account_id TEXT, + publish_url TEXT, + publish_time TEXT, + publish_screenshot_key TEXT, + status TEXT NOT NULL DEFAULT 'claimed', + claimed_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, + screenshot_key TEXT, + ocr_status TEXT NOT NULL DEFAULT 'none', + exposure INTEGER, + views INTEGER, + d2_likes INTEGER, + d2_comments INTEGER, + d2_collects INTEGER, + d5_likes INTEGER, + d5_comments INTEGER, + d5_collects INTEGER, + d7_likes INTEGER, + d7_comments INTEGER, + d7_collects INTEGER, + latest_likes INTEGER, + latest_comments INTEGER, + latest_collects INTEGER, + collection_status TEXT NOT NULL DEFAULT 'pending', + collection_status_description TEXT, + collection_updated_at TEXT, + last_collection_day INTEGER, + updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + )`, + `CREATE TABLE IF NOT EXISTS collection_runs ( + id TEXT PRIMARY KEY, + task_id TEXT NOT NULL, + distribution_id TEXT NOT NULL, + scheduled_date TEXT NOT NULL, + schedule_day INTEGER, + scheduled_at TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending', + likes INTEGER, + comments INTEGER, + collects INTEGER, + status_description TEXT, + started_at TEXT, + completed_at TEXT, + created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + )`, + ]; + + for (const statement of statements) { + await db.prepare(statement).run(); + } + + const ensureColumn = async ( + table: string, + column: string, + definition: string, + ) => { + const info = await db + .prepare(`PRAGMA table_info(${table})`) + .all<{ name: string }>(); + if (!info.results.some((item) => item.name === column)) { + await db.prepare(`ALTER TABLE ${table} ADD COLUMN ${definition}`).run(); + } + }; + + await ensureColumn("tasks", "source_url", "source_url TEXT NOT NULL DEFAULT ''"); + await ensureColumn( + "tasks", + "source_sheet_id", + "source_sheet_id TEXT NOT NULL DEFAULT ''", + ); + await ensureColumn( + "tasks", + "source_sheet_name", + "source_sheet_name TEXT NOT NULL DEFAULT ''", + ); + await ensureColumn("tasks", "source_synced_at", "source_synced_at TEXT"); + await ensureColumn("tasks", "share_token", "share_token TEXT"); + await ensureColumn( + "tasks", + "collection_start_date", + "collection_start_date TEXT", + ); + await ensureColumn( + "tasks", + "collection_days", + "collection_days TEXT NOT NULL DEFAULT '[]'", + ); + await ensureColumn( + "tasks", + "collection_schedule_updated_at", + "collection_schedule_updated_at TEXT", + ); + await ensureColumn("contents", "source_row", "source_row INTEGER"); + await ensureColumn( + "contents", + "image_assets", + "image_assets TEXT NOT NULL DEFAULT '[]'", + ); + await ensureColumn( + "accounts", + "public_account_id", + "public_account_id TEXT NOT NULL DEFAULT ''", + ); + await ensureColumn("distributions", "claim_id", "claim_id TEXT"); + await ensureColumn( + "distributions", + "delegation_bundle_id", + "delegation_bundle_id TEXT", + ); + await ensureColumn( + "distributions", + "publish_screenshot_key", + "publish_screenshot_key TEXT", + ); + await ensureColumn( + "distributions", + "latest_likes", + "latest_likes INTEGER", + ); + await ensureColumn( + "distributions", + "latest_comments", + "latest_comments INTEGER", + ); + await ensureColumn( + "distributions", + "latest_collects", + "latest_collects INTEGER", + ); + await ensureColumn( + "distributions", + "collection_status", + "collection_status TEXT NOT NULL DEFAULT 'pending'", + ); + await ensureColumn( + "distributions", + "collection_status_description", + "collection_status_description TEXT", + ); + await ensureColumn( + "distributions", + "collection_updated_at", + "collection_updated_at TEXT", + ); + await ensureColumn( + "distributions", + "last_collection_day", + "last_collection_day INTEGER", + ); + + const tasksWithoutShare = await db + .prepare( + "SELECT id FROM tasks WHERE share_token IS NULL OR share_token = ''", + ) + .all<{ id: string }>(); + for (const task of tasksWithoutShare.results) { + await db + .prepare("UPDATE tasks SET share_token = ? WHERE id = ?") + .bind(crypto.randomUUID().replaceAll("-", ""), task.id) + .run(); + } + await db + .prepare( + "CREATE UNIQUE INDEX IF NOT EXISTS tasks_share_token_idx ON tasks(share_token)", + ) + .run(); + await db + .prepare( + "CREATE UNIQUE INDEX IF NOT EXISTS claims_claim_token_idx ON claims(claim_token)", + ) + .run(); + await db + .prepare( + `CREATE INDEX IF NOT EXISTS claims_task_partner_created_idx + ON claims(task_id, partner_id, created_at)`, + ) + .run(); + await db + .prepare( + `CREATE UNIQUE INDEX IF NOT EXISTS delegation_bundles_share_token_idx + ON delegation_bundles(share_token)`, + ) + .run(); + await db + .prepare( + `CREATE INDEX IF NOT EXISTS delegation_bundles_claim_created_idx + ON delegation_bundles(claim_id, created_at)`, + ) + .run(); + await db + .prepare( + `CREATE UNIQUE INDEX IF NOT EXISTS collection_runs_distribution_date_idx + ON collection_runs(distribution_id, scheduled_date)`, + ) + .run(); + await db + .prepare( + `CREATE INDEX IF NOT EXISTS collection_runs_task_date_idx + ON collection_runs(task_id, scheduled_date)`, + ) + .run(); + await db + .prepare( + `UPDATE distributions + SET latest_likes = COALESCE(d7_likes, d5_likes, d2_likes), + latest_comments = COALESCE(d7_comments, d5_comments, d2_comments), + latest_collects = COALESCE(d7_collects, d5_collects, d2_collects), + collection_status = 'success', + collection_status_description = '历史采集数据已迁移', + collection_updated_at = updated_at, + last_collection_day = CASE + WHEN d7_likes IS NOT NULL THEN 7 + WHEN d5_likes IS NOT NULL THEN 5 + WHEN d2_likes IS NOT NULL THEN 2 + ELSE NULL + END + WHERE latest_likes IS NULL + AND COALESCE(d7_likes, d5_likes, d2_likes) IS NOT NULL`, + ) + .run(); + + const tasksNeedingImages = await db + .prepare( + `SELECT DISTINCT t.id + FROM tasks t + JOIN contents c ON c.task_id = t.id + WHERE t.source_sheet_id = ? + AND (c.image_assets IS NULL OR c.image_assets = '' OR c.image_assets = '[]')`, + ) + .bind(feishuSnapshot.sheetId) + .all<{ id: string }>(); + for (const task of tasksNeedingImages.results) { + const updates = feishuSnapshot.rows + .filter((row) => row.images.length > 0) + .map((row) => + db + .prepare( + `UPDATE contents SET image_assets = ? + WHERE task_id = ? AND source_row = ? + AND (image_assets IS NULL OR image_assets = '' OR image_assets = '[]')`, + ) + .bind(JSON.stringify(row.images), task.id, row.sourceRow), + ); + if (updates.length > 0) await db.batch(updates); + } +} + +export async function seedIfEmpty() { + const db = getRawDb(); + const row = await db.prepare("SELECT COUNT(*) AS count FROM tasks").first<{ + count: number; + }>(); + if ((row?.count ?? 0) > 0) return; + + const batch = [ + db + .prepare( + `INSERT INTO partners + (id, name, wecom_name, owner, claimed_total, completed_total) + VALUES (?, ?, ?, ?, ?, ?)`, + ) + .bind("partner-linlin", "林林KOC社群", "林林|母婴社群", "小吴", 24, 18), + db + .prepare( + `INSERT INTO partners + (id, name, wecom_name, owner, claimed_total, completed_total) + VALUES (?, ?, ?, ?, ?, ?)`, + ) + .bind("partner-muzi", "木子", "木子同学", "小陈", 8, 7), + db + .prepare( + `INSERT INTO partners + (id, name, wecom_name, owner, claimed_total, completed_total) + VALUES (?, ?, ?, ?, ?, ?)`, + ) + .bind("partner-xiaolu", "小鹿内容组", "鹿鹿日常", "小吴", 15, 12), + db + .prepare( + `INSERT INTO tasks + (id, name, brand, quantity, claimed_quantity, due_at, status) + VALUES (?, ?, ?, ?, ?, ?, ?)`, + ) + .bind( + "task-summer", + "夏日轻盈计划", + "青柠实验室", + 30, + 9, + "2026-08-05", + "active", + ), + db + .prepare( + `INSERT INTO tasks + (id, name, brand, quantity, claimed_quantity, due_at, status) + VALUES (?, ?, ?, ?, ?, ?, ?)`, + ) + .bind( + "task-living", + "理想生活家", + "木屿家居", + 18, + 6, + "2026-08-02", + "active", + ), + ]; + + const summerTitles = [ + "夏天轻松管理身材的小习惯", + "一周清爽饮食记录", + "通勤女生的轻负担早餐", + "周末宅家也要好好吃饭", + "最近让我状态变好的三件事", + "忙碌上班族的饮食搭配", + "清爽一夏的简单生活方式", + "我的夏日冰箱常备清单", + "下班后的低成本幸福感", + "在家也能完成的状态管理", + "夏日办公室好物分享", + "高温天的清爽仪式感", + "一人食也可以很认真", + "近期值得回购的小东西", + "我的轻盈生活观察", + "夏天拒绝疲惫感", + "简单好坚持的日常习惯", + "最近的通勤包里有什么", + "不费力的夏日松弛感", + "周末恢复能量的小计划", + "高效生活的三个小改变", + "一个人的清爽晚餐", + "办公室里的续航秘诀", + "生活需要一点轻盈感", + "最近在坚持的健康习惯", + "从早餐开始认真生活", + "我的低负担下午茶", + "夏日宅家幸福清单", + "忙碌生活中的小确幸", + "值得记录的轻盈一天", + ]; + const livingTitles = Array.from( + { length: 18 }, + (_, index) => `理想生活家的空间灵感 ${String(index + 1).padStart(2, "0")}`, + ); + + summerTitles.forEach((title, index) => { + batch.push( + db + .prepare( + `INSERT INTO contents (id, task_id, title, body, status) + VALUES (?, ?, ?, ?, ?)`, + ) + .bind( + `content-s-${index + 1}`, + "task-summer", + title, + "来自飞书内容表的完整笔记正文与素材说明。", + index < 9 ? "allocated" : "available", + ), + ); + }); + livingTitles.forEach((title, index) => { + batch.push( + db + .prepare( + `INSERT INTO contents (id, task_id, title, body, status) + VALUES (?, ?, ?, ?, ?)`, + ) + .bind( + `content-l-${index + 1}`, + "task-living", + title, + "来自飞书内容表的完整笔记正文与素材说明。", + index < 6 ? "allocated" : "available", + ), + ); + }); + + const accountSeeds = [ + ["account-01", "xhs-8af3", "小满的轻生活", "上海", 12800, 4, 4360], + ["account-02", "xhs-2bd8", "橘子汽水日记", "杭州", 8600, 3, 2980], + ["account-03", "xhs-7ca1", "木木在成长", "广东", 21400, 2, 7620], + ["account-04", "xhs-91ee", "一颗软糖", "江苏", 5200, 2, 1850], + ]; + accountSeeds.forEach(([id, uid, nickname, ip, followers, posts, avg]) => { + batch.push( + db + .prepare( + `INSERT INTO accounts + (id, platform, platform_uid, nickname, profile_url, ip_location, followers, post_count, avg_views) + VALUES (?, '小红书', ?, ?, ?, ?, ?, ?, ?)`, + ) + .bind( + id, + uid, + nickname, + `https://www.xiaohongshu.com/user/profile/${uid}`, + ip, + followers, + posts, + avg, + ), + ); + }); + + const distributionSeeds = [ + [ + "dist-01", + "content-s-1", + "partner-linlin", + "account-01", + "https://www.xiaohongshu.com/explore/demo01", + "complete", + 118, + 24, + 43, + 168, + 31, + 61, + 232, + 38, + 86, + 18420, + 9430, + "recognized", + ], + [ + "dist-02", + "content-s-2", + "partner-muzi", + "account-02", + "https://www.xiaohongshu.com/explore/demo02", + "collecting", + 76, + 12, + 28, + 103, + 17, + 39, + null, + null, + null, + null, + null, + "none", + ], + [ + "dist-03", + "content-s-3", + "partner-linlin", + "account-03", + "https://www.xiaohongshu.com/explore/demo03", + "published", + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + "none", + ], + [ + "dist-04", + "content-l-1", + "partner-xiaolu", + "account-04", + "https://www.xiaohongshu.com/explore/demo04", + "collecting", + 42, + 8, + 16, + 69, + 12, + 24, + 91, + 17, + 35, + null, + null, + "uploaded", + ], + ]; + + distributionSeeds.forEach((seed, index) => { + const [ + id, + contentId, + partnerId, + accountId, + publishUrl, + status, + d2Likes, + d2Comments, + d2Collects, + d5Likes, + d5Comments, + d5Collects, + d7Likes, + d7Comments, + d7Collects, + exposure, + views, + ocrStatus, + ] = seed; + batch.push( + db + .prepare( + `INSERT INTO distributions ( + id, task_id, content_id, partner_id, account_id, publish_url, + publish_time, status, claimed_at, ocr_status, exposure, views, + d2_likes, d2_comments, d2_collects, + d5_likes, d5_comments, d5_collects, + d7_likes, d7_comments, d7_collects + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + ) + .bind( + id, + index < 3 ? "task-summer" : "task-living", + contentId, + partnerId, + accountId, + publishUrl, + `2026-07-${String(22 + index).padStart(2, "0")} 10:30:00`, + status, + `2026-07-${String(20 + index).padStart(2, "0")} 09:00:00`, + ocrStatus, + exposure, + views, + d2Likes, + d2Comments, + d2Collects, + d5Likes, + d5Comments, + d5Collects, + d7Likes, + d7Comments, + d7Collects, + ), + ); + }); + + for (let index = 4; index < 9; index += 1) { + batch.push( + db + .prepare( + `INSERT INTO distributions + (id, task_id, content_id, partner_id, status, claimed_at) + VALUES (?, 'task-summer', ?, 'partner-linlin', 'claimed', ?)`, + ) + .bind( + `dist-pending-${index}`, + `content-s-${index + 1}`, + `2026-07-${String(24 + (index % 2)).padStart(2, "0")} 11:00:00`, + ), + ); + } + + await db.batch(batch); +} + +export async function getDashboardData() { + const db = getRawDb(); + const [partnersResult, tasksResult, accountsResult, distributionsResult] = + await Promise.all([ + db.prepare("SELECT * FROM partners ORDER BY created_at DESC").all(), + db.prepare("SELECT * FROM tasks ORDER BY created_at DESC").all(), + db.prepare("SELECT * FROM accounts ORDER BY last_seen_at DESC").all(), + db + .prepare( + `SELECT + d.*, + c.title AS content_title, + p.name AS partner_name, + a.nickname AS account_nickname, + a.platform AS account_platform, + t.name AS task_name, + t.brand AS task_brand, + t.due_at AS due_at + FROM distributions d + JOIN contents c ON c.id = d.content_id + JOIN partners p ON p.id = d.partner_id + JOIN tasks t ON t.id = d.task_id + LEFT JOIN accounts a ON a.id = d.account_id + ORDER BY d.updated_at DESC, d.claimed_at DESC`, + ) + .all(), + ]); + + return { + partners: partnersResult.results as D1ResultRow[], + tasks: tasksResult.results as D1ResultRow[], + accounts: accountsResult.results as D1ResultRow[], + distributions: distributionsResult.results as D1ResultRow[], + portal_url: + (env as unknown as { KOC_PORTAL_URL?: string }).KOC_PORTAL_URL ?? "", + }; +} + +export function uid(prefix: string) { + return `${prefix}-${crypto.randomUUID().slice(0, 8)}`; +} + +export function hashText(value: string) { + let hash = 2166136261; + for (let index = 0; index < value.length; index += 1) { + hash ^= value.charCodeAt(index); + hash = Math.imul(hash, 16777619); + } + return Math.abs(hash >>> 0).toString(36); +} diff --git a/lib/partner-cors.ts b/lib/partner-cors.ts new file mode 100644 index 0000000..8f6512e --- /dev/null +++ b/lib/partner-cors.ts @@ -0,0 +1,41 @@ +import { env } from "cloudflare:workers"; + +function allowedOrigin(request: Request) { + const origin = request.headers.get("origin"); + if (!origin) return null; + const portalOrigin = String( + (env as unknown as { KOC_PORTAL_URL?: string }).KOC_PORTAL_URL ?? "", + ).replace(/\/$/, ""); + return origin === portalOrigin || origin === "http://localhost:3000" + ? origin + : null; +} + +export function withPartnerCors(request: Request, response: Response) { + const origin = allowedOrigin(request); + if (origin) { + response.headers.set("Access-Control-Allow-Origin", origin); + response.headers.set("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); + response.headers.set( + "Access-Control-Allow-Headers", + [ + "Content-Type", + "X-KOC-Task", + "X-KOC-Claim", + "X-KOC-Delegation", + "X-KOC-Distribution", + "X-KOC-File-Name", + "X-KOC-Upload-Kind", + "X-KOC-OCR-Exposure", + "X-KOC-OCR-Views", + "X-KOC-OCR-Status", + ].join(", "), + ); + response.headers.append("Vary", "Origin"); + } + return response; +} + +export function partnerOptions(request: Request) { + return withPartnerCors(request, new Response(null, { status: 204 })); +} diff --git a/lib/partner-utils.ts b/lib/partner-utils.ts new file mode 100644 index 0000000..a4ab305 --- /dev/null +++ b/lib/partner-utils.ts @@ -0,0 +1,29 @@ +import { hashText } from "./mvp-db"; +import { + extractXhsPublishUrl, + safeHttpUrl, +} from "./publish-url"; + +export { extractXhsPublishUrl } from "./publish-url"; + +export function accountFromPublishLink(input: string, nickname: string) { + const url = safeHttpUrl(extractXhsPublishUrl(input)); + if (!url) return null; + const platform = + url.hostname.includes("xiaohongshu") || url.hostname.includes("xhslink") + ? "小红书" + : "其他平台"; + const noteId = + url.pathname.match( + /\/(?:discovery\/item|explore)\/([A-Za-z0-9_-]{8,80})/, + )?.[1] ?? ""; + const platformUid = `pending-${hashText( + noteId || `${url.origin}${url.pathname}`, + )}`; + return { + platform, + platformUid, + nickname, + profileUrl: "", + }; +} diff --git a/lib/publish-url.ts b/lib/publish-url.ts new file mode 100644 index 0000000..829da4f --- /dev/null +++ b/lib/publish-url.ts @@ -0,0 +1,27 @@ +export function safeHttpUrl(input: string) { + try { + const url = new URL(input); + if (!["http:", "https:"].includes(url.protocol)) return null; + return url; + } catch { + return null; + } +} + +export function extractXhsPublishUrl(input: string) { + const candidates = + input.match(/https?:\/\/[^\s<>"',。!?;:、【】()]+/gi) ?? []; + for (const candidate of candidates) { + const cleaned = candidate.replace(/[.,!?;:~)\]}]+$/g, ""); + const url = safeHttpUrl(cleaned); + if (!url) continue; + const hostname = url.hostname.toLowerCase(); + const isXhs = + hostname === "xiaohongshu.com" || + hostname.endsWith(".xiaohongshu.com") || + hostname === "xhslink.cn" || + hostname.endsWith(".xhslink.cn"); + if (isXhs) return url.toString(); + } + return ""; +} diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..fa86803 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11169 @@ +{ + "name": "site-creator-vinext-starter", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "site-creator-vinext-starter", + "version": "0.1.0", + "dependencies": { + "drizzle-orm": "0.45.2", + "next": "16.2.6", + "react": "19.2.6", + "react-dom": "19.2.6" + }, + "devDependencies": { + "@cloudflare/vite-plugin": "1.37.1", + "@tailwindcss/postcss": "4.2.1", + "@types/node": "22.19.19", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.2", + "@vitejs/plugin-rsc": "0.5.26", + "drizzle-kit": "0.31.10", + "eslint": "9.39.4", + "eslint-config-next": "16.2.6", + "react-server-dom-webpack": "19.2.6", + "tailwindcss": "4.2.1", + "typescript": "5.9.3", + "vinext": "0.0.50", + "vite": "8.0.13", + "wrangler": "4.92.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", + "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.1.tgz", + "integrity": "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/vite-plugin": { + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@cloudflare/vite-plugin/-/vite-plugin-1.37.1.tgz", + "integrity": "sha512-FldhsmkXyLsX3yI+p0aJDo/kGyY69pDdynz2JjcuH3eCiQ+G9XaY3CrN+UYEfCbWv8CiR2wL95lNg0fT/HfwWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cloudflare/unenv-preset": "2.16.1", + "miniflare": "4.20260515.0", + "unenv": "2.0.0-rc.24", + "wrangler": "4.92.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "vite": "^6.1.0 || ^7.0.0 || ^8.0.0", + "wrangler": "^4.92.0" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260515.1.tgz", + "integrity": "sha512-Wtw44el2pNbzixvTkWdfeBDTrQwQbJRz7/JUvPKV27I0pQWXbhNJPpM8cstq/pbrU5AGcA/HjFH6yPMRTIRKig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260515.1.tgz", + "integrity": "sha512-X8EqkZej6FfmhF9AVAQ3FhyQRr9acS4RcDunMU2YiuxKHF1IU8zzH3vY30/POaG+rUu9vGDp/VgUl49VPenHJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260515.1.tgz", + "integrity": "sha512-CDC89QxQ7Y7t7RG1Jd9vj/qolE1sQRkI2OSEuV5BMJi0vW/gV4OVG6xjpdK3b1OYnSWDzF7NpvlR5Yg86q7k4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260515.1.tgz", + "integrity": "sha512-WxbW/PToYES4fvHXzsr/5qOiETQs/Z9iZ0mjSZAiEwq5cMLZemzGN0COx+uFb9OvQwzh6Pg159qPFnw3+i9FuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260515.1.tgz", + "integrity": "sha512-WmV/iv+MHjYsvkcMVzpM2B5/mf06UUkdpVhZrtMfV9graWjBGPYFvE/eab8748RPVGKh1Xe1vXofLzDSwc08lA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@drizzle-team/brocli": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", + "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz", + "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.130.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.130.0.tgz", + "integrity": "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/dumper/node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@resvg/resvg-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-wasm/-/resvg-wasm-2.4.0.tgz", + "integrity": "sha512-C7c51Nn4yTxXFKvgh2txJFNweaVcfUPQxwEUFw4aWsCmfiBDJsTSwviIF8EcwjQ6k8bPyMWCl1vw4BdxE569Cg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.1.tgz", + "integrity": "sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.1.tgz", + "integrity": "sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.1.tgz", + "integrity": "sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.1.tgz", + "integrity": "sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shuding/opentype.js": { + "version": "1.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", + "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fflate": "^0.7.3", + "string.prototype.codepointat": "^0.2.1" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz", + "integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "postcss": "^8.5.6", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", + "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unpic/core": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@unpic/core/-/core-1.0.3.tgz", + "integrity": "sha512-aum9YNVUGso7MjGLD0Rp/08kywCGLqZ03/q6VQBFFakDBOXWEc8D4kPGcZ8v5wEnGRex3lE+++bOuucBp3KJ/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "unpic": "^4.2.2" + } + }, + "node_modules/@unpic/react": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@unpic/react/-/react-1.0.2.tgz", + "integrity": "sha512-5RmRfELwTF8w+4zjtQGqjpvX+RU2VLvis3xDCS1O2uWk0PZN2cvatL+3/KAR3mshAuRrkFGTX1XwyAezSXaoCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@unpic/core": "^1.0.3" + }, + "peerDependencies": { + "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + } + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vercel/og": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@vercel/og/-/og-0.8.6.tgz", + "integrity": "sha512-hBcWIOppZV14bi+eAmCZj8Elj8hVSUZJTpf1lgGBhVD85pervzQ1poM/qYfFUlPraYSZYP+ASg6To5BwYmUSGQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@resvg/resvg-wasm": "2.4.0", + "satori": "0.16.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@vitejs/plugin-rsc": { + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-rsc/-/plugin-rsc-0.5.26.tgz", + "integrity": "sha512-T8W8ODEutblw9qXQB512LDPyv1tAbJRD/Gf0QEGsAoydl4nxEtIrghnhoI9oLY9R+7aw+cLk1ZEltxWHWf4aHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.18", + "es-module-lexer": "^2.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21", + "srvx": "^0.11.15", + "strip-literal": "^3.1.0", + "turbo-stream": "^3.2.0", + "vitefu": "^1.1.3" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/@vitejs/plugin-rsc/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz", + "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-loose": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", + "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.30", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz", + "integrity": "sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-background-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", + "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-box-shadow": { + "version": "1.0.0-3", + "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", + "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-gradient-parser": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.16.tgz", + "integrity": "sha512-3O5QdqgFRUbXvK1x5INf1YkBz1UKSWqrd63vWsum8MNHDBYD5urm3QtxZbKU259OrEXNM26lP/MPY3d1IGkBgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/drizzle-kit": { + "version": "0.31.10", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", + "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "tsx": "^4.21.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/drizzle-orm": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz", + "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.358", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.358.tgz", + "integrity": "sha512-EO7tKm3QxRqTs1lSuPXzl6yRAwznehp0AH9OoMOIC+4mQzTFday8FJCO5KU6J/TFSQXEOahNq4vTKpz1jmCVOA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz", + "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.6.tgz", + "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.2.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hex-rgb": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", + "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "dev": true, + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/miniflare": { + "version": "4.20260515.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260515.0.tgz", + "integrity": "sha512-2j0oQWizk1Eu4Cm8tDX7Z+Nsjd0nebIj1TQcQ+Oy1QKeo0Ay9+bdn8wfLAtOj9znDCybDCUlnS1+nYvKXEdfNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.24.8", + "workerd": "1.20260515.1", + "ws": "8.18.0", + "youch": "4.1.0-beta.10" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-css-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", + "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4", + "hex-rgb": "^4.1.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-server-dom-webpack": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-19.2.6.tgz", + "integrity": "sha512-762YXjBPc6hw2V16k4x1sdnw0mxghcSPzoiOhefGYjiTguJLCImGBUz6EjznPIfqKhWgLtpaQMlBhp66N8dKrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-loose": "^8.3.0", + "neo-async": "^2.6.1", + "webpack-sources": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.6", + "react-dom": "^19.2.6", + "webpack": "^5.59.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.1.tgz", + "integrity": "sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.130.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.1", + "@rolldown/binding-darwin-arm64": "1.0.1", + "@rolldown/binding-darwin-x64": "1.0.1", + "@rolldown/binding-freebsd-x64": "1.0.1", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.1", + "@rolldown/binding-linux-arm64-gnu": "1.0.1", + "@rolldown/binding-linux-arm64-musl": "1.0.1", + "@rolldown/binding-linux-ppc64-gnu": "1.0.1", + "@rolldown/binding-linux-s390x-gnu": "1.0.1", + "@rolldown/binding-linux-x64-gnu": "1.0.1", + "@rolldown/binding-linux-x64-musl": "1.0.1", + "@rolldown/binding-openharmony-arm64": "1.0.1", + "@rolldown/binding-wasm32-wasi": "1.0.1", + "@rolldown/binding-win32-arm64-msvc": "1.0.1", + "@rolldown/binding-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/satori": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.16.0.tgz", + "integrity": "sha512-ZvHN3ygzZ8FuxjSNB+mKBiF/NIoqHzlBGbD0MJiT+MvSsFOvotnWOhdTjxKzhHRT2wPC1QbhLzx2q/Y83VhfYQ==", + "dev": true, + "license": "MPL-2.0", + "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.16", + "css-to-react-native": "^3.0.0", + "emoji-regex-xs": "^2.0.1", + "escape-html": "^1.0.3", + "linebreak": "^1.1.0", + "parse-css-color": "^0.2.1", + "postcss-value-parser": "^4.2.0", + "yoga-layout": "^3.2.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/srvx": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.15.tgz", + "integrity": "sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==", + "dev": true, + "license": "MIT", + "bin": { + "srvx": "bin/srvx.mjs" + }, + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.47.1.tgz", + "integrity": "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.1.tgz", + "integrity": "sha512-TvncJykhxAzFCk0VQZKBTClall4Pm7qXDSodb6uxi8QFa8X8mT6ABjxxsQ2opDRYxG7AzcRWXaFtruz5HJKuWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/turbo-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-3.2.0.tgz", + "integrity": "sha512-EK+bZ9UVrVh7JLslVFOV0GEMsociOqVOvEMTAd4ixMyffN5YNIEdLZWXUx5PJqDbTxSIBWw04HS9gCY4frYQDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", + "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.59.3", + "@typescript-eslint/parser": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", + "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unpic": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/unpic/-/unpic-4.2.2.tgz", + "integrity": "sha512-z6T2ScMgRV2y2H8MwwhY5xHZWXhUx/YxtOCGJwfURSl7ypVy4HpLIMWoIZKnnxQa/RKzM0kg8hUh0paIrpLfvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vinext": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/vinext/-/vinext-0.0.50.tgz", + "integrity": "sha512-uo72YNnq94NtogETWnhMdFSrkMLwWgeXh5PS6qh8ksajuvAaZX50bXYJ4a6dERQ/AnnXAlNByAGHCjjNxQrvig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@unpic/react": "^1.0.2", + "@vercel/og": "^0.8.6", + "image-size": "2.0.2", + "ipaddr.js": "^2.1.0", + "magic-string": "^0.30.21", + "vite-plugin-commonjs": "^0.10.4", + "vite-tsconfig-paths": "^6.1.1", + "web-vitals": "^4.2.4" + }, + "bin": { + "vinext": "dist/cli.js" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "@mdx-js/rollup": "^3.0.0", + "@vitejs/plugin-react": "^5.1.4 || ^6.0.0", + "@vitejs/plugin-rsc": "^0.5.23", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "react-server-dom-webpack": "^19.2.6", + "vite": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@mdx-js/rollup": { + "optional": true + }, + "@vitejs/plugin-rsc": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.13.tgz", + "integrity": "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "rolldown": "1.0.1", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-commonjs": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/vite-plugin-commonjs/-/vite-plugin-commonjs-0.10.4.tgz", + "integrity": "sha512-eWQuvQKCcx0QYB5e5xfxBNjQKyrjEWZIR9UOkOV6JAgxVhtbZvCOF+FNC2ZijBJ3U3Px04ZMMyyMyFBVWIJ5+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "magic-string": "^0.30.11", + "vite-plugin-dynamic-import": "^1.6.0" + } + }, + "node_modules/vite-plugin-dynamic-import": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.6.0.tgz", + "integrity": "sha512-TM0sz70wfzTIo9YCxVFwS8OA9lNREsh+0vMHGSkWDTZ7bgd1Yjs5RV8EgB634l/91IsXJReg0xtmuQqP0mf+rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "es-module-lexer": "^1.5.4", + "fast-glob": "^3.3.2", + "magic-string": "^0.30.11" + } + }, + "node_modules/vite-plugin-dynamic-import/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-dynamic-import/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/vite-plugin-dynamic-import/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.1.1.tgz", + "integrity": "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/webpack": { + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.1", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerd": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260515.1.tgz", + "integrity": "sha512-MjKOJLcvU45xXedQowvuiHtJTxu4WTHYQeIlF7YmjuqhiI6dImTFxWCEoRQHiskztxuVSNEmdO7/0UfDu6OMnQ==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260515.1", + "@cloudflare/workerd-darwin-arm64": "1.20260515.1", + "@cloudflare/workerd-linux-64": "1.20260515.1", + "@cloudflare/workerd-linux-arm64": "1.20260515.1", + "@cloudflare/workerd-windows-64": "1.20260515.1" + } + }, + "node_modules/wrangler": { + "version": "4.92.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.92.0.tgz", + "integrity": "sha512-/DKpQHPxkuZbQsO9dFW2700VTD/4DSZMHjy92fO/frNoDRi/zQsFCAd2ONCV6TGqcUoXcP3D8Bo2gj/L4M0qQQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.5.0", + "@cloudflare/unenv-preset": "2.16.1", + "blake3-wasm": "2.1.5", + "esbuild": "0.27.3", + "miniflare": "4.20260515.0", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260515.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=22.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20260515.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/youch": { + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..b7babc9 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "site-creator-vinext-starter", + "version": "0.1.0", + "private": true, + "engines": { + "node": ">=22.13.0" + }, + "scripts": { + "dev": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext dev", + "build": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext build", + "start": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext start", + "test": "npm run build && node --test tests/*.test.mjs", + "lint": "eslint . --ignore-pattern dist --ignore-pattern .next", + "db:generate": "drizzle-kit generate" + }, + "dependencies": { + "drizzle-orm": "0.45.2", + "next": "16.2.6", + "react": "19.2.6", + "react-dom": "19.2.6" + }, + "devDependencies": { + "@cloudflare/vite-plugin": "1.37.1", + "@tailwindcss/postcss": "4.2.1", + "@types/node": "22.19.19", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.2", + "@vitejs/plugin-rsc": "0.5.26", + "drizzle-kit": "0.31.10", + "eslint": "9.39.4", + "eslint-config-next": "16.2.6", + "react-server-dom-webpack": "19.2.6", + "tailwindcss": "4.2.1", + "typescript": "5.9.3", + "vinext": "0.0.50", + "vite": "8.0.13", + "wrangler": "4.92.0" + }, + "type": "module" +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..2e7dfa4 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/og.png b/public/og.png new file mode 100644 index 0000000..f9749f6 Binary files /dev/null and b/public/og.png differ diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scripts/build-feishu-snapshot.mjs b/scripts/build-feishu-snapshot.mjs new file mode 100644 index 0000000..7fd2cc4 --- /dev/null +++ b/scripts/build-feishu-snapshot.mjs @@ -0,0 +1,43 @@ +import { readFile, writeFile } from "node:fs/promises"; +import { resolve } from "node:path"; + +const [, , inputPath, outputPath] = process.argv; + +if (!inputPath || !outputPath) { + throw new Error("Usage: node scripts/build-feishu-snapshot.mjs "); +} + +const payload = JSON.parse(await readFile(resolve(inputPath), "utf8")); +const sheet = payload?.data?.sheets?.[0]; + +if (!sheet || !Array.isArray(sheet.data)) { + throw new Error("Invalid lark-cli +table-get payload"); +} + +const rows = sheet.data + .map((row, index) => ({ + sourceRow: Number(row[0]) || index + 1, + title: String(row[2] ?? "").trim(), + body: String(row[3] ?? "").trim(), + })) + .filter((row) => row.title); + +const snapshot = { + wikiToken: "BSzxwRbGJi5dWoksauicUjtonks", + sheetId: "954953", + sheetName: sheet.name, + sourceRange: sheet.range, + syncedAt: new Date().toISOString(), + columns: [ + "序号(不能改)", + "标题", + "笔记内容(正文+话题)", + "图片1", + "图片2", + "图片3", + ], + rows, +}; + +await writeFile(resolve(outputPath), `${JSON.stringify(snapshot, null, 2)}\n`, "utf8"); +console.log(`Wrote ${rows.length} rows to ${outputPath}`); diff --git a/scripts/sync-feishu-images.mjs b/scripts/sync-feishu-images.mjs new file mode 100644 index 0000000..c25c770 --- /dev/null +++ b/scripts/sync-feishu-images.mjs @@ -0,0 +1,315 @@ +import { execFile } from "node:child_process"; +import { + mkdir, + readFile, + readdir, + stat, + writeFile, +} from "node:fs/promises"; +import { extname, resolve } from "node:path"; +import { promisify } from "node:util"; + +const execFileAsync = promisify(execFile); +const projectRoot = resolve(import.meta.dirname, ".."); +const snapshotPath = resolve(projectRoot, "lib/feishu-source-snapshot.json"); +const downloadDir = "/private/tmp/koc-feishu-images-954953"; +const uploadOriginArg = process.argv.find((item) => + item.startsWith("--upload-origin="), +); +const uploadOrigin = uploadOriginArg + ? uploadOriginArg.slice("--upload-origin=".length).replace(/\/$/, "") + : ""; +const internalToken = + process.env.KOC_ADMIN_INTERNAL_TOKEN ?? + process.env.ADMIN_INTERNAL_TOKEN ?? + ""; +const reuseDownloads = process.argv.includes("--reuse-downloads"); +const fromRowArg = process.argv.find((item) => item.startsWith("--from-row=")); +const fromRow = fromRowArg + ? Math.max(1, Number(fromRowArg.slice("--from-row=".length)) || 1) + : 1; + +if (uploadOrigin && !internalToken) { + throw new Error( + "KOC_ADMIN_INTERNAL_TOKEN is required when --upload-origin is provided", + ); +} + +const snapshot = JSON.parse(await readFile(snapshotPath, "utf8")); +const sourceUrl = + "https://eodzc79n5l.feishu.cn/wiki/BSzxwRbGJi5dWoksauicUjtonks?from=from_copylink&sheet=954953"; +const quietEnv = { + ...process.env, + LARKSUITE_CLI_NO_UPDATE_NOTIFIER: "1", + LARKSUITE_CLI_NO_SKILLS_NOTIFIER: "1", +}; + +await mkdir(downloadDir, { recursive: true }); + +const { stdout: cellsStdout } = await execFileAsync( + "lark-cli", + [ + "sheets", + "+cells-get", + "--url", + sourceUrl, + "--sheet-id", + snapshot.sheetId, + "--range", + "F2:H62", + "--include", + "value", + "--max-chars", + "500000", + "--format", + "json", + ], + { + cwd: projectRoot, + env: quietEnv, + maxBuffer: 2_000_000, + }, +); + +const cellsPayload = JSON.parse(cellsStdout); +if (!cellsPayload.ok || cellsPayload.data?.has_more) { + throw new Error("Feishu image cells were not returned completely"); +} +const range = cellsPayload.data?.ranges?.[0]; +if (!range || range.truncated || range.actual_range !== "F2:H62") { + throw new Error( + `Unexpected Feishu image range: ${range?.actual_range ?? "missing"}`, + ); +} + +const sourceRows = new Map( + snapshot.rows.map((row) => [Number(row.sourceRow), row]), +); +const assets = []; + +for (let rowIndex = 0; rowIndex < range.cells.length; rowIndex += 1) { + const sheetRow = Number(range.row_indices[rowIndex]); + const sourceRow = sheetRow - 1; + if (!sourceRows.has(sourceRow)) continue; + const cells = range.cells[rowIndex] ?? []; + for (let columnIndex = 0; columnIndex < cells.length; columnIndex += 1) { + const column = range.col_indices[columnIndex]; + const imageIndex = ["F", "G", "H"].indexOf(column) + 1; + if (imageIndex < 1) continue; + const richText = cells[columnIndex]?.rich_text ?? []; + const image = richText.find((item) => item.type === "embed-image"); + if (!image?.image_token) continue; + assets.push({ + sourceRow, + imageIndex, + token: image.image_token, + width: Number(image.image_width) || null, + height: Number(image.image_height) || null, + key: `content-assets/${snapshot.sheetId}/${sourceRow}/${imageIndex}`, + }); + } +} + +async function downloadAsset(asset) { + const baseName = `row-${asset.sourceRow}-image-${asset.imageIndex}`; + if (reuseDownloads) { + const existingName = (await readdir(downloadDir)).find((name) => + name.startsWith(`${baseName}.`), + ); + if (existingName) { + const localPath = resolve(downloadDir, existingName); + const extension = extname(existingName).toLowerCase(); + const fileInfo = await stat(localPath); + return { + ...asset, + localPath, + contentType: + extension === ".png" + ? "image/png" + : extension === ".webp" + ? "image/webp" + : "image/jpeg", + sizeBytes: fileInfo.size, + }; + } + } + const { stdout } = await execFileAsync( + "lark-cli", + [ + "docs", + "+media-download", + "--token", + asset.token, + "--output", + `./${baseName}`, + "--overwrite", + ], + { + cwd: downloadDir, + env: quietEnv, + maxBuffer: 200_000, + }, + ); + const result = JSON.parse(stdout.slice(stdout.indexOf("{"))); + if (!result.ok || !result.data?.saved_path) { + throw new Error( + `Failed to download row ${asset.sourceRow} image ${asset.imageIndex}`, + ); + } + return { + ...asset, + localPath: result.data.saved_path, + contentType: result.data.content_type || "application/octet-stream", + sizeBytes: Number(result.data.size_bytes) || 0, + }; +} + +const downloaded = []; +const queue = [...assets]; +const workers = Array.from({ length: 4 }, async () => { + while (queue.length > 0) { + const asset = queue.shift(); + if (!asset) return; + downloaded.push(await downloadAsset(asset)); + } +}); +await Promise.all(workers); +downloaded.sort( + (left, right) => + left.sourceRow - right.sourceRow || left.imageIndex - right.imageIndex, +); + +for (const row of snapshot.rows) { + row.images = downloaded + .filter((asset) => asset.sourceRow === Number(row.sourceRow)) + .map((asset) => ({ + index: asset.imageIndex, + key: asset.key, + width: asset.width, + height: asset.height, + })); +} +await writeFile(snapshotPath, `${JSON.stringify(snapshot, null, 2)}\n`, "utf8"); + +if (uploadOrigin) { + const sharp = (await import("sharp")).default; + const uploadConcurrency = new URL(uploadOrigin).hostname === "localhost" ? 4 : 1; + + async function prepareUpload(asset) { + const original = await readFile(asset.localPath); + if (original.byteLength < 800_000) { + return { + bytes: original, + contentType: asset.contentType, + extension: extname(asset.localPath) || ".bin", + }; + } + let quality = 86; + let compressed = await sharp(original) + .rotate() + .flatten({ background: "#ffffff" }) + .resize({ + width: 1800, + height: 2200, + fit: "inside", + withoutEnlargement: true, + }) + .jpeg({ quality, mozjpeg: true }) + .toBuffer(); + while (compressed.byteLength > 800_000 && quality > 58) { + quality -= 7; + compressed = await sharp(original) + .rotate() + .flatten({ background: "#ffffff" }) + .resize({ + width: 1600, + height: 2000, + fit: "inside", + withoutEnlargement: true, + }) + .jpeg({ quality, mozjpeg: true }) + .toBuffer(); + } + return { + bytes: compressed, + contentType: "image/jpeg", + extension: ".jpg", + }; + } + + const uploadQueue = downloaded.filter((asset) => asset.sourceRow >= fromRow); + const uploadWorkers = Array.from({ length: uploadConcurrency }, async () => { + while (uploadQueue.length > 0) { + const asset = uploadQueue.shift(); + if (!asset) return; + const prepared = await prepareUpload(asset); + let uploaded = false; + let lastError = "unknown error"; + for (let attempt = 1; attempt <= 3; attempt += 1) { + const form = new FormData(); + form.append("sheetId", snapshot.sheetId); + form.append("sourceRow", String(asset.sourceRow)); + form.append("imageIndex", String(asset.imageIndex)); + form.append( + "file", + new File( + [prepared.bytes], + `image-${asset.imageIndex}${prepared.extension}`, + { + type: prepared.contentType, + }, + ), + ); + const response = await fetch( + `${uploadOrigin}/api/content-image-upload`, + { + method: "POST", + headers: { + "X-KOC-Admin-Token": internalToken, + }, + body: form, + }, + ); + const responseText = await response.text(); + let result = {}; + try { + result = JSON.parse(responseText); + } catch { + result = { error: responseText || `HTTP ${response.status}` }; + } + if (response.ok) { + uploaded = true; + break; + } + lastError = result.error ?? `HTTP ${response.status}`; + if (response.status < 500 && response.status !== 404) break; + await new Promise((resolveDelay) => + setTimeout(resolveDelay, attempt * 750), + ); + } + if (!uploaded) { + throw new Error( + `Upload failed for row ${asset.sourceRow} image ${asset.imageIndex}: ${lastError}`, + ); + } + } + }); + await Promise.all(uploadWorkers); +} + +const totalBytes = downloaded.reduce( + (sum, asset) => sum + asset.sizeBytes, + 0, +); +console.log( + JSON.stringify({ + rows: snapshot.rows.length, + images: downloaded.length, + totalBytes, + uploaded: Boolean(uploadOrigin), + uploadedImages: uploadOrigin + ? downloaded.filter((asset) => asset.sourceRow >= fromRow).length + : 0, + downloadDir, + }), +); diff --git a/tests/date-utils.test.mjs b/tests/date-utils.test.mjs new file mode 100644 index 0000000..8b6467b --- /dev/null +++ b/tests/date-utils.test.mjs @@ -0,0 +1,16 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { + formatShanghaiDate, + parseStoredDate, +} from "../lib/date-utils.ts"; + +test("treats D1 CURRENT_TIMESTAMP values as UTC and displays Beijing time", () => { + const stored = "2026-07-29 05:36:00"; + assert.equal(parseStoredDate(stored).toISOString(), "2026-07-29T05:36:00.000Z"); + assert.match(formatShanghaiDate(stored, true), /07\/29.*13:36/); +}); + +test("keeps date-only deadlines on the intended Shanghai calendar date", () => { + assert.match(formatShanghaiDate("2026-08-12"), /08\/12/); +}); diff --git a/tests/feishu-client.test.mjs b/tests/feishu-client.test.mjs new file mode 100644 index 0000000..193d6a3 --- /dev/null +++ b/tests/feishu-client.test.mjs @@ -0,0 +1,177 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { + clearFeishuAccessTokenCacheForTests, + readFeishuSource, +} from "../lib/feishu-client.ts"; + +const bindings = { + FEISHU_APP_ID: "cli_test", + FEISHU_APP_SECRET: "secret_test", +}; + +function apiResponse(data) { + return Response.json({ code: 0, msg: "success", data }); +} + +function fakeFeishu(options = {}) { + const calls = []; + const fetchImpl = async (input, init = {}) => { + const url = new URL(String(input)); + calls.push({ url, init }); + if (url.pathname.endsWith("/tenant_access_token/internal")) { + return Response.json({ + code: 0, + msg: "success", + tenant_access_token: "tenant-test", + expire: 7200, + }); + } + if (url.pathname.endsWith("/wiki/v2/spaces/get_node")) { + return apiResponse({ + node: { + obj_type: "sheet", + obj_token: "spreadsheet-test", + }, + }); + } + if (url.pathname.endsWith("/sheets/query")) { + return apiResponse({ + sheets: + options.sheets ?? + [ + { + sheet_id: "sheet-one", + title: "内容池", + resource_type: "sheet", + hidden: false, + grid_properties: { row_count: 20, column_count: 10 }, + }, + ], + }); + } + if (url.pathname.endsWith("/values_batch_get")) { + return apiResponse({ + valueRanges: [ + { + values: [ + ["作品ID", "标题", "标签", "正文", null, null], + [ + 7, + "一篇测试笔记", + "#测试 #KOC", + "测试正文", + { + type: "embed-image", + fileToken: "file-token-one", + width: 1080, + height: 1440, + }, + [ + { + type: "embed-image", + fileToken: "file-token-two", + width: 1080, + height: 1440, + }, + ], + ], + [8, "", "", "空标题不会导入"], + ], + }, + ], + }); + } + throw new Error(`Unexpected request: ${url.pathname}`); + }; + return { calls, fetchImpl }; +} + +test("resolves a wiki sheet and imports title, body, tags, and all images", async () => { + clearFeishuAccessTokenCacheForTests(); + const { calls, fetchImpl } = fakeFeishu(); + const source = await readFeishuSource( + "https://tenant.feishu.cn/wiki/wiki-test", + bindings, + fetchImpl, + ); + + assert.equal(source.spreadsheetToken, "spreadsheet-test"); + assert.equal(source.sheetId, "sheet-one"); + assert.equal(source.sheetName, "内容池"); + assert.equal(source.rows.length, 1); + assert.equal(source.rows[0].sourceRow, 7); + assert.equal(source.rows[0].body, "测试正文\n\n#测试 #KOC"); + assert.deepEqual( + source.rows[0].images.map((image) => image.fileToken), + ["file-token-one", "file-token-two"], + ); + assert.deepEqual(source.columns, [ + "作品ID", + "标题", + "标签", + "正文", + "图片1", + "图片2", + ]); + const valuesCall = calls.find((call) => + call.url.pathname.endsWith("/values_batch_get"), + ); + assert.equal(valuesCall.url.searchParams.get("ranges"), "sheet-one!A1:J20"); +}); + +test("requires an exact sheet link when a workbook has multiple visible sheets", async () => { + clearFeishuAccessTokenCacheForTests(); + const { fetchImpl } = fakeFeishu({ + sheets: [ + { + sheet_id: "one", + title: "内容A", + resource_type: "sheet", + hidden: false, + }, + { + sheet_id: "two", + title: "内容B", + resource_type: "sheet", + hidden: false, + }, + ], + }); + + await assert.rejects( + readFeishuSource( + "https://tenant.feishu.cn/wiki/wiki-test", + bindings, + fetchImpl, + ), + /包含多个工作表/, + ); +}); + +test("rejects a wiki node that is not a spreadsheet", async () => { + clearFeishuAccessTokenCacheForTests(); + const fetchImpl = async (input) => { + const url = new URL(String(input)); + if (url.pathname.endsWith("/tenant_access_token/internal")) { + return Response.json({ + code: 0, + msg: "success", + tenant_access_token: "tenant-test", + expire: 7200, + }); + } + return apiResponse({ + node: { obj_type: "docx", obj_token: "document-test" }, + }); + }; + + await assert.rejects( + readFeishuSource( + "https://tenant.feishu.cn/wiki/wiki-test", + bindings, + fetchImpl, + ), + /不是电子表格/, + ); +}); diff --git a/tests/mcp-collection-client.test.mjs b/tests/mcp-collection-client.test.mjs new file mode 100644 index 0000000..918bfc3 --- /dev/null +++ b/tests/mcp-collection-client.test.mjs @@ -0,0 +1,510 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { + collectXhsMetricsFromMcp, + resolveCollectionMcpConfig, + resolveXhsPublicAccountDetails, + resolveXhsPublicAccountId, + resolveXhsAccountProfileFromMcp, + resolveXhsProfileDetailsFromMcp, + xhsNoteIdFromUrl, +} from "../lib/mcp-collection-client.ts"; + +function sse(payload, options = {}) { + return new Response( + `event: message\ndata: ${JSON.stringify(payload)}\n\n`, + { + status: 200, + ...options, + headers: { + "content-type": "text/event-stream", + ...(options.headers ?? {}), + }, + }, + ); +} + +function toolEnvelope(payload, isError = false) { + return { + jsonrpc: "2.0", + id: "tool-call", + result: { + isError, + content: [ + { + type: "text", + text: JSON.stringify(payload), + }, + ], + }, + }; +} + +function createFakeMcp(toolResults) { + let toolIndex = 0; + const calls = []; + const fetchImpl = async (url, init) => { + const body = JSON.parse(init.body); + calls.push({ url: String(url), body, headers: new Headers(init.headers) }); + if (body.method === "initialize") { + return sse( + { + jsonrpc: "2.0", + id: body.id, + result: { + protocolVersion: "2025-03-26", + capabilities: { tools: { listChanged: false } }, + serverInfo: { name: "ai-tool-center", version: "test" }, + }, + }, + { headers: { "mcp-session-id": "session-test" } }, + ); + } + if (body.method === "notifications/initialized") { + return new Response("", { status: 202 }); + } + if (body.method === "tools/call") { + const result = toolResults[toolIndex]; + toolIndex += 1; + return sse(result); + } + throw new Error(`Unexpected MCP method: ${body.method}`); + }; + return { calls, fetchImpl }; +} + +test("collects likes, comments and favorites from the verified MCP shape", async () => { + const { calls, fetchImpl } = createFakeMcp([ + toolEnvelope({ + http_status: 200, + response: { + code: 200, + success: true, + msg: "获取内容详情成功", + data: { + likes: "483", + comments: "41", + collects: "519", + }, + }, + }), + ]); + + const result = await collectXhsMetricsFromMcp( + "https://www.xiaohongshu.com/discovery/item/test?xsec_token=valid", + { + endpoint: "https://collector.example/mcp", + key: "test-key", + }, + fetchImpl, + ); + + assert.deepEqual(result, { + likes: 483, + comments: 41, + collects: 519, + }); + assert.equal(calls.length, 3); + assert.equal(calls[2].body.params.name, "fetch_content_detail"); + assert.equal(calls[2].body.params.arguments.include_comments, false); + assert.equal(calls[2].headers.get("mcp-session-id"), "session-test"); + assert.equal(new URL(calls[0].url).searchParams.get("key"), "test-key"); +}); + +test("resolves the real XHS account profile from a submitted note link", async () => { + const { calls, fetchImpl } = createFakeMcp([ + toolEnvelope({ + response: { + code: 200, + success: true, + data: { + note_detail: { + products: [ + { + content_tags: [ + { + notes: [ + { + ip_location: "重庆", + note_id: "6a671108000000000f004bef", + user: { + nickname: "N我的麻辣烫好了吗", + profile_url: + "https://www.xiaohongshu.com/user/profile/6905cbca0000000037009f49", + red_id: "94329495984", + user_id: "6905cbca0000000037009f49", + }, + }, + ], + }, + ], + }, + ], + }, + }, + }, + }), + toolEnvelope({ + response: { + code: 200, + success: true, + data: { + fans_count: "734", + }, + }, + }), + ]); + + const profile = await resolveXhsAccountProfileFromMcp( + "https://www.xiaohongshu.com/discovery/item/6a671108000000000f004bef", + "回填昵称", + { + endpoint: "https://collector.example/mcp", + key: "test-key", + }, + fetchImpl, + ); + + assert.deepEqual(profile, { + platformUid: "6905cbca0000000037009f49", + nickname: "N我的麻辣烫好了吗", + profileUrl: + "https://www.xiaohongshu.com/user/profile/6905cbca0000000037009f49", + redId: "94329495984", + ipLocation: "重庆", + followers: 734, + }); + assert.equal(calls.length, 4); + assert.equal( + calls[2].body.params.name, + "collect_xhs_wen_note_detail", + ); + assert.equal( + calls[2].body.params.arguments.note_id, + "6a671108000000000f004bef", + ); + assert.equal(calls[3].body.params.name, "parse_xhs_user_summary"); + assert.equal( + calls[3].body.params.arguments.url, + "https://www.xiaohongshu.com/user/profile/6905cbca0000000037009f49", + ); + assert.equal( + xhsNoteIdFromUrl( + "https://www.xiaohongshu.com/explore/6a671108000000000f004bef", + ), + "6a671108000000000f004bef", + ); +}); + +test("resolves followers directly from the supported XHS user summary tool", async () => { + const { calls, fetchImpl } = createFakeMcp([ + toolEnvelope({ + response: { + code: 200, + success: true, + msg: "用户摘要解析成功", + data: { + user: { + fansCount: 6, + ipLocation: "福建", + nickname: "555 五", + userId: "1020668113", + }, + }, + }, + }), + ]); + + const details = await resolveXhsProfileDetailsFromMcp( + "https://www.xiaohongshu.com/user/profile/5fb21d32000000000101c23e", + { + endpoint: "https://collector.example/mcp", + key: "test-key", + }, + fetchImpl, + ); + + assert.deepEqual(details, { + followers: 6, + redId: "1020668113", + ipLocation: "福建", + }); + assert.equal(calls[2].body.params.name, "parse_xhs_user_summary"); +}); + +test("resolves an xhslink short URL before requesting the author profile", async () => { + const fakeMcp = createFakeMcp([ + toolEnvelope({ + response: { + code: 200, + success: true, + data: { + note_detail: { + note_id: "6a572da40000000021018bd2", + ip_location: "上海", + user: { + nickname: "短链作者", + user_id: "6905cbca0000000037009f49", + }, + }, + }, + }, + }), + toolEnvelope({ + response: { + code: 200, + success: true, + data: { + red_id: "1020668113", + followers: "1.2万", + }, + }, + }), + ]); + const fetchImpl = async (url, init) => { + if (String(url) === "http://xhslink.cn/o/AJFyP5dnj7O") { + return new Response(null, { + status: 302, + headers: { + location: + "https://www.xiaohongshu.com/discovery/item/6a572da40000000021018bd2?xsec_token=valid", + }, + }); + } + return fakeMcp.fetchImpl(url, init); + }; + + const profile = await resolveXhsAccountProfileFromMcp( + "http://xhslink.cn/o/AJFyP5dnj7O", + "回填昵称", + { + endpoint: "https://collector.example/mcp", + key: "test-key", + }, + fetchImpl, + ); + + assert.equal(profile.nickname, "短链作者"); + assert.equal(profile.platformUid, "6905cbca0000000037009f49"); + assert.equal(profile.redId, "1020668113"); + assert.equal(profile.followers, 12_000); + assert.equal( + profile.profileUrl, + "https://www.xiaohongshu.com/user/profile/6905cbca0000000037009f49", + ); + assert.equal( + fakeMcp.calls[2].body.params.arguments.note_id, + "6a572da40000000021018bd2", + ); +}); + +test("uses the public note author when MCP profile lookup fails", async () => { + const fakeMcp = createFakeMcp([ + toolEnvelope( + { + response: { + code: 500, + success: false, + msg: "作者详情暂时不可用", + }, + }, + true, + ), + ]); + const fetchImpl = async (url, init) => { + if (String(url) === "http://xhslink.cn/o/AJFyP5dnj7O") { + return new Response( + '', + { + status: 200, + headers: { + "content-type": "text/html; charset=utf-8", + location: + "https://www.xiaohongshu.com/discovery/item/6a572da40000000021018bd2?xsec_token=valid", + }, + }, + ); + } + if ( + String(url) === + "https://www.xiaohongshu.com/user/profile/5fb21d32000000000101c23e" + ) { + return new Response( + '', + { status: 200 }, + ); + } + return fakeMcp.fetchImpl(url, init); + }; + + const profile = await resolveXhsAccountProfileFromMcp( + "http://xhslink.cn/o/AJFyP5dnj7O", + "回填昵称", + { + endpoint: "https://collector.example/mcp", + key: "test-key", + }, + fetchImpl, + ); + + assert.deepEqual(profile, { + platformUid: "5fb21d32000000000101c23e", + nickname: "555 五", + profileUrl: + "https://www.xiaohongshu.com/user/profile/5fb21d32000000000101c23e", + redId: "1020668113", + ipLocation: "待识别", + followers: 6, + }); + assert.equal( + fakeMcp.calls[2].body.params.name, + "collect_xhs_wen_note_detail", + ); +}); + +test("reads the user-visible Xiaohongshu number from a public profile", async () => { + const fetchImpl = async () => + new Response( + '
小红书号:1020668113
', + { status: 200 }, + ); + const accountId = await resolveXhsPublicAccountId( + "https://www.xiaohongshu.com/user/profile/5fb21d32000000000101c23e", + fetchImpl, + ); + const details = await resolveXhsPublicAccountDetails( + "https://www.xiaohongshu.com/user/profile/5fb21d32000000000101c23e", + fetchImpl, + ); + + assert.equal(accountId, "1020668113"); + assert.deepEqual(details, { + redId: "1020668113", + followers: 10, + ipLocation: "", + }); +}); + +test("falls back to parse_xhs_note when the primary tool fails", async () => { + const { calls, fetchImpl } = createFakeMcp([ + toolEnvelope( + { + response: { + code: 400, + success: false, + msg: "获取内容详情失败", + data: null, + }, + }, + true, + ), + toolEnvelope({ + response: { + code: 200, + success: true, + data: { + likes: "1.2万", + comments: 32, + collects: "2,345", + }, + }, + }), + ]); + + const result = await collectXhsMetricsFromMcp( + "https://www.xiaohongshu.com/explore/test", + { + endpoint: "https://collector.example/mcp?key=test-key", + }, + fetchImpl, + ); + + assert.deepEqual(result, { + likes: 12_000, + comments: 32, + collects: 2_345, + }); + assert.equal(calls[3].body.params.name, "parse_xhs_note"); +}); + +test("requires the MCP key without sending a network request", async () => { + let requested = false; + await assert.rejects( + collectXhsMetricsFromMcp( + "https://www.xiaohongshu.com/explore/test", + resolveCollectionMcpConfig({}), + async () => { + requested = true; + return new Response(); + }, + ), + /MCP采集密钥未配置/, + ); + assert.equal(requested, false); +}); + +test("rebuilds the MCP session after a gateway session miss", async () => { + let initializeCount = 0; + const fetchImpl = async (_url, init) => { + const body = JSON.parse(init.body); + if (body.method === "initialize") { + initializeCount += 1; + return sse( + { + jsonrpc: "2.0", + id: body.id, + result: { + protocolVersion: "2025-03-26", + capabilities: { tools: { listChanged: false } }, + serverInfo: { name: "ai-tool-center", version: "test" }, + }, + }, + { + headers: { + "mcp-session-id": `session-${initializeCount}`, + }, + }, + ); + } + if ( + body.method === "notifications/initialized" && + initializeCount === 1 + ) { + return Response.json( + { + jsonrpc: "2.0", + id: "server-error", + error: { code: -32600, message: "Session not found" }, + }, + { status: 404 }, + ); + } + if (body.method === "notifications/initialized") { + return new Response("", { status: 202 }); + } + if (body.method === "tools/call") { + return sse( + toolEnvelope({ + response: { + code: 200, + success: true, + data: { likes: 8, comments: 2, collects: 5 }, + }, + }), + ); + } + throw new Error(`Unexpected MCP method: ${body.method}`); + }; + + const result = await collectXhsMetricsFromMcp( + "https://www.xiaohongshu.com/explore/test", + { + endpoint: "https://collector.example/mcp", + key: "test-key", + }, + fetchImpl, + ); + + assert.deepEqual(result, { likes: 8, comments: 2, collects: 5 }); + assert.equal(initializeCount, 2); +}); diff --git a/tests/partner-utils.test.mjs b/tests/partner-utils.test.mjs new file mode 100644 index 0000000..8ba3c60 --- /dev/null +++ b/tests/partner-utils.test.mjs @@ -0,0 +1,30 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { + extractXhsPublishUrl, +} from "../lib/publish-url.ts"; + +const longShareText = + "81 【汕头街头的夏天,有点可爱 - pyeong | 小红书 - 你的生活兴趣社区】 😆 qpF2vquW4v6E0uq 😆 https://www.xiaohongshu.com/discovery/item/6a5a407d000000000e0363c7?source=webshare&xhsshare=pc_web&xsec_token=ABQTS76SGS2MKA1rYfSay-1cyULvb_8k7kNIw4mKVrcDA=&xsec_source=pc_share"; +const shortShareText = + "汕头街头的夏天,有点可爱 今天的关键词: 浅蓝色、草... http://xhslink.cn/o/6UDG4oUB8kR 保留这段,去【小红书】逛逛吧~"; + +test("extracts Xiaohongshu long and short URLs from full share text", () => { + const longUrl = extractXhsPublishUrl(longShareText); + const shortUrl = extractXhsPublishUrl(shortShareText); + + assert.equal( + new URL(longUrl).pathname, + "/discovery/item/6a5a407d000000000e0363c7", + ); + assert.equal(new URL(longUrl).searchParams.get("source"), "webshare"); + assert.equal(shortUrl, "http://xhslink.cn/o/6UDG4oUB8kR"); +}); + +test("rejects text that does not contain a Xiaohongshu URL", () => { + assert.equal(extractXhsPublishUrl("只有文案,没有链接"), ""); + assert.equal( + extractXhsPublishUrl("https://example.com/not-xhs"), + "", + ); +}); diff --git a/tests/rendered-html.test.mjs b/tests/rendered-html.test.mjs new file mode 100644 index 0000000..3d84a2a --- /dev/null +++ b/tests/rendered-html.test.mjs @@ -0,0 +1,261 @@ +import assert from "node:assert/strict"; +import { access, readFile } from "node:fs/promises"; +import test from "node:test"; + +test("builds the KOC LOOP product shell", async () => { + const [page, adminApp, layout] = await Promise.all([ + readFile(new URL("../app/page.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/admin-app.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/layout.tsx", import.meta.url), "utf8"), + ]); + assert.match(page, /requireChatGPTUser/); + assert.match(page, /isAdminEmail/); + assert.match(adminApp, /KOC LOOP/); + assert.match(adminApp, /内容分发闭环/); + assert.match(adminApp, /分发工作台/); + assert.match(adminApp, /获取KOC领取链接/); + assert.match(layout, /KOC LOOP|内容分发闭环/); + assert.doesNotMatch(adminApp, /codex-preview|Your site is taking shape/); + await access(new URL("../dist/server/index.js", import.meta.url)); + await access(new URL("../dist/client/assets", import.meta.url)); +}); + +test("ships persistence, uploads, metadata, and no starter preview", async () => { + const [adminApp, layout, packageJson, hosting] = await Promise.all([ + readFile(new URL("../app/admin-app.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/layout.tsx", import.meta.url), "utf8"), + readFile(new URL("../package.json", import.meta.url), "utf8"), + readFile(new URL("../.openai/hosting.json", import.meta.url), "utf8"), + ]); + + assert.doesNotMatch(adminApp, /批量回填发布链接/); + assert.match(adminApp, /复制领取链接/); + assert.match(adminApp, /compressScreenshot/); + assert.match(layout, /KOC LOOP|内容分发闭环/); + assert.match(layout, /\/og\.png/); + assert.doesNotMatch(packageJson, /react-loading-skeleton/); + assert.match(hosting, /"d1": "DB"/); + assert.match(hosting, /"r2": "UPLOADS"/); + await access(new URL("../public/og.png", import.meta.url)); +}); + +test("organizes distribution and recovery by task and imports the verified Feishu source", async () => { + const [adminApp, snapshotText, migration, imageMigration] = await Promise.all([ + readFile(new URL("../app/admin-app.tsx", import.meta.url), "utf8"), + readFile(new URL("../lib/feishu-source-snapshot.json", import.meta.url), "utf8"), + readFile(new URL("../drizzle/0001_sloppy_blue_blade.sql", import.meta.url), "utf8"), + readFile(new URL("../drizzle/0003_needy_doctor_strange.sql", import.meta.url), "utf8"), + ]); + const snapshot = JSON.parse(snapshotText); + + assert.match(adminApp, /选择一个分发任务/); + assert.match(adminApp, /选择一个数据回收任务/); + assert.match(adminApp, /读取表格/); + assert.match(adminApp, /当前仅展示/); + assert.equal(snapshot.sheetId, "954953"); + assert.equal(snapshot.rows.length, 61); + assert.equal( + snapshot.rows.reduce((total, row) => total + row.images.length, 0), + 64, + ); + assert.ok(snapshot.rows.every((row) => row.images.length > 0)); + assert.match(migration, /source_sheet_id/); + assert.match(migration, /source_row/); + assert.match(imageMigration, /image_assets/); + assert.match(imageMigration, /claims_task_partner_created_idx/); +}); + +test("issues external task links and supports one-to-one note submissions", async () => { + const [ + adminApp, + actionRoute, + partnerRoute, + uploadRoute, + imageRoute, + imageUploadRoute, + cors, + migration, + accountEnrichment, + partnerUtils, + publishUrlUtils, + creatorScreenshotRoute, + ] = await Promise.all([ + readFile(new URL("../app/admin-app.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/api/action/route.ts", import.meta.url), "utf8"), + readFile(new URL("../app/api/partner/route.ts", import.meta.url), "utf8"), + readFile(new URL("../app/api/partner-upload/route.ts", import.meta.url), "utf8"), + readFile(new URL("../app/api/partner-image/route.ts", import.meta.url), "utf8"), + readFile(new URL("../app/api/content-image-upload/route.ts", import.meta.url), "utf8"), + readFile(new URL("../lib/partner-cors.ts", import.meta.url), "utf8"), + readFile(new URL("../drizzle/0002_wealthy_maelstrom.sql", import.meta.url), "utf8"), + readFile(new URL("../lib/account-enrichment-service.ts", import.meta.url), "utf8"), + readFile(new URL("../lib/partner-utils.ts", import.meta.url), "utf8"), + readFile(new URL("../lib/publish-url.ts", import.meta.url), "utf8"), + readFile(new URL("../app/api/creator-screenshot/route.ts", import.meta.url), "utf8"), + ]); + + assert.match(adminApp, /复制领取链接/); + assert.match(adminApp, /小红书号/); + assert.match(adminApp, /public_account_id/); + assert.doesNotMatch(adminApp, /title=\{account\.platform_uid\}/); + assert.doesNotMatch(adminApp, /平均阅读/); + assert.doesNotMatch(adminApp, /批量回填发布链接/); + assert.doesNotMatch(actionRoute, /submit_links/); + assert.match(partnerRoute, /publish_screenshot_key/); + assert.match(partnerRoute, /creator_screenshot_key/); + assert.match(partnerRoute, /submit_creator_metrics/); + assert.match(partnerRoute, /ocr_status = 'manual'/); + assert.match(partnerRoute, /请填写正确的曝光量和阅读量/); + assert.match(partnerRoute, /笔记与领取凭证不匹配/); + assert.match(partnerRoute, /action === "recover"/); + assert.match(partnerRoute, /extractXhsPublishUrl/); + assert.match(partnerRoute, /小红书长链或短链/); + assert.match(partnerRoute, /没有找到领取记录/); + assert.match(partnerRoute, /publicImageAssets/); + assert.match(partnerRoute, /withPartnerCors/); + assert.match(partnerRoute, /enrichDistributionAccount/); + assert.match(partnerRoute, /getRequestExecutionContext/); + assert.match(partnerRoute, /executionContext\.waitUntil\(enrichment\)/); + assert.match(accountEnrichment, /profile_url = excluded\.profile_url/); + assert.match(accountEnrichment, /resolveXhsAccountProfileFromMcp/); + assert.match(accountEnrichment, /resolveXhsProfileDetailsFromMcp/); + assert.match(accountEnrichment, /isVerifiedXhsProfileUrl/); + assert.match(accountEnrichment, /endsWith\("\.xiaohongshu\.com"\)/); + assert.match(accountEnrichment, /DELETE FROM accounts/); + assert.match(accountEnrichment, /a\.followers/); + assert.match(accountEnrichment, /followers = CASE/); + assert.match(accountEnrichment, /Number\(row\.followers \?\? 0\) === 0/); + assert.match(partnerUtils, /pending-\$\{hashText/); + assert.match(partnerUtils, /profileUrl:\s*""/); + assert.match(publishUrlUtils, /xhslink\.cn/); + assert.doesNotMatch(partnerUtils, /user\/profile\/\$\{platformUid\}/); + assert.match(uploadRoute, /publish-evidence/); + assert.match(uploadRoute, /creator-center/); + assert.match(uploadRoute, /ELSE 'uploaded'/); + assert.doesNotMatch(uploadRoute, /ocrMetric/); + assert.match(uploadRoute, /x-koc-upload-kind/); + assert.match(uploadRoute, /x-koc-distribution/); + assert.match(uploadRoute, /request\.arrayBuffer/); + assert.match(imageRoute, /content-assets\//); + assert.match(imageRoute, /cl\.claim_token/); + assert.match(imageUploadRoute, /isAdminRequest/); + assert.match(cors, /KOC_PORTAL_URL/); + assert.match(cors, /X-KOC-Distribution/); + assert.match(cors, /X-KOC-Upload-Kind/); + assert.match(cors, /Access-Control-Allow-Origin/); + assert.match(adminApp, /hasCreatorMetrics/); + assert.match(adminApp, /待KOC填写数据/); + assert.match(creatorScreenshotRoute, /getUploadBucket/); + assert.match(creatorScreenshotRoute, /Content-Disposition/); + assert.match(creatorScreenshotRoute, /isAdminRequest/); + assert.match(migration, /share_token/); + assert.match(migration, /claim_token/); +}); + +test("supports task collection schedules and latest public metrics", async () => { + const [ + adminApp, + actionRoute, + bootstrapRoute, + collectionService, + worker, + viteConfig, + migration, + accountMigration, + deployConfig, + ] = await Promise.all([ + readFile(new URL("../app/admin-app.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/api/action/route.ts", import.meta.url), "utf8"), + readFile(new URL("../app/api/bootstrap/route.ts", import.meta.url), "utf8"), + readFile(new URL("../lib/collection-service.ts", import.meta.url), "utf8"), + readFile(new URL("../worker/index.ts", import.meta.url), "utf8"), + readFile(new URL("../vite.config.ts", import.meta.url), "utf8"), + readFile(new URL("../drizzle/0004_sharp_the_liberteens.sql", import.meta.url), "utf8"), + readFile(new URL("../drizzle/0005_foamy_sage.sql", import.meta.url), "utf8"), + readFile(new URL("../dist/server/wrangler.json", import.meta.url), "utf8"), + ]); + + for (const label of [ + "点赞", + "收藏", + "评论", + "总互动", + "数据更新时间", + "采集状态", + "发布时间", + ]) { + assert.match(adminApp, new RegExp(label)); + } + assert.match(adminApp, /选择开始日期与采集日/); + assert.match(adminApp, /第1天到第7天/); + assert.match(adminApp, /内容 \/ 发布账号/); + assert.match(adminApp, /recovery-title-link/); + assert.match(adminApp, /打开小红书笔记/); + assert.match(adminApp, /noopener noreferrer/); + assert.match(actionRoute, /save_collection_schedule/); + assert.match(actionRoute, /collect_now/); + assert.match(actionRoute, /backfill_account_profiles/); + assert.match(actionRoute, /set_public_account_ids/); + assert.match(actionRoute, /run_due_collections/); + assert.match(actionRoute, /retry_failed_collections/); + assert.match(actionRoute, /createCollectionRunTasks/); + assert.match(bootstrapRoute, /runDueScheduledCollections/); + assert.match(collectionService, /INSERT OR IGNORE INTO collection_runs/); + assert.match(collectionService, /collectXhsMetricsFromMcp/); + assert.doesNotMatch(collectionService, /hashText/); + assert.match(collectionService, /runScheduledCollections/); + assert.match(collectionService, /runDueScheduledCollections/); + assert.match(collectionService, /retryFailedCollections/); + assert.match(collectionService, /exposure IS NOT NULL AND views IS NOT NULL/); + assert.match(collectionService, /等待第\$\{scheduleDay\}天 10:00自动采集/); + assert.doesNotMatch(collectionService, /latestDueSchedule/); + assert.match(collectionService, /自动追采/); + assert.match(worker, /async scheduled/); + assert.match(worker, /backfillAccountProfiles/); + assert.match(bootstrapRoute, /backfillAccountProfiles/); + assert.match(viteConfig, /"0 2 \* \* \*"/); + assert.match(migration, /latest_likes/); + assert.match(migration, /collection_runs_distribution_date_idx/); + assert.match(accountMigration, /public_account_id/); + assert.match(deployConfig, /"crons":\["0 2 \* \* \*"\]/); +}); + +test("supports anonymous partner delegation without creating a second data flow", async () => { + const [ + adminApp, + partnerRoute, + uploadRoute, + imageRoute, + cors, + schema, + runtimeSchema, + migration, + ] = await Promise.all([ + readFile(new URL("../app/admin-app.tsx", import.meta.url), "utf8"), + readFile(new URL("../app/api/partner/route.ts", import.meta.url), "utf8"), + readFile(new URL("../app/api/partner-upload/route.ts", import.meta.url), "utf8"), + readFile(new URL("../app/api/partner-image/route.ts", import.meta.url), "utf8"), + readFile(new URL("../lib/partner-cors.ts", import.meta.url), "utf8"), + readFile(new URL("../db/schema.ts", import.meta.url), "utf8"), + readFile(new URL("../lib/mvp-db.ts", import.meta.url), "utf8"), + readFile(new URL("../drizzle/0006_moaning_dark_phoenix.sql", import.meta.url), "utf8"), + ]); + + assert.match(schema, /delegationBundles/); + assert.match(schema, /delegationBundleId/); + assert.match(runtimeSchema, /CREATE TABLE IF NOT EXISTS delegation_bundles/); + assert.match(migration, /delegation_bundles/); + assert.match(migration, /delegation_bundle_id/); + assert.match(partnerRoute, /action === "create_delegation"/); + assert.match(partnerRoute, /action === "revoke_delegation"/); + assert.match(partnerRoute, /findAccessibleAssignment/); + assert.match(partnerRoute, /b\.status = 'active'/); + assert.match(partnerRoute, /部分笔记刚刚已被转派/); + assert.match(partnerRoute, /分享链接只能用于查看和回填包内笔记/); + assert.match(partnerRoute, /private, no-store/); + assert.match(uploadRoute, /x-koc-delegation/); + assert.match(uploadRoute, /delegation_bundles/); + assert.match(imageRoute, /delegation_bundles/); + assert.match(cors, /X-KOC-Delegation/); + assert.match(adminApp, /合作社资源 · 不可直联/); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..3a13f90 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..0d91708 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,61 @@ +import vinext from "vinext"; +import { defineConfig } from "vite"; +import hostingConfig from "./.openai/hosting.json"; +import { sites } from "./build/sites-vite-plugin"; + +const SITE_CREATOR_PLACEHOLDER_DATABASE_ID = + "00000000-0000-4000-8000-000000000000"; + +const { d1, r2 } = hostingConfig; + +// macOS Seatbelt blocks FSEvents, so Codex previews need polling for HMR. +const isCodexSeatbeltSandbox = process.env.CODEX_SANDBOX === "seatbelt"; + +const localBindingConfig = { + main: "./worker/index.ts", + compatibility_flags: ["nodejs_compat"], + // Cloudflare cron uses UTC. 02:00 UTC is 10:00 in Asia/Shanghai. + triggers: { crons: ["0 2 * * *"] }, + d1_databases: d1 + ? [ + { + binding: d1, + database_name: "site-creator-d1", + database_id: SITE_CREATOR_PLACEHOLDER_DATABASE_ID, + }, + ] + : [], + r2_buckets: r2 + ? [ + { + binding: r2, + bucket_name: "site-creator-r2", + }, + ] + : [], +}; + +export default defineConfig(async () => { + // Keep Wrangler and Miniflare state project-local. These are non-secret tool + // settings; application environment belongs in ignored `.env*` files. + process.env.WRANGLER_WRITE_LOGS ??= "false"; + process.env.WRANGLER_LOG_PATH ??= ".wrangler/logs"; + process.env.MINIFLARE_REGISTRY_PATH ??= ".wrangler/registry"; + + // Wrangler snapshots its log path while the Cloudflare plugin is imported. + const { cloudflare } = await import("@cloudflare/vite-plugin"); + + return { + server: isCodexSeatbeltSandbox + ? { watch: { useFsEvents: false, usePolling: true } } + : undefined, + plugins: [ + vinext(), + sites(), + cloudflare({ + viteEnvironment: { name: "rsc", childEnvironments: ["ssr"] }, + config: localBindingConfig, + }), + ], + }; +}); diff --git a/worker/index.ts b/worker/index.ts new file mode 100644 index 0000000..389c88a --- /dev/null +++ b/worker/index.ts @@ -0,0 +1,85 @@ +/** Cloudflare Worker entry point for the vinext-starter template. */ +import { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from "vinext/server/image-optimization"; +import handler from "vinext/server/app-router-entry"; +import { backfillAccountProfiles } from "../lib/account-enrichment-service"; +import { ensureSchema } from "../lib/mvp-db"; +import { runScheduledCollections } from "../lib/collection-service"; +import { + resolveCollectionMcpConfig, + type CollectionMcpBindings, +} from "../lib/mcp-collection-client"; +import type { FeishuBindings } from "../lib/feishu-client"; + +interface Env extends CollectionMcpBindings, FeishuBindings { + ASSETS: Fetcher; + DB: D1Database; + UPLOADS: R2Bucket; + IMAGES: { + input(stream: ReadableStream): { + transform(options: Record): { + output(options: { format: string; quality: number }): Promise<{ response(): Response }>; + }; + }; + }; +} + +interface ExecutionContext { + waitUntil(promise: Promise): void; + passThroughOnException(): void; +} + +interface ScheduledController { + scheduledTime: number; + cron: string; + noRetry(): void; +} + +// Image security config. SVG sources with .svg extension auto-skip the +// optimization endpoint on the client side (served directly, no proxy). +// To route SVGs through the optimizer (with security headers), set +// dangerouslyAllowSVG: true in next.config.js and uncomment below: +// const imageConfig: ImageConfig = { dangerouslyAllowSVG: true }; + +const worker = { + async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { + const url = new URL(request.url); + + if (url.pathname === "/_vinext/image") { + const allowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]; + return handleImageOptimization(request, { + fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))), + transformImage: async (body, { width, format, quality }) => { + const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality }); + return result.response(); + }, + }, allowedWidths); + } + + return handler.fetch(request, env, ctx); + }, + async scheduled( + controller: ScheduledController, + env: Env, + ctx: ExecutionContext, + ) { + ctx.waitUntil( + (async () => { + await ensureSchema(env.DB); + const mcpConfig = resolveCollectionMcpConfig(env); + await runScheduledCollections( + env.DB, + controller.scheduledTime, + mcpConfig, + ); + const accountBackfill = await backfillAccountProfiles( + env.DB, + mcpConfig, + 10, + ); + console.info("KOC scheduled account backfill completed", accountBackfill); + })(), + ); + }, +}; + +export default worker;