🎭

Zodのダミーデータ生成ライブラリのZockerがイケてる

に公開

最近、ZockerというZodのスキーマ通りのダミーデータを自動生成してくれるとてもイケてるライブラリを知りました。
https://zocker.sigrist.dev/

使い方

公式ドキュメントそのままですが、zocker(schema).generate()でいい感じにテストデータが生成されます。

import { z } from "zod/v4";
import { zocker } from "zocker";

const person_schema = z.object({
    name: z.string(),
    age: z.number(),
    emails: z.array(z.email()),
    children: z.array(z.lazy(() => person_schema))
});

const mockData = zocker(person_schema).generate();

/*
mockData = {
    name: "John Doe",
    age: 42,
    emails: ["john.doe@gmail.com"],
    children: [
        {
            name: "Jane Doe",
            age: 12,
            emails: [...]
            children: [...]
        },
        ...
    ]
}
*/

イケてるところ

v4に対応している

ZockerはZodのv3、v4どちらも対応しています。
しかも、どちらのバージョンでも記述方法などは変わらないため、Zodをv3からv4にアップデートする際もZockerを使っている部分のv4対応のような修正が不要な点もイケています。

自動でそれっぽい値を生成してくれる

Zockerは内部でfaker.jsを使って値を生成するため、Zodスキーマのフォーマットや名前からそれっぽい値を生成してくれます。

const schema = z.object({
 firstname: z.string(),
 lastname: z.string(),
 email: z.email(),
 gender: z.string(),
 age: z.number(),
  year: z.number(),
 foo: z.iso.date(),
 bar: z.iso.time(),
});

const data = zocker(schema).generate();

/*
data = {
  "firstname": "Howard",
  "lastname": "Blick",
  "email": "Candelario.Brakus@yahoo.com",
  "gender": "Gender nonconforming",
  "age": 70,
  "year": 1528,
  "foo": "2025-06-07",
  "bar": "23:19:36"
}
*/

https://fakerjs.dev/

生成されるデータやプロセスをカスタマイズできる

生成されるダミーデータの値やZockerのデフォルト生成プロセスを独自にカスタマイズすることができます。

部分的に特定の値が必ず出力されるようにしたい場合は.supply()を使います。

const schema = z.object({
  name: z.string(),
  age: z.number()
});

const data = zocker(schema)
  .supply(schema.shape.name, "Jonathan")
  .generate();

/*
data = {
  "name": "Jonathan",   // 常に"Jonathan"が設定される
  "age" : 120381234124, // ランダムな値
}
*/

.override() で指定したスキーマの組み込みジェネレータをまとめてオーバーライドすることもできます。

const schema = z.object({
  id: z.number(),
  name: z.string(),
  age: z.number().min(0).max(100),
  gender: z.string(),
  adress: z.string(),
});

const data = zocker(schema)
  // numberは必ず`30`で出力される
  .override(z.ZodNumber, () => 30)
  // stringは必ず`"hoge"`で出力される
  .override(z.ZodString, () => "hoge")
  .generate();

/*
data = {
  "id": 30,
  "name": "hoge",
  "age": 30,
  "gender": "hoge",
  "adress": "hoge"
}
*/

また、Zodの型毎に組み込まれているZockerのジェネレータの振る舞いもカスタマイズすることができます。

const schema = z.array(
  z.emoji().length(1).nullable(),
);

const data = zocker(schema)
  // z.array()は必ず8〜10個の要素が生成される
  .array({
    max: 10,
    min: 8,
  })
  // z.nullable()は40%の確率でnullになる
  .nullable({
    null_chance: 0.4,
  })
  .generate();

/*
data = [
  null,
  "👩🏾‍🦰",
  "🥃",
  "🎏",
  "🌝",
  "🕜",
  null,
  null,
  null,
  "👩🏽‍🦲"
]
*/

おわりに

Zocker、とてもイケてるライブラリなので個人的にとても応援してます。
イケている割にGitHubのStarが少ないので、色んな人に知って欲しい、使ってみてほしいと思いこの記事を書きました。

https://github.com/LorisSigrist/zocker

Discussion