2.4 KiB
2.4 KiB
AGENTS.md — @app/trpc
职责
API 层:tRPC 路由 + service 业务逻辑。service 可不依赖 tRPC 独立调用(脚本/测试);DB 读写经 @app/dao,不直接写 SQL。
脚手架基线域:user、auth。新业务域在下游仓库按同样模式追加。
结构
src/
context.ts # initTRPC 单例 + TrpcContext
router/
index.ts # appRouter 组装(权威定义)
user.router.ts # user 路由(与 index.ts 内定义重复,改路由时两边同步或收敛到一处)
auth.router.ts # auth 路由
services/
user.service.ts # user 业务(调 userDao)
auth.service.ts # 会话 / 密码
password.ts
server.ts # 独立 HTTP 服务(PORT,默认 4000)
index.ts # 对外:appRouter、类型、userService / authService
router.ts # 兼容旧入口的再导出
构建:vite build(emptyOutDir: false)→ tsc -p tsconfig.dts.json 产出 .d.ts。勿开 dts 的 incremental(vite 会先清产物,缓存会导致 tsc 跳过 emit);勿改回 vite-plugin-dts。
请求流
web /api/trpc ──► appRouter ──► service ──► @app/dao ──► @app/db
也可 yarn dev:api 跑 server.ts(独立端口);web SSR 内嵌时通常不用。
修改指南
- 改入参:先改
@app/types的 Zod schema,再挂到t.procedure.input(...)。 - 加 procedure:路由只做 input 映射 + 调 service;业务在
services/*.service.ts;SQL 在@app/dao。 - 加领域:新建
services/x.service.ts+router/x.router.ts(必要时在@app/dao加xDao),挂到appRouter,并在index.ts导出。 - 导出给前端的类型用
RouterInputs/RouterOutputs(来自router/index.ts)。
约束
exactOptionalPropertyTypes:service 的 update 入参写成name?: string | undefined。noUncheckedIndexedAccess:判空逻辑在 DAO 内处理(参考userDao.create)。- 不要在 router/service 里写 SQL;不在 service 里依赖 HTTP/tRPC context(除非鉴权明确需要)。
router.ts仅兼容旧 import,新代码从index.ts/./router/index.js引入。
命令
yarn workspace @app/trpc typecheck
yarn workspace @app/trpc lint
yarn workspace @app/trpc build
yarn workspace @app/trpc dev # tsx watch src/server.ts