From 28d0c9ad3dc5e79a7d7df3baf87ab1b14a139e42 Mon Sep 17 00:00:00 2001 From: imbytecat Date: Wed, 21 Jan 2026 15:42:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=8C=85=E5=8F=8A=20UUID=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=EF=BC=8C=E5=88=9D=E5=A7=8B=E5=8C=96=E7=B1=BB=E5=9E=8B=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E4=B8=8E=E5=AD=97=E6=AE=B5=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 typecheck 脚本改为使用 tsc --noEmit,并添加 @furtherverse/tsconfig 工作区依赖。 - 添加新的本地包 @furtherverse/database 并更新 uuid 依赖至 13.0.0 版本,同时修复相关依赖引用。 - 添加 uuid 依赖以支持生成唯一标识符功能 - 初始化数据库包的配置,设置模块导入导出路径并配置类型检查与格式化脚本。 - 导出 todo 模式定义文件中的所有内容 - 添加待办事项表结构,包含自动生成字段、标题和完成状态字段。 - 添加用于生成主键、创建和更新时间戳字段的实用工具函数,并提供自动生成字段及其键的映射。 - 导出字段工具模块中的所有内容 - 添加 SQLite 数据库连接初始化功能 - 添加数据库包的 TypeScript 配置并继承基础配置文件 --- apps/server/package.json | 7 ++- bun.lock | 19 +++++- package.json | 1 + packages/database/package.json | 24 ++++++++ .../database/src/postgres/schema/index.ts | 1 + packages/database/src/postgres/schema/todo.ts | 8 +++ packages/database/src/postgres/utils/field.ts | 58 +++++++++++++++++++ packages/database/src/postgres/utils/index.ts | 1 + packages/database/src/sqlite/index.ts | 0 packages/database/tsconfig.json | 3 + 10 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 packages/database/package.json create mode 100644 packages/database/src/postgres/schema/index.ts create mode 100644 packages/database/src/postgres/schema/todo.ts create mode 100644 packages/database/src/postgres/utils/field.ts create mode 100644 packages/database/src/postgres/utils/index.ts create mode 100644 packages/database/src/sqlite/index.ts create mode 100644 packages/database/tsconfig.json diff --git a/apps/server/package.json b/apps/server/package.json index 4b2678f..db9e59d 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -1,18 +1,18 @@ { "name": "@furtherverse/server", - "private": true, "version": "1.0.0", + "private": true, "type": "module", "scripts": { - "compile": "bun build.ts", "build": "vite build", + "compile": "bun build.ts", "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", "db:push": "drizzle-kit push", "db:studio": "drizzle-kit studio", "dev": "vite dev", "fix": "biome check --write", - "typecheck": "tsc -b" + "typecheck": "tsc --noEmit" }, "dependencies": { "@orpc/client": "catalog:", @@ -37,6 +37,7 @@ "@biomejs/biome": "catalog:", "@effect/platform": "catalog:", "@effect/schema": "catalog:", + "@furtherverse/tsconfig": "workspace:*", "@tailwindcss/vite": "catalog:", "@tanstack/devtools-vite": "catalog:", "@tanstack/react-devtools": "catalog:", diff --git a/bun.lock b/bun.lock index ebe9e4b..010d935 100644 --- a/bun.lock +++ b/bun.lock @@ -43,6 +43,7 @@ "@biomejs/biome": "catalog:", "@effect/platform": "catalog:", "@effect/schema": "catalog:", + "@furtherverse/tsconfig": "workspace:*", "@tailwindcss/vite": "catalog:", "@tanstack/devtools-vite": "catalog:", "@tanstack/react-devtools": "catalog:", @@ -61,6 +62,17 @@ "vite-tsconfig-paths": "catalog:", }, }, + "packages/database": { + "name": "@furtherverse/database", + "version": "0.0.0", + "dependencies": { + "drizzle-orm": "catalog:", + "uuid": "catalog:", + }, + "devDependencies": { + "@furtherverse/tsconfig": "workspace:*", + }, + }, "packages/tsconfig": { "name": "@furtherverse/tsconfig", "version": "0.0.0", @@ -104,6 +116,7 @@ "tailwindcss": "^4.1.18", "turbo": "^2.7.5", "typescript": "^5.9.3", + "uuid": "^13.0.0", "vite": "^8.0.0-beta.8", "vite-tsconfig-paths": "^6.0.4", "zod": "^4.3.5", @@ -259,6 +272,8 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], + "@furtherverse/database": ["@furtherverse/database@workspace:packages/database"], + "@furtherverse/desktop": ["@furtherverse/desktop@workspace:apps/desktop"], "@furtherverse/server": ["@furtherverse/server@workspace:apps/server"], @@ -1031,7 +1046,7 @@ "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], - "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "uuid": ["uuid@13.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w=="], "vite": ["vite@8.0.0-beta.8", "", { "dependencies": { "@oxc-project/runtime": "0.108.0", "fdir": "^6.5.0", "lightningcss": "^1.30.2", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rolldown": "1.0.0-beta.60", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "esbuild": "^0.27.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" }, "optionalPeers": ["@types/node", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-PetN5BNs5dj6NSu1pDrbr0AtbH9KjPhQ/dLePvhLYsYgnZdj6+ihGjtA4DYcR9bASOzOmxN1NqEJEJ4JBUIvpA=="], @@ -1057,6 +1072,8 @@ "zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], + "@azure/msal-node/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], diff --git a/package.json b/package.json index fa17c1f..f9b3064 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "tailwindcss": "^4.1.18", "turbo": "^2.7.5", "typescript": "^5.9.3", + "uuid": "^13.0.0", "vite": "^8.0.0-beta.8", "vite-tsconfig-paths": "^6.0.4", "zod": "^4.3.5" diff --git a/packages/database/package.json b/packages/database/package.json new file mode 100644 index 0000000..b1cba4e --- /dev/null +++ b/packages/database/package.json @@ -0,0 +1,24 @@ +{ + "name": "@furtherverse/database", + "version": "1.0.0", + "private": true, + "type": "module", + "imports": { + "#*": "./src/*" + }, + "exports": { + ".": "./src/index.ts", + "./*": "./src/*.ts" + }, + "scripts": { + "fix": "biome check --write", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "drizzle-orm": "catalog:", + "uuid": "catalog:" + }, + "devDependencies": { + "@furtherverse/tsconfig": "workspace:*" + } +} diff --git a/packages/database/src/postgres/schema/index.ts b/packages/database/src/postgres/schema/index.ts new file mode 100644 index 0000000..a1cad6c --- /dev/null +++ b/packages/database/src/postgres/schema/index.ts @@ -0,0 +1 @@ +export * from './todo' diff --git a/packages/database/src/postgres/schema/todo.ts b/packages/database/src/postgres/schema/todo.ts new file mode 100644 index 0000000..bbf16af --- /dev/null +++ b/packages/database/src/postgres/schema/todo.ts @@ -0,0 +1,8 @@ +import { boolean, pgTable, text } from 'drizzle-orm/pg-core' +import { generatedFields } from '../utils' + +export const todoTable = pgTable('todo', { + ...generatedFields, + title: text('title').notNull(), + completed: boolean('completed').notNull().default(false), +}) diff --git a/packages/database/src/postgres/utils/field.ts b/packages/database/src/postgres/utils/field.ts new file mode 100644 index 0000000..4ba0ef9 --- /dev/null +++ b/packages/database/src/postgres/utils/field.ts @@ -0,0 +1,58 @@ +import { sql } from 'drizzle-orm' +import { timestamp, uuid } from 'drizzle-orm/pg-core' +import { v7 as uuidv7 } from 'uuid' + +// id + +export const id = (name: string) => uuid(name) +export const pk = (name: string, strategy?: 'native' | 'extension') => { + switch (strategy) { + // PG 18+ + case 'native': + return id(name).primaryKey().default(sql`uuidv7()`) + + // PG 13+ with extension + case 'extension': + return id(name).primaryKey().default(sql`uuid_generate_v7()`) + + // Any PG version + default: + return id(name) + .primaryKey() + .$defaultFn(() => uuidv7()) + } +} + +// timestamp + +export const createdAt = (name = 'created_at') => + timestamp(name, { withTimezone: true }).notNull().defaultNow() + +export const updatedAt = (name = 'updated_at') => + timestamp(name, { withTimezone: true }) + .notNull() + .defaultNow() + .$onUpdateFn(() => new Date()) + +// generated fields + +export const generatedFields = { + id: pk('id'), + createdAt: createdAt('created_at'), + updatedAt: updatedAt('updated_at'), +} + +// Helper to create omit keys from generatedFields +const createGeneratedFieldKeys = >( + fields: T, +): Record => { + return Object.keys(fields).reduce( + (acc, key) => { + acc[key as keyof T] = true + return acc + }, + {} as Record, + ) +} + +export const generatedFieldKeys = createGeneratedFieldKeys(generatedFields) diff --git a/packages/database/src/postgres/utils/index.ts b/packages/database/src/postgres/utils/index.ts new file mode 100644 index 0000000..15f2189 --- /dev/null +++ b/packages/database/src/postgres/utils/index.ts @@ -0,0 +1 @@ +export * from './field' diff --git a/packages/database/src/sqlite/index.ts b/packages/database/src/sqlite/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json new file mode 100644 index 0000000..086fbdf --- /dev/null +++ b/packages/database/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@furtherverse/tsconfig/base.json" +}