文件即路由
apiDir 下的每个文件就是一个路由。第一层目录是 HTTP 方法,文件路径就是 URL;不需要在一个 中央文件里登记路由。
src/api/
index.ts 由 align 生成
get/
index.ts 由 align 生成
health.ts GET /health
user/
[id].ts GET /user/:id
post/
index.ts 由 align 生成
user/
login.ts POST /user/login[id]表示一个路由参数,运行时写作:id。- 处理函数文件必须
export default。 types/handler.d.ts目前为get、post、patch、delete四种方法提供类型投影;运行时本身 只是展开方法目录的键,其他方法目录同样会被注册。
生成的汇总导出文件
每个方法目录有一个 index.*,API 根目录再有一个聚合所有方法:
// src/api/get/index.ts
// @generated by tealina — do not edit.
// Rebuild it with: tealina align
export default {
health: import('./health.js'),
'user/:id': import('./user/[id].js'),
}// src/api/index.ts
export default {
get: import('./get/index.js'),
post: import('./post/index.js'),
}键是逻辑路径:不带前导斜杠。@tealina/server 在注册路由时会补上 /。
这些 index.* 是生成物,永远不要手改。文件开头的 // @generated by tealina — do not edit. 就是 标记。新增、重命名或删除处理函数后,运行一次 align。
命令
create
tealina create post/user # 写入 src/api/post/user.ts
tealina create user/login # 未写方法时默认 post
tealina create post/user/:id # 写成 [id].tscreate 同时更新本次涉及的汇总导出文件。路由段写成 :id 或 [id] 都可以,落盘时统一为 [id]。
delete
tealina delete post/user/login
tealina delete post/user/login --with-test删除处理函数并重写汇总导出文件。--with-test 会一并删除生成的集成测试文件。
align
根据磁盘上实际存在的文件,重建所有生成的 index.* 和兜底的 types/api.d.ts。手工移动或重命名 文件后,这是必须运行的一条命令。
tealina align
tealina align --check # 只比较,不写入;有差异时退出码 1
tealina align --check --json # 标准输出写一个 JSON 对象--json 的形状:
{
"ok": false,
"changed": [{ "action": "update", "file": "src/api/get/index.ts" }]
}--check 适合放进 CI;它和正常执行走同一套生成逻辑,只是在写入前停下。
排除文件
exclude 中的模式相对 apiDir,按 POSIX 路径规则匹配。align 本身已经跳过 index 文件和点文件, 这个选项用于其他希望与路由放在一起、但不成为端点的文件:
export default defineConfig({
apiDir: 'src/api',
apiBaseURL: '/api/v1',
typesDir: 'types',
exclude: ['_shared/**', '**/*.test.ts'],
})URL 前缀
apiBaseURL 是路由对外回答的前缀,CLI 不会从目录名推断它。在脚手架里它来自 version.js 的 API_BASE_URL,并被至少四处读取:
tealina.config.ts,交给gdoc;src/mount.ts,决定路由挂载位置;src/doc.ts,决定文档 JSON 文件的 URL;- 前端
api/client.ts,决定请求 URL 和 Vite 代理。
改前缀时改 version.js,不要分别改这四处。
相关命令的退出码
align 与 gdoc 在成功时退出 0;--check 发现生成物过期时退出 1,且不写文件。错误信息走标准错误, --json 的对象走标准输出,可以安全地接给其他工具。