ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β π shadcn/directory/47ng/nuqs/parsers/community/zod-codecs β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β
Since zod@^4.1, you can use codecs
to add bidirectional serialisation / deserialisation to your validation schemas:
import { z } from 'zod'
// Similar to parseAsTimestamp in nuqs:
const dateTimestampCodec = z.codec(z.string().regex(/^\d+$/), z.date(), {
decode: (query) => new Date(parseInt(query)),
encode: (date) => date.valueOf().toFixed()
})
import { ZodCodecsDemo } from './zod-codecs.demo' import { ZodCodecsDemoSkeleton } from './zod-codecs.skeleton' import { Suspense } from 'react'
<Suspense fallback={( <ZodCodecsDemoSkeleton className='animate-pulse'> <div className='h-32 bg-muted/25 rounded-md flex items-center justify-center text-sm text-muted-foreground'> Loading demo⦠</div> </ZodCodecsDemoSkeleton> )}> <ZodCodecsDemo/> </Suspense>
import { ZodCodecsSource } from './zod-codecs.source'
Source code:
<ZodCodecsSource/>The cool part is being able to add string constraints to the first type in a codec. It has to be rooted as a string data type (because that's what the URL will give us), but you can add refinements:
z.codec(z.uuid(), ...)
z.codec(z.email(), ...)
z.codec(z.base64url(), ...)
See the complete list of string-based refinements you can use.
<Callout title="Caveats" type="warning"> As stated in the Zod docs, you [cannot use transforms in codecs](https://zod.dev/codecs#transforms). </Callout>β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ