@amritk/generate-examples

中文文档
0.8.12发布于 2026/10/23MITTypeScriptES Module构建来源已验证近 30 天下载 5.9万

从 JSON Schemas 中生成快速检查仲裁和示例值.

中文使用文档
文档目录7 节
  1. 概览
  2. 安装
  3. 使用量
  4. 低级 API
  5. 支持的关键字
  6. 已知限制
  7. 许可证

@amritk/基因-实例

用于从 JSON Schemas 生成快速检查仲裁和实例值的程序API .

status  version  license  JSON Schema  node  vibe coded


概览

@amritk/generate-examples 将 JSON Schema 变成 测试数据在 其他mjst发电机给你代码 消耗量 运行时的数据(参数, 校验器、 类型 , 此选项通过将数据发送给 练习 那个密码.

每个生成的文件导出 :

  • 类型脚本 type 计划的定义
  • A 类 fast-check 任意( a)FooArbitrary(中文(简体) ) 用于基于属性的测试的理想
  • 具体、自成一体的例子价值(fooExample——理想的固定装置, 种子和文档

一个 index.ts 枪管再出口一切.

[注] 生成的仲裁导入 fast-check,所以消费者需要安装 (单位:千美元)npm i -D fast-check) (中文(简体) ). 任意的,其策略使用关键字 否 fc.* 组合器自行抓取( e)if编号 :then编号 :else, (中文(简体) ), not专用 oneOf, (中文(简体) ), contains,以及显示对象的关键字—— patternProperties, (中文(简体) ), propertyNames, (中文(简体) ), dependent*, (中文(简体) ), min编号 :maxProperties进口 @amritk/runtime-validators 用于生成后验证过滤器;不需要此过滤器的文件不需要. 静态 fooExample 值没有运行时间依赖性.

@amritk/runtime-validators 是一个 dependency 这里不是同伴,因为 这台发电机是自己进口的 这解决了发电机,但 没有 必然用于生成的文件——文件所在区域  源树,所以 在 pnpm 的严格布局下或 Yarn PnP 它从您的项目解决,而不是从 这个包裹。 如果您的计划使用了其中的任何关键词, 请直接安装 (单位:千美元)npm i @amritk/runtime-validators) (中文(简体) ). 无法声明为对等点: Bun 拒绝同时列出的工作空间包,以及 --frozen-lockfile 失败 整个回放.


安装

npm install @amritk/generate-examples
# or
pnpm add @amritk/generate-examples
# or
yarn add @amritk/generate-examples
# or
bun add @amritk/generate-examples

使用量

import { buildExampleSchema } from '@amritk/generate-examples'

const schema = {
  type: 'object',
  properties: {
    id: { type: 'string', format: 'uuid' },
    age: { type: 'integer', minimum: 0 },
  },
  required: ['id'],
} as const

const files = await buildExampleSchema(schema, 'User')
// → [{ filename: 'user.ts', content: '...' }, { filename: 'index.ts', content: '...' }]

生成的 user.ts 看起来像:

import * as fc from 'fast-check'

export type User = { id: string; age?: number }

export const UserArbitrary: fc.Arbitrary<User> = fc.record(
  { "id": fc.uuid(), "age": fc.integer({ min: 0 }) },
  { requiredKeys: ["id"] },
)

export const userExample: User = { "id": "00000000-0000-0000-0000-000000000000", "age": 0 }

在属性测试中使用任意性 :

import { test, fc } from '@fast-check/vitest'
import { UserArbitrary } from './generated'
import { parseUser } from './parsers'

test.prop([UserArbitrary])('parseUser round-trips any valid User', (user) => {
  expect(parseUser(user)).toEqual(user)
})

...或者抓住静态的例子作为固定:

import { userExample } from './generated'

const res = await fetch('/users', { method: 'POST', body: JSON.stringify(userExample) })

低级 API

导出说明
buildExampleSchema(schema, rootName, suffix?)走着走着 $ref 图表并返回 a GeneratedFile[] (每个计划一个文件+一个 index.ts) (中文(简体) ).
generateArbitrary(schema, typeName, suffix?, lazyRefFilenames?, rootSchema?)返回 export const …Arbitrary 单一计划节点的来源.
generateExampleConst(schema, typeName, rootSchema?)返回 export const …Example 单一计划节点的来源.
deriveExample(schema, rootSchema?)返回一个混凝土, 计数系统验证的 JavaScript 值( 无代码生成) .
serializeValue(value)将衍生值序列化为 TypeScript 源表达式( 手) Date编号 :bigint) (中文(简体) ).

支持的关键字

type 包括多种类型的工会,例如: ['string', 'null'] —— 说 (字符串/数字/整数/布尔/核/阵列/对象), properties, (中文(简体) ), required, (中文(简体) ), additionalProperties, (中文(简体) ), items, (中文(简体) ), prefixItems, (中文(简体) ), minItems编号 :maxItems, (中文(简体) ), uniqueItems, (中文(简体) ), minLength编号 :maxLength, (中文(简体) ), pattern, (中文(简体) ), format, (中文(简体) ), minimum编号 :maximum, (中文(简体) ), exclusiveMinimum编号 :exclusiveMaximum, (中文(简体) ), multipleOf, (中文(简体) ), enum (被兄弟们过滤) 限制), const, (中文(简体) ), minProperties编号 :maxProperties, (中文(简体) ), patternProperties, (中文(简体) ), propertyNames, (中文(简体) ), dependentRequired, (中文(简体) ), dependentSchemas, (中文(简体) ), contains, (中文(简体) ), minContains, (中文(简体) ), allOf (合并为一个计划), oneOf编号 :anyOf, (中文(简体) ), if编号 :then编号 :else, (中文(简体) ), not, (中文(简体) ), $ref,则 x-mjst 扩展 (单位:千美元)Date, (中文(简体) ), bigint) (中文(简体) ). if编号 :then编号 :else, (中文(简体) ), not,以及 oneOf 排他性是 通过验证生成的候选人以对抗计划及 重试/拒绝。 不支持的构造可降解为 fc.anything() 内 仲裁和仲裁 null 在静态示例中.

静态实例包括: format @amritk/runtime-validators 知道该如何 检查 : email, (中文(简体) ), idn-email, (中文(简体) ), date, (中文(简体) ), date-time, (中文(简体) ), time, (中文(简体) ), duration, (中文(简体) ), uuid, (中文(简体) ), uri, (中文(简体) ), iri, (中文(简体) ), uri-reference, (中文(简体) ), iri-reference, (中文(简体) ), uri-template, (中文(简体) ), json-pointer, (中文(简体) ), relative-json-pointer, (中文(简体) ), hostname, (中文(简体) ), idn-hostname, (中文(简体) ), ipv4, (中文(简体) ), ipv6, (中文(简体) ), regex, (中文(简体) ), 加上 OpenAPI 代码 url。未识别 format 倒计时 "string"。 。 。 .


已知限制

每个 fooExample 在书写之前,将依据自己的计划加以验证。 何时 值不能满足它仍然发射的图谋——所以模块总是 编译——但生成器打印 a console.warn 命名类型。 到达 FooArbitrary 在这种情况下:任意性带有运行时间验证过滤器 ,并在静态值不能时保持正确.

其价值不足有三个原因:

  • 计划没有实例. { pattern: '^ab$', minLength: 5 }, (中文(简体) ), uniqueItems 以布尔表示 minItems: 3页:1 required 键 additionalProperties: false 禁止,或 oneOf 他们的分行 每一个价值 两次匹配。 没有任何正确的信息发出;警告指向 计划 不是发电机.
  • 所行所行所行所行所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出. pattern 由一个样本 最好的递归 - 贵族行走 regex, 所以看看周围和 回溯引用回溯到 "string"; 未识别 format 做同样的.
  • 约束比任何固定的要大. 衍生的字符串、 数组或 对象停止以 10,000 个字符 / 元素 / 密钥生长, 因此文档 请求 minLength: 50000000 生成一个上限值和一个警告,而不是 a 50 MB 字节. FooArbitrary 仍然尊重真正的约束.

几个值得了解的形状,每个形状都保留生成的文件 编译而非更正:

  • 一个计划需要一把钥匙 它的 生成类型从未声明 —— 说 required 命名缺少的东西 properties页:1 dependentRequired 编号 : dependentSchemas 扶养,或a minProperties 填充对象为无 索引签名。 此示例保留了密钥( 缺少其方案 ) 要求是断开的数据),并作为 … as Foo,因为一个赤裸的物体 含有多余属性的字元无法编译 .
  • 作者 examples[0] (或,当没有 examples,则 default)为 使用过的 只有它满足了自己的计划。提示不会 (单位:千美元){ type: 'string', default: 42 } 常见于其字段类型 页:1 衍生值, 因为生成的类型遵循了图谋并拒绝 直接的暗示. const 永远是荣誉:类型是康斯特自己的 字面类型,所以两者不能有分歧.
  • 一个 不满足范围 (单位:千美元)minLength: 10, maxLength: 2) 倒塌在其上 上面的束缚在任意。 每个界限 fc.* 组合者称 min <= max 抛出 导入,从而将所有其它出口 与它并列的文件。 整数范围也仅限于快速检查本身 32-位范围,和长度/计算范围到非负整数.
  • A 类 递归定义的 样板必须停下来,然后停下来 null,不可更改的类型不承认,因此排放为 … as unknown as Node。 。 。 . NodeArbitrary 将重现通过 fc.letrec 并且不需要这样的逃脱.
  • A 类 pattern 这是 无效的 JavaScript regex,或者使用前视线 或往后看,倒入平地 fc.string()。 。 。 . fc.stringMatching 编译 模块范围的图案,不能从一个断言中产生,因此荣誉 它会把文件扔到无法使用的地方 而不是那个 随意松开.
  • 巢穴深于400级 以错误命名限制. 建造一个任意的,每个图级需要几个堆栈框架,所以更深 文档耗尽了堆栈——盖子将它变成一个信息,说些什么 错了.

两种形状无法生成, 任意性会重试 永远,如果你的样本。 两者都是没有实例的诡计 和例子 警告说:

  • A 类 pattern 所需长度的字符串无法匹配 (单位:千美元){ pattern: '^[a-z]{2}$', minLength: 5 }) (中文(简体) ). 可爱但狭小的配对 (单位:千美元){ pattern: '^[a-f0-9]+$', minLength: 32, maxLength: 32 })对于 同样的原因 -- fc.stringMatching 很少按准确的长度降落.
  • A 类 minLength编号 :minItems 如此之大,所以无法建立如此大小的值.

还有一个缺口不是这个包的关闭:a $ref 无处解决 文档按其名称键入(Nope)但从未进口,因为它是 从未作为文件生成 。 任意贬低为: fc.anything()不过 键入时仍为它命名,因此文件不编译。 同样的 { "type": [] }, (中文(简体) ), 类型为 export type Foo = ;两者来自 @amritk/helpers/generate-type-definition。 。 。 .

[TIP] 实例 $ref 以数值表示内含,所以定义图宽度 扇出出出出相相相应大字. 成本在产出中 大小,而不是生成时间——每个定义每文档产生一次.


许可证

麻省理工学院

版本与发布记录

@amritk/generate-examples 共发布 40 个版本,首次发布于 2026/05/30;过去 12 个月发布了 40 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.8.12latest2026/10/2314 天前
0.8.112026/10/1027 天前
0.8.102026/09/261 个月前
0.8.92026/09/241 个月前
0.8.82026/09/231 个月前
0.8.72026/09/221 个月前

关于 @amritk/generate-examples 的常见问题

@amritk/generate-examples 是什么?

从 JSON Schemas 中生成快速检查仲裁和示例值.

如何安装 @amritk/generate-examples?

在项目目录运行 npm install @amritk/generate-examples,或使用 pnpm add / yarn add / bun add。

@amritk/generate-examples 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@amritk/generate-examples 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@amritk/generate-examples 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@amritk/generate-examples 可以商用吗?

@amritk/generate-examples 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@amritk/generate-examples 的下载量有多少?

根据 npm 官方下载统计,@amritk/generate-examples 在 2026/10/06 – 2026/11/04 这 30 天内被下载 59,176 次,日均约 1,973 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@amritk/generate-examples 还在维护吗?

最新版本 0.8.12 发布于 2026/10/23(14 天前);至今共发布 40 个版本,其中过去 12 个月发布了 40 个;首次发布于 2026/05/30。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。