7f4cfc8973
业务代码沿用 @/* (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 <title>fullstack-starter</title> 注入 ✓ - fix/typecheck/test/build/compile 全绿
52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
import { existsSync } from 'node:fs'
|
|
import { readFile, writeFile } from 'node:fs/promises'
|
|
import { z } from 'zod'
|
|
|
|
const JOURNAL = './drizzle/meta/_journal.json'
|
|
const OUTPUT = './src/server/db/migrations.gen.ts'
|
|
|
|
const journalEntrySchema = z.object({
|
|
idx: z.number().int().nonnegative(),
|
|
tag: z.string().regex(/^\d{4}_[a-z0-9_]+$/),
|
|
when: z.number().int().nonnegative(),
|
|
breakpoints: z.boolean(),
|
|
})
|
|
const journalSchema = z.object({ entries: z.array(journalEntrySchema).default([]) })
|
|
|
|
type JournalEntry = z.infer<typeof journalEntrySchema>
|
|
|
|
const readJournalEntries = async (): Promise<JournalEntry[]> => {
|
|
if (!existsSync(JOURNAL)) {
|
|
return []
|
|
}
|
|
const raw: unknown = JSON.parse(await readFile(JOURNAL, 'utf-8'))
|
|
return journalSchema.parse(raw).entries.sort((a, b) => a.idx - b.idx)
|
|
}
|
|
|
|
const main = async () => {
|
|
const entries = await readJournalEntries()
|
|
|
|
const imports = entries
|
|
.map((e) => `import sql_${e.idx} from '#drizzle/${e.tag}.sql' with { type: 'text' }`)
|
|
.join('\n')
|
|
|
|
const arrayBody = entries.length
|
|
? `[\n${entries.map((e) => ` { tag: '${e.tag}', sql: sql_${e.idx}, when: ${e.when}, breakpoints: ${e.breakpoints} },`).join('\n')}\n]`
|
|
: '[]'
|
|
|
|
const out = `// AUTO-GENERATED by \`bun run db:embed\`. Do not edit.
|
|
${imports ? `${imports}\n` : ''}
|
|
export type EmbeddedMigration = { tag: string; sql: string; when: number; breakpoints: boolean }
|
|
|
|
export const embeddedMigrations: readonly EmbeddedMigration[] = ${arrayBody}
|
|
`
|
|
|
|
await writeFile(OUTPUT, out)
|
|
console.log(`✓ ${OUTPUT} (${entries.length} migration${entries.length === 1 ? '' : 's'})`)
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error('❌', err instanceof Error ? err.message : err)
|
|
process.exit(1)
|
|
})
|