convex-helpers
Advanced tools
Comparing version 0.1.6 to 0.1.7
@@ -207,7 +207,19 @@ import { ZodTypeDef, z } from "zod"; | ||
type DefaultFunctionArgs = Record<string, unknown>; | ||
type ConvexValidatorFromZodValidator<Z extends z.ZodTypeAny> = Z extends z.ZodNull ? Validator<null> : Z extends z.ZodNumber ? Validator<number> : Z extends z.ZodNaN ? Validator<number> : Z extends z.ZodBigInt ? Validator<bigint> : Z extends z.ZodBoolean ? Validator<boolean> : Z extends z.ZodString ? Validator<string> : Z extends z.ZodLiteral<infer Literal> ? Validator<Literal> : Z extends z.ZodArray<infer Inner> ? Validator<ConvexValidatorFromZodValidator<Inner>["type"][]> : Z extends z.ZodTuple<infer Inner> ? Validator<ConvexValidatorFromZodValidator<Inner[number]>["type"][]> : Z extends z.ZodObject<infer ZodShape> ? ReturnType<typeof v.object<{ | ||
[key in keyof ZodShape]: ConvexValidatorFromZodValidator<ZodShape[key]>; | ||
}>> : Z extends z.ZodUnion<infer T> ? Validator<ConvexValidatorFromZodValidator<T[number]>["type"], false, ConvexValidatorFromZodValidator<T[number]>["fieldPaths"]> : Z extends z.ZodDiscriminatedUnion<any, infer T> ? Validator<ConvexValidatorFromZodValidator<T[number]>["type"], false, ConvexValidatorFromZodValidator<T[number]>["fieldPaths"]> : Z extends z.ZodEnum<infer T> ? Validator<T[number]> : Z extends z.ZodOptional<infer Inner> ? ConvexValidatorFromZodValidator<Inner> extends Validator<infer InnerConvex, false, infer InnerFieldPaths> ? Validator<InnerConvex | undefined, true, InnerFieldPaths> : never : Z extends z.ZodDefault<infer Inner> ? ConvexValidatorFromZodValidator<Inner> extends Validator<infer InnerConvex, false, infer InnerFieldPaths> ? Validator<InnerConvex | undefined, true, InnerFieldPaths> : never : Z extends z.ZodNullable<infer Inner> ? ConvexValidatorFromZodValidator<Inner> extends Validator<infer InnerConvex, infer InnerOptional, infer InnerFieldPaths> ? Validator<null | InnerConvex, InnerOptional, InnerFieldPaths> : never : Z extends z.ZodBranded<infer Inner, any> ? ConvexValidatorFromZodValidator<Inner> : Z extends z.ZodEffects<infer Inner> ? ConvexValidatorFromZodValidator<Inner> : Z extends z.ZodLazy<infer Inner> ? ConvexValidatorFromZodValidator<Inner> : Z extends z.ZodPipeline<infer Inner, any> ? ConvexValidatorFromZodValidator<Inner> : Z extends z.ZodReadonly<infer Inner> ? ConvexValidatorFromZodValidator<Inner> : Z extends z.ZodUnknown ? Validator<any, false, string> : Z extends z.ZodAny ? Validator<any, false, string> : never; | ||
export declare function zodToConvex<Z extends z.ZodTypeAny>(zod: Z): ConvexValidatorFromZodValidator<Z>; | ||
export declare function zodToConvexValidator<Z extends ZodValidator>(zod: Z): { [k in keyof Z]: ConvexValidatorFromZodValidator<Z[k]>; }; | ||
type ConvexValidatorFromZod<Z extends z.ZodTypeAny> = Z extends Zid<infer TableName> ? Validator<GenericId<TableName>> : Z extends z.ZodString ? Validator<string> : Z extends z.ZodNumber ? Validator<number> : Z extends z.ZodNaN ? Validator<number> : Z extends z.ZodBigInt ? Validator<bigint> : Z extends z.ZodBoolean ? Validator<boolean> : Z extends z.ZodNull ? Validator<null> : Z extends z.ZodUnknown ? Validator<any, false, string> : Z extends z.ZodAny ? Validator<any, false, string> : Z extends z.ZodArray<infer Inner> ? Validator<ConvexValidatorFromZod<Inner>["type"][]> : Z extends z.ZodObject<infer ZodShape> ? ReturnType<typeof v.object<{ | ||
[key in keyof ZodShape]: ConvexValidatorFromZod<ZodShape[key]>; | ||
}>> : Z extends z.ZodUnion<infer T> ? Validator<ConvexValidatorFromZod<T[number]>["type"], false, ConvexValidatorFromZod<T[number]>["fieldPaths"]> : Z extends z.ZodDiscriminatedUnion<any, infer T> ? Validator<ConvexValidatorFromZod<T[number]>["type"], false, ConvexValidatorFromZod<T[number]>["fieldPaths"]> : Z extends z.ZodTuple<infer Inner> ? Validator<ConvexValidatorFromZod<Inner[number]>["type"][]> : Z extends z.ZodLazy<infer Inner> ? ConvexValidatorFromZod<Inner> : Z extends z.ZodLiteral<infer Literal> ? Validator<Literal> : Z extends z.ZodEnum<infer T> ? Validator<T[number]> : Z extends z.ZodEffects<infer Inner> ? ConvexValidatorFromZod<Inner> : Z extends z.ZodOptional<infer Inner> ? ConvexValidatorFromZod<Inner> extends Validator<infer InnerConvex, false, infer InnerFieldPaths> ? Validator<InnerConvex | undefined, true, InnerFieldPaths> : never : Z extends z.ZodNullable<infer Inner> ? ConvexValidatorFromZod<Inner> extends Validator<infer InnerConvex, infer InnerOptional, infer InnerFieldPaths> ? Validator<null | InnerConvex, InnerOptional, InnerFieldPaths> : never : Z extends z.ZodBranded<infer Inner, any> ? ConvexValidatorFromZod<Inner> : Z extends z.ZodDefault<infer Inner> ? ConvexValidatorFromZod<Inner> extends Validator<infer InnerConvex, false, infer InnerFieldPaths> ? Validator<InnerConvex | undefined, true, InnerFieldPaths> : never : Z extends z.ZodReadonly<infer Inner> ? ConvexValidatorFromZod<Inner> : Z extends z.ZodPipeline<infer Inner, any> ? ConvexValidatorFromZod<Inner> : never; | ||
/** | ||
* Turn a Zod validator into a Convex Validator. | ||
* @param zod Zod validator can be a Zod object, or a Zod type like `z.string()` | ||
* @returns Convex Validator (e.g. `v.string()` from "convex/values") | ||
*/ | ||
export declare function zodToConvex<Z extends z.ZodTypeAny>(zod: Z): ConvexValidatorFromZod<Z>; | ||
/** | ||
* Like zodToConvex, but it takes in a bare object, as expected by Convex | ||
* function arguments, or the argument to defineTable. | ||
* | ||
* @param zod Object with string keys and Zod validators as values | ||
* @returns Object with the same keys, but with Convex validators as values | ||
*/ | ||
export declare function zodToConvexFields<Z extends ZodValidator>(zod: Z): { [k in keyof Z]: ConvexValidatorFromZod<Z[k]>; }; | ||
interface ZidDef<TableName extends string> extends ZodTypeDef { | ||
@@ -214,0 +226,0 @@ typeName: "ConvexId"; |
@@ -75,3 +75,3 @@ import { z } from "zod"; | ||
if ("args" in fn) { | ||
const convexValidator = zodToConvexValidator(fn.args); | ||
const convexValidator = zodToConvexFields(fn.args); | ||
return query({ | ||
@@ -175,3 +175,3 @@ args: { | ||
if ("args" in fn) { | ||
const convexValidator = zodToConvexValidator(fn.args); | ||
const convexValidator = zodToConvexFields(fn.args); | ||
return mutation({ | ||
@@ -275,3 +275,3 @@ args: { | ||
if ("args" in fn) { | ||
const convexValidator = zodToConvexValidator(fn.args); | ||
const convexValidator = zodToConvexFields(fn.args); | ||
return action({ | ||
@@ -315,2 +315,7 @@ args: { | ||
} | ||
/** | ||
* Turn a Zod validator into a Convex Validator. | ||
* @param zod Zod validator can be a Zod object, or a Zod type like `z.string()` | ||
* @returns Convex Validator (e.g. `v.string()` from "convex/values") | ||
*/ | ||
export function zodToConvex(zod) { | ||
@@ -342,3 +347,3 @@ const typeName = zod._def.typeName; | ||
case "ZodObject": | ||
return v.object(zodToConvexValidator(zod._def.shape())); | ||
return v.object(zodToConvexFields(zod._def.shape())); | ||
case "ZodUnion": | ||
@@ -401,3 +406,10 @@ case "ZodDiscriminatedUnion": | ||
} | ||
export function zodToConvexValidator(zod) { | ||
/** | ||
* Like zodToConvex, but it takes in a bare object, as expected by Convex | ||
* function arguments, or the argument to defineTable. | ||
* | ||
* @param zod Object with string keys and Zod validators as values | ||
* @returns Object with the same keys, but with Convex validators as values | ||
*/ | ||
export function zodToConvexFields(zod) { | ||
return Object.fromEntries(Object.entries(zod).map(([k, v]) => [k, zodToConvex(v)])); | ||
@@ -404,0 +416,0 @@ } |
{ | ||
"name": "convex-helpers", | ||
"version": "0.1.6", | ||
"version": "0.1.7", | ||
"description": "A collection of useful code to complement the official convex package.", | ||
@@ -5,0 +5,0 @@ "exports": { |
@@ -1,2 +0,2 @@ | ||
import { zCustomQuery, zodToConvexValidator } from "./zod"; | ||
import { zCustomQuery, zodToConvexFields } from "./zod"; | ||
import { z } from "zod"; | ||
@@ -160,3 +160,3 @@ import { v } from "convex/values"; | ||
sameType( | ||
zodToConvexValidator({ | ||
zodToConvexFields({ | ||
s: z.string().email().max(5), | ||
@@ -193,3 +193,3 @@ n: z.number(), | ||
sameType( | ||
zodToConvexValidator({ | ||
zodToConvexFields({ | ||
simpleArray: z.array(z.boolean()), | ||
@@ -226,3 +226,3 @@ tuple: z.tuple([z.boolean(), z.boolean()]), | ||
sameType( | ||
zodToConvexValidator({ | ||
zodToConvexFields({ | ||
transformed: z.transformer(z.string(), { | ||
@@ -229,0 +229,0 @@ type: "refinement", |
@@ -106,3 +106,3 @@ import { ZodFirstPartyTypeKind, ZodTypeDef, z } from "zod"; | ||
if ("args" in fn) { | ||
const convexValidator = zodToConvexValidator(fn.args); | ||
const convexValidator = zodToConvexFields(fn.args); | ||
return query({ | ||
@@ -231,3 +231,3 @@ args: { | ||
if ("args" in fn) { | ||
const convexValidator = zodToConvexValidator(fn.args); | ||
const convexValidator = zodToConvexFields(fn.args); | ||
return mutation({ | ||
@@ -356,3 +356,3 @@ args: { | ||
if ("args" in fn) { | ||
const convexValidator = zodToConvexValidator(fn.args); | ||
const convexValidator = zodToConvexFields(fn.args); | ||
return action({ | ||
@@ -506,5 +506,8 @@ args: { | ||
type ConvexValidatorFromZodValidator<Z extends z.ZodTypeAny> = | ||
Z extends z.ZodNull | ||
? Validator<null> | ||
type ConvexValidatorFromZod<Z extends z.ZodTypeAny> = | ||
// Keep this in sync with zodToConvex implementation | ||
Z extends Zid<infer TableName> | ||
? Validator<GenericId<TableName>> | ||
: Z extends z.ZodString | ||
? Validator<string> | ||
: Z extends z.ZodNumber | ||
@@ -518,16 +521,14 @@ ? Validator<number> | ||
? Validator<boolean> | ||
: Z extends z.ZodString | ||
? Validator<string> | ||
: Z extends z.ZodLiteral<infer Literal> | ||
? Validator<Literal> | ||
: Z extends z.ZodNull | ||
? Validator<null> | ||
: Z extends z.ZodUnknown | ||
? Validator<any, false, string> | ||
: Z extends z.ZodAny | ||
? Validator<any, false, string> | ||
: Z extends z.ZodArray<infer Inner> | ||
? Validator<ConvexValidatorFromZodValidator<Inner>["type"][]> | ||
: Z extends z.ZodTuple<infer Inner> | ||
? Validator<ConvexValidatorFromZodValidator<Inner[number]>["type"][]> | ||
? Validator<ConvexValidatorFromZod<Inner>["type"][]> | ||
: Z extends z.ZodObject<infer ZodShape> | ||
? ReturnType< | ||
typeof v.object<{ | ||
[key in keyof ZodShape]: ConvexValidatorFromZodValidator< | ||
ZodShape[key] | ||
>; | ||
[key in keyof ZodShape]: ConvexValidatorFromZod<ZodShape[key]>; | ||
}> | ||
@@ -537,16 +538,24 @@ > | ||
? Validator< | ||
ConvexValidatorFromZodValidator<T[number]>["type"], | ||
ConvexValidatorFromZod<T[number]>["type"], | ||
false, | ||
ConvexValidatorFromZodValidator<T[number]>["fieldPaths"] | ||
ConvexValidatorFromZod<T[number]>["fieldPaths"] | ||
> | ||
: Z extends z.ZodDiscriminatedUnion<any, infer T> | ||
? Validator< | ||
ConvexValidatorFromZodValidator<T[number]>["type"], | ||
ConvexValidatorFromZod<T[number]>["type"], | ||
false, | ||
ConvexValidatorFromZodValidator<T[number]>["fieldPaths"] | ||
ConvexValidatorFromZod<T[number]>["fieldPaths"] | ||
> | ||
: Z extends z.ZodTuple<infer Inner> | ||
? Validator<ConvexValidatorFromZod<Inner[number]>["type"][]> | ||
: Z extends z.ZodLazy<infer Inner> | ||
? ConvexValidatorFromZod<Inner> | ||
: Z extends z.ZodLiteral<infer Literal> | ||
? Validator<Literal> | ||
: Z extends z.ZodEnum<infer T> | ||
? Validator<T[number]> | ||
: Z extends z.ZodEffects<infer Inner> | ||
? ConvexValidatorFromZod<Inner> | ||
: Z extends z.ZodOptional<infer Inner> | ||
? ConvexValidatorFromZodValidator<Inner> extends Validator< | ||
? ConvexValidatorFromZod<Inner> extends Validator< | ||
infer InnerConvex, | ||
@@ -558,36 +567,28 @@ false, | ||
: never | ||
: Z extends z.ZodDefault<infer Inner> // Treat like optional | ||
? ConvexValidatorFromZodValidator<Inner> extends Validator< | ||
: Z extends z.ZodNullable<infer Inner> | ||
? ConvexValidatorFromZod<Inner> extends Validator< | ||
infer InnerConvex, | ||
false, | ||
infer InnerOptional, | ||
infer InnerFieldPaths | ||
> | ||
? Validator<InnerConvex | undefined, true, InnerFieldPaths> | ||
? Validator<null | InnerConvex, InnerOptional, InnerFieldPaths> | ||
: never | ||
: Z extends z.ZodNullable<infer Inner> | ||
? ConvexValidatorFromZodValidator<Inner> extends Validator< | ||
: Z extends z.ZodBranded<infer Inner, any> | ||
? ConvexValidatorFromZod<Inner> | ||
: Z extends z.ZodDefault<infer Inner> // Treat like optional | ||
? ConvexValidatorFromZod<Inner> extends Validator< | ||
infer InnerConvex, | ||
infer InnerOptional, | ||
false, | ||
infer InnerFieldPaths | ||
> | ||
? Validator<null | InnerConvex, InnerOptional, InnerFieldPaths> | ||
? Validator<InnerConvex | undefined, true, InnerFieldPaths> | ||
: never | ||
: Z extends z.ZodBranded<infer Inner, any> | ||
? ConvexValidatorFromZodValidator<Inner> | ||
: Z extends z.ZodEffects<infer Inner> | ||
? ConvexValidatorFromZodValidator<Inner> | ||
: Z extends z.ZodLazy<infer Inner> | ||
? ConvexValidatorFromZodValidator<Inner> | ||
: Z extends z.ZodReadonly<infer Inner> | ||
? ConvexValidatorFromZod<Inner> | ||
: Z extends z.ZodPipeline<infer Inner, any> // Validate input type | ||
? ConvexValidatorFromZodValidator<Inner> | ||
: Z extends z.ZodReadonly<infer Inner> | ||
? ConvexValidatorFromZodValidator<Inner> | ||
: Z extends z.ZodUnknown | ||
? Validator<any, false, string> | ||
: Z extends z.ZodAny | ||
? Validator<any, false, string> | ||
? ConvexValidatorFromZod<Inner> | ||
: // Some that are a bit unknown | ||
// : Z extends z.ZodDate ? Validator<number> | ||
// : Z extends z.ZodSymbol ? Validator<symbol> | ||
// : Z extends z.ZodNever ? Validator<never> | ||
// : Z extends z.ZodSymbol ? Validator<symbol> | ||
// : Z extends z.ZodIntersection<infer T, infer U> | ||
@@ -611,23 +612,28 @@ // ? Validator< | ||
/** | ||
* Turn a Zod validator into a Convex Validator. | ||
* @param zod Zod validator can be a Zod object, or a Zod type like `z.string()` | ||
* @returns Convex Validator (e.g. `v.string()` from "convex/values") | ||
*/ | ||
export function zodToConvex<Z extends z.ZodTypeAny>( | ||
zod: Z | ||
): ConvexValidatorFromZodValidator<Z> { | ||
): ConvexValidatorFromZod<Z> { | ||
const typeName: ZodFirstPartyTypeKind | "ConvexId" = zod._def.typeName; | ||
switch (typeName) { | ||
case "ConvexId": | ||
return v.id(zod._def.tableName) as ConvexValidatorFromZodValidator<Z>; | ||
return v.id(zod._def.tableName) as ConvexValidatorFromZod<Z>; | ||
case "ZodString": | ||
return v.string() as ConvexValidatorFromZodValidator<Z>; | ||
return v.string() as ConvexValidatorFromZod<Z>; | ||
case "ZodNumber": | ||
case "ZodNaN": | ||
return v.number() as ConvexValidatorFromZodValidator<Z>; | ||
return v.number() as ConvexValidatorFromZod<Z>; | ||
case "ZodBigInt": | ||
return v.int64() as ConvexValidatorFromZodValidator<Z>; | ||
return v.int64() as ConvexValidatorFromZod<Z>; | ||
case "ZodBoolean": | ||
return v.boolean() as ConvexValidatorFromZodValidator<Z>; | ||
return v.boolean() as ConvexValidatorFromZod<Z>; | ||
case "ZodNull": | ||
return v.null() as ConvexValidatorFromZodValidator<Z>; | ||
return v.null() as ConvexValidatorFromZod<Z>; | ||
case "ZodAny": | ||
case "ZodUnknown": | ||
return v.any() as ConvexValidatorFromZodValidator<Z>; | ||
return v.any() as ConvexValidatorFromZod<Z>; | ||
case "ZodArray": | ||
@@ -638,7 +644,7 @@ const inner = zodToConvex(zod._def.type); | ||
} | ||
return v.array(inner) as ConvexValidatorFromZodValidator<Z>; | ||
return v.array(inner) as ConvexValidatorFromZod<Z>; | ||
case "ZodObject": | ||
return v.object( | ||
zodToConvexValidator(zod._def.shape()) | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
zodToConvexFields(zod._def.shape()) | ||
) as ConvexValidatorFromZod<Z>; | ||
case "ZodUnion": | ||
@@ -648,3 +654,3 @@ case "ZodDiscriminatedUnion": | ||
...zod._def.options.map((v: z.ZodTypeAny) => zodToConvex(v)) | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
) as ConvexValidatorFromZod<Z>; | ||
case "ZodTuple": | ||
@@ -655,11 +661,7 @@ const allTypes = zod._def.items.map((v: z.ZodTypeAny) => zodToConvex(v)); | ||
} | ||
return v.array( | ||
v.union(...allTypes) | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
return v.array(v.union(...allTypes)) as ConvexValidatorFromZod<Z>; | ||
case "ZodLazy": | ||
return zodToConvex( | ||
zod._def.getter() | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
return zodToConvex(zod._def.getter()) as ConvexValidatorFromZod<Z>; | ||
case "ZodLiteral": | ||
return v.literal(zod._def.value) as ConvexValidatorFromZodValidator<Z>; | ||
return v.literal(zod._def.value) as ConvexValidatorFromZod<Z>; | ||
case "ZodEnum": | ||
@@ -670,9 +672,9 @@ return v.union( | ||
) | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
) as ConvexValidatorFromZod<Z>; | ||
case "ZodEffects": | ||
return zodToConvex(zod._def.schema) as ConvexValidatorFromZodValidator<Z>; | ||
return zodToConvex(zod._def.schema) as ConvexValidatorFromZod<Z>; | ||
case "ZodOptional": | ||
return v.optional( | ||
zodToConvex((zod as any).unwrap()) as any | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
) as ConvexValidatorFromZod<Z>; | ||
case "ZodNullable": | ||
@@ -685,21 +687,17 @@ const nullable = zodToConvex((zod as any).unwrap()); | ||
v.union(v.null(), nullable as any) | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
) as ConvexValidatorFromZod<Z>; | ||
} | ||
return v.union(v.null(), nullable) as ConvexValidatorFromZodValidator<Z>; | ||
return v.union(v.null(), nullable) as ConvexValidatorFromZod<Z>; | ||
case "ZodBranded": | ||
return zodToConvex( | ||
(zod as any).unwrap() | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
return zodToConvex((zod as any).unwrap()) as ConvexValidatorFromZod<Z>; | ||
case "ZodDefault": | ||
const withDefault = zodToConvex(zod._def.innerType); | ||
if (withDefault.isOptional) { | ||
return withDefault as ConvexValidatorFromZodValidator<Z>; | ||
return withDefault as ConvexValidatorFromZod<Z>; | ||
} | ||
return v.optional(withDefault) as ConvexValidatorFromZodValidator<Z>; | ||
return v.optional(withDefault) as ConvexValidatorFromZod<Z>; | ||
case "ZodReadonly": | ||
return zodToConvex( | ||
zod._def.innerType | ||
) as ConvexValidatorFromZodValidator<Z>; | ||
return zodToConvex(zod._def.innerType) as ConvexValidatorFromZod<Z>; | ||
case "ZodPipeline": | ||
return zodToConvex(zod._def.in) as ConvexValidatorFromZodValidator<Z>; | ||
return zodToConvex(zod._def.in) as ConvexValidatorFromZod<Z>; | ||
default: | ||
@@ -724,6 +722,13 @@ throw new Error(`Unknown zod type: ${typeName}`); | ||
export function zodToConvexValidator<Z extends ZodValidator>(zod: Z) { | ||
/** | ||
* Like zodToConvex, but it takes in a bare object, as expected by Convex | ||
* function arguments, or the argument to defineTable. | ||
* | ||
* @param zod Object with string keys and Zod validators as values | ||
* @returns Object with the same keys, but with Convex validators as values | ||
*/ | ||
export function zodToConvexFields<Z extends ZodValidator>(zod: Z) { | ||
return Object.fromEntries( | ||
Object.entries(zod).map(([k, v]) => [k, zodToConvex(v)]) | ||
) as { [k in keyof Z]: ConvexValidatorFromZodValidator<Z[k]> }; | ||
) as { [k in keyof Z]: ConvexValidatorFromZod<Z[k]> }; | ||
} | ||
@@ -730,0 +735,0 @@ |
Sorry, the diff of this file is not supported yet
196812
4410