zodvex 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
- package/src/mapping/handlers/union.ts +15 -8
package/dist/index.js
CHANGED
|
@@ -146,7 +146,10 @@ function convertDiscriminatedUnionType(actualValidator, visited, zodToConvexInte
|
|
|
146
146
|
if (options) {
|
|
147
147
|
const opts = Array.isArray(options) ? options : Array.from(options);
|
|
148
148
|
if (opts.length >= 2) {
|
|
149
|
-
const convexOptions = opts.map((opt) =>
|
|
149
|
+
const convexOptions = opts.map((opt) => {
|
|
150
|
+
const branchVisited = new Set(visited);
|
|
151
|
+
return zodToConvexInternal2(opt, branchVisited);
|
|
152
|
+
});
|
|
150
153
|
const [first, second, ...rest] = convexOptions;
|
|
151
154
|
return values.v.union(
|
|
152
155
|
first,
|
|
@@ -166,9 +169,10 @@ function convertUnionType(actualValidator, visited, zodToConvexInternal2) {
|
|
|
166
169
|
if (options.length === 1) {
|
|
167
170
|
return zodToConvexInternal2(options[0], visited);
|
|
168
171
|
} else {
|
|
169
|
-
const convexOptions = options.map(
|
|
170
|
-
|
|
171
|
-
|
|
172
|
+
const convexOptions = options.map((opt) => {
|
|
173
|
+
const branchVisited = new Set(visited);
|
|
174
|
+
return zodToConvexInternal2(opt, branchVisited);
|
|
175
|
+
});
|
|
172
176
|
if (convexOptions.length >= 2) {
|
|
173
177
|
const [first, second, ...rest] = convexOptions;
|
|
174
178
|
return values.v.union(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ids.ts","../src/registry.ts","../src/mapping/handlers/enum.ts","../src/mapping/handlers/nullable.ts","../src/mapping/handlers/record.ts","../src/mapping/handlers/union.ts","../src/mapping/utils.ts","../src/mapping/core.ts","../src/codec.ts","../src/utils.ts","../src/custom.ts","../src/wrappers.ts","../src/builders.ts","../src/tables.ts"],"names":["z","v","zodToConvexInternal","metadata","zod","asZodType","ConvexError","NoOp","Table"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * IDs + registry for Convex + Zod v4\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n\n// Simple registry for metadata\nconst metadata = new WeakMap<z.ZodTypeAny, any>()\n\nexport const registryHelpers = {\n getMetadata: (type: z.ZodTypeAny) => metadata.get(type),\n setMetadata: (type: z.ZodTypeAny, meta: any) => metadata.set(type, meta)\n}\n\n/**\n * Create a Zod validator for a Convex Id\n *\n * Uses the string → transform → brand pattern for proper type narrowing with ctx.db.get()\n * This aligns with Zod v4 best practices and matches convex-helpers implementation\n */\nexport function zid<TableName extends string>(\n tableName: TableName\n): z.ZodType<GenericId<TableName>> & { _tableName: TableName } {\n // Use the string → transform → brand pattern (aligned with Zod v4 best practices)\n const baseSchema = z\n .string()\n .refine(val => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n })\n .transform(val => {\n // Cast to GenericId while keeping the string value\n return val as string & GenericId<TableName>\n })\n .brand(`ConvexId_${tableName}`) // Use native Zod v4 .brand() method\n // Add a human-readable marker for client-side introspection utilities\n // used in apps/native (e.g., to detect relationship fields in dynamic forms).\n .describe(`convexId:${tableName}`)\n\n // Store metadata for registry lookup so mapping can convert to v.id(tableName)\n registryHelpers.setMetadata(baseSchema, {\n isConvexId: true,\n tableName\n })\n\n // Add the tableName property for type-level detection\n const branded = baseSchema as any\n branded._tableName = tableName\n\n return branded as z.ZodType<GenericId<TableName>> & { _tableName: TableName }\n}\n\nexport type Zid<TableName extends string> = ReturnType<typeof zid<TableName>>\n","import { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Registry for base type codecs\ntype BaseCodec = {\n check: (schema: any) => boolean\n toValidator: (schema: any) => any\n fromConvex: (value: any, schema: any) => any\n toConvex: (value: any, schema: any) => any\n}\n\nconst baseCodecs: BaseCodec[] = []\n\nexport function registerBaseCodec(codec: BaseCodec): void {\n baseCodecs.unshift(codec) // Add to front for priority\n}\n\nexport function findBaseCodec(schema: any): BaseCodec | undefined {\n return baseCodecs.find(codec => codec.check(schema))\n}\n\n// Built-in codec for Date\nregisterBaseCodec({\n check: schema => schema instanceof z.ZodDate,\n toValidator: () => v.float64(),\n fromConvex: value => {\n if (typeof value === 'number') {\n return new Date(value)\n }\n return value\n },\n toConvex: value => {\n if (value instanceof Date) {\n return value.getTime()\n }\n return value\n }\n})\n\n// Helper to convert Zod's internal types to ZodTypeAny\nfunction asZodType<T>(schema: T): z.ZodTypeAny {\n return schema as unknown as z.ZodTypeAny\n}\n\n// Helper to check if a schema is a Date type through the registry\nexport function isDateSchema(schema: any): boolean {\n if (schema instanceof z.ZodDate) return true\n\n // Check through optional/nullable (these have public unwrap())\n if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable) {\n return isDateSchema(asZodType(schema.unwrap()))\n }\n\n // Cannot check transforms/pipes without _def access\n // This is a limitation of using only public APIs\n\n return false\n}\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod enum types to Convex validators\nexport function convertEnumType(actualValidator: z.ZodEnum<any>): GenericValidator {\n const options = (actualValidator as any).options\n if (options && Array.isArray(options) && options.length > 0) {\n // Filter out undefined/null and convert to Convex validators\n const validLiterals = options\n .filter((opt: any) => opt !== undefined && opt !== null)\n .map((opt: any) => v.literal(opt))\n\n if (validLiterals.length === 1) {\n const [first] = validLiterals\n return first as Validator<any, 'required', any>\n } else if (validLiterals.length >= 2) {\n const [first, second, ...rest] = validLiterals\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n } else {\n return v.any()\n }\n}\n","import type { GenericValidator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod nullable types to Convex validators\nexport function convertNullableType(\n actualValidator: z.ZodNullable<any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): { validator: GenericValidator; isOptional: boolean } {\n const innerSchema = actualValidator.unwrap()\n if (innerSchema && innerSchema instanceof z.ZodType) {\n // Check if the inner schema is optional\n if (innerSchema instanceof z.ZodOptional) {\n // For nullable(optional(T)), we want optional(union(T, null))\n const innerInnerSchema = innerSchema.unwrap()\n const innerInnerValidator = zodToConvexInternal(innerInnerSchema as z.ZodType, visited)\n return {\n validator: v.union(innerInnerValidator, v.null()),\n isOptional: true // Mark as optional so it gets wrapped later\n }\n } else {\n const innerValidator = zodToConvexInternal(innerSchema, visited)\n return {\n validator: v.union(innerValidator, v.null()),\n isOptional: false\n }\n }\n } else {\n return {\n validator: v.any(),\n isOptional: false\n }\n }\n}\n","import type { GenericValidator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod record types to Convex validators\nexport function convertRecordType(\n actualValidator: z.ZodRecord<any, any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n // In Zod v4, when z.record(z.string()) is used with one argument,\n // the argument becomes the value type and key defaults to string.\n // The valueType is stored in _def.valueType (or undefined if single arg)\n let valueType = (actualValidator as any)._def?.valueType\n\n // If valueType is undefined, it means single argument form was used\n // where the argument is actually the value type (stored in keyType)\n if (!valueType) {\n // Workaround: Zod v4 stores the value type in _def.keyType for single-argument z.record().\n // This accesses a private property as there is no public API for this in Zod v4.\n valueType = (actualValidator as any)._def?.keyType\n }\n\n if (valueType && valueType instanceof z.ZodType) {\n // First check if the Zod value type is optional before conversion\n const isZodOptional =\n valueType instanceof z.ZodOptional ||\n valueType instanceof z.ZodDefault ||\n (valueType instanceof z.ZodDefault && valueType.def.innerType instanceof z.ZodOptional)\n\n if (isZodOptional) {\n // For optional record values, we need to handle this specially\n let innerType: z.ZodTypeAny\n let recordDefaultValue: any = undefined\n let recordHasDefault = false\n\n if (valueType instanceof z.ZodDefault) {\n // Handle ZodDefault wrapper\n recordHasDefault = true\n recordDefaultValue = valueType.def.defaultValue\n const innerFromDefault = valueType.def.innerType\n if (innerFromDefault instanceof z.ZodOptional) {\n innerType = innerFromDefault.unwrap() as z.ZodTypeAny\n } else {\n innerType = innerFromDefault as z.ZodTypeAny\n }\n } else if (valueType instanceof z.ZodOptional) {\n // Direct ZodOptional\n innerType = valueType.unwrap() as z.ZodTypeAny\n } else {\n // Shouldn't happen based on isZodOptional check\n innerType = valueType as z.ZodTypeAny\n }\n\n // Convert the inner type to Convex and wrap in union with null\n const innerConvex = zodToConvexInternal(innerType, visited)\n const unionValidator = v.union(innerConvex, v.null())\n\n // Add default metadata if present\n if (recordHasDefault) {\n ;(unionValidator as any)._zodDefault = recordDefaultValue\n }\n\n return v.record(v.string(), unionValidator)\n } else {\n // Non-optional values can be converted normally\n return v.record(v.string(), zodToConvexInternal(valueType, visited))\n }\n } else {\n return v.record(v.string(), v.any())\n }\n}\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod discriminated union types to Convex validators\nexport function convertDiscriminatedUnionType(\n actualValidator: z.ZodDiscriminatedUnion<any, any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n const options =\n (actualValidator as any).def?.options || (actualValidator as any).def?.optionsMap?.values()\n if (options) {\n const opts = Array.isArray(options) ? options : Array.from(options)\n if (opts.length >= 2) {\n const convexOptions = opts.map((opt: any) => zodToConvexInternal(opt, visited)) as Validator<\n any,\n 'required',\n any\n >[]\n const [first, second, ...rest] = convexOptions\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n } else {\n return v.any()\n }\n}\n\n// Helper: Convert Zod union types to Convex validators\nexport function convertUnionType(\n actualValidator: z.ZodUnion<any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n const options = (actualValidator as any).options\n if (options && Array.isArray(options) && options.length > 0) {\n if (options.length === 1) {\n return zodToConvexInternal(options[0], visited)\n } else {\n // Convert each option recursively\n const convexOptions = options.map((opt: any) =>\n zodToConvexInternal(opt, visited)\n ) as Validator<any, 'required', any>[]\n if (convexOptions.length >= 2) {\n const [first, second, ...rest] = convexOptions\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n }\n } else {\n return v.any()\n }\n}\n","import { v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers, type Zid } from '../ids'\n\n// Helper to check if a schema is a Zid\nexport function isZid<T extends string>(schema: z.ZodType): schema is Zid<T> {\n // Check our metadata registry for ConvexId marker\n const metadata = registryHelpers.getMetadata(schema)\n return (\n metadata?.isConvexId === true && metadata?.tableName && typeof metadata.tableName === 'string'\n )\n}\n\n// union helpers\nexport function makeUnion(members: any[]): any {\n const nonNull = members.filter(Boolean)\n if (nonNull.length === 0) return v.any()\n if (nonNull.length === 1) return nonNull[0]\n return v.union(nonNull[0], nonNull[1], ...nonNull.slice(2))\n}\n\nexport function getObjectShape(obj: any): Record<string, any> {\n // Use public API .shape property for ZodObject\n if (obj instanceof z.ZodObject) {\n return obj.shape\n }\n // Fallback for edge cases\n if (obj && typeof obj === 'object' && typeof obj.shape === 'object') {\n return obj.shape as Record<string, any>\n }\n return {}\n}\n","import type { GenericValidator, PropertyValidators } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers } from '../ids'\nimport { findBaseCodec } from '../registry'\nimport {\n convertDiscriminatedUnionType,\n convertEnumType,\n convertNullableType,\n convertRecordType,\n convertUnionType\n} from './handlers'\nimport type {\n ConvexValidatorFromZod,\n ConvexValidatorFromZodFieldsAuto,\n ZodValidator\n} from './types'\nimport { getObjectShape, isZid } from './utils'\n\n// Internal conversion function using ZodType with def.type detection\nfunction zodToConvexInternal<Z extends z.ZodTypeAny>(\n zodValidator: Z,\n visited: Set<z.ZodTypeAny> = new Set()\n): ConvexValidatorFromZod<Z, 'required'> {\n // Guard against undefined/null validators (can happen with { field: undefined } in args)\n if (!zodValidator) {\n return v.any() as ConvexValidatorFromZod<Z, 'required'>\n }\n\n // Detect circular references to prevent infinite recursion\n if (visited.has(zodValidator)) {\n return v.any() as ConvexValidatorFromZod<Z, 'required'>\n }\n visited.add(zodValidator)\n\n // Check for default and optional wrappers\n let actualValidator = zodValidator\n let isOptional = false\n let defaultValue: any = undefined\n let hasDefault = false\n\n // Handle ZodDefault (which wraps ZodOptional when using .optional().default())\n // Note: We access _def properties directly because Zod v4 doesn't expose public APIs\n // for unwrapping defaults. The removeDefault() method exists but returns a new schema\n // without preserving references, which breaks our visited Set tracking.\n if (zodValidator instanceof z.ZodDefault) {\n hasDefault = true\n defaultValue = (zodValidator as any).def?.defaultValue\n actualValidator = (zodValidator as any).def?.innerType as Z\n }\n\n // Check for optional (may be wrapped inside ZodDefault)\n if (actualValidator instanceof z.ZodOptional) {\n isOptional = true\n actualValidator = actualValidator.unwrap() as Z\n\n // If the unwrapped type is ZodDefault, handle it here\n if (actualValidator instanceof z.ZodDefault) {\n hasDefault = true\n defaultValue = (actualValidator as any).def?.defaultValue\n actualValidator = (actualValidator as any).def?.innerType as Z\n }\n }\n\n let convexValidator: GenericValidator\n\n // Check for Zid first (special case)\n if (isZid(actualValidator)) {\n const metadata = registryHelpers.getMetadata(actualValidator)\n const tableName = metadata?.tableName || 'unknown'\n convexValidator = v.id(tableName)\n } else {\n // Use def.type for robust, performant type detection instead of instanceof checks.\n // Rationale:\n // 1. Performance: Single switch statement vs. cascading instanceof checks\n // 2. Completeness: def.type covers ALL Zod variants including formats (email, url, uuid, etc.)\n // 3. Future-proof: Zod's internal structure is stable; instanceof checks can miss custom types\n // 4. Precision: def.type distinguishes between semantically different types (date vs number)\n // This private API access is intentional and necessary for comprehensive type coverage.\n //\n // Compatibility: This code relies on the internal `.def.type` property of ZodType.\n // This structure has been stable across Zod v3.x and v4.x. If upgrading Zod major versions,\n // verify that `.def.type` is still present and unchanged.\n const defType = (actualValidator as any).def?.type\n\n switch (defType) {\n case 'string':\n // This catches ZodString and ALL string format types (email, url, uuid, etc.)\n convexValidator = v.string()\n break\n case 'number':\n convexValidator = v.float64()\n break\n case 'bigint':\n convexValidator = v.int64()\n break\n case 'boolean':\n convexValidator = v.boolean()\n break\n case 'date':\n convexValidator = v.float64() // Dates are stored as timestamps in Convex\n break\n case 'null':\n convexValidator = v.null()\n break\n case 'nan':\n convexValidator = v.float64()\n break\n case 'array': {\n // Use classic API: ZodArray has .element property\n if (actualValidator instanceof z.ZodArray) {\n const element = (actualValidator as any).element\n if (element && element instanceof z.ZodType) {\n convexValidator = v.array(zodToConvexInternal(element, visited))\n } else {\n convexValidator = v.array(v.any())\n }\n } else {\n convexValidator = v.array(v.any())\n }\n break\n }\n case 'object': {\n // Use classic API: ZodObject has .shape property\n if (actualValidator instanceof z.ZodObject) {\n const shape = actualValidator.shape\n const convexShape: PropertyValidators = {}\n for (const [key, value] of Object.entries(shape)) {\n if (value && value instanceof z.ZodType) {\n convexShape[key] = zodToConvexInternal(value, visited)\n }\n }\n convexValidator = v.object(convexShape)\n } else {\n convexValidator = v.object({})\n }\n break\n }\n case 'union': {\n if (actualValidator instanceof z.ZodUnion) {\n convexValidator = convertUnionType(actualValidator, visited, zodToConvexInternal)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'discriminatedUnion': {\n convexValidator = convertDiscriminatedUnionType(\n actualValidator as any,\n visited,\n zodToConvexInternal\n )\n break\n }\n case 'literal': {\n // Use classic API: ZodLiteral has .value property\n if (actualValidator instanceof z.ZodLiteral) {\n const literalValue = (actualValidator as any).value\n if (literalValue !== undefined && literalValue !== null) {\n convexValidator = v.literal(literalValue)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'enum': {\n if (actualValidator instanceof z.ZodEnum) {\n convexValidator = convertEnumType(actualValidator)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'record': {\n if (actualValidator instanceof z.ZodRecord) {\n convexValidator = convertRecordType(actualValidator, visited, zodToConvexInternal)\n } else {\n convexValidator = v.record(v.string(), v.any())\n }\n break\n }\n case 'transform':\n case 'pipe': {\n // Check for registered codec first\n const codec = findBaseCodec(actualValidator)\n if (codec) {\n convexValidator = codec.toValidator(actualValidator)\n } else {\n // Check for brand metadata\n const metadata = registryHelpers.getMetadata(actualValidator)\n if (metadata?.brand && metadata?.originalSchema) {\n // For branded types created by our zBrand function, use the original schema\n convexValidator = zodToConvexInternal(metadata.originalSchema, visited)\n } else {\n // For non-registered transforms, return v.any()\n convexValidator = v.any()\n }\n }\n break\n }\n case 'nullable': {\n if (actualValidator instanceof z.ZodNullable) {\n const result = convertNullableType(actualValidator, visited, zodToConvexInternal)\n convexValidator = result.validator\n if (result.isOptional) {\n isOptional = true\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'tuple': {\n // Handle tuple types as objects with numeric keys\n if (actualValidator instanceof z.ZodTuple) {\n const items = (actualValidator as any).def?.items as z.ZodTypeAny[] | undefined\n if (items && items.length > 0) {\n const convexShape: PropertyValidators = {}\n items.forEach((item, index) => {\n convexShape[`_${index}`] = zodToConvexInternal(item, visited)\n })\n convexValidator = v.object(convexShape)\n } else {\n convexValidator = v.object({})\n }\n } else {\n convexValidator = v.object({})\n }\n break\n }\n case 'lazy': {\n // Handle lazy schemas by resolving them\n // Circular references are protected by the visited set check at function start\n if (actualValidator instanceof z.ZodLazy) {\n try {\n const getter = (actualValidator as any).def?.getter\n if (getter) {\n const resolvedSchema = getter()\n if (resolvedSchema && resolvedSchema instanceof z.ZodType) {\n convexValidator = zodToConvexInternal(resolvedSchema, visited)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n } catch {\n // If resolution fails, fall back to 'any'\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'any':\n // Handle z.any() directly\n convexValidator = v.any()\n break\n case 'unknown':\n // Handle z.unknown() as any\n convexValidator = v.any()\n break\n case 'undefined':\n case 'void':\n case 'never':\n // These types don't have good Convex equivalents\n convexValidator = v.any()\n break\n case 'intersection':\n // Can't properly handle intersections\n convexValidator = v.any()\n break\n default:\n // For any unrecognized def.type, return v.any()\n // No instanceof fallbacks - keep it simple and performant\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[zodvex] Unrecognized Zod type \"${defType}\" encountered. Falling back to v.any().`,\n 'Schema:',\n actualValidator\n )\n }\n convexValidator = v.any()\n break\n }\n }\n\n // For optional or default fields, always use v.optional()\n const finalValidator = isOptional || hasDefault ? v.optional(convexValidator) : convexValidator\n\n // Add metadata if there's a default value\n if (hasDefault && typeof finalValidator === 'object' && finalValidator !== null) {\n ;(finalValidator as any)._zodDefault = defaultValue\n }\n\n return finalValidator as ConvexValidatorFromZod<Z, 'required'>\n}\n\nexport function zodToConvex<Z extends z.ZodTypeAny | ZodValidator>(\n zod: Z\n): Z extends z.ZodTypeAny\n ? ConvexValidatorFromZod<Z, 'required'>\n : Z extends ZodValidator\n ? ConvexValidatorFromZodFieldsAuto<Z>\n : never {\n if (typeof zod === 'object' && zod !== null && !(zod instanceof z.ZodType)) {\n return zodToConvexFields(zod as ZodValidator) as any\n }\n\n return zodToConvexInternal(zod as z.ZodTypeAny) as any\n}\n\nexport function zodToConvexFields<Z extends z.ZodRawShape>(\n zod: Z\n): ConvexValidatorFromZodFieldsAuto<Z> {\n // If it's a ZodObject, extract the shape\n const fields = zod instanceof z.ZodObject ? zod.shape : zod\n\n // Build the result object directly to preserve types\n const result: any = {}\n for (const [key, value] of Object.entries(fields)) {\n result[key] = zodToConvexInternal(value as z.ZodTypeAny)\n }\n\n return result as ConvexValidatorFromZodFieldsAuto<Z>\n}\n","import { z } from 'zod'\nimport { zodToConvex } from './mapping'\nimport { findBaseCodec, isDateSchema } from './registry'\n\n// Helper to convert Zod's internal types to ZodTypeAny\nfunction asZodType<T>(schema: T): z.ZodTypeAny {\n return schema as unknown as z.ZodTypeAny\n}\n\nexport type ConvexCodec<T> = {\n validator: any\n encode: (value: T) => any\n decode: (value: any) => T\n pick: <K extends keyof T>(keys: K[]) => ConvexCodec<Pick<T, K>>\n}\n\nexport function convexCodec<T>(schema: z.ZodType<T>): ConvexCodec<T> {\n const validator = zodToConvex(schema)\n\n return {\n validator,\n encode: (value: T) => toConvexJS(schema, value),\n decode: (value: any) => fromConvexJS(value, schema),\n pick: <K extends keyof T>(keys: K[] | Record<K, true>) => {\n if (!(schema instanceof z.ZodObject)) {\n throw new Error('pick() can only be called on object schemas')\n }\n // Handle both array and object formats\n const pickObj = Array.isArray(keys)\n ? keys.reduce((acc, k) => ({ ...acc, [k]: true }), {} as any)\n : keys\n const pickedSchema = schema.pick(pickObj as any)\n return convexCodec(pickedSchema) as ConvexCodec<Pick<T, K>>\n }\n }\n}\n\n// Convert JS values to Convex-safe JSON (handle Dates, remove undefined)\nexport function toConvexJS(schema?: any, value?: any): any {\n // If no schema provided, do basic conversion\n if (!schema || arguments.length === 1) {\n value = schema\n return basicToConvex(value)\n }\n\n // Use schema-aware conversion\n return schemaToConvex(value, schema)\n}\n\nfunction basicToConvex(value: any): any {\n if (value === undefined) return undefined\n if (value === null) return null\n if (value instanceof Date) return value.getTime()\n\n if (Array.isArray(value)) {\n return value.map(basicToConvex)\n }\n\n if (value && typeof value === 'object') {\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = basicToConvex(v)\n }\n }\n return result\n }\n\n return value\n}\n\nfunction schemaToConvex(value: any, schema: any): any {\n if (value === undefined || value === null) return value\n\n // Check base codec registry first\n const codec = findBaseCodec(schema)\n if (codec) {\n return codec.toConvex(value, schema)\n }\n\n // Handle wrapper types\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n schema instanceof z.ZodDefault\n ) {\n // Use unwrap() method which is available on these types\n const inner = schema.unwrap()\n return schemaToConvex(value, asZodType(inner))\n }\n\n // Handle Date specifically\n if (schema instanceof z.ZodDate && value instanceof Date) {\n return value.getTime()\n }\n\n // Handle arrays\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value\n return value.map(item => schemaToConvex(item, schema.element))\n }\n\n // Handle objects\n if (schema instanceof z.ZodObject) {\n if (!value || typeof value !== 'object') return value\n const shape = schema.shape\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = shape[k] ? schemaToConvex(v, shape[k]) : basicToConvex(v)\n }\n }\n return result\n }\n\n // Handle unions\n if (schema instanceof z.ZodUnion) {\n // Try each option to see which one matches\n for (const option of schema.options) {\n try {\n ;(option as any).parse(value) // Validate against this option\n return schemaToConvex(value, option)\n } catch {\n // Try next option\n }\n }\n }\n\n // Handle records\n if (schema instanceof z.ZodRecord) {\n if (!value || typeof value !== 'object') return value\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = schemaToConvex(v, schema.valueType)\n }\n }\n return result\n }\n\n // Default passthrough\n return basicToConvex(value)\n}\n\n// Convert Convex JSON back to JS values (handle timestamps -> Dates)\nexport function fromConvexJS(value: any, schema: any): any {\n if (value === undefined || value === null) return value\n\n // Check base codec registry first\n const codec = findBaseCodec(schema)\n if (codec) {\n return codec.fromConvex(value, schema)\n }\n\n // Handle wrapper types\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n schema instanceof z.ZodDefault\n ) {\n // Use unwrap() method which is available on these types\n const inner = schema.unwrap()\n return fromConvexJS(value, asZodType(inner))\n }\n\n // Handle Date specifically\n if (schema instanceof z.ZodDate && typeof value === 'number') {\n return new Date(value)\n }\n\n // Check if schema is a Date through effects/transforms\n if (isDateSchema(schema) && typeof value === 'number') {\n return new Date(value)\n }\n\n // Handle arrays\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value\n return value.map(item => fromConvexJS(item, schema.element))\n }\n\n // Handle objects\n if (schema instanceof z.ZodObject) {\n if (!value || typeof value !== 'object') return value\n const shape = schema.shape\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = shape[k] ? fromConvexJS(v, shape[k]) : v\n }\n return result\n }\n\n // Handle unions\n if (schema instanceof z.ZodUnion) {\n // Try to decode with each option\n for (const option of schema.options) {\n try {\n const decoded = fromConvexJS(value, option)\n ;(option as any).parse(decoded) // Validate the decoded value\n return decoded\n } catch {\n // Try next option\n }\n }\n }\n\n // Handle records\n if (schema instanceof z.ZodRecord) {\n if (!value || typeof value !== 'object') return value\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = fromConvexJS(v, schema.valueType)\n }\n return result\n }\n\n // Handle effects and transforms\n // Note: ZodPipe doesn't exist in Zod v4, only ZodTransform\n if (schema instanceof z.ZodTransform) {\n // Cannot access inner schema without _def, return value as-is\n return value\n }\n\n return value\n}\n","import { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { getObjectShape } from './mapping'\n\nexport function pick<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (key in obj) result[key] = obj[key]\n }\n return result\n}\n\n// Typed identity helper for returns schemas\nexport function returnsAs<R extends z.ZodTypeAny>() {\n return <T extends z.input<R>>(v: T) => v\n}\n\n// Format ZodError issues into a compact, consistent structure\nexport function formatZodIssues(\n error: z.ZodError,\n context?: 'args' | 'returns' | 'input' | 'output' | 'codec'\n) {\n return {\n error: 'ZodValidationError',\n context,\n issues: error.issues.map(issue => ({\n path: Array.isArray(issue.path) ? issue.path.join('.') : String(issue.path ?? ''),\n code: issue.code,\n message: issue.message\n })),\n // Keep a flattened snapshot for easier debugging without cyclic refs\n flatten: JSON.parse(JSON.stringify(error.flatten?.() ?? {}))\n }\n}\n\n// Handle Zod validation errors consistently across all wrappers\n// Throws a ConvexError with formatted issues if the error is a ZodError, otherwise re-throws\nexport function handleZodValidationError(\n e: unknown,\n context: 'args' | 'returns' | 'input' | 'output' | 'codec'\n): never {\n if (e instanceof z.ZodError) {\n throw new ConvexError(formatZodIssues(e, context))\n }\n throw e\n}\n\n// Helper: standard Convex paginate() result schema\nexport function zPaginated<T extends z.ZodTypeAny>(item: T) {\n return z.object({\n page: z.array(item),\n isDone: z.boolean(),\n continueCursor: z.string().nullable().optional()\n })\n}\n\n/**\n * Maps Date fields to number fields for docSchema generation.\n * Handles Date, Date.optional(), Date.nullable(), and Date.default() cases.\n * Returns the original field for non-Date types.\n */\nexport function mapDateFieldToNumber(field: z.ZodTypeAny): z.ZodTypeAny {\n // Direct Date field\n if (field instanceof z.ZodDate) {\n return z.number()\n }\n\n // Optional Date field\n if (field instanceof z.ZodOptional && field.unwrap() instanceof z.ZodDate) {\n return z.number().optional()\n }\n\n // Nullable Date field\n if (field instanceof z.ZodNullable && field.unwrap() instanceof z.ZodDate) {\n return z.number().nullable()\n }\n\n // Date with default value\n if (field instanceof z.ZodDefault) {\n const inner = field.removeDefault()\n if (inner instanceof z.ZodDate) {\n return z.number().optional()\n }\n }\n\n // Non-Date field - return as-is\n return field\n}\n\n// Schema picking utilities (moved from pick.ts for consolidation)\ntype Mask = readonly string[] | Record<string, boolean | 1 | true>\n\nfunction toKeys(mask: Mask): string[] {\n if (Array.isArray(mask)) return mask.map(String)\n return Object.keys(mask).filter(k => !!(mask as any)[k])\n}\n\n/**\n * Returns a plain shape object containing only the selected fields.\n * Accepts either a ZodObject or a raw shape object.\n */\nexport function pickShape(\n schemaOrShape: z.ZodObject<any> | Record<string, any>,\n mask: Mask\n): Record<string, any> {\n const keys = toKeys(mask)\n const shape =\n schemaOrShape instanceof z.ZodObject ? getObjectShape(schemaOrShape) : schemaOrShape || {}\n\n const out: Record<string, any> = {}\n for (const k of keys) {\n if (k in shape) out[k] = (shape as any)[k]\n }\n return out\n}\n\n// Builds a fresh Zod object from the selected fields (avoids Zod's .pick())\nexport function safePick(schema: z.ZodObject<any>, mask: Mask): z.ZodObject<any> {\n return z.object(pickShape(schema, mask))\n}\n\n/**\n * Convenience: omit a set of keys by building the complement.\n * Avoids using Zod's .omit() which can cause type depth issues.\n */\nexport function safeOmit(schema: z.ZodObject<any>, mask: Mask): z.ZodObject<any> {\n const shape = getObjectShape(schema)\n const omit = new Set(toKeys(mask))\n const keep = Object.keys(shape).filter(k => !omit.has(k))\n const picked = pickShape(schema, keep)\n return z.object(picked)\n}\n","import {\n type ActionBuilder,\n type ArgsArrayToObject,\n type DefaultFunctionArgs,\n type FunctionVisibility,\n type GenericActionCtx,\n type GenericDataModel,\n type GenericMutationCtx,\n type GenericQueryCtx,\n type MutationBuilder,\n type QueryBuilder\n} from 'convex/server'\nimport { ConvexError, type PropertyValidators } from 'convex/values'\nimport { type Customization, NoOp } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { fromConvexJS, toConvexJS } from './codec'\nimport { type ZodValidator, zodToConvex, zodToConvexFields } from './mapping'\nimport type { ExtractCtx, ExtractVisibility } from './types'\nimport { handleZodValidationError, pick } from './utils'\n\n// Type helpers for args transformation (from zodV3 example)\ntype OneArgArray<ArgsObject extends DefaultFunctionArgs = DefaultFunctionArgs> = [ArgsObject]\n\n// Simple type conversion from a Convex validator to a Zod validator return type\ntype NullToUndefinedOrNull<T> = T extends null ? T | undefined | void : T\ntype Returns<T> = Promise<NullToUndefinedOrNull<T>> | NullToUndefinedOrNull<T>\n\n// The return value before it's been validated: returned by the handler\ntype ReturnValueInput<ReturnsValidator extends z.ZodTypeAny | ZodValidator | void> = [\n ReturnsValidator\n] extends [z.ZodTypeAny]\n ? Returns<z.input<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.input<z.ZodObject<ReturnsValidator>>>\n : any\n\n// The return value after it's been validated: returned to the client\ntype ReturnValueOutput<ReturnsValidator extends z.ZodTypeAny | ZodValidator | void> = [\n ReturnsValidator\n] extends [z.ZodTypeAny]\n ? Returns<z.output<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.output<z.ZodObject<ReturnsValidator>>>\n : any\n\n// The args before they've been validated: passed from the client\ntype ArgsInput<ArgsValidator extends ZodValidator | z.ZodObject<any> | void> = [\n ArgsValidator\n] extends [z.ZodObject<any>]\n ? [z.input<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.input<z.ZodObject<ArgsValidator>>]\n : OneArgArray\n\n// The args after they've been validated: passed to the handler\ntype ArgsOutput<ArgsValidator extends ZodValidator | z.ZodObject<any> | void> = [\n ArgsValidator\n] extends [z.ZodObject<any>]\n ? [z.output<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.output<z.ZodObject<ArgsValidator>>]\n : OneArgArray\n\ntype Overwrite<T, U> = Omit<T, keyof U> & U\n\n// Hack to simplify how TypeScript renders object types\ntype Expand<ObjectType extends Record<any, any>> = ObjectType extends Record<any, any>\n ? {\n [Key in keyof ObjectType]: ObjectType[Key]\n }\n : never\n\ntype ArgsForHandlerType<\n OneOrZeroArgs extends [] | [Record<string, any>],\n CustomMadeArgs extends Record<string, any>\n> = CustomMadeArgs extends Record<string, never>\n ? OneOrZeroArgs\n : OneOrZeroArgs extends [infer A]\n ? [Expand<A & CustomMadeArgs>]\n : [CustomMadeArgs]\n\n// Helper type for function registration (from zodV3)\ntype Registration<\n FuncType extends 'query' | 'mutation' | 'action',\n Visibility extends FunctionVisibility,\n Args extends DefaultFunctionArgs,\n Output\n> = FuncType extends 'query'\n ? import('convex/server').RegisteredQuery<Visibility, Args, Output>\n : FuncType extends 'mutation'\n ? import('convex/server').RegisteredMutation<Visibility, Args, Output>\n : import('convex/server').RegisteredAction<Visibility, Args, Output>\n\n/**\n * A builder that customizes a Convex function, whether or not it validates\n * arguments. If the customization requires arguments, however, the resulting\n * builder will require argument validation too.\n *\n * This is our own Zod-aware CustomBuilder type that properly handles Zod validators.\n */\nexport type CustomBuilder<\n FuncType extends 'query' | 'mutation' | 'action',\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n InputCtx,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any>\n> = {\n <\n ArgsValidator extends ZodValidator | z.ZodObject<any> | void,\n ReturnsZodValidator extends z.ZodTypeAny | ZodValidator | void = void,\n ReturnValue extends ReturnValueInput<ReturnsZodValidator> = any\n >(\n func:\n | ({\n /**\n * Specify the arguments to the function as a Zod validator.\n */\n args?: ArgsValidator\n handler: (\n ctx: Overwrite<InputCtx, CustomCtx>,\n ...args: ArgsForHandlerType<ArgsOutput<ArgsValidator>, CustomMadeArgs>\n ) => ReturnValue\n /**\n * Validates the value returned by the function.\n * Note: you can't pass an object directly without wrapping it\n * in `z.object()`.\n */\n returns?: ReturnsZodValidator\n /**\n * If true, the function will not be validated by Convex,\n * in case you're seeing performance issues with validating twice.\n */\n skipConvexValidation?: boolean\n } & {\n [key in keyof ExtraArgs as key extends\n | 'args'\n | 'handler'\n | 'skipConvexValidation'\n | 'returns'\n ? never\n : key]: ExtraArgs[key]\n })\n | {\n (\n ctx: Overwrite<InputCtx, CustomCtx>,\n ...args: ArgsForHandlerType<ArgsOutput<ArgsValidator>, CustomMadeArgs>\n ): ReturnValue\n }\n ): Registration<\n FuncType,\n Visibility,\n ArgsArrayToObject<\n CustomArgsValidator extends Record<string, never>\n ? ArgsInput<ArgsValidator>\n : ArgsInput<ArgsValidator> extends [infer A]\n ? [Expand<A & import('convex/values').ObjectType<CustomArgsValidator>>]\n : [import('convex/values').ObjectType<CustomArgsValidator>]\n >,\n ReturnsZodValidator extends void ? ReturnValue : ReturnValueOutput<ReturnsZodValidator>\n >\n}\n\nexport function customFnBuilder<\n Ctx extends Record<string, any>,\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n builder: Builder,\n customization: Customization<Ctx, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n const customInput = customization.input ?? NoOp.input\n const inputArgs = customization.args ?? NoOp.args\n\n return function customBuilder(fn: any): any {\n const { args, handler = fn, returns: maybeObject, ...extra } = fn\n\n const returns =\n maybeObject && !(maybeObject instanceof z.ZodType) ? z.object(maybeObject) : maybeObject\n const returnValidator =\n returns && !fn.skipConvexValidation ? { returns: zodToConvex(returns) } : undefined\n\n if (args && !fn.skipConvexValidation) {\n let argsValidator = args\n let argsSchema: z.ZodObject<any>\n\n if (argsValidator instanceof z.ZodType) {\n if (argsValidator instanceof z.ZodObject) {\n argsSchema = argsValidator\n argsValidator = argsValidator.shape // Get the raw shape for zodToConvexFields\n } else {\n throw new Error(\n 'Unsupported non-object Zod schema for args; please provide an args schema using z.object({...}), e.g. z.object({ foo: z.string() })'\n )\n }\n } else {\n // It's a raw shape object with Zod validators as values\n argsSchema = z.object(argsValidator)\n }\n\n const convexValidator = zodToConvexFields(argsValidator)\n return builder({\n args: { ...convexValidator, ...inputArgs },\n ...returnValidator,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added: any = await customInput(\n ctx,\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )\n const argKeys = Object.keys(argsValidator)\n const rawArgs = pick(allArgs, argKeys)\n const decoded = fromConvexJS(rawArgs, argsSchema)\n const parsed = argsSchema.safeParse(decoded)\n if (!parsed.success) {\n handleZodValidationError(parsed.error, 'args')\n }\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const baseArgs = parsed.data as Record<string, unknown>\n const addedArgs = (added?.args as Record<string, unknown>) ?? {}\n const finalArgs = { ...baseArgs, ...addedArgs }\n const ret = await handler(finalCtx, finalArgs)\n if (returns && !fn.skipConvexValidation) {\n let validated: any\n try {\n validated = (returns as z.ZodTypeAny).parse(ret)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n if (added?.onSuccess) {\n await added.onSuccess({\n ctx,\n args: parsed.data,\n result: validated\n })\n }\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: parsed.data, result: ret })\n }\n return ret\n }\n })\n }\n return builder({\n args: inputArgs,\n ...returnValidator,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added: any = await customInput(\n ctx,\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const baseArgs = allArgs as Record<string, unknown>\n const addedArgs = (added?.args as Record<string, unknown>) ?? {}\n const finalArgs = { ...baseArgs, ...addedArgs }\n const ret = await handler(finalCtx, finalArgs)\n if (returns && !fn.skipConvexValidation) {\n let validated: any\n try {\n validated = (returns as z.ZodTypeAny).parse(ret)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: allArgs, result: validated })\n }\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: allArgs, result: ret })\n }\n return ret\n }\n })\n }\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n DataModel extends GenericDataModel,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<DataModel, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n GenericQueryCtx<DataModel>,\n Visibility,\n ExtraArgs\n>\n\n// Overload 2: No constraint + decoupled ctx\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<any, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n any,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<any, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n // Implementation deliberately uses 'any' ctx to preserve overload behavior\n // while avoiding a GenericDataModel constraint at the implementation level.\n return customFnBuilder<\n any,\n typeof query,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtraArgs\n >(query as any, customization as any) as any\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n _Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n mutation as any,\n customization as any\n ) as any\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n _Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n action as any,\n customization as any\n ) as any\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { fromConvexJS, toConvexJS } from './codec'\nimport { getObjectShape, zodToConvex, zodToConvexFields } from './mapping'\n// Typing helpers to keep handler args/returns precise without deep remapping\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { handleZodValidationError } from './utils'\n\n// Cache to avoid re-checking the same schema\nconst customCheckCache = new WeakMap<z.ZodTypeAny, boolean>()\n\n/**\n * Check if a schema contains z.custom types (runtime check).\n * Includes depth limit to prevent stack overflow on deeply nested schemas.\n */\nfunction containsCustom(schema: z.ZodTypeAny, maxDepth = 50, currentDepth = 0): boolean {\n // Check cache first\n const cached = customCheckCache.get(schema)\n if (cached !== undefined) {\n return cached\n }\n\n // Prevent stack overflow on deeply nested schemas\n if (currentDepth > maxDepth) {\n return false\n }\n\n let result = false\n\n // Use _def.typeName instead of instanceof since ZodCustom is not exported in Zod v4\n if ((schema as any)._def?.typeName === 'ZodCustom') {\n result = true\n } else if (schema instanceof z.ZodUnion) {\n result = (schema.options as z.ZodTypeAny[]).some(opt =>\n containsCustom(opt, maxDepth, currentDepth + 1)\n )\n } else if (schema instanceof z.ZodOptional) {\n result = containsCustom(schema.unwrap() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n } else if (schema instanceof z.ZodNullable) {\n result = containsCustom(schema.unwrap() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n } else if (schema instanceof z.ZodDefault) {\n result = containsCustom(schema.removeDefault() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n }\n\n customCheckCache.set(schema, result)\n return result\n}\n\nexport function zQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n query: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredQuery<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n // Single schema → normalize to { value }\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return query({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalQuery: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredQuery<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zQuery(internalQuery, input, handler, options)\n}\n\nexport function zMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n mutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredMutation<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return mutation({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalMutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredMutation<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zMutation(internalMutation, input, handler, options)\n}\n\nexport function zAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n action: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredAction<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return action({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalAction: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredAction<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zAction(internalAction, input, handler, options) as any\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport type { PropertyValidators } from 'convex/values'\nimport type { Customization } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { type CustomBuilder, customFnBuilder } from './custom'\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { zAction, zMutation, zQuery } from './wrappers'\n\n/**\n * Creates a reusable query builder from a Convex query builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { query } from './_generated/server'\n * import { zQueryBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const zq = zQueryBuilder(query)\n *\n * // Use it with Convex-style object syntax\n * export const getUser = zq({\n * args: { id: z.string() },\n * handler: async (ctx, { id }) => {\n * return ctx.db.get(id)\n * }\n * })\n * ```\n */\nexport function zQueryBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredQuery<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zQuery(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a reusable mutation builder from a Convex mutation builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { mutation } from './_generated/server'\n * import { zMutationBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const zm = zMutationBuilder(mutation)\n *\n * // Use it with Convex-style object syntax\n * export const updateUser = zm({\n * args: { id: z.string(), name: z.string() },\n * handler: async (ctx, { id, name }) => {\n * return ctx.db.patch(id, { name })\n * }\n * })\n * ```\n */\nexport function zMutationBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredMutation<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zMutation(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a reusable action builder from a Convex action builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { action } from './_generated/server'\n * import { zActionBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const za = zActionBuilder(action)\n *\n * // Use it with Convex-style object syntax\n * export const sendEmail = za({\n * args: { to: z.string().email(), subject: z.string() },\n * handler: async (ctx, { to, subject }) => {\n * // Send email\n * }\n * })\n * ```\n */\nexport function zActionBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredAction<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zAction(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a custom query builder with context injection from a Convex query builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your queries.\n *\n * @example\n * ```ts\n * import { type QueryCtx, query } from './_generated/server'\n * import { zCustomQueryBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authQuery = zCustomQueryBuilder(\n * query,\n * customCtx(async (ctx: QueryCtx) => {\n * const user = await getUserOrThrow(ctx)\n * return { user }\n * })\n * )\n *\n * // Use it with automatic user injection\n * export const getMyProfile = authQuery({\n * args: {},\n * handler: async (ctx) => {\n * // ctx.user is automatically available\n * return ctx.db.get(ctx.user._id)\n * }\n * })\n * ```\n */\nexport function zCustomQueryBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n query as any,\n customization as any\n ) as any\n}\n\n/**\n * Creates a custom mutation builder with context injection from a Convex mutation builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your mutations.\n *\n * @example\n * ```ts\n * import { type MutationCtx, mutation } from './_generated/server'\n * import { zCustomMutationBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authMutation = zCustomMutationBuilder(\n * mutation,\n * customCtx(async (ctx: MutationCtx) => {\n * const user = await getUserOrThrow(ctx)\n * return { user }\n * })\n * )\n *\n * // Use it with automatic user injection\n * export const updateProfile = authMutation({\n * args: { name: z.string() },\n * handler: async (ctx, { name }) => {\n * // ctx.user is automatically available\n * await ctx.db.patch(ctx.user._id, { name })\n * }\n * })\n * ```\n */\nexport function zCustomMutationBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n mutation as any,\n customization as any\n ) as any\n}\n\n/**\n * Creates a custom action builder with context injection from a Convex action builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your actions.\n *\n * @example\n * ```ts\n * import { type ActionCtx, action } from './_generated/server'\n * import { zCustomActionBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authAction = zCustomActionBuilder(\n * action,\n * customCtx(async (ctx: ActionCtx) => {\n * const identity = await ctx.auth.getUserIdentity()\n * if (!identity) throw new Error('Unauthorized')\n * return { userId: identity.subject }\n * })\n * )\n *\n * // Use it with automatic auth injection\n * export const sendEmail = authAction({\n * args: { to: z.string().email() },\n * handler: async (ctx, { to }) => {\n * // ctx.userId is automatically available\n * await sendEmailService(to, ctx.userId)\n * }\n * })\n * ```\n */\nexport function zCustomActionBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n action as any,\n customization as any\n ) as any\n}\n","import type { GenericId } from 'convex/values'\nimport { Table } from 'convex-helpers/server'\nimport { z } from 'zod'\nimport { zid } from './ids'\nimport { type ConvexValidatorFromZodFieldsAuto, zodToConvexFields } from './mapping'\n\n// Helper to create a Zod schema for a Convex document\nexport function zodDoc<\n TableName extends string,\n Shape extends z.ZodRawShape,\n Schema extends z.ZodObject<Shape>\n>(\n tableName: TableName,\n schema: Schema\n): z.ZodObject<\n Shape & {\n _id: ReturnType<typeof zid<TableName>>\n _creationTime: z.ZodNumber\n }\n> {\n // Use extend to preserve the original schema's type information\n return schema.extend({\n _id: zid(tableName),\n _creationTime: z.number()\n }) as any\n}\n\n// Helper to create nullable doc schema\nexport function zodDocOrNull<\n TableName extends string,\n Shape extends z.ZodRawShape,\n Schema extends z.ZodObject<Shape>\n>(tableName: TableName, schema: Schema) {\n return z.union([zodDoc(tableName, schema), z.null()])\n}\n\n/**\n * Defines a Convex table using a raw Zod shape (an object mapping field names to Zod types).\n *\n * This function intentionally accepts a raw shape instead of a ZodObject instance.\n * Accepting raw shapes allows TypeScript to infer field types more accurately and efficiently,\n * leading to better type inference and performance throughout the codebase.\n * This architectural decision is important for projects that rely heavily on type safety and\n * developer experience, as it avoids the type erasure that can occur when using ZodObject directly.\n *\n * Returns the Table definition along with Zod schemas for documents and arrays.\n *\n * @param name - The table name\n * @param shape - A raw object mapping field names to Zod validators\n * @returns A Table with attached shape, zDoc schema, and docArray helper\n *\n * @example\n * ```ts\n * const Users = zodTable('users', {\n * name: z.string(),\n * email: z.string().email(),\n * age: z.number().optional()\n * })\n *\n * // Use in schema\n * export default defineSchema({ users: Users.table })\n *\n * // Use for return types\n * export const getUsers = zQuery(query, {},\n * async (ctx) => ctx.db.query('users').collect(),\n * { returns: Users.docArray }\n * )\n * ```\n */\nexport function zodTable<TableName extends string, Shape extends Record<string, z.ZodTypeAny>>(\n name: TableName,\n shape: Shape\n) {\n // Convert fields with proper types\n const convexFields = zodToConvexFields(shape) as ConvexValidatorFromZodFieldsAuto<Shape>\n\n // Create the Table from convex-helpers with explicit type\n const table = Table<ConvexValidatorFromZodFieldsAuto<Shape>, TableName>(name, convexFields)\n\n // Create zDoc schema with system fields\n const zDoc = zodDoc(name, z.object(shape))\n\n // Create docArray helper for return types\n const docArray = z.array(zDoc)\n\n // Attach everything for comprehensive usage\n return Object.assign(table, {\n shape,\n zDoc,\n docArray\n }) as typeof table & {\n shape: Shape\n zDoc: z.ZodObject<\n Shape & {\n _id: ReturnType<typeof zid<TableName>>\n _creationTime: z.ZodNumber\n }\n >\n docArray: z.ZodArray<typeof zDoc>\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ids.ts","../src/registry.ts","../src/mapping/handlers/enum.ts","../src/mapping/handlers/nullable.ts","../src/mapping/handlers/record.ts","../src/mapping/handlers/union.ts","../src/mapping/utils.ts","../src/mapping/core.ts","../src/codec.ts","../src/utils.ts","../src/custom.ts","../src/wrappers.ts","../src/builders.ts","../src/tables.ts"],"names":["z","v","zodToConvexInternal","metadata","zod","asZodType","ConvexError","NoOp","Table"],"mappings":";;;;;;;AAQA,IAAM,QAAA,uBAAe,OAAA,EAA2B;AAEzC,IAAM,eAAA,GAAkB;AAAA,EAC7B,WAAA,EAAa,CAAC,IAAA,KAAuB,QAAA,CAAS,IAAI,IAAI,CAAA;AAAA,EACtD,aAAa,CAAC,IAAA,EAAoB,SAAc,QAAA,CAAS,GAAA,CAAI,MAAM,IAAI;AACzE;AAQO,SAAS,IACd,SAAA,EAC6D;AAE7D,EAAA,MAAM,UAAA,GAAaA,KAAA,CAChB,MAAA,EAAO,CACP,MAAA,CAAO,CAAA,GAAA,KAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AAAA,IACxD,OAAA,EAAS,yBAAyB,SAAS,CAAA,CAAA;AAAA,GAC5C,CAAA,CACA,SAAA,CAAU,CAAA,GAAA,KAAO;AAEhB,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,SAAA,EAAY,SAAS,EAAE,CAAA,CAG7B,QAAA,CAAS,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE,CAAA;AAGnC,EAAA,eAAA,CAAgB,YAAY,UAAA,EAAY;AAAA,IACtC,UAAA,EAAY,IAAA;AAAA,IACZ;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,UAAA;AAChB,EAAA,OAAA,CAAQ,UAAA,GAAa,SAAA;AAErB,EAAA,OAAO,OAAA;AACT;ACvCA,IAAM,aAA0B,EAAC;AAE1B,SAAS,kBAAkB,KAAA,EAAwB;AACxD,EAAA,UAAA,CAAW,QAAQ,KAAK,CAAA;AAC1B;AAEO,SAAS,cAAc,MAAA,EAAoC;AAChE,EAAA,OAAO,WAAW,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACrD;AAGA,iBAAA,CAAkB;AAAA,EAChB,KAAA,EAAO,CAAA,MAAA,KAAU,MAAA,YAAkBA,KAAAA,CAAE,OAAA;AAAA,EACrC,WAAA,EAAa,MAAMC,QAAA,CAAE,OAAA,EAAQ;AAAA,EAC7B,YAAY,CAAA,KAAA,KAAS;AACnB,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAAA,EACA,UAAU,CAAA,KAAA,KAAS;AACjB,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,IACvB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAC,CAAA;AAGD,SAAS,UAAa,MAAA,EAAyB;AAC7C,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,aAAa,MAAA,EAAsB;AACjD,EAAA,IAAI,MAAA,YAAkBD,KAAAA,CAAE,OAAA,EAAS,OAAO,IAAA;AAGxC,EAAA,IAAI,MAAA,YAAkBA,KAAAA,CAAE,WAAA,IAAe,MAAA,YAAkBA,MAAE,WAAA,EAAa;AACtE,IAAA,OAAO,YAAA,CAAa,SAAA,CAAU,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAAA,EAChD;AAKA,EAAA,OAAO,KAAA;AACT;ACpDO,SAAS,gBAAgB,eAAA,EAAmD;AACjF,EAAA,MAAM,UAAW,eAAA,CAAwB,OAAA;AACzC,EAAA,IAAI,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAE3D,IAAA,MAAM,gBAAgB,OAAA,CACnB,MAAA,CAAO,CAAC,GAAA,KAAa,QAAQ,MAAA,IAAa,GAAA,KAAQ,IAAI,CAAA,CACtD,IAAI,CAAC,GAAA,KAAaC,QAAAA,CAAE,OAAA,CAAQ,GAAG,CAAC,CAAA;AAEnC,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,CAAC,KAAK,CAAA,GAAI,aAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,MAAA,IAAW,aAAA,CAAc,MAAA,IAAU,CAAA,EAAG;AACpC,MAAA,MAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,aAAA;AACjC,MAAA,OAAOA,QAAAA,CAAE,KAAA;AAAA,QACP,KAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAG;AAAA,OACL;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAOA,SAAE,GAAA,EAAI;AAAA,IACf;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAOA,SAAE,GAAA,EAAI;AAAA,EACf;AACF;ACxBO,SAAS,mBAAA,CACd,eAAA,EACA,OAAA,EACAC,oBAAAA,EACsD;AACtD,EAAA,MAAM,WAAA,GAAc,gBAAgB,MAAA,EAAO;AAC3C,EAAA,IAAI,WAAA,IAAe,WAAA,YAAuBF,KAAAA,CAAE,OAAA,EAAS;AAEnD,IAAA,IAAI,WAAA,YAAuBA,MAAE,WAAA,EAAa;AAExC,MAAA,MAAM,gBAAA,GAAmB,YAAY,MAAA,EAAO;AAC5C,MAAA,MAAM,mBAAA,GAAsBE,oBAAAA,CAAoB,gBAAA,EAA+B,OAAO,CAAA;AACtF,MAAA,OAAO;AAAA,QACL,WAAWD,QAAAA,CAAE,KAAA,CAAM,mBAAA,EAAqBA,QAAAA,CAAE,MAAM,CAAA;AAAA,QAChD,UAAA,EAAY;AAAA;AAAA,OACd;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,cAAA,GAAiBC,oBAAAA,CAAoB,WAAA,EAAa,OAAO,CAAA;AAC/D,MAAA,OAAO;AAAA,QACL,WAAWD,QAAAA,CAAE,KAAA,CAAM,cAAA,EAAgBA,QAAAA,CAAE,MAAM,CAAA;AAAA,QAC3C,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAO;AAAA,MACL,SAAA,EAAWA,SAAE,GAAA,EAAI;AAAA,MACjB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;AC7BO,SAAS,iBAAA,CACd,eAAA,EACA,OAAA,EACAC,oBAAAA,EACkB;AAIlB,EAAA,IAAI,SAAA,GAAa,gBAAwB,IAAA,EAAM,SAAA;AAI/C,EAAA,IAAI,CAAC,SAAA,EAAW;AAGd,IAAA,SAAA,GAAa,gBAAwB,IAAA,EAAM,OAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,SAAA,IAAa,SAAA,YAAqBF,KAAAA,CAAE,OAAA,EAAS;AAE/C,IAAA,MAAM,aAAA,GACJ,SAAA,YAAqBA,KAAAA,CAAE,WAAA,IACvB,SAAA,YAAqBA,KAAAA,CAAE,UAAA,IACtB,SAAA,YAAqBA,KAAAA,CAAE,UAAA,IAAc,SAAA,CAAU,GAAA,CAAI,qBAAqBA,KAAAA,CAAE,WAAA;AAE7E,IAAA,IAAI,aAAA,EAAe;AAEjB,MAAA,IAAI,SAAA;AACJ,MAAA,IAAI,kBAAA,GAA0B,MAAA;AAC9B,MAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,MAAA,IAAI,SAAA,YAAqBA,MAAE,UAAA,EAAY;AAErC,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA,kBAAA,GAAqB,UAAU,GAAA,CAAI,YAAA;AACnC,QAAA,MAAM,gBAAA,GAAmB,UAAU,GAAA,CAAI,SAAA;AACvC,QAAA,IAAI,gBAAA,YAA4BA,MAAE,WAAA,EAAa;AAC7C,UAAA,SAAA,GAAY,iBAAiB,MAAA,EAAO;AAAA,QACtC,CAAA,MAAO;AACL,UAAA,SAAA,GAAY,gBAAA;AAAA,QACd;AAAA,MACF,CAAA,MAAA,IAAW,SAAA,YAAqBA,KAAAA,CAAE,WAAA,EAAa;AAE7C,QAAA,SAAA,GAAY,UAAU,MAAA,EAAO;AAAA,MAC/B,CAAA,MAAO;AAEL,QAAA,SAAA,GAAY,SAAA;AAAA,MACd;AAGA,MAAA,MAAM,WAAA,GAAcE,oBAAAA,CAAoB,SAAA,EAAW,OAAO,CAAA;AAC1D,MAAA,MAAM,iBAAiBD,QAAAA,CAAE,KAAA,CAAM,WAAA,EAAaA,QAAAA,CAAE,MAAM,CAAA;AAGpD,MAAA,IAAI,gBAAA,EAAkB;AACnB,QAAC,eAAuB,WAAA,GAAc,kBAAA;AAAA,MACzC;AAEA,MAAA,OAAOA,QAAAA,CAAE,MAAA,CAAOA,QAAAA,CAAE,MAAA,IAAU,cAAc,CAAA;AAAA,IAC5C,CAAA,MAAO;AAEL,MAAA,OAAOA,QAAAA,CAAE,OAAOA,QAAAA,CAAE,MAAA,IAAUC,oBAAAA,CAAoB,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,IACrE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAOD,SAAE,MAAA,CAAOA,QAAAA,CAAE,QAAO,EAAGA,QAAAA,CAAE,KAAK,CAAA;AAAA,EACrC;AACF;AClEO,SAAS,6BAAA,CACd,eAAA,EACA,OAAA,EACAC,oBAAAA,EACkB;AAClB,EAAA,MAAM,UACH,eAAA,CAAwB,GAAA,EAAK,WAAY,eAAA,CAAwB,GAAA,EAAK,YAAY,MAAA,EAAO;AAC5F,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,GAAU,KAAA,CAAM,KAAK,OAAO,CAAA;AAClE,IAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AAGpB,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAa;AAC3C,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,OAAO,CAAA;AACrC,QAAA,OAAOA,oBAAAA,CAAoB,KAAK,aAAa,CAAA;AAAA,MAC/C,CAAC,CAAA;AACD,MAAA,MAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,aAAA;AACjC,MAAA,OAAOD,QAAAA,CAAE,KAAA;AAAA,QACP,KAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAG;AAAA,OACL;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAOA,SAAE,GAAA,EAAI;AAAA,IACf;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAOA,SAAE,GAAA,EAAI;AAAA,EACf;AACF;AAGO,SAAS,gBAAA,CACd,eAAA,EACA,OAAA,EACAC,oBAAAA,EACkB;AAClB,EAAA,MAAM,UAAW,eAAA,CAAwB,OAAA;AACzC,EAAA,IAAI,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3D,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAOA,oBAAAA,CAAoB,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,IAChD,CAAA,MAAO;AAML,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAa;AAE9C,QAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,OAAO,CAAA;AACrC,QAAA,OAAOA,oBAAAA,CAAoB,KAAK,aAAa,CAAA;AAAA,MAC/C,CAAC,CAAA;AACD,MAAA,IAAI,aAAA,CAAc,UAAU,CAAA,EAAG;AAC7B,QAAA,MAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,aAAA;AACjC,QAAA,OAAOD,QAAAA,CAAE,KAAA;AAAA,UACP,KAAA;AAAA,UACA,MAAA;AAAA,UACA,GAAG;AAAA,SACL;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAOA,SAAE,GAAA,EAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAOA,SAAE,GAAA,EAAI;AAAA,EACf;AACF;ACjEO,SAAS,MAAwB,MAAA,EAAqC;AAE3E,EAAA,MAAME,SAAAA,GAAW,eAAA,CAAgB,WAAA,CAAY,MAAM,CAAA;AACnD,EAAA,OACEA,WAAU,UAAA,KAAe,IAAA,IAAQA,WAAU,SAAA,IAAa,OAAOA,UAAS,SAAA,KAAc,QAAA;AAE1F;AAGO,SAAS,UAAU,OAAA,EAAqB;AAC7C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AACtC,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAOF,SAAE,GAAA,EAAI;AACvC,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,QAAQ,CAAC,CAAA;AAC1C,EAAA,OAAOA,QAAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,GAAG,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5D;AAEO,SAAS,eAAe,GAAA,EAA+B;AAE5D,EAAA,IAAI,GAAA,YAAeD,MAAE,SAAA,EAAW;AAC9B,IAAA,OAAO,GAAA,CAAI,KAAA;AAAA,EACb;AAEA,EAAA,IAAI,OAAO,OAAO,GAAA,KAAQ,YAAY,OAAO,GAAA,CAAI,UAAU,QAAA,EAAU;AACnE,IAAA,OAAO,GAAA,CAAI,KAAA;AAAA,EACb;AACA,EAAA,OAAO,EAAC;AACV;;;ACXA,SAAS,mBAAA,CACP,YAAA,EACA,OAAA,mBAA6B,IAAI,KAAI,EACE;AAEvC,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAOC,SAAE,GAAA,EAAI;AAAA,EACf;AAGA,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,EAAG;AAC7B,IAAA,OAAOA,SAAE,GAAA,EAAI;AAAA,EACf;AACA,EAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AAGxB,EAAA,IAAI,eAAA,GAAkB,YAAA;AACtB,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,YAAA,GAAoB,MAAA;AACxB,EAAA,IAAI,UAAA,GAAa,KAAA;AAMjB,EAAA,IAAI,YAAA,YAAwBD,MAAE,UAAA,EAAY;AACxC,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,YAAA,GAAgB,aAAqB,GAAA,EAAK,YAAA;AAC1C,IAAA,eAAA,GAAmB,aAAqB,GAAA,EAAK,SAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,eAAA,YAA2BA,MAAE,WAAA,EAAa;AAC5C,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,eAAA,GAAkB,gBAAgB,MAAA,EAAO;AAGzC,IAAA,IAAI,eAAA,YAA2BA,MAAE,UAAA,EAAY;AAC3C,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,YAAA,GAAgB,gBAAwB,GAAA,EAAK,YAAA;AAC7C,MAAA,eAAA,GAAmB,gBAAwB,GAAA,EAAK,SAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,IAAI,eAAA;AAGJ,EAAA,IAAI,KAAA,CAAM,eAAe,CAAA,EAAG;AAC1B,IAAA,MAAMG,SAAAA,GAAW,eAAA,CAAgB,WAAA,CAAY,eAAe,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAYA,WAAU,SAAA,IAAa,SAAA;AACzC,IAAA,eAAA,GAAkBF,QAAAA,CAAE,GAAG,SAAS,CAAA;AAAA,EAClC,CAAA,MAAO;AAYL,IAAA,MAAM,OAAA,GAAW,gBAAwB,GAAA,EAAK,IAAA;AAE9C,IAAA,QAAQ,OAAA;AAAS,MACf,KAAK,QAAA;AAEH,QAAA,eAAA,GAAkBA,SAAE,MAAA,EAAO;AAC3B,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,eAAA,GAAkBA,SAAE,OAAA,EAAQ;AAC5B,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,eAAA,GAAkBA,SAAE,KAAA,EAAM;AAC1B,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,eAAA,GAAkBA,SAAE,OAAA,EAAQ;AAC5B,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,eAAA,GAAkBA,SAAE,OAAA,EAAQ;AAC5B,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,eAAA,GAAkBA,SAAE,IAAA,EAAK;AACzB,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,eAAA,GAAkBA,SAAE,OAAA,EAAQ;AAC5B,QAAA;AAAA,MACF,KAAK,OAAA,EAAS;AAEZ,QAAA,IAAI,eAAA,YAA2BD,MAAE,QAAA,EAAU;AACzC,UAAA,MAAM,UAAW,eAAA,CAAwB,OAAA;AACzC,UAAA,IAAI,OAAA,IAAW,OAAA,YAAmBA,KAAAA,CAAE,OAAA,EAAS;AAC3C,YAAA,eAAA,GAAkBC,QAAAA,CAAE,KAAA,CAAM,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,UACjE,CAAA,MAAO;AACL,YAAA,eAAA,GAAkBA,QAAAA,CAAE,KAAA,CAAMA,QAAAA,CAAE,GAAA,EAAK,CAAA;AAAA,UACnC;AAAA,QACF,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBA,QAAAA,CAAE,KAAA,CAAMA,QAAAA,CAAE,GAAA,EAAK,CAAA;AAAA,QACnC;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,QAAA,EAAU;AAEb,QAAA,IAAI,eAAA,YAA2BD,MAAE,SAAA,EAAW;AAC1C,UAAA,MAAM,QAAQ,eAAA,CAAgB,KAAA;AAC9B,UAAA,MAAM,cAAkC,EAAC;AACzC,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,YAAA,IAAI,KAAA,IAAS,KAAA,YAAiBA,KAAAA,CAAE,OAAA,EAAS;AACvC,cAAA,WAAA,CAAY,GAAG,CAAA,GAAI,mBAAA,CAAoB,KAAA,EAAO,OAAO,CAAA;AAAA,YACvD;AAAA,UACF;AACA,UAAA,eAAA,GAAkBC,QAAAA,CAAE,OAAO,WAAW,CAAA;AAAA,QACxC,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBA,QAAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,QAC/B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AACZ,QAAA,IAAI,eAAA,YAA2BD,MAAE,QAAA,EAAU;AACzC,UAAA,eAAA,GAAkB,gBAAA,CAAiB,eAAA,EAAiB,OAAA,EAAS,mBAAmB,CAAA;AAAA,QAClF,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBC,SAAE,GAAA,EAAI;AAAA,QAC1B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,oBAAA,EAAsB;AACzB,QAAA,eAAA,GAAkB,6BAAA;AAAA,UAChB,eAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,SAAA,EAAW;AAEd,QAAA,IAAI,eAAA,YAA2BD,MAAE,UAAA,EAAY;AAC3C,UAAA,MAAM,eAAgB,eAAA,CAAwB,KAAA;AAC9C,UAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,YAAA,KAAiB,IAAA,EAAM;AACvD,YAAA,eAAA,GAAkBC,QAAAA,CAAE,QAAQ,YAAY,CAAA;AAAA,UAC1C,CAAA,MAAO;AACL,YAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AAAA,UAC1B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AAAA,QAC1B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AACX,QAAA,IAAI,eAAA,YAA2BD,MAAE,OAAA,EAAS;AACxC,UAAA,eAAA,GAAkB,gBAAgB,eAAe,CAAA;AAAA,QACnD,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBC,SAAE,GAAA,EAAI;AAAA,QAC1B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,QAAA,EAAU;AACb,QAAA,IAAI,eAAA,YAA2BD,MAAE,SAAA,EAAW;AAC1C,UAAA,eAAA,GAAkB,iBAAA,CAAkB,eAAA,EAAiB,OAAA,EAAS,mBAAmB,CAAA;AAAA,QACnF,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBC,SAAE,MAAA,CAAOA,QAAAA,CAAE,QAAO,EAAGA,QAAAA,CAAE,KAAK,CAAA;AAAA,QAChD;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,WAAA;AAAA,MACL,KAAK,MAAA,EAAQ;AAEX,QAAA,MAAM,KAAA,GAAQ,cAAc,eAAe,CAAA;AAC3C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,eAAA,GAAkB,KAAA,CAAM,YAAY,eAAe,CAAA;AAAA,QACrD,CAAA,MAAO;AAEL,UAAA,MAAME,SAAAA,GAAW,eAAA,CAAgB,WAAA,CAAY,eAAe,CAAA;AAC5D,UAAA,IAAIA,SAAAA,EAAU,KAAA,IAASA,SAAAA,EAAU,cAAA,EAAgB;AAE/C,YAAA,eAAA,GAAkB,mBAAA,CAAoBA,SAAAA,CAAS,cAAA,EAAgB,OAAO,CAAA;AAAA,UACxE,CAAA,MAAO;AAEL,YAAA,eAAA,GAAkBF,SAAE,GAAA,EAAI;AAAA,UAC1B;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,UAAA,EAAY;AACf,QAAA,IAAI,eAAA,YAA2BD,MAAE,WAAA,EAAa;AAC5C,UAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,eAAA,EAAiB,OAAA,EAAS,mBAAmB,CAAA;AAChF,UAAA,eAAA,GAAkB,MAAA,CAAO,SAAA;AACzB,UAAA,IAAI,OAAO,UAAA,EAAY;AACrB,YAAA,UAAA,GAAa,IAAA;AAAA,UACf;AAAA,QACF,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBC,SAAE,GAAA,EAAI;AAAA,QAC1B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA,EAAS;AAEZ,QAAA,IAAI,eAAA,YAA2BD,MAAE,QAAA,EAAU;AACzC,UAAA,MAAM,KAAA,GAAS,gBAAwB,GAAA,EAAK,KAAA;AAC5C,UAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,YAAA,MAAM,cAAkC,EAAC;AACzC,YAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,cAAA,WAAA,CAAY,IAAI,KAAK,CAAA,CAAE,CAAA,GAAI,mBAAA,CAAoB,MAAM,OAAO,CAAA;AAAA,YAC9D,CAAC,CAAA;AACD,YAAA,eAAA,GAAkBC,QAAAA,CAAE,OAAO,WAAW,CAAA;AAAA,UACxC,CAAA,MAAO;AACL,YAAA,eAAA,GAAkBA,QAAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,UAC/B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBA,QAAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,QAC/B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,MAAA,EAAQ;AAGX,QAAA,IAAI,eAAA,YAA2BD,MAAE,OAAA,EAAS;AACxC,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAU,gBAAwB,GAAA,EAAK,MAAA;AAC7C,YAAA,IAAI,MAAA,EAAQ;AACV,cAAA,MAAM,iBAAiB,MAAA,EAAO;AAC9B,cAAA,IAAI,cAAA,IAAkB,cAAA,YAA0BA,KAAAA,CAAE,OAAA,EAAS;AACzD,gBAAA,eAAA,GAAkB,mBAAA,CAAoB,gBAAgB,OAAO,CAAA;AAAA,cAC/D,CAAA,MAAO;AACL,gBAAA,eAAA,GAAkBC,SAAE,GAAA,EAAI;AAAA,cAC1B;AAAA,YACF,CAAA,MAAO;AACL,cAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AAAA,YAC1B;AAAA,UACF,CAAA,CAAA,MAAQ;AAEN,YAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AAAA,UAC1B;AAAA,QACF,CAAA,MAAO;AACL,UAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AAAA,QAC1B;AACA,QAAA;AAAA,MACF;AAAA,MACA,KAAK,KAAA;AAEH,QAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AACxB,QAAA;AAAA,MACF,KAAK,SAAA;AAEH,QAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AACxB,QAAA;AAAA,MACF,KAAK,WAAA;AAAA,MACL,KAAK,MAAA;AAAA,MACL,KAAK,OAAA;AAEH,QAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AACxB,QAAA;AAAA,MACF,KAAK,cAAA;AAEH,QAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AACxB,QAAA;AAAA,MACF;AAGE,QAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,mCAAmC,OAAO,CAAA,uCAAA,CAAA;AAAA,YAC1C,SAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AACA,QAAA,eAAA,GAAkBA,SAAE,GAAA,EAAI;AACxB,QAAA;AAAA;AACJ,EACF;AAGA,EAAA,MAAM,iBAAiB,UAAA,IAAc,UAAA,GAAaA,QAAAA,CAAE,QAAA,CAAS,eAAe,CAAA,GAAI,eAAA;AAGhF,EAAA,IAAI,UAAA,IAAc,OAAO,cAAA,KAAmB,QAAA,IAAY,mBAAmB,IAAA,EAAM;AAC9E,IAAC,eAAuB,WAAA,GAAc,YAAA;AAAA,EACzC;AAEA,EAAA,OAAO,cAAA;AACT;AAEO,SAAS,YACdG,KAAA,EAKU;AACV,EAAA,IAAI,OAAOA,UAAQ,QAAA,IAAYA,KAAA,KAAQ,QAAQ,EAAEA,KAAA,YAAeJ,MAAE,OAAA,CAAA,EAAU;AAC1E,IAAA,OAAO,kBAAkBI,KAAmB,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,oBAAoBA,KAAmB,CAAA;AAChD;AAEO,SAAS,kBACdA,KAAA,EACqC;AAErC,EAAA,MAAM,MAAA,GAASA,KAAA,YAAeJ,KAAAA,CAAE,SAAA,GAAYI,MAAI,KAAA,GAAQA,KAAA;AAGxD,EAAA,MAAM,SAAc,EAAC;AACrB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,mBAAA,CAAoB,KAAqB,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,MAAA;AACT;;;ACpUA,SAASC,WAAa,MAAA,EAAyB;AAC7C,EAAA,OAAO,MAAA;AACT;AASO,SAAS,YAAe,MAAA,EAAsC;AACnE,EAAA,MAAM,SAAA,GAAY,YAAY,MAAM,CAAA;AAEpC,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,MAAA,EAAQ,CAAC,KAAA,KAAa,UAAA,CAAW,QAAQ,KAAK,CAAA;AAAA,IAC9C,MAAA,EAAQ,CAAC,KAAA,KAAe,YAAA,CAAa,OAAO,MAAM,CAAA;AAAA,IAClD,IAAA,EAAM,CAAoB,IAAA,KAAgC;AACxD,MAAA,IAAI,EAAE,MAAA,YAAkBL,KAAAA,CAAE,SAAA,CAAA,EAAY;AACpC,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAI,IAC9B,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,MAAO,EAAE,GAAG,GAAA,EAAK,CAAC,CAAC,GAAG,MAAK,CAAA,EAAI,EAAS,CAAA,GAC1D,IAAA;AACJ,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,OAAc,CAAA;AAC/C,MAAA,OAAO,YAAY,YAAY,CAAA;AAAA,IACjC;AAAA,GACF;AACF;AAGO,SAAS,UAAA,CAAW,QAAc,KAAA,EAAkB;AAEzD,EAAA,IAAI,CAAC,MAAA,IAAU,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACrC,IAAA,KAAA,GAAQ,MAAA;AACR,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,EAC5B;AAGA,EAAA,OAAO,cAAA,CAAe,OAAO,MAAM,CAAA;AACrC;AAEA,SAAS,cAAc,KAAA,EAAiB;AACtC,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAChC,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,IAAA;AAC3B,EAAA,IAAI,KAAA,YAAiB,IAAA,EAAM,OAAO,KAAA,CAAM,OAAA,EAAQ;AAEhD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,aAAa,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,SAAc,EAAC;AACrB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAGC,EAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,IAAIA,OAAM,MAAA,EAAW;AACnB,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,aAAA,CAAcA,EAAC,CAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAA,CAAe,OAAY,MAAA,EAAkB;AACpD,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,KAAA;AAGlD,EAAA,MAAM,KAAA,GAAQ,cAAc,MAAM,CAAA;AAClC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,MAAM,CAAA;AAAA,EACrC;AAGA,EAAA,IACE,MAAA,YAAkBD,MAAE,WAAA,IACpB,MAAA,YAAkBA,MAAE,WAAA,IACpB,MAAA,YAAkBA,MAAE,UAAA,EACpB;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,EAAO;AAC5B,IAAA,OAAO,cAAA,CAAe,KAAA,EAAOK,UAAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,MAAA,YAAkBL,KAAAA,CAAE,OAAA,IAAW,KAAA,YAAiB,IAAA,EAAM;AACxD,IAAA,OAAO,MAAM,OAAA,EAAQ;AAAA,EACvB;AAGA,EAAA,IAAI,MAAA,YAAkBA,MAAE,QAAA,EAAU;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA;AAClC,IAAA,OAAO,MAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,eAAe,IAAA,EAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC/D;AAGA,EAAA,IAAI,MAAA,YAAkBA,MAAE,SAAA,EAAW;AACjC,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,MAAM,SAAc,EAAC;AACrB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAGC,EAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,IAAIA,OAAM,MAAA,EAAW;AACnB,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,cAAA,CAAeA,EAAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,aAAA,CAAcA,EAAC,CAAA;AAAA,MACtE;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,YAAkBD,MAAE,QAAA,EAAU;AAEhC,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,MAAA,IAAI;AACF,QAAA;AAAC,QAAC,MAAA,CAAe,MAAM,KAAK,CAAA;AAC5B,QAAA,OAAO,cAAA,CAAe,OAAO,MAAM,CAAA;AAAA,MACrC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,YAAkBA,MAAE,SAAA,EAAW;AACjC,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,IAAA,MAAM,SAAc,EAAC;AACrB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAGC,EAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,IAAIA,OAAM,MAAA,EAAW;AACnB,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,cAAA,CAAeA,EAAAA,EAAG,OAAO,SAAS,CAAA;AAAA,MAChD;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,cAAc,KAAK,CAAA;AAC5B;AAGO,SAAS,YAAA,CAAa,OAAY,MAAA,EAAkB;AACzD,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,KAAA;AAGlD,EAAA,MAAM,KAAA,GAAQ,cAAc,MAAM,CAAA;AAClC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA,CAAM,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AAAA,EACvC;AAGA,EAAA,IACE,MAAA,YAAkBD,MAAE,WAAA,IACpB,MAAA,YAAkBA,MAAE,WAAA,IACpB,MAAA,YAAkBA,MAAE,UAAA,EACpB;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,EAAO;AAC5B,IAAA,OAAO,YAAA,CAAa,KAAA,EAAOK,UAAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,MAAA,YAAkBL,KAAAA,CAAE,OAAA,IAAW,OAAO,UAAU,QAAA,EAAU;AAC5D,IAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AAAA,EACvB;AAGA,EAAA,IAAI,YAAA,CAAa,MAAM,CAAA,IAAK,OAAO,UAAU,QAAA,EAAU;AACrD,IAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AAAA,EACvB;AAGA,EAAA,IAAI,MAAA,YAAkBA,MAAE,QAAA,EAAU;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA;AAClC,IAAA,OAAO,MAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,aAAa,IAAA,EAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC7D;AAGA,EAAA,IAAI,MAAA,YAAkBA,MAAE,SAAA,EAAW;AACjC,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,MAAM,SAAc,EAAC;AACrB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAGC,EAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,aAAaA,EAAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,GAAIA,EAAAA;AAAA,IACrD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,YAAkBD,MAAE,QAAA,EAAU;AAEhC,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,EAAO,MAAM,CAAA;AACzC,QAAC,MAAA,CAAe,MAAM,OAAO,CAAA;AAC9B,QAAA,OAAO,OAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,YAAkBA,MAAE,SAAA,EAAW;AACjC,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,IAAA,MAAM,SAAc,EAAC;AACrB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAGC,EAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,YAAA,CAAaA,EAAAA,EAAG,OAAO,SAAS,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAIA,EAAA,IAAI,MAAA,YAAkBD,MAAE,YAAA,EAAc;AAEpC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AC5NO,SAAS,IAAA,CACd,KACA,IAAA,EACY;AACZ,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,IAAI,GAAG,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,SAAA,GAAoC;AAClD,EAAA,OAAO,CAAuBC,EAAAA,KAASA,EAAAA;AACzC;AAGO,SAAS,eAAA,CACd,OACA,OAAA,EACA;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,OAAA;AAAA,IACA,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,MACjC,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,QAAQ,EAAE,CAAA;AAAA,MAChF,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM;AAAA,KACjB,CAAE,CAAA;AAAA;AAAA,IAEF,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,OAAA,IAAU,IAAK,EAAE,CAAC;AAAA,GAC7D;AACF;AAIO,SAAS,wBAAA,CACd,GACA,OAAA,EACO;AACP,EAAA,IAAI,CAAA,YAAaD,MAAE,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAIM,kBAAA,CAAY,eAAA,CAAgB,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,MAAM,CAAA;AACR;AAGO,SAAS,WAAmC,IAAA,EAAS;AAC1D,EAAA,OAAON,MAAE,MAAA,CAAO;AAAA,IACd,IAAA,EAAMA,KAAAA,CAAE,KAAA,CAAM,IAAI,CAAA;AAAA,IAClB,MAAA,EAAQA,MAAE,OAAA,EAAQ;AAAA,IAClB,gBAAgBA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AAAS,GAChD,CAAA;AACH;AAOO,SAAS,qBAAqB,KAAA,EAAmC;AAEtE,EAAA,IAAI,KAAA,YAAiBA,MAAE,OAAA,EAAS;AAC9B,IAAA,OAAOA,MAAE,MAAA,EAAO;AAAA,EAClB;AAGA,EAAA,IAAI,iBAAiBA,KAAAA,CAAE,WAAA,IAAe,MAAM,MAAA,EAAO,YAAaA,MAAE,OAAA,EAAS;AACzE,IAAA,OAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B;AAGA,EAAA,IAAI,iBAAiBA,KAAAA,CAAE,WAAA,IAAe,MAAM,MAAA,EAAO,YAAaA,MAAE,OAAA,EAAS;AACzE,IAAA,OAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B;AAGA,EAAA,IAAI,KAAA,YAAiBA,MAAE,UAAA,EAAY;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,EAAc;AAClC,IAAA,IAAI,KAAA,YAAiBA,MAAE,OAAA,EAAS;AAC9B,MAAA,OAAOA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B;AAAA,EACF;AAGA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,OAAO,IAAA,EAAsB;AACpC,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,IAAA,CAAK,IAAI,MAAM,CAAA;AAC/C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,CAAO,OAAK,CAAC,CAAE,IAAA,CAAa,CAAC,CAAC,CAAA;AACzD;AAMO,SAAS,SAAA,CACd,eACA,IAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,OAAO,IAAI,CAAA;AACxB,EAAA,MAAM,KAAA,GACJ,yBAAyBA,KAAAA,CAAE,SAAA,GAAY,eAAe,aAAa,CAAA,GAAI,iBAAiB,EAAC;AAE3F,EAAA,MAAM,MAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,KAAK,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,GAAK,MAAc,CAAC,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,QAAA,CAAS,QAA0B,IAAA,EAA8B;AAC/E,EAAA,OAAOA,KAAAA,CAAE,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,IAAI,CAAC,CAAA;AACzC;AAMO,SAAS,QAAA,CAAS,QAA0B,IAAA,EAA8B;AAC/E,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AACxD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,MAAA,EAAQ,IAAI,CAAA;AACrC,EAAA,OAAOA,KAAAA,CAAE,OAAO,MAAM,CAAA;AACxB;;;AC8BO,SAAS,eAAA,CAQd,SACA,aAAA,EACA;AACA,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,IAASO,oBAAA,CAAK,KAAA;AAChD,EAAA,MAAM,SAAA,GAAY,aAAA,CAAc,IAAA,IAAQA,oBAAA,CAAK,IAAA;AAE7C,EAAA,OAAO,SAAS,cAAc,EAAA,EAAc;AAC1C,IAAA,MAAM,EAAE,MAAM,OAAA,GAAU,EAAA,EAAI,SAAS,WAAA,EAAa,GAAG,OAAM,GAAI,EAAA;AAE/D,IAAA,MAAM,OAAA,GACJ,eAAe,EAAE,WAAA,YAAuBP,MAAE,OAAA,CAAA,GAAWA,KAAAA,CAAE,MAAA,CAAO,WAAW,CAAA,GAAI,WAAA;AAC/E,IAAA,MAAM,eAAA,GACJ,OAAA,IAAW,CAAC,EAAA,CAAG,oBAAA,GAAuB,EAAE,OAAA,EAAS,WAAA,CAAY,OAAO,CAAA,EAAE,GAAI,MAAA;AAE5E,IAAA,IAAI,IAAA,IAAQ,CAAC,EAAA,CAAG,oBAAA,EAAsB;AACpC,MAAA,IAAI,aAAA,GAAgB,IAAA;AACpB,MAAA,IAAI,UAAA;AAEJ,MAAA,IAAI,aAAA,YAAyBA,MAAE,OAAA,EAAS;AACtC,QAAA,IAAI,aAAA,YAAyBA,MAAE,SAAA,EAAW;AACxC,UAAA,UAAA,GAAa,aAAA;AACb,UAAA,aAAA,GAAgB,aAAA,CAAc,KAAA;AAAA,QAChC,CAAA,MAAO;AACL,UAAA,MAAM,IAAI,KAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,UAAA,GAAaA,KAAAA,CAAE,OAAO,aAAa,CAAA;AAAA,MACrC;AAEA,MAAA,MAAM,eAAA,GAAkB,kBAAkB,aAAa,CAAA;AACvD,MAAA,OAAO,OAAA,CAAQ;AAAA,QACb,IAAA,EAAM,EAAE,GAAG,eAAA,EAAiB,GAAG,SAAA,EAAU;AAAA,QACzC,GAAG,eAAA;AAAA,QACH,OAAA,EAAS,OAAO,GAAA,EAAU,OAAA,KAAiB;AACzC,UAAA,MAAM,QAAa,MAAM,WAAA;AAAA,YACvB,GAAA;AAAA,YACA,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,YACpC;AAAA,WACF;AACA,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AACzC,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,OAAO,CAAA;AACrC,UAAA,MAAM,OAAA,GAAU,YAAA,CAAa,OAAA,EAAS,UAAU,CAAA;AAChD,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,SAAA,CAAU,OAAO,CAAA;AAC3C,UAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,YAAA,wBAAA,CAAyB,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,UAC/C;AACA,UAAA,MAAM,QAAA,GAAW,EAAE,GAAG,GAAA,EAAK,GAAI,KAAA,EAAO,GAAA,IAAO,EAAC,EAAG;AACjD,UAAA,MAAM,WAAW,MAAA,CAAO,IAAA;AACxB,UAAA,MAAM,SAAA,GAAa,KAAA,EAAO,IAAA,IAAoC,EAAC;AAC/D,UAAA,MAAM,SAAA,GAAY,EAAE,GAAG,QAAA,EAAU,GAAG,SAAA,EAAU;AAC9C,UAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,QAAA,EAAU,SAAS,CAAA;AAC7C,UAAA,IAAI,OAAA,IAAW,CAAC,EAAA,CAAG,oBAAA,EAAsB;AACvC,YAAA,IAAI,SAAA;AACJ,YAAA,IAAI;AACF,cAAA,SAAA,GAAa,OAAA,CAAyB,MAAM,GAAG,CAAA;AAAA,YACjD,SAAS,CAAA,EAAG;AACV,cAAA,wBAAA,CAAyB,GAAG,SAAS,CAAA;AAAA,YACvC;AACA,YAAA,IAAI,OAAO,SAAA,EAAW;AACpB,cAAA,MAAM,MAAM,SAAA,CAAU;AAAA,gBACpB,GAAA;AAAA,gBACA,MAAM,MAAA,CAAO,IAAA;AAAA,gBACb,MAAA,EAAQ;AAAA,eACT,CAAA;AAAA,YACH;AACA,YAAA,OAAO,UAAA,CAAW,SAAyB,SAAS,CAAA;AAAA,UACtD;AACA,UAAA,IAAI,OAAO,SAAA,EAAW;AACpB,YAAA,MAAM,KAAA,CAAM,UAAU,EAAE,GAAA,EAAK,MAAM,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,UAC/D;AACA,UAAA,OAAO,GAAA;AAAA,QACT;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,OAAO,OAAA,CAAQ;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,GAAG,eAAA;AAAA,MACH,OAAA,EAAS,OAAO,GAAA,EAAU,OAAA,KAAiB;AACzC,QAAA,MAAM,QAAa,MAAM,WAAA;AAAA,UACvB,GAAA;AAAA,UACA,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,UACpC;AAAA,SACF;AACA,QAAA,MAAM,QAAA,GAAW,EAAE,GAAG,GAAA,EAAK,GAAI,KAAA,EAAO,GAAA,IAAO,EAAC,EAAG;AACjD,QAAA,MAAM,QAAA,GAAW,OAAA;AACjB,QAAA,MAAM,SAAA,GAAa,KAAA,EAAO,IAAA,IAAoC,EAAC;AAC/D,QAAA,MAAM,SAAA,GAAY,EAAE,GAAG,QAAA,EAAU,GAAG,SAAA,EAAU;AAC9C,QAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,QAAA,EAAU,SAAS,CAAA;AAC7C,QAAA,IAAI,OAAA,IAAW,CAAC,EAAA,CAAG,oBAAA,EAAsB;AACvC,UAAA,IAAI,SAAA;AACJ,UAAA,IAAI;AACF,YAAA,SAAA,GAAa,OAAA,CAAyB,MAAM,GAAG,CAAA;AAAA,UACjD,SAAS,CAAA,EAAG;AACV,YAAA,wBAAA,CAAyB,GAAG,SAAS,CAAA;AAAA,UACvC;AACA,UAAA,IAAI,OAAO,SAAA,EAAW;AACpB,YAAA,MAAM,KAAA,CAAM,UAAU,EAAE,GAAA,EAAK,MAAM,OAAA,EAAS,MAAA,EAAQ,WAAW,CAAA;AAAA,UACjE;AACA,UAAA,OAAO,UAAA,CAAW,SAAyB,SAAS,CAAA;AAAA,QACtD;AACA,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,MAAM,KAAA,CAAM,UAAU,EAAE,GAAA,EAAK,MAAM,OAAA,EAAS,MAAA,EAAQ,KAAK,CAAA;AAAA,QAC3D;AACA,QAAA,OAAO,GAAA;AAAA,MACT;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AACF;AA4CO,SAAS,YAAA,CAOd,OACA,aAAA,EACA;AAGA,EAAA,OAAO,eAAA,CAOL,OAAc,aAAoB,CAAA;AACtC;AAwBO,SAAS,eAAA,CAQd,UACA,aAAA,EACA;AACA,EAAA,OAAO,eAAA;AAAA,IACL,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAwBO,SAAS,aAAA,CAQd,QACA,aAAA,EACA;AACA,EAAA,OAAO,eAAA;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;ACnZA,IAAM,gBAAA,uBAAuB,OAAA,EAA+B;AAM5D,SAAS,cAAA,CAAe,MAAA,EAAsB,QAAA,GAAW,EAAA,EAAI,eAAe,CAAA,EAAY;AAEtF,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA;AAC1C,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,KAAA;AAGb,EAAA,IAAK,MAAA,CAAe,IAAA,EAAM,QAAA,KAAa,WAAA,EAAa;AAClD,IAAA,MAAA,GAAS,IAAA;AAAA,EACX,CAAA,MAAA,IAAW,MAAA,YAAkBA,KAAAA,CAAE,QAAA,EAAU;AACvC,IAAA,MAAA,GAAU,OAAO,OAAA,CAA2B,IAAA;AAAA,MAAK,CAAA,GAAA,KAC/C,cAAA,CAAe,GAAA,EAAK,QAAA,EAAU,eAAe,CAAC;AAAA,KAChD;AAAA,EACF,CAAA,MAAA,IAAW,MAAA,YAAkBA,KAAAA,CAAE,WAAA,EAAa;AAC1C,IAAA,MAAA,GAAS,eAAe,MAAA,CAAO,MAAA,EAAO,EAAmB,QAAA,EAAU,eAAe,CAAC,CAAA;AAAA,EACrF,CAAA,MAAA,IAAW,MAAA,YAAkBA,KAAAA,CAAE,WAAA,EAAa;AAC1C,IAAA,MAAA,GAAS,eAAe,MAAA,CAAO,MAAA,EAAO,EAAmB,QAAA,EAAU,eAAe,CAAC,CAAA;AAAA,EACrF,CAAA,MAAA,IAAW,MAAA,YAAkBA,KAAAA,CAAE,UAAA,EAAY;AACzC,IAAA,MAAA,GAAS,eAAe,MAAA,CAAO,aAAA,EAAc,EAAmB,QAAA,EAAU,eAAe,CAAC,CAAA;AAAA,EAC5F;AAEA,EAAA,gBAAA,CAAiB,GAAA,CAAI,QAAQ,MAAM,CAAA;AACnC,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,MAAA,CAMd,KAAA,EACA,KAAA,EACA,OAAA,EAIA,OAAA,EAC2E;AAC3E,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,KAAA,YAAiBA,MAAE,SAAA,EAAW;AAChC,IAAA,MAAM,MAAA,GAAS,KAAA;AACf,IAAA,SAAA,GAAY,MAAA;AACZ,IAAA,IAAA,GAAO,iBAAA,CAAkB,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,EACjD,CAAA,MAAA,IAAW,KAAA,YAAiBA,KAAAA,CAAE,OAAA,EAAS;AAErC,IAAA,SAAA,GAAYA,KAAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,OAAc,CAAA;AAC5C,IAAA,IAAA,GAAO,EAAE,KAAA,EAAO,WAAA,CAAY,KAAY,CAAA,EAAE;AAAA,EAC5C,CAAA,MAAO;AACL,IAAA,SAAA,GAAYA,KAAAA,CAAE,OAAO,KAA4B,CAAA;AACjD,IAAA,IAAA,GAAO,kBAAkB,KAA4B,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,OAAA,GACJ,OAAA,EAAS,OAAA,IAAW,CAAC,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA,GAAI,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,GAAI,MAAA;AAExF,EAAA,OAAO,KAAA,CAAM;AAAA,IACX,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,OAAO,GAAA,EAAU,UAAA,KAAwB;AAChD,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,UAAA,EAAY,SAAS,CAAA;AAClD,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,SAAA,CAAU,MAAM,OAAO,CAAA;AAAA,MAClC,SAAS,CAAA,EAAG;AACV,QAAA,wBAAA,CAAyB,GAAG,MAAM,CAAA;AAAA,MACpC;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACrC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAa,OAAA,CAAQ,OAAA,CAAyB,KAAA,CAAM,GAAG,CAAA;AAC7D,UAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAyB,SAAS,CAAA;AAAA,QAC9D,SAAS,CAAA,EAAG;AACV,UAAA,wBAAA,CAAyB,GAAG,SAAS,CAAA;AAAA,QACvC;AAAA,MACF;AAEA,MAAA,OAAO,WAAW,GAAG,CAAA;AAAA,IACvB;AAAA,GACD,CAAA;AACH;AAmBO,SAAS,SAAA,CAMd,QAAA,EACA,KAAA,EACA,OAAA,EAIA,OAAA,EAC8E;AAC9E,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,KAAA,YAAiBA,MAAE,SAAA,EAAW;AAChC,IAAA,MAAM,MAAA,GAAS,KAAA;AACf,IAAA,SAAA,GAAY,MAAA;AACZ,IAAA,IAAA,GAAO,iBAAA,CAAkB,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,EACjD,CAAA,MAAA,IAAW,KAAA,YAAiBA,KAAAA,CAAE,OAAA,EAAS;AACrC,IAAA,SAAA,GAAYA,KAAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,OAAc,CAAA;AAC5C,IAAA,IAAA,GAAO,EAAE,KAAA,EAAO,WAAA,CAAY,KAAY,CAAA,EAAE;AAAA,EAC5C,CAAA,MAAO;AACL,IAAA,SAAA,GAAYA,KAAAA,CAAE,OAAO,KAA4B,CAAA;AACjD,IAAA,IAAA,GAAO,kBAAkB,KAA4B,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,OAAA,GACJ,OAAA,EAAS,OAAA,IAAW,CAAC,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA,GAAI,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,GAAI,MAAA;AAExF,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,OAAO,GAAA,EAAU,UAAA,KAAwB;AAChD,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,UAAA,EAAY,SAAS,CAAA;AAClD,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,SAAA,CAAU,MAAM,OAAO,CAAA;AAAA,MAClC,SAAS,CAAA,EAAG;AACV,QAAA,wBAAA,CAAyB,GAAG,MAAM,CAAA;AAAA,MACpC;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACrC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAa,OAAA,CAAQ,OAAA,CAAyB,KAAA,CAAM,GAAG,CAAA;AAC7D,UAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAyB,SAAS,CAAA;AAAA,QAC9D,SAAS,CAAA,EAAG;AACV,UAAA,wBAAA,CAAyB,GAAG,SAAS,CAAA;AAAA,QACvC;AAAA,MACF;AAEA,MAAA,OAAO,WAAW,GAAG,CAAA;AAAA,IACvB;AAAA,GACD,CAAA;AACH;AAmBO,SAAS,OAAA,CAMd,MAAA,EACA,KAAA,EACA,OAAA,EAIA,OAAA,EAC4E;AAC5E,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,KAAA,YAAiBA,MAAE,SAAA,EAAW;AAChC,IAAA,MAAM,MAAA,GAAS,KAAA;AACf,IAAA,SAAA,GAAY,MAAA;AACZ,IAAA,IAAA,GAAO,iBAAA,CAAkB,cAAA,CAAe,MAAM,CAAC,CAAA;AAAA,EACjD,CAAA,MAAA,IAAW,KAAA,YAAiBA,KAAAA,CAAE,OAAA,EAAS;AACrC,IAAA,SAAA,GAAYA,KAAAA,CAAE,MAAA,CAAO,EAAE,KAAA,EAAO,OAAc,CAAA;AAC5C,IAAA,IAAA,GAAO,EAAE,KAAA,EAAO,WAAA,CAAY,KAAY,CAAA,EAAE;AAAA,EAC5C,CAAA,MAAO;AACL,IAAA,SAAA,GAAYA,KAAAA,CAAE,OAAO,KAA4B,CAAA;AACjD,IAAA,IAAA,GAAO,kBAAkB,KAA4B,CAAA;AAAA,EACvD;AAEA,EAAA,MAAM,OAAA,GACJ,OAAA,EAAS,OAAA,IAAW,CAAC,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA,GAAI,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,GAAI,MAAA;AAExF,EAAA,OAAO,MAAA,CAAO;AAAA,IACZ,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA,EAAS,OAAO,GAAA,EAAU,UAAA,KAAwB;AAChD,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,UAAA,EAAY,SAAS,CAAA;AAClD,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,SAAA,CAAU,MAAM,OAAO,CAAA;AAAA,MAClC,SAAS,CAAA,EAAG;AACV,QAAA,wBAAA,CAAyB,GAAG,MAAM,CAAA;AAAA,MACpC;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AACrC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAa,OAAA,CAAQ,OAAA,CAAyB,KAAA,CAAM,GAAG,CAAA;AAC7D,UAAA,OAAO,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAyB,SAAS,CAAA;AAAA,QAC9D,SAAS,CAAA,EAAG;AACV,UAAA,wBAAA,CAAyB,GAAG,SAAS,CAAA;AAAA,QACvC;AAAA,MACF;AAEA,MAAA,OAAO,WAAW,GAAG,CAAA;AAAA,IACvB;AAAA,GACD,CAAA;AACH;;;AChOO,SAAS,cAAgD,OAAA,EAAkB;AAChF,EAAA,OAAO,CAIL,MAAA,KAWG;AACH,IAAA,OAAO,OAAO,OAAA,EAAS,MAAA,CAAO,QAAS,EAAC,EAAW,OAAO,OAAA,EAAS;AAAA,MACjE,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AACF;AAuBO,SAAS,iBAAmD,OAAA,EAAkB;AACnF,EAAA,OAAO,CAIL,MAAA,KAWG;AACH,IAAA,OAAO,UAAU,OAAA,EAAS,MAAA,CAAO,QAAS,EAAC,EAAW,OAAO,OAAA,EAAS;AAAA,MACpE,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AACF;AAuBO,SAAS,eAAiD,OAAA,EAAkB;AACjF,EAAA,OAAO,CAIL,MAAA,KAWG;AACH,IAAA,OAAO,QAAQ,OAAA,EAAS,MAAA,CAAO,QAAS,EAAC,EAAW,OAAO,OAAA,EAAS;AAAA,MAClE,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH,CAAA;AACF;AA8BO,SAAS,mBAAA,CAQd,OACA,aAAA,EASA;AACA,EAAA,OAAO,eAAA;AAAA,IACL,KAAA;AAAA,IACA;AAAA,GACF;AACF;AA8BO,SAAS,sBAAA,CAQd,UACA,aAAA,EASA;AACA,EAAA,OAAO,eAAA;AAAA,IACL,QAAA;AAAA,IACA;AAAA,GACF;AACF;AA+BO,SAAS,oBAAA,CAQd,QACA,aAAA,EASA;AACA,EAAA,OAAO,eAAA;AAAA,IACL,MAAA;AAAA,IACA;AAAA,GACF;AACF;AC9SO,SAAS,MAAA,CAKd,WACA,MAAA,EAMA;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,GAAA,EAAK,IAAI,SAAS,CAAA;AAAA,IAClB,aAAA,EAAeA,MAAE,MAAA;AAAO,GACzB,CAAA;AACH;AAGO,SAAS,YAAA,CAId,WAAsB,MAAA,EAAgB;AACtC,EAAA,OAAOA,KAAAA,CAAE,KAAA,CAAM,CAAC,MAAA,CAAO,SAAA,EAAW,MAAM,CAAA,EAAGA,KAAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACtD;AAmCO,SAAS,QAAA,CACd,MACA,KAAA,EACA;AAEA,EAAA,MAAM,YAAA,GAAe,kBAAkB,KAAK,CAAA;AAG5C,EAAA,MAAM,KAAA,GAAQQ,YAAA,CAA0D,IAAA,EAAM,YAAY,CAAA;AAG1F,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,EAAMR,KAAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAGzC,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAE,KAAA,CAAM,IAAI,CAAA;AAG7B,EAAA,OAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,IAC1B,KAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AAUH","file":"index.js","sourcesContent":["/**\n * IDs + registry for Convex + Zod v4\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n\n// Simple registry for metadata\nconst metadata = new WeakMap<z.ZodTypeAny, any>()\n\nexport const registryHelpers = {\n getMetadata: (type: z.ZodTypeAny) => metadata.get(type),\n setMetadata: (type: z.ZodTypeAny, meta: any) => metadata.set(type, meta)\n}\n\n/**\n * Create a Zod validator for a Convex Id\n *\n * Uses the string → transform → brand pattern for proper type narrowing with ctx.db.get()\n * This aligns with Zod v4 best practices and matches convex-helpers implementation\n */\nexport function zid<TableName extends string>(\n tableName: TableName\n): z.ZodType<GenericId<TableName>> & { _tableName: TableName } {\n // Use the string → transform → brand pattern (aligned with Zod v4 best practices)\n const baseSchema = z\n .string()\n .refine(val => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n })\n .transform(val => {\n // Cast to GenericId while keeping the string value\n return val as string & GenericId<TableName>\n })\n .brand(`ConvexId_${tableName}`) // Use native Zod v4 .brand() method\n // Add a human-readable marker for client-side introspection utilities\n // used in apps/native (e.g., to detect relationship fields in dynamic forms).\n .describe(`convexId:${tableName}`)\n\n // Store metadata for registry lookup so mapping can convert to v.id(tableName)\n registryHelpers.setMetadata(baseSchema, {\n isConvexId: true,\n tableName\n })\n\n // Add the tableName property for type-level detection\n const branded = baseSchema as any\n branded._tableName = tableName\n\n return branded as z.ZodType<GenericId<TableName>> & { _tableName: TableName }\n}\n\nexport type Zid<TableName extends string> = ReturnType<typeof zid<TableName>>\n","import { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Registry for base type codecs\ntype BaseCodec = {\n check: (schema: any) => boolean\n toValidator: (schema: any) => any\n fromConvex: (value: any, schema: any) => any\n toConvex: (value: any, schema: any) => any\n}\n\nconst baseCodecs: BaseCodec[] = []\n\nexport function registerBaseCodec(codec: BaseCodec): void {\n baseCodecs.unshift(codec) // Add to front for priority\n}\n\nexport function findBaseCodec(schema: any): BaseCodec | undefined {\n return baseCodecs.find(codec => codec.check(schema))\n}\n\n// Built-in codec for Date\nregisterBaseCodec({\n check: schema => schema instanceof z.ZodDate,\n toValidator: () => v.float64(),\n fromConvex: value => {\n if (typeof value === 'number') {\n return new Date(value)\n }\n return value\n },\n toConvex: value => {\n if (value instanceof Date) {\n return value.getTime()\n }\n return value\n }\n})\n\n// Helper to convert Zod's internal types to ZodTypeAny\nfunction asZodType<T>(schema: T): z.ZodTypeAny {\n return schema as unknown as z.ZodTypeAny\n}\n\n// Helper to check if a schema is a Date type through the registry\nexport function isDateSchema(schema: any): boolean {\n if (schema instanceof z.ZodDate) return true\n\n // Check through optional/nullable (these have public unwrap())\n if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable) {\n return isDateSchema(asZodType(schema.unwrap()))\n }\n\n // Cannot check transforms/pipes without _def access\n // This is a limitation of using only public APIs\n\n return false\n}\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod enum types to Convex validators\nexport function convertEnumType(actualValidator: z.ZodEnum<any>): GenericValidator {\n const options = (actualValidator as any).options\n if (options && Array.isArray(options) && options.length > 0) {\n // Filter out undefined/null and convert to Convex validators\n const validLiterals = options\n .filter((opt: any) => opt !== undefined && opt !== null)\n .map((opt: any) => v.literal(opt))\n\n if (validLiterals.length === 1) {\n const [first] = validLiterals\n return first as Validator<any, 'required', any>\n } else if (validLiterals.length >= 2) {\n const [first, second, ...rest] = validLiterals\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n } else {\n return v.any()\n }\n}\n","import type { GenericValidator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod nullable types to Convex validators\nexport function convertNullableType(\n actualValidator: z.ZodNullable<any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): { validator: GenericValidator; isOptional: boolean } {\n const innerSchema = actualValidator.unwrap()\n if (innerSchema && innerSchema instanceof z.ZodType) {\n // Check if the inner schema is optional\n if (innerSchema instanceof z.ZodOptional) {\n // For nullable(optional(T)), we want optional(union(T, null))\n const innerInnerSchema = innerSchema.unwrap()\n const innerInnerValidator = zodToConvexInternal(innerInnerSchema as z.ZodType, visited)\n return {\n validator: v.union(innerInnerValidator, v.null()),\n isOptional: true // Mark as optional so it gets wrapped later\n }\n } else {\n const innerValidator = zodToConvexInternal(innerSchema, visited)\n return {\n validator: v.union(innerValidator, v.null()),\n isOptional: false\n }\n }\n } else {\n return {\n validator: v.any(),\n isOptional: false\n }\n }\n}\n","import type { GenericValidator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod record types to Convex validators\nexport function convertRecordType(\n actualValidator: z.ZodRecord<any, any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n // In Zod v4, when z.record(z.string()) is used with one argument,\n // the argument becomes the value type and key defaults to string.\n // The valueType is stored in _def.valueType (or undefined if single arg)\n let valueType = (actualValidator as any)._def?.valueType\n\n // If valueType is undefined, it means single argument form was used\n // where the argument is actually the value type (stored in keyType)\n if (!valueType) {\n // Workaround: Zod v4 stores the value type in _def.keyType for single-argument z.record().\n // This accesses a private property as there is no public API for this in Zod v4.\n valueType = (actualValidator as any)._def?.keyType\n }\n\n if (valueType && valueType instanceof z.ZodType) {\n // First check if the Zod value type is optional before conversion\n const isZodOptional =\n valueType instanceof z.ZodOptional ||\n valueType instanceof z.ZodDefault ||\n (valueType instanceof z.ZodDefault && valueType.def.innerType instanceof z.ZodOptional)\n\n if (isZodOptional) {\n // For optional record values, we need to handle this specially\n let innerType: z.ZodTypeAny\n let recordDefaultValue: any = undefined\n let recordHasDefault = false\n\n if (valueType instanceof z.ZodDefault) {\n // Handle ZodDefault wrapper\n recordHasDefault = true\n recordDefaultValue = valueType.def.defaultValue\n const innerFromDefault = valueType.def.innerType\n if (innerFromDefault instanceof z.ZodOptional) {\n innerType = innerFromDefault.unwrap() as z.ZodTypeAny\n } else {\n innerType = innerFromDefault as z.ZodTypeAny\n }\n } else if (valueType instanceof z.ZodOptional) {\n // Direct ZodOptional\n innerType = valueType.unwrap() as z.ZodTypeAny\n } else {\n // Shouldn't happen based on isZodOptional check\n innerType = valueType as z.ZodTypeAny\n }\n\n // Convert the inner type to Convex and wrap in union with null\n const innerConvex = zodToConvexInternal(innerType, visited)\n const unionValidator = v.union(innerConvex, v.null())\n\n // Add default metadata if present\n if (recordHasDefault) {\n ;(unionValidator as any)._zodDefault = recordDefaultValue\n }\n\n return v.record(v.string(), unionValidator)\n } else {\n // Non-optional values can be converted normally\n return v.record(v.string(), zodToConvexInternal(valueType, visited))\n }\n } else {\n return v.record(v.string(), v.any())\n }\n}\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod discriminated union types to Convex validators\nexport function convertDiscriminatedUnionType(\n actualValidator: z.ZodDiscriminatedUnion<any, any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n const options =\n (actualValidator as any).def?.options || (actualValidator as any).def?.optionsMap?.values()\n if (options) {\n const opts = Array.isArray(options) ? options : Array.from(options)\n if (opts.length >= 2) {\n // IMPORTANT: Create a new visited set for each union member to prevent false circular\n // reference detection. The same schema can legitimately appear in multiple union branches.\n const convexOptions = opts.map((opt: any) => {\n const branchVisited = new Set(visited)\n return zodToConvexInternal(opt, branchVisited)\n }) as Validator<any, 'required', any>[]\n const [first, second, ...rest] = convexOptions\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n } else {\n return v.any()\n }\n}\n\n// Helper: Convert Zod union types to Convex validators\nexport function convertUnionType(\n actualValidator: z.ZodUnion<any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n const options = (actualValidator as any).options\n if (options && Array.isArray(options) && options.length > 0) {\n if (options.length === 1) {\n return zodToConvexInternal(options[0], visited)\n } else {\n // Convert each option recursively\n // IMPORTANT: Create a new visited set for each union member to prevent false circular\n // reference detection. The same schema can legitimately appear in multiple union branches.\n // However, we do want to preserve the parent visited set to catch actual circular refs\n // that involve the union itself.\n const convexOptions = options.map((opt: any) => {\n // Create a new Set that includes the parent's visited schemas but won't pollute it\n const branchVisited = new Set(visited)\n return zodToConvexInternal(opt, branchVisited)\n }) as Validator<any, 'required', any>[]\n if (convexOptions.length >= 2) {\n const [first, second, ...rest] = convexOptions\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n }\n } else {\n return v.any()\n }\n}\n","import { v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers, type Zid } from '../ids'\n\n// Helper to check if a schema is a Zid\nexport function isZid<T extends string>(schema: z.ZodType): schema is Zid<T> {\n // Check our metadata registry for ConvexId marker\n const metadata = registryHelpers.getMetadata(schema)\n return (\n metadata?.isConvexId === true && metadata?.tableName && typeof metadata.tableName === 'string'\n )\n}\n\n// union helpers\nexport function makeUnion(members: any[]): any {\n const nonNull = members.filter(Boolean)\n if (nonNull.length === 0) return v.any()\n if (nonNull.length === 1) return nonNull[0]\n return v.union(nonNull[0], nonNull[1], ...nonNull.slice(2))\n}\n\nexport function getObjectShape(obj: any): Record<string, any> {\n // Use public API .shape property for ZodObject\n if (obj instanceof z.ZodObject) {\n return obj.shape\n }\n // Fallback for edge cases\n if (obj && typeof obj === 'object' && typeof obj.shape === 'object') {\n return obj.shape as Record<string, any>\n }\n return {}\n}\n","import type { GenericValidator, PropertyValidators } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers } from '../ids'\nimport { findBaseCodec } from '../registry'\nimport {\n convertDiscriminatedUnionType,\n convertEnumType,\n convertNullableType,\n convertRecordType,\n convertUnionType\n} from './handlers'\nimport type {\n ConvexValidatorFromZod,\n ConvexValidatorFromZodFieldsAuto,\n ZodValidator\n} from './types'\nimport { getObjectShape, isZid } from './utils'\n\n// Internal conversion function using ZodType with def.type detection\nfunction zodToConvexInternal<Z extends z.ZodTypeAny>(\n zodValidator: Z,\n visited: Set<z.ZodTypeAny> = new Set()\n): ConvexValidatorFromZod<Z, 'required'> {\n // Guard against undefined/null validators (can happen with { field: undefined } in args)\n if (!zodValidator) {\n return v.any() as ConvexValidatorFromZod<Z, 'required'>\n }\n\n // Detect circular references to prevent infinite recursion\n if (visited.has(zodValidator)) {\n return v.any() as ConvexValidatorFromZod<Z, 'required'>\n }\n visited.add(zodValidator)\n\n // Check for default and optional wrappers\n let actualValidator = zodValidator\n let isOptional = false\n let defaultValue: any = undefined\n let hasDefault = false\n\n // Handle ZodDefault (which wraps ZodOptional when using .optional().default())\n // Note: We access _def properties directly because Zod v4 doesn't expose public APIs\n // for unwrapping defaults. The removeDefault() method exists but returns a new schema\n // without preserving references, which breaks our visited Set tracking.\n if (zodValidator instanceof z.ZodDefault) {\n hasDefault = true\n defaultValue = (zodValidator as any).def?.defaultValue\n actualValidator = (zodValidator as any).def?.innerType as Z\n }\n\n // Check for optional (may be wrapped inside ZodDefault)\n if (actualValidator instanceof z.ZodOptional) {\n isOptional = true\n actualValidator = actualValidator.unwrap() as Z\n\n // If the unwrapped type is ZodDefault, handle it here\n if (actualValidator instanceof z.ZodDefault) {\n hasDefault = true\n defaultValue = (actualValidator as any).def?.defaultValue\n actualValidator = (actualValidator as any).def?.innerType as Z\n }\n }\n\n let convexValidator: GenericValidator\n\n // Check for Zid first (special case)\n if (isZid(actualValidator)) {\n const metadata = registryHelpers.getMetadata(actualValidator)\n const tableName = metadata?.tableName || 'unknown'\n convexValidator = v.id(tableName)\n } else {\n // Use def.type for robust, performant type detection instead of instanceof checks.\n // Rationale:\n // 1. Performance: Single switch statement vs. cascading instanceof checks\n // 2. Completeness: def.type covers ALL Zod variants including formats (email, url, uuid, etc.)\n // 3. Future-proof: Zod's internal structure is stable; instanceof checks can miss custom types\n // 4. Precision: def.type distinguishes between semantically different types (date vs number)\n // This private API access is intentional and necessary for comprehensive type coverage.\n //\n // Compatibility: This code relies on the internal `.def.type` property of ZodType.\n // This structure has been stable across Zod v3.x and v4.x. If upgrading Zod major versions,\n // verify that `.def.type` is still present and unchanged.\n const defType = (actualValidator as any).def?.type\n\n switch (defType) {\n case 'string':\n // This catches ZodString and ALL string format types (email, url, uuid, etc.)\n convexValidator = v.string()\n break\n case 'number':\n convexValidator = v.float64()\n break\n case 'bigint':\n convexValidator = v.int64()\n break\n case 'boolean':\n convexValidator = v.boolean()\n break\n case 'date':\n convexValidator = v.float64() // Dates are stored as timestamps in Convex\n break\n case 'null':\n convexValidator = v.null()\n break\n case 'nan':\n convexValidator = v.float64()\n break\n case 'array': {\n // Use classic API: ZodArray has .element property\n if (actualValidator instanceof z.ZodArray) {\n const element = (actualValidator as any).element\n if (element && element instanceof z.ZodType) {\n convexValidator = v.array(zodToConvexInternal(element, visited))\n } else {\n convexValidator = v.array(v.any())\n }\n } else {\n convexValidator = v.array(v.any())\n }\n break\n }\n case 'object': {\n // Use classic API: ZodObject has .shape property\n if (actualValidator instanceof z.ZodObject) {\n const shape = actualValidator.shape\n const convexShape: PropertyValidators = {}\n for (const [key, value] of Object.entries(shape)) {\n if (value && value instanceof z.ZodType) {\n convexShape[key] = zodToConvexInternal(value, visited)\n }\n }\n convexValidator = v.object(convexShape)\n } else {\n convexValidator = v.object({})\n }\n break\n }\n case 'union': {\n if (actualValidator instanceof z.ZodUnion) {\n convexValidator = convertUnionType(actualValidator, visited, zodToConvexInternal)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'discriminatedUnion': {\n convexValidator = convertDiscriminatedUnionType(\n actualValidator as any,\n visited,\n zodToConvexInternal\n )\n break\n }\n case 'literal': {\n // Use classic API: ZodLiteral has .value property\n if (actualValidator instanceof z.ZodLiteral) {\n const literalValue = (actualValidator as any).value\n if (literalValue !== undefined && literalValue !== null) {\n convexValidator = v.literal(literalValue)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'enum': {\n if (actualValidator instanceof z.ZodEnum) {\n convexValidator = convertEnumType(actualValidator)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'record': {\n if (actualValidator instanceof z.ZodRecord) {\n convexValidator = convertRecordType(actualValidator, visited, zodToConvexInternal)\n } else {\n convexValidator = v.record(v.string(), v.any())\n }\n break\n }\n case 'transform':\n case 'pipe': {\n // Check for registered codec first\n const codec = findBaseCodec(actualValidator)\n if (codec) {\n convexValidator = codec.toValidator(actualValidator)\n } else {\n // Check for brand metadata\n const metadata = registryHelpers.getMetadata(actualValidator)\n if (metadata?.brand && metadata?.originalSchema) {\n // For branded types created by our zBrand function, use the original schema\n convexValidator = zodToConvexInternal(metadata.originalSchema, visited)\n } else {\n // For non-registered transforms, return v.any()\n convexValidator = v.any()\n }\n }\n break\n }\n case 'nullable': {\n if (actualValidator instanceof z.ZodNullable) {\n const result = convertNullableType(actualValidator, visited, zodToConvexInternal)\n convexValidator = result.validator\n if (result.isOptional) {\n isOptional = true\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'tuple': {\n // Handle tuple types as objects with numeric keys\n if (actualValidator instanceof z.ZodTuple) {\n const items = (actualValidator as any).def?.items as z.ZodTypeAny[] | undefined\n if (items && items.length > 0) {\n const convexShape: PropertyValidators = {}\n items.forEach((item, index) => {\n convexShape[`_${index}`] = zodToConvexInternal(item, visited)\n })\n convexValidator = v.object(convexShape)\n } else {\n convexValidator = v.object({})\n }\n } else {\n convexValidator = v.object({})\n }\n break\n }\n case 'lazy': {\n // Handle lazy schemas by resolving them\n // Circular references are protected by the visited set check at function start\n if (actualValidator instanceof z.ZodLazy) {\n try {\n const getter = (actualValidator as any).def?.getter\n if (getter) {\n const resolvedSchema = getter()\n if (resolvedSchema && resolvedSchema instanceof z.ZodType) {\n convexValidator = zodToConvexInternal(resolvedSchema, visited)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n } catch {\n // If resolution fails, fall back to 'any'\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'any':\n // Handle z.any() directly\n convexValidator = v.any()\n break\n case 'unknown':\n // Handle z.unknown() as any\n convexValidator = v.any()\n break\n case 'undefined':\n case 'void':\n case 'never':\n // These types don't have good Convex equivalents\n convexValidator = v.any()\n break\n case 'intersection':\n // Can't properly handle intersections\n convexValidator = v.any()\n break\n default:\n // For any unrecognized def.type, return v.any()\n // No instanceof fallbacks - keep it simple and performant\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[zodvex] Unrecognized Zod type \"${defType}\" encountered. Falling back to v.any().`,\n 'Schema:',\n actualValidator\n )\n }\n convexValidator = v.any()\n break\n }\n }\n\n // For optional or default fields, always use v.optional()\n const finalValidator = isOptional || hasDefault ? v.optional(convexValidator) : convexValidator\n\n // Add metadata if there's a default value\n if (hasDefault && typeof finalValidator === 'object' && finalValidator !== null) {\n ;(finalValidator as any)._zodDefault = defaultValue\n }\n\n return finalValidator as ConvexValidatorFromZod<Z, 'required'>\n}\n\nexport function zodToConvex<Z extends z.ZodTypeAny | ZodValidator>(\n zod: Z\n): Z extends z.ZodTypeAny\n ? ConvexValidatorFromZod<Z, 'required'>\n : Z extends ZodValidator\n ? ConvexValidatorFromZodFieldsAuto<Z>\n : never {\n if (typeof zod === 'object' && zod !== null && !(zod instanceof z.ZodType)) {\n return zodToConvexFields(zod as ZodValidator) as any\n }\n\n return zodToConvexInternal(zod as z.ZodTypeAny) as any\n}\n\nexport function zodToConvexFields<Z extends z.ZodRawShape>(\n zod: Z\n): ConvexValidatorFromZodFieldsAuto<Z> {\n // If it's a ZodObject, extract the shape\n const fields = zod instanceof z.ZodObject ? zod.shape : zod\n\n // Build the result object directly to preserve types\n const result: any = {}\n for (const [key, value] of Object.entries(fields)) {\n result[key] = zodToConvexInternal(value as z.ZodTypeAny)\n }\n\n return result as ConvexValidatorFromZodFieldsAuto<Z>\n}\n","import { z } from 'zod'\nimport { zodToConvex } from './mapping'\nimport { findBaseCodec, isDateSchema } from './registry'\n\n// Helper to convert Zod's internal types to ZodTypeAny\nfunction asZodType<T>(schema: T): z.ZodTypeAny {\n return schema as unknown as z.ZodTypeAny\n}\n\nexport type ConvexCodec<T> = {\n validator: any\n encode: (value: T) => any\n decode: (value: any) => T\n pick: <K extends keyof T>(keys: K[]) => ConvexCodec<Pick<T, K>>\n}\n\nexport function convexCodec<T>(schema: z.ZodType<T>): ConvexCodec<T> {\n const validator = zodToConvex(schema)\n\n return {\n validator,\n encode: (value: T) => toConvexJS(schema, value),\n decode: (value: any) => fromConvexJS(value, schema),\n pick: <K extends keyof T>(keys: K[] | Record<K, true>) => {\n if (!(schema instanceof z.ZodObject)) {\n throw new Error('pick() can only be called on object schemas')\n }\n // Handle both array and object formats\n const pickObj = Array.isArray(keys)\n ? keys.reduce((acc, k) => ({ ...acc, [k]: true }), {} as any)\n : keys\n const pickedSchema = schema.pick(pickObj as any)\n return convexCodec(pickedSchema) as ConvexCodec<Pick<T, K>>\n }\n }\n}\n\n// Convert JS values to Convex-safe JSON (handle Dates, remove undefined)\nexport function toConvexJS(schema?: any, value?: any): any {\n // If no schema provided, do basic conversion\n if (!schema || arguments.length === 1) {\n value = schema\n return basicToConvex(value)\n }\n\n // Use schema-aware conversion\n return schemaToConvex(value, schema)\n}\n\nfunction basicToConvex(value: any): any {\n if (value === undefined) return undefined\n if (value === null) return null\n if (value instanceof Date) return value.getTime()\n\n if (Array.isArray(value)) {\n return value.map(basicToConvex)\n }\n\n if (value && typeof value === 'object') {\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = basicToConvex(v)\n }\n }\n return result\n }\n\n return value\n}\n\nfunction schemaToConvex(value: any, schema: any): any {\n if (value === undefined || value === null) return value\n\n // Check base codec registry first\n const codec = findBaseCodec(schema)\n if (codec) {\n return codec.toConvex(value, schema)\n }\n\n // Handle wrapper types\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n schema instanceof z.ZodDefault\n ) {\n // Use unwrap() method which is available on these types\n const inner = schema.unwrap()\n return schemaToConvex(value, asZodType(inner))\n }\n\n // Handle Date specifically\n if (schema instanceof z.ZodDate && value instanceof Date) {\n return value.getTime()\n }\n\n // Handle arrays\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value\n return value.map(item => schemaToConvex(item, schema.element))\n }\n\n // Handle objects\n if (schema instanceof z.ZodObject) {\n if (!value || typeof value !== 'object') return value\n const shape = schema.shape\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = shape[k] ? schemaToConvex(v, shape[k]) : basicToConvex(v)\n }\n }\n return result\n }\n\n // Handle unions\n if (schema instanceof z.ZodUnion) {\n // Try each option to see which one matches\n for (const option of schema.options) {\n try {\n ;(option as any).parse(value) // Validate against this option\n return schemaToConvex(value, option)\n } catch {\n // Try next option\n }\n }\n }\n\n // Handle records\n if (schema instanceof z.ZodRecord) {\n if (!value || typeof value !== 'object') return value\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = schemaToConvex(v, schema.valueType)\n }\n }\n return result\n }\n\n // Default passthrough\n return basicToConvex(value)\n}\n\n// Convert Convex JSON back to JS values (handle timestamps -> Dates)\nexport function fromConvexJS(value: any, schema: any): any {\n if (value === undefined || value === null) return value\n\n // Check base codec registry first\n const codec = findBaseCodec(schema)\n if (codec) {\n return codec.fromConvex(value, schema)\n }\n\n // Handle wrapper types\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n schema instanceof z.ZodDefault\n ) {\n // Use unwrap() method which is available on these types\n const inner = schema.unwrap()\n return fromConvexJS(value, asZodType(inner))\n }\n\n // Handle Date specifically\n if (schema instanceof z.ZodDate && typeof value === 'number') {\n return new Date(value)\n }\n\n // Check if schema is a Date through effects/transforms\n if (isDateSchema(schema) && typeof value === 'number') {\n return new Date(value)\n }\n\n // Handle arrays\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value\n return value.map(item => fromConvexJS(item, schema.element))\n }\n\n // Handle objects\n if (schema instanceof z.ZodObject) {\n if (!value || typeof value !== 'object') return value\n const shape = schema.shape\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = shape[k] ? fromConvexJS(v, shape[k]) : v\n }\n return result\n }\n\n // Handle unions\n if (schema instanceof z.ZodUnion) {\n // Try to decode with each option\n for (const option of schema.options) {\n try {\n const decoded = fromConvexJS(value, option)\n ;(option as any).parse(decoded) // Validate the decoded value\n return decoded\n } catch {\n // Try next option\n }\n }\n }\n\n // Handle records\n if (schema instanceof z.ZodRecord) {\n if (!value || typeof value !== 'object') return value\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = fromConvexJS(v, schema.valueType)\n }\n return result\n }\n\n // Handle effects and transforms\n // Note: ZodPipe doesn't exist in Zod v4, only ZodTransform\n if (schema instanceof z.ZodTransform) {\n // Cannot access inner schema without _def, return value as-is\n return value\n }\n\n return value\n}\n","import { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { getObjectShape } from './mapping'\n\nexport function pick<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (key in obj) result[key] = obj[key]\n }\n return result\n}\n\n// Typed identity helper for returns schemas\nexport function returnsAs<R extends z.ZodTypeAny>() {\n return <T extends z.input<R>>(v: T) => v\n}\n\n// Format ZodError issues into a compact, consistent structure\nexport function formatZodIssues(\n error: z.ZodError,\n context?: 'args' | 'returns' | 'input' | 'output' | 'codec'\n) {\n return {\n error: 'ZodValidationError',\n context,\n issues: error.issues.map(issue => ({\n path: Array.isArray(issue.path) ? issue.path.join('.') : String(issue.path ?? ''),\n code: issue.code,\n message: issue.message\n })),\n // Keep a flattened snapshot for easier debugging without cyclic refs\n flatten: JSON.parse(JSON.stringify(error.flatten?.() ?? {}))\n }\n}\n\n// Handle Zod validation errors consistently across all wrappers\n// Throws a ConvexError with formatted issues if the error is a ZodError, otherwise re-throws\nexport function handleZodValidationError(\n e: unknown,\n context: 'args' | 'returns' | 'input' | 'output' | 'codec'\n): never {\n if (e instanceof z.ZodError) {\n throw new ConvexError(formatZodIssues(e, context))\n }\n throw e\n}\n\n// Helper: standard Convex paginate() result schema\nexport function zPaginated<T extends z.ZodTypeAny>(item: T) {\n return z.object({\n page: z.array(item),\n isDone: z.boolean(),\n continueCursor: z.string().nullable().optional()\n })\n}\n\n/**\n * Maps Date fields to number fields for docSchema generation.\n * Handles Date, Date.optional(), Date.nullable(), and Date.default() cases.\n * Returns the original field for non-Date types.\n */\nexport function mapDateFieldToNumber(field: z.ZodTypeAny): z.ZodTypeAny {\n // Direct Date field\n if (field instanceof z.ZodDate) {\n return z.number()\n }\n\n // Optional Date field\n if (field instanceof z.ZodOptional && field.unwrap() instanceof z.ZodDate) {\n return z.number().optional()\n }\n\n // Nullable Date field\n if (field instanceof z.ZodNullable && field.unwrap() instanceof z.ZodDate) {\n return z.number().nullable()\n }\n\n // Date with default value\n if (field instanceof z.ZodDefault) {\n const inner = field.removeDefault()\n if (inner instanceof z.ZodDate) {\n return z.number().optional()\n }\n }\n\n // Non-Date field - return as-is\n return field\n}\n\n// Schema picking utilities (moved from pick.ts for consolidation)\ntype Mask = readonly string[] | Record<string, boolean | 1 | true>\n\nfunction toKeys(mask: Mask): string[] {\n if (Array.isArray(mask)) return mask.map(String)\n return Object.keys(mask).filter(k => !!(mask as any)[k])\n}\n\n/**\n * Returns a plain shape object containing only the selected fields.\n * Accepts either a ZodObject or a raw shape object.\n */\nexport function pickShape(\n schemaOrShape: z.ZodObject<any> | Record<string, any>,\n mask: Mask\n): Record<string, any> {\n const keys = toKeys(mask)\n const shape =\n schemaOrShape instanceof z.ZodObject ? getObjectShape(schemaOrShape) : schemaOrShape || {}\n\n const out: Record<string, any> = {}\n for (const k of keys) {\n if (k in shape) out[k] = (shape as any)[k]\n }\n return out\n}\n\n// Builds a fresh Zod object from the selected fields (avoids Zod's .pick())\nexport function safePick(schema: z.ZodObject<any>, mask: Mask): z.ZodObject<any> {\n return z.object(pickShape(schema, mask))\n}\n\n/**\n * Convenience: omit a set of keys by building the complement.\n * Avoids using Zod's .omit() which can cause type depth issues.\n */\nexport function safeOmit(schema: z.ZodObject<any>, mask: Mask): z.ZodObject<any> {\n const shape = getObjectShape(schema)\n const omit = new Set(toKeys(mask))\n const keep = Object.keys(shape).filter(k => !omit.has(k))\n const picked = pickShape(schema, keep)\n return z.object(picked)\n}\n","import {\n type ActionBuilder,\n type ArgsArrayToObject,\n type DefaultFunctionArgs,\n type FunctionVisibility,\n type GenericActionCtx,\n type GenericDataModel,\n type GenericMutationCtx,\n type GenericQueryCtx,\n type MutationBuilder,\n type QueryBuilder\n} from 'convex/server'\nimport { ConvexError, type PropertyValidators } from 'convex/values'\nimport { type Customization, NoOp } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { fromConvexJS, toConvexJS } from './codec'\nimport { type ZodValidator, zodToConvex, zodToConvexFields } from './mapping'\nimport type { ExtractCtx, ExtractVisibility } from './types'\nimport { handleZodValidationError, pick } from './utils'\n\n// Type helpers for args transformation (from zodV3 example)\ntype OneArgArray<ArgsObject extends DefaultFunctionArgs = DefaultFunctionArgs> = [ArgsObject]\n\n// Simple type conversion from a Convex validator to a Zod validator return type\ntype NullToUndefinedOrNull<T> = T extends null ? T | undefined | void : T\ntype Returns<T> = Promise<NullToUndefinedOrNull<T>> | NullToUndefinedOrNull<T>\n\n// The return value before it's been validated: returned by the handler\ntype ReturnValueInput<ReturnsValidator extends z.ZodTypeAny | ZodValidator | void> = [\n ReturnsValidator\n] extends [z.ZodTypeAny]\n ? Returns<z.input<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.input<z.ZodObject<ReturnsValidator>>>\n : any\n\n// The return value after it's been validated: returned to the client\ntype ReturnValueOutput<ReturnsValidator extends z.ZodTypeAny | ZodValidator | void> = [\n ReturnsValidator\n] extends [z.ZodTypeAny]\n ? Returns<z.output<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.output<z.ZodObject<ReturnsValidator>>>\n : any\n\n// The args before they've been validated: passed from the client\ntype ArgsInput<ArgsValidator extends ZodValidator | z.ZodObject<any> | void> = [\n ArgsValidator\n] extends [z.ZodObject<any>]\n ? [z.input<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.input<z.ZodObject<ArgsValidator>>]\n : OneArgArray\n\n// The args after they've been validated: passed to the handler\ntype ArgsOutput<ArgsValidator extends ZodValidator | z.ZodObject<any> | void> = [\n ArgsValidator\n] extends [z.ZodObject<any>]\n ? [z.output<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.output<z.ZodObject<ArgsValidator>>]\n : OneArgArray\n\ntype Overwrite<T, U> = Omit<T, keyof U> & U\n\n// Hack to simplify how TypeScript renders object types\ntype Expand<ObjectType extends Record<any, any>> = ObjectType extends Record<any, any>\n ? {\n [Key in keyof ObjectType]: ObjectType[Key]\n }\n : never\n\ntype ArgsForHandlerType<\n OneOrZeroArgs extends [] | [Record<string, any>],\n CustomMadeArgs extends Record<string, any>\n> = CustomMadeArgs extends Record<string, never>\n ? OneOrZeroArgs\n : OneOrZeroArgs extends [infer A]\n ? [Expand<A & CustomMadeArgs>]\n : [CustomMadeArgs]\n\n// Helper type for function registration (from zodV3)\ntype Registration<\n FuncType extends 'query' | 'mutation' | 'action',\n Visibility extends FunctionVisibility,\n Args extends DefaultFunctionArgs,\n Output\n> = FuncType extends 'query'\n ? import('convex/server').RegisteredQuery<Visibility, Args, Output>\n : FuncType extends 'mutation'\n ? import('convex/server').RegisteredMutation<Visibility, Args, Output>\n : import('convex/server').RegisteredAction<Visibility, Args, Output>\n\n/**\n * A builder that customizes a Convex function, whether or not it validates\n * arguments. If the customization requires arguments, however, the resulting\n * builder will require argument validation too.\n *\n * This is our own Zod-aware CustomBuilder type that properly handles Zod validators.\n */\nexport type CustomBuilder<\n FuncType extends 'query' | 'mutation' | 'action',\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n InputCtx,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any>\n> = {\n <\n ArgsValidator extends ZodValidator | z.ZodObject<any> | void,\n ReturnsZodValidator extends z.ZodTypeAny | ZodValidator | void = void,\n ReturnValue extends ReturnValueInput<ReturnsZodValidator> = any\n >(\n func:\n | ({\n /**\n * Specify the arguments to the function as a Zod validator.\n */\n args?: ArgsValidator\n handler: (\n ctx: Overwrite<InputCtx, CustomCtx>,\n ...args: ArgsForHandlerType<ArgsOutput<ArgsValidator>, CustomMadeArgs>\n ) => ReturnValue\n /**\n * Validates the value returned by the function.\n * Note: you can't pass an object directly without wrapping it\n * in `z.object()`.\n */\n returns?: ReturnsZodValidator\n /**\n * If true, the function will not be validated by Convex,\n * in case you're seeing performance issues with validating twice.\n */\n skipConvexValidation?: boolean\n } & {\n [key in keyof ExtraArgs as key extends\n | 'args'\n | 'handler'\n | 'skipConvexValidation'\n | 'returns'\n ? never\n : key]: ExtraArgs[key]\n })\n | {\n (\n ctx: Overwrite<InputCtx, CustomCtx>,\n ...args: ArgsForHandlerType<ArgsOutput<ArgsValidator>, CustomMadeArgs>\n ): ReturnValue\n }\n ): Registration<\n FuncType,\n Visibility,\n ArgsArrayToObject<\n CustomArgsValidator extends Record<string, never>\n ? ArgsInput<ArgsValidator>\n : ArgsInput<ArgsValidator> extends [infer A]\n ? [Expand<A & import('convex/values').ObjectType<CustomArgsValidator>>]\n : [import('convex/values').ObjectType<CustomArgsValidator>]\n >,\n ReturnsZodValidator extends void ? ReturnValue : ReturnValueOutput<ReturnsZodValidator>\n >\n}\n\nexport function customFnBuilder<\n Ctx extends Record<string, any>,\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n builder: Builder,\n customization: Customization<Ctx, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n const customInput = customization.input ?? NoOp.input\n const inputArgs = customization.args ?? NoOp.args\n\n return function customBuilder(fn: any): any {\n const { args, handler = fn, returns: maybeObject, ...extra } = fn\n\n const returns =\n maybeObject && !(maybeObject instanceof z.ZodType) ? z.object(maybeObject) : maybeObject\n const returnValidator =\n returns && !fn.skipConvexValidation ? { returns: zodToConvex(returns) } : undefined\n\n if (args && !fn.skipConvexValidation) {\n let argsValidator = args\n let argsSchema: z.ZodObject<any>\n\n if (argsValidator instanceof z.ZodType) {\n if (argsValidator instanceof z.ZodObject) {\n argsSchema = argsValidator\n argsValidator = argsValidator.shape // Get the raw shape for zodToConvexFields\n } else {\n throw new Error(\n 'Unsupported non-object Zod schema for args; please provide an args schema using z.object({...}), e.g. z.object({ foo: z.string() })'\n )\n }\n } else {\n // It's a raw shape object with Zod validators as values\n argsSchema = z.object(argsValidator)\n }\n\n const convexValidator = zodToConvexFields(argsValidator)\n return builder({\n args: { ...convexValidator, ...inputArgs },\n ...returnValidator,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added: any = await customInput(\n ctx,\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )\n const argKeys = Object.keys(argsValidator)\n const rawArgs = pick(allArgs, argKeys)\n const decoded = fromConvexJS(rawArgs, argsSchema)\n const parsed = argsSchema.safeParse(decoded)\n if (!parsed.success) {\n handleZodValidationError(parsed.error, 'args')\n }\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const baseArgs = parsed.data as Record<string, unknown>\n const addedArgs = (added?.args as Record<string, unknown>) ?? {}\n const finalArgs = { ...baseArgs, ...addedArgs }\n const ret = await handler(finalCtx, finalArgs)\n if (returns && !fn.skipConvexValidation) {\n let validated: any\n try {\n validated = (returns as z.ZodTypeAny).parse(ret)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n if (added?.onSuccess) {\n await added.onSuccess({\n ctx,\n args: parsed.data,\n result: validated\n })\n }\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: parsed.data, result: ret })\n }\n return ret\n }\n })\n }\n return builder({\n args: inputArgs,\n ...returnValidator,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added: any = await customInput(\n ctx,\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const baseArgs = allArgs as Record<string, unknown>\n const addedArgs = (added?.args as Record<string, unknown>) ?? {}\n const finalArgs = { ...baseArgs, ...addedArgs }\n const ret = await handler(finalCtx, finalArgs)\n if (returns && !fn.skipConvexValidation) {\n let validated: any\n try {\n validated = (returns as z.ZodTypeAny).parse(ret)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: allArgs, result: validated })\n }\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: allArgs, result: ret })\n }\n return ret\n }\n })\n }\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n DataModel extends GenericDataModel,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<DataModel, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n GenericQueryCtx<DataModel>,\n Visibility,\n ExtraArgs\n>\n\n// Overload 2: No constraint + decoupled ctx\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<any, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n any,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<any, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n // Implementation deliberately uses 'any' ctx to preserve overload behavior\n // while avoiding a GenericDataModel constraint at the implementation level.\n return customFnBuilder<\n any,\n typeof query,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtraArgs\n >(query as any, customization as any) as any\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n _Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n mutation as any,\n customization as any\n ) as any\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n _Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n action as any,\n customization as any\n ) as any\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { fromConvexJS, toConvexJS } from './codec'\nimport { getObjectShape, zodToConvex, zodToConvexFields } from './mapping'\n// Typing helpers to keep handler args/returns precise without deep remapping\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { handleZodValidationError } from './utils'\n\n// Cache to avoid re-checking the same schema\nconst customCheckCache = new WeakMap<z.ZodTypeAny, boolean>()\n\n/**\n * Check if a schema contains z.custom types (runtime check).\n * Includes depth limit to prevent stack overflow on deeply nested schemas.\n */\nfunction containsCustom(schema: z.ZodTypeAny, maxDepth = 50, currentDepth = 0): boolean {\n // Check cache first\n const cached = customCheckCache.get(schema)\n if (cached !== undefined) {\n return cached\n }\n\n // Prevent stack overflow on deeply nested schemas\n if (currentDepth > maxDepth) {\n return false\n }\n\n let result = false\n\n // Use _def.typeName instead of instanceof since ZodCustom is not exported in Zod v4\n if ((schema as any)._def?.typeName === 'ZodCustom') {\n result = true\n } else if (schema instanceof z.ZodUnion) {\n result = (schema.options as z.ZodTypeAny[]).some(opt =>\n containsCustom(opt, maxDepth, currentDepth + 1)\n )\n } else if (schema instanceof z.ZodOptional) {\n result = containsCustom(schema.unwrap() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n } else if (schema instanceof z.ZodNullable) {\n result = containsCustom(schema.unwrap() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n } else if (schema instanceof z.ZodDefault) {\n result = containsCustom(schema.removeDefault() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n }\n\n customCheckCache.set(schema, result)\n return result\n}\n\nexport function zQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n query: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredQuery<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n // Single schema → normalize to { value }\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return query({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalQuery: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredQuery<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zQuery(internalQuery, input, handler, options)\n}\n\nexport function zMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n mutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredMutation<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return mutation({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalMutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredMutation<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zMutation(internalMutation, input, handler, options)\n}\n\nexport function zAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n action: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredAction<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return action({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalAction: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredAction<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zAction(internalAction, input, handler, options) as any\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport type { PropertyValidators } from 'convex/values'\nimport type { Customization } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { type CustomBuilder, customFnBuilder } from './custom'\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { zAction, zMutation, zQuery } from './wrappers'\n\n/**\n * Creates a reusable query builder from a Convex query builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { query } from './_generated/server'\n * import { zQueryBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const zq = zQueryBuilder(query)\n *\n * // Use it with Convex-style object syntax\n * export const getUser = zq({\n * args: { id: z.string() },\n * handler: async (ctx, { id }) => {\n * return ctx.db.get(id)\n * }\n * })\n * ```\n */\nexport function zQueryBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredQuery<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zQuery(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a reusable mutation builder from a Convex mutation builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { mutation } from './_generated/server'\n * import { zMutationBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const zm = zMutationBuilder(mutation)\n *\n * // Use it with Convex-style object syntax\n * export const updateUser = zm({\n * args: { id: z.string(), name: z.string() },\n * handler: async (ctx, { id, name }) => {\n * return ctx.db.patch(id, { name })\n * }\n * })\n * ```\n */\nexport function zMutationBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredMutation<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zMutation(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a reusable action builder from a Convex action builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { action } from './_generated/server'\n * import { zActionBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const za = zActionBuilder(action)\n *\n * // Use it with Convex-style object syntax\n * export const sendEmail = za({\n * args: { to: z.string().email(), subject: z.string() },\n * handler: async (ctx, { to, subject }) => {\n * // Send email\n * }\n * })\n * ```\n */\nexport function zActionBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredAction<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zAction(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a custom query builder with context injection from a Convex query builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your queries.\n *\n * @example\n * ```ts\n * import { type QueryCtx, query } from './_generated/server'\n * import { zCustomQueryBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authQuery = zCustomQueryBuilder(\n * query,\n * customCtx(async (ctx: QueryCtx) => {\n * const user = await getUserOrThrow(ctx)\n * return { user }\n * })\n * )\n *\n * // Use it with automatic user injection\n * export const getMyProfile = authQuery({\n * args: {},\n * handler: async (ctx) => {\n * // ctx.user is automatically available\n * return ctx.db.get(ctx.user._id)\n * }\n * })\n * ```\n */\nexport function zCustomQueryBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n query as any,\n customization as any\n ) as any\n}\n\n/**\n * Creates a custom mutation builder with context injection from a Convex mutation builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your mutations.\n *\n * @example\n * ```ts\n * import { type MutationCtx, mutation } from './_generated/server'\n * import { zCustomMutationBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authMutation = zCustomMutationBuilder(\n * mutation,\n * customCtx(async (ctx: MutationCtx) => {\n * const user = await getUserOrThrow(ctx)\n * return { user }\n * })\n * )\n *\n * // Use it with automatic user injection\n * export const updateProfile = authMutation({\n * args: { name: z.string() },\n * handler: async (ctx, { name }) => {\n * // ctx.user is automatically available\n * await ctx.db.patch(ctx.user._id, { name })\n * }\n * })\n * ```\n */\nexport function zCustomMutationBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n mutation as any,\n customization as any\n ) as any\n}\n\n/**\n * Creates a custom action builder with context injection from a Convex action builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your actions.\n *\n * @example\n * ```ts\n * import { type ActionCtx, action } from './_generated/server'\n * import { zCustomActionBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authAction = zCustomActionBuilder(\n * action,\n * customCtx(async (ctx: ActionCtx) => {\n * const identity = await ctx.auth.getUserIdentity()\n * if (!identity) throw new Error('Unauthorized')\n * return { userId: identity.subject }\n * })\n * )\n *\n * // Use it with automatic auth injection\n * export const sendEmail = authAction({\n * args: { to: z.string().email() },\n * handler: async (ctx, { to }) => {\n * // ctx.userId is automatically available\n * await sendEmailService(to, ctx.userId)\n * }\n * })\n * ```\n */\nexport function zCustomActionBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n action as any,\n customization as any\n ) as any\n}\n","import type { GenericId } from 'convex/values'\nimport { Table } from 'convex-helpers/server'\nimport { z } from 'zod'\nimport { zid } from './ids'\nimport { type ConvexValidatorFromZodFieldsAuto, zodToConvexFields } from './mapping'\n\n// Helper to create a Zod schema for a Convex document\nexport function zodDoc<\n TableName extends string,\n Shape extends z.ZodRawShape,\n Schema extends z.ZodObject<Shape>\n>(\n tableName: TableName,\n schema: Schema\n): z.ZodObject<\n Shape & {\n _id: ReturnType<typeof zid<TableName>>\n _creationTime: z.ZodNumber\n }\n> {\n // Use extend to preserve the original schema's type information\n return schema.extend({\n _id: zid(tableName),\n _creationTime: z.number()\n }) as any\n}\n\n// Helper to create nullable doc schema\nexport function zodDocOrNull<\n TableName extends string,\n Shape extends z.ZodRawShape,\n Schema extends z.ZodObject<Shape>\n>(tableName: TableName, schema: Schema) {\n return z.union([zodDoc(tableName, schema), z.null()])\n}\n\n/**\n * Defines a Convex table using a raw Zod shape (an object mapping field names to Zod types).\n *\n * This function intentionally accepts a raw shape instead of a ZodObject instance.\n * Accepting raw shapes allows TypeScript to infer field types more accurately and efficiently,\n * leading to better type inference and performance throughout the codebase.\n * This architectural decision is important for projects that rely heavily on type safety and\n * developer experience, as it avoids the type erasure that can occur when using ZodObject directly.\n *\n * Returns the Table definition along with Zod schemas for documents and arrays.\n *\n * @param name - The table name\n * @param shape - A raw object mapping field names to Zod validators\n * @returns A Table with attached shape, zDoc schema, and docArray helper\n *\n * @example\n * ```ts\n * const Users = zodTable('users', {\n * name: z.string(),\n * email: z.string().email(),\n * age: z.number().optional()\n * })\n *\n * // Use in schema\n * export default defineSchema({ users: Users.table })\n *\n * // Use for return types\n * export const getUsers = zQuery(query, {},\n * async (ctx) => ctx.db.query('users').collect(),\n * { returns: Users.docArray }\n * )\n * ```\n */\nexport function zodTable<TableName extends string, Shape extends Record<string, z.ZodTypeAny>>(\n name: TableName,\n shape: Shape\n) {\n // Convert fields with proper types\n const convexFields = zodToConvexFields(shape) as ConvexValidatorFromZodFieldsAuto<Shape>\n\n // Create the Table from convex-helpers with explicit type\n const table = Table<ConvexValidatorFromZodFieldsAuto<Shape>, TableName>(name, convexFields)\n\n // Create zDoc schema with system fields\n const zDoc = zodDoc(name, z.object(shape))\n\n // Create docArray helper for return types\n const docArray = z.array(zDoc)\n\n // Attach everything for comprehensive usage\n return Object.assign(table, {\n shape,\n zDoc,\n docArray\n }) as typeof table & {\n shape: Shape\n zDoc: z.ZodObject<\n Shape & {\n _id: ReturnType<typeof zid<TableName>>\n _creationTime: z.ZodNumber\n }\n >\n docArray: z.ZodArray<typeof zDoc>\n }\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -145,7 +145,10 @@ function convertDiscriminatedUnionType(actualValidator, visited, zodToConvexInte
|
|
|
145
145
|
if (options) {
|
|
146
146
|
const opts = Array.isArray(options) ? options : Array.from(options);
|
|
147
147
|
if (opts.length >= 2) {
|
|
148
|
-
const convexOptions = opts.map((opt) =>
|
|
148
|
+
const convexOptions = opts.map((opt) => {
|
|
149
|
+
const branchVisited = new Set(visited);
|
|
150
|
+
return zodToConvexInternal2(opt, branchVisited);
|
|
151
|
+
});
|
|
149
152
|
const [first, second, ...rest] = convexOptions;
|
|
150
153
|
return v.union(
|
|
151
154
|
first,
|
|
@@ -165,9 +168,10 @@ function convertUnionType(actualValidator, visited, zodToConvexInternal2) {
|
|
|
165
168
|
if (options.length === 1) {
|
|
166
169
|
return zodToConvexInternal2(options[0], visited);
|
|
167
170
|
} else {
|
|
168
|
-
const convexOptions = options.map(
|
|
169
|
-
|
|
170
|
-
|
|
171
|
+
const convexOptions = options.map((opt) => {
|
|
172
|
+
const branchVisited = new Set(visited);
|
|
173
|
+
return zodToConvexInternal2(opt, branchVisited);
|
|
174
|
+
});
|
|
171
175
|
if (convexOptions.length >= 2) {
|
|
172
176
|
const [first, second, ...rest] = convexOptions;
|
|
173
177
|
return v.union(
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ids.ts","../src/registry.ts","../src/mapping/handlers/enum.ts","../src/mapping/handlers/nullable.ts","../src/mapping/handlers/record.ts","../src/mapping/handlers/union.ts","../src/mapping/utils.ts","../src/mapping/core.ts","../src/codec.ts","../src/utils.ts","../src/custom.ts","../src/wrappers.ts","../src/builders.ts","../src/tables.ts"],"names":["z","v","zodToConvexInternal","metadata","asZodType"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * IDs + registry for Convex + Zod v4\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n\n// Simple registry for metadata\nconst metadata = new WeakMap<z.ZodTypeAny, any>()\n\nexport const registryHelpers = {\n getMetadata: (type: z.ZodTypeAny) => metadata.get(type),\n setMetadata: (type: z.ZodTypeAny, meta: any) => metadata.set(type, meta)\n}\n\n/**\n * Create a Zod validator for a Convex Id\n *\n * Uses the string → transform → brand pattern for proper type narrowing with ctx.db.get()\n * This aligns with Zod v4 best practices and matches convex-helpers implementation\n */\nexport function zid<TableName extends string>(\n tableName: TableName\n): z.ZodType<GenericId<TableName>> & { _tableName: TableName } {\n // Use the string → transform → brand pattern (aligned with Zod v4 best practices)\n const baseSchema = z\n .string()\n .refine(val => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n })\n .transform(val => {\n // Cast to GenericId while keeping the string value\n return val as string & GenericId<TableName>\n })\n .brand(`ConvexId_${tableName}`) // Use native Zod v4 .brand() method\n // Add a human-readable marker for client-side introspection utilities\n // used in apps/native (e.g., to detect relationship fields in dynamic forms).\n .describe(`convexId:${tableName}`)\n\n // Store metadata for registry lookup so mapping can convert to v.id(tableName)\n registryHelpers.setMetadata(baseSchema, {\n isConvexId: true,\n tableName\n })\n\n // Add the tableName property for type-level detection\n const branded = baseSchema as any\n branded._tableName = tableName\n\n return branded as z.ZodType<GenericId<TableName>> & { _tableName: TableName }\n}\n\nexport type Zid<TableName extends string> = ReturnType<typeof zid<TableName>>\n","import { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Registry for base type codecs\ntype BaseCodec = {\n check: (schema: any) => boolean\n toValidator: (schema: any) => any\n fromConvex: (value: any, schema: any) => any\n toConvex: (value: any, schema: any) => any\n}\n\nconst baseCodecs: BaseCodec[] = []\n\nexport function registerBaseCodec(codec: BaseCodec): void {\n baseCodecs.unshift(codec) // Add to front for priority\n}\n\nexport function findBaseCodec(schema: any): BaseCodec | undefined {\n return baseCodecs.find(codec => codec.check(schema))\n}\n\n// Built-in codec for Date\nregisterBaseCodec({\n check: schema => schema instanceof z.ZodDate,\n toValidator: () => v.float64(),\n fromConvex: value => {\n if (typeof value === 'number') {\n return new Date(value)\n }\n return value\n },\n toConvex: value => {\n if (value instanceof Date) {\n return value.getTime()\n }\n return value\n }\n})\n\n// Helper to convert Zod's internal types to ZodTypeAny\nfunction asZodType<T>(schema: T): z.ZodTypeAny {\n return schema as unknown as z.ZodTypeAny\n}\n\n// Helper to check if a schema is a Date type through the registry\nexport function isDateSchema(schema: any): boolean {\n if (schema instanceof z.ZodDate) return true\n\n // Check through optional/nullable (these have public unwrap())\n if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable) {\n return isDateSchema(asZodType(schema.unwrap()))\n }\n\n // Cannot check transforms/pipes without _def access\n // This is a limitation of using only public APIs\n\n return false\n}\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod enum types to Convex validators\nexport function convertEnumType(actualValidator: z.ZodEnum<any>): GenericValidator {\n const options = (actualValidator as any).options\n if (options && Array.isArray(options) && options.length > 0) {\n // Filter out undefined/null and convert to Convex validators\n const validLiterals = options\n .filter((opt: any) => opt !== undefined && opt !== null)\n .map((opt: any) => v.literal(opt))\n\n if (validLiterals.length === 1) {\n const [first] = validLiterals\n return first as Validator<any, 'required', any>\n } else if (validLiterals.length >= 2) {\n const [first, second, ...rest] = validLiterals\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n } else {\n return v.any()\n }\n}\n","import type { GenericValidator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod nullable types to Convex validators\nexport function convertNullableType(\n actualValidator: z.ZodNullable<any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): { validator: GenericValidator; isOptional: boolean } {\n const innerSchema = actualValidator.unwrap()\n if (innerSchema && innerSchema instanceof z.ZodType) {\n // Check if the inner schema is optional\n if (innerSchema instanceof z.ZodOptional) {\n // For nullable(optional(T)), we want optional(union(T, null))\n const innerInnerSchema = innerSchema.unwrap()\n const innerInnerValidator = zodToConvexInternal(innerInnerSchema as z.ZodType, visited)\n return {\n validator: v.union(innerInnerValidator, v.null()),\n isOptional: true // Mark as optional so it gets wrapped later\n }\n } else {\n const innerValidator = zodToConvexInternal(innerSchema, visited)\n return {\n validator: v.union(innerValidator, v.null()),\n isOptional: false\n }\n }\n } else {\n return {\n validator: v.any(),\n isOptional: false\n }\n }\n}\n","import type { GenericValidator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod record types to Convex validators\nexport function convertRecordType(\n actualValidator: z.ZodRecord<any, any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n // In Zod v4, when z.record(z.string()) is used with one argument,\n // the argument becomes the value type and key defaults to string.\n // The valueType is stored in _def.valueType (or undefined if single arg)\n let valueType = (actualValidator as any)._def?.valueType\n\n // If valueType is undefined, it means single argument form was used\n // where the argument is actually the value type (stored in keyType)\n if (!valueType) {\n // Workaround: Zod v4 stores the value type in _def.keyType for single-argument z.record().\n // This accesses a private property as there is no public API for this in Zod v4.\n valueType = (actualValidator as any)._def?.keyType\n }\n\n if (valueType && valueType instanceof z.ZodType) {\n // First check if the Zod value type is optional before conversion\n const isZodOptional =\n valueType instanceof z.ZodOptional ||\n valueType instanceof z.ZodDefault ||\n (valueType instanceof z.ZodDefault && valueType.def.innerType instanceof z.ZodOptional)\n\n if (isZodOptional) {\n // For optional record values, we need to handle this specially\n let innerType: z.ZodTypeAny\n let recordDefaultValue: any = undefined\n let recordHasDefault = false\n\n if (valueType instanceof z.ZodDefault) {\n // Handle ZodDefault wrapper\n recordHasDefault = true\n recordDefaultValue = valueType.def.defaultValue\n const innerFromDefault = valueType.def.innerType\n if (innerFromDefault instanceof z.ZodOptional) {\n innerType = innerFromDefault.unwrap() as z.ZodTypeAny\n } else {\n innerType = innerFromDefault as z.ZodTypeAny\n }\n } else if (valueType instanceof z.ZodOptional) {\n // Direct ZodOptional\n innerType = valueType.unwrap() as z.ZodTypeAny\n } else {\n // Shouldn't happen based on isZodOptional check\n innerType = valueType as z.ZodTypeAny\n }\n\n // Convert the inner type to Convex and wrap in union with null\n const innerConvex = zodToConvexInternal(innerType, visited)\n const unionValidator = v.union(innerConvex, v.null())\n\n // Add default metadata if present\n if (recordHasDefault) {\n ;(unionValidator as any)._zodDefault = recordDefaultValue\n }\n\n return v.record(v.string(), unionValidator)\n } else {\n // Non-optional values can be converted normally\n return v.record(v.string(), zodToConvexInternal(valueType, visited))\n }\n } else {\n return v.record(v.string(), v.any())\n }\n}\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod discriminated union types to Convex validators\nexport function convertDiscriminatedUnionType(\n actualValidator: z.ZodDiscriminatedUnion<any, any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n const options =\n (actualValidator as any).def?.options || (actualValidator as any).def?.optionsMap?.values()\n if (options) {\n const opts = Array.isArray(options) ? options : Array.from(options)\n if (opts.length >= 2) {\n const convexOptions = opts.map((opt: any) => zodToConvexInternal(opt, visited)) as Validator<\n any,\n 'required',\n any\n >[]\n const [first, second, ...rest] = convexOptions\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n } else {\n return v.any()\n }\n}\n\n// Helper: Convert Zod union types to Convex validators\nexport function convertUnionType(\n actualValidator: z.ZodUnion<any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n const options = (actualValidator as any).options\n if (options && Array.isArray(options) && options.length > 0) {\n if (options.length === 1) {\n return zodToConvexInternal(options[0], visited)\n } else {\n // Convert each option recursively\n const convexOptions = options.map((opt: any) =>\n zodToConvexInternal(opt, visited)\n ) as Validator<any, 'required', any>[]\n if (convexOptions.length >= 2) {\n const [first, second, ...rest] = convexOptions\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n }\n } else {\n return v.any()\n }\n}\n","import { v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers, type Zid } from '../ids'\n\n// Helper to check if a schema is a Zid\nexport function isZid<T extends string>(schema: z.ZodType): schema is Zid<T> {\n // Check our metadata registry for ConvexId marker\n const metadata = registryHelpers.getMetadata(schema)\n return (\n metadata?.isConvexId === true && metadata?.tableName && typeof metadata.tableName === 'string'\n )\n}\n\n// union helpers\nexport function makeUnion(members: any[]): any {\n const nonNull = members.filter(Boolean)\n if (nonNull.length === 0) return v.any()\n if (nonNull.length === 1) return nonNull[0]\n return v.union(nonNull[0], nonNull[1], ...nonNull.slice(2))\n}\n\nexport function getObjectShape(obj: any): Record<string, any> {\n // Use public API .shape property for ZodObject\n if (obj instanceof z.ZodObject) {\n return obj.shape\n }\n // Fallback for edge cases\n if (obj && typeof obj === 'object' && typeof obj.shape === 'object') {\n return obj.shape as Record<string, any>\n }\n return {}\n}\n","import type { GenericValidator, PropertyValidators } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers } from '../ids'\nimport { findBaseCodec } from '../registry'\nimport {\n convertDiscriminatedUnionType,\n convertEnumType,\n convertNullableType,\n convertRecordType,\n convertUnionType\n} from './handlers'\nimport type {\n ConvexValidatorFromZod,\n ConvexValidatorFromZodFieldsAuto,\n ZodValidator\n} from './types'\nimport { getObjectShape, isZid } from './utils'\n\n// Internal conversion function using ZodType with def.type detection\nfunction zodToConvexInternal<Z extends z.ZodTypeAny>(\n zodValidator: Z,\n visited: Set<z.ZodTypeAny> = new Set()\n): ConvexValidatorFromZod<Z, 'required'> {\n // Guard against undefined/null validators (can happen with { field: undefined } in args)\n if (!zodValidator) {\n return v.any() as ConvexValidatorFromZod<Z, 'required'>\n }\n\n // Detect circular references to prevent infinite recursion\n if (visited.has(zodValidator)) {\n return v.any() as ConvexValidatorFromZod<Z, 'required'>\n }\n visited.add(zodValidator)\n\n // Check for default and optional wrappers\n let actualValidator = zodValidator\n let isOptional = false\n let defaultValue: any = undefined\n let hasDefault = false\n\n // Handle ZodDefault (which wraps ZodOptional when using .optional().default())\n // Note: We access _def properties directly because Zod v4 doesn't expose public APIs\n // for unwrapping defaults. The removeDefault() method exists but returns a new schema\n // without preserving references, which breaks our visited Set tracking.\n if (zodValidator instanceof z.ZodDefault) {\n hasDefault = true\n defaultValue = (zodValidator as any).def?.defaultValue\n actualValidator = (zodValidator as any).def?.innerType as Z\n }\n\n // Check for optional (may be wrapped inside ZodDefault)\n if (actualValidator instanceof z.ZodOptional) {\n isOptional = true\n actualValidator = actualValidator.unwrap() as Z\n\n // If the unwrapped type is ZodDefault, handle it here\n if (actualValidator instanceof z.ZodDefault) {\n hasDefault = true\n defaultValue = (actualValidator as any).def?.defaultValue\n actualValidator = (actualValidator as any).def?.innerType as Z\n }\n }\n\n let convexValidator: GenericValidator\n\n // Check for Zid first (special case)\n if (isZid(actualValidator)) {\n const metadata = registryHelpers.getMetadata(actualValidator)\n const tableName = metadata?.tableName || 'unknown'\n convexValidator = v.id(tableName)\n } else {\n // Use def.type for robust, performant type detection instead of instanceof checks.\n // Rationale:\n // 1. Performance: Single switch statement vs. cascading instanceof checks\n // 2. Completeness: def.type covers ALL Zod variants including formats (email, url, uuid, etc.)\n // 3. Future-proof: Zod's internal structure is stable; instanceof checks can miss custom types\n // 4. Precision: def.type distinguishes between semantically different types (date vs number)\n // This private API access is intentional and necessary for comprehensive type coverage.\n //\n // Compatibility: This code relies on the internal `.def.type` property of ZodType.\n // This structure has been stable across Zod v3.x and v4.x. If upgrading Zod major versions,\n // verify that `.def.type` is still present and unchanged.\n const defType = (actualValidator as any).def?.type\n\n switch (defType) {\n case 'string':\n // This catches ZodString and ALL string format types (email, url, uuid, etc.)\n convexValidator = v.string()\n break\n case 'number':\n convexValidator = v.float64()\n break\n case 'bigint':\n convexValidator = v.int64()\n break\n case 'boolean':\n convexValidator = v.boolean()\n break\n case 'date':\n convexValidator = v.float64() // Dates are stored as timestamps in Convex\n break\n case 'null':\n convexValidator = v.null()\n break\n case 'nan':\n convexValidator = v.float64()\n break\n case 'array': {\n // Use classic API: ZodArray has .element property\n if (actualValidator instanceof z.ZodArray) {\n const element = (actualValidator as any).element\n if (element && element instanceof z.ZodType) {\n convexValidator = v.array(zodToConvexInternal(element, visited))\n } else {\n convexValidator = v.array(v.any())\n }\n } else {\n convexValidator = v.array(v.any())\n }\n break\n }\n case 'object': {\n // Use classic API: ZodObject has .shape property\n if (actualValidator instanceof z.ZodObject) {\n const shape = actualValidator.shape\n const convexShape: PropertyValidators = {}\n for (const [key, value] of Object.entries(shape)) {\n if (value && value instanceof z.ZodType) {\n convexShape[key] = zodToConvexInternal(value, visited)\n }\n }\n convexValidator = v.object(convexShape)\n } else {\n convexValidator = v.object({})\n }\n break\n }\n case 'union': {\n if (actualValidator instanceof z.ZodUnion) {\n convexValidator = convertUnionType(actualValidator, visited, zodToConvexInternal)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'discriminatedUnion': {\n convexValidator = convertDiscriminatedUnionType(\n actualValidator as any,\n visited,\n zodToConvexInternal\n )\n break\n }\n case 'literal': {\n // Use classic API: ZodLiteral has .value property\n if (actualValidator instanceof z.ZodLiteral) {\n const literalValue = (actualValidator as any).value\n if (literalValue !== undefined && literalValue !== null) {\n convexValidator = v.literal(literalValue)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'enum': {\n if (actualValidator instanceof z.ZodEnum) {\n convexValidator = convertEnumType(actualValidator)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'record': {\n if (actualValidator instanceof z.ZodRecord) {\n convexValidator = convertRecordType(actualValidator, visited, zodToConvexInternal)\n } else {\n convexValidator = v.record(v.string(), v.any())\n }\n break\n }\n case 'transform':\n case 'pipe': {\n // Check for registered codec first\n const codec = findBaseCodec(actualValidator)\n if (codec) {\n convexValidator = codec.toValidator(actualValidator)\n } else {\n // Check for brand metadata\n const metadata = registryHelpers.getMetadata(actualValidator)\n if (metadata?.brand && metadata?.originalSchema) {\n // For branded types created by our zBrand function, use the original schema\n convexValidator = zodToConvexInternal(metadata.originalSchema, visited)\n } else {\n // For non-registered transforms, return v.any()\n convexValidator = v.any()\n }\n }\n break\n }\n case 'nullable': {\n if (actualValidator instanceof z.ZodNullable) {\n const result = convertNullableType(actualValidator, visited, zodToConvexInternal)\n convexValidator = result.validator\n if (result.isOptional) {\n isOptional = true\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'tuple': {\n // Handle tuple types as objects with numeric keys\n if (actualValidator instanceof z.ZodTuple) {\n const items = (actualValidator as any).def?.items as z.ZodTypeAny[] | undefined\n if (items && items.length > 0) {\n const convexShape: PropertyValidators = {}\n items.forEach((item, index) => {\n convexShape[`_${index}`] = zodToConvexInternal(item, visited)\n })\n convexValidator = v.object(convexShape)\n } else {\n convexValidator = v.object({})\n }\n } else {\n convexValidator = v.object({})\n }\n break\n }\n case 'lazy': {\n // Handle lazy schemas by resolving them\n // Circular references are protected by the visited set check at function start\n if (actualValidator instanceof z.ZodLazy) {\n try {\n const getter = (actualValidator as any).def?.getter\n if (getter) {\n const resolvedSchema = getter()\n if (resolvedSchema && resolvedSchema instanceof z.ZodType) {\n convexValidator = zodToConvexInternal(resolvedSchema, visited)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n } catch {\n // If resolution fails, fall back to 'any'\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'any':\n // Handle z.any() directly\n convexValidator = v.any()\n break\n case 'unknown':\n // Handle z.unknown() as any\n convexValidator = v.any()\n break\n case 'undefined':\n case 'void':\n case 'never':\n // These types don't have good Convex equivalents\n convexValidator = v.any()\n break\n case 'intersection':\n // Can't properly handle intersections\n convexValidator = v.any()\n break\n default:\n // For any unrecognized def.type, return v.any()\n // No instanceof fallbacks - keep it simple and performant\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[zodvex] Unrecognized Zod type \"${defType}\" encountered. Falling back to v.any().`,\n 'Schema:',\n actualValidator\n )\n }\n convexValidator = v.any()\n break\n }\n }\n\n // For optional or default fields, always use v.optional()\n const finalValidator = isOptional || hasDefault ? v.optional(convexValidator) : convexValidator\n\n // Add metadata if there's a default value\n if (hasDefault && typeof finalValidator === 'object' && finalValidator !== null) {\n ;(finalValidator as any)._zodDefault = defaultValue\n }\n\n return finalValidator as ConvexValidatorFromZod<Z, 'required'>\n}\n\nexport function zodToConvex<Z extends z.ZodTypeAny | ZodValidator>(\n zod: Z\n): Z extends z.ZodTypeAny\n ? ConvexValidatorFromZod<Z, 'required'>\n : Z extends ZodValidator\n ? ConvexValidatorFromZodFieldsAuto<Z>\n : never {\n if (typeof zod === 'object' && zod !== null && !(zod instanceof z.ZodType)) {\n return zodToConvexFields(zod as ZodValidator) as any\n }\n\n return zodToConvexInternal(zod as z.ZodTypeAny) as any\n}\n\nexport function zodToConvexFields<Z extends z.ZodRawShape>(\n zod: Z\n): ConvexValidatorFromZodFieldsAuto<Z> {\n // If it's a ZodObject, extract the shape\n const fields = zod instanceof z.ZodObject ? zod.shape : zod\n\n // Build the result object directly to preserve types\n const result: any = {}\n for (const [key, value] of Object.entries(fields)) {\n result[key] = zodToConvexInternal(value as z.ZodTypeAny)\n }\n\n return result as ConvexValidatorFromZodFieldsAuto<Z>\n}\n","import { z } from 'zod'\nimport { zodToConvex } from './mapping'\nimport { findBaseCodec, isDateSchema } from './registry'\n\n// Helper to convert Zod's internal types to ZodTypeAny\nfunction asZodType<T>(schema: T): z.ZodTypeAny {\n return schema as unknown as z.ZodTypeAny\n}\n\nexport type ConvexCodec<T> = {\n validator: any\n encode: (value: T) => any\n decode: (value: any) => T\n pick: <K extends keyof T>(keys: K[]) => ConvexCodec<Pick<T, K>>\n}\n\nexport function convexCodec<T>(schema: z.ZodType<T>): ConvexCodec<T> {\n const validator = zodToConvex(schema)\n\n return {\n validator,\n encode: (value: T) => toConvexJS(schema, value),\n decode: (value: any) => fromConvexJS(value, schema),\n pick: <K extends keyof T>(keys: K[] | Record<K, true>) => {\n if (!(schema instanceof z.ZodObject)) {\n throw new Error('pick() can only be called on object schemas')\n }\n // Handle both array and object formats\n const pickObj = Array.isArray(keys)\n ? keys.reduce((acc, k) => ({ ...acc, [k]: true }), {} as any)\n : keys\n const pickedSchema = schema.pick(pickObj as any)\n return convexCodec(pickedSchema) as ConvexCodec<Pick<T, K>>\n }\n }\n}\n\n// Convert JS values to Convex-safe JSON (handle Dates, remove undefined)\nexport function toConvexJS(schema?: any, value?: any): any {\n // If no schema provided, do basic conversion\n if (!schema || arguments.length === 1) {\n value = schema\n return basicToConvex(value)\n }\n\n // Use schema-aware conversion\n return schemaToConvex(value, schema)\n}\n\nfunction basicToConvex(value: any): any {\n if (value === undefined) return undefined\n if (value === null) return null\n if (value instanceof Date) return value.getTime()\n\n if (Array.isArray(value)) {\n return value.map(basicToConvex)\n }\n\n if (value && typeof value === 'object') {\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = basicToConvex(v)\n }\n }\n return result\n }\n\n return value\n}\n\nfunction schemaToConvex(value: any, schema: any): any {\n if (value === undefined || value === null) return value\n\n // Check base codec registry first\n const codec = findBaseCodec(schema)\n if (codec) {\n return codec.toConvex(value, schema)\n }\n\n // Handle wrapper types\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n schema instanceof z.ZodDefault\n ) {\n // Use unwrap() method which is available on these types\n const inner = schema.unwrap()\n return schemaToConvex(value, asZodType(inner))\n }\n\n // Handle Date specifically\n if (schema instanceof z.ZodDate && value instanceof Date) {\n return value.getTime()\n }\n\n // Handle arrays\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value\n return value.map(item => schemaToConvex(item, schema.element))\n }\n\n // Handle objects\n if (schema instanceof z.ZodObject) {\n if (!value || typeof value !== 'object') return value\n const shape = schema.shape\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = shape[k] ? schemaToConvex(v, shape[k]) : basicToConvex(v)\n }\n }\n return result\n }\n\n // Handle unions\n if (schema instanceof z.ZodUnion) {\n // Try each option to see which one matches\n for (const option of schema.options) {\n try {\n ;(option as any).parse(value) // Validate against this option\n return schemaToConvex(value, option)\n } catch {\n // Try next option\n }\n }\n }\n\n // Handle records\n if (schema instanceof z.ZodRecord) {\n if (!value || typeof value !== 'object') return value\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = schemaToConvex(v, schema.valueType)\n }\n }\n return result\n }\n\n // Default passthrough\n return basicToConvex(value)\n}\n\n// Convert Convex JSON back to JS values (handle timestamps -> Dates)\nexport function fromConvexJS(value: any, schema: any): any {\n if (value === undefined || value === null) return value\n\n // Check base codec registry first\n const codec = findBaseCodec(schema)\n if (codec) {\n return codec.fromConvex(value, schema)\n }\n\n // Handle wrapper types\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n schema instanceof z.ZodDefault\n ) {\n // Use unwrap() method which is available on these types\n const inner = schema.unwrap()\n return fromConvexJS(value, asZodType(inner))\n }\n\n // Handle Date specifically\n if (schema instanceof z.ZodDate && typeof value === 'number') {\n return new Date(value)\n }\n\n // Check if schema is a Date through effects/transforms\n if (isDateSchema(schema) && typeof value === 'number') {\n return new Date(value)\n }\n\n // Handle arrays\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value\n return value.map(item => fromConvexJS(item, schema.element))\n }\n\n // Handle objects\n if (schema instanceof z.ZodObject) {\n if (!value || typeof value !== 'object') return value\n const shape = schema.shape\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = shape[k] ? fromConvexJS(v, shape[k]) : v\n }\n return result\n }\n\n // Handle unions\n if (schema instanceof z.ZodUnion) {\n // Try to decode with each option\n for (const option of schema.options) {\n try {\n const decoded = fromConvexJS(value, option)\n ;(option as any).parse(decoded) // Validate the decoded value\n return decoded\n } catch {\n // Try next option\n }\n }\n }\n\n // Handle records\n if (schema instanceof z.ZodRecord) {\n if (!value || typeof value !== 'object') return value\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = fromConvexJS(v, schema.valueType)\n }\n return result\n }\n\n // Handle effects and transforms\n // Note: ZodPipe doesn't exist in Zod v4, only ZodTransform\n if (schema instanceof z.ZodTransform) {\n // Cannot access inner schema without _def, return value as-is\n return value\n }\n\n return value\n}\n","import { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { getObjectShape } from './mapping'\n\nexport function pick<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (key in obj) result[key] = obj[key]\n }\n return result\n}\n\n// Typed identity helper for returns schemas\nexport function returnsAs<R extends z.ZodTypeAny>() {\n return <T extends z.input<R>>(v: T) => v\n}\n\n// Format ZodError issues into a compact, consistent structure\nexport function formatZodIssues(\n error: z.ZodError,\n context?: 'args' | 'returns' | 'input' | 'output' | 'codec'\n) {\n return {\n error: 'ZodValidationError',\n context,\n issues: error.issues.map(issue => ({\n path: Array.isArray(issue.path) ? issue.path.join('.') : String(issue.path ?? ''),\n code: issue.code,\n message: issue.message\n })),\n // Keep a flattened snapshot for easier debugging without cyclic refs\n flatten: JSON.parse(JSON.stringify(error.flatten?.() ?? {}))\n }\n}\n\n// Handle Zod validation errors consistently across all wrappers\n// Throws a ConvexError with formatted issues if the error is a ZodError, otherwise re-throws\nexport function handleZodValidationError(\n e: unknown,\n context: 'args' | 'returns' | 'input' | 'output' | 'codec'\n): never {\n if (e instanceof z.ZodError) {\n throw new ConvexError(formatZodIssues(e, context))\n }\n throw e\n}\n\n// Helper: standard Convex paginate() result schema\nexport function zPaginated<T extends z.ZodTypeAny>(item: T) {\n return z.object({\n page: z.array(item),\n isDone: z.boolean(),\n continueCursor: z.string().nullable().optional()\n })\n}\n\n/**\n * Maps Date fields to number fields for docSchema generation.\n * Handles Date, Date.optional(), Date.nullable(), and Date.default() cases.\n * Returns the original field for non-Date types.\n */\nexport function mapDateFieldToNumber(field: z.ZodTypeAny): z.ZodTypeAny {\n // Direct Date field\n if (field instanceof z.ZodDate) {\n return z.number()\n }\n\n // Optional Date field\n if (field instanceof z.ZodOptional && field.unwrap() instanceof z.ZodDate) {\n return z.number().optional()\n }\n\n // Nullable Date field\n if (field instanceof z.ZodNullable && field.unwrap() instanceof z.ZodDate) {\n return z.number().nullable()\n }\n\n // Date with default value\n if (field instanceof z.ZodDefault) {\n const inner = field.removeDefault()\n if (inner instanceof z.ZodDate) {\n return z.number().optional()\n }\n }\n\n // Non-Date field - return as-is\n return field\n}\n\n// Schema picking utilities (moved from pick.ts for consolidation)\ntype Mask = readonly string[] | Record<string, boolean | 1 | true>\n\nfunction toKeys(mask: Mask): string[] {\n if (Array.isArray(mask)) return mask.map(String)\n return Object.keys(mask).filter(k => !!(mask as any)[k])\n}\n\n/**\n * Returns a plain shape object containing only the selected fields.\n * Accepts either a ZodObject or a raw shape object.\n */\nexport function pickShape(\n schemaOrShape: z.ZodObject<any> | Record<string, any>,\n mask: Mask\n): Record<string, any> {\n const keys = toKeys(mask)\n const shape =\n schemaOrShape instanceof z.ZodObject ? getObjectShape(schemaOrShape) : schemaOrShape || {}\n\n const out: Record<string, any> = {}\n for (const k of keys) {\n if (k in shape) out[k] = (shape as any)[k]\n }\n return out\n}\n\n// Builds a fresh Zod object from the selected fields (avoids Zod's .pick())\nexport function safePick(schema: z.ZodObject<any>, mask: Mask): z.ZodObject<any> {\n return z.object(pickShape(schema, mask))\n}\n\n/**\n * Convenience: omit a set of keys by building the complement.\n * Avoids using Zod's .omit() which can cause type depth issues.\n */\nexport function safeOmit(schema: z.ZodObject<any>, mask: Mask): z.ZodObject<any> {\n const shape = getObjectShape(schema)\n const omit = new Set(toKeys(mask))\n const keep = Object.keys(shape).filter(k => !omit.has(k))\n const picked = pickShape(schema, keep)\n return z.object(picked)\n}\n","import {\n type ActionBuilder,\n type ArgsArrayToObject,\n type DefaultFunctionArgs,\n type FunctionVisibility,\n type GenericActionCtx,\n type GenericDataModel,\n type GenericMutationCtx,\n type GenericQueryCtx,\n type MutationBuilder,\n type QueryBuilder\n} from 'convex/server'\nimport { ConvexError, type PropertyValidators } from 'convex/values'\nimport { type Customization, NoOp } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { fromConvexJS, toConvexJS } from './codec'\nimport { type ZodValidator, zodToConvex, zodToConvexFields } from './mapping'\nimport type { ExtractCtx, ExtractVisibility } from './types'\nimport { handleZodValidationError, pick } from './utils'\n\n// Type helpers for args transformation (from zodV3 example)\ntype OneArgArray<ArgsObject extends DefaultFunctionArgs = DefaultFunctionArgs> = [ArgsObject]\n\n// Simple type conversion from a Convex validator to a Zod validator return type\ntype NullToUndefinedOrNull<T> = T extends null ? T | undefined | void : T\ntype Returns<T> = Promise<NullToUndefinedOrNull<T>> | NullToUndefinedOrNull<T>\n\n// The return value before it's been validated: returned by the handler\ntype ReturnValueInput<ReturnsValidator extends z.ZodTypeAny | ZodValidator | void> = [\n ReturnsValidator\n] extends [z.ZodTypeAny]\n ? Returns<z.input<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.input<z.ZodObject<ReturnsValidator>>>\n : any\n\n// The return value after it's been validated: returned to the client\ntype ReturnValueOutput<ReturnsValidator extends z.ZodTypeAny | ZodValidator | void> = [\n ReturnsValidator\n] extends [z.ZodTypeAny]\n ? Returns<z.output<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.output<z.ZodObject<ReturnsValidator>>>\n : any\n\n// The args before they've been validated: passed from the client\ntype ArgsInput<ArgsValidator extends ZodValidator | z.ZodObject<any> | void> = [\n ArgsValidator\n] extends [z.ZodObject<any>]\n ? [z.input<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.input<z.ZodObject<ArgsValidator>>]\n : OneArgArray\n\n// The args after they've been validated: passed to the handler\ntype ArgsOutput<ArgsValidator extends ZodValidator | z.ZodObject<any> | void> = [\n ArgsValidator\n] extends [z.ZodObject<any>]\n ? [z.output<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.output<z.ZodObject<ArgsValidator>>]\n : OneArgArray\n\ntype Overwrite<T, U> = Omit<T, keyof U> & U\n\n// Hack to simplify how TypeScript renders object types\ntype Expand<ObjectType extends Record<any, any>> = ObjectType extends Record<any, any>\n ? {\n [Key in keyof ObjectType]: ObjectType[Key]\n }\n : never\n\ntype ArgsForHandlerType<\n OneOrZeroArgs extends [] | [Record<string, any>],\n CustomMadeArgs extends Record<string, any>\n> = CustomMadeArgs extends Record<string, never>\n ? OneOrZeroArgs\n : OneOrZeroArgs extends [infer A]\n ? [Expand<A & CustomMadeArgs>]\n : [CustomMadeArgs]\n\n// Helper type for function registration (from zodV3)\ntype Registration<\n FuncType extends 'query' | 'mutation' | 'action',\n Visibility extends FunctionVisibility,\n Args extends DefaultFunctionArgs,\n Output\n> = FuncType extends 'query'\n ? import('convex/server').RegisteredQuery<Visibility, Args, Output>\n : FuncType extends 'mutation'\n ? import('convex/server').RegisteredMutation<Visibility, Args, Output>\n : import('convex/server').RegisteredAction<Visibility, Args, Output>\n\n/**\n * A builder that customizes a Convex function, whether or not it validates\n * arguments. If the customization requires arguments, however, the resulting\n * builder will require argument validation too.\n *\n * This is our own Zod-aware CustomBuilder type that properly handles Zod validators.\n */\nexport type CustomBuilder<\n FuncType extends 'query' | 'mutation' | 'action',\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n InputCtx,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any>\n> = {\n <\n ArgsValidator extends ZodValidator | z.ZodObject<any> | void,\n ReturnsZodValidator extends z.ZodTypeAny | ZodValidator | void = void,\n ReturnValue extends ReturnValueInput<ReturnsZodValidator> = any\n >(\n func:\n | ({\n /**\n * Specify the arguments to the function as a Zod validator.\n */\n args?: ArgsValidator\n handler: (\n ctx: Overwrite<InputCtx, CustomCtx>,\n ...args: ArgsForHandlerType<ArgsOutput<ArgsValidator>, CustomMadeArgs>\n ) => ReturnValue\n /**\n * Validates the value returned by the function.\n * Note: you can't pass an object directly without wrapping it\n * in `z.object()`.\n */\n returns?: ReturnsZodValidator\n /**\n * If true, the function will not be validated by Convex,\n * in case you're seeing performance issues with validating twice.\n */\n skipConvexValidation?: boolean\n } & {\n [key in keyof ExtraArgs as key extends\n | 'args'\n | 'handler'\n | 'skipConvexValidation'\n | 'returns'\n ? never\n : key]: ExtraArgs[key]\n })\n | {\n (\n ctx: Overwrite<InputCtx, CustomCtx>,\n ...args: ArgsForHandlerType<ArgsOutput<ArgsValidator>, CustomMadeArgs>\n ): ReturnValue\n }\n ): Registration<\n FuncType,\n Visibility,\n ArgsArrayToObject<\n CustomArgsValidator extends Record<string, never>\n ? ArgsInput<ArgsValidator>\n : ArgsInput<ArgsValidator> extends [infer A]\n ? [Expand<A & import('convex/values').ObjectType<CustomArgsValidator>>]\n : [import('convex/values').ObjectType<CustomArgsValidator>]\n >,\n ReturnsZodValidator extends void ? ReturnValue : ReturnValueOutput<ReturnsZodValidator>\n >\n}\n\nexport function customFnBuilder<\n Ctx extends Record<string, any>,\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n builder: Builder,\n customization: Customization<Ctx, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n const customInput = customization.input ?? NoOp.input\n const inputArgs = customization.args ?? NoOp.args\n\n return function customBuilder(fn: any): any {\n const { args, handler = fn, returns: maybeObject, ...extra } = fn\n\n const returns =\n maybeObject && !(maybeObject instanceof z.ZodType) ? z.object(maybeObject) : maybeObject\n const returnValidator =\n returns && !fn.skipConvexValidation ? { returns: zodToConvex(returns) } : undefined\n\n if (args && !fn.skipConvexValidation) {\n let argsValidator = args\n let argsSchema: z.ZodObject<any>\n\n if (argsValidator instanceof z.ZodType) {\n if (argsValidator instanceof z.ZodObject) {\n argsSchema = argsValidator\n argsValidator = argsValidator.shape // Get the raw shape for zodToConvexFields\n } else {\n throw new Error(\n 'Unsupported non-object Zod schema for args; please provide an args schema using z.object({...}), e.g. z.object({ foo: z.string() })'\n )\n }\n } else {\n // It's a raw shape object with Zod validators as values\n argsSchema = z.object(argsValidator)\n }\n\n const convexValidator = zodToConvexFields(argsValidator)\n return builder({\n args: { ...convexValidator, ...inputArgs },\n ...returnValidator,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added: any = await customInput(\n ctx,\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )\n const argKeys = Object.keys(argsValidator)\n const rawArgs = pick(allArgs, argKeys)\n const decoded = fromConvexJS(rawArgs, argsSchema)\n const parsed = argsSchema.safeParse(decoded)\n if (!parsed.success) {\n handleZodValidationError(parsed.error, 'args')\n }\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const baseArgs = parsed.data as Record<string, unknown>\n const addedArgs = (added?.args as Record<string, unknown>) ?? {}\n const finalArgs = { ...baseArgs, ...addedArgs }\n const ret = await handler(finalCtx, finalArgs)\n if (returns && !fn.skipConvexValidation) {\n let validated: any\n try {\n validated = (returns as z.ZodTypeAny).parse(ret)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n if (added?.onSuccess) {\n await added.onSuccess({\n ctx,\n args: parsed.data,\n result: validated\n })\n }\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: parsed.data, result: ret })\n }\n return ret\n }\n })\n }\n return builder({\n args: inputArgs,\n ...returnValidator,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added: any = await customInput(\n ctx,\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const baseArgs = allArgs as Record<string, unknown>\n const addedArgs = (added?.args as Record<string, unknown>) ?? {}\n const finalArgs = { ...baseArgs, ...addedArgs }\n const ret = await handler(finalCtx, finalArgs)\n if (returns && !fn.skipConvexValidation) {\n let validated: any\n try {\n validated = (returns as z.ZodTypeAny).parse(ret)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: allArgs, result: validated })\n }\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: allArgs, result: ret })\n }\n return ret\n }\n })\n }\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n DataModel extends GenericDataModel,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<DataModel, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n GenericQueryCtx<DataModel>,\n Visibility,\n ExtraArgs\n>\n\n// Overload 2: No constraint + decoupled ctx\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<any, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n any,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<any, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n // Implementation deliberately uses 'any' ctx to preserve overload behavior\n // while avoiding a GenericDataModel constraint at the implementation level.\n return customFnBuilder<\n any,\n typeof query,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtraArgs\n >(query as any, customization as any) as any\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n _Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n mutation as any,\n customization as any\n ) as any\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n _Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n action as any,\n customization as any\n ) as any\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { fromConvexJS, toConvexJS } from './codec'\nimport { getObjectShape, zodToConvex, zodToConvexFields } from './mapping'\n// Typing helpers to keep handler args/returns precise without deep remapping\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { handleZodValidationError } from './utils'\n\n// Cache to avoid re-checking the same schema\nconst customCheckCache = new WeakMap<z.ZodTypeAny, boolean>()\n\n/**\n * Check if a schema contains z.custom types (runtime check).\n * Includes depth limit to prevent stack overflow on deeply nested schemas.\n */\nfunction containsCustom(schema: z.ZodTypeAny, maxDepth = 50, currentDepth = 0): boolean {\n // Check cache first\n const cached = customCheckCache.get(schema)\n if (cached !== undefined) {\n return cached\n }\n\n // Prevent stack overflow on deeply nested schemas\n if (currentDepth > maxDepth) {\n return false\n }\n\n let result = false\n\n // Use _def.typeName instead of instanceof since ZodCustom is not exported in Zod v4\n if ((schema as any)._def?.typeName === 'ZodCustom') {\n result = true\n } else if (schema instanceof z.ZodUnion) {\n result = (schema.options as z.ZodTypeAny[]).some(opt =>\n containsCustom(opt, maxDepth, currentDepth + 1)\n )\n } else if (schema instanceof z.ZodOptional) {\n result = containsCustom(schema.unwrap() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n } else if (schema instanceof z.ZodNullable) {\n result = containsCustom(schema.unwrap() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n } else if (schema instanceof z.ZodDefault) {\n result = containsCustom(schema.removeDefault() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n }\n\n customCheckCache.set(schema, result)\n return result\n}\n\nexport function zQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n query: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredQuery<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n // Single schema → normalize to { value }\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return query({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalQuery: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredQuery<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zQuery(internalQuery, input, handler, options)\n}\n\nexport function zMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n mutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredMutation<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return mutation({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalMutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredMutation<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zMutation(internalMutation, input, handler, options)\n}\n\nexport function zAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n action: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredAction<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return action({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalAction: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredAction<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zAction(internalAction, input, handler, options) as any\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport type { PropertyValidators } from 'convex/values'\nimport type { Customization } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { type CustomBuilder, customFnBuilder } from './custom'\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { zAction, zMutation, zQuery } from './wrappers'\n\n/**\n * Creates a reusable query builder from a Convex query builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { query } from './_generated/server'\n * import { zQueryBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const zq = zQueryBuilder(query)\n *\n * // Use it with Convex-style object syntax\n * export const getUser = zq({\n * args: { id: z.string() },\n * handler: async (ctx, { id }) => {\n * return ctx.db.get(id)\n * }\n * })\n * ```\n */\nexport function zQueryBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredQuery<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zQuery(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a reusable mutation builder from a Convex mutation builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { mutation } from './_generated/server'\n * import { zMutationBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const zm = zMutationBuilder(mutation)\n *\n * // Use it with Convex-style object syntax\n * export const updateUser = zm({\n * args: { id: z.string(), name: z.string() },\n * handler: async (ctx, { id, name }) => {\n * return ctx.db.patch(id, { name })\n * }\n * })\n * ```\n */\nexport function zMutationBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredMutation<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zMutation(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a reusable action builder from a Convex action builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { action } from './_generated/server'\n * import { zActionBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const za = zActionBuilder(action)\n *\n * // Use it with Convex-style object syntax\n * export const sendEmail = za({\n * args: { to: z.string().email(), subject: z.string() },\n * handler: async (ctx, { to, subject }) => {\n * // Send email\n * }\n * })\n * ```\n */\nexport function zActionBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredAction<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zAction(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a custom query builder with context injection from a Convex query builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your queries.\n *\n * @example\n * ```ts\n * import { type QueryCtx, query } from './_generated/server'\n * import { zCustomQueryBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authQuery = zCustomQueryBuilder(\n * query,\n * customCtx(async (ctx: QueryCtx) => {\n * const user = await getUserOrThrow(ctx)\n * return { user }\n * })\n * )\n *\n * // Use it with automatic user injection\n * export const getMyProfile = authQuery({\n * args: {},\n * handler: async (ctx) => {\n * // ctx.user is automatically available\n * return ctx.db.get(ctx.user._id)\n * }\n * })\n * ```\n */\nexport function zCustomQueryBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n query as any,\n customization as any\n ) as any\n}\n\n/**\n * Creates a custom mutation builder with context injection from a Convex mutation builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your mutations.\n *\n * @example\n * ```ts\n * import { type MutationCtx, mutation } from './_generated/server'\n * import { zCustomMutationBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authMutation = zCustomMutationBuilder(\n * mutation,\n * customCtx(async (ctx: MutationCtx) => {\n * const user = await getUserOrThrow(ctx)\n * return { user }\n * })\n * )\n *\n * // Use it with automatic user injection\n * export const updateProfile = authMutation({\n * args: { name: z.string() },\n * handler: async (ctx, { name }) => {\n * // ctx.user is automatically available\n * await ctx.db.patch(ctx.user._id, { name })\n * }\n * })\n * ```\n */\nexport function zCustomMutationBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n mutation as any,\n customization as any\n ) as any\n}\n\n/**\n * Creates a custom action builder with context injection from a Convex action builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your actions.\n *\n * @example\n * ```ts\n * import { type ActionCtx, action } from './_generated/server'\n * import { zCustomActionBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authAction = zCustomActionBuilder(\n * action,\n * customCtx(async (ctx: ActionCtx) => {\n * const identity = await ctx.auth.getUserIdentity()\n * if (!identity) throw new Error('Unauthorized')\n * return { userId: identity.subject }\n * })\n * )\n *\n * // Use it with automatic auth injection\n * export const sendEmail = authAction({\n * args: { to: z.string().email() },\n * handler: async (ctx, { to }) => {\n * // ctx.userId is automatically available\n * await sendEmailService(to, ctx.userId)\n * }\n * })\n * ```\n */\nexport function zCustomActionBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n action as any,\n customization as any\n ) as any\n}\n","import type { GenericId } from 'convex/values'\nimport { Table } from 'convex-helpers/server'\nimport { z } from 'zod'\nimport { zid } from './ids'\nimport { type ConvexValidatorFromZodFieldsAuto, zodToConvexFields } from './mapping'\n\n// Helper to create a Zod schema for a Convex document\nexport function zodDoc<\n TableName extends string,\n Shape extends z.ZodRawShape,\n Schema extends z.ZodObject<Shape>\n>(\n tableName: TableName,\n schema: Schema\n): z.ZodObject<\n Shape & {\n _id: ReturnType<typeof zid<TableName>>\n _creationTime: z.ZodNumber\n }\n> {\n // Use extend to preserve the original schema's type information\n return schema.extend({\n _id: zid(tableName),\n _creationTime: z.number()\n }) as any\n}\n\n// Helper to create nullable doc schema\nexport function zodDocOrNull<\n TableName extends string,\n Shape extends z.ZodRawShape,\n Schema extends z.ZodObject<Shape>\n>(tableName: TableName, schema: Schema) {\n return z.union([zodDoc(tableName, schema), z.null()])\n}\n\n/**\n * Defines a Convex table using a raw Zod shape (an object mapping field names to Zod types).\n *\n * This function intentionally accepts a raw shape instead of a ZodObject instance.\n * Accepting raw shapes allows TypeScript to infer field types more accurately and efficiently,\n * leading to better type inference and performance throughout the codebase.\n * This architectural decision is important for projects that rely heavily on type safety and\n * developer experience, as it avoids the type erasure that can occur when using ZodObject directly.\n *\n * Returns the Table definition along with Zod schemas for documents and arrays.\n *\n * @param name - The table name\n * @param shape - A raw object mapping field names to Zod validators\n * @returns A Table with attached shape, zDoc schema, and docArray helper\n *\n * @example\n * ```ts\n * const Users = zodTable('users', {\n * name: z.string(),\n * email: z.string().email(),\n * age: z.number().optional()\n * })\n *\n * // Use in schema\n * export default defineSchema({ users: Users.table })\n *\n * // Use for return types\n * export const getUsers = zQuery(query, {},\n * async (ctx) => ctx.db.query('users').collect(),\n * { returns: Users.docArray }\n * )\n * ```\n */\nexport function zodTable<TableName extends string, Shape extends Record<string, z.ZodTypeAny>>(\n name: TableName,\n shape: Shape\n) {\n // Convert fields with proper types\n const convexFields = zodToConvexFields(shape) as ConvexValidatorFromZodFieldsAuto<Shape>\n\n // Create the Table from convex-helpers with explicit type\n const table = Table<ConvexValidatorFromZodFieldsAuto<Shape>, TableName>(name, convexFields)\n\n // Create zDoc schema with system fields\n const zDoc = zodDoc(name, z.object(shape))\n\n // Create docArray helper for return types\n const docArray = z.array(zDoc)\n\n // Attach everything for comprehensive usage\n return Object.assign(table, {\n shape,\n zDoc,\n docArray\n }) as typeof table & {\n shape: Shape\n zDoc: z.ZodObject<\n Shape & {\n _id: ReturnType<typeof zid<TableName>>\n _creationTime: z.ZodNumber\n }\n >\n docArray: z.ZodArray<typeof zDoc>\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ids.ts","../src/registry.ts","../src/mapping/handlers/enum.ts","../src/mapping/handlers/nullable.ts","../src/mapping/handlers/record.ts","../src/mapping/handlers/union.ts","../src/mapping/utils.ts","../src/mapping/core.ts","../src/codec.ts","../src/utils.ts","../src/custom.ts","../src/wrappers.ts","../src/builders.ts","../src/tables.ts"],"names":["z","v","zodToConvexInternal","metadata","asZodType"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * IDs + registry for Convex + Zod v4\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n\n// Simple registry for metadata\nconst metadata = new WeakMap<z.ZodTypeAny, any>()\n\nexport const registryHelpers = {\n getMetadata: (type: z.ZodTypeAny) => metadata.get(type),\n setMetadata: (type: z.ZodTypeAny, meta: any) => metadata.set(type, meta)\n}\n\n/**\n * Create a Zod validator for a Convex Id\n *\n * Uses the string → transform → brand pattern for proper type narrowing with ctx.db.get()\n * This aligns with Zod v4 best practices and matches convex-helpers implementation\n */\nexport function zid<TableName extends string>(\n tableName: TableName\n): z.ZodType<GenericId<TableName>> & { _tableName: TableName } {\n // Use the string → transform → brand pattern (aligned with Zod v4 best practices)\n const baseSchema = z\n .string()\n .refine(val => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n })\n .transform(val => {\n // Cast to GenericId while keeping the string value\n return val as string & GenericId<TableName>\n })\n .brand(`ConvexId_${tableName}`) // Use native Zod v4 .brand() method\n // Add a human-readable marker for client-side introspection utilities\n // used in apps/native (e.g., to detect relationship fields in dynamic forms).\n .describe(`convexId:${tableName}`)\n\n // Store metadata for registry lookup so mapping can convert to v.id(tableName)\n registryHelpers.setMetadata(baseSchema, {\n isConvexId: true,\n tableName\n })\n\n // Add the tableName property for type-level detection\n const branded = baseSchema as any\n branded._tableName = tableName\n\n return branded as z.ZodType<GenericId<TableName>> & { _tableName: TableName }\n}\n\nexport type Zid<TableName extends string> = ReturnType<typeof zid<TableName>>\n","import { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Registry for base type codecs\ntype BaseCodec = {\n check: (schema: any) => boolean\n toValidator: (schema: any) => any\n fromConvex: (value: any, schema: any) => any\n toConvex: (value: any, schema: any) => any\n}\n\nconst baseCodecs: BaseCodec[] = []\n\nexport function registerBaseCodec(codec: BaseCodec): void {\n baseCodecs.unshift(codec) // Add to front for priority\n}\n\nexport function findBaseCodec(schema: any): BaseCodec | undefined {\n return baseCodecs.find(codec => codec.check(schema))\n}\n\n// Built-in codec for Date\nregisterBaseCodec({\n check: schema => schema instanceof z.ZodDate,\n toValidator: () => v.float64(),\n fromConvex: value => {\n if (typeof value === 'number') {\n return new Date(value)\n }\n return value\n },\n toConvex: value => {\n if (value instanceof Date) {\n return value.getTime()\n }\n return value\n }\n})\n\n// Helper to convert Zod's internal types to ZodTypeAny\nfunction asZodType<T>(schema: T): z.ZodTypeAny {\n return schema as unknown as z.ZodTypeAny\n}\n\n// Helper to check if a schema is a Date type through the registry\nexport function isDateSchema(schema: any): boolean {\n if (schema instanceof z.ZodDate) return true\n\n // Check through optional/nullable (these have public unwrap())\n if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable) {\n return isDateSchema(asZodType(schema.unwrap()))\n }\n\n // Cannot check transforms/pipes without _def access\n // This is a limitation of using only public APIs\n\n return false\n}\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod enum types to Convex validators\nexport function convertEnumType(actualValidator: z.ZodEnum<any>): GenericValidator {\n const options = (actualValidator as any).options\n if (options && Array.isArray(options) && options.length > 0) {\n // Filter out undefined/null and convert to Convex validators\n const validLiterals = options\n .filter((opt: any) => opt !== undefined && opt !== null)\n .map((opt: any) => v.literal(opt))\n\n if (validLiterals.length === 1) {\n const [first] = validLiterals\n return first as Validator<any, 'required', any>\n } else if (validLiterals.length >= 2) {\n const [first, second, ...rest] = validLiterals\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n } else {\n return v.any()\n }\n}\n","import type { GenericValidator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod nullable types to Convex validators\nexport function convertNullableType(\n actualValidator: z.ZodNullable<any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): { validator: GenericValidator; isOptional: boolean } {\n const innerSchema = actualValidator.unwrap()\n if (innerSchema && innerSchema instanceof z.ZodType) {\n // Check if the inner schema is optional\n if (innerSchema instanceof z.ZodOptional) {\n // For nullable(optional(T)), we want optional(union(T, null))\n const innerInnerSchema = innerSchema.unwrap()\n const innerInnerValidator = zodToConvexInternal(innerInnerSchema as z.ZodType, visited)\n return {\n validator: v.union(innerInnerValidator, v.null()),\n isOptional: true // Mark as optional so it gets wrapped later\n }\n } else {\n const innerValidator = zodToConvexInternal(innerSchema, visited)\n return {\n validator: v.union(innerValidator, v.null()),\n isOptional: false\n }\n }\n } else {\n return {\n validator: v.any(),\n isOptional: false\n }\n }\n}\n","import type { GenericValidator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod record types to Convex validators\nexport function convertRecordType(\n actualValidator: z.ZodRecord<any, any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n // In Zod v4, when z.record(z.string()) is used with one argument,\n // the argument becomes the value type and key defaults to string.\n // The valueType is stored in _def.valueType (or undefined if single arg)\n let valueType = (actualValidator as any)._def?.valueType\n\n // If valueType is undefined, it means single argument form was used\n // where the argument is actually the value type (stored in keyType)\n if (!valueType) {\n // Workaround: Zod v4 stores the value type in _def.keyType for single-argument z.record().\n // This accesses a private property as there is no public API for this in Zod v4.\n valueType = (actualValidator as any)._def?.keyType\n }\n\n if (valueType && valueType instanceof z.ZodType) {\n // First check if the Zod value type is optional before conversion\n const isZodOptional =\n valueType instanceof z.ZodOptional ||\n valueType instanceof z.ZodDefault ||\n (valueType instanceof z.ZodDefault && valueType.def.innerType instanceof z.ZodOptional)\n\n if (isZodOptional) {\n // For optional record values, we need to handle this specially\n let innerType: z.ZodTypeAny\n let recordDefaultValue: any = undefined\n let recordHasDefault = false\n\n if (valueType instanceof z.ZodDefault) {\n // Handle ZodDefault wrapper\n recordHasDefault = true\n recordDefaultValue = valueType.def.defaultValue\n const innerFromDefault = valueType.def.innerType\n if (innerFromDefault instanceof z.ZodOptional) {\n innerType = innerFromDefault.unwrap() as z.ZodTypeAny\n } else {\n innerType = innerFromDefault as z.ZodTypeAny\n }\n } else if (valueType instanceof z.ZodOptional) {\n // Direct ZodOptional\n innerType = valueType.unwrap() as z.ZodTypeAny\n } else {\n // Shouldn't happen based on isZodOptional check\n innerType = valueType as z.ZodTypeAny\n }\n\n // Convert the inner type to Convex and wrap in union with null\n const innerConvex = zodToConvexInternal(innerType, visited)\n const unionValidator = v.union(innerConvex, v.null())\n\n // Add default metadata if present\n if (recordHasDefault) {\n ;(unionValidator as any)._zodDefault = recordDefaultValue\n }\n\n return v.record(v.string(), unionValidator)\n } else {\n // Non-optional values can be converted normally\n return v.record(v.string(), zodToConvexInternal(valueType, visited))\n }\n } else {\n return v.record(v.string(), v.any())\n }\n}\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\n\n// Helper: Convert Zod discriminated union types to Convex validators\nexport function convertDiscriminatedUnionType(\n actualValidator: z.ZodDiscriminatedUnion<any, any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n const options =\n (actualValidator as any).def?.options || (actualValidator as any).def?.optionsMap?.values()\n if (options) {\n const opts = Array.isArray(options) ? options : Array.from(options)\n if (opts.length >= 2) {\n // IMPORTANT: Create a new visited set for each union member to prevent false circular\n // reference detection. The same schema can legitimately appear in multiple union branches.\n const convexOptions = opts.map((opt: any) => {\n const branchVisited = new Set(visited)\n return zodToConvexInternal(opt, branchVisited)\n }) as Validator<any, 'required', any>[]\n const [first, second, ...rest] = convexOptions\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n } else {\n return v.any()\n }\n}\n\n// Helper: Convert Zod union types to Convex validators\nexport function convertUnionType(\n actualValidator: z.ZodUnion<any>,\n visited: Set<z.ZodTypeAny>,\n zodToConvexInternal: (schema: z.ZodTypeAny, visited: Set<z.ZodTypeAny>) => any\n): GenericValidator {\n const options = (actualValidator as any).options\n if (options && Array.isArray(options) && options.length > 0) {\n if (options.length === 1) {\n return zodToConvexInternal(options[0], visited)\n } else {\n // Convert each option recursively\n // IMPORTANT: Create a new visited set for each union member to prevent false circular\n // reference detection. The same schema can legitimately appear in multiple union branches.\n // However, we do want to preserve the parent visited set to catch actual circular refs\n // that involve the union itself.\n const convexOptions = options.map((opt: any) => {\n // Create a new Set that includes the parent's visited schemas but won't pollute it\n const branchVisited = new Set(visited)\n return zodToConvexInternal(opt, branchVisited)\n }) as Validator<any, 'required', any>[]\n if (convexOptions.length >= 2) {\n const [first, second, ...rest] = convexOptions\n return v.union(\n first as Validator<any, 'required', any>,\n second as Validator<any, 'required', any>,\n ...rest\n )\n } else {\n return v.any()\n }\n }\n } else {\n return v.any()\n }\n}\n","import { v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers, type Zid } from '../ids'\n\n// Helper to check if a schema is a Zid\nexport function isZid<T extends string>(schema: z.ZodType): schema is Zid<T> {\n // Check our metadata registry for ConvexId marker\n const metadata = registryHelpers.getMetadata(schema)\n return (\n metadata?.isConvexId === true && metadata?.tableName && typeof metadata.tableName === 'string'\n )\n}\n\n// union helpers\nexport function makeUnion(members: any[]): any {\n const nonNull = members.filter(Boolean)\n if (nonNull.length === 0) return v.any()\n if (nonNull.length === 1) return nonNull[0]\n return v.union(nonNull[0], nonNull[1], ...nonNull.slice(2))\n}\n\nexport function getObjectShape(obj: any): Record<string, any> {\n // Use public API .shape property for ZodObject\n if (obj instanceof z.ZodObject) {\n return obj.shape\n }\n // Fallback for edge cases\n if (obj && typeof obj === 'object' && typeof obj.shape === 'object') {\n return obj.shape as Record<string, any>\n }\n return {}\n}\n","import type { GenericValidator, PropertyValidators } from 'convex/values'\nimport { v } from 'convex/values'\nimport { z } from 'zod'\nimport { registryHelpers } from '../ids'\nimport { findBaseCodec } from '../registry'\nimport {\n convertDiscriminatedUnionType,\n convertEnumType,\n convertNullableType,\n convertRecordType,\n convertUnionType\n} from './handlers'\nimport type {\n ConvexValidatorFromZod,\n ConvexValidatorFromZodFieldsAuto,\n ZodValidator\n} from './types'\nimport { getObjectShape, isZid } from './utils'\n\n// Internal conversion function using ZodType with def.type detection\nfunction zodToConvexInternal<Z extends z.ZodTypeAny>(\n zodValidator: Z,\n visited: Set<z.ZodTypeAny> = new Set()\n): ConvexValidatorFromZod<Z, 'required'> {\n // Guard against undefined/null validators (can happen with { field: undefined } in args)\n if (!zodValidator) {\n return v.any() as ConvexValidatorFromZod<Z, 'required'>\n }\n\n // Detect circular references to prevent infinite recursion\n if (visited.has(zodValidator)) {\n return v.any() as ConvexValidatorFromZod<Z, 'required'>\n }\n visited.add(zodValidator)\n\n // Check for default and optional wrappers\n let actualValidator = zodValidator\n let isOptional = false\n let defaultValue: any = undefined\n let hasDefault = false\n\n // Handle ZodDefault (which wraps ZodOptional when using .optional().default())\n // Note: We access _def properties directly because Zod v4 doesn't expose public APIs\n // for unwrapping defaults. The removeDefault() method exists but returns a new schema\n // without preserving references, which breaks our visited Set tracking.\n if (zodValidator instanceof z.ZodDefault) {\n hasDefault = true\n defaultValue = (zodValidator as any).def?.defaultValue\n actualValidator = (zodValidator as any).def?.innerType as Z\n }\n\n // Check for optional (may be wrapped inside ZodDefault)\n if (actualValidator instanceof z.ZodOptional) {\n isOptional = true\n actualValidator = actualValidator.unwrap() as Z\n\n // If the unwrapped type is ZodDefault, handle it here\n if (actualValidator instanceof z.ZodDefault) {\n hasDefault = true\n defaultValue = (actualValidator as any).def?.defaultValue\n actualValidator = (actualValidator as any).def?.innerType as Z\n }\n }\n\n let convexValidator: GenericValidator\n\n // Check for Zid first (special case)\n if (isZid(actualValidator)) {\n const metadata = registryHelpers.getMetadata(actualValidator)\n const tableName = metadata?.tableName || 'unknown'\n convexValidator = v.id(tableName)\n } else {\n // Use def.type for robust, performant type detection instead of instanceof checks.\n // Rationale:\n // 1. Performance: Single switch statement vs. cascading instanceof checks\n // 2. Completeness: def.type covers ALL Zod variants including formats (email, url, uuid, etc.)\n // 3. Future-proof: Zod's internal structure is stable; instanceof checks can miss custom types\n // 4. Precision: def.type distinguishes between semantically different types (date vs number)\n // This private API access is intentional and necessary for comprehensive type coverage.\n //\n // Compatibility: This code relies on the internal `.def.type` property of ZodType.\n // This structure has been stable across Zod v3.x and v4.x. If upgrading Zod major versions,\n // verify that `.def.type` is still present and unchanged.\n const defType = (actualValidator as any).def?.type\n\n switch (defType) {\n case 'string':\n // This catches ZodString and ALL string format types (email, url, uuid, etc.)\n convexValidator = v.string()\n break\n case 'number':\n convexValidator = v.float64()\n break\n case 'bigint':\n convexValidator = v.int64()\n break\n case 'boolean':\n convexValidator = v.boolean()\n break\n case 'date':\n convexValidator = v.float64() // Dates are stored as timestamps in Convex\n break\n case 'null':\n convexValidator = v.null()\n break\n case 'nan':\n convexValidator = v.float64()\n break\n case 'array': {\n // Use classic API: ZodArray has .element property\n if (actualValidator instanceof z.ZodArray) {\n const element = (actualValidator as any).element\n if (element && element instanceof z.ZodType) {\n convexValidator = v.array(zodToConvexInternal(element, visited))\n } else {\n convexValidator = v.array(v.any())\n }\n } else {\n convexValidator = v.array(v.any())\n }\n break\n }\n case 'object': {\n // Use classic API: ZodObject has .shape property\n if (actualValidator instanceof z.ZodObject) {\n const shape = actualValidator.shape\n const convexShape: PropertyValidators = {}\n for (const [key, value] of Object.entries(shape)) {\n if (value && value instanceof z.ZodType) {\n convexShape[key] = zodToConvexInternal(value, visited)\n }\n }\n convexValidator = v.object(convexShape)\n } else {\n convexValidator = v.object({})\n }\n break\n }\n case 'union': {\n if (actualValidator instanceof z.ZodUnion) {\n convexValidator = convertUnionType(actualValidator, visited, zodToConvexInternal)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'discriminatedUnion': {\n convexValidator = convertDiscriminatedUnionType(\n actualValidator as any,\n visited,\n zodToConvexInternal\n )\n break\n }\n case 'literal': {\n // Use classic API: ZodLiteral has .value property\n if (actualValidator instanceof z.ZodLiteral) {\n const literalValue = (actualValidator as any).value\n if (literalValue !== undefined && literalValue !== null) {\n convexValidator = v.literal(literalValue)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'enum': {\n if (actualValidator instanceof z.ZodEnum) {\n convexValidator = convertEnumType(actualValidator)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'record': {\n if (actualValidator instanceof z.ZodRecord) {\n convexValidator = convertRecordType(actualValidator, visited, zodToConvexInternal)\n } else {\n convexValidator = v.record(v.string(), v.any())\n }\n break\n }\n case 'transform':\n case 'pipe': {\n // Check for registered codec first\n const codec = findBaseCodec(actualValidator)\n if (codec) {\n convexValidator = codec.toValidator(actualValidator)\n } else {\n // Check for brand metadata\n const metadata = registryHelpers.getMetadata(actualValidator)\n if (metadata?.brand && metadata?.originalSchema) {\n // For branded types created by our zBrand function, use the original schema\n convexValidator = zodToConvexInternal(metadata.originalSchema, visited)\n } else {\n // For non-registered transforms, return v.any()\n convexValidator = v.any()\n }\n }\n break\n }\n case 'nullable': {\n if (actualValidator instanceof z.ZodNullable) {\n const result = convertNullableType(actualValidator, visited, zodToConvexInternal)\n convexValidator = result.validator\n if (result.isOptional) {\n isOptional = true\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'tuple': {\n // Handle tuple types as objects with numeric keys\n if (actualValidator instanceof z.ZodTuple) {\n const items = (actualValidator as any).def?.items as z.ZodTypeAny[] | undefined\n if (items && items.length > 0) {\n const convexShape: PropertyValidators = {}\n items.forEach((item, index) => {\n convexShape[`_${index}`] = zodToConvexInternal(item, visited)\n })\n convexValidator = v.object(convexShape)\n } else {\n convexValidator = v.object({})\n }\n } else {\n convexValidator = v.object({})\n }\n break\n }\n case 'lazy': {\n // Handle lazy schemas by resolving them\n // Circular references are protected by the visited set check at function start\n if (actualValidator instanceof z.ZodLazy) {\n try {\n const getter = (actualValidator as any).def?.getter\n if (getter) {\n const resolvedSchema = getter()\n if (resolvedSchema && resolvedSchema instanceof z.ZodType) {\n convexValidator = zodToConvexInternal(resolvedSchema, visited)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n } catch {\n // If resolution fails, fall back to 'any'\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'any':\n // Handle z.any() directly\n convexValidator = v.any()\n break\n case 'unknown':\n // Handle z.unknown() as any\n convexValidator = v.any()\n break\n case 'undefined':\n case 'void':\n case 'never':\n // These types don't have good Convex equivalents\n convexValidator = v.any()\n break\n case 'intersection':\n // Can't properly handle intersections\n convexValidator = v.any()\n break\n default:\n // For any unrecognized def.type, return v.any()\n // No instanceof fallbacks - keep it simple and performant\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[zodvex] Unrecognized Zod type \"${defType}\" encountered. Falling back to v.any().`,\n 'Schema:',\n actualValidator\n )\n }\n convexValidator = v.any()\n break\n }\n }\n\n // For optional or default fields, always use v.optional()\n const finalValidator = isOptional || hasDefault ? v.optional(convexValidator) : convexValidator\n\n // Add metadata if there's a default value\n if (hasDefault && typeof finalValidator === 'object' && finalValidator !== null) {\n ;(finalValidator as any)._zodDefault = defaultValue\n }\n\n return finalValidator as ConvexValidatorFromZod<Z, 'required'>\n}\n\nexport function zodToConvex<Z extends z.ZodTypeAny | ZodValidator>(\n zod: Z\n): Z extends z.ZodTypeAny\n ? ConvexValidatorFromZod<Z, 'required'>\n : Z extends ZodValidator\n ? ConvexValidatorFromZodFieldsAuto<Z>\n : never {\n if (typeof zod === 'object' && zod !== null && !(zod instanceof z.ZodType)) {\n return zodToConvexFields(zod as ZodValidator) as any\n }\n\n return zodToConvexInternal(zod as z.ZodTypeAny) as any\n}\n\nexport function zodToConvexFields<Z extends z.ZodRawShape>(\n zod: Z\n): ConvexValidatorFromZodFieldsAuto<Z> {\n // If it's a ZodObject, extract the shape\n const fields = zod instanceof z.ZodObject ? zod.shape : zod\n\n // Build the result object directly to preserve types\n const result: any = {}\n for (const [key, value] of Object.entries(fields)) {\n result[key] = zodToConvexInternal(value as z.ZodTypeAny)\n }\n\n return result as ConvexValidatorFromZodFieldsAuto<Z>\n}\n","import { z } from 'zod'\nimport { zodToConvex } from './mapping'\nimport { findBaseCodec, isDateSchema } from './registry'\n\n// Helper to convert Zod's internal types to ZodTypeAny\nfunction asZodType<T>(schema: T): z.ZodTypeAny {\n return schema as unknown as z.ZodTypeAny\n}\n\nexport type ConvexCodec<T> = {\n validator: any\n encode: (value: T) => any\n decode: (value: any) => T\n pick: <K extends keyof T>(keys: K[]) => ConvexCodec<Pick<T, K>>\n}\n\nexport function convexCodec<T>(schema: z.ZodType<T>): ConvexCodec<T> {\n const validator = zodToConvex(schema)\n\n return {\n validator,\n encode: (value: T) => toConvexJS(schema, value),\n decode: (value: any) => fromConvexJS(value, schema),\n pick: <K extends keyof T>(keys: K[] | Record<K, true>) => {\n if (!(schema instanceof z.ZodObject)) {\n throw new Error('pick() can only be called on object schemas')\n }\n // Handle both array and object formats\n const pickObj = Array.isArray(keys)\n ? keys.reduce((acc, k) => ({ ...acc, [k]: true }), {} as any)\n : keys\n const pickedSchema = schema.pick(pickObj as any)\n return convexCodec(pickedSchema) as ConvexCodec<Pick<T, K>>\n }\n }\n}\n\n// Convert JS values to Convex-safe JSON (handle Dates, remove undefined)\nexport function toConvexJS(schema?: any, value?: any): any {\n // If no schema provided, do basic conversion\n if (!schema || arguments.length === 1) {\n value = schema\n return basicToConvex(value)\n }\n\n // Use schema-aware conversion\n return schemaToConvex(value, schema)\n}\n\nfunction basicToConvex(value: any): any {\n if (value === undefined) return undefined\n if (value === null) return null\n if (value instanceof Date) return value.getTime()\n\n if (Array.isArray(value)) {\n return value.map(basicToConvex)\n }\n\n if (value && typeof value === 'object') {\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = basicToConvex(v)\n }\n }\n return result\n }\n\n return value\n}\n\nfunction schemaToConvex(value: any, schema: any): any {\n if (value === undefined || value === null) return value\n\n // Check base codec registry first\n const codec = findBaseCodec(schema)\n if (codec) {\n return codec.toConvex(value, schema)\n }\n\n // Handle wrapper types\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n schema instanceof z.ZodDefault\n ) {\n // Use unwrap() method which is available on these types\n const inner = schema.unwrap()\n return schemaToConvex(value, asZodType(inner))\n }\n\n // Handle Date specifically\n if (schema instanceof z.ZodDate && value instanceof Date) {\n return value.getTime()\n }\n\n // Handle arrays\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value\n return value.map(item => schemaToConvex(item, schema.element))\n }\n\n // Handle objects\n if (schema instanceof z.ZodObject) {\n if (!value || typeof value !== 'object') return value\n const shape = schema.shape\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = shape[k] ? schemaToConvex(v, shape[k]) : basicToConvex(v)\n }\n }\n return result\n }\n\n // Handle unions\n if (schema instanceof z.ZodUnion) {\n // Try each option to see which one matches\n for (const option of schema.options) {\n try {\n ;(option as any).parse(value) // Validate against this option\n return schemaToConvex(value, option)\n } catch {\n // Try next option\n }\n }\n }\n\n // Handle records\n if (schema instanceof z.ZodRecord) {\n if (!value || typeof value !== 'object') return value\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n if (v !== undefined) {\n result[k] = schemaToConvex(v, schema.valueType)\n }\n }\n return result\n }\n\n // Default passthrough\n return basicToConvex(value)\n}\n\n// Convert Convex JSON back to JS values (handle timestamps -> Dates)\nexport function fromConvexJS(value: any, schema: any): any {\n if (value === undefined || value === null) return value\n\n // Check base codec registry first\n const codec = findBaseCodec(schema)\n if (codec) {\n return codec.fromConvex(value, schema)\n }\n\n // Handle wrapper types\n if (\n schema instanceof z.ZodOptional ||\n schema instanceof z.ZodNullable ||\n schema instanceof z.ZodDefault\n ) {\n // Use unwrap() method which is available on these types\n const inner = schema.unwrap()\n return fromConvexJS(value, asZodType(inner))\n }\n\n // Handle Date specifically\n if (schema instanceof z.ZodDate && typeof value === 'number') {\n return new Date(value)\n }\n\n // Check if schema is a Date through effects/transforms\n if (isDateSchema(schema) && typeof value === 'number') {\n return new Date(value)\n }\n\n // Handle arrays\n if (schema instanceof z.ZodArray) {\n if (!Array.isArray(value)) return value\n return value.map(item => fromConvexJS(item, schema.element))\n }\n\n // Handle objects\n if (schema instanceof z.ZodObject) {\n if (!value || typeof value !== 'object') return value\n const shape = schema.shape\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = shape[k] ? fromConvexJS(v, shape[k]) : v\n }\n return result\n }\n\n // Handle unions\n if (schema instanceof z.ZodUnion) {\n // Try to decode with each option\n for (const option of schema.options) {\n try {\n const decoded = fromConvexJS(value, option)\n ;(option as any).parse(decoded) // Validate the decoded value\n return decoded\n } catch {\n // Try next option\n }\n }\n }\n\n // Handle records\n if (schema instanceof z.ZodRecord) {\n if (!value || typeof value !== 'object') return value\n const result: any = {}\n for (const [k, v] of Object.entries(value)) {\n result[k] = fromConvexJS(v, schema.valueType)\n }\n return result\n }\n\n // Handle effects and transforms\n // Note: ZodPipe doesn't exist in Zod v4, only ZodTransform\n if (schema instanceof z.ZodTransform) {\n // Cannot access inner schema without _def, return value as-is\n return value\n }\n\n return value\n}\n","import { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { getObjectShape } from './mapping'\n\nexport function pick<T extends Record<string, any>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>\n for (const key of keys) {\n if (key in obj) result[key] = obj[key]\n }\n return result\n}\n\n// Typed identity helper for returns schemas\nexport function returnsAs<R extends z.ZodTypeAny>() {\n return <T extends z.input<R>>(v: T) => v\n}\n\n// Format ZodError issues into a compact, consistent structure\nexport function formatZodIssues(\n error: z.ZodError,\n context?: 'args' | 'returns' | 'input' | 'output' | 'codec'\n) {\n return {\n error: 'ZodValidationError',\n context,\n issues: error.issues.map(issue => ({\n path: Array.isArray(issue.path) ? issue.path.join('.') : String(issue.path ?? ''),\n code: issue.code,\n message: issue.message\n })),\n // Keep a flattened snapshot for easier debugging without cyclic refs\n flatten: JSON.parse(JSON.stringify(error.flatten?.() ?? {}))\n }\n}\n\n// Handle Zod validation errors consistently across all wrappers\n// Throws a ConvexError with formatted issues if the error is a ZodError, otherwise re-throws\nexport function handleZodValidationError(\n e: unknown,\n context: 'args' | 'returns' | 'input' | 'output' | 'codec'\n): never {\n if (e instanceof z.ZodError) {\n throw new ConvexError(formatZodIssues(e, context))\n }\n throw e\n}\n\n// Helper: standard Convex paginate() result schema\nexport function zPaginated<T extends z.ZodTypeAny>(item: T) {\n return z.object({\n page: z.array(item),\n isDone: z.boolean(),\n continueCursor: z.string().nullable().optional()\n })\n}\n\n/**\n * Maps Date fields to number fields for docSchema generation.\n * Handles Date, Date.optional(), Date.nullable(), and Date.default() cases.\n * Returns the original field for non-Date types.\n */\nexport function mapDateFieldToNumber(field: z.ZodTypeAny): z.ZodTypeAny {\n // Direct Date field\n if (field instanceof z.ZodDate) {\n return z.number()\n }\n\n // Optional Date field\n if (field instanceof z.ZodOptional && field.unwrap() instanceof z.ZodDate) {\n return z.number().optional()\n }\n\n // Nullable Date field\n if (field instanceof z.ZodNullable && field.unwrap() instanceof z.ZodDate) {\n return z.number().nullable()\n }\n\n // Date with default value\n if (field instanceof z.ZodDefault) {\n const inner = field.removeDefault()\n if (inner instanceof z.ZodDate) {\n return z.number().optional()\n }\n }\n\n // Non-Date field - return as-is\n return field\n}\n\n// Schema picking utilities (moved from pick.ts for consolidation)\ntype Mask = readonly string[] | Record<string, boolean | 1 | true>\n\nfunction toKeys(mask: Mask): string[] {\n if (Array.isArray(mask)) return mask.map(String)\n return Object.keys(mask).filter(k => !!(mask as any)[k])\n}\n\n/**\n * Returns a plain shape object containing only the selected fields.\n * Accepts either a ZodObject or a raw shape object.\n */\nexport function pickShape(\n schemaOrShape: z.ZodObject<any> | Record<string, any>,\n mask: Mask\n): Record<string, any> {\n const keys = toKeys(mask)\n const shape =\n schemaOrShape instanceof z.ZodObject ? getObjectShape(schemaOrShape) : schemaOrShape || {}\n\n const out: Record<string, any> = {}\n for (const k of keys) {\n if (k in shape) out[k] = (shape as any)[k]\n }\n return out\n}\n\n// Builds a fresh Zod object from the selected fields (avoids Zod's .pick())\nexport function safePick(schema: z.ZodObject<any>, mask: Mask): z.ZodObject<any> {\n return z.object(pickShape(schema, mask))\n}\n\n/**\n * Convenience: omit a set of keys by building the complement.\n * Avoids using Zod's .omit() which can cause type depth issues.\n */\nexport function safeOmit(schema: z.ZodObject<any>, mask: Mask): z.ZodObject<any> {\n const shape = getObjectShape(schema)\n const omit = new Set(toKeys(mask))\n const keep = Object.keys(shape).filter(k => !omit.has(k))\n const picked = pickShape(schema, keep)\n return z.object(picked)\n}\n","import {\n type ActionBuilder,\n type ArgsArrayToObject,\n type DefaultFunctionArgs,\n type FunctionVisibility,\n type GenericActionCtx,\n type GenericDataModel,\n type GenericMutationCtx,\n type GenericQueryCtx,\n type MutationBuilder,\n type QueryBuilder\n} from 'convex/server'\nimport { ConvexError, type PropertyValidators } from 'convex/values'\nimport { type Customization, NoOp } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { fromConvexJS, toConvexJS } from './codec'\nimport { type ZodValidator, zodToConvex, zodToConvexFields } from './mapping'\nimport type { ExtractCtx, ExtractVisibility } from './types'\nimport { handleZodValidationError, pick } from './utils'\n\n// Type helpers for args transformation (from zodV3 example)\ntype OneArgArray<ArgsObject extends DefaultFunctionArgs = DefaultFunctionArgs> = [ArgsObject]\n\n// Simple type conversion from a Convex validator to a Zod validator return type\ntype NullToUndefinedOrNull<T> = T extends null ? T | undefined | void : T\ntype Returns<T> = Promise<NullToUndefinedOrNull<T>> | NullToUndefinedOrNull<T>\n\n// The return value before it's been validated: returned by the handler\ntype ReturnValueInput<ReturnsValidator extends z.ZodTypeAny | ZodValidator | void> = [\n ReturnsValidator\n] extends [z.ZodTypeAny]\n ? Returns<z.input<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.input<z.ZodObject<ReturnsValidator>>>\n : any\n\n// The return value after it's been validated: returned to the client\ntype ReturnValueOutput<ReturnsValidator extends z.ZodTypeAny | ZodValidator | void> = [\n ReturnsValidator\n] extends [z.ZodTypeAny]\n ? Returns<z.output<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.output<z.ZodObject<ReturnsValidator>>>\n : any\n\n// The args before they've been validated: passed from the client\ntype ArgsInput<ArgsValidator extends ZodValidator | z.ZodObject<any> | void> = [\n ArgsValidator\n] extends [z.ZodObject<any>]\n ? [z.input<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.input<z.ZodObject<ArgsValidator>>]\n : OneArgArray\n\n// The args after they've been validated: passed to the handler\ntype ArgsOutput<ArgsValidator extends ZodValidator | z.ZodObject<any> | void> = [\n ArgsValidator\n] extends [z.ZodObject<any>]\n ? [z.output<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.output<z.ZodObject<ArgsValidator>>]\n : OneArgArray\n\ntype Overwrite<T, U> = Omit<T, keyof U> & U\n\n// Hack to simplify how TypeScript renders object types\ntype Expand<ObjectType extends Record<any, any>> = ObjectType extends Record<any, any>\n ? {\n [Key in keyof ObjectType]: ObjectType[Key]\n }\n : never\n\ntype ArgsForHandlerType<\n OneOrZeroArgs extends [] | [Record<string, any>],\n CustomMadeArgs extends Record<string, any>\n> = CustomMadeArgs extends Record<string, never>\n ? OneOrZeroArgs\n : OneOrZeroArgs extends [infer A]\n ? [Expand<A & CustomMadeArgs>]\n : [CustomMadeArgs]\n\n// Helper type for function registration (from zodV3)\ntype Registration<\n FuncType extends 'query' | 'mutation' | 'action',\n Visibility extends FunctionVisibility,\n Args extends DefaultFunctionArgs,\n Output\n> = FuncType extends 'query'\n ? import('convex/server').RegisteredQuery<Visibility, Args, Output>\n : FuncType extends 'mutation'\n ? import('convex/server').RegisteredMutation<Visibility, Args, Output>\n : import('convex/server').RegisteredAction<Visibility, Args, Output>\n\n/**\n * A builder that customizes a Convex function, whether or not it validates\n * arguments. If the customization requires arguments, however, the resulting\n * builder will require argument validation too.\n *\n * This is our own Zod-aware CustomBuilder type that properly handles Zod validators.\n */\nexport type CustomBuilder<\n FuncType extends 'query' | 'mutation' | 'action',\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n InputCtx,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any>\n> = {\n <\n ArgsValidator extends ZodValidator | z.ZodObject<any> | void,\n ReturnsZodValidator extends z.ZodTypeAny | ZodValidator | void = void,\n ReturnValue extends ReturnValueInput<ReturnsZodValidator> = any\n >(\n func:\n | ({\n /**\n * Specify the arguments to the function as a Zod validator.\n */\n args?: ArgsValidator\n handler: (\n ctx: Overwrite<InputCtx, CustomCtx>,\n ...args: ArgsForHandlerType<ArgsOutput<ArgsValidator>, CustomMadeArgs>\n ) => ReturnValue\n /**\n * Validates the value returned by the function.\n * Note: you can't pass an object directly without wrapping it\n * in `z.object()`.\n */\n returns?: ReturnsZodValidator\n /**\n * If true, the function will not be validated by Convex,\n * in case you're seeing performance issues with validating twice.\n */\n skipConvexValidation?: boolean\n } & {\n [key in keyof ExtraArgs as key extends\n | 'args'\n | 'handler'\n | 'skipConvexValidation'\n | 'returns'\n ? never\n : key]: ExtraArgs[key]\n })\n | {\n (\n ctx: Overwrite<InputCtx, CustomCtx>,\n ...args: ArgsForHandlerType<ArgsOutput<ArgsValidator>, CustomMadeArgs>\n ): ReturnValue\n }\n ): Registration<\n FuncType,\n Visibility,\n ArgsArrayToObject<\n CustomArgsValidator extends Record<string, never>\n ? ArgsInput<ArgsValidator>\n : ArgsInput<ArgsValidator> extends [infer A]\n ? [Expand<A & import('convex/values').ObjectType<CustomArgsValidator>>]\n : [import('convex/values').ObjectType<CustomArgsValidator>]\n >,\n ReturnsZodValidator extends void ? ReturnValue : ReturnValueOutput<ReturnsZodValidator>\n >\n}\n\nexport function customFnBuilder<\n Ctx extends Record<string, any>,\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n builder: Builder,\n customization: Customization<Ctx, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n const customInput = customization.input ?? NoOp.input\n const inputArgs = customization.args ?? NoOp.args\n\n return function customBuilder(fn: any): any {\n const { args, handler = fn, returns: maybeObject, ...extra } = fn\n\n const returns =\n maybeObject && !(maybeObject instanceof z.ZodType) ? z.object(maybeObject) : maybeObject\n const returnValidator =\n returns && !fn.skipConvexValidation ? { returns: zodToConvex(returns) } : undefined\n\n if (args && !fn.skipConvexValidation) {\n let argsValidator = args\n let argsSchema: z.ZodObject<any>\n\n if (argsValidator instanceof z.ZodType) {\n if (argsValidator instanceof z.ZodObject) {\n argsSchema = argsValidator\n argsValidator = argsValidator.shape // Get the raw shape for zodToConvexFields\n } else {\n throw new Error(\n 'Unsupported non-object Zod schema for args; please provide an args schema using z.object({...}), e.g. z.object({ foo: z.string() })'\n )\n }\n } else {\n // It's a raw shape object with Zod validators as values\n argsSchema = z.object(argsValidator)\n }\n\n const convexValidator = zodToConvexFields(argsValidator)\n return builder({\n args: { ...convexValidator, ...inputArgs },\n ...returnValidator,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added: any = await customInput(\n ctx,\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )\n const argKeys = Object.keys(argsValidator)\n const rawArgs = pick(allArgs, argKeys)\n const decoded = fromConvexJS(rawArgs, argsSchema)\n const parsed = argsSchema.safeParse(decoded)\n if (!parsed.success) {\n handleZodValidationError(parsed.error, 'args')\n }\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const baseArgs = parsed.data as Record<string, unknown>\n const addedArgs = (added?.args as Record<string, unknown>) ?? {}\n const finalArgs = { ...baseArgs, ...addedArgs }\n const ret = await handler(finalCtx, finalArgs)\n if (returns && !fn.skipConvexValidation) {\n let validated: any\n try {\n validated = (returns as z.ZodTypeAny).parse(ret)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n if (added?.onSuccess) {\n await added.onSuccess({\n ctx,\n args: parsed.data,\n result: validated\n })\n }\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: parsed.data, result: ret })\n }\n return ret\n }\n })\n }\n return builder({\n args: inputArgs,\n ...returnValidator,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added: any = await customInput(\n ctx,\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const baseArgs = allArgs as Record<string, unknown>\n const addedArgs = (added?.args as Record<string, unknown>) ?? {}\n const finalArgs = { ...baseArgs, ...addedArgs }\n const ret = await handler(finalCtx, finalArgs)\n if (returns && !fn.skipConvexValidation) {\n let validated: any\n try {\n validated = (returns as z.ZodTypeAny).parse(ret)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: allArgs, result: validated })\n }\n return toConvexJS(returns as z.ZodTypeAny, validated)\n }\n if (added?.onSuccess) {\n await added.onSuccess({ ctx, args: allArgs, result: ret })\n }\n return ret\n }\n })\n }\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n DataModel extends GenericDataModel,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<DataModel, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n GenericQueryCtx<DataModel>,\n Visibility,\n ExtraArgs\n>\n\n// Overload 2: No constraint + decoupled ctx\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<any, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n any,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomQuery<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: QueryBuilder<any, Visibility>,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n // Implementation deliberately uses 'any' ctx to preserve overload behavior\n // while avoiding a GenericDataModel constraint at the implementation level.\n return customFnBuilder<\n any,\n typeof query,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtraArgs\n >(query as any, customization as any) as any\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomMutation<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n _Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n mutation as any,\n customization as any\n ) as any\n}\n\n// Overload 1: With constraint - preferred to preserve DataModel types\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n>\n\n// Implementation\nexport function zCustomAction<\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Builder extends (fn: any) => any,\n _Visibility extends FunctionVisibility = 'public',\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n action as any,\n customization as any\n ) as any\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { fromConvexJS, toConvexJS } from './codec'\nimport { getObjectShape, zodToConvex, zodToConvexFields } from './mapping'\n// Typing helpers to keep handler args/returns precise without deep remapping\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { handleZodValidationError } from './utils'\n\n// Cache to avoid re-checking the same schema\nconst customCheckCache = new WeakMap<z.ZodTypeAny, boolean>()\n\n/**\n * Check if a schema contains z.custom types (runtime check).\n * Includes depth limit to prevent stack overflow on deeply nested schemas.\n */\nfunction containsCustom(schema: z.ZodTypeAny, maxDepth = 50, currentDepth = 0): boolean {\n // Check cache first\n const cached = customCheckCache.get(schema)\n if (cached !== undefined) {\n return cached\n }\n\n // Prevent stack overflow on deeply nested schemas\n if (currentDepth > maxDepth) {\n return false\n }\n\n let result = false\n\n // Use _def.typeName instead of instanceof since ZodCustom is not exported in Zod v4\n if ((schema as any)._def?.typeName === 'ZodCustom') {\n result = true\n } else if (schema instanceof z.ZodUnion) {\n result = (schema.options as z.ZodTypeAny[]).some(opt =>\n containsCustom(opt, maxDepth, currentDepth + 1)\n )\n } else if (schema instanceof z.ZodOptional) {\n result = containsCustom(schema.unwrap() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n } else if (schema instanceof z.ZodNullable) {\n result = containsCustom(schema.unwrap() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n } else if (schema instanceof z.ZodDefault) {\n result = containsCustom(schema.removeDefault() as z.ZodTypeAny, maxDepth, currentDepth + 1)\n }\n\n customCheckCache.set(schema, result)\n return result\n}\n\nexport function zQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n query: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredQuery<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n // Single schema → normalize to { value }\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return query({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalQuery<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalQuery: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredQuery<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zQuery(internalQuery, input, handler, options)\n}\n\nexport function zMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n mutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredMutation<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return mutation({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalMutation<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalMutation: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredMutation<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zMutation(internalMutation, input, handler, options)\n}\n\nexport function zAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n action: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredAction<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n let zodSchema: z.ZodTypeAny\n let args: Record<string, any>\n if (input instanceof z.ZodObject) {\n const zodObj = input as z.ZodObject<any>\n zodSchema = zodObj\n args = zodToConvexFields(getObjectShape(zodObj))\n } else if (input instanceof z.ZodType) {\n zodSchema = z.object({ value: input as any })\n args = { value: zodToConvex(input as any) }\n } else {\n zodSchema = z.object(input as Record<string, any>)\n args = zodToConvexFields(input as Record<string, any>)\n }\n // Skip returns validator for schemas with custom types to avoid type depth issues\n const returns =\n options?.returns && !containsCustom(options.returns) ? zodToConvex(options.returns) : undefined\n\n return action({\n args,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const decoded = fromConvexJS(argsObject, zodSchema)\n let parsed: any\n try {\n parsed = zodSchema.parse(decoded) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n const raw = await handler(ctx, parsed)\n if (options?.returns) {\n try {\n const validated = (options.returns as z.ZodTypeAny).parse(raw)\n return toConvexJS(options.returns as z.ZodTypeAny, validated)\n } catch (e) {\n handleZodValidationError(e, 'returns')\n }\n }\n // Fallback: ensure Convex-safe return values (e.g., Date → timestamp)\n return toConvexJS(raw) as any\n }\n }) as any\n}\n\nexport function zInternalAction<\n Builder extends (fn: any) => any,\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n>(\n internalAction: Builder,\n input: A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options?: { returns?: R }\n): RegisteredAction<Visibility, ZodToConvexArgs<A>, Promise<InferReturns<R>>> {\n return zAction(internalAction, input, handler, options) as any\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport type { PropertyValidators } from 'convex/values'\nimport type { Customization } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport { type CustomBuilder, customFnBuilder } from './custom'\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { zAction, zMutation, zQuery } from './wrappers'\n\n/**\n * Creates a reusable query builder from a Convex query builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { query } from './_generated/server'\n * import { zQueryBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const zq = zQueryBuilder(query)\n *\n * // Use it with Convex-style object syntax\n * export const getUser = zq({\n * args: { id: z.string() },\n * handler: async (ctx, { id }) => {\n * return ctx.db.get(id)\n * }\n * })\n * ```\n */\nexport function zQueryBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredQuery<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zQuery(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a reusable mutation builder from a Convex mutation builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { mutation } from './_generated/server'\n * import { zMutationBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const zm = zMutationBuilder(mutation)\n *\n * // Use it with Convex-style object syntax\n * export const updateUser = zm({\n * args: { id: z.string(), name: z.string() },\n * handler: async (ctx, { id, name }) => {\n * return ctx.db.patch(id, { name })\n * }\n * })\n * ```\n */\nexport function zMutationBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredMutation<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zMutation(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a reusable action builder from a Convex action builder.\n * Returns a builder function that accepts Convex-style config objects with args, handler, and returns.\n *\n * @example\n * ```ts\n * import { action } from './_generated/server'\n * import { zActionBuilder } from 'zodvex'\n *\n * // Create a reusable builder\n * export const za = zActionBuilder(action)\n *\n * // Use it with Convex-style object syntax\n * export const sendEmail = za({\n * args: { to: z.string().email(), subject: z.string() },\n * handler: async (ctx, { to, subject }) => {\n * // Send email\n * }\n * })\n * ```\n */\nexport function zActionBuilder<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends z.ZodTypeAny | Record<string, z.ZodTypeAny>,\n R extends z.ZodTypeAny | undefined = undefined,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>\n >(config: {\n args?: A\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>\n returns?: R\n }): RegisteredAction<\n Visibility,\n ZodToConvexArgs<A extends undefined ? Record<string, never> : A>,\n Promise<InferReturns<R>>\n > => {\n return zAction(builder, config.args ?? ({} as any), config.handler, {\n returns: config.returns\n }) as any\n }\n}\n\n/**\n * Creates a custom query builder with context injection from a Convex query builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your queries.\n *\n * @example\n * ```ts\n * import { type QueryCtx, query } from './_generated/server'\n * import { zCustomQueryBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authQuery = zCustomQueryBuilder(\n * query,\n * customCtx(async (ctx: QueryCtx) => {\n * const user = await getUserOrThrow(ctx)\n * return { user }\n * })\n * )\n *\n * // Use it with automatic user injection\n * export const getMyProfile = authQuery({\n * args: {},\n * handler: async (ctx) => {\n * // ctx.user is automatically available\n * return ctx.db.get(ctx.user._id)\n * }\n * })\n * ```\n */\nexport function zCustomQueryBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n query: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'query',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n query as any,\n customization as any\n ) as any\n}\n\n/**\n * Creates a custom mutation builder with context injection from a Convex mutation builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your mutations.\n *\n * @example\n * ```ts\n * import { type MutationCtx, mutation } from './_generated/server'\n * import { zCustomMutationBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authMutation = zCustomMutationBuilder(\n * mutation,\n * customCtx(async (ctx: MutationCtx) => {\n * const user = await getUserOrThrow(ctx)\n * return { user }\n * })\n * )\n *\n * // Use it with automatic user injection\n * export const updateProfile = authMutation({\n * args: { name: z.string() },\n * handler: async (ctx, { name }) => {\n * // ctx.user is automatically available\n * await ctx.db.patch(ctx.user._id, { name })\n * }\n * })\n * ```\n */\nexport function zCustomMutationBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n mutation: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'mutation',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n mutation as any,\n customization as any\n ) as any\n}\n\n/**\n * Creates a custom action builder with context injection from a Convex action builder.\n * Allows you to add custom context (like auth, permissions, etc.) to your actions.\n *\n * @example\n * ```ts\n * import { type ActionCtx, action } from './_generated/server'\n * import { zCustomActionBuilder, customCtx } from 'zodvex'\n *\n * // Create a builder with auth context\n * export const authAction = zCustomActionBuilder(\n * action,\n * customCtx(async (ctx: ActionCtx) => {\n * const identity = await ctx.auth.getUserIdentity()\n * if (!identity) throw new Error('Unauthorized')\n * return { userId: identity.subject }\n * })\n * )\n *\n * // Use it with automatic auth injection\n * export const sendEmail = authAction({\n * args: { to: z.string().email() },\n * handler: async (ctx, { to }) => {\n * // ctx.userId is automatically available\n * await sendEmailService(to, ctx.userId)\n * }\n * })\n * ```\n */\nexport function zCustomActionBuilder<\n Builder extends (fn: any) => any,\n CustomArgsValidator extends PropertyValidators,\n CustomCtx extends Record<string, any>,\n CustomMadeArgs extends Record<string, any>,\n Visibility extends FunctionVisibility = ExtractVisibility<Builder>,\n ExtraArgs extends Record<string, any> = Record<string, any>\n>(\n action: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n): CustomBuilder<\n 'action',\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtractCtx<Builder>,\n Visibility,\n ExtraArgs\n> {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n action as any,\n customization as any\n ) as any\n}\n","import type { GenericId } from 'convex/values'\nimport { Table } from 'convex-helpers/server'\nimport { z } from 'zod'\nimport { zid } from './ids'\nimport { type ConvexValidatorFromZodFieldsAuto, zodToConvexFields } from './mapping'\n\n// Helper to create a Zod schema for a Convex document\nexport function zodDoc<\n TableName extends string,\n Shape extends z.ZodRawShape,\n Schema extends z.ZodObject<Shape>\n>(\n tableName: TableName,\n schema: Schema\n): z.ZodObject<\n Shape & {\n _id: ReturnType<typeof zid<TableName>>\n _creationTime: z.ZodNumber\n }\n> {\n // Use extend to preserve the original schema's type information\n return schema.extend({\n _id: zid(tableName),\n _creationTime: z.number()\n }) as any\n}\n\n// Helper to create nullable doc schema\nexport function zodDocOrNull<\n TableName extends string,\n Shape extends z.ZodRawShape,\n Schema extends z.ZodObject<Shape>\n>(tableName: TableName, schema: Schema) {\n return z.union([zodDoc(tableName, schema), z.null()])\n}\n\n/**\n * Defines a Convex table using a raw Zod shape (an object mapping field names to Zod types).\n *\n * This function intentionally accepts a raw shape instead of a ZodObject instance.\n * Accepting raw shapes allows TypeScript to infer field types more accurately and efficiently,\n * leading to better type inference and performance throughout the codebase.\n * This architectural decision is important for projects that rely heavily on type safety and\n * developer experience, as it avoids the type erasure that can occur when using ZodObject directly.\n *\n * Returns the Table definition along with Zod schemas for documents and arrays.\n *\n * @param name - The table name\n * @param shape - A raw object mapping field names to Zod validators\n * @returns A Table with attached shape, zDoc schema, and docArray helper\n *\n * @example\n * ```ts\n * const Users = zodTable('users', {\n * name: z.string(),\n * email: z.string().email(),\n * age: z.number().optional()\n * })\n *\n * // Use in schema\n * export default defineSchema({ users: Users.table })\n *\n * // Use for return types\n * export const getUsers = zQuery(query, {},\n * async (ctx) => ctx.db.query('users').collect(),\n * { returns: Users.docArray }\n * )\n * ```\n */\nexport function zodTable<TableName extends string, Shape extends Record<string, z.ZodTypeAny>>(\n name: TableName,\n shape: Shape\n) {\n // Convert fields with proper types\n const convexFields = zodToConvexFields(shape) as ConvexValidatorFromZodFieldsAuto<Shape>\n\n // Create the Table from convex-helpers with explicit type\n const table = Table<ConvexValidatorFromZodFieldsAuto<Shape>, TableName>(name, convexFields)\n\n // Create zDoc schema with system fields\n const zDoc = zodDoc(name, z.object(shape))\n\n // Create docArray helper for return types\n const docArray = z.array(zDoc)\n\n // Attach everything for comprehensive usage\n return Object.assign(table, {\n shape,\n zDoc,\n docArray\n }) as typeof table & {\n shape: Shape\n zDoc: z.ZodObject<\n Shape & {\n _id: ReturnType<typeof zid<TableName>>\n _creationTime: z.ZodNumber\n }\n >\n docArray: z.ZodArray<typeof zDoc>\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zodvex",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Zod <=> Convex integration, supporting Zod 4",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"zod",
|
|
@@ -42,7 +42,8 @@
|
|
|
42
42
|
"lint": "bun x biome check src __tests__",
|
|
43
43
|
"lint:fix": "bun x biome check --write src __tests__",
|
|
44
44
|
"format": "bun x biome format --write src __tests__",
|
|
45
|
-
"
|
|
45
|
+
"prepare": "tsup",
|
|
46
|
+
"prepublishOnly": "bun test && bun run type-check"
|
|
46
47
|
},
|
|
47
48
|
"peerDependencies": {
|
|
48
49
|
"convex": "^1.28.0",
|
|
@@ -13,11 +13,12 @@ export function convertDiscriminatedUnionType(
|
|
|
13
13
|
if (options) {
|
|
14
14
|
const opts = Array.isArray(options) ? options : Array.from(options)
|
|
15
15
|
if (opts.length >= 2) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
// IMPORTANT: Create a new visited set for each union member to prevent false circular
|
|
17
|
+
// reference detection. The same schema can legitimately appear in multiple union branches.
|
|
18
|
+
const convexOptions = opts.map((opt: any) => {
|
|
19
|
+
const branchVisited = new Set(visited)
|
|
20
|
+
return zodToConvexInternal(opt, branchVisited)
|
|
21
|
+
}) as Validator<any, 'required', any>[]
|
|
21
22
|
const [first, second, ...rest] = convexOptions
|
|
22
23
|
return v.union(
|
|
23
24
|
first as Validator<any, 'required', any>,
|
|
@@ -44,9 +45,15 @@ export function convertUnionType(
|
|
|
44
45
|
return zodToConvexInternal(options[0], visited)
|
|
45
46
|
} else {
|
|
46
47
|
// Convert each option recursively
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
// IMPORTANT: Create a new visited set for each union member to prevent false circular
|
|
49
|
+
// reference detection. The same schema can legitimately appear in multiple union branches.
|
|
50
|
+
// However, we do want to preserve the parent visited set to catch actual circular refs
|
|
51
|
+
// that involve the union itself.
|
|
52
|
+
const convexOptions = options.map((opt: any) => {
|
|
53
|
+
// Create a new Set that includes the parent's visited schemas but won't pollute it
|
|
54
|
+
const branchVisited = new Set(visited)
|
|
55
|
+
return zodToConvexInternal(opt, branchVisited)
|
|
56
|
+
}) as Validator<any, 'required', any>[]
|
|
50
57
|
if (convexOptions.length >= 2) {
|
|
51
58
|
const [first, second, ...rest] = convexOptions
|
|
52
59
|
return v.union(
|