chore(deno): migrate toolchain from Node 24 + pnpm to Deno 2.9.7 + TypeScript 7.0.2 (W1.5)

- root deno.json workspace (nodeModulesDir auto), npm versions registered once in imports, deno.lock;
  remove pnpm-lock/pnpm-workspace/root package.json; members keep minimal package.json (name/type/exports)
- tasks: dev, typecheck (tsc 7.0.2 per member + deno check), lint/fmt (biome, useImportExtensions),
  test (vitest via deno), check:tokens, build (web + deno compile), ci, db:migrate/reset, gen:types
- tsconfig base moved to config/ (no root tsconfig.json); deno types -> types/deno.d.ts; web drops baseUrl
- server: Deno.serve entry with graceful shutdown, --role migrate|preflight|probe, WEB_ROOT static SPA hosting;
  drop @hono/node-server, tsx, esbuild build.mjs
- logger: redact child() bindings and serialize err by message/stack; sync stdout destination; tests
- relative imports get explicit extensions (sites/mp-sync paths left for follow-up)
- crash-recovery tests spawn `deno run -A`; tasks tests use unique per-file schemas
- single-container Dockerfile + entrypoint (migrate -> preflight -> api+worker watchdog), docker-compose.yml
- docs: README, runbook, ADR-001 superseded, plan §1 validation row

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
rootandClaude Fable 5.1 committed 2026-09-27 18:53:06 +08:00
1 parent d9f2af2f3c
commit 304feea141
226 files changed
+6601 -8620

No files matched your search

+2 -2
View File
@@ -1,7 +1,7 @@
import { AlertDialog as AlertDialogPrimitive } from "radix-ui";
import type * as React from "react";
import { Button } from "~/components/ui/button";
import { cn } from "~/lib/utils";
import { Button } from "~/components/ui/button.tsx";
import { cn } from "~/lib/utils.ts";
function AlertDialog({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {
return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />;
+1 -1
View File
@@ -3,7 +3,7 @@
import { Avatar as AvatarPrimitive } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Avatar({
className,
+1 -1
View File
@@ -2,7 +2,7 @@ import { cva, type VariantProps } from "class-variance-authority";
import { Slot } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
const badgeVariants = cva(
"inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
+1 -1
View File
@@ -2,7 +2,7 @@ import { ChevronRight, MoreHorizontal } from "lucide-react";
import { Slot } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Breadcrumb({ ...props }: React.ComponentProps<"nav">) {
return <nav aria-label="breadcrumb" data-slot="breadcrumb" {...props} />;
+1 -1
View File
@@ -2,7 +2,7 @@ import { cva, type VariantProps } from "class-variance-authority";
import { Slot } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
const buttonVariants = cva(
// 全站只有这一套按钮(与动漫站同一思路):形状一律胶囊 / 正圆,颜色与材质只由 variant 决定,
+1 -1
View File
@@ -2,7 +2,7 @@ import { zhCN } from "date-fns/locale";
import { ChevronLeft, ChevronRight } from "lucide-react";
import { DayPicker, type DayPickerProps } from "react-day-picker";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
// 日历(react-day-picker v10)的玻璃族皮肤:全部走语义 token + 玻璃 hover
// 语言(中性灰纱、选中 primary 药丸 + 顶部内高光、今日描边)。键盘导航
+1 -1
View File
@@ -1,6 +1,6 @@
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Card({ className, ...props }: React.ComponentProps<"div">) {
return (
+2 -2
View File
@@ -1,8 +1,8 @@
import { XIcon } from "lucide-react";
import { Dialog as DialogPrimitive } from "radix-ui";
import type * as React from "react";
import { Button } from "~/components/ui/button";
import { cn } from "~/lib/utils";
import { Button } from "~/components/ui/button.tsx";
import { cn } from "~/lib/utils.ts";
function Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {
return <DialogPrimitive.Root data-slot="dialog" {...props} />;
+1 -1
View File
@@ -1,6 +1,6 @@
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
return (
+1 -1
View File
@@ -3,7 +3,7 @@
import { Label as LabelPrimitive } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {
return (
+1 -1
View File
@@ -1,5 +1,5 @@
import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
const PAGE_SIZE_OPTIONS = [10, 15, 20, 50, 100];
+1 -1
View File
@@ -1,7 +1,7 @@
import { Popover as PopoverPrimitive } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Popover({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {
return <PopoverPrimitive.Root data-slot="popover" {...props} />;
+1 -1
View File
@@ -2,7 +2,7 @@ import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react";
import { Select as SelectPrimitive } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Select({ ...props }: React.ComponentProps<typeof SelectPrimitive.Root>) {
return <SelectPrimitive.Root data-slot="select" {...props} />;
+1 -1
View File
@@ -1,7 +1,7 @@
import { Separator as SeparatorPrimitive } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Separator({
className,
+1 -1
View File
@@ -2,7 +2,7 @@ import { XIcon } from "lucide-react";
import { Dialog as SheetPrimitive } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
return <SheetPrimitive.Root data-slot="sheet" {...props} />;
+1 -1
View File
@@ -1,7 +1,7 @@
import { Slider as SliderPrimitive } from "radix-ui";
import * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Slider({
className,
+1 -1
View File
@@ -1,7 +1,7 @@
import { Switch as SwitchPrimitive } from "radix-ui";
import type * as React from "react";
import { cn } from "~/lib/utils";
import { cn } from "~/lib/utils.ts";
function Switch({ className, ...props }: React.ComponentProps<typeof SwitchPrimitive.Root>) {
return (