Extract default and empty values from Zod schemas for seamless form initialization and testing
Zod는 강력한 타입 안전 스키마 검증 라이브러리이지만, 스키마로부터 초기값을 추출하는 기능은 제공하지 않습니다. 폼을 초기화하거나 테스트 데이터를 생성할 때, 스키마와 별도로 초기값을 관리하면 동기화 문제가 발생할 수 있습니다.
zod-to-defaults는 이 문제를 해결합니다:
- ✅ 단일 진실 공급원: 스키마가 곧 초기값의 유일한 소스
- ✅ 타입 안전성: Zod의 타입 추론을 그대로 활용
- ✅ 유지보수성: 스키마 변경 시 초기값도 자동으로 동기화
- ✅ 범용성: React Hook Form, TanStack Form 등 모든 폼 라이브러리와 호환
npm install zod-to-defaults
# or
yarn add zod-to-defaults
# or
pnpm add zod-to-defaultsRequirements:
- Zod v3.0.0 이상 또는 v4.0.0 이상
import { z } from 'zod';
import { getSchemaDefaults } from 'zod-to-defaults';
const userSchema = z.object({
name: z.string().default('Anonymous'),
age: z.number(),
email: z.string(),
isActive: z.boolean(),
});
const defaults = getSchemaDefaults(userSchema);
// {
// name: 'Anonymous',
// age: 0,
// email: '',
// isActive: false
// }Zod 스키마로부터 기본값을 추출합니다. 각 타입별로 의미있는 기본값을 반환합니다:
| Zod Type | Default Value |
|---|---|
z.string() |
"" |
z.number() |
0 |
z.boolean() |
false |
z.date() |
new Date() |
z.array() |
[] |
z.object() |
{} (각 필드의 기본값으로 채워짐) |
z.enum() |
첫 번째 옵션 |
z.literal() |
리터럴 값 |
z.union() |
첫 번째 옵션의 기본값 |
z.default(value) |
지정된 value |
Zod 스키마로부터 빈 값을 추출합니다. 폼 초기화 시 모든 필드를 비워야 할 때 유용합니다:
const schema = z.object({
name: z.string(),
age: z.number(),
});
const empties = getSchemaEmpties(schema);
// { name: null, age: null }import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { getSchemaDefaults } from 'zod-to-defaults';
const formSchema = z.object({
username: z.string().min(3),
email: z.string().email(),
age: z.number().min(18).default(18),
});
function MyForm() {
const form = useForm({
resolver: zodResolver(formSchema),
defaultValues: getSchemaDefaults(formSchema),
});
// ...
}import { useForm } from '@tanstack/react-form';
import { getSchemaDefaults } from 'zod-to-defaults';
const userSchema = z.object({
name: z.string(),
email: z.string().email(),
});
function MyForm() {
const form = useForm({
defaultValues: getSchemaDefaults(userSchema),
onSubmit: async ({ value }) => {
// ...
},
});
// ...
}const addressSchema = z.object({
street: z.string(),
city: z.string(),
zipCode: z.string(),
});
const profileSchema = z.object({
user: z.object({
name: z.string().default('Guest'),
age: z.number(),
}),
addresses: z.array(addressSchema),
metadata: z.record(z.string()),
});
const defaults = getSchemaDefaults(profileSchema);
// {
// user: { name: 'Guest', age: 0 },
// addresses: [],
// metadata: {}
// }zod-to-defaults는 Zod v3와 v4를 모두 지원합니다. 내부적으로 버전별 차이를 자동으로 처리하여 동일한 API를 제공합니다.
// Zod v3와 v4 모두 동일하게 동작
const schema = z.enum(['active', 'inactive']);
const defaultValue = getSchemaDefaults(schema); // 'active'// UUID 자동 생성
const schema = z.string().uuid();
getSchemaDefaults(schema); // crypto.randomUUID()
// IP 주소
z.string().ip(); // "0.0.0.0"
z.string().ipv6(); // "::"
// BigInt
z.bigint(); // BigInt(0)
// NaN
z.nan(); // NaN
// Template Literals (Zod v4)
z.templateLiteral`user_${z.string()}`; // "user_"| Feature | zod-to-defaults | Manual defaults | zod-mock |
|---|---|---|---|
| Type Safety | ✅ | ❌ | ✅ |
| Zero Config | ✅ | ❌ | ❌ |
| Zod v3 & v4 Support | ✅ | N/A | |
| Bundle Size | ~2KB | 0KB | ~50KB |
| Randomization | ❌ | ❌ | ✅ |
| Purpose | Production | Production | Testing only |
When to use zod-to-defaults:
- 폼 초기값이 필요할 때
- 스키마와 초기값을 동기화하고 싶을 때
- 타입 안전한 기본값이 필요할 때
When to use alternatives:
- 완전히 랜덤한 테스트 데이터가 필요할 때 →
zod-mock - 번들 크기가 가장 중요할 때 → Manual defaults
- 📦 Bundle size: ~2KB (minified + gzipped)
- ⚡ Average execution time: < 1ms for typical schemas
- 🎯 Zero dependencies (except Zod peer dependency)
완벽한 타입 추론을 제공합니다:
const schema = z.object({
name: z.string(),
age: z.number(),
metadata: z.object({
tags: z.array(z.string()),
}),
});
const defaults = getSchemaDefaults(schema);
// Type: { name: string; age: number; metadata: { tags: string[] } }
defaults.name.toUpperCase(); // ✅ OK
defaults.age.toFixed(2); // ✅ OK
defaults.metadata.tags.push('new'); // ✅ OK기여는 언제나 환영합니다! 다음 절차를 따라주세요:
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Run tests (
npm test) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
# Install dependencies
npm install
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
# Build
npm run build
# Lint & Format
npm run checkMIT © bokeeeey
Made with 🦖 by bokeeeey