From 7f4cfc89738100848803e9f5b0af1296bcd6f660 Mon Sep 17 00:00:00 2001 From: imbytecat Date: Sat, 25 Apr 2026 15:15:20 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E8=B7=A8=E8=BE=B9=E7=95=8C?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=94=B9=E7=94=A8=20Node=20#=20subpath=20imp?= =?UTF-8?q?orts=EF=BC=88package.json=20+=20drizzle=20SQL=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 业务代码沿用 @/* (shadcn 等生态约定);仅"跳出 src/"的真实跨边界场景采用 Node 标准 #name: - #package → ./package.json:替换 @/../package.json (2 处) 这种用 alias 跳出根目录的 hack - #drizzle/*.sql → ./drizzle/*.sql:让 codegen 输出的 migrations.gen.ts 不再走 ../../../ 效果: - tsconfig.paths 与 vite.resolve.tsconfigPaths 维持,业务代码 0 改动 - 配置仅新增 package.json#imports 4 行 - Bun runtime / Vite 8 / TS bundler / 编译产物均原生支持 端到端验证: - 编译二进制:CREATE TABLE 和 'fullstack-starter' 内嵌 ✓ - ./server migrate:应用嵌入式迁移成功 ✓ - ./server 运行:/health、/api/spec.json (title/version)、RPC create+list、OpenAPI create、Scalar /api/docs 全部 OK ✓ - bun run dev:Vite SSR fullstack-starter 注入 ✓ - fix/typecheck/test/build/compile 全绿 --- embed-migrations.ts | 3 +-- package.json | 4 ++++ src/routes/__root.tsx | 2 +- src/routes/api/$.ts | 2 +- src/server/db/migrations.gen.ts | 2 +- 5 files changed, 8 insertions(+), 5 deletions(-) diff --git a/embed-migrations.ts b/embed-migrations.ts index 2d2cc2c..af91f06 100644 --- a/embed-migrations.ts +++ b/embed-migrations.ts @@ -4,7 +4,6 @@ import { z } from 'zod' const JOURNAL = './drizzle/meta/_journal.json' const OUTPUT = './src/server/db/migrations.gen.ts' -const SQL_RELATIVE_FROM_OUTPUT = '../../../drizzle' const journalEntrySchema = z.object({ idx: z.number().int().nonnegative(), @@ -28,7 +27,7 @@ const main = async () => { const entries = await readJournalEntries() const imports = entries - .map((e) => `import sql_${e.idx} from '${SQL_RELATIVE_FROM_OUTPUT}/${e.tag}.sql' with { type: 'text' }`) + .map((e) => `import sql_${e.idx} from '#drizzle/${e.tag}.sql' with { type: 'text' }`) .join('\n') const arrayBody = entries.length diff --git a/package.json b/package.json index 70d3dcd..0b3df9a 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,10 @@ "version": "1.0.0", "private": true, "type": "module", + "imports": { + "#package": "./package.json", + "#drizzle/*.sql": "./drizzle/*.sql" + }, "scripts": { "build": "bunx --bun vite build", "cli": "bun bin.ts", diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index a26a840..500251e 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -4,7 +4,7 @@ import { ReactQueryDevtoolsPanel } from '@tanstack/react-query-devtools' import { createRootRouteWithContext, HeadContent, Scripts } from '@tanstack/react-router' import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools' import type { ReactNode } from 'react' -import { name } from '@/../package.json' +import { name } from '#package' import { ErrorComponent } from '@/components/Error' import { NotFoundComponent } from '@/components/NotFound' import appCss from '@/styles.css?url' diff --git a/src/routes/api/$.ts b/src/routes/api/$.ts index 5246b3d..a81858b 100644 --- a/src/routes/api/$.ts +++ b/src/routes/api/$.ts @@ -3,7 +3,7 @@ import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins' import { onError } from '@orpc/server' import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { createFileRoute } from '@tanstack/react-router' -import { name, version } from '@/../package.json' +import { name, version } from '#package' import { handleValidationError, logError } from '@/server/api/interceptors' import { router } from '@/server/api/routers' diff --git a/src/server/db/migrations.gen.ts b/src/server/db/migrations.gen.ts index da9d10a..4df2dfd 100644 --- a/src/server/db/migrations.gen.ts +++ b/src/server/db/migrations.gen.ts @@ -1,5 +1,5 @@ // AUTO-GENERATED by `bun run db:embed`. Do not edit. -import sql_0 from '../../../drizzle/0000_loving_thunderbird.sql' with { type: 'text' } +import sql_0 from '#drizzle/0000_loving_thunderbird.sql' with { type: 'text' } export type EmbeddedMigration = { tag: string; sql: string; when: number; breakpoints: boolean }