深入解析 Insomnia File Schema:v5 文件格式的 JSON Schema 契约及其生成、校验与版本迁移机制
【免费下载链接】insomniaThe open-source, cross-platform API client for GraphQL, REST, WebSockets, SSE and gRPC. With Cloud, Local and Git storage.项目地址: https://gitcode.com/GitHub_Trending/in/insomnia
Insomnia 将所有对外交换的数据(请求集合、API 设计文档、Mock 服务、全局环境、MCP 客户端)统一为 v5 格式的.yaml文件,而 schemas/insomnia.schema.5.1.json 就是这套文件格式的机器可读契约。本文基于 schemas/README.md 完整讲解该 JSON Schema 的覆盖范围、编辑器与 CI 中的校验用法、版本化策略与重新生成流程,并结合仓库源码深入剖析其“从 Zod 生成”的管线以及schema_version双轨版本迁移机制,读完你可以直接在项目或 CI 中为 Insomnia 文件接入自动校验,并理解旧版本文件被自动升级到 5.1 的底层原理。
它是什么:一份描述 v5 文件格式的 JSON Schema
insomnia.schema.5.1.json是一份 JSON Schema(draft 2020-12),描述Insomnia v5 文件格式——也就是你从 Insomnia 导出集合、设计文档、环境或 Mock 服务时得到的.yaml文件,以及 Insomnia 在 Git 存储仓库中读写的那些文件。
它的实际用途有三类:
- 编辑器/CI 校验:在 VS Code 或 CI 流水线中校验和自动补全 Insomnia 文件;
- AI Agent 的精确契约:让 Agent 在生成或编辑 Insomnia 文件时有据可依、可校验;
- Git 存储场景的一致性保障:Git 仓库中的 Insomnia 文件与本地导入导出共用同一套结构定义。
需要特别注意的一点是:这份 schema 是从源码生成的。它的源头是 Insomnia 代码中作为唯一事实来源(source of truth)的 Zod schema——packages/insomnia/src/common/import-v5-parser.ts 中的InsomniaFileSchema,这是导入/导出.yaml文件和 Git 存储时实际使用的同一套校验逻辑。因此 schema 文件不应手工编辑,修改后必须通过重新生成流程更新。
覆盖范围:一个 type 字段区分五种文件
顶层type字段是判别字段,共五种文件类型:
type | 文件类型 |
|---|---|
collection.insomnia.rest/5.0 | 请求集合(Request collection) |
spec.insomnia.rest/5.0 | API 规范 / 设计文档 |
mock.insomnia.rest/5.0 | Mock 服务 |
environment.insomnia.rest/5.0 | 全局环境 |
mcpClient.insomnia/5.0 | MCP 客户端 |
从源码可以看到这五种类型正是 import-v5-parser.ts 中InsomniaFileSchema的z.discriminatedUnion('type', ...)五个分支:CollectionSchema、ApiSpecSchema、MockServerSchema、GlobalEnvironmentsSchema、McpClientSchema。几个值得注意的实现细节:
type中的5.0与 schema 版本无关:它是文件格式主类型,跨版本保持稳定(详见下一节的双轨版本策略)。- MCP 客户端故意不遵循
insomnia.rest命名:源码注释 写明,mcpClient.insomnia/5.0的命名是为了防止旧版本 App 在同步此类文件时崩溃(对应内部问题 INS-1762)。 - 五种类型共享相同的外壳:都带
schema_version(默认5.1)、name、meta,再各带专属内容字段——集合/设计文档带collection、cookieJar、environments、certificates;Mock 服务带server与routes;全局环境只有environments;MCP 客户端带mcpRequest。
版本化策略:不可变的版本文件 + 双轨版本号
每个 schema 版本是一个独立的不可变文件
每个 schema 版本都发布为独立文件insomnia.schema.<version>.json(当前为 insomnia.schema.5.1.json)。版本号升级时是在旧文件旁边新增一个文件,而不是覆盖旧文件——这样每个历史版本都保持可寻址,已发布的 schema URL 永远不会改变含义。当前版本由 schema-version.ts 中的常量定义:
export const INSOMNIA_SCHEMA_VERSION = '5.1';使用方应当显式引用自己目标的具体版本——当 schema 升级时,把 URL 中的版本号改掉即可前移,旧项目继续引用旧版本文件也不会失效。
数据文件的双轨版本:type稳定,schema_version演进
生成脚本和 Zod schema 共同决定了一个关键的版本设计:文件type字段永远保持*/5.0,实际功能版本记录在schema_version字段中。这一策略在 migration.md 中有完整阐述:
- 向后兼容:旧版本可以读新版本数据(它们会忽略
schema_version字段); - 向前兼容:新版本可以读旧版本数据(自动执行迁移);
type字段跨版本保持稳定,避免破坏导入导出与 Git 同步的识别逻辑;schema_version表示功能可用版本,缺失时默认按5.0(原始版本)处理。
示例对比(来自 migration.md):
# v5.0(原始版本) type: "collection.insomnia.rest/5.0" name: "My Collection" collection: - name: "My Request" headers: - name: "Content-Type" value: "application/json" id: "header_123" # 该 id 字段在 v5.1 中被移除 # v5.1(新特性,type 保持不变) type: "collection.insomnia.rest/5.0" # 为兼容性保持相同 schema_version: "5.1" # 新增,用于标记功能版本 name: "My Collection" collection: - name: "My Request" headers: - name: "Content-Type" value: "application/json" # id 字段已在 v5.1 中移除对应的 Zod 侧定义见 CollectionSchema:type是z.literal('collection.insomnia.rest/5.0'),而schema_version是z.string().optional().default(INSOMNIA_SCHEMA_VERSION)——缺省即当前版本。
v5.1 迁移做了什么
当前唯一的迁移是 5.0 → 5.1,实现位于 v5.1.ts 的cleanHeadersAndParameters(),核心行为:
- 从
headers、parameters、body.params、cookies、gRPCmetadata数组的元素中移除id字段; - 从
cookies中移除时间戳字段creation、lastAccessed; - 过滤空条目(无
name/value的项),但保留文件上传项(type: 'file'且有fileName)和 OpenAPI$ref/schema/in/required条目; - 移除非空校验后为空的数组,以及只剩空字符串的
scripts对象; - 跳过
spec.contents——其中是 OpenAPI 规范原文,有自己独立的 schema,不参与迁移; - 对遗留的 headers 补齐缺失的
name/value(源码注释指出,缺少这两个字段的旧数据会被误判为 gRPC 请求,对应 INS-1822)。
这些行为有专门的回归测试 v5.1.test.ts。
迁移在哪些入口生效
迁移逻辑统一由 insomnia-schema-migrations/index.ts 提供,其中migrateToLatestYaml()是主入口,性能与容错策略很清晰:
- 提前退出:数据已是最新版本时原样返回,不做任何处理(L70-L72);
- 按需应用:只有版本号大于来源版本的迁移函数才会执行,
migrations注册表按版本排序(L43-L49); - 失败兜底:迁移异常时回退返回原始内容,不阻断主流程(L91-L95);
- 属性顺序归一化:可选传入 reference 内容,
normalizePropertyOrder()按参照对象重排键序与meta.id顺序,避免 Git diff 检测因属性重排产生误报。
从源码引用关系看,migrateToLatestYaml至少在三处被调用:数据导入(insomnia-v5.ts)、Git 克隆导入(git-service.ts)、以及Git 存储的 diff 计算(git-vcs.ts 中对 HEAD 与 STAGE blob 应用迁移)。新增迁移的步骤(升版本号 → 新建v5.2.ts→ 注册进migrations数组 → 更新 Zod schema → 补测试)在 migration.md 中有完整流程说明。
生成管线:从 Zod 到 JSON Schema
schema 由 packages/insomnia/scripts/generate-schema.ts 生成,整条管线值得逐段看:
- 用 esbuild 打包解析器:
import-v5-parser.ts内部使用~/*tsconfig 路径别名,单文件执行器无法解析,脚本先用 esbuild(配置alias: { '~': SRC_DIR })把它打包成临时 CJS 模块再加载,同时把zod声明为 external 以共享同一实例(bundleParser)。 z.toJSONSchema()的三个关键选项(L112-L121):io: 'input'——按用户书写的数据校验(字段默认值保持可选,而不是输出形态);unrepresentable: 'any'——无法精确映射到 JSON Schema 的结构回退为宽松形态而非抛错;cycles: 'ref'——递归的 request-group / JSON 值 schema 通过$defs/$ref复用,不做内联展开。
normalizeSchema()归一化(L60-L73):- 删除所有
default注解——它们不影响校验,而某个 cookie 字段的默认值是crypto.randomUUID(),不删掉会导致输出不确定、破坏 CI 的确定性比对; - 从
required数组中剔除expires等被z.preprocess(...)包装且内层带默认值的字段——Zod 计算可选性时“看不见”preprocess 包裹,会把实际可选的字段误标为必填,而解析器实际上接受其缺省。
- 删除所有
- 拼装元信息并落盘:写入
$schema(draft 2020-12)、$id(发布 URL)、title与description,输出到仓库根 schemas/ 目录下按版本命名的不可变文件,文件名由INSOMNIA_SCHEMA_VERSION决定。
脚本头部注释还特别说明:生成的文件会提交进仓库,并由 CI 漂移检查保持与源码同步。
使用方式
VS Code(YAML 扩展)
安装 YAML 扩展后,在.vscode/settings.json中把 Insomnia 文件映射到 schema:
{ "yaml.schemas": { "https://raw.githubusercontent.com/Kong/insomnia/develop/schemas/insomnia.schema.5.1.json": [ "**/*.insomnia.yaml", ".insomnia/**/*.yml" ] } }也可以在单个文件顶部用行内 modeline 指定:
# yaml-language-server: $schema=https://raw.githubusercontent.com/Kong/insomnia/develop/schemas/insomnia.schema.5.1.json type: collection.insomnia.rest/5.0 name: My Collection命令行 / CI
用任意 JSON Schema 校验器都可以。以ajv-cli为例(文件是 YAML,需先转换,例如用yq):
curl -sO https://raw.githubusercontent.com/Kong/insomnia/develop/schemas/insomnia.schema.5.1.json yq -o=json '.' my-collection.insomnia.yaml > my-collection.json ajv validate --spec=draft2020 -s insomnia.schema.5.1.json -d my-collection.jsonNode.js
import Ajv2020 from 'ajv/dist/2020.js'; import addFormats from 'ajv-formats'; import { readFileSync } from 'node:fs'; import YAML from 'yaml'; const schema = JSON.parse(readFileSync('insomnia.schema.5.1.json', 'utf8')); const ajv = addFormats(new Ajv2020({ allErrors: true, strict: false })); const validate = ajv.compile(schema); const data = YAML.parse(readFileSync('my-collection.insomnia.yaml', 'utf8')); if (!validate(data)) { console.error(validate.errors); process.exit(1); }注意strict: false:生成的 schema 中存在无法精确映射的宽松结构(见前文unrepresentable: 'any'),关闭 Ajv 的严格模式可避免加载告警;addFormats则用于支持date-time等格式校验(cookie 的expires等字段)。
给 AI Agent 的契约
让 Agent 创建或编辑 Insomnia 文件时,把 schema URL 作为必须遵循并用于自校验的契约:
Generate an Insomnia collection that conforms to the JSON Schema at
https://raw.githubusercontent.com/Kong/insomnia/develop/schemas/insomnia.schema.5.1.json. The top-leveltypemust becollection.insomnia.rest/5.0.
这条提示词的写法直接来自 schemas/README.md,其可靠性正源于 schema 与 App 内部解析器同源:通过 schema 校验的文件,与 Insomnia 导入时的 Zod 校验是同一套约束。
稳定 URL 与版本固定
schema 以原始文件形式发布在默认分支上:
https://raw.githubusercontent.com/Kong/insomnia/develop/schemas/insomnia.schema.5.1.json这正是 schema 自身的$id值,也就是上述各处应当引用的 URL(与 generate-schema.ts 中的 SCHEMA_BASE_URL 一致)。若需固定到某个具体应用版本,把develop换成 release tag(文档给出的示例为core@12.0.0)即可;由于每个版本文件不可变,develop分支上的文件名一旦写入就永远指向同一内容。
重新生成与 CI 漂移检查
修改 Zod schema 后,运行:
npm run generate:schema -w insomnia(该脚本定义在 packages/insomnia/package.json 中,即esr --cache ./scripts/generate-schema.ts),然后提交schemas/下更新后的文件。
CI 会强制生成结果与源码保持一致:.github/workflows/test.yml 中 “Check Insomnia JSON schema is up to date” 步骤会重新执行npm run generate:schema -w insomnia,用git add -N schemas/将(版本号升级产生的)新文件标记为 intent-to-add,再以git diff --exit-code schemas/判断是否漂移,漂移则报错要求重新生成并提交:
::error::schemas/ is out of date. Run 'npm run generate:schema -w insomnia' and commit the result.小结与延伸阅读
Insomnia File Schema 的设计核心是“单一事实来源 + 不可变版本发布”:Zod schema(import-v5-parser.ts)同时服务于运行时解析与公开 JSON Schema 的生成;type稳定、schema_version演进的双轨版本策略让新旧数据互通,迁移逻辑(insomnia-schema-migrations/)在导入、Git 克隆和 diff 三个入口统一生效;CI 漂移检查则保证公开契约永不过期。关键文件清单:
- schemas/README.md —— 本 schema 的使用说明(本文主文档)
- schemas/insomnia.schema.5.1.json —— 当前版本的 JSON Schema
- packages/insomnia/scripts/generate-schema.ts —— 生成管线
- packages/insomnia/src/common/import-v5-parser.ts —— Zod 源头与类型定义
- packages/insomnia/src/common/insomnia-schema-migrations/migration.md —— 迁移指南与新增迁移流程
- packages/insomnia/src/common/insomnia-schema-migrations/v5.1.ts —— 5.1 迁移实现
- packages/insomnia/src/common/insomnia-schema-migrations/tests/v5.1.test.ts —— 迁移回归测试
- .github/workflows/test.yml —— CI 漂移检查
【免费下载链接】insomniaThe open-source, cross-platform API client for GraphQL, REST, WebSockets, SSE and gRPC. With Cloud, Local and Git storage.项目地址: https://gitcode.com/GitHub_Trending/in/insomnia
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考