开发者生态
morning
来自同一个真实来源的验证、文档、测试和数据库模式
2026-06-11
1 阅读
justhamade
Triad One TypeScript 定义。验证、OpenAPI、AsyncAPI、BDD 测试、Gherkin 和数据库模式 — 全部由相同的事实来源生成。 Triad 是一个 TypeScript 优先的 API 框架,其理念是 API 的规范、实现、验证和测试永远不应该分离,因为它们是同一件事。使用 Triad 的声明式 DSL 编写一次 TypeScript,您将获得: 边缘运行时验证(解析 + 拒绝结构化错误) 从相同模式派生的静态类型 ( t.infer ) HTTP 端点的 OpenAPI 3.1 文档 WebSocket 通道的 AsyncAPI 3.0 文档 作为测试运行的可执行 BDD 场景 ( triad test ) 从模式约束派生的自动对抗性测试 ( scene.auto() )为非技术利益相关者生成的 Gherkin .feature 文件 用于 React Query、Solid Query、Vue Query、Svelte Query 的类型化前端挂钩(triad frontend generated) 通过方言中性的 Drizzle 桥实现数据库模式(triad dbgenerate) 无代码生成往返。无需手动维护 OpenAPI YAML。没有重复的 Zod + OpenAPI + 测试夹具架构不同步。为人类和 AI Triad 打造的北极星是 AI 编码助手应该能够通过阅读一个地方来理解整个 API。当模式、处理程序、响应、通道有效负载、测试和文档都存在于相同的类型化定义中时,LLM(或新工程师)不必将 Zod 文件、OpenAPI YAML、单独的测试装置和 3 个过时提交的 README 中的上下文拼接在一起。真理只有一个来源,而其他所有工件都是它的确定性投影。这就是人类保持生产力的原因,也是让人工智能无需猜测就能推理您的 API 的原因。开始使用 Claude Code 此存储库兼作 Claude Code 市场,因此使 TriadJS 后端正常工作的最快途径是让 Claude 搭建脚手架。 1. 添加 TriadJS 市场并安装插件(在任何 Claude Code 会话中一次): /plugin market add justhamade/triad /plugin install triadjs@triadjs 这将安装 10 个技能(模式 DSL、端点、通道、带有权威断言短语表的 BDD 行为、测试、适配器、Drizzle、CLI、DI)和 8 个斜线命令( /triadjs:new 、 /triadjs:model 、 /triadjs:endpoint 、 /triadjs:channel 、 /triadjs:scenario 、 /triadjs:test 、 /triadjs:docs 、 /triadjs:validate )。 2. 搭建你的第一个项目: /triadjs:new 一个包含宠物、领养和聊天室频道的 petstore API Claude 将创建完整的项目布局 — package.json 、 triad.config.ts 、模式、具有行为的端点、Fastify 服务器和测试设置 — 然后运行 triad 测试以确认每个场景都通过。运行 npm run dev ,Swagger UI 立即在 http://localhost:3000/api-docs 上线,实时 OpenAPI 规范在 /api-docs/openapi.json 。无需额外步骤。 3. 迭代: /triadjs:endpoint 为 pets 添加软删除端点 /triadjs:scenario 覆盖 getPet 上的 404 情况 /triadjs:test /triadjs:docs 每个命令仅加载所需的技能,编写与解析器期望的短语表相匹配的惯用 TriadJS 代码,并验证其自己的输出。有关完整的技能和命令目录,请参阅plugin/README.md。不使用克劳德代码吗?跳至下面的“Taste of it”,了解简单的 TypeScript 演练或完整的快速入门。尝尝 import { t , endpoint , scene , createRouter } from '@triadjs/core' ;常量宠物 = t 。模型 ( 'Pet' , { id : t . string ( ) . format ( 'uuid' ) .identity ( ) , name : t . string ( ) . minLength ( 1 ) . example ( 'Buddy' ) , 物种 : t . enum ( 'dog' , 'cat' , 'bird' , 'fish' ) , 年龄 : t .int32(). 最小值(0). const CreatePet = 宠物 . pick('姓名','物种','年龄').命名('创建宠物'); const createPet = endpoint ( { method : 'POST' , path : '/pets' , Summary : '创建宠物' , body : CreatePet ,response : { 201 : Pet , 400 : ApiError } , handler : async ( ctx ) => { const pet = wait ctx . services . petRepo . create ( ctx . body ) ; return ctx . respond [ 201 ] ( pet ) } , 行为 : [ 场景 ('使用有效输入创建宠物') .when ('POST /pets', { body : { name : 'Rex',species: 'dog',age: 3 } }) . 'response body matches { name: "Rex",species: "dog" }' ) , // 一行 — 框架根据您上面已经声明的模式约束生成约 20 个边界/对抗 // 测试 ... 场景 . const router = createRouter({ 标题: 'Petstore', 版本: '1.0.0' }) ;路由器。添加(创建宠物);从这个单一文件: triad test 运行您手写的场景,并且自动生成的边界测试 triad fuzz 为每个端点生成对抗性测试,无需触及任何文件 triad docs 发出 openapi.yaml triad gherkin 发出 features/pets.feature triad 前端生成发出类型化 React/Solid/Vue/Svelte 查询钩子 ctx.body 已完全类型化 — { name: string;物种:“狗”| '猫' | ...