Zod Utilz
Framework agnostic utilities for Zod
Table of contents
Purpose
To fill the gap of features that might be missing in Zod. Always open to suggestions. Feel free to open an issue or PR.
Installation
From npm (Node/Bun)
npm install zod_utilz
yarn add zod_utilz
pnpm add zod_utilz
bun add zod_utilz
Getting Started
import
// Node/Bun
import { zu } from 'zod_utilz'
// Deno
import { zu } from 'https://deno.land/x/zod_utilz/mod.ts'
import { zu } from 'npm:zod_utilz'
Utilz
SPR
SPR stands for SafeParseResult
This enables optional chaining or nullish coalescing for z.SafeParseReturnType
.
import { zu } from 'zod_utilz'
const schema = z.object( { foo: z.string() } )
const result = zu.SPR( schema.safeParse( { foo: 42 } ) )
const fooDataOrErrors = result.data?.foo ?? result.error?.format().foo?._errors
makeErrorMap
Simplifies the process of making a ZodErrorMap
import { zu } from 'zod_utilz'
const errorMap = zu.makeErrorMap( {
required: 'Custom required message',
invalid_type: ( { data } ) => `${ data } is an invalid type`,
invalid_enum_value: ( { data, options } ) =>
`${ data } is not a valid enum value. Valid options: ${ options?.join( ' | ' ) } `,
} )
const stringSchema = z.string( { errorMap } )
zu.SPR( stringSchema.safeParse( undefined ) ).error?.issues[ 0 ].message
// Custom required message
zu.SPR( stringSchema.safeParse( 42 ) ).error?.issues[ 0 ].message
// 42 is an invalid type
const enumSchema = z.enum( [ 'foo', 'bar' ], { errorMap } )
zu.SPR( enumSchema.safeParse( 'baz' ) ).error?.issues[ 0 ].message
// baz is not a valid enum value. Valid options: foo | bar
useTypedParsers
import { zu } from 'zod_utilz'
const schemaWithTypedParsers = zu.useTypedParsers( z.literal( 'foo' ) )
schemaWithTypedParsers.parse( 'foo' )
// no ts errors
schemaWithTypedParsers.parse( 'bar' )
// ^^^^^
// Argument of type '"bar"' is not assignable to parameter of type '"foo"'
TODO
- Partial Safe Parse
- URLSearchParams
- FormData
- BaseType (Recursively get the base type of a Zod type)
- zu.baseType( z.string() ) // z.string
- zu.baseType( z.string().optional() ) // z.string
- zu.baseType( z.string().optional().refine() ) // z.string
- zu.baseType( z.string().array().optional().refine() ) // z.array