From cda31390c1449232580f67c3c33eddf7a0d574b3 Mon Sep 17 00:00:00 2001 From: Josh Biddick <102497932+sonic-knuckles@users.noreply.github.com> Date: Mon, 6 Mar 2023 11:35:33 +1300 Subject: [PATCH] provide an alternative mechanism for checking ZodType in parsers --- src/parsers.ts | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/parsers.ts b/src/parsers.ts index 04fd476..3472731 100644 --- a/src/parsers.ts +++ b/src/parsers.ts @@ -38,6 +38,14 @@ type SafeParsedData = T extends ZodTypeAny ? SafeParseReturnType, ParsedData> : never; +/** + * A Type Guard to check object is a ZodType. + * `instanceof` is not always reliable when bundled. + * `parse` is the only method we require to determine it is a Zod object. + */ +const isZodType = (input: ZodRawShape | ZodTypeAny): input is ZodType => + typeof input.parse === 'function'; + /** * Parse and validate Params from LoaderArgs or ActionArgs. Throws an error if validation fails. * @param params - A Remix Params object. @@ -50,7 +58,7 @@ export function parseParams( options?: Options ): ParsedData { try { - const finalSchema = schema instanceof ZodType ? schema : z.object(schema); + const finalSchema = isZodType(schema) ? schema : z.object(schema); return finalSchema.parse(params); } catch (error) { throw createErrorResponse(options); @@ -67,7 +75,7 @@ export function parseParamsSafe( params: Params, schema: T ): SafeParsedData { - const finalSchema = schema instanceof ZodType ? schema : z.object(schema); + const finalSchema = isZodType(schema) ? schema : z.object(schema); return finalSchema.safeParse(params) as SafeParsedData; } @@ -87,7 +95,7 @@ export function parseQuery( ? request : getSearchParamsFromRequest(request); const params = parseSearchParams(searchParams, options?.parser); - const finalSchema = schema instanceof ZodType ? schema : z.object(schema); + const finalSchema = isZodType(schema) ? schema : z.object(schema); return finalSchema.parse(params); } catch (error) { throw createErrorResponse(options); @@ -109,7 +117,7 @@ export function parseQuerySafe( ? request : getSearchParamsFromRequest(request); const params = parseSearchParams(searchParams, options?.parser); - const finalSchema = schema instanceof ZodType ? schema : z.object(schema); + const finalSchema = isZodType(schema) ? schema : z.object(schema); return finalSchema.safeParse(params) as SafeParsedData; } @@ -132,7 +140,7 @@ export async function parseForm< ? request : await request.clone().formData(); const data = await parseFormData(formData, options?.parser); - const finalSchema = schema instanceof ZodType ? schema : z.object(schema); + const finalSchema = isZodType(schema) ? schema : z.object(schema); return finalSchema.parseAsync(data); } catch (error) { throw createErrorResponse(options); @@ -157,7 +165,7 @@ export async function parseFormSafe< ? request : await request.clone().formData(); const data = await parseFormData(formData, options?.parser); - const finalSchema = schema instanceof ZodType ? schema : z.object(schema); + const finalSchema = isZodType(schema) ? schema : z.object(schema); return finalSchema.safeParseAsync(data) as Promise>; }