Files
kycnotme/web/src/lib/json.ts
2025-06-09 10:00:55 +00:00

36 lines
971 B
TypeScript

import type { z } from 'astro/zod'
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
interface JSONObject {
[k: string]: JSONValue
}
type JSONList = JSONValue[]
type JSONPrimitive = boolean | number | string | null
type JSONValue = Date | JSONList | JSONObject | JSONPrimitive
export type ZodJSON = z.ZodType<JSONValue>
export function zodParseJSON<T extends z.ZodType<JSONValue>, D extends z.output<T> | undefined = undefined>(
schema: T,
stringValue: string | null | undefined,
defaultValue?: D
): D | z.output<T> {
if (!stringValue) return defaultValue as D
let jsonValue: D | z.output<typeof schema> = defaultValue as D
try {
jsonValue = JSON.parse(stringValue)
} catch (error) {
console.error(error)
return defaultValue as D
}
const parsedValue = schema.safeParse(jsonValue)
if (!parsedValue.success) {
console.error(parsedValue.error)
return defaultValue as D
}
return parsedValue.data
}