Simple, type-safe mock data generator for Zod schemas with built-in Brazilian format support π§π·
A developer-friendly, class-based utility for generating realistic test data from Zod schemas. Perfect for testing, prototyping, and fixtures β with zero configuration and maximum type safety.
- Clean class-based API β instantiate once, generate many times
- Zero configuration β works out of the box with any Zod schema
- Type-safe overrides β full TypeScript intellisense and validation
- Intuitive seeding β
mock.seed(123)for deterministic tests
- CPF, CNPJ, RG β built-in Brazilian document formats
- CEP β postal code generation
- Phone BR β Brazilian phone numbers
- Zero dependencies β no extra libraries needed
- Faker.js integration β realistic, locale-aware fake data
- Custom Faker injection β use different locales per test
- Batch generation β
generateMany()for multiple mocks - Full Zod v4 support β Union, Intersection, Record, Lazy, Pipe, and more
# npm
npm install @mikemajesty/zod-mock-schema
# yarn
yarn add @mikemajesty/zod-mock-schema
# pnpm
pnpm add @mikemajesty/zod-mock-schemaNote: Zod and Faker are peer dependencies.
import { z } from 'zod';
import { ZodMockSchema } from '@mikemajesty/zod-mock-schema';
const userSchema = z.object({
id: z.string().uuid(),
name: z.string(),
email: z.string().email(),
age: z.number().int().min(18).max(99),
isActive: z.boolean(),
createdAt: z.date(),
});x
const userMock = new ZodMockSchema(userSchema);
console.log(userMock.generate());const productSchema = z.object({
id: z.number(),
title: z.string(),
price: z.number().positive(),
inStock: z.boolean(),
tags: z.array(z.string()),
});
const productMock = new ZodMockSchema(productSchema);
productMock.generate();userMock.generate({
overrides: {
name: 'Alice Johnson',
age: 25,
email: 'alice@company.com',
createdAt: new Date('2023-01-01'),
}
});userMock.generateMany(3, {
overrides: { department: 'Engineering' }
});userMock.generateMany(5, {
prefix: {
options: ['USER', 'CLIENT', 'CUSTOMER', 'MEMBER'],
for: 'username'
}
});userMock.generateMany(3, {
prefix: {
options: { useIndex: true },
for: 'email'
}
});Generate valid Brazilian documents and identifiers with zero configuration:
import { ZodMockSchema, BrazilianFormat } from '@mikemajesty/zod-mock-schema';
const userSchema = z.object({
cpf: z.string().meta({ format: 'cpf' }), // 11-digit CPF
cnpj: z.string().meta({ format: 'cnpj' }), // 14-digit CNPJ
rg: z.string().meta({ format: 'rg' }), // Brazilian ID
phone: z.string().meta({ format: 'phoneBR' }), // BR phone number
cep: z.string().meta({ format: 'cep' }), // Postal code
});
const mock = new ZodMockSchema(userSchema);
const user = mock.generate();
// {
// cpf: "52998224725",
// cnpj: "60676960000106",
// rg: "238192611",
// phone: "11987654321",
// cep: "01001000"
// }
// TypeScript support for format validation
const format: BrazilianFormat = 'cpf'; // Type-safe!
### Why This Matters
Brazilian formats require specific validation rules that generic mock generators don't understand. This library provides:
- β
**Pre-validated samples** β all generated values pass real validation
- β
**No external APIs** β works offline, no rate limits
- β
**Deterministic with seeds** β same seed = same CPF/CNPJ
- β
**Works in arrays and nested objects** β generate multiple documents easily
```ts
// Generate multiple users with valid Brazilian docs
const users = mock.generateMany(10);
users.forEach(u => console.log(u.cpf)); // All valid CPFs
Supports all Zod types including advanced patterns:
const complexSchema = z.object({
status: z.union([z.literal('active'), z.literal('inactive'), z.literal('pending')]),
userWithRole: z.object({ name: z.string() }).and(z.object({ role: z.string() })),
metadata: z.record(z.string()),
optionalField: z.string().optional(),
nullableField: z.string().nullable(),
tags: z.array(z.string()).min(1).max(5),
score: z.number().default(0),
nested: z.lazy(() => complexSchema.optional()),
});
const complexMock = new ZodMockSchema(complexSchema);
complexMock.generate();const orderSchema = z.object({
id: z.string().uuid(),
customerId: z.string().uuid(),
items: z.array(z.object({
productId: z.string().uuid(),
quantity: z.number().int().positive(),
price: z.number().positive(),
})),
total: z.number().positive(),
status: z.enum(['pending', 'processing', 'shipped', 'delivered']),
createdAt: z.date(),
metadata: z.record(z.any()).optional(),
});
const orderMock = new ZodMockSchema(orderSchema);
orderMock.generateMany(5, {
overrides: {
status: 'processing',
total: 1399.97,
}
});export class UserFactory {
private mock = new ZodMockSchema(userSchema);
create(overrides?: Partial<User>) {
return this.mock.generate({ overrides });
}
createMany(count: number, options?: MockManyOptions<User>) {
return this.mock.generateMany(count, options);
}
createAdmins(count: number) {
return this.mock.generateMany(count, {
overrides: { role: 'admin' }
});
}
}const userMock = new ZodMockSchema(userSchema);
userMock.seed(123);
const user = userMock.generate();Inject a custom Faker instance with different locales or configurations:
import { Faker, pt_BR } from '@faker-js/faker';
const customFaker = new Faker({ locale: pt_BR });
const user = userMock.generate({ faker: customFaker });test('parallel test 1', () => {
const faker1 = new Faker({ locale: en });
faker1.seed(100);
const user = userMock.generate({ faker: faker1 });
});
test('parallel test 2', () => {
const faker2 = new Faker({ locale: es });
faker2.seed(200);
const user = userMock.generate({ faker: faker2 });
});describe('User Service', () => {
const userMock = new ZodMockSchema(userSchema);
test('should create multiple unique users', () => {
const users = userMock.generateMany(5);
const emails = users.map(u => u.email);
expect(new Set(emails).size).toBe(5);
});
});Creates a mock generator for the given Zod schema.
Generates a single mock object.
Generates multiple mock objects.
Configuration options for generating a single mock object.
overrides?: Partial<T>β Override specific propertiesfaker?: Fakerβ Custom Faker instance for localization
Extends MockOptions<T> for batch generation.
Type-safe union of Brazilian format identifiers:
type BrazilianFormat = 'cpf' | 'cnpj' | 'rg' | 'phoneBR' | 'cep';β String Β· Number Β· Boolean Β· Date Β· Array
β Object Β· Union Β· Intersection Β· Enum
β Record Β· Optional Β· Nullable Β· Default
β Lazy Β· Literal Β· Any Β· Unknown
β Void Β· Null Β· Pipe
// β
Good: Reuse instances
const userMock = new ZodMockSchema(userSchema);
const user1 = userMock.generate();
const user2 = userMock.generate();
// β Avoid: Creating new instances every time
const user1 = new ZodMockSchema(userSchema).generate();
const user2 = new ZodMockSchema(userSchema).generate();// β
Good: Override specific fields
userMock.generate({ overrides: { role: 'admin', status: 'active' } });
// β Avoid: Manually modifying generated data
const user = userMock.generate();
user.role = 'admin'; // Bypasses Zod validation// β
Good: Single source of truth
export const UserFactory = new ZodMockSchema(userSchema);
// In tests:
import { UserFactory } from './factories';
const admin = UserFactory.generate({ overrides: { role: 'admin' } });// β
Good: Reproducible tests
test('user creation', () => {
userMock.seed(12345);
const user = userMock.generate();
expect(user.name).toBe('Alice'); // Always the same with same seed
});MIT Β© Mike Majesty