@devfellowship/ux-paths-spec
DFL UX 路径 数据合同, 单独: v1 JSON Schema, TypeScript
生成类型,a validate() 与 零运行时间依赖关系
财务报告和审定财务报表 零网络 I/ 欧。 。 。 .
pnpm add @devfellowship/ux-paths-spec
import { validate, assertValid, SCHEMA_V1 } from "@devfellowship/ux-paths-spec";
import type { UxPathsDoc } from "@devfellowship/ux-paths-spec";
const result = validate(JSON.parse(text));
if (!result.valid) {
for (const error of result.errors) console.error(error.formatted);
// screens[0].id: must be string (expected type: string)
process.exit(1);
}
result.doc.screens; // typed as UxPathsDoc
// Or the throwing form, which narrows in place.
assertValid(doc, "itera-player.flows.json");
为什么这是单独的包
它的消费者是一个 CI 验证器页:1 抓取任务 还有一个 AI 探险家。 。 。 .
他们中没有人需要反应来发现 flows.json 身材不错,
其中一个在浏览器中运行。 计划是数据合同,所以它作为
数据——没有折叠到组件库中.
也结束了a 以承诺的方式保存销售副本。 。 。 .
dfl-components-cli 携带自己的副本 v1.schema.json 附有评论
要求人类"在同一回合里模仿它". 一个承诺悄悄地失败了:
复制件会变质,验证器会继续退出 0, 和文档没有人应该有
接受航行通过。 这里,每一个文物 重复的策略是
生成 从它,CI失败 如果其中任何一个停止匹配.
出口的东西
| 导出 | 这是什么 |
|---|---|
validate(doc, options?) | { valid: true, doc } 或者说 { valid: false, errors }没有I/O,同步. |
assertValid(doc, location?, options?) | 掷出 SpecValidationError; 窄处 doc 改为 UxPathsDoc 在成功方面. |
formatErrors(errors) | 每犯一通人可读行. |
SCHEMA_V1 | 计划本身,作为一个物体. |
SCHEMA_ID | 计划 $id。 。 。 . 一个名字,不是地址 - 见下文. |
SUPPORTED_SCHEMA_VERSIONS | ["1.0.0", "1.1.0", "1.2.0", "1.3.0"]。 。 。 . |
UxPathsDoc, (中文(简体) ), Screen, (中文(简体) ), Flow, (中文(简体) ), Screenshot, (中文(简体) ), SourceRef,, , , , , , , , | 由计划生成的类型 . |
stepScreenId, (中文(简体) ), flowScreenIds, (中文(简体) ), danglingScreenIds | JSON Schema规则的帮手不能表达. |
assertSchemaSupported, (中文(简体) ), isDateTime, (中文(简体) ), isUri | 内部,输出用于测试. |
原生的图案还装入了焦油丸,供非TypeScript的消费者使用:
import schema from "@devfellowship/ux-paths-spec/schema/v1.json" with { type: "json" };
这个 $id 是一个名字,而不是地址
SCHEMA_ID 实值 https://raw.githubusercontent.com/devfellowship/dfl-ux-paths/main/schema/v1.json。 。 。 .
dfl-ux-paths 是一个 私营 repo, 这样 URL 404s (中文(简体) ) 给外面的任何人
org - GitHub 报告一条私有路径为 未找到永远 禁用内容,所以请
失败把自己伪装成一个断开的链接. 这个 $id 识别 计划。 这个
从未被获取。 这个软件包在很大程度上是存在的,因此不需要尝试.
零运行时间依赖是一个测试属性
dependencies 未参加 package.json,以及 src/__tests__/package-contract.test.ts
如果出现, 如果运出源导入任何非相对的, 则无法构建 ,
或者如果它提到 fetch 编号 : node:fs / 其他主机 API.
tsconfig.build.json 滴数 @types/node 从已发运的编译中, 所以 node:
导入为 a 编译出错 而不是有人记得的公约.
没有Ajv它怎么验证?
这个 解释 运行时的计策. validate() 读取 SCHEMA_V1 继续走
反之,这个计划是输入的,从不转录成
类型脚本 。 向上添加一个字段, 此校验符执行此字段时没有编辑 .
手写验证器会重新创建这个软件包的准确漂移
结束.
两名警卫守口如瓶
- Ajv对等. Ajv是参考执行,并保持依赖性.
src/__tests__/ajv-parity.test.ts运行两个引擎 覆盖每一个承诺流量 文档加 ~ 30 单规则变异,并在任何分歧上失败. - 未知关键字为硬站. 解释者执行固定关键字
设置。 如果未来的计划使用了它不知道的,
assertSchemaSupported()掷出 命名关键词,而不是跳过它,悄悄接受 它应当拒绝的文件。 需要一个v1.4maxLength响亮的在这里失败,在 绕来绕去.
版本
major.minor 跟踪最高 schema_version 包裹承认.. 1.3.x
(原始内容存档于2018-03-25). ships schema v1.3. {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}一个图案V1.4就成功了 1.4.0。一个固定在 validate() 是一个
补丁起伏. 测试表明该版本和计划一致.
改变计划
schema/v1.json 地点 重传根 是真理的唯一来源。 编辑它,然后:
pnpm --filter @devfellowship/ux-paths-spec run generate
那个重写 spec/schema/v1.json (字节本), spec/src/schema.generated.ts
财务报告和审定财务报表 spec/src/types.generated.ts。不要用手来编辑这三个。 CI 运行
generate --check 并且失败, 如果您忘记了, 则命名陈旧的文件 .
还没有在计划之中(一次v1.4对话)
浏览器应用读取了三字段的图案 从未定义数字 :
requirements[], (中文(简体) ), screen.fidelity 财务报告和审定财务报表 screen.archetype (单位:千美元) screen.page_class) (中文(简体) ).
计划 additionalProperties: false 上层和上层 $defs/screen, (中文(简体) ),
因此,一个文件 携带其中任何一个是 拒绝 - 这是一个真正的差距,不是
允许额外。 3个承诺的查看器固定装置无法验证
理由,还有 ajv-parity.test.ts 用两台引擎把事实钉住,这样就留下
在 v1.4 关闭前可见.
许可证
麻省理工学院.