zodvex 0.7.2-beta.0 → 0.7.2

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/internal/normalizeCodecPaths.ts","../../../src/internal/stripUndefined.ts","../../../src/internal/boundaryHelpers.ts","../../../src/internal/actionCtx.ts","../../../src/internal/schema/objectShape.ts","../../../src/internal/ids.ts","../../../src/internal/mapping/handlers/enum.ts","../../../src/internal/mapping/handlers/nullable.ts","../../../src/internal/mapping/handlers/record.ts","../../../src/internal/mapping/handlers/union.ts","../../../src/internal/mapping/utils.ts","../../../src/internal/mapping/core.ts","../../../src/internal/meta.ts","../../../src/internal/schema/dateGuards.ts","../../../src/internal/serverUtils.ts","../../../src/internal/shared/object.ts","../../../src/internal/functionContracts.ts","../../../src/internal/custom.ts","../../../src/internal/wrappers.ts","../../../src/internal/builders.ts","../../../src/internal/codec.ts","../../../src/internal/rules.ts","../../../src/internal/db.ts","../../../src/internal/customization.ts","../../../src/internal/init.ts","../../../src/internal/schemaHelpers.ts","../../../src/internal/modelSchemaBundle.ts","../../../src/internal/zx.ts","../../../src/internal/schema.ts","../../../src/legacy/tables.ts"],"names":["codec","zodToConvexInternal","v","metadata","z","registered","doc","id","paginationOpts","NoOp","base","date","nullableOptional","docArray","defineTable"],"mappings":"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","file":"index.js","sourcesContent":["import {\n $ZodArray,\n $ZodCodec,\n $ZodDefault,\n $ZodError,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodType,\n encode\n} from './zod-core'\n\n/**\n * Unwraps ZodOptional/ZodNullable/ZodDefault wrappers to get the structural type.\n */\nfunction unwrapOuter(schema: $ZodType): $ZodType {\n let current: $ZodType = schema\n for (let i = 0; i < 10; i++) {\n if (\n current instanceof $ZodOptional ||\n current instanceof $ZodNullable ||\n current instanceof $ZodDefault\n ) {\n current = current._zod.def.innerType\n continue\n }\n break\n }\n return current\n}\n\n/**\n * Walks a path through a schema tree, truncating at codec boundaries.\n * When a codec is encountered, the path is cut — any deeper segments\n * are wire-internal and should not be exposed to consumers.\n */\nfunction truncateAtCodecBoundary(path: (string | number)[], schema: $ZodType): (string | number)[] {\n const result: (string | number)[] = []\n let current: $ZodType = schema\n\n for (const segment of path) {\n current = unwrapOuter(current)\n\n // If we've landed on a codec, everything from here is wire-internal — stop\n if (current instanceof $ZodCodec) {\n break\n }\n\n // Descend into objects\n if (current instanceof $ZodObject && typeof segment === 'string') {\n const fieldSchema = current._zod.def.shape[segment] as $ZodType | undefined\n if (!fieldSchema) {\n // Unknown field — include segment and stop\n result.push(segment)\n break\n }\n\n result.push(segment)\n\n const unwrapped = unwrapOuter(fieldSchema)\n if (unwrapped instanceof $ZodCodec) {\n // Hit a codec boundary — truncate here\n break\n }\n\n current = fieldSchema\n continue\n }\n\n // Descend into arrays\n if (current instanceof $ZodArray && typeof segment === 'number') {\n result.push(segment)\n current = current._zod.def.element\n continue\n }\n\n // For anything else (unions, records, etc.), include segment and continue\n result.push(segment)\n }\n\n return result\n}\n\n/**\n * Normalizes ZodError paths by truncating at codec boundaries.\n *\n * When z.encode() throws a ZodError, the paths reflect the wire schema\n * structure (e.g., [\"email\", \"value\"] for a custom codec).\n * This function strips the wire-internal segments so consumers see\n * clean field-level paths (e.g., [\"email\"]).\n */\nexport function normalizeCodecPaths(error: $ZodError, schema: $ZodType): $ZodError {\n const normalized = error.issues.map(issue => ({\n ...issue,\n path: truncateAtCodecBoundary(issue.path as (string | number)[], schema)\n }))\n return new $ZodError(normalized)\n}\n\n/**\n * Encodes a value through a Zod schema, normalizing codec-internal\n * path segments in any ZodError before re-throwing.\n *\n * Drop-in replacement for `z.encode(schema, value)` at client boundaries.\n */\nexport function safeEncode(schema: $ZodType, value: unknown): unknown {\n try {\n return encode(schema, value)\n } catch (e) {\n if (e instanceof $ZodError) throw normalizeCodecPaths(e as $ZodError, schema)\n throw e\n }\n}\n","/**\n * Recursively strips `undefined` values from objects and arrays.\n * Used by codec encode/decode to clean wire data.\n *\n * Extracted to its own module so client-safe code (boundaryHelpers)\n * can import it without pulling in zod via utils.ts.\n */\nexport function stripUndefined<T>(value: T): T {\n if (value === null || value === undefined) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map(stripUndefined) as T\n }\n\n // Only process plain objects (not class instances, Dates, etc.)\n if (typeof value === 'object' && value.constructor === Object) {\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n if (val !== undefined) {\n result[key] = stripUndefined(val)\n }\n }\n return result as T\n }\n\n return value\n}\n","import type { FunctionReference } from 'convex/server'\nimport type { $ZodIssue } from 'zod/v4/core'\nimport { safeEncode } from './normalizeCodecPaths'\nimport { stripUndefined } from './stripUndefined'\nimport type { AnyRegistry } from './types'\nimport { $ZodError, safeParse } from './zod-core'\n\n/**\n * Resolves a Convex FunctionReference to its string path.\n *\n * Mirrors `getFunctionName` from `convex/server` but without the server import.\n * Reads the well-known `Symbol.for('functionName')` that Convex attaches to all\n * function references — the same symbol used by Convex's own browser client.\n */\nconst functionNameSymbol = Symbol.for('functionName')\n\nfunction resolveFunctionPath(ref: FunctionReference<any, any, any, any>): string {\n if (typeof ref === 'string') return ref\n const name = (ref as any)[functionNameSymbol]\n if (!name) {\n throw new Error(\n `Expected a Convex function reference (e.g. api.file.func), but received ${JSON.stringify(ref)}`\n )\n }\n return name\n}\n\n/**\n * Options for codec helper behavior.\n */\nexport type BoundaryHelpersOptions = {\n /**\n * How to handle decode failures (schema validation errors on wire data).\n *\n * - `'warn'` (default): log a console.warn and return raw wire data untransformed.\n * - `'throw'`: throw a ZodvexDecodeError (extends z.ZodError). // zod-ok\n */\n onDecodeError?: 'warn' | 'throw'\n}\n\n/**\n * Decode error with function path and wire data context.\n * Extends $ZodError from zod/v4/core for compatibility with both zod and zod/mini.\n * instanceof $ZodError checks work in both variants.\n */\nexport class ZodvexDecodeError extends $ZodError {\n readonly functionPath: string\n readonly wireData: unknown\n\n constructor(functionPath: string, issues: $ZodIssue[], wireData: unknown) {\n super(issues)\n this.functionPath = functionPath\n this.wireData = wireData\n this.name = 'ZodvexDecodeError'\n }\n}\n\n/**\n * Creates shared encode/decode helpers bound to a zodvex registry.\n *\n * These are the core primitives used by all codec boundary implementations:\n * - `encodeArgs`: runtime types -> wire format (e.g., Date -> timestamp number)\n * - `decodeResult`: wire format -> runtime types (e.g., timestamp number -> Date)\n *\n * Both look up the function reference in the registry to find the appropriate\n * Zod schema, then apply the codec transform. Functions not in the registry\n * (or without the relevant schema) pass through unchanged.\n *\n * @param registry - A map of function paths to `{ args?, returns? }` Zod schemas.\n * Typically generated by zodvex codegen into `_zodvex/api.ts`.\n * @param options - Optional configuration for decode error behavior.\n */\nexport function createBoundaryHelpers(registry: AnyRegistry, options?: BoundaryHelpersOptions) {\n const onDecodeError = options?.onDecodeError ?? 'warn'\n const warnedPaths = new Set<string>()\n\n /**\n * Encode args from runtime types to wire format.\n *\n * Uses `safeEncode` (not raw `z.encode`) to normalize codec-internal\n * error paths in ZodErrors, then strips undefined values for Convex\n * serialization compatibility.\n *\n * Passthrough when:\n * - args is null/undefined\n * - function is not in the registry\n * - registry entry has no args schema\n */\n function encodeArgs(ref: FunctionReference<any, any, any, any>, args: any): any {\n if (args == null) return args\n const path = resolveFunctionPath(ref)\n const entry = registry[path]\n if (!entry?.args) {\n if (entry === undefined && !warnedPaths.has(path)) {\n warnedPaths.add(path)\n console.debug(\n `[zodvex] No registry entry for \"${path}\" — args will not be codec-encoded. ` +\n 'If this function uses zodvex wrappers, run `zodvex generate` to update the registry.'\n )\n }\n return args\n }\n return stripUndefined(safeEncode(entry.args, args))\n }\n\n /**\n * Decode a wire result back to runtime types.\n *\n * Uses `.safeParse()` to decode. On failure:\n * - 'warn' (default): logs warning, returns raw wireResult\n * - 'throw': throws ZodvexDecodeError (extends z.ZodError) // zod-ok\n *\n * Passthrough when:\n * - function is not in the registry\n * - registry entry has no returns schema\n */\n function decodeResult(ref: FunctionReference<any, any, any, any>, wireResult: any): any {\n const path = resolveFunctionPath(ref)\n const entry = registry[path]\n if (!entry?.returns) return wireResult\n\n const result = safeParse(entry.returns, wireResult)\n if (result.success) return result.data\n\n if (onDecodeError === 'throw') {\n throw new ZodvexDecodeError(path, result.error.issues, wireResult)\n }\n\n // Default: warn and return raw wire data\n const preview = JSON.stringify(wireResult)\n const truncated = preview.length > 200 ? `${preview.slice(0, 200)}...` : preview\n console.warn(\n `[zodvex] Decode failed for ${path}: ${result.error.issues.map((i: $ZodIssue) => `${i.path.join('.')}: ${i.message}`).join(', ')}. Returning raw wire data. Preview: ${truncated}`\n )\n return wireResult\n }\n\n return { encodeArgs, decodeResult }\n}\n\nexport type BoundaryHelpers = ReturnType<typeof createBoundaryHelpers>\n","import type { GenericActionCtx, GenericDataModel } from 'convex/server'\nimport type { BoundaryHelpersOptions } from './boundaryHelpers'\nimport { createBoundaryHelpers } from './boundaryHelpers'\nimport type { AnyRegistry } from './types'\n\n/**\n * Wraps an action context's runQuery/runMutation with automatic\n * codec transforms via the zodvex registry.\n *\n * - Args are encoded (runtime -> wire) before calling the inner function\n * - Results are decoded (wire -> runtime) before returning to the handler\n * - Functions not in the registry pass through unchanged\n *\n * @internal Used by initZodvex when registry option is provided.\n */\nexport function createZodvexActionCtx<DM extends GenericDataModel>(\n registry: AnyRegistry,\n ctx: GenericActionCtx<DM>,\n options?: BoundaryHelpersOptions\n): GenericActionCtx<DM> {\n const codec = createBoundaryHelpers(registry, options)\n\n return {\n ...ctx,\n runQuery: async (ref: any, ...restArgs: any[]) => {\n const wireArgs = codec.encodeArgs(ref, restArgs[0])\n const wireResult = await ctx.runQuery(ref, wireArgs)\n return codec.decodeResult(ref, wireResult)\n },\n runMutation: async (ref: any, ...restArgs: any[]) => {\n const wireArgs = codec.encodeArgs(ref, restArgs[0])\n const wireResult = await ctx.runMutation(ref, wireArgs)\n return codec.decodeResult(ref, wireResult)\n }\n } as GenericActionCtx<DM>\n}\n","import { $ZodObject } from '../zod-core'\n\nexport function getObjectShape(obj: any): Record<string, any> {\n if (obj instanceof $ZodObject) {\n return obj._zod.def.shape as Record<string, any>\n }\n if (obj && typeof obj === 'object' && typeof obj.shape === 'object') {\n return obj.shape as Record<string, any>\n }\n return {}\n}\n","/**\n * IDs + registry for Convex + Zod v4\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\nimport type { $ZodType } from './zod-core'\n\n// Simple registry for metadata\nconst metadata = new WeakMap<$ZodType, any>()\n\nexport const registryHelpers = {\n getMetadata: (type: $ZodType) => metadata.get(type),\n setMetadata: (type: $ZodType, meta: any) => metadata.set(type, meta)\n}\n\n/**\n * Create a Zod validator for a Convex Id\n *\n * Compatible with AI SDK and other tools that don't support transforms.\n * Uses type-level branding instead of runtime transforms for GenericId<T> compatibility.\n *\n * @deprecated Use `zx.id()` instead for consistent naming with other zodvex helpers.\n * ```typescript\n * import { zx } from 'zodvex'\n * zx.id('users') // instead of zid('users')\n * ```\n *\n * @param tableName - The Convex table name for this ID\n * @returns A Zod string validator typed as GenericId<TableName>\n */\nexport function zid<TableName extends string>(\n tableName: TableName\n): $ZodType<GenericId<TableName>> & { _tableName: TableName } {\n // Create base string validator with refinement (no transform or brand)\n const baseSchema = z.string().check(\n z.refine(val => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n }),\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 z.describe(`convexId:${tableName}`)\n )\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 // Type assertion provides GenericId<TableName> typing without runtime transform\n // This maintains type safety while being compatible with AI SDK and similar tools\n return branded as $ZodType<GenericId<TableName>> & { _tableName: TableName }\n}\n\nexport type Zid<TableName extends string> = ReturnType<typeof zid<TableName>>\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { $ZodEnum, type $ZodType } from '../../zod-core'\n\n// Helper: Convert Zod enum types to Convex validators\nexport function convertEnumType(actualValidator: $ZodEnum): GenericValidator {\n const entries = actualValidator._zod.def.entries\n const options = Object.keys(entries)\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 { $ZodNullable, $ZodOptional, $ZodType } from '../../zod-core'\n\n// Helper: Convert Zod nullable types to Convex validators\nexport function convertNullableType(\n actualValidator: $ZodNullable,\n visited: Set<$ZodType>,\n zodToConvexInternal: (schema: $ZodType, visited: Set<$ZodType>) => any\n): { validator: GenericValidator; isOptional: boolean } {\n const innerSchema = actualValidator._zod.def.innerType\n if (innerSchema && innerSchema instanceof $ZodType) {\n // Check if the inner schema is optional\n if (innerSchema instanceof $ZodOptional) {\n // For nullable(optional(T)), we want optional(union(T, null))\n const innerInnerSchema = innerSchema._zod.def.innerType\n const innerInnerValidator = zodToConvexInternal(innerInnerSchema, 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 { $ZodDefault, $ZodOptional, $ZodRecord, $ZodType } from '../../zod-core'\n\n// Helper: Convert Zod record types to Convex validators\nexport function convertRecordType(\n actualValidator: $ZodRecord,\n visited: Set<$ZodType>,\n zodToConvexInternal: (schema: $ZodType, visited: Set<$ZodType>) => any\n): GenericValidator {\n // $ZodRecord._zod.def has keyType and valueType\n let valueType: $ZodType | undefined = actualValidator._zod.def.valueType\n\n // If valueType is undefined, fall back to keyType (single-argument z.record() form)\n if (!valueType) {\n valueType = actualValidator._zod.def.keyType\n }\n\n if (valueType && valueType instanceof $ZodType) {\n // First check if the Zod value type is optional before conversion\n const isZodOptional =\n valueType instanceof $ZodOptional ||\n valueType instanceof $ZodDefault ||\n (valueType instanceof $ZodDefault && valueType._zod.def.innerType instanceof $ZodOptional)\n\n if (isZodOptional) {\n // For optional record values, we need to handle this specially\n let innerType: any\n let recordDefaultValue: any = undefined\n let recordHasDefault = false\n\n if (valueType instanceof $ZodDefault) {\n // Handle ZodDefault wrapper\n recordHasDefault = true\n recordDefaultValue = valueType._zod.def.defaultValue\n const innerFromDefault = valueType._zod.def.innerType\n if (innerFromDefault instanceof $ZodOptional) {\n innerType = innerFromDefault._zod.def.innerType\n } else {\n innerType = innerFromDefault\n }\n } else if (valueType instanceof $ZodOptional) {\n // Direct ZodOptional\n innerType = valueType._zod.def.innerType\n } else {\n // Shouldn't happen based on isZodOptional check\n innerType = valueType\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 { $ZodDiscriminatedUnion, type $ZodType, $ZodUnion } from '../../zod-core'\n\n// Helper: Convert Zod discriminated union types to Convex validators\nexport function convertDiscriminatedUnionType(\n actualValidator: $ZodType,\n visited: Set<$ZodType>,\n zodToConvexInternal: (schema: $ZodType, visited: Set<$ZodType>) => any\n): GenericValidator {\n const options =\n actualValidator instanceof $ZodDiscriminatedUnion\n ? actualValidator._zod.def.options\n : // cast: fallback for non-standard discriminated union variants\n (actualValidator as any)._zod?.def?.options\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: $ZodUnion,\n visited: Set<$ZodType>,\n zodToConvexInternal: (schema: $ZodType, visited: Set<$ZodType>) => any\n): GenericValidator {\n const options = actualValidator._zod.def.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 { registryHelpers, type Zid } from '../ids'\nimport { getObjectShape } from '../schema/objectShape'\nimport { $ZodType } from '../zod-core'\n\n// Helper to check if a schema is a Zid\nexport function isZid<T extends string>(schema: $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 { getObjectShape }\n","import type { GenericValidator, PropertyValidators } from 'convex/values'\nimport { v } from 'convex/values'\nimport { registryHelpers } from '../ids'\nimport {\n $ZodArray,\n $ZodCodec,\n $ZodDefault,\n $ZodEnum,\n $ZodLazy,\n $ZodLiteral,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodRecord,\n type $ZodShape,\n $ZodTuple,\n $ZodType,\n $ZodUnion\n} from '../zod-core'\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 { isZid } from './utils'\n\n// Module-scoped cache: same Zod schema instance → same Convex validator.\n// Avoids redundant allocations when the same schema is converted across\n// multiple function registrations or table definitions.\nconst convexValidatorCache = new WeakMap<$ZodType, GenericValidator>()\n\n// Internal conversion function using ZodType with def.type detection\nfunction zodToConvexInternal<Z extends $ZodType>(\n zodValidator: Z,\n visited: Set<$ZodType> = 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 // Return cached result if this exact Zod instance was already converted\n const cached = convexValidatorCache.get(zodValidator)\n if (cached) {\n return cached 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 if (zodValidator instanceof $ZodDefault) {\n hasDefault = true\n defaultValue = zodValidator._zod.def.defaultValue\n actualValidator = zodValidator._zod.def.innerType as Z\n }\n\n // Check for optional (may be wrapped inside ZodDefault)\n if (actualValidator instanceof $ZodOptional) {\n isOptional = true\n actualValidator = actualValidator._zod.def.innerType as Z\n\n // If the unwrapped type is ZodDefault, handle it here\n if (actualValidator instanceof $ZodDefault) {\n hasDefault = true\n defaultValue = actualValidator._zod.def.defaultValue\n actualValidator = actualValidator._zod.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 // cast: switch handles more defType values than $ZodTypeDef types (e.g. discriminatedUnion)\n const defType = actualValidator._zod.def.type as string\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 // LEGACY: Maps z.date() to v.float64() for backwards compatibility in type inference.\n // However, z.date() does NOT work at runtime because:\n // 1. z.date() produces Date objects, not numbers\n // 2. Convex rejects Date objects as non-serializable\n // 3. z.encode() on z.date() returns a Date, not a timestamp\n // Use zx.date() instead, which provides proper Date ↔ timestamp codec.\n // The wrappers and convexCodec will throw if z.date() is used.\n convexValidator = v.float64()\n break\n case 'null':\n convexValidator = v.null()\n break\n case 'nan':\n convexValidator = v.float64()\n break\n case 'array': {\n if (actualValidator instanceof $ZodArray) {\n const element = actualValidator._zod.def.element\n convexValidator = v.array(zodToConvexInternal(element, visited))\n } else {\n convexValidator = v.array(v.any())\n }\n break\n }\n case 'object': {\n if (actualValidator instanceof $ZodObject) {\n const shape = actualValidator._zod.def.shape\n const convexShape: PropertyValidators = {}\n for (const [key, value] of Object.entries(shape)) {\n if (value && value instanceof $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 $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,\n visited,\n zodToConvexInternal\n )\n break\n }\n case 'literal': {\n if (actualValidator instanceof $ZodLiteral) {\n const literalValues = actualValidator._zod.def.values\n const firstValue = literalValues.values().next().value\n if (firstValue !== undefined && firstValue !== null) {\n convexValidator = v.literal(firstValue)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'enum': {\n if (actualValidator instanceof $ZodEnum) {\n convexValidator = convertEnumType(actualValidator)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'record': {\n if (actualValidator instanceof $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 native Zod v4 codec first (z.codec())\n // Codecs have def.type='pipe' but are specifically for bidirectional transforms\n // Use the input schema (wire format) for Convex validation\n if (actualValidator instanceof $ZodCodec) {\n const inputSchema = actualValidator._zod.def.in\n if (inputSchema && inputSchema instanceof $ZodType) {\n convexValidator = zodToConvexInternal(inputSchema, visited)\n } else {\n convexValidator = v.any()\n }\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 // Non-codec transform - extract input schema but warn\n // cast: no instanceof guard available for generic pipe/transform\n const inputSchema = (actualValidator as any)._zod?.def?.in\n if (inputSchema && inputSchema instanceof $ZodType) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n '[zodvex] z.transform() detected. Using input schema for Convex validation.\\n' +\n 'Transforms are unidirectional - they work for parsing but not encoding.\\n' +\n 'For bidirectional transforms, use zx.codec() instead.'\n )\n }\n convexValidator = zodToConvexInternal(inputSchema, visited)\n } else {\n convexValidator = v.any()\n }\n }\n }\n break\n }\n case 'nullable': {\n if (actualValidator instanceof $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 $ZodTuple) {\n const items = actualValidator._zod.def.items\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 $ZodLazy) {\n try {\n const getter = actualValidator._zod.def.getter\n if (getter) {\n const resolvedSchema = getter()\n if (resolvedSchema && resolvedSchema instanceof $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 case 'optional': {\n // Fallback for optional types that weren't caught by the instanceof check above.\n // cast: no instanceof guard — this handles edge cases where defType='optional'\n // but the schema isn't a $ZodOptional instance (e.g. pipes wrapped with .optional())\n const innerType = (actualValidator as any)._zod?.def?.innerType\n if (innerType && innerType instanceof $ZodType) {\n convexValidator = zodToConvexInternal(innerType, visited)\n isOptional = true\n } else {\n convexValidator = v.any()\n isOptional = true\n }\n break\n }\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 // Cache the result so the same Zod instance returns the same Convex validator\n convexValidatorCache.set(zodValidator, finalValidator)\n\n return finalValidator as ConvexValidatorFromZod<Z, 'required'>\n}\n\nexport function zodToConvex<Z extends $ZodType | ZodValidator>(\n zod: Z\n): Z extends $ZodType\n ? ConvexValidatorFromZod<Z, 'required'>\n : Z extends ZodValidator\n ? ConvexValidatorFromZodFieldsAuto<Z>\n : never {\n if (typeof zod === 'object' && zod !== null && !(zod instanceof $ZodType)) {\n return zodToConvexFields(zod as ZodValidator) as any\n }\n\n return zodToConvexInternal(zod as $ZodType) as any\n}\n\nexport function zodToConvexFields<Z extends $ZodShape>(\n zod: Z\n): ConvexValidatorFromZodFieldsAuto<Z> {\n // If it's a ZodObject, extract the shape\n const fields = zod instanceof $ZodObject ? zod._zod.def.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 $ZodType)\n }\n\n return result as ConvexValidatorFromZodFieldsAuto<Z>\n}\n","import type { $ZodType } from './zod-core'\n\nconst META_KEY = '__zodvexMeta'\n\nexport type ZodvexFunctionMeta = {\n type: 'function'\n zodArgs?: $ZodType\n zodReturns?: $ZodType\n}\n\nexport type ZodvexModelDefinitionSource = 'shape' | 'schema'\n\nexport type ZodvexModelMeta = {\n type: 'model'\n tableName: string\n definitionSource?: ZodvexModelDefinitionSource\n schemas?: {\n doc: $ZodType\n insert: $ZodType\n update: $ZodType\n docArray: $ZodType\n paginatedDoc: $ZodType\n }\n}\n\nexport type ZodvexMeta = ZodvexFunctionMeta | ZodvexModelMeta\n\nexport function attachMeta(target: object, meta: ZodvexMeta): void {\n Object.defineProperty(target, META_KEY, {\n value: meta,\n enumerable: false,\n writable: false,\n configurable: false\n })\n}\n\nexport function readMeta(target: unknown): ZodvexMeta | undefined {\n if (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n return undefined\n }\n return (target as Record<string, unknown>)[META_KEY] as ZodvexMeta | undefined\n}\n","import { z } from 'zod'\nimport {\n $ZodArray,\n $ZodCodec,\n $ZodDate,\n $ZodDefault,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodRecord,\n $ZodTuple,\n $ZodType,\n $ZodUnion\n} from '../zod-core'\n\n/**\n * @deprecated Use `zx.date()` instead for automatic Date ↔ timestamp conversion.\n */\nexport function mapDateFieldToNumber(field: $ZodType): $ZodType {\n if (field instanceof $ZodDate) {\n return z.number()\n }\n if (field instanceof $ZodOptional && field._zod.def.innerType instanceof $ZodDate) {\n return z.optional(z.number())\n }\n if (field instanceof $ZodNullable && field._zod.def.innerType instanceof $ZodDate) {\n return z.nullable(z.number())\n }\n if (field instanceof $ZodDefault) {\n const inner = field._zod.def.innerType\n if (inner instanceof $ZodDate) {\n return z.optional(z.number())\n }\n }\n return field\n}\n\nfunction containsNativeZodDate(schema: $ZodType): boolean {\n if (schema instanceof $ZodDate) return true\n if (schema instanceof $ZodCodec) return false\n\n if (\n schema instanceof $ZodOptional ||\n schema instanceof $ZodNullable ||\n schema instanceof $ZodDefault\n ) {\n return containsNativeZodDate(schema._zod.def.innerType)\n }\n\n if (schema instanceof $ZodObject) {\n return Object.values(schema._zod.def.shape).some(field => containsNativeZodDate(field))\n }\n if (schema instanceof $ZodArray) {\n return containsNativeZodDate(schema._zod.def.element)\n }\n if (schema instanceof $ZodUnion) {\n return schema._zod.def.options.some(opt => containsNativeZodDate(opt))\n }\n if (schema instanceof $ZodRecord) {\n return containsNativeZodDate(schema._zod.def.valueType)\n }\n if (schema instanceof $ZodTuple) {\n const items = schema._zod.def.items\n return items ? items.some(item => containsNativeZodDate(item)) : false\n }\n\n return false\n}\n\nexport function assertNoNativeZodDate(\n schema: $ZodType,\n context: 'args' | 'returns' | 'schema'\n): void {\n if (containsNativeZodDate(schema)) {\n throw new Error(\n `[zodvex] Native z.date() found in ${context}. ` +\n `Convex stores dates as timestamps (numbers), which z.date() cannot parse.\\n\\n` +\n `Fix: Replace z.date() with zx.date()\\n\\n` +\n `Before: { createdAt: z.date() }\\n` +\n `After: { createdAt: zx.date() }\\n\\n` +\n `zx.date() is a codec that handles timestamp ↔ Date conversion automatically.`\n )\n }\n}\n","/**\n * Server-only utilities — imports ConvexError from convex/values.\n * Do NOT re-export from core/index.ts or any client-safe barrel.\n */\nimport { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { $ZodError, $ZodType, encode, parse } from './zod-core'\n\n// Format ZodError issues into a compact, consistent structure\nexport function formatZodIssues(\n error: z.ZodError, // zod-ok\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 $ZodError) {\n throw new ConvexError(formatZodIssues(e as z.ZodError, context)) // zod-ok\n }\n throw e\n}\n\n/**\n * Validates a return value against a Zod schema, supporting both codecs and regular schemas.\n *\n * Tries z.encode() first (for codec support), then falls back to .parse() if the schema\n * contains unidirectional transforms (which don't support encoding).\n *\n * For codecs: returns the encoded wire format (z.input<T>)\n * For transforms: returns the transformed output (z.output<T>)\n * For plain schemas: returns the validated value\n *\n * @param schema - The Zod schema to validate against\n * @param value - The value to validate\n * @returns The validated/encoded value\n * @throws Calls handleZodValidationError on validation failure\n */\nexport function validateReturns(schema: $ZodType, value: unknown): unknown {\n try {\n // Try encode first - works for codecs and plain schemas\n return encode(schema, value)\n } catch (e: any) {\n // If it's a unidirectional transform error, fall back to parse\n if (e?.message?.includes('unidirectional transform')) {\n try {\n return parse(schema, value)\n } catch (parseError) {\n handleZodValidationError(parseError, 'returns')\n }\n }\n // For any other error, handle it normally\n handleZodValidationError(e, 'returns')\n }\n // TypeScript can't infer that handleZodValidationError always throws\n throw new Error('Unreachable')\n}\n","export 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","import { z } from 'zod'\nimport { getObjectShape, type ZodValidator, zodToConvex, zodToConvexFields } from './mapping'\nimport { attachMeta } from './meta'\nimport { assertNoNativeZodDate } from './schema/dateGuards'\nimport { handleZodValidationError, validateReturns } from './serverUtils'\nimport { pick } from './shared/object'\nimport { stripUndefined } from './stripUndefined'\nimport {\n $ZodCustom,\n $ZodDefault,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodType,\n $ZodUnion,\n safeParse,\n parse as zodParse\n} from './zod-core'\n\nexport type FunctionSchemaInput = $ZodType | Record<string, $ZodType> | undefined\nexport type DirectFunctionInput = $ZodType | Record<string, $ZodType>\n\nexport type CustomInputResult = {\n ctx?: Record<string, unknown>\n args?: Record<string, unknown>\n onSuccess?: (params: { ctx: unknown; args: unknown; result: unknown }) => unknown\n}\n\nexport function normalizeFunctionSchema(input: FunctionSchemaInput): $ZodType | undefined {\n if (!input) return undefined\n return input instanceof $ZodType ? input : z.object(input)\n}\n\nfunction normalizeFunctionMetaArgs(input: FunctionSchemaInput): z.ZodObject<any> | undefined {\n if (!input) return undefined\n if (input instanceof $ZodObject) {\n return input as unknown as z.ZodObject<any> // zod-ok\n }\n if (input instanceof $ZodType) {\n return undefined\n }\n return z.object(input)\n}\n\nexport function attachFunctionMeta(\n target: object,\n args: FunctionSchemaInput,\n returns: FunctionSchemaInput\n): void {\n attachMeta(target, {\n type: 'function',\n zodArgs: normalizeFunctionMetaArgs(args),\n zodReturns: normalizeFunctionSchema(returns)\n })\n}\n\n// Cache to avoid re-checking the same schema\nconst customCheckCache = new WeakMap<$ZodType, boolean>()\n\nfunction containsCustom(schema: $ZodType, maxDepth = 50, currentDepth = 0): boolean {\n const cached = customCheckCache.get(schema)\n if (cached !== undefined) {\n return cached\n }\n\n if (currentDepth > maxDepth) {\n return false\n }\n\n let result = false\n if (schema instanceof $ZodCustom) {\n result = true\n } else if (schema instanceof $ZodUnion) {\n result = schema._zod.def.options.some(opt => containsCustom(opt, maxDepth, currentDepth + 1))\n } else if (schema instanceof $ZodOptional) {\n result = containsCustom(schema._zod.def.innerType, maxDepth, currentDepth + 1)\n } else if (schema instanceof $ZodNullable) {\n result = containsCustom(schema._zod.def.innerType, maxDepth, currentDepth + 1)\n } else if (schema instanceof $ZodDefault) {\n result = containsCustom(schema._zod.def.innerType, maxDepth, currentDepth + 1)\n }\n\n customCheckCache.set(schema, result)\n return result\n}\n\nexport function normalizeDirectFunctionInput(input: DirectFunctionInput): {\n zodSchema: $ZodType\n convexArgs: Record<string, any>\n} {\n if (input instanceof $ZodObject) {\n return {\n zodSchema: input,\n convexArgs: zodToConvexFields(getObjectShape(input))\n }\n }\n\n if (input instanceof $ZodType) {\n return {\n zodSchema: z.object({ value: input as any }),\n convexArgs: { value: zodToConvex(input as any) }\n }\n }\n\n return {\n zodSchema: z.object(input),\n convexArgs: zodToConvexFields(input)\n }\n}\n\nexport function normalizeCustomArgsValidator(args: ZodValidator | $ZodObject): {\n argsValidator: ZodValidator\n argsSchema: $ZodObject\n} {\n if (args instanceof $ZodType) {\n if (args instanceof $ZodObject) {\n return {\n argsSchema: args as unknown as $ZodObject,\n argsValidator: args._zod.def.shape as any\n }\n }\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\n return {\n argsValidator: args,\n argsSchema: z.object(args)\n }\n}\n\nexport function createConvexReturnsValidator(\n schema?: $ZodType,\n options?: { skipCustomSchemas?: boolean; skipConvexValidation?: boolean }\n): any {\n if (!schema || options?.skipConvexValidation) {\n return undefined\n }\n if (options?.skipCustomSchemas && containsCustom(schema)) {\n return undefined\n }\n return zodToConvex(schema)\n}\n\nexport function assertFunctionSchemas(argsSchema: $ZodType, returnsSchema?: $ZodType): void {\n assertNoNativeZodDate(argsSchema, 'args')\n if (returnsSchema) {\n assertNoNativeZodDate(returnsSchema, 'returns')\n }\n}\n\nexport function parseFunctionArgsOrThrow(zodSchema: $ZodType, argsObject: unknown): any {\n try {\n return zodParse(zodSchema, argsObject) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n}\n\nexport function parseObjectArgsOrThrow(\n argsSchema: $ZodObject,\n rawArgs: Record<string, unknown>\n): Record<string, unknown> {\n const parsed = safeParse(argsSchema, rawArgs)\n if (!parsed.success) {\n handleZodValidationError(parsed.error, 'args')\n }\n return parsed.data as Record<string, unknown>\n}\n\nexport async function runCustomizationInput(\n customInput: (ctx: unknown, args: unknown, extra?: unknown) => unknown,\n ctx: unknown,\n allArgs: Record<string, unknown>,\n inputArgs: Record<string, unknown>,\n extra: Record<string, unknown>\n): Promise<CustomInputResult | undefined> {\n return (await customInput(\n ctx,\n // Cast justification: customInput expects ObjectType<CustomArgsValidator>, but pick()\n // returns Partial<T>. The cast is safe because inputArgs keys are derived from\n // CustomArgsValidator at the type level.\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )) as CustomInputResult | undefined\n}\n\nexport function applyCustomizationResult(\n ctx: Record<string, unknown>,\n baseArgs: Record<string, unknown>,\n added?: CustomInputResult\n): { finalCtx: Record<string, unknown>; finalArgs: Record<string, unknown> } {\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const addedArgs = added?.args ?? {}\n return {\n finalCtx,\n finalArgs: { ...baseArgs, ...addedArgs }\n }\n}\n\nexport async function finalizeFunctionReturn(\n result: unknown,\n options?: {\n ctx?: Record<string, unknown>\n args?: Record<string, unknown>\n added?: CustomInputResult\n returns?: $ZodType\n }\n): Promise<unknown> {\n if (options?.added?.onSuccess) {\n await options.added.onSuccess({\n ctx: options.ctx,\n args: options.args,\n result\n })\n }\n\n if (options?.returns) {\n const validated = validateReturns(options.returns, result)\n return stripUndefined(validated)\n }\n\n return stripUndefined(result)\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 { type PropertyValidators } from 'convex/values'\nimport { type Customization, NoOp } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport {\n applyCustomizationResult,\n attachFunctionMeta,\n createConvexReturnsValidator,\n finalizeFunctionReturn,\n normalizeCustomArgsValidator,\n normalizeFunctionSchema,\n parseObjectArgsOrThrow,\n runCustomizationInput\n} from './functionContracts'\nimport { type ZodValidator, zodToConvexFields } from './mapping'\nimport { assertNoNativeZodDate } from './schema/dateGuards'\nimport { pick } from './shared/object'\nimport type { ExtractCtx, ExtractVisibility, Overwrite } from './types'\nimport { $ZodObject, $ZodType } from './zod-core'\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\n// Uses z.output since the handler produces the internal representation (e.g., Date),\n// which is then encoded to wire format (e.g., string) before sending to the client\ntype ReturnValueInput<ReturnsValidator extends $ZodType | ZodValidator | void> = [\n ReturnsValidator\n] extends [$ZodType]\n ? Returns<z.output<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.output<$ZodObject<ReturnsValidator>>>\n : any\n\n// The return value after it's been validated: returned to the client\ntype ReturnValueOutput<ReturnsValidator extends $ZodType | ZodValidator | void> = [\n ReturnsValidator\n] extends [$ZodType]\n ? Returns<z.output<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.output<$ZodObject<ReturnsValidator>>>\n : any\n\n// The args as seen by the caller: runtime types (z.output), not wire types (z.input).\n// For codecs (e.g., custom field types), z.output = runtime class, z.input = wire object.\n// Callers pass runtime types; encoding to wire format happens inside the wrapper.\ntype ArgsInput<ArgsValidator extends ZodValidator | $ZodObject | void> = [ArgsValidator] extends [\n $ZodObject\n]\n ? [z.output<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.output<$ZodObject<ArgsValidator>>]\n : OneArgArray\n\n// The args after they've been validated: passed to the handler\ntype ArgsOutput<ArgsValidator extends ZodValidator | $ZodObject | void> = [ArgsValidator] extends [\n $ZodObject\n]\n ? [z.output<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.output<$ZodObject<ArgsValidator>>]\n : OneArgArray\n\n// Re-export for backwards compatibility (canonical definition in types.ts)\nexport type { Overwrite } from './types'\n\n// Hack to simplify how TypeScript renders object types\ntype Expand<ObjectType extends Record<any, any>> =\n 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> =\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 | $ZodObject | void,\n ReturnsZodValidator extends $ZodType | 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 const skipConvexValidation = fn.skipConvexValidation ?? false\n\n const returns = normalizeFunctionSchema(maybeObject)\n const returnValidator = createConvexReturnsValidator(returns, { skipConvexValidation })\n const convexReturns = returnValidator ? { returns: returnValidator } : undefined\n\n // Check for z.date() usage at construction time (once), not on every invocation\n if (returns) {\n assertNoNativeZodDate(returns as $ZodType, 'returns')\n }\n\n if (args) {\n const { argsValidator, argsSchema } = normalizeCustomArgsValidator(args)\n\n // Only generate Convex args validator when not skipping Convex validation\n const convexArgs = skipConvexValidation\n ? inputArgs\n : { ...zodToConvexFields(argsValidator), ...inputArgs }\n\n // Check for z.date() usage at construction time (once), not on every invocation\n assertNoNativeZodDate(argsSchema, 'args')\n\n const registered = builder({\n args: convexArgs,\n ...convexReturns,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added = await runCustomizationInput(\n customInput as any,\n ctx,\n allArgs,\n inputArgs,\n extra\n )\n const argKeys = Object.keys(argsValidator)\n const rawArgs = pick(allArgs, argKeys)\n const baseArgs = parseObjectArgsOrThrow(argsSchema, rawArgs)\n const { finalCtx, finalArgs } = applyCustomizationResult(ctx as any, baseArgs, added)\n\n const ret = await handler(finalCtx, finalArgs)\n return finalizeFunctionReturn(ret, { ctx: ctx as any, args: baseArgs, added, returns })\n }\n })\n attachFunctionMeta(registered, argsSchema, returns)\n return registered\n }\n const registered = builder({\n args: inputArgs,\n ...convexReturns,\n handler: async (ctx: Ctx, allArgs: any) => {\n const baseArgs = allArgs as Record<string, unknown>\n const added = await runCustomizationInput(\n customInput as any,\n ctx,\n allArgs,\n inputArgs,\n extra\n )\n const { finalCtx, finalArgs } = applyCustomizationResult(ctx as any, baseArgs, added)\n\n const ret = await handler(finalCtx, finalArgs)\n return finalizeFunctionReturn(ret, { ctx: ctx as any, args: baseArgs, added, returns })\n }\n })\n attachFunctionMeta(registered, undefined, returns)\n return registered\n }\n}\n\nfunction createCustomBuilderEntrypoint<\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<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n builder as any,\n customization as any\n ) as any\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 // Cast justification: This is the TypeScript overload implementation pattern. The function\n // has two overloads (with/without DataModel constraint) that provide precise types to callers.\n // The implementation must satisfy both overloads, which requires a broader signature.\n // The 'as any' casts allow the implementation to delegate to customFnBuilder without\n // TypeScript complaining about the generic parameter differences between overloads.\n // This is type-safe because: (1) callers only see the overload signatures which are strict,\n // (2) the runtime behavior is identical regardless of which overload matched.\n // TODO: Consider using a conditional type or branded types to create a single signature\n // that satisfies both overloads without casts. Alternatively, accept this as idiomatic\n // TypeScript for overloaded functions and keep the casts.\n return createCustomBuilderEntrypoint(query, customization)\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 // Cast justification: Same overload implementation pattern as zCustomQuery.\n // See detailed comment there. Type safety is enforced by the overload signature above.\n return createCustomBuilderEntrypoint(mutation, customization)\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 // Cast justification: Same overload implementation pattern as zCustomQuery.\n // See detailed comment there. Type safety is enforced by the overload signature above.\n return createCustomBuilderEntrypoint(action, customization)\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport {\n assertFunctionSchemas,\n createConvexReturnsValidator,\n type DirectFunctionInput,\n finalizeFunctionReturn,\n normalizeDirectFunctionInput,\n parseFunctionArgsOrThrow\n} from './functionContracts'\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 { $ZodType } from './zod-core'\n\nfunction registerZodFunction<\n Builder extends (fn: any) => any,\n A extends DirectFunctionInput,\n R extends $ZodType | undefined\n>(\n builder: 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): any {\n const { zodSchema, convexArgs } = normalizeDirectFunctionInput(input)\n const returnsSchema = options?.returns as $ZodType | undefined\n const returns = createConvexReturnsValidator(returnsSchema, { skipCustomSchemas: true })\n\n assertFunctionSchemas(zodSchema, returnsSchema)\n\n return builder({\n args: convexArgs,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const parsed = parseFunctionArgsOrThrow(zodSchema, argsObject)\n const raw = await handler(ctx, parsed)\n return finalizeFunctionReturn(raw, { returns: returnsSchema })\n }\n }) as any\n}\n\nexport function zQuery<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 return registerZodFunction(query, input, handler, options)\n}\n\nexport function zInternalQuery<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 return registerZodFunction(mutation, input, handler, options)\n}\n\nexport function zInternalMutation<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 return registerZodFunction(action, input, handler, options)\n}\n\nexport function zInternalAction<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 { type CustomBuilder, customFnBuilder } from './custom'\nimport { attachFunctionMeta } from './functionContracts'\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { zAction, zMutation, zQuery } from './wrappers'\nimport { $ZodType } from './zod-core'\n\ntype BuilderConfig<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType> | undefined,\n R extends $ZodType | undefined\n> = {\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}\n\nfunction registerBuilderFunction<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType> | undefined,\n R extends $ZodType | undefined,\n Result\n>(\n register: (\n builder: Builder,\n input: A extends undefined ? Record<string, never> : A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options: { returns?: R }\n ) => Result,\n builder: Builder,\n config: BuilderConfig<Builder, A, R>\n): Result {\n const result = register(builder, (config.args ?? ({} as any)) as any, config.handler, {\n returns: config.returns\n })\n attachFunctionMeta(result as object, config.args, config.returns)\n return result\n}\n\nfunction createDirectBuilderFactory(\n register: (builder: any, input: any, handler: any, options: any) => any\n) {\n return function directBuilderFactory<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | undefined = undefined\n >(\n config: BuilderConfig<Builder, A, R>\n ): any => registerBuilderFunction(register as any, builder, config) as any\n }\n}\n\nfunction createCustomBuilderFactory() {\n return function customBuilderFactory<\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 builder: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n ): CustomBuilder<\n 'query' | 'mutation' | '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 builder as any,\n customization as any\n ) as any\n }\n}\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 * @deprecated Use `initZodvex()` which returns `{ zq }` with built-in codec DB wrapping.\n *\n * @example\n * ```ts\n * import { query } from './_generated/server'\n * import { zQueryBuilder } from 'zodvex/server'\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 createDirectBuilderFactory(zQuery)(builder) as any\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 * @deprecated Use `initZodvex()` which returns `{ zm }` with built-in codec DB wrapping.\n *\n * @example\n * ```ts\n * import { mutation } from './_generated/server'\n * import { zMutationBuilder } from 'zodvex/server'\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 createDirectBuilderFactory(zMutation)(builder) as any\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 * @deprecated Use `initZodvex()` which returns `{ za }` with built-in codec DB wrapping.\n *\n * @example\n * ```ts\n * import { action } from './_generated/server'\n * import { zActionBuilder } from 'zodvex/server'\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 createDirectBuilderFactory(zAction)(builder) as any\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 * @deprecated Use `initZodvex()` and `zq.withContext()` instead.\n *\n * @example\n * ```ts\n * import { type QueryCtx, query } from './_generated/server'\n * import { zCustomQueryBuilder, customCtx } from 'zodvex/server'\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 createCustomBuilderFactory()(query, customization) 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 * @deprecated Use `initZodvex()` and `zm.withContext()` instead.\n *\n * @example\n * ```ts\n * import { type MutationCtx, mutation } from './_generated/server'\n * import { zCustomMutationBuilder, customCtx } from 'zodvex/server'\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 createCustomBuilderFactory()(mutation, customization) 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 * @deprecated Use `initZodvex()` and `za.withContext()` instead.\n *\n * @example\n * ```ts\n * import { type ActionCtx, action } from './_generated/server'\n * import { zCustomActionBuilder, customCtx } from 'zodvex/server'\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 createCustomBuilderFactory()(action, customization) as any\n}\n","import { z } from 'zod'\nimport { zodToConvex } from './mapping'\nimport { assertNoNativeZodDate } from './schema/dateGuards'\nimport { stripUndefined } from './stripUndefined'\nimport { type ZodvexCodec } from './types'\nimport {\n $ZodObject,\n $ZodOptional,\n $ZodType,\n encode,\n parse,\n type infer as zinfer,\n type input as zinput,\n type output as zoutput\n} from './zod-core'\n\n// Re-export ZodvexCodec type for convenience\nexport { type ZodvexCodec } from './types'\n\n/** @deprecated Use `initZodvex` or `decodeDoc`/`encodeDoc` instead. Will be removed in a future release. */\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\n/** @deprecated Use `initZodvex` or `decodeDoc`/`encodeDoc` instead. Will be removed in a future release. */\nexport function convexCodec<T>(schema: $ZodType<T>): ConvexCodec<T> {\n // Fail fast if z.date() is used - it won't encode correctly\n // Use zx.date() instead for Date ↔ timestamp conversion\n assertNoNativeZodDate(schema as $ZodType, 'schema')\n\n const validator = zodToConvex(schema)\n\n return {\n validator,\n // Strip undefined to ensure Convex-safe output (Convex rejects explicit undefined)\n encode: (value: T) => stripUndefined(encode(schema, value)),\n decode: (value: any) => parse(schema, value),\n pick: <K extends keyof T>(keys: K[] | Record<K, true>) => {\n if (!(schema instanceof $ZodObject)) {\n throw new Error('pick() can only be called on object schemas')\n }\n // Handle both array and object formats\n // Use manual shape extraction instead of .pick() — not available on zod/mini\n const pickKeys = Array.isArray(keys) ? keys : (Object.keys(keys) as K[])\n const shape = (schema as any)._zod.def.shape\n const pickedShape: Record<string, any> = {}\n for (const k of pickKeys) {\n if (k in shape) pickedShape[k as string] = shape[k as string]\n }\n const pickedSchema = z.object(pickedShape)\n return convexCodec(pickedSchema) as ConvexCodec<Pick<T, K>>\n }\n }\n}\n\n/**\n * Decodes a wire-format document (from Convex DB) to runtime types.\n * Runs Zod codec decode transforms (e.g., timestamp → Date via zx.date()).\n */\nexport function decodeDoc<S extends $ZodType>(schema: S, wireDoc: unknown): zoutput<S> {\n return parse(schema, wireDoc)\n}\n\n/**\n * Encodes a runtime document to wire format (for Convex DB writes).\n * Runs Zod codec encode transforms and strips undefined values.\n */\nexport function encodeDoc<S extends $ZodType>(schema: S, runtimeDoc: zoutput<S>): zinput<S> {\n return stripUndefined(encode(schema, runtimeDoc))\n}\n\n/**\n * Encodes a partial runtime document to wire format (for Convex DB patch operations).\n * Only encodes the fields present in the partial. Uses schema.partial() + z.encode().\n */\nexport function encodePartialDoc<S extends $ZodType>(\n schema: S,\n partial: Partial<zoutput<S>>\n): Partial<zinput<S>> {\n if (!(schema instanceof $ZodObject)) {\n // For non-object schemas (unions, etc.), fall back to full encode\n // Cast needed: Partial<output<S>> is structurally compatible but not assignable to output<S>\n return stripUndefined(encode(schema, partial as zoutput<S>)) as Partial<zinput<S>>\n }\n // Use manual shape wrapping instead of .partial() — not available on zod/mini\n const shape = (schema as any)._zod.def.shape\n const partialShape: Record<string, any> = {}\n for (const [key, value] of Object.entries(shape)) {\n partialShape[key] =\n value instanceof $ZodOptional\n ? value\n : new $ZodOptional({ type: 'optional', innerType: value as any })\n }\n const partialSchema = z.object(partialShape)\n return stripUndefined(encode(partialSchema, partial)) as Partial<zinput<S>>\n}\n\n/**\n * Creates a branded ZodCodec for use with zodvex type inference.\n * Thin wrapper around z.codec() that adds type branding, allowing\n * ConvexValidatorFromZod to extract the wire schema even when the\n * codec is wrapped in a custom type alias.\n *\n * @example\n * ```typescript\n * type MyCodec = ZodvexCodec<z.ZodObject<{ ts: z.ZodNumber }>, z.ZodCustom<Date>> // zod-ok\n *\n * function myCodec(): MyCodec {\n * return zodvexCodec(\n * z.object({ ts: z.number() }),\n * z.custom<Date>(() => true),\n * {\n * decode: (wire) => new Date(wire.ts),\n * encode: (date) => ({ ts: date.getTime() })\n * }\n * )\n * }\n * ```\n */\nexport function zodvexCodec<\n W extends $ZodType,\n R extends $ZodType,\n WO = zoutput<W>,\n RI = zoutput<R>\n>(\n wire: W,\n runtime: R,\n transforms: {\n decode: (wire: WO) => RI\n encode: (runtime: RI) => WO\n }\n): ZodvexCodec<W, R> {\n // Cast transforms to satisfy Zod's internal MaybeAsync typing while keeping our API simple\n return z.codec(wire as any, runtime as any, transforms as any) as unknown as ZodvexCodec<W, R>\n}\n","import type {\n GenericDataModel,\n GenericTableInfo,\n PaginationOptions,\n PaginationResult,\n TableNamesInDataModel\n} from 'convex/server'\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n// Type-only imports of db.ts classes — no runtime cycle. The actual class\n// references arrive at runtime via installRulesSubclasses() below, which\n// db.ts calls once its base classes are fully declared.\nimport type { ZodvexDatabaseReader, ZodvexDatabaseWriter, ZodvexQueryChain } from './db'\n\nexport {\n type DeleteRule,\n type InsertDoc,\n type InsertRule,\n type PatchRule,\n type ReaderAuditConfig,\n type ReadRule,\n type ReplaceRule,\n type ResolveDecodedDocForRules,\n type TableRules,\n type WriteEvent,\n type WriterAuditConfig,\n type ZodvexRules,\n type ZodvexRulesConfig\n} from './ruleTypes'\n\nimport type {\n InsertDoc,\n ReaderAuditConfig,\n ReadRule,\n ResolveDecodedDocForRules,\n TableRules,\n WriteEvent,\n WriterAuditConfig,\n ZodvexRules,\n ZodvexRulesConfig\n} from './ruleTypes'\n\n/**\n * Normalize a read rule result: true -> doc (pass-through), false/null -> null (deny), Doc -> Doc (transform).\n */\nexport function normalizeReadResult<Doc>(\n result: Doc | null | boolean,\n originalDoc: Doc\n): Doc | null {\n if (result === true) return originalDoc\n if (result === false) return null\n return result\n}\n\n// ============================================================================\n// Subclass storage + installer\n// ============================================================================\n//\n// The six classes below (Rules* and Audit*) all extend classes declared in\n// db.ts. Declaring them at module top level would force rules.ts to dereference\n// those base classes at its own module-init time — which in turn would force\n// db.ts to run first. But db.ts imports rules.ts, so it cannot. That's the\n// circular dependency.\n//\n// The fix: keep rules.ts top-level free of runtime references to db.ts. All\n// subclass declarations live inside `installRulesSubclasses`, which db.ts\n// calls AFTER its own class declarations are complete. At that point, the\n// base classes are real values and the extends chain resolves correctly.\n//\n// This replaces an earlier `dynamic import()` workaround, which had a timing\n// race: callers that invoked `.withRules()` or `.audit()` synchronously\n// (e.g., inside a `withContext` input function at mutation wire-up time)\n// could hit the guard before the dynamic import resolved.\n\ntype Subclasses = {\n RulesQueryChain: any\n RulesDatabaseReader: any\n RulesDatabaseWriter: any\n AuditQueryChain: any\n AuditDatabaseReader: any\n AuditDatabaseWriter: any\n}\n\nlet _subclasses: Subclasses | null = null\n\n/**\n * ESM live-binding for test-facing direct construction of `RulesQueryChain`.\n * Populated by `installRulesSubclasses`. Importers automatically see the\n * real class after install runs (which happens at db.ts module init).\n */\nexport let RulesQueryChain: any = null\n\nfunction getSubclasses(): Subclasses {\n if (!_subclasses) {\n throw new Error(\n 'zodvex rules subclasses not installed. This usually means the rules module ' +\n 'was loaded without db.ts running its installer. Import zodvex via the ' +\n 'public entry (zodvex/server) so db.ts initializes first.'\n )\n }\n return _subclasses\n}\n\n/**\n * Called once by db.ts after its base classes are declared. Builds the\n * Rules*/\n/* and Audit* subclasses with the correct extends chain. Safe to call\n * multiple times (idempotent).\n */\nexport function installRulesSubclasses(bases: {\n ZodvexQueryChain: typeof ZodvexQueryChain\n ZodvexDatabaseReader: typeof ZodvexDatabaseReader\n ZodvexDatabaseWriter: typeof ZodvexDatabaseWriter\n}): void {\n if (_subclasses) return\n\n const Base = bases as {\n ZodvexQueryChain: any\n ZodvexDatabaseReader: any\n ZodvexDatabaseWriter: any\n }\n\n /**\n * Extends ZodvexQueryChain, applying a read rule at every terminal method.\n * Intermediate methods are inherited from the base class via createChain().\n * Only terminals and createChain() are overridden.\n */\n class _RulesQueryChain<TableInfo extends GenericTableInfo, Doc> extends Base.ZodvexQueryChain {\n private readRule: ReadRule<any, Doc>\n private rulesConfig: ZodvexRulesConfig\n private ctx: any\n\n constructor(\n inner: any,\n schema: any,\n readRule: ReadRule<any, Doc>,\n config: ZodvexRulesConfig,\n ctx: any = {}\n ) {\n super(inner, schema)\n this.readRule = readRule\n this.rulesConfig = config\n this.ctx = ctx\n }\n\n protected createChain(inner: any): _RulesQueryChain<TableInfo, Doc> {\n return new _RulesQueryChain(\n inner,\n (this as any).schema,\n this.readRule,\n this.rulesConfig,\n this.ctx\n )\n }\n\n async first(): Promise<Doc | null> {\n for await (const doc of this as any) {\n return doc\n }\n return null\n }\n\n async unique(): Promise<Doc | null> {\n const doc = await super.unique()\n if (doc === null) return null\n return normalizeReadResult(await this.readRule(this.ctx, doc), doc)\n }\n\n async collect(): Promise<Doc[]> {\n const results: Doc[] = []\n for await (const doc of this as any) {\n results.push(doc)\n }\n return results\n }\n\n async take(n: number): Promise<Doc[]> {\n const results: Doc[] = []\n for await (const doc of this as any) {\n if (results.length >= n) break\n results.push(doc)\n }\n return results\n }\n\n async paginate(opts: PaginationOptions): Promise<PaginationResult<Doc>> {\n const result = await super.paginate(opts)\n const filtered: Doc[] = []\n for (const doc of result.page) {\n const allowed = normalizeReadResult(await this.readRule(this.ctx, doc), doc)\n if (allowed !== null) filtered.push(allowed)\n }\n return { ...result, page: filtered }\n }\n\n async count(): Promise<number> {\n if (!this.rulesConfig.allowCounting) {\n throw new Error('count is not allowed with rules')\n }\n return super.count()\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<Doc> {\n const iter = super[Symbol.asyncIterator]()\n while (true) {\n const { value, done } = await iter.next()\n if (done) break\n const result = normalizeReadResult(await this.readRule(this.ctx, value), value)\n if (result !== null) yield result\n }\n }\n }\n\n /**\n * Wraps a ZodvexDatabaseReader with per-table read rules.\n */\n class _RulesDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n > extends Base.ZodvexDatabaseReader {\n constructor(\n private inner: ZodvexDatabaseReader<DataModel, DecodedDocs>,\n private ctx: any,\n private rules: Record<string, TableRules<any, any>>,\n private rulesConfig: ZodvexRulesConfig\n ) {\n const { db, tableMap } = (inner as any)._internals\n super(db, tableMap)\n ;(this as any).system = (inner as any).system\n }\n\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n const doc = await this.inner.get(idOrTable, maybeId)\n if (doc === null) return null\n\n const tableName =\n maybeId !== undefined ? (idOrTable as string) : this.resolveTableFromId(idOrTable)\n\n if (!tableName) return doc\n return this.applyReadRule(tableName, doc)\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(tableName: TableName): any {\n const tableRules = this.rules[tableName as string]\n\n if (!tableRules?.read && (this.rulesConfig.defaultPolicy ?? 'allow') === 'allow') {\n return this.inner.query(tableName)\n }\n\n const innerChain = this.inner.query(tableName)\n const readRule = tableRules?.read ?? (async () => null)\n const passthroughSchema = z.any()\n return new _RulesQueryChain(\n innerChain,\n passthroughSchema,\n readRule,\n this.rulesConfig,\n this.ctx\n )\n }\n\n private resolveTableFromId(id: any): string | null {\n for (const tableName of Object.keys(this.rules)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n for (const tableName of Object.keys((this.inner as any)._internals.tableMap)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n }\n return null\n }\n\n private async applyReadRule(tableName: string, doc: any): Promise<any> {\n const tableRules = this.rules[tableName]\n if (!tableRules?.read) {\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') return null\n return doc\n }\n const result = await tableRules.read(this.ctx, doc)\n return normalizeReadResult(result, doc)\n }\n }\n\n /**\n * Wraps a ZodvexDatabaseWriter with per-table read and write rules.\n */\n class _RulesDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n > extends Base.ZodvexDatabaseWriter {\n private rulesReader: ZodvexDatabaseReader<DataModel, DecodedDocs>\n\n constructor(\n private inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>,\n private ctx: any,\n private rules: Record<string, TableRules<any, any>>,\n private rulesConfig: ZodvexRulesConfig\n ) {\n const { db, tableMap, reader: innerReader } = (inner as any)._internals\n super(db, tableMap)\n this.rulesReader = new _RulesDatabaseReader(innerReader, ctx, rules, rulesConfig) as any\n ;(this as any).system = (inner as any).system\n }\n\n normalizeId<TableName extends TableNamesInDataModel<DataModel>>(\n tableName: TableName,\n id: string\n ): GenericId<TableName> | null {\n return this.rulesReader.normalizeId(tableName, id)\n }\n\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n return this.rulesReader.get(idOrTable, maybeId)\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(tableName: TableName): any {\n return this.rulesReader.query(tableName)\n }\n\n async insert(table: any, value: any): Promise<any> {\n const tableName = table as string\n const tableRules = this.rules[tableName]\n\n if (tableRules?.insert) {\n const transformed = await tableRules.insert(this.ctx, value)\n return this.inner.insert(table, transformed)\n }\n\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n throw new Error(`insert not allowed on ${tableName}`)\n }\n\n return this.inner.insert(table, value)\n }\n\n async patch(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n }\n\n const doc = await this.rulesReader.get(id)\n if (doc === null) {\n throw new Error('no read access or doc does not exist')\n }\n\n const tableName = this.resolveTableFromId(id)\n const tableRules = tableName ? this.rules[tableName] : undefined\n\n if (tableRules?.patch) {\n const transformed = await tableRules.patch(this.ctx, doc, value)\n return this.inner.patch(id, transformed)\n }\n\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n throw new Error(`patch not allowed on ${tableName}`)\n }\n\n return this.inner.patch(id, value)\n }\n\n async replace(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n }\n\n const doc = await this.rulesReader.get(id)\n if (doc === null) {\n throw new Error('no read access or doc does not exist')\n }\n\n const tableName = this.resolveTableFromId(id)\n const tableRules = tableName ? this.rules[tableName] : undefined\n\n if (tableRules?.replace) {\n const transformed = await tableRules.replace(this.ctx, doc, value)\n return this.inner.replace(id, transformed)\n }\n\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n throw new Error(`replace not allowed on ${tableName}`)\n }\n\n return this.inner.replace(id, value)\n }\n\n async delete(idOrTable: any, maybeId?: any): Promise<void> {\n let id: any\n\n if (maybeId !== undefined) {\n id = maybeId\n } else {\n id = idOrTable\n }\n\n const doc = await this.rulesReader.get(id)\n if (doc === null) {\n throw new Error('no read access or doc does not exist')\n }\n\n const tableName = this.resolveTableFromId(id)\n const tableRules = tableName ? this.rules[tableName] : undefined\n\n if (tableRules?.delete) {\n await tableRules.delete(this.ctx, doc)\n return this.inner.delete(id)\n }\n\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n throw new Error(`delete not allowed on ${tableName}`)\n }\n\n return this.inner.delete(id)\n }\n\n private resolveTableFromId(id: any): string | null {\n for (const tableName of Object.keys(this.rules)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n for (const tableName of Object.keys((this.inner as any)._internals.tableMap)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n }\n return null\n }\n }\n\n // ==========================================================================\n // Audit wrapping — afterRead and afterWrite callbacks\n // ==========================================================================\n\n /**\n * Extends ZodvexQueryChain to fire an afterRead callback for each document\n * returned by terminal methods.\n */\n class _AuditQueryChain<TableInfo extends GenericTableInfo, Doc> extends Base.ZodvexQueryChain {\n private afterRead: (table: string, doc: any) => void | Promise<void>\n private tableName: string\n\n constructor(\n inner: any,\n schema: any,\n afterRead: (table: string, doc: any) => void | Promise<void>,\n tableName: string\n ) {\n super(inner, schema)\n this.afterRead = afterRead\n this.tableName = tableName\n }\n\n protected createChain(inner: any): _AuditQueryChain<TableInfo, Doc> {\n return new _AuditQueryChain(inner, (this as any).schema, this.afterRead, this.tableName)\n }\n\n async first(): Promise<Doc | null> {\n const doc = await super.first()\n if (doc !== null) await this.afterRead(this.tableName, doc)\n return doc\n }\n\n async unique(): Promise<Doc | null> {\n const doc = await super.unique()\n if (doc !== null) await this.afterRead(this.tableName, doc)\n return doc\n }\n\n async collect(): Promise<Doc[]> {\n const docs = await super.collect()\n for (const doc of docs) {\n await this.afterRead(this.tableName, doc)\n }\n return docs\n }\n\n async take(n: number): Promise<Doc[]> {\n const docs = await super.take(n)\n for (const doc of docs) {\n await this.afterRead(this.tableName, doc)\n }\n return docs\n }\n\n async paginate(opts: PaginationOptions): Promise<PaginationResult<Doc>> {\n const result = await super.paginate(opts)\n for (const doc of result.page) {\n await this.afterRead(this.tableName, doc)\n }\n return result\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<Doc> {\n const iter = super[Symbol.asyncIterator]()\n while (true) {\n const { value, done } = await iter.next()\n if (done) break\n await this.afterRead(this.tableName, value)\n yield value\n }\n }\n }\n\n /**\n * Wraps a ZodvexDatabaseReader with afterRead audit callbacks.\n */\n class _AuditDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n > extends Base.ZodvexDatabaseReader {\n private inner: ZodvexDatabaseReader<DataModel, DecodedDocs>\n private afterRead: (table: string, doc: any) => void | Promise<void>\n\n constructor(inner: ZodvexDatabaseReader<DataModel, DecodedDocs>, config: ReaderAuditConfig) {\n const { db, tableMap } = (inner as any)._internals\n super(db, tableMap)\n this.inner = inner\n this.afterRead =\n config.afterRead ??\n (() => {\n /* noop */\n })\n ;(this as any).system = (inner as any).system\n }\n\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n const doc = await this.inner.get(idOrTable, maybeId)\n if (doc !== null) {\n const tableName = this.resolveTableFromId(\n maybeId !== undefined ? maybeId : idOrTable,\n maybeId !== undefined ? idOrTable : undefined\n )\n if (tableName) {\n await this.afterRead(tableName, doc)\n }\n }\n return doc\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(tableName: TableName): any {\n const innerChain = this.inner.query(tableName)\n const passthroughSchema = z.any()\n return new _AuditQueryChain(\n innerChain,\n passthroughSchema,\n this.afterRead,\n tableName as string\n )\n }\n\n private resolveTableFromId(id: any, explicitTable?: string): string | null {\n if (explicitTable) return explicitTable\n for (const tableName of Object.keys((this as any).tableMap)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n return null\n }\n }\n\n /**\n * Wraps a ZodvexDatabaseWriter with afterRead and afterWrite audit callbacks.\n */\n class _AuditDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n > extends Base.ZodvexDatabaseWriter {\n private inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>\n private auditReader: ZodvexDatabaseReader<DataModel, DecodedDocs>\n private afterWrite: ((table: string, event: WriteEvent) => void | Promise<void>) | undefined\n\n constructor(inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>, config: WriterAuditConfig) {\n const { db, tableMap, reader: innerReader } = (inner as any)._internals\n super(db, tableMap)\n this.inner = inner\n this.afterWrite = config.afterWrite as typeof this.afterWrite\n\n this.auditReader = config.afterRead\n ? (new _AuditDatabaseReader(innerReader, { afterRead: config.afterRead }) as any)\n : innerReader\n ;(this as any).system = (inner as any).system\n }\n\n normalizeId<TableName extends TableNamesInDataModel<DataModel>>(\n tableName: TableName,\n id: string\n ): GenericId<TableName> | null {\n return this.auditReader.normalizeId(tableName, id)\n }\n\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n return this.auditReader.get(idOrTable, maybeId)\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(tableName: TableName): any {\n return this.auditReader.query(tableName)\n }\n\n async insert(table: any, value: any): Promise<any> {\n const id = await this.inner.insert(table, value)\n if (this.afterWrite) {\n await this.afterWrite(table as string, { type: 'insert', id, value })\n }\n return id\n }\n\n async patch(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n }\n\n const doc = await this.inner.get(id)\n\n if (maybeValue !== undefined) {\n await this.inner.patch(idOrTable, idOrValue, maybeValue)\n } else {\n await this.inner.patch(id, value)\n }\n\n if (this.afterWrite) {\n const tableName = this.resolveTableFromId(id)\n if (tableName) {\n await this.afterWrite(tableName, { type: 'patch', id, doc, value })\n }\n }\n }\n\n async replace(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n }\n\n const doc = await this.inner.get(id)\n\n if (maybeValue !== undefined) {\n await this.inner.replace(idOrTable, idOrValue, maybeValue)\n } else {\n await this.inner.replace(id, value)\n }\n\n if (this.afterWrite) {\n const tableName = this.resolveTableFromId(id)\n if (tableName) {\n await this.afterWrite(tableName, { type: 'replace', id, doc, value })\n }\n }\n }\n\n async delete(idOrTable: any, maybeId?: any): Promise<void> {\n let id: any\n\n if (maybeId !== undefined) {\n id = maybeId\n } else {\n id = idOrTable\n }\n\n const doc = await this.inner.get(id)\n\n if (maybeId !== undefined) {\n await this.inner.delete(idOrTable, maybeId)\n } else {\n await this.inner.delete(id)\n }\n\n if (this.afterWrite) {\n const tableName = this.resolveTableFromId(id)\n if (tableName) {\n await this.afterWrite(tableName, { type: 'delete', id, doc })\n }\n }\n }\n\n private resolveTableFromId(id: any): string | null {\n for (const tableName of Object.keys((this.inner as any)._internals.tableMap)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n return null\n }\n }\n\n // Populate module slots. ESM live-binding updates importers of\n // `RulesQueryChain` automatically.\n RulesQueryChain = _RulesQueryChain\n _subclasses = {\n RulesQueryChain: _RulesQueryChain,\n RulesDatabaseReader: _RulesDatabaseReader,\n RulesDatabaseWriter: _RulesDatabaseWriter,\n AuditQueryChain: _AuditQueryChain,\n AuditDatabaseReader: _AuditDatabaseReader,\n AuditDatabaseWriter: _AuditDatabaseWriter\n }\n}\n\n// ============================================================================\n// Factory functions — public surface called by db.ts methods\n// ============================================================================\n\nexport function createRulesDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n>(\n inner: ZodvexDatabaseReader<DataModel, DecodedDocs>,\n ctx: any,\n rules: Record<string, TableRules<any, any>>,\n config?: ZodvexRulesConfig\n): ZodvexDatabaseReader<DataModel, DecodedDocs> {\n return new (getSubclasses().RulesDatabaseReader)(inner, ctx, rules, config ?? {})\n}\n\nexport function createRulesDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n>(\n inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>,\n ctx: any,\n rules: Record<string, TableRules<any, any>>,\n config?: ZodvexRulesConfig\n): ZodvexDatabaseWriter<DataModel, DecodedDocs> {\n return new (getSubclasses().RulesDatabaseWriter)(inner, ctx, rules, config ?? {})\n}\n\nexport function createAuditDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n>(\n inner: ZodvexDatabaseReader<DataModel, DecodedDocs>,\n config: ReaderAuditConfig\n): ZodvexDatabaseReader<DataModel, DecodedDocs> {\n return new (getSubclasses().AuditDatabaseReader)(inner, config)\n}\n\nexport function createAuditDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n>(\n inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>,\n config: WriterAuditConfig\n): ZodvexDatabaseWriter<DataModel, DecodedDocs> {\n return new (getSubclasses().AuditDatabaseWriter)(inner, config)\n}\n","import type {\n DocumentByInfo,\n ExpressionOrValue,\n FieldPaths,\n FieldTypeFromFieldPath,\n FilterBuilder,\n GenericDatabaseReader,\n GenericDatabaseWriter,\n GenericDataModel,\n GenericDocument,\n GenericIndexFields,\n GenericTableInfo,\n IndexNames,\n IndexRange,\n NamedIndex,\n NamedSearchIndex,\n NamedTableInfo,\n PaginationOptions,\n PaginationResult,\n SearchFilter,\n SearchFilterBuilder,\n SearchIndexNames,\n TableNamesInDataModel\n} from 'convex/server'\nimport type { GenericId, NumericValue } from 'convex/values'\nimport { z } from 'zod'\nimport { decodeDoc, encodeDoc, encodePartialDoc } from './codec'\nimport {\n createAuditDatabaseReader,\n createAuditDatabaseWriter,\n createRulesDatabaseReader,\n createRulesDatabaseWriter,\n installRulesSubclasses\n} from './rules'\nimport type { ReaderAuditConfig, WriterAuditConfig, ZodvexRulesConfig } from './ruleTypes'\nimport type { ZodTableMap } from './schema'\nimport { $ZodObject, $ZodType, $ZodUnion, encode } from './zod-core'\n\n// Note on cycle: rules.ts imports ONLY types from db.ts, so this static import\n// triggers no runtime cycle. rules.ts loads first (its top level has no\n// references to db.ts values), then db.ts declares its base classes, and\n// installRulesSubclasses (called at the end of this file) lets rules.ts\n// build its subclass chain. This replaces a prior `dynamic import()`\n// workaround whose promise could race `.withRules()` / `.audit()` calls\n// made from within `withContext`-style input functions.\n\n// ============================================================================\n// Index builder types — decoded-aware replacements for Convex's IndexRangeBuilder\n// ============================================================================\n\n/**\n * Resolves the accepted value type for an index field comparison.\n *\n * - Dot-paths (e.g., \"email.value\"): resolve through the wire document,\n * since dot-paths navigate into wire-format sub-structures.\n * - Top-level fields present in DecodedDoc: use the decoded (runtime) type,\n * so codec fields accept decoded values (e.g., Date instead of number).\n * - Everything else: fall back to wire type via FieldTypeFromFieldPath.\n */\nexport type ZodvexIndexFieldValue<\n WireDoc extends GenericDocument,\n DecodedDoc,\n FieldPath extends string\n> = FieldPath extends `${string}.${string}`\n ? FieldTypeFromFieldPath<WireDoc, FieldPath>\n : FieldPath extends keyof DecodedDoc\n ? DecodedDoc[FieldPath]\n : FieldTypeFromFieldPath<WireDoc, FieldPath>\n\n/** Increments a numeric type literal by 1 (up to 15). Mirrors Convex's internal PlusOne. */\ntype PlusOne<N extends number> = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15][N]\n\n/**\n * Decoded-aware index range builder. Mirrors Convex's IndexRangeBuilder but uses\n * ZodvexIndexFieldValue for comparison value types, so codec fields accept\n * decoded/runtime types (e.g., Date) instead of requiring wire types (e.g., number).\n */\nexport interface ZodvexIndexRangeBuilder<\n WireDoc extends GenericDocument,\n DecodedDoc,\n IndexFields extends GenericIndexFields,\n FieldNum extends number = 0\n> extends ZodvexLowerBoundBuilder<WireDoc, DecodedDoc, IndexFields[FieldNum]> {\n eq(\n fieldName: IndexFields[FieldNum],\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFields[FieldNum]>\n ): ZodvexNextBuilder<WireDoc, DecodedDoc, IndexFields, FieldNum>\n}\n\n/** After .eq(), either another ZodvexIndexRangeBuilder (more fields) or IndexRange (done). */\ntype ZodvexNextBuilder<\n WireDoc extends GenericDocument,\n DecodedDoc,\n IndexFields extends GenericIndexFields,\n FieldNum extends number\n> =\n PlusOne<FieldNum> extends IndexFields['length']\n ? IndexRange\n : ZodvexIndexRangeBuilder<WireDoc, DecodedDoc, IndexFields, PlusOne<FieldNum>>\n\n/** Lower bound builder with decoded-aware value types. */\nexport interface ZodvexLowerBoundBuilder<\n WireDoc extends GenericDocument,\n DecodedDoc,\n IndexFieldName extends string\n> extends ZodvexUpperBoundBuilder<WireDoc, DecodedDoc, IndexFieldName> {\n gt(\n fieldName: IndexFieldName,\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFieldName>\n ): ZodvexUpperBoundBuilder<WireDoc, DecodedDoc, IndexFieldName>\n gte(\n fieldName: IndexFieldName,\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFieldName>\n ): ZodvexUpperBoundBuilder<WireDoc, DecodedDoc, IndexFieldName>\n}\n\n/** Upper bound builder with decoded-aware value types. */\nexport interface ZodvexUpperBoundBuilder<\n WireDoc extends GenericDocument,\n DecodedDoc,\n IndexFieldName extends string\n> extends IndexRange {\n lt(\n fieldName: IndexFieldName,\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFieldName>\n ): IndexRange\n lte(\n fieldName: IndexFieldName,\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFieldName>\n ): IndexRange\n}\n\n// ============================================================================\n// Filter builder types — decoded-aware replacements for Convex's FilterBuilder\n// ============================================================================\n\ndeclare const _zodvexExpr: unique symbol\nexport type ZodvexExpression<T> = { readonly [_zodvexExpr]: T }\nexport type ZodvexExpressionOrValue<T> = ZodvexExpression<T> | T\n\nexport interface ZodvexFilterBuilder<\n TableInfo extends GenericTableInfo,\n Doc = DocumentByInfo<TableInfo>\n> {\n field<FP extends FieldPaths<TableInfo>>(\n fieldPath: FP\n ): ZodvexExpression<ZodvexIndexFieldValue<DocumentByInfo<TableInfo>, Doc, FP>>\n\n eq<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n neq<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n lt<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n lte<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n gt<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n gte<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n\n and(...exprs: ZodvexExpressionOrValue<boolean>[]): ZodvexExpression<boolean>\n or(...exprs: ZodvexExpressionOrValue<boolean>[]): ZodvexExpression<boolean>\n not(x: ZodvexExpressionOrValue<boolean>): ZodvexExpression<boolean>\n\n add<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n sub<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n mul<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n div<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n mod<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n neg<T extends NumericValue>(x: ZodvexExpressionOrValue<T>): ZodvexExpression<T>\n}\n\n/**\n * Encodes a comparison value for an index field through its Zod schema.\n *\n * - Top-level fields: encoded through their schema (codec fields transform,\n * non-codec fields are identity).\n * - Dot-paths: pass through unchanged (they target wire-format sub-fields\n * where the comparison value is already the correct primitive type).\n */\nfunction encodeIndexValue(schema: $ZodType, fieldPath: string, value: any): any {\n // Dot-paths target wire-format sub-fields — value is already correct\n if (fieldPath.includes('.')) return value\n\n // Object schemas: encode through the field's schema directly\n if (schema instanceof $ZodObject) {\n const fieldSchema = (schema as z.ZodObject<any>).shape[fieldPath] // zod-ok\n if (fieldSchema) return encode(fieldSchema, value)\n }\n\n // Union schemas (ZodDiscriminatedUnion extends ZodUnion): build a per-field\n // union from all variants, then encode through that. Handles discriminator\n // literals and codec fields (e.g., zx.date()) correctly.\n // Non-object variants are skipped — union tables require object variants.\n if (schema instanceof $ZodUnion) {\n const options = schema._zod.def.options\n const fieldSchemas = options\n .filter((v): v is z.ZodObject<any> => v instanceof $ZodObject) // zod-ok\n .map(v => v.shape[fieldPath])\n .filter(Boolean)\n if (fieldSchemas.length === 1) return encode(fieldSchemas[0], value)\n if (fieldSchemas.length > 1)\n return encode(z.union(fieldSchemas as [$ZodType, $ZodType, ...$ZodType[]]), value)\n }\n\n return value\n}\n\n/**\n * Wraps a Convex IndexRangeBuilder (or any builder with eq/gt/gte/lt/lte methods)\n * with automatic value encoding. Each comparison method encodes its value through\n * the table's doc schema before forwarding to the real builder.\n *\n * Returns another wrapped builder so chained calls (e.g., .eq().gte().lt()) are\n * all encoded.\n */\nfunction wrapIndexRangeBuilder(inner: any, schema: $ZodType): any {\n return new Proxy(inner, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && ['eq', 'gt', 'gte', 'lt', 'lte'].includes(prop)) {\n return (fieldName: string, value: any) => {\n const encoded = encodeIndexValue(schema, fieldName, value)\n const result = target[prop](fieldName, encoded)\n return wrapIndexRangeBuilder(result, schema)\n }\n }\n // Wrap .search() return value so SearchFilterFinalizer.eq() is encoded\n if (prop === 'search') {\n return (...args: any[]) => {\n const result = target.search(...args)\n return wrapIndexRangeBuilder(result, schema)\n }\n }\n return Reflect.get(target, prop, receiver)\n }\n })\n}\n\nfunction extractFieldPath(expr: any): string | null {\n if (expr && typeof expr.serialize === 'function') {\n const inner = expr.serialize()\n if (inner && typeof inner === 'object' && '$field' in inner) {\n return inner.$field\n }\n }\n return null\n}\n\nfunction wrapFilterBuilder(inner: any, schema: $ZodType): any {\n return new Proxy(inner, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && ['eq', 'neq', 'lt', 'lte', 'gt', 'gte'].includes(prop)) {\n return (l: any, r: any) => {\n const lField = extractFieldPath(l)\n const rField = extractFieldPath(r)\n if (lField && !rField) {\n r = encodeIndexValue(schema, lField, r)\n } else if (rField && !lField) {\n l = encodeIndexValue(schema, rField, l)\n }\n return target[prop](l, r)\n }\n }\n return Reflect.get(target, prop, receiver)\n }\n })\n}\n\n/**\n * Wraps a Convex query chain, decoding documents through a Zod schema\n * at terminal methods (first, unique, collect, take, paginate).\n *\n * Two type contexts (dual-generic design):\n * - `TableInfo`: Convex's wire-format table info. Used by intermediate methods\n * (filter, etc.) so FilterBuilder sees wire-format field types.\n * - `Doc`: The decoded/runtime document type. Used by terminal methods\n * (first, collect, paginate, etc.) and by ZodvexIndexRangeBuilder in\n * withIndex, so codec fields accept decoded values (e.g., Date).\n *\n * Consumer code never passes these generics manually — they're inferred\n * from ZodvexDatabaseReader.query() which gets them from defineZodSchema's\n * captured type parameter.\n *\n * Does NOT implement QueryInitializer<TableInfo> because terminal methods\n * return Doc (decoded) instead of DocumentByInfo<TableInfo> (wire).\n */\nexport class ZodvexQueryChain<TableInfo extends GenericTableInfo, Doc = DocumentByInfo<TableInfo>> {\n constructor(\n protected inner: any,\n protected schema: $ZodType\n ) {}\n\n /** Factory method for intermediate methods. Subclasses override to return their own type. */\n protected createChain(inner: any): ZodvexQueryChain<TableInfo, Doc> {\n return new ZodvexQueryChain(inner, this.schema)\n }\n\n /** Decode a wire-format doc and cast to the decoded document type. */\n private decode(doc: any): Doc {\n return decodeDoc(this.schema, doc) as Doc\n }\n\n // --- Intermediate methods: wire-typed TableInfo for Convex machinery ---\n\n fullTableScan(): ZodvexQueryChain<TableInfo, Doc> {\n return this.createChain(this.inner.fullTableScan())\n }\n\n withIndex<IndexName extends IndexNames<TableInfo>>(\n indexName: IndexName,\n indexRange?: (\n q: ZodvexIndexRangeBuilder<DocumentByInfo<TableInfo>, Doc, NamedIndex<TableInfo, IndexName>>\n ) => IndexRange\n ): ZodvexQueryChain<TableInfo, Doc> {\n const wrappedRange = indexRange\n ? (q: any) => indexRange(wrapIndexRangeBuilder(q, this.schema))\n : undefined\n return this.createChain(this.inner.withIndex(indexName, wrappedRange))\n }\n\n withSearchIndex<IndexName extends SearchIndexNames<TableInfo>>(\n indexName: IndexName,\n searchFilter: (\n q: SearchFilterBuilder<DocumentByInfo<TableInfo>, NamedSearchIndex<TableInfo, IndexName>>\n ) => SearchFilter\n ): ZodvexQueryChain<TableInfo, Doc> {\n const wrappedFilter = (q: any) => searchFilter(wrapIndexRangeBuilder(q, this.schema))\n return this.createChain(this.inner.withSearchIndex(indexName, wrappedFilter))\n }\n\n order(order: 'asc' | 'desc'): ZodvexQueryChain<TableInfo, Doc> {\n return this.createChain(this.inner.order(order))\n }\n\n // Overload 1: decoded-aware predicate (tried first)\n filter(\n predicate: (q: ZodvexFilterBuilder<TableInfo, Doc>) => ZodvexExpressionOrValue<boolean>\n ): ZodvexQueryChain<TableInfo, Doc>\n // Overload 2: Convex-native predicate (backwards compatible)\n filter(\n predicate: (q: FilterBuilder<TableInfo>) => ExpressionOrValue<boolean>\n ): ZodvexQueryChain<TableInfo, Doc>\n // Implementation\n filter(predicate: any): ZodvexQueryChain<TableInfo, Doc> {\n const wrappedPredicate = (q: any) => predicate(wrapFilterBuilder(q, this.schema))\n return this.createChain(this.inner.filter(wrappedPredicate))\n }\n\n limit(n: number): ZodvexQueryChain<TableInfo, Doc> {\n return this.createChain(this.inner.limit(n))\n }\n\n count(): Promise<number> {\n return this.inner.count()\n }\n\n // --- Terminal methods: return decoded Doc type ---\n\n async first(): Promise<Doc | null> {\n const doc = await this.inner.first()\n return doc ? this.decode(doc) : null\n }\n\n async unique(): Promise<Doc | null> {\n const doc = await this.inner.unique()\n return doc ? this.decode(doc) : null\n }\n\n async collect(): Promise<Doc[]> {\n const docs = await this.inner.collect()\n return docs.map((doc: any) => this.decode(doc))\n }\n\n async take(n: number): Promise<Doc[]> {\n const docs = await this.inner.take(n)\n return docs.map((doc: any) => this.decode(doc))\n }\n\n async paginate(paginationOpts: PaginationOptions): Promise<PaginationResult<Doc>> {\n const result = await this.inner.paginate(paginationOpts)\n return {\n ...result,\n page: result.page.map((doc: any) => this.decode(doc))\n }\n }\n\n // --- AsyncIterable: decode each yielded document ---\n\n async *[Symbol.asyncIterator](): AsyncIterator<Doc> {\n for await (const doc of this.inner) {\n yield this.decode(doc)\n }\n }\n}\n\n/**\n * Resolves the decoded document type for a given table.\n * If the table has a decoded type in DecodedDocs, use it.\n * Otherwise fall back to DocumentByInfo (wire types = runtime types for tables without codecs).\n */\ntype ResolveDecodedDoc<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>,\n TableName extends TableNamesInDataModel<DataModel>\n> = TableName extends keyof DecodedDocs\n ? DecodedDocs[TableName]\n : DocumentByInfo<NamedTableInfo<DataModel, TableName>>\n\n/** System fields auto-managed by Convex — not writable by consumers. */\ntype SystemFields = '_id' | '_creationTime'\n\n/** Decoded doc without system fields — for insert and replace values. */\ntype DecodedWriteValue<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>,\n TableName extends TableNamesInDataModel<DataModel>\n> = Omit<ResolveDecodedDoc<DataModel, DecodedDocs, TableName>, SystemFields>\n\n/** Partial decoded doc without system fields — for patch values. */\ntype DecodedPatchValue<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>,\n TableName extends TableNamesInDataModel<DataModel>\n> = Partial<Omit<ResolveDecodedDoc<DataModel, DecodedDocs, TableName>, SystemFields>>\n\n/**\n * Resolves a table name from a GenericId by iterating the tableMap\n * and calling normalizeId. Same approach as convex-helpers' WrapReader.\n */\nfunction resolveTableName<DataModel extends GenericDataModel>(\n db: GenericDatabaseReader<DataModel>,\n tableMap: ZodTableMap,\n id: GenericId<any>\n): string | null {\n for (const tableName of Object.keys(tableMap)) {\n // tableName is a dynamic string key — can't narrow to TableNamesInDataModel\n if (db.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n return null\n}\n\n/**\n * Wraps a GenericDatabaseReader with automatic Zod codec decoding on reads.\n * Documents from tables in the zodTableMap are decoded through their schema.\n * Tables not in the map pass through without decoding.\n * System tables always pass through.\n *\n * DecodedDocs is a phantom type carrying the decoded document types for each\n * table (computed by DecodedDocFor<T> from defineZodSchema). It's never\n * accessed at runtime — it only drives the Doc generic on ZodvexQueryChain\n * so terminal methods return decoded types (e.g., Date instead of number).\n *\n * Does NOT implement GenericDatabaseReader<DataModel> because query() returns\n * ZodvexQueryChain (with decoded terminal types) instead of QueryInitializer\n * (with wire terminal types).\n */\nexport class ZodvexDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any> = Record<string, any>\n> {\n system: GenericDatabaseReader<DataModel>['system']\n\n constructor(\n protected db: GenericDatabaseReader<DataModel>,\n protected tableMap: ZodTableMap\n ) {\n this.system = db.system\n }\n\n /** @internal Expose for wrapper construction (rules.ts, audit subclasses) */\n get _internals(): { db: GenericDatabaseReader<DataModel>; tableMap: ZodTableMap } {\n return { db: this.db, tableMap: this.tableMap }\n }\n\n normalizeId<TableName extends TableNamesInDataModel<DataModel>>(\n tableName: TableName,\n id: string\n ): GenericId<TableName> | null {\n return this.db.normalizeId(tableName, id)\n }\n\n get<TableName extends TableNamesInDataModel<DataModel>>(\n id: GenericId<TableName>\n ): Promise<ResolveDecodedDoc<DataModel, DecodedDocs, TableName> | null>\n /** @internal 2-arg form for table-first lookups */\n get(idOrTable: any, maybeId?: any): Promise<any>\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n let tableName: string | null\n let doc: any\n\n if (maybeId !== undefined) {\n // get(table, id) form\n tableName = idOrTable as string\n // 2-arg get(table, id) is @internal in Convex types — cast required\n doc = await (this.db as any).get(idOrTable, maybeId)\n } else {\n // get(id) form\n doc = await this.db.get(idOrTable)\n tableName = doc ? resolveTableName(this.db, this.tableMap, idOrTable) : null\n }\n\n if (!doc) return null\n\n const schemas = tableName ? this.tableMap[tableName] : undefined\n return schemas ? decodeDoc(schemas.doc, doc) : doc\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(\n tableName: TableName\n ): ZodvexQueryChain<\n NamedTableInfo<DataModel, TableName>,\n ResolveDecodedDoc<DataModel, DecodedDocs, TableName>\n > {\n const schemas = this.tableMap[tableName as string]\n const innerQuery = this.db.query(tableName)\n if (!schemas) {\n // No codec for this table — return unwrapped query as-is.\n // Wire types = runtime types for non-codec tables, and\n // ResolveDecodedDoc falls back to DocumentByInfo (wire) here.\n // Cast required: Convex QueryInitializer is structurally incompatible\n // with ZodvexQueryChain (decoded terminal return types).\n return innerQuery as any\n }\n return new ZodvexQueryChain<\n NamedTableInfo<DataModel, TableName>,\n ResolveDecodedDoc<DataModel, DecodedDocs, TableName>\n >(innerQuery, schemas.doc)\n }\n\n /**\n * Returns a new ZodvexDatabaseReader that applies per-table read rules.\n * The returned reader is also a ZodvexDatabaseReader, so `.withRules()` can be chained.\n */\n withRules<Ctx>(\n ctx: Ctx,\n rules: Record<string, any>,\n config?: ZodvexRulesConfig\n ): ZodvexDatabaseReader<DataModel, DecodedDocs> {\n return createRulesDatabaseReader(this, ctx, rules, config)\n }\n\n /**\n * Returns a new ZodvexDatabaseReader that fires audit callbacks on reads.\n * The returned reader is also a ZodvexDatabaseReader, so `.audit()` can be chained\n * with `.withRules()`.\n */\n audit(config: ReaderAuditConfig): ZodvexDatabaseReader<DataModel, DecodedDocs> {\n return createAuditDatabaseReader(this, config)\n }\n}\n\n/**\n * Wraps a GenericDatabaseWriter with automatic Zod codec encoding on writes\n * and decoding on reads. Inherits read methods from ZodvexDatabaseReader so\n * that `ZodvexDatabaseWriter` narrows to `ZodvexDatabaseReader` at call sites\n * — the native Convex `MutationCtx → QueryCtx` idiom (#64).\n *\n * Does NOT implement GenericDatabaseWriter<DataModel> because query() returns\n * ZodvexQueryChain (decoded types) instead of QueryInitializer (wire types).\n */\nexport class ZodvexDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any> = Record<string, any>\n> extends ZodvexDatabaseReader<DataModel, DecodedDocs> {\n // Narrows the inherited `protected db` to the writer-typed view without\n // shadowing the underlying instance. Used by the write methods below.\n protected get writerDb(): GenericDatabaseWriter<DataModel> {\n return this.db as GenericDatabaseWriter<DataModel>\n }\n\n declare system: GenericDatabaseWriter<DataModel>['system']\n\n constructor(db: GenericDatabaseWriter<DataModel>, tableMap: ZodTableMap) {\n super(db, tableMap)\n this.system = db.system\n }\n\n /**\n * @internal Expose writer-typed internals for rules / audit subclasses.\n * Includes a `reader` field that aliases `this` (writer IS-A reader after\n * the #64 refactor) so callers expecting `_internals.reader` still work.\n */\n override get _internals(): {\n db: GenericDatabaseWriter<DataModel>\n tableMap: ZodTableMap\n reader: ZodvexDatabaseReader<DataModel, DecodedDocs>\n } {\n return { db: this.writerDb, tableMap: this.tableMap, reader: this }\n }\n\n // --- Write methods: encode before delegating ---\n\n insert<TableName extends TableNamesInDataModel<DataModel>>(\n table: TableName,\n value: DecodedWriteValue<DataModel, DecodedDocs, TableName>\n ): Promise<GenericId<TableName>>\n /** @internal untyped fallback */\n insert(table: any, value: any): Promise<any>\n async insert(table: any, value: any): Promise<any> {\n const schemas = this.tableMap[table as string]\n const wireValue = schemas ? encodeDoc(schemas.insert, value) : value\n return this.writerDb.insert(table, wireValue)\n }\n\n patch<TableName extends TableNamesInDataModel<DataModel>>(\n id: GenericId<TableName>,\n value: DecodedPatchValue<DataModel, DecodedDocs, TableName>\n ): Promise<void>\n /** @internal 3-arg form for table-first patches */\n patch(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void>\n async patch(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let tableName: string | null\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n // patch(table, id, value) form\n tableName = idOrTable\n id = idOrValue\n value = maybeValue\n } else {\n // patch(id, value) form\n id = idOrTable\n value = idOrValue\n tableName = resolveTableName(this.db, this.tableMap, id)\n }\n\n const schemas = tableName ? this.tableMap[tableName] : undefined\n const wireValue = schemas ? encodePartialDoc(schemas.insert, value) : value\n\n if (maybeValue !== undefined) {\n // 3-arg form (table, id, value) is @internal in Convex types — cast required\n return (this.writerDb as any).patch(idOrTable, id, wireValue)\n }\n return this.writerDb.patch(id, wireValue)\n }\n\n replace<TableName extends TableNamesInDataModel<DataModel>>(\n id: GenericId<TableName>,\n value: DecodedWriteValue<DataModel, DecodedDocs, TableName>\n ): Promise<void>\n /** @internal 3-arg form for table-first replaces */\n replace(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void>\n async replace(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let tableName: string | null\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n tableName = idOrTable\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n tableName = resolveTableName(this.db, this.tableMap, id)\n }\n\n const schemas = tableName ? this.tableMap[tableName] : undefined\n const wireValue = schemas ? encodeDoc(schemas.insert, value) : value\n\n if (maybeValue !== undefined) {\n // 3-arg form (table, id, value) is @internal in Convex types — cast required\n return (this.writerDb as any).replace(idOrTable, id, wireValue)\n }\n return this.writerDb.replace(id, wireValue)\n }\n\n delete<TableName extends TableNamesInDataModel<DataModel>>(\n id: GenericId<TableName>\n ): Promise<void>\n /** @internal 2-arg form for table-first deletes */\n delete(idOrTable: any, maybeId?: any): Promise<void>\n async delete(idOrTable: any, maybeId?: any): Promise<void> {\n if (maybeId !== undefined) {\n // 2-arg form (table, id) is @internal in Convex types — cast required\n return (this.writerDb as any).delete(idOrTable, maybeId)\n }\n return this.writerDb.delete(idOrTable)\n }\n\n /**\n * Returns a new ZodvexDatabaseWriter that applies per-table read and write rules.\n * The returned writer is also a ZodvexDatabaseWriter, so `.withRules()` can be chained.\n *\n * Overrides Reader's signature so a writer chained call returns a writer.\n */\n override withRules<Ctx>(\n ctx: Ctx,\n rules: Record<string, any>,\n config?: ZodvexRulesConfig\n ): ZodvexDatabaseWriter<DataModel, DecodedDocs> {\n return createRulesDatabaseWriter(this, ctx, rules, config)\n }\n\n /**\n * Returns a new ZodvexDatabaseWriter that fires audit callbacks on reads and writes.\n * The returned writer is also a ZodvexDatabaseWriter, so `.audit()` can be chained\n * with `.withRules()`.\n *\n * Overrides Reader's signature so a writer chained call returns a writer.\n */\n override audit(config: WriterAuditConfig): ZodvexDatabaseWriter<DataModel, DecodedDocs> {\n return createAuditDatabaseWriter(this, config)\n }\n}\n\n/**\n * Creates a ZodvexDatabaseReader from a Convex DatabaseReader and a schema\n * with __zodTableMap (as returned by defineZodSchema).\n *\n * When the schema carries __decodedDocs (from defineZodSchema), DD is inferred\n * automatically, providing decoded types on query terminal methods.\n */\nexport function createZodDbReader<\n DataModel extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n>(\n db: GenericDatabaseReader<DataModel>,\n schema: { __zodTableMap: ZodTableMap; __decodedDocs?: DD }\n): ZodvexDatabaseReader<DataModel, DD> {\n return new ZodvexDatabaseReader(db, schema.__zodTableMap) as ZodvexDatabaseReader<DataModel, DD>\n}\n\n/**\n * Creates a ZodvexDatabaseWriter from a Convex DatabaseWriter and a schema\n * with __zodTableMap (as returned by defineZodSchema).\n *\n * When the schema carries __decodedDocs (from defineZodSchema), DD is inferred\n * automatically, providing decoded types on query terminal methods.\n */\nexport function createZodDbWriter<\n DataModel extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n>(\n db: GenericDatabaseWriter<DataModel>,\n schema: { __zodTableMap: ZodTableMap; __decodedDocs?: DD }\n): ZodvexDatabaseWriter<DataModel, DD> {\n return new ZodvexDatabaseWriter(db, schema.__zodTableMap) as ZodvexDatabaseWriter<DataModel, DD>\n}\n\n// Wire rules.ts subclasses now that base classes above are fully declared.\n// Safe to run at module scope — synchronous, idempotent, no promises.\ninstallRulesSubclasses({\n ZodvexQueryChain,\n ZodvexDatabaseReader,\n ZodvexDatabaseWriter\n})\n","import { ZodvexDatabaseReader, ZodvexDatabaseWriter } from './db'\nimport type { ZodTableMap } from './schema'\n\n/**\n * Creates Convex Customization objects that wrap ctx.db with codec\n * readers/writers. Returns { query, mutation } for use with\n * zCustomQuery/zCustomMutation or manual composition.\n *\n * @example\n * ```typescript\n * const codec = createZodvexCustomization(schema.__zodTableMap)\n * const authQuery = zCustomQuery(query, {\n * args: {},\n * input: async (ctx) => {\n * const codecResult = await codec.query.input(ctx, {})\n * const user = await getUserOrThrow({ ...ctx, ...codecResult.ctx })\n * return { ctx: { ...codecResult.ctx, user }, args: {} }\n * }\n * })\n * ```\n */\nexport function createZodvexCustomization(tableMap: ZodTableMap) {\n return {\n query: {\n args: {} as Record<string, never>,\n input: async (ctx: any, _args: any, _extra?: any) => ({\n ctx: { db: new ZodvexDatabaseReader(ctx.db, tableMap) },\n args: {}\n })\n },\n mutation: {\n args: {} as Record<string, never>,\n input: async (ctx: any, _args: any, _extra?: any) => ({\n ctx: { db: new ZodvexDatabaseWriter(ctx.db, tableMap) },\n args: {}\n })\n }\n }\n}\n","import type {\n ActionBuilder,\n FunctionVisibility,\n GenericActionCtx,\n GenericDataModel,\n GenericMutationCtx,\n GenericQueryCtx,\n MutationBuilder,\n QueryBuilder\n} from 'convex/server'\nimport type { PropertyValidators } from 'convex/values'\nimport type { Customization } from 'convex-helpers/server/customFunctions'\nimport { NoOp } from 'convex-helpers/server/customFunctions'\nimport type { z } from 'zod'\nimport { createZodvexActionCtx } from './actionCtx'\nimport type { CustomBuilder } from './custom'\nimport { zCustomAction, zCustomMutation, zCustomQuery } from './custom'\nimport { createZodvexCustomization } from './customization'\nimport type { ZodvexDatabaseReader, ZodvexDatabaseWriter } from './db'\nimport type { ZodTableMap } from './schema'\nimport type { AnyRegistry, Overwrite } from './types'\n\n/**\n * The context type received by query handlers when wrapDb: true.\n * Replaces ctx.db with ZodvexDatabaseReader while preserving auth, storage, etc.\n */\nexport type ZodvexQueryCtx<\n DM extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n> = Overwrite<GenericQueryCtx<DM>, { db: ZodvexDatabaseReader<DM, DD> }>\n\n/**\n * The context type received by mutation handlers when wrapDb: true.\n * Replaces ctx.db with ZodvexDatabaseWriter while preserving auth, storage, etc.\n */\nexport type ZodvexMutationCtx<\n DM extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n> = Overwrite<GenericMutationCtx<DM>, { db: ZodvexDatabaseWriter<DM, DD> }>\n\n/**\n * The context type received by action handlers.\n * Currently identical to GenericActionCtx (actions don't have ctx.db),\n * but exported for API symmetry and forward compatibility.\n */\nexport type ZodvexActionCtx<DM extends GenericDataModel> = GenericActionCtx<DM>\n\n/**\n * Empty codec context — used when the codec layer adds nothing to ctx (e.g. actions, wrapDb:false).\n *\n * MUST be {} not Record<string, never>. Record<string, never> has keyof = string (index signature),\n * causing Overwrite<Ctx, Record<string, never>> to strip all properties via Omit<Ctx, string>.\n * The {} type has keyof = never, so Overwrite passes through correctly.\n */\n// biome-ignore lint/complexity/noBannedTypes: {} is semantically correct here — see comment above\ntype NoCodecCtx = {}\n\ntype InternalCustomization = {\n args: Record<string, never>\n input: (ctx: any, args: any, extra?: any) => any\n}\n\ntype InternalCustomFn = (builder: any, customization: any) => any\n\ntype InitServerBuilders = {\n query: QueryBuilder<any, 'public'>\n mutation: MutationBuilder<any, 'public'>\n action: ActionBuilder<any, 'public'>\n internalQuery: QueryBuilder<any, 'internal'>\n internalMutation: MutationBuilder<any, 'internal'>\n internalAction: ActionBuilder<any, 'internal'>\n}\n\n/**\n * A zodvex builder: callable CustomBuilder + .withContext() for composing\n * user customizations on top of the codec layer.\n *\n * .withContext() is NOT chainable — returns a plain CustomBuilder.\n * To compose multiple customizations, compose them before passing to .withContext().\n */\nexport type ZodvexBuilder<\n FuncType extends 'query' | 'mutation' | 'action',\n CodecCtx extends Record<string, any>,\n InputCtx extends Record<string, any>,\n Visibility extends FunctionVisibility\n> = CustomBuilder<\n FuncType,\n Record<string, never>,\n CodecCtx,\n Record<string, never>,\n InputCtx,\n Visibility,\n Record<string, any>\n> & {\n withContext: <\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 customization: Customization<\n Overwrite<InputCtx, CodecCtx>,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtraArgs\n >\n ) => CustomBuilder<\n FuncType,\n CustomArgsValidator,\n Overwrite<CodecCtx, CustomCtx>,\n CustomMadeArgs,\n InputCtx,\n Visibility,\n ExtraArgs\n >\n}\n\n// Overload 1: wrapDb: false — no codec DB wrapping\nexport function initZodvex<DM extends GenericDataModel>(\n schema: { __zodTableMap: ZodTableMap },\n server: {\n query: QueryBuilder<DM, 'public'>\n mutation: MutationBuilder<DM, 'public'>\n action: ActionBuilder<DM, 'public'>\n internalQuery: QueryBuilder<DM, 'internal'>\n internalMutation: MutationBuilder<DM, 'internal'>\n internalAction: ActionBuilder<DM, 'internal'>\n },\n options: { wrapDb: false; registry?: () => AnyRegistry }\n): {\n zq: ZodvexBuilder<'query', NoCodecCtx, GenericQueryCtx<DM>, 'public'>\n zm: ZodvexBuilder<'mutation', NoCodecCtx, GenericMutationCtx<DM>, 'public'>\n za: ZodvexBuilder<'action', NoCodecCtx, GenericActionCtx<DM>, 'public'>\n ziq: ZodvexBuilder<'query', NoCodecCtx, GenericQueryCtx<DM>, 'internal'>\n zim: ZodvexBuilder<'mutation', NoCodecCtx, GenericMutationCtx<DM>, 'internal'>\n zia: ZodvexBuilder<'action', NoCodecCtx, GenericActionCtx<DM>, 'internal'>\n}\n\n// Overload 2: wrapDb: true (default) — codec DB wrapping with decoded types\n// DD (DecodedDocs) is inferred from schema.__decodedDocs, carrying the decoded\n// document types computed by DecodedDocFor<T> in defineZodSchema.\nexport function initZodvex<\n DM extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n>(\n schema: { __zodTableMap: ZodTableMap; __decodedDocs: DD },\n server: {\n query: QueryBuilder<DM, 'public'>\n mutation: MutationBuilder<DM, 'public'>\n action: ActionBuilder<DM, 'public'>\n internalQuery: QueryBuilder<DM, 'internal'>\n internalMutation: MutationBuilder<DM, 'internal'>\n internalAction: ActionBuilder<DM, 'internal'>\n },\n options?: { wrapDb?: true; registry?: () => AnyRegistry }\n): {\n zq: ZodvexBuilder<'query', { db: ZodvexDatabaseReader<DM, DD> }, GenericQueryCtx<DM>, 'public'>\n zm: ZodvexBuilder<\n 'mutation',\n { db: ZodvexDatabaseWriter<DM, DD> },\n GenericMutationCtx<DM>,\n 'public'\n >\n za: ZodvexBuilder<'action', NoCodecCtx, GenericActionCtx<DM>, 'public'>\n ziq: ZodvexBuilder<'query', { db: ZodvexDatabaseReader<DM, DD> }, GenericQueryCtx<DM>, 'internal'>\n zim: ZodvexBuilder<\n 'mutation',\n { db: ZodvexDatabaseWriter<DM, DD> },\n GenericMutationCtx<DM>,\n 'internal'\n >\n zia: ZodvexBuilder<'action', NoCodecCtx, GenericActionCtx<DM>, 'internal'>\n}\n\n// Implementation\nexport function initZodvex(\n schema: { __zodTableMap: ZodTableMap },\n server: InitServerBuilders,\n options?: { wrapDb?: boolean; registry?: () => AnyRegistry }\n) {\n const codec = createZodvexCustomization(schema.__zodTableMap)\n const noOp = createNoOpCustomization()\n const wrap = options?.wrapDb !== false\n\n const actionCust = createActionCustomization(options?.registry, noOp)\n const customizations = {\n query: wrap ? codec.query : noOp,\n mutation: wrap ? codec.mutation : noOp,\n action: actionCust\n }\n\n return createInitBuilderBundle(server, customizations)\n}\n\nfunction createNoOpCustomization(): InternalCustomization {\n return { args: {} as Record<string, never>, input: NoOp.input }\n}\n\nfunction createActionCustomization(\n registryThunk: (() => AnyRegistry) | undefined,\n noOp: InternalCustomization\n): InternalCustomization {\n if (!registryThunk) {\n return noOp\n }\n\n return {\n args: {} as Record<string, never>,\n input: async (ctx: any) => {\n const wrapped = createZodvexActionCtx(registryThunk(), ctx)\n return {\n ctx: { runQuery: wrapped.runQuery, runMutation: wrapped.runMutation },\n args: {}\n }\n }\n }\n}\n\nfunction getInitBuilderSpecs(\n server: InitServerBuilders,\n customizations: {\n query: InternalCustomization\n mutation: InternalCustomization\n action: InternalCustomization\n }\n) {\n return [\n ['zq', server.query, customizations.query, zCustomQuery],\n ['zm', server.mutation, customizations.mutation, zCustomMutation],\n ['za', server.action, customizations.action, zCustomAction],\n ['ziq', server.internalQuery, customizations.query, zCustomQuery],\n ['zim', server.internalMutation, customizations.mutation, zCustomMutation],\n ['zia', server.internalAction, customizations.action, zCustomAction]\n ] as const\n}\n\nfunction createInitBuilderBundle(\n server: InitServerBuilders,\n customizations: {\n query: InternalCustomization\n mutation: InternalCustomization\n action: InternalCustomization\n }\n) {\n const builders: Record<string, any> = {}\n\n for (const [key, rawBuilder, customization, customFn] of getInitBuilderSpecs(\n server,\n customizations\n )) {\n builders[key] = createZodvexBuilder(rawBuilder, customization, customFn as InternalCustomFn)\n }\n\n return builders\n}\n\n/**\n * Composes a codec customization with a user customization.\n * Codec input runs first (wraps ctx.db), user input runs second\n * (sees codec-wrapped ctx.db).\n *\n * Propagates onSuccess from the user's customization through the composed\n * return value so customFnBuilder can find it.\n *\n * @internal Exported for testing only -- not part of the public API.\n */\nexport function composeCustomizations(\n codecCust: InternalCustomization,\n userCust: { args?: any; input?: (ctx: any, args: any, extra?: any) => any }\n) {\n return {\n args: userCust.args ?? {},\n input: async (ctx: any, args: any, extra?: any) => {\n // 1. Codec layer: wrap ctx.db\n const codecResult = await codecCust.input(ctx, {}, extra)\n const codecCtx = { ...ctx, ...codecResult.ctx }\n\n // 2. User layer: sees codec-wrapped ctx.db\n if (!userCust.input) {\n return { ctx: codecResult.ctx, args: {} }\n }\n const userResult = await userCust.input(codecCtx, args, extra)\n\n // 3. Merge ctx/args; pass through user's onSuccess (convex-helpers convention)\n return {\n ctx: { ...codecResult.ctx, ...(userResult.ctx ?? {}) },\n args: userResult.args ?? {},\n ...(userResult.onSuccess && { onSuccess: userResult.onSuccess })\n }\n }\n }\n}\n\n/**\n * Creates a zodvex-enhanced builder: a CustomBuilder callable with\n * a .withContext() method for composing user customizations.\n *\n * .withContext() is NOT chainable — returns a plain CustomBuilder.\n * To compose multiple customizations, compose them before passing\n * to .withContext().\n *\n * @internal Exported for testing only -- not part of the public API.\n */\nexport function createZodvexBuilder(\n rawBuilder: any,\n codecCust: InternalCustomization,\n customFn: (builder: any, customization: any) => any\n) {\n const base: any = customFn(rawBuilder as any, codecCust as any)\n\n base.withContext = (userCust: any) => {\n const composed = composeCustomizations(codecCust, userCust)\n return customFn(rawBuilder as any, composed as any)\n }\n\n return base\n}\n","/**\n * Schema helpers — Pure Zod utilities for union handling and system fields.\n *\n * This module contains helpers extracted from tables.ts that have NO server\n * dependencies (no convex/server, no convex-helpers/server). They are safe\n * to import from zodvex (client-side code).\n *\n * Used by:\n * - model.ts (defineZodModel) — client-safe model definitions\n * - tables.ts (zodTable) — server-side table definitions\n */\n\nimport { z } from 'zod'\nimport {\n $ZodArray,\n $ZodDiscriminatedUnion,\n $ZodNumber,\n $ZodObject,\n type $ZodShape,\n $ZodType,\n $ZodUnion,\n clone\n} from './zod-core'\nimport { type ZxId, zx } from './zx'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Helper type for Convex system fields added to documents\n */\nexport type SystemFields<TableName extends string> = {\n _id: ZxId<TableName>\n _creationTime: $ZodNumber\n}\n\n/**\n * Maps over union options, extending each ZodObject variant with system fields.\n * Non-object variants are preserved as-is.\n */\nexport type MapSystemFields<TableName extends string, Options extends readonly $ZodType[]> = {\n [K in keyof Options]: Options[K] extends z.ZodObject<infer Shape extends $ZodShape> // zod-ok\n ? z.ZodObject<Shape & SystemFields<TableName>> // zod-ok\n : Options[K]\n}\n\n/**\n * Core-compatible version of MapSystemFields.\n * Uses $ZodObject from zod/v4/core instead of z.ZodObject from full zod. // zod-ok\n */\nexport type MapSystemFieldsCore<TableName extends string, Options extends readonly $ZodType[]> = {\n [K in keyof Options]: Options[K] extends $ZodObject<infer Shape extends $ZodShape>\n ? $ZodObject<Shape & SystemFields<TableName>>\n : Options[K]\n}\n\n/**\n * Computes the result of adding system fields to a union/object schema.\n * Uses only $Zod* types from zod/v4/core — safe for shared code and mini consumers.\n *\n * Handles:\n * - $ZodObject → $ZodObject with system fields\n * - $ZodUnion → $ZodUnion with system fields on each variant\n * - $ZodDiscriminatedUnion → $ZodDiscriminatedUnion with system fields on each variant\n * - Other → returned as-is\n */\nexport type AddSystemFieldsToUnion<TableName extends string, Schema extends $ZodType> =\n Schema extends $ZodObject<infer Shape extends $ZodShape>\n ? $ZodObject<Shape & SystemFields<TableName>>\n : Schema extends $ZodUnion<infer Options extends readonly $ZodType[]>\n ? $ZodUnion<MapSystemFieldsCore<TableName, Options>>\n : Schema extends $ZodDiscriminatedUnion<\n infer Options extends readonly $ZodType[],\n infer Disc extends string\n >\n ? $ZodDiscriminatedUnion<MapSystemFieldsCore<TableName, Options>, Disc>\n : Schema\n\n/**\n * Minimum tuple type required by z.union() - at least 2 elements.\n */\ntype UnionTuple<T extends $ZodType = $ZodType> = readonly [T, T, ...T[]]\n\n// ============================================================================\n// Union Helpers - Type-safe utilities for working with Zod unions\n// ============================================================================\n\n/** Full-zod union type alias used by isZodUnion/getUnionOptions — zod-ok by design. */\ntype AnyZodUnion =\n // zod-ok\n | z.ZodUnion<readonly $ZodType[]> // zod-ok\n | z.ZodDiscriminatedUnion<readonly z.ZodObject<$ZodShape>[], string> // zod-ok\n\n/**\n * Type guard to check if a schema is a union type (ZodUnion or ZodDiscriminatedUnion).\n */\nexport function isZodUnion(schema: $ZodType): schema is AnyZodUnion {\n return schema instanceof $ZodUnion || schema instanceof $ZodDiscriminatedUnion\n}\n\n/**\n * Extracts the options array from a ZodUnion or ZodDiscriminatedUnion.\n * Both union types have an `.options` property, but TypeScript doesn't\n * create a common accessor after instanceof checks.\n *\n * @param schema - A ZodUnion or ZodDiscriminatedUnion schema\n * @returns The array of union variant schemas\n */\nexport function getUnionOptions(schema: AnyZodUnion): readonly $ZodType[] {\n // $ZodDiscriminatedUnion extends $ZodUnion, so this covers both\n if (schema instanceof $ZodUnion) {\n return schema._zod.def.options\n }\n // cast: unreachable due to the union type constraint, but satisfies return type\n return (schema as any)._zod.def.options\n}\n\n/**\n * Asserts that an array has at least 2 elements, as required by z.union().\n * Throws an error if the array has fewer than 2 elements.\n *\n * @param options - Array of Zod schemas\n * @throws Error if array has fewer than 2 elements\n */\nexport function assertUnionOptions<T extends $ZodType>(\n options: readonly T[]\n): asserts options is UnionTuple<T> {\n if (options.length < 2) {\n throw new Error(\n `z.union() requires at least 2 options, but received ${options.length}. ` +\n 'This indicates an invalid union schema was passed to zodTable().'\n )\n }\n}\n\n/**\n * Creates a z.union() from an array of options with runtime validation.\n * Ensures the array has at least 2 elements as required by Zod.\n *\n * @param options - Array of Zod schemas (must have at least 2 elements)\n * @returns A ZodUnion schema\n * @throws Error if array has fewer than 2 elements\n */\n// Return type alias — prevents z.ZodUnion on a {-ending line (formatter-safe). // zod-ok\ntype ZodUnionOf<T extends $ZodType> = z.ZodUnion<UnionTuple<T>> // zod-ok\n\nexport function createUnionFromOptions<T extends $ZodType>(options: readonly T[]): ZodUnionOf<T> {\n assertUnionOptions(options)\n return z.union(options)\n}\n\n/**\n * Adds Convex system fields (_id, _creationTime) to a Zod schema.\n *\n * For object schemas: extends with system fields\n * For union schemas: adds system fields to each variant\n *\n * @param tableName - The Convex table name\n * @param schema - The Zod schema (object or union)\n * @returns Schema with system fields added\n */\n// Overload 1: ZodObject - extends with system fields\nexport function addSystemFields<TableName extends string, Shape extends $ZodShape>(\n tableName: TableName,\n schema: z.ZodObject<Shape> // zod-ok\n): z.ZodObject<Shape & SystemFields<TableName>> // zod-ok\n\n// Overload 2: ZodUnion - maps system fields to each variant\nexport function addSystemFields<TableName extends string, Options extends readonly $ZodType[]>(\n tableName: TableName,\n schema: z.ZodUnion<Options> // zod-ok\n): z.ZodUnion<MapSystemFields<TableName, Options>> // zod-ok\n\n// Overload 3: ZodDiscriminatedUnion - maps system fields preserving discriminator\n// Note: Zod v4 signature is ZodDiscriminatedUnion<Options, Discriminator>\nexport function addSystemFields<\n TableName extends string,\n Options extends readonly z.ZodObject<$ZodShape>[], // zod-ok\n Discriminator extends string\n>(\n tableName: TableName,\n schema: z.ZodDiscriminatedUnion<Options, Discriminator> // zod-ok\n): z.ZodDiscriminatedUnion<MapSystemFields<TableName, Options>, Discriminator> // zod-ok\n\n// Overload 4: Fallback for other ZodTypes - returns as-is\nexport function addSystemFields<TableName extends string, S extends $ZodType>(\n tableName: TableName,\n schema: S\n): S\n\n// Implementation\nexport function addSystemFields<TableName extends string>(\n tableName: TableName,\n schema: $ZodType\n): $ZodType {\n // Handle union schemas - add system fields to each variant\n if (isZodUnion(schema)) {\n const originalOptions = getUnionOptions(schema)\n const extendedOptions = originalOptions.map((variant: $ZodType) => {\n if (variant instanceof $ZodObject) {\n const newShape = {\n ...variant._zod.def.shape,\n _id: zx.id(tableName),\n _creationTime: z.number()\n }\n // Clone preserves the original's class + reinitializes with merged def\n return clone(variant, { ...variant._zod.def, shape: newShape })\n }\n // Non-object variants are returned as-is (shouldn't happen in practice)\n return variant\n })\n return createUnionFromOptions(extendedOptions)\n }\n\n // Handle object schemas — clone preserves class, checks, catchall, error\n if (schema instanceof $ZodObject) {\n const newShape = { ...schema._zod.def.shape, _id: zx.id(tableName), _creationTime: z.number() }\n return clone(schema, { ...schema._zod.def, shape: newShape })\n }\n\n // Fallback: return schema as-is\n return schema\n}\n","import { z } from 'zod'\nimport {\n addSystemFields,\n createUnionFromOptions,\n getUnionOptions,\n isZodUnion\n} from './schemaHelpers'\nimport { $ZodNullable, $ZodObject, $ZodOptional, type $ZodShape, $ZodType } from './zod-core'\nimport { zx } from './zx'\n\n// Return type alias so helper signatures don't expose full zod internals everywhere.\ntype AnyOptional = z.ZodOptional<any> // zod-ok\n\nexport type RuntimeModelSchemaBundle = {\n readonly doc: $ZodType\n readonly base: $ZodType\n readonly insert: $ZodType\n readonly update: $ZodType\n readonly docArray: $ZodType\n readonly paginatedDoc: $ZodType\n}\n\n/** Wrap in .optional() only if not already optional. Uses core constructor for zod-mini compat. */\nfunction ensureOptional(schema: $ZodType): AnyOptional {\n if (schema instanceof $ZodOptional) return schema as z.ZodOptional<any> // zod-ok\n return new $ZodOptional({ type: 'optional', innerType: schema }) as z.ZodOptional<any> // zod-ok\n}\n\n/** Wrap in .nullable().optional() using core constructors for zod-mini compat. */\nfunction nullableOptional(schema: $ZodType): $ZodType {\n return new $ZodOptional({\n type: 'optional',\n innerType: new $ZodNullable({ type: 'nullable', innerType: schema })\n }) as any\n}\n\nexport function createPartialShape(shape: Record<string, $ZodType>): Record<string, $ZodType> {\n const partialShape: Record<string, $ZodType> = {}\n for (const [key, value] of Object.entries(shape)) {\n partialShape[key] = ensureOptional(value)\n }\n return partialShape\n}\n\nexport function createUpdateObjectSchema<Name extends string>(\n name: Name,\n shape: Record<string, $ZodType>\n): z.ZodObject<any> {\n return z.object({\n _id: zx.id(name),\n _creationTime: z.optional(z.number()),\n ...createPartialShape(shape)\n })\n}\n\nexport function createPaginatedDocSchema(docSchema: $ZodType): z.ZodObject<any> {\n return z.object({\n page: z.array(docSchema),\n isDone: z.boolean(),\n continueCursor: z.string(),\n splitCursor: nullableOptional(z.string()),\n pageStatus: nullableOptional(z.enum(['SplitRecommended', 'SplitRequired']))\n })\n}\n\nexport function createObjectSchemaBundle<Name extends string>(\n name: Name,\n fields: $ZodShape,\n baseSchema: z.ZodObject<any> = z.object(fields)\n): RuntimeModelSchemaBundle {\n const docSchema = addSystemFields(name, baseSchema)\n\n return {\n doc: docSchema,\n base: baseSchema,\n insert: baseSchema,\n update: createUpdateObjectSchema(name, fields),\n docArray: z.array(docSchema),\n paginatedDoc: createPaginatedDocSchema(docSchema)\n }\n}\n\nexport function createSchemaUpdateSchema<Name extends string>(\n name: Name,\n inputSchema: $ZodType\n): $ZodType {\n if (isZodUnion(inputSchema)) {\n const updateOptions = getUnionOptions(inputSchema).map((variant: $ZodType) => {\n if (variant instanceof $ZodObject) {\n return createUpdateObjectSchema(name, variant._zod.def.shape)\n }\n return variant\n })\n return createUnionFromOptions(updateOptions)\n }\n\n if (inputSchema instanceof $ZodObject) {\n return createUpdateObjectSchema(name, inputSchema._zod.def.shape)\n }\n\n return inputSchema\n}\n\nexport function createSchemaBundle<Name extends string>(\n name: Name,\n inputSchema: $ZodType\n): RuntimeModelSchemaBundle {\n const docSchema = addSystemFields(name, inputSchema)\n\n return {\n doc: docSchema,\n base: inputSchema,\n insert: inputSchema,\n update: createSchemaUpdateSchema(name, inputSchema),\n docArray: z.array(docSchema),\n paginatedDoc: createPaginatedDocSchema(docSchema)\n }\n}\n","/**\n * zx - zodvex extended validators\n *\n * A namespace for zodvex-specific validators and codecs that handle\n * Convex wire format transformations. The \"zx\" prefix signals:\n * - \"zodvex\" or \"zod + convex\" extended types\n * - Explicit transformations (not magic)\n * - Discoverable via IDE autocomplete on `zx.`\n *\n * @example\n * ```typescript\n * import { z } from 'zod'\n * import { zx } from 'zodvex'\n *\n * const userShape = {\n * name: z.string(), // Standard Zod\n * createdAt: zx.date(), // zodvex: Date ↔ timestamp\n * teamId: zx.id('teams'), // zodvex: Convex ID\n * }\n * ```\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\nimport { zodvexCodec } from './codec'\nimport { registryHelpers } from './ids'\nimport { createSchemaUpdateSchema } from './modelSchemaBundle'\nimport { addSystemFields } from './schemaHelpers'\nimport type { ZodvexCodec } from './types'\nimport {\n type $ZodCustom,\n $ZodNullable,\n type $ZodNumber,\n $ZodOptional,\n type $ZodType,\n $ZodType as $ZodTypeValue,\n type output as zoutput\n} from './zod-core'\n\n/**\n * Date codec type for explicit type annotations\n */\nexport type FullZodvexCodec<W extends $ZodType, R extends $ZodType> = z.ZodCodec<W, R> &\n ZodvexCodec<W, R>\n\nexport type ZxDate = FullZodvexCodec<$ZodNumber, $ZodCustom<Date, Date>>\n\n/**\n * Creates a Date codec that transforms between Date objects and timestamps.\n *\n * Wire format: number (Unix timestamp in milliseconds)\n * Runtime format: Date object\n *\n * @example\n * ```typescript\n * const schema = z.object({\n * createdAt: zx.date(),\n * updatedAt: zx.date().optional(),\n * })\n * ```\n */\nfunction date(): ZxDate {\n return zodvexCodec(\n z.number(), // Wire: timestamp\n z.custom<Date>(val => val instanceof Date, {\n message: 'Expected Date instance'\n }),\n {\n decode: (timestamp: number) => new Date(timestamp),\n encode: (date: Date) => date.getTime()\n }\n ) as unknown as ZxDate\n}\n\n/**\n * ID type for explicit type annotations\n */\nexport type ZxId<TableName extends string> = z.ZodString &\n z.ZodType<GenericId<TableName>> & {\n _tableName: TableName\n }\n\n/**\n * Creates a Convex ID validator for a specific table.\n *\n * Wire format: string (Convex ID)\n * Runtime format: GenericId<TableName> (branded string type)\n *\n * Note: Unlike zx.date(), IDs don't require runtime transformation since\n * GenericId<T> is a branded string type. The branding is purely type-level.\n *\n * @param tableName - The Convex table name for this ID\n *\n * @example\n * ```typescript\n * const schema = z.object({\n * userId: zx.id('users'),\n * teamId: zx.id('teams').optional(),\n * })\n * ```\n */\nfunction id<TableName extends string>(tableName: TableName): ZxId<TableName> {\n // Create base string validator with refinement\n const baseSchema = z.string().check(\n z.refine(val => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n }),\n z.describe(`convexId:${tableName}`)\n )\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 ZxId<TableName>\n}\n\n/**\n * Creates a custom codec for transforming between wire and runtime formats.\n *\n * Use this when you need custom transformations beyond the built-in helpers.\n *\n * @param wire - Zod schema for the wire format (stored in Convex)\n * @param runtime - Zod schema for the runtime format (used in code)\n * @param transforms - Encode/decode functions\n *\n * @example\n * ```typescript\n * // Encrypted data codec\n * const encryptedString = zx.codec(\n * z.object({ encrypted: z.string() }), // Wire format\n * z.custom<string>(() => true), // Runtime format\n * {\n * decode: (wire) => decrypt(wire.encrypted),\n * encode: (value) => ({ encrypted: encrypt(value) })\n * }\n * )\n * ```\n */\nfunction codec<W extends $ZodType, R extends $ZodType, WO = zoutput<W>, RI = zoutput<R>>(\n wire: W,\n runtime: R,\n transforms: {\n decode: (wire: WO) => RI\n encode: (runtime: RI) => WO\n }\n): FullZodvexCodec<W, R> {\n return zodvexCodec(wire, runtime, transforms) as unknown as FullZodvexCodec<W, R>\n}\n\n/**\n * Minimal model shape accepted by zx helpers.\n * Both full and slim models satisfy this at runtime.\n */\ntype ZxModelInput = {\n readonly name: string\n readonly fields: Record<string, $ZodType>\n readonly schema?: unknown\n}\n\n/**\n * Per-model caches so repeated `zx.doc(model)` / `zx.base(model)` / etc. calls\n * across call sites share a single Zod schema instance.\n *\n * Caches are keyed on a stable identity that survives chain methods\n * (`.index()`, `.searchIndex()`, `.vectorIndex()`), which return new model\n * objects but preserve `fields` (object slim) and `schema` (union slim) by\n * reference. Keying on the model object would force every chain step to\n * re-allocate.\n *\n * Full models bypass these caches entirely — they carry a pre-built schema\n * bundle, and `zx.*(fullModel)` returns the bundle's schema directly so\n * identity matches `fullModel.schema.{doc,base,...}`.\n *\n * The cache maps are pinned to `globalThis` under a `Symbol.for` registry so\n * multiple bundled copies of this module share state. tsup splits each entry\n * into its own bundle (CLI, codegen, main, server, …), duplicating this file\n * per entry. Without the shared registry, `zx.doc(Model)` in user code\n * (loaded from `dist/index.js`) and `zx.doc(ref)` in codegen (loaded from\n * `dist/cli/index.js`) would write to distinct WeakMaps, producing different\n * instances for the same model — identity matching would silently fail.\n */\nfunction sharedWeakMap(name: string): WeakMap<object, $ZodType> {\n const key = Symbol.for(`zodvex.zx.cache.${name}`)\n const g = globalThis as unknown as Record<symbol, WeakMap<object, $ZodType>>\n const existing = g[key]\n if (existing) return existing\n const created = new WeakMap<object, $ZodType>()\n g[key] = created\n return created\n}\n\nconst baseCache = sharedWeakMap('base')\nconst docCache = sharedWeakMap('doc')\nconst updateCache = sharedWeakMap('update')\nconst docArrayCache = sharedWeakMap('docArray')\n\n/**\n * Stable cache key for slim models:\n * - union slim → the user-supplied schema (preserved across chains)\n * - object slim → the fields record (preserved across chains)\n */\nfunction slimCacheKey(model: ZxModelInput): object {\n const s = model.schema as any\n return s instanceof $ZodTypeValue ? s : model.fields\n}\n\n/**\n * Returns the base schema for a model — the user fields as a Zod object (or the\n * user-supplied union for discriminated-union models).\n *\n * Full models: returns the bundle's pre-built `.base` (no allocation).\n * Union slim: returns the user's schema (no allocation — it IS the base).\n * Object slim: builds `z.object(fields)` once, cached on `fields`.\n */\nfunction base(model: ZxModelInput): $ZodType {\n const s = model.schema as any\n if (s?.base instanceof $ZodTypeValue) return s.base\n if (s instanceof $ZodTypeValue) return s\n const cached = baseCache.get(model.fields)\n if (cached) return cached\n if (Object.keys(model.fields).length === 0) {\n throw new Error(`[zodvex] Cannot derive base schema for model '${model.name}'`)\n }\n const built = z.object(model.fields) as any\n baseCache.set(model.fields, built)\n return built\n}\n\n/**\n * Constructs a doc schema: base fields + _id + _creationTime.\n * Full models reuse `model.schema.doc`; slim models cache on slimCacheKey(model).\n */\nfunction doc(model: ZxModelInput) {\n const s = model.schema as any\n if (s?.doc instanceof $ZodTypeValue) return s.doc\n const key = slimCacheKey(model)\n const cached = docCache.get(key)\n if (cached) return cached\n const built = addSystemFields(model.name, base(model)) as any\n docCache.set(key, built)\n return built\n}\n\n/**\n * Constructs an update schema: _id required + _creationTime optional + all user fields optional.\n * Full models reuse `model.schema.update`; slim models cache on slimCacheKey(model).\n */\nfunction update(model: ZxModelInput) {\n const s = model.schema as any\n if (s?.update instanceof $ZodTypeValue) return s.update\n const key = slimCacheKey(model)\n const cached = updateCache.get(key)\n if (cached) return cached\n const built = createSchemaUpdateSchema(model.name, base(model)) as any\n updateCache.set(key, built)\n return built\n}\n\n/**\n * Constructs a doc array schema: z.array(doc(model)).\n * Full models reuse `model.schema.docArray`; slim models cache on slimCacheKey(model).\n */\nfunction docArray(model: ZxModelInput) {\n const s = model.schema as any\n if (s?.docArray instanceof $ZodTypeValue) return s.docArray\n const key = slimCacheKey(model)\n const cached = docArrayCache.get(key)\n if (cached) return cached\n const built = z.array(doc(model)) as any\n docArrayCache.set(key, built)\n return built\n}\n\n/** Wrap in .nullable() using core constructor for zod-mini compat. */\nfunction nullable(schema: $ZodType): $ZodType {\n return new $ZodNullable({ type: 'nullable', innerType: schema }) as any\n}\n\n/** Wrap in .optional() using core constructor for zod-mini compat. */\nfunction optional(schema: $ZodType): $ZodType {\n return new $ZodOptional({ type: 'optional', innerType: schema }) as any\n}\n\n/** Wrap in .nullable().optional() using core constructors for zod-mini compat. */\nfunction nullableOptional(schema: $ZodType): $ZodType {\n return optional(nullable(schema))\n}\n\n/**\n * Pagination options schema — matches Convex's PaginationOptions type.\n */\nfunction paginationOpts() {\n return z.object({\n numItems: z.number(),\n cursor: nullable(z.string()),\n endCursor: nullableOptional(z.string()),\n id: optional(z.number()),\n maximumRowsRead: optional(z.number()),\n maximumBytesRead: optional(z.number())\n })\n}\n\n/**\n * Paginated result schema — wraps any item schema in Convex's PaginationResult shape.\n */\nfunction paginationResult<T extends $ZodType>(itemSchema: T) {\n return z.object({\n page: z.array(itemSchema),\n isDone: z.boolean(),\n continueCursor: z.string(),\n splitCursor: nullableOptional(z.string()),\n pageStatus: nullableOptional(z.enum(['SplitRecommended', 'SplitRequired']))\n })\n}\n\n/**\n * zx namespace - zodvex extended validators\n *\n * Provides explicit, discoverable helpers for Convex-specific transformations.\n */\nexport const zx = {\n /**\n * Date ↔ timestamp codec\n * @see {@link date}\n */\n date,\n\n /**\n * Convex ID validator\n * @see {@link id}\n */\n id,\n\n /**\n * Custom codec builder\n * @see {@link codec}\n */\n codec,\n\n /**\n * Pagination options schema matching Convex's PaginationOptions type\n * @see {@link paginationOpts}\n */\n paginationOpts,\n\n /**\n * Paginated result schema wrapping any item schema in Convex's PaginationResult shape\n * @see {@link paginationResult}\n */\n paginationResult,\n\n /**\n * Base schema for a model (user fields only; no system fields).\n * For object models reconstructs from fields; for union models returns the\n * user-supplied union. Cached per-model.\n * @see {@link base}\n */\n base,\n\n /**\n * Doc schema: model fields + _id + _creationTime\n * @see {@link doc}\n */\n doc,\n\n /**\n * Update schema: _id required, all other fields optional\n * @see {@link update}\n */\n update,\n\n /**\n * Doc array schema: z.array(doc(model))\n * @see {@link docArray}\n */\n docArray\n} as const\n","import {\n type DataModelFromSchemaDefinition,\n defineSchema,\n defineTable,\n type NamedTableInfo,\n type TableDefinition,\n type TableNamesInDataModel\n} from 'convex/server'\nimport type { ObjectType, VObject } from 'convex/values'\nimport type { ZodvexFilterBuilder } from './db'\nimport {\n type ConvexValidatorFromZod,\n type ConvexValidatorFromZodFieldsAuto,\n zodToConvex,\n zodToConvexFields\n} from './mapping'\nimport { readMeta, type ZodvexModelMeta } from './meta'\nimport type { AnyZodModel, AnyZodModelBase, SearchIndexConfig, VectorIndexConfig } from './model'\nimport type {\n $ZodDiscriminatedUnion,\n $ZodShape,\n $ZodType,\n $ZodUnion,\n output as zoutput\n} from './zod-core'\nimport { zx } from './zx'\n\n/**\n * The runtime schema slice the DB wrapper needs for a single table:\n * - `doc` — decode shape for reads (full doc with system fields)\n * - `insert` — encode shape for writes (user fields only)\n *\n * Other derived schemas (`update`, `docArray`, `paginatedDoc`, `base`) are not\n * retained here — they're constructed on demand via `zx.*` at use sites, with\n * per-model WeakMap caches deduplicating across call sites. This keeps\n * `zodTableMap` minimal for the Convex 64MB isolate budget.\n */\nexport type ZodTableSchemas = {\n doc: $ZodType\n insert: $ZodType\n}\n\n/**\n * Maps table names to their full schema set.\n * Used by ZodvexDatabaseReader/Writer to look up decode/encode schemas.\n */\nexport type ZodTableMap = Record<string, ZodTableSchemas>\n\n// Accept any zodTable() result shape — both object-shape and union overloads\ntype ZodTableEntry = {\n table: any\n schema: ZodTableSchemas\n}\n\n// Accept defineZodModel() results — constrained against the base type\n// so both full models (with schema bundle) and slim models work.\nexport type ZodModelEntry = AnyZodModelBase\n\ntype ZodSchemaEntry = ZodTableEntry | ZodModelEntry\n\nfunction isZodModelEntry(entry: ZodSchemaEntry): entry is ZodModelEntry {\n return readMeta(entry)?.type === 'model'\n}\n\nfunction getZodModelMeta(model: ZodModelEntry): ZodvexModelMeta {\n const meta = readMeta(model)\n if (!meta || meta.type !== 'model') {\n throw new Error(`Model '${model.name}' is missing zodvex model metadata.`)\n }\n return meta\n}\n\n// ============================================================================\n// Type-level table definition computation\n// ============================================================================\n\n/**\n * Compute the Convex TableDefinition type for a single schema entry.\n *\n * - zodTable entries: extract the already-typed .table property.\n * At the call site, T[K] preserves the specific zodTable return type\n * (not the widened ZodTableEntry), so `infer` captures the full\n * TableDefinition<VObject<...>> type.\n *\n * - defineZodModel entries: compute from fields/schema + indexes.\n * This mirrors what tableFromModel() + defineTable() do at runtime.\n * For union models (schema.base extends $ZodUnion | $ZodDiscriminatedUnion),\n * uses ConvexValidatorFromZod<Base> (produces VUnion) instead of\n * ConvexValidatorFromZodFieldsAuto<F> (which would see empty fields).\n * Indexes are converted from readonly tuples to mutable (Convex's format).\n */\ntype ConvexTableFor<E> =\n // zodTable entry — extract .table with full VObject type\n E extends { table: infer T extends TableDefinition }\n ? T\n : // Full model entry — schema is nested bundle with .base\n E extends {\n fields: infer F extends Record<string, $ZodType>\n schema: { base: infer Base extends $ZodType }\n indexes: infer I extends Record<string, readonly string[]>\n searchIndexes: infer SI extends Record<string, SearchIndexConfig>\n vectorIndexes: infer VI extends Record<string, VectorIndexConfig>\n }\n ? Base extends $ZodUnion<any> | $ZodDiscriminatedUnion<any, any>\n ? TableDefinition<\n ConvexValidatorFromZod<Base, 'required'>,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : TableDefinition<\n VObject<\n ObjectType<ConvexValidatorFromZodFieldsAuto<F>>,\n ConvexValidatorFromZodFieldsAuto<F>\n >,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : // Slim union model entry — `schema` is the bare $ZodType (user-supplied union)\n E extends {\n fields: infer F extends Record<string, $ZodType>\n schema: infer Base extends $ZodType\n indexes: infer I extends Record<string, readonly string[]>\n searchIndexes: infer SI extends Record<string, SearchIndexConfig>\n vectorIndexes: infer VI extends Record<string, VectorIndexConfig>\n }\n ? Base extends $ZodUnion<any> | $ZodDiscriminatedUnion<any, any>\n ? TableDefinition<\n ConvexValidatorFromZod<Base, 'required'>,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : TableDefinition<\n VObject<\n ObjectType<ConvexValidatorFromZodFieldsAuto<F>>,\n ConvexValidatorFromZodFieldsAuto<F>\n >,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : // Slim object model entry — no `schema` property; derive from fields.\n E extends {\n fields: infer F extends Record<string, $ZodType>\n indexes: infer I extends Record<string, readonly string[]>\n searchIndexes: infer SI extends Record<string, SearchIndexConfig>\n vectorIndexes: infer VI extends Record<string, VectorIndexConfig>\n }\n ? TableDefinition<\n VObject<\n ObjectType<ConvexValidatorFromZodFieldsAuto<F>>,\n ConvexValidatorFromZodFieldsAuto<F>\n >,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : TableDefinition\n\n/**\n * Map all entries to their Convex TableDefinition types.\n * This is the type-level equivalent of the runtime loop that builds convexTables.\n */\ntype ConvexTablesFrom<T extends Record<string, ZodSchemaEntry>> = {\n [K in keyof T & string]: ConvexTableFor<T[K]>\n}\n\n/**\n * Computes decoded (runtime) document types for each table from the schema entry types.\n * Uses z.output<> on each table's doc schema, which resolves codec transforms\n * (e.g., zx.date() wire number → runtime Date).\n *\n * This is a phantom type — it exists only for TypeScript inference, never accessed at runtime.\n * Handles both full models (schema bundle with .doc) and slim models (no schema bundle)\n * by falling through to `any` when the schema shape doesn't match.\n */\nexport type DecodedDocFor<T extends Record<string, ZodSchemaEntry>> = {\n [K in keyof T & string]: T[K] extends { schema: { doc: infer D extends $ZodType } }\n ? zoutput<D>\n : T[K] extends { doc: infer D extends $ZodType }\n ? zoutput<D>\n : any\n}\n\n// ============================================================================\n// Runtime helpers\n// ============================================================================\n\n/**\n * Creates a Convex table definition from a ZodModel's fields and index metadata.\n */\nfunction tableFromModel(model: ZodModelEntry) {\n const meta = getZodModelMeta(model)\n const usesBaseSchema =\n meta.definitionSource === 'schema' ||\n (meta.definitionSource == null && Object.keys(model.fields).length === 0)\n\n let table = usesBaseSchema\n ? defineTable(zodToConvex(zx.base(model as any)) as any)\n : defineTable(zodToConvexFields(model.fields))\n\n for (const [indexName, indexFields] of Object.entries(model.indexes)) {\n // defineZodModel appends _creationTime to stored index fields,\n // but Convex adds it automatically — strip it\n const userFields = indexFields.filter(f => f !== '_creationTime')\n table = table.index(indexName, userFields as any)\n }\n\n for (const [indexName, config] of Object.entries(model.searchIndexes)) {\n table = table.searchIndex(indexName, config as any)\n }\n\n for (const [indexName, config] of Object.entries(model.vectorIndexes)) {\n table = table.vectorIndex(indexName, config as any)\n }\n\n return table\n}\n\n// ============================================================================\n// defineZodSchema\n// ============================================================================\n\n/**\n * Wraps Convex's defineSchema() and captures zodTable/model references.\n * The returned object is a valid Convex schema AND carries __zodTableMap\n * for use by createZodDbReader/createZodDbWriter.\n *\n * Accepts either zodTable() results or defineZodModel() results.\n * When given a model, creates the Convex table definition from the\n * model's fields and applies its index metadata.\n *\n * Type preservation: the ConvexTablesFrom<T> mapped type computes the\n * full TableDefinition<VObject<...>> for each entry, so defineSchema\n * receives specific document types and index metadata. This ensures\n * DataModelFromSchemaDefinition produces a DataModel with typed documents,\n * field paths, and index constraints — required for ctx.db and withIndex\n * type safety.\n *\n * @example With defineZodModel\n * ```typescript\n * // convex/schema.ts\n * import { UserModel } from './models/user'\n * import { TaskModel } from './models/task'\n *\n * export default defineZodSchema({\n * users: UserModel,\n * tasks: TaskModel,\n * })\n * ```\n *\n * @example With zodTable (legacy)\n * ```typescript\n * export default defineZodSchema({\n * users: Users, // zodTable() result\n * posts: Posts,\n * })\n * ```\n */\nexport function defineZodSchema<T extends Record<string, ZodSchemaEntry>>(tables: T) {\n const convexTables: Record<string, any> = {}\n const zodTableMap: ZodTableMap = {}\n\n for (const [name, entry] of Object.entries(tables)) {\n if (isZodModelEntry(entry)) {\n if (entry.name !== name) {\n throw new Error(\n `Model name '${entry.name}' does not match key '${name}'. ` +\n `The model name must match the key in the schema definition.`\n )\n }\n convexTables[name] = tableFromModel(entry)\n\n // Only `doc` (read decode) and `insert` (write encode) are consumed at\n // runtime by the DB wrapper. Full models already carry `meta.schemas.doc`\n // and `meta.schemas.insert` — alias them (no allocation). Slim models go\n // through cached zx helpers, so `doc`/`base` allocate at most once each.\n const meta = getZodModelMeta(entry)\n if (meta.schemas) {\n zodTableMap[name] = {\n doc: meta.schemas.doc,\n insert: meta.schemas.insert\n }\n } else {\n zodTableMap[name] = {\n doc: zx.doc(entry),\n insert: zx.base(entry)\n }\n }\n } else {\n convexTables[name] = entry.table\n // zodTable produces a 6-schema bundle; we only need doc + insert.\n zodTableMap[name] = {\n doc: entry.schema.doc,\n insert: entry.schema.insert\n }\n }\n }\n\n // Runtime builds convexTables dynamically (loop erases types).\n // ConvexTablesFrom<T> restores the full TableDefinition types that\n // defineSchema needs to produce a properly-typed DataModel.\n const convexSchema = defineSchema(convexTables as ConvexTablesFrom<T>)\n\n const result = Object.assign(convexSchema, { __zodTableMap: zodTableMap })\n return result as typeof result & { __decodedDocs: DecodedDocFor<T> }\n}\n\n// ============================================================================\n// Schema-derived helper types\n// ============================================================================\n\n/** Extract the DataModel from a defineZodSchema result */\nexport type InferDataModel<Schema extends ReturnType<typeof defineZodSchema>> =\n DataModelFromSchemaDefinition<Schema>\n\n/** Extract TableInfo for a specific table */\nexport type InferTableInfo<\n Schema extends ReturnType<typeof defineZodSchema>,\n TableName extends TableNamesInDataModel<InferDataModel<Schema>>\n> = NamedTableInfo<InferDataModel<Schema>, TableName>\n\n/** Extract the decoded document type for a specific table */\nexport type InferDecodedDoc<\n Schema extends ReturnType<typeof defineZodSchema>,\n TableName extends TableNamesInDataModel<InferDataModel<Schema>>\n> = Schema extends { __decodedDocs: infer DD }\n ? TableName extends keyof DD\n ? DD[TableName]\n : never\n : never\n\n/** A ZodvexFilterBuilder typed for a specific table */\nexport type InferFilterBuilder<\n Schema extends ReturnType<typeof defineZodSchema>,\n TableName extends TableNamesInDataModel<InferDataModel<Schema>>\n> = ZodvexFilterBuilder<InferTableInfo<Schema, TableName>, InferDecodedDoc<Schema, TableName>>\n","import { defineTable } from 'convex/server'\nimport type { GenericId } from 'convex/values'\nimport { Table } from 'convex-helpers/server'\nimport { z } from 'zod'\nimport {\n type ConvexValidatorFromZodFieldsAuto,\n zodToConvex,\n zodToConvexFields\n} from '../internal/mapping'\nimport { createObjectSchemaBundle, createSchemaBundle } from '../internal/modelSchemaBundle'\nimport { addSystemFields, type MapSystemFields, type SystemFields } from '../internal/schemaHelpers'\nimport { $ZodObject, type $ZodShape, $ZodType } from '../internal/zod-core'\nimport { type ZxId, zx } from '../internal/zx'\n\n/**\n * System fields added to Convex documents.\n */\ntype DocSystemFields<TableName extends string> = {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n}\n/**\n * Type for validators that can be used with Convex's defineTable.\n *\n * Convex's defineTable expects Validator<Record<string, any>, \"required\", any>,\n * but zodToConvex returns more specific types that TypeScript can't verify are\n * compatible. This type represents validators that produce object documents.\n *\n * @internal\n */\ntype TableValidator = Parameters<typeof defineTable>[0]\n\n/**\n * Asserts that a Convex validator can be used to define a table.\n *\n * This is needed because zodToConvex returns a specific validator type (like VUnion)\n * that TypeScript can't verify is assignable to defineTable's expected input type,\n * even though all union variants are objects that produce Record<string, any>.\n *\n * The runtime behavior is correct - Convex supports union validators in tables.\n * This is purely a TypeScript limitation with complex mapped types.\n *\n * @internal\n */\nfunction asTableValidator<V extends { kind: string }>(validator: V): TableValidator {\n return validator as unknown as TableValidator\n}\n\n/**\n * Creates a Zod schema for a Convex document with system fields.\n * Spreads the original def to preserve catchall, checks, and error settings.\n *\n * @deprecated Use `defineZodModel` instead. See `docs/migration/v0.6.md`.\n *\n * @param tableName - The Convex table name\n * @param schema - The Zod object schema for user fields\n * @returns A Zod object schema with _id and _creationTime added\n */\nexport function zodDoc<TableName extends string, Shape extends $ZodShape>(\n tableName: TableName,\n schema: z.ZodObject<Shape>\n): z.ZodObject<Shape & DocSystemFields<TableName>> {\n return addSystemFields(tableName, schema) as z.ZodObject<Shape & DocSystemFields<TableName>>\n}\n\n/**\n * @deprecated Use `defineZodModel` instead. See `docs/migration/v0.6.md`.\n */\nexport function zodDocOrNull<\n TableName extends string,\n Shape extends $ZodShape,\n Schema extends z.ZodObject<Shape>\n>(tableName: TableName, schema: Schema) {\n return z.union([zodDoc(tableName, schema), z.null()])\n}\n\n/**\n * Helper to detect if input is an object shape (plain object with Zod validators)\n */\nfunction isObjectShape(input: any): input is Record<string, $ZodType> {\n // Check if it's a plain object (not a Zod instance)\n if (!input || typeof input !== 'object') return false\n\n // If it's a Zod instance, it's not an object shape\n if (input instanceof $ZodType) return false\n\n // Check if all values are Zod types\n for (const key in input) {\n if (!(input[key] instanceof $ZodType)) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Defines a Convex table using either:\n * - A raw Zod shape (an object mapping field names to Zod types)\n * - A Zod union schema (for polymorphic tables)\n *\n * For object shapes, 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 *\n * For union schemas, this enables polymorphic tables with discriminated unions.\n *\n * Returns the Table definition along with Zod schemas for documents and arrays.\n *\n * @deprecated Use `defineZodModel` instead. See `docs/migration/v0.6.md`.\n *\n * @param name - The table name\n * @param schemaOrShape - Either a raw object shape or a Zod union schema\n * @returns A Table with attached helpers (shape, schema, zDoc, docArray, withSystemFields)\n *\n * @example Object shape\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 *\n * @example Union schema (polymorphic table)\n * ```ts\n * const shapeSchema = z.union([\n * z.object({ kind: z.literal('circle'), r: z.number() }),\n * z.object({ kind: z.literal('rectangle'), width: z.number() })\n * ])\n *\n * const Shapes = zodTable('shapes', shapeSchema)\n *\n * // Use in schema\n * export default defineSchema({ shapes: Shapes.table })\n *\n * // Use for return types with system fields\n * export const getShapes = zQuery(query, {},\n * async (ctx) => ctx.db.query('shapes').collect(),\n * { returns: Shapes.docArray }\n * )\n * ```\n */\n// Helper type to compute the result of addSystemFields for use in zodTable return type\ntype AddSystemFieldsResult<TableName extends string, Schema extends $ZodType> =\n Schema extends z.ZodObject<infer Shape extends z.ZodRawShape>\n ? z.ZodObject<Shape & SystemFields<TableName>>\n : Schema extends z.ZodUnion<infer Options extends readonly z.ZodTypeAny[]>\n ? z.ZodUnion<MapSystemFields<TableName, Options>>\n : Schema extends z.ZodDiscriminatedUnion<\n infer Options extends readonly z.ZodObject<z.ZodRawShape>[],\n infer Disc extends string\n >\n ? z.ZodDiscriminatedUnion<MapSystemFields<TableName, Options>, Disc>\n : Schema\n\n/**\n * Update schema shape: _id required, _creationTime optional, user fields partial\n */\ntype UpdateShape<TableName extends string, Shape extends z.ZodRawShape> = {\n _id: ZxId<TableName>\n _creationTime: z.ZodOptional<z.ZodNumber>\n} & {\n [K in keyof Shape]: z.ZodOptional<Shape[K]>\n}\n\n/**\n * Maps over union options for update schema.\n * Each variant gets _id required, _creationTime optional, and user fields partial.\n */\ntype MapUpdateVariants<TableName extends string, Options extends readonly z.ZodTypeAny[]> = {\n [K in keyof Options]: Options[K] extends z.ZodObject<infer Shape extends z.ZodRawShape>\n ? z.ZodObject<UpdateShape<TableName, Shape>>\n : Options[K]\n}\n\n/**\n * Computes the update schema type for a given schema.\n * Includes _id (required), _creationTime (optional), and partial user fields.\n * For unions: each variant gets update shape\n * For objects: the whole object gets update shape\n * For other types: returns as-is\n */\ntype UpdateSchemaType<TableName extends string, Schema extends $ZodType> =\n Schema extends z.ZodUnion<infer Options extends readonly z.ZodTypeAny[]>\n ? z.ZodUnion<MapUpdateVariants<TableName, Options>>\n : Schema extends z.ZodDiscriminatedUnion<\n infer Options extends readonly z.ZodObject<z.ZodRawShape>[],\n infer _Disc extends string\n >\n ? z.ZodUnion<MapUpdateVariants<TableName, Options>>\n : Schema extends z.ZodObject<infer Shape extends z.ZodRawShape>\n ? z.ZodObject<UpdateShape<TableName, Shape>>\n : Schema\n\n// Overload 1: Object shape (most common case - raw object with Zod validators)\nexport function zodTable<TableName extends string, Shape extends Record<string, $ZodType>>(\n name: TableName,\n shape: Shape\n): ReturnType<typeof Table<ConvexValidatorFromZodFieldsAuto<Shape>, TableName>> & {\n shape: Shape\n /** @deprecated Use `schema.doc` instead */\n zDoc: z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n /** @deprecated Use `schema.docArray` instead */\n docArray: z.ZodArray<\n z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n >\n schema: {\n doc: z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n docArray: z.ZodArray<\n z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n >\n /** Paginated result schema matching Convex's PaginationResult shape */\n paginatedDoc: z.ZodObject<{\n page: z.ZodArray<z.ZodObject<Shape & { _id: ZxId<TableName>; _creationTime: z.ZodNumber }>>\n isDone: z.ZodBoolean\n continueCursor: z.ZodOptional<z.ZodNullable<z.ZodString>>\n }>\n /** The base schema - user fields without system fields */\n base: z.ZodObject<Shape>\n /** Alias for base - user fields for insert operations */\n insert: z.ZodObject<Shape>\n /** Update schema - _id required, _creationTime optional, user fields partial */\n update: z.ZodObject<UpdateShape<TableName, Shape>>\n }\n}\n\n// Overload 2: ZodObject wrapper (extracts shape for same type inference as raw shape)\nexport function zodTable<TableName extends string, Shape extends $ZodShape>(\n name: TableName,\n schema: z.ZodObject<Shape>\n): ReturnType<typeof Table<ConvexValidatorFromZodFieldsAuto<Shape>, TableName>> & {\n shape: Shape\n /** @deprecated Use `schema.doc` instead */\n zDoc: z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n /** @deprecated Use `schema.docArray` instead */\n docArray: z.ZodArray<\n z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n >\n schema: {\n doc: z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n docArray: z.ZodArray<\n z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n >\n /** Paginated result schema matching Convex's PaginationResult shape */\n paginatedDoc: z.ZodObject<{\n page: z.ZodArray<z.ZodObject<Shape & { _id: ZxId<TableName>; _creationTime: z.ZodNumber }>>\n isDone: z.ZodBoolean\n continueCursor: z.ZodOptional<z.ZodNullable<z.ZodString>>\n }>\n /** The base schema - user fields without system fields */\n base: z.ZodObject<Shape>\n /** Alias for base - user fields for insert operations */\n insert: z.ZodObject<Shape>\n /** Update schema - _id required, _creationTime optional, user fields partial */\n update: z.ZodObject<UpdateShape<TableName, Shape>>\n }\n}\n\n// Overload 3: Union/schema types\nexport function zodTable<TableName extends string, Schema extends $ZodType>(\n name: TableName,\n schema: Schema\n): {\n table: ReturnType<typeof defineTable>\n tableName: TableName\n validator: ReturnType<typeof zodToConvex<Schema>>\n schema: {\n doc: AddSystemFieldsResult<TableName, Schema>\n docArray: z.ZodArray<AddSystemFieldsResult<TableName, Schema>>\n /** Paginated result schema matching Convex's PaginationResult shape */\n paginatedDoc: z.ZodObject<{\n page: z.ZodArray<AddSystemFieldsResult<TableName, Schema>>\n isDone: z.ZodBoolean\n continueCursor: z.ZodOptional<z.ZodNullable<z.ZodString>>\n }>\n /** The base schema - user fields without system fields */\n base: Schema\n /** Alias for base - user fields for insert operations */\n insert: Schema\n /** Update schema - _id required, _creationTime optional, user fields partial */\n update: UpdateSchemaType<TableName, Schema>\n }\n /** @deprecated Use `schema.docArray` instead */\n docArray: z.ZodArray<AddSystemFieldsResult<TableName, Schema>>\n withSystemFields: () => AddSystemFieldsResult<TableName, Schema>\n}\n\nexport function zodTable<\n TableName extends string,\n SchemaOrShape extends $ZodType | Record<string, $ZodType>\n>(name: TableName, schemaOrShape: SchemaOrShape): any {\n // Detect if it's an object shape, ZodObject, or other schema\n // For ZodObject: extract its shape to use the type-preserving path\n const isZodObject = schemaOrShape instanceof $ZodObject\n if (isObjectShape(schemaOrShape) || isZodObject) {\n // Extract shape from ZodObject or use raw shape directly\n const shape = isZodObject\n ? (schemaOrShape as z.ZodObject<z.ZodRawShape>).shape\n : (schemaOrShape as Record<string, $ZodType>)\n\n // Convert fields with proper types\n const convexFields = zodToConvexFields(shape) as ConvexValidatorFromZodFieldsAuto<typeof shape>\n\n // Create the Table from convex-helpers with explicit type\n const table = Table<ConvexValidatorFromZodFieldsAuto<typeof shape>, TableName>(\n name,\n convexFields\n )\n\n // Create base schema (user fields only, no system fields)\n // When a ZodObject is passed, preserve it to maintain options like .passthrough(), .strict(), .catchall()\n const baseSchema = isZodObject ? (schemaOrShape as z.ZodObject<z.ZodRawShape>) : z.object(shape)\n const schema = createObjectSchemaBundle(name, shape, baseSchema as z.ZodObject<any>)\n const zDoc = schema.doc\n const docArray = schema.docArray\n\n // Attach everything for comprehensive usage\n // zDoc and docArray are deprecated but kept for backwards compatibility\n // TypeScript @deprecated annotations provide compile-time warnings\n return Object.assign(table, {\n shape,\n schema,\n zDoc,\n docArray\n })\n } else {\n // Union or other schema type logic\n const schema = schemaOrShape as $ZodType\n\n // Convert schema to Convex validator\n const convexValidator = zodToConvex(schema)\n\n // For unions, use defineTable directly (not Table helper which expects object fields)\n // Convex supports union validators in tables, but TypeScript can't verify the types\n const table = defineTable(asTableValidator(convexValidator))\n const schemaNamespace = createSchemaBundle(name, schema)\n\n // Attach helpers for union tables\n // Return structure similar to Table() but without fields-based helpers\n return {\n table,\n tableName: name,\n validator: convexValidator,\n schema: schemaNamespace,\n docArray: schemaNamespace.docArray, // deprecated\n withSystemFields: () => schemaNamespace.doc\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/internal/normalizeCodecPaths.ts","../../../src/internal/stripUndefined.ts","../../../src/internal/boundaryHelpers.ts","../../../src/internal/actionCtx.ts","../../../src/internal/schema/objectShape.ts","../../../src/internal/ids.ts","../../../src/internal/mapping/handlers/enum.ts","../../../src/internal/mapping/handlers/nullable.ts","../../../src/internal/mapping/handlers/record.ts","../../../src/internal/mapping/handlers/union.ts","../../../src/internal/mapping/utils.ts","../../../src/internal/mapping/core.ts","../../../src/internal/meta.ts","../../../src/internal/schema/dateGuards.ts","../../../src/internal/serverUtils.ts","../../../src/internal/shared/object.ts","../../../src/internal/functionContracts.ts","../../../src/internal/custom.ts","../../../src/internal/wrappers.ts","../../../src/internal/builders.ts","../../../src/internal/codec.ts","../../../src/internal/rules.ts","../../../src/internal/db.ts","../../../src/internal/customization.ts","../../../src/internal/init.ts","../../../src/internal/schemaHelpers.ts","../../../src/internal/modelSchemaBundle.ts","../../../src/internal/zx.ts","../../../src/internal/schema.ts","../../../src/legacy/tables.ts"],"names":["codec","zodToConvexInternal","v","metadata","z","registered","doc","id","paginationOpts","NoOp","base","date","nullableOptional","docArray","defineTable"],"mappings":"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","file":"index.js","sourcesContent":["import {\n $ZodArray,\n $ZodCodec,\n $ZodDefault,\n $ZodError,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodType,\n encode\n} from './zod-core'\n\n/**\n * Unwraps ZodOptional/ZodNullable/ZodDefault wrappers to get the structural type.\n */\nfunction unwrapOuter(schema: $ZodType): $ZodType {\n let current: $ZodType = schema\n for (let i = 0; i < 10; i++) {\n if (\n current instanceof $ZodOptional ||\n current instanceof $ZodNullable ||\n current instanceof $ZodDefault\n ) {\n current = current._zod.def.innerType\n continue\n }\n break\n }\n return current\n}\n\n/**\n * Walks a path through a schema tree, truncating at codec boundaries.\n * When a codec is encountered, the path is cut — any deeper segments\n * are wire-internal and should not be exposed to consumers.\n */\nfunction truncateAtCodecBoundary(path: (string | number)[], schema: $ZodType): (string | number)[] {\n const result: (string | number)[] = []\n let current: $ZodType = schema\n\n for (const segment of path) {\n current = unwrapOuter(current)\n\n // If we've landed on a codec, everything from here is wire-internal — stop\n if (current instanceof $ZodCodec) {\n break\n }\n\n // Descend into objects\n if (current instanceof $ZodObject && typeof segment === 'string') {\n const fieldSchema = current._zod.def.shape[segment] as $ZodType | undefined\n if (!fieldSchema) {\n // Unknown field — include segment and stop\n result.push(segment)\n break\n }\n\n result.push(segment)\n\n const unwrapped = unwrapOuter(fieldSchema)\n if (unwrapped instanceof $ZodCodec) {\n // Hit a codec boundary — truncate here\n break\n }\n\n current = fieldSchema\n continue\n }\n\n // Descend into arrays\n if (current instanceof $ZodArray && typeof segment === 'number') {\n result.push(segment)\n current = current._zod.def.element\n continue\n }\n\n // For anything else (unions, records, etc.), include segment and continue\n result.push(segment)\n }\n\n return result\n}\n\n/**\n * Normalizes ZodError paths by truncating at codec boundaries.\n *\n * When z.encode() throws a ZodError, the paths reflect the wire schema\n * structure (e.g., [\"email\", \"value\"] for a custom codec).\n * This function strips the wire-internal segments so consumers see\n * clean field-level paths (e.g., [\"email\"]).\n */\nexport function normalizeCodecPaths(error: $ZodError, schema: $ZodType): $ZodError {\n const normalized = error.issues.map(issue => ({\n ...issue,\n path: truncateAtCodecBoundary(issue.path as (string | number)[], schema)\n }))\n return new $ZodError(normalized)\n}\n\n/**\n * Encodes a value through a Zod schema, normalizing codec-internal\n * path segments in any ZodError before re-throwing.\n *\n * Drop-in replacement for `z.encode(schema, value)` at client boundaries.\n */\nexport function safeEncode(schema: $ZodType, value: unknown): unknown {\n try {\n return encode(schema, value)\n } catch (e) {\n if (e instanceof $ZodError) throw normalizeCodecPaths(e as $ZodError, schema)\n throw e\n }\n}\n","/**\n * Recursively strips `undefined` values from objects and arrays.\n * Used by codec encode/decode to clean wire data.\n *\n * Extracted to its own module so client-safe code (boundaryHelpers)\n * can import it without pulling in zod via utils.ts.\n */\nexport function stripUndefined<T>(value: T): T {\n if (value === null || value === undefined) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map(stripUndefined) as T\n }\n\n // Only process plain objects (not class instances, Dates, etc.)\n if (typeof value === 'object' && value.constructor === Object) {\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n if (val !== undefined) {\n result[key] = stripUndefined(val)\n }\n }\n return result as T\n }\n\n return value\n}\n","import type { FunctionReference } from 'convex/server'\nimport type { $ZodIssue } from 'zod/v4/core'\nimport { safeEncode } from './normalizeCodecPaths'\nimport { stripUndefined } from './stripUndefined'\nimport type { AnyRegistry } from './types'\nimport { $ZodError, safeParse } from './zod-core'\n\n/**\n * Resolves a Convex FunctionReference to its string path.\n *\n * Mirrors `getFunctionName` from `convex/server` but without the server import.\n * Reads the well-known `Symbol.for('functionName')` that Convex attaches to all\n * function references — the same symbol used by Convex's own browser client.\n */\nconst functionNameSymbol = Symbol.for('functionName')\n\nfunction resolveFunctionPath(ref: FunctionReference<any, any, any, any>): string {\n if (typeof ref === 'string') return ref\n const name = (ref as any)[functionNameSymbol]\n if (!name) {\n throw new Error(\n `Expected a Convex function reference (e.g. api.file.func), but received ${JSON.stringify(ref)}`\n )\n }\n return name\n}\n\n/**\n * Options for codec helper behavior.\n */\nexport type BoundaryHelpersOptions = {\n /**\n * How to handle decode failures (schema validation errors on wire data).\n *\n * - `'warn'` (default): log a console.warn and return raw wire data untransformed.\n * - `'throw'`: throw a ZodvexDecodeError (extends z.ZodError). // zod-ok\n */\n onDecodeError?: 'warn' | 'throw'\n}\n\n/**\n * Decode error with function path and wire data context.\n * Extends $ZodError from zod/v4/core for compatibility with both zod and zod/mini.\n * instanceof $ZodError checks work in both variants.\n */\nexport class ZodvexDecodeError extends $ZodError {\n readonly functionPath: string\n readonly wireData: unknown\n\n constructor(functionPath: string, issues: $ZodIssue[], wireData: unknown) {\n super(issues)\n this.functionPath = functionPath\n this.wireData = wireData\n this.name = 'ZodvexDecodeError'\n }\n}\n\n/**\n * Creates shared encode/decode helpers bound to a zodvex registry.\n *\n * These are the core primitives used by all codec boundary implementations:\n * - `encodeArgs`: runtime types -> wire format (e.g., Date -> timestamp number)\n * - `decodeResult`: wire format -> runtime types (e.g., timestamp number -> Date)\n *\n * Both look up the function reference in the registry to find the appropriate\n * Zod schema, then apply the codec transform. Functions not in the registry\n * (or without the relevant schema) pass through unchanged.\n *\n * @param registry - A map of function paths to `{ args?, returns? }` Zod schemas.\n * Typically generated by zodvex codegen into `_zodvex/api.ts`.\n * @param options - Optional configuration for decode error behavior.\n */\nexport function createBoundaryHelpers(registry: AnyRegistry, options?: BoundaryHelpersOptions) {\n const onDecodeError = options?.onDecodeError ?? 'warn'\n const warnedPaths = new Set<string>()\n\n /**\n * Encode args from runtime types to wire format.\n *\n * Uses `safeEncode` (not raw `z.encode`) to normalize codec-internal\n * error paths in ZodErrors, then strips undefined values for Convex\n * serialization compatibility.\n *\n * Passthrough when:\n * - args is null/undefined\n * - function is not in the registry\n * - registry entry has no args schema\n */\n function encodeArgs(ref: FunctionReference<any, any, any, any>, args: any): any {\n if (args == null) return args\n const path = resolveFunctionPath(ref)\n const entry = registry[path]\n if (!entry?.args) {\n if (entry === undefined && !warnedPaths.has(path)) {\n warnedPaths.add(path)\n console.debug(\n `[zodvex] No registry entry for \"${path}\" — args will not be codec-encoded. ` +\n 'If this function uses zodvex wrappers, run `zodvex generate` to update the registry.'\n )\n }\n return args\n }\n return stripUndefined(safeEncode(entry.args, args))\n }\n\n /**\n * Decode a wire result back to runtime types.\n *\n * Uses `.safeParse()` to decode. On failure:\n * - 'warn' (default): logs warning, returns raw wireResult\n * - 'throw': throws ZodvexDecodeError (extends z.ZodError) // zod-ok\n *\n * Passthrough when:\n * - function is not in the registry\n * - registry entry has no returns schema\n */\n function decodeResult(ref: FunctionReference<any, any, any, any>, wireResult: any): any {\n const path = resolveFunctionPath(ref)\n const entry = registry[path]\n if (!entry?.returns) return wireResult\n\n const result = safeParse(entry.returns, wireResult)\n if (result.success) return result.data\n\n if (onDecodeError === 'throw') {\n throw new ZodvexDecodeError(path, result.error.issues, wireResult)\n }\n\n // Default: warn and return raw wire data\n const preview = JSON.stringify(wireResult)\n const truncated = preview.length > 200 ? `${preview.slice(0, 200)}...` : preview\n console.warn(\n `[zodvex] Decode failed for ${path}: ${result.error.issues.map((i: $ZodIssue) => `${i.path.join('.')}: ${i.message}`).join(', ')}. Returning raw wire data. Preview: ${truncated}`\n )\n return wireResult\n }\n\n return { encodeArgs, decodeResult }\n}\n\nexport type BoundaryHelpers = ReturnType<typeof createBoundaryHelpers>\n","import type { GenericActionCtx, GenericDataModel } from 'convex/server'\nimport type { BoundaryHelpersOptions } from './boundaryHelpers'\nimport { createBoundaryHelpers } from './boundaryHelpers'\nimport type { AnyRegistry } from './types'\n\n/**\n * Wraps an action context's runQuery/runMutation with automatic\n * codec transforms via the zodvex registry.\n *\n * - Args are encoded (runtime -> wire) before calling the inner function\n * - Results are decoded (wire -> runtime) before returning to the handler\n * - Functions not in the registry pass through unchanged\n *\n * @internal Used by initZodvex when registry option is provided.\n */\nexport function createZodvexActionCtx<DM extends GenericDataModel>(\n registry: AnyRegistry,\n ctx: GenericActionCtx<DM>,\n options?: BoundaryHelpersOptions\n): GenericActionCtx<DM> {\n const codec = createBoundaryHelpers(registry, options)\n\n return {\n ...ctx,\n runQuery: async (ref: any, ...restArgs: any[]) => {\n const wireArgs = codec.encodeArgs(ref, restArgs[0])\n const wireResult = await ctx.runQuery(ref, wireArgs)\n return codec.decodeResult(ref, wireResult)\n },\n runMutation: async (ref: any, ...restArgs: any[]) => {\n const wireArgs = codec.encodeArgs(ref, restArgs[0])\n const wireResult = await ctx.runMutation(ref, wireArgs)\n return codec.decodeResult(ref, wireResult)\n }\n } as GenericActionCtx<DM>\n}\n","import { $ZodObject } from '../zod-core'\n\nexport function getObjectShape(obj: any): Record<string, any> {\n if (obj instanceof $ZodObject) {\n return obj._zod.def.shape as Record<string, any>\n }\n if (obj && typeof obj === 'object' && typeof obj.shape === 'object') {\n return obj.shape as Record<string, any>\n }\n return {}\n}\n","/**\n * IDs + registry for Convex + Zod v4\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\nimport type { $ZodType } from './zod-core'\n\n// Simple registry for metadata\nconst metadata = new WeakMap<$ZodType, any>()\n\nexport const registryHelpers = {\n getMetadata: (type: $ZodType) => metadata.get(type),\n setMetadata: (type: $ZodType, meta: any) => metadata.set(type, meta)\n}\n\n/**\n * Create a Zod validator for a Convex Id\n *\n * Compatible with AI SDK and other tools that don't support transforms.\n * Uses type-level branding instead of runtime transforms for GenericId<T> compatibility.\n *\n * @deprecated Use `zx.id()` instead for consistent naming with other zodvex helpers.\n * ```typescript\n * import { zx } from 'zodvex'\n * zx.id('users') // instead of zid('users')\n * ```\n *\n * @param tableName - The Convex table name for this ID\n * @returns A Zod string validator typed as GenericId<TableName>\n */\nexport function zid<TableName extends string>(\n tableName: TableName\n): $ZodType<GenericId<TableName>> & { _tableName: TableName } {\n // Create base string validator with refinement (no transform or brand)\n const baseSchema = z.string().check(\n z.refine(val => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n }),\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 z.describe(`convexId:${tableName}`)\n )\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 // Type assertion provides GenericId<TableName> typing without runtime transform\n // This maintains type safety while being compatible with AI SDK and similar tools\n return branded as $ZodType<GenericId<TableName>> & { _tableName: TableName }\n}\n\nexport type Zid<TableName extends string> = ReturnType<typeof zid<TableName>>\n","import type { GenericValidator, Validator } from 'convex/values'\nimport { v } from 'convex/values'\nimport { $ZodEnum, type $ZodType } from '../../zod-core'\n\n// Helper: Convert Zod enum types to Convex validators\nexport function convertEnumType(actualValidator: $ZodEnum): GenericValidator {\n const entries = actualValidator._zod.def.entries\n const options = Object.keys(entries)\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 { $ZodNullable, $ZodOptional, $ZodType } from '../../zod-core'\n\n// Helper: Convert Zod nullable types to Convex validators\nexport function convertNullableType(\n actualValidator: $ZodNullable,\n visited: Set<$ZodType>,\n zodToConvexInternal: (schema: $ZodType, visited: Set<$ZodType>) => any\n): { validator: GenericValidator; isOptional: boolean } {\n const innerSchema = actualValidator._zod.def.innerType\n if (innerSchema && innerSchema instanceof $ZodType) {\n // Check if the inner schema is optional\n if (innerSchema instanceof $ZodOptional) {\n // For nullable(optional(T)), we want optional(union(T, null))\n const innerInnerSchema = innerSchema._zod.def.innerType\n const innerInnerValidator = zodToConvexInternal(innerInnerSchema, 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 { $ZodDefault, $ZodOptional, $ZodRecord, $ZodType } from '../../zod-core'\n\n// Helper: Convert Zod record types to Convex validators\nexport function convertRecordType(\n actualValidator: $ZodRecord,\n visited: Set<$ZodType>,\n zodToConvexInternal: (schema: $ZodType, visited: Set<$ZodType>) => any\n): GenericValidator {\n // $ZodRecord._zod.def has keyType and valueType\n let valueType: $ZodType | undefined = actualValidator._zod.def.valueType\n\n // If valueType is undefined, fall back to keyType (single-argument z.record() form)\n if (!valueType) {\n valueType = actualValidator._zod.def.keyType\n }\n\n if (valueType && valueType instanceof $ZodType) {\n // First check if the Zod value type is optional before conversion\n const isZodOptional =\n valueType instanceof $ZodOptional ||\n valueType instanceof $ZodDefault ||\n (valueType instanceof $ZodDefault && valueType._zod.def.innerType instanceof $ZodOptional)\n\n if (isZodOptional) {\n // For optional record values, we need to handle this specially\n let innerType: any\n let recordDefaultValue: any = undefined\n let recordHasDefault = false\n\n if (valueType instanceof $ZodDefault) {\n // Handle ZodDefault wrapper\n recordHasDefault = true\n recordDefaultValue = valueType._zod.def.defaultValue\n const innerFromDefault = valueType._zod.def.innerType\n if (innerFromDefault instanceof $ZodOptional) {\n innerType = innerFromDefault._zod.def.innerType\n } else {\n innerType = innerFromDefault\n }\n } else if (valueType instanceof $ZodOptional) {\n // Direct ZodOptional\n innerType = valueType._zod.def.innerType\n } else {\n // Shouldn't happen based on isZodOptional check\n innerType = valueType\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 { $ZodDiscriminatedUnion, type $ZodType, $ZodUnion } from '../../zod-core'\n\n// Helper: Convert Zod discriminated union types to Convex validators\nexport function convertDiscriminatedUnionType(\n actualValidator: $ZodType,\n visited: Set<$ZodType>,\n zodToConvexInternal: (schema: $ZodType, visited: Set<$ZodType>) => any\n): GenericValidator {\n const options =\n actualValidator instanceof $ZodDiscriminatedUnion\n ? actualValidator._zod.def.options\n : // cast: fallback for non-standard discriminated union variants\n (actualValidator as any)._zod?.def?.options\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: $ZodUnion,\n visited: Set<$ZodType>,\n zodToConvexInternal: (schema: $ZodType, visited: Set<$ZodType>) => any\n): GenericValidator {\n const options = actualValidator._zod.def.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 { registryHelpers, type Zid } from '../ids'\nimport { getObjectShape } from '../schema/objectShape'\nimport { $ZodType } from '../zod-core'\n\n// Helper to check if a schema is a Zid\nexport function isZid<T extends string>(schema: $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 { getObjectShape }\n","import type { GenericValidator, PropertyValidators } from 'convex/values'\nimport { v } from 'convex/values'\nimport { registryHelpers } from '../ids'\nimport {\n $ZodArray,\n $ZodCodec,\n $ZodDefault,\n $ZodEnum,\n $ZodLazy,\n $ZodLiteral,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodRecord,\n type $ZodShape,\n $ZodTuple,\n $ZodType,\n $ZodUnion\n} from '../zod-core'\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 { isZid } from './utils'\n\n// Module-scoped cache: same Zod schema instance → same Convex validator.\n// Avoids redundant allocations when the same schema is converted across\n// multiple function registrations or table definitions.\nconst convexValidatorCache = new WeakMap<$ZodType, GenericValidator>()\n\n// Internal conversion function using ZodType with def.type detection\nfunction zodToConvexInternal<Z extends $ZodType>(\n zodValidator: Z,\n visited: Set<$ZodType> = 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 // Return cached result if this exact Zod instance was already converted\n const cached = convexValidatorCache.get(zodValidator)\n if (cached) {\n return cached 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 if (zodValidator instanceof $ZodDefault) {\n hasDefault = true\n defaultValue = zodValidator._zod.def.defaultValue\n actualValidator = zodValidator._zod.def.innerType as Z\n }\n\n // Check for optional (may be wrapped inside ZodDefault)\n if (actualValidator instanceof $ZodOptional) {\n isOptional = true\n actualValidator = actualValidator._zod.def.innerType as Z\n\n // If the unwrapped type is ZodDefault, handle it here\n if (actualValidator instanceof $ZodDefault) {\n hasDefault = true\n defaultValue = actualValidator._zod.def.defaultValue\n actualValidator = actualValidator._zod.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 // cast: switch handles more defType values than $ZodTypeDef types (e.g. discriminatedUnion)\n const defType = actualValidator._zod.def.type as string\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 // LEGACY: Maps z.date() to v.float64() for backwards compatibility in type inference.\n // However, z.date() does NOT work at runtime because:\n // 1. z.date() produces Date objects, not numbers\n // 2. Convex rejects Date objects as non-serializable\n // 3. z.encode() on z.date() returns a Date, not a timestamp\n // Use zx.date() instead, which provides proper Date ↔ timestamp codec.\n // The wrappers and convexCodec will throw if z.date() is used.\n convexValidator = v.float64()\n break\n case 'null':\n convexValidator = v.null()\n break\n case 'nan':\n convexValidator = v.float64()\n break\n case 'array': {\n if (actualValidator instanceof $ZodArray) {\n const element = actualValidator._zod.def.element\n convexValidator = v.array(zodToConvexInternal(element, visited))\n } else {\n convexValidator = v.array(v.any())\n }\n break\n }\n case 'object': {\n if (actualValidator instanceof $ZodObject) {\n const shape = actualValidator._zod.def.shape\n const convexShape: PropertyValidators = {}\n for (const [key, value] of Object.entries(shape)) {\n if (value && value instanceof $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 $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,\n visited,\n zodToConvexInternal\n )\n break\n }\n case 'literal': {\n if (actualValidator instanceof $ZodLiteral) {\n const literalValues = actualValidator._zod.def.values\n const firstValue = literalValues.values().next().value\n if (firstValue !== undefined && firstValue !== null) {\n convexValidator = v.literal(firstValue)\n } else {\n convexValidator = v.any()\n }\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'enum': {\n if (actualValidator instanceof $ZodEnum) {\n convexValidator = convertEnumType(actualValidator)\n } else {\n convexValidator = v.any()\n }\n break\n }\n case 'record': {\n if (actualValidator instanceof $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 native Zod v4 codec first (z.codec())\n // Codecs have def.type='pipe' but are specifically for bidirectional transforms\n // Use the input schema (wire format) for Convex validation\n if (actualValidator instanceof $ZodCodec) {\n const inputSchema = actualValidator._zod.def.in\n if (inputSchema && inputSchema instanceof $ZodType) {\n convexValidator = zodToConvexInternal(inputSchema, visited)\n } else {\n convexValidator = v.any()\n }\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 // Non-codec transform - extract input schema but warn\n // cast: no instanceof guard available for generic pipe/transform\n const inputSchema = (actualValidator as any)._zod?.def?.in\n if (inputSchema && inputSchema instanceof $ZodType) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n '[zodvex] z.transform() detected. Using input schema for Convex validation.\\n' +\n 'Transforms are unidirectional - they work for parsing but not encoding.\\n' +\n 'For bidirectional transforms, use zx.codec() instead.'\n )\n }\n convexValidator = zodToConvexInternal(inputSchema, visited)\n } else {\n convexValidator = v.any()\n }\n }\n }\n break\n }\n case 'nullable': {\n if (actualValidator instanceof $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 $ZodTuple) {\n const items = actualValidator._zod.def.items\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 $ZodLazy) {\n try {\n const getter = actualValidator._zod.def.getter\n if (getter) {\n const resolvedSchema = getter()\n if (resolvedSchema && resolvedSchema instanceof $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 case 'optional': {\n // Fallback for optional types that weren't caught by the instanceof check above.\n // cast: no instanceof guard — this handles edge cases where defType='optional'\n // but the schema isn't a $ZodOptional instance (e.g. pipes wrapped with .optional())\n const innerType = (actualValidator as any)._zod?.def?.innerType\n if (innerType && innerType instanceof $ZodType) {\n convexValidator = zodToConvexInternal(innerType, visited)\n isOptional = true\n } else {\n convexValidator = v.any()\n isOptional = true\n }\n break\n }\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 // Cache the result so the same Zod instance returns the same Convex validator\n convexValidatorCache.set(zodValidator, finalValidator)\n\n return finalValidator as ConvexValidatorFromZod<Z, 'required'>\n}\n\nexport function zodToConvex<Z extends $ZodType | ZodValidator>(\n zod: Z\n): Z extends $ZodType\n ? ConvexValidatorFromZod<Z, 'required'>\n : Z extends ZodValidator\n ? ConvexValidatorFromZodFieldsAuto<Z>\n : never {\n if (typeof zod === 'object' && zod !== null && !(zod instanceof $ZodType)) {\n return zodToConvexFields(zod as ZodValidator) as any\n }\n\n return zodToConvexInternal(zod as $ZodType) as any\n}\n\nexport function zodToConvexFields<Z extends $ZodShape>(\n zod: Z\n): ConvexValidatorFromZodFieldsAuto<Z> {\n // If it's a ZodObject, extract the shape\n const fields = zod instanceof $ZodObject ? zod._zod.def.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 $ZodType)\n }\n\n return result as ConvexValidatorFromZodFieldsAuto<Z>\n}\n","import type { $ZodType } from './zod-core'\n\nconst META_KEY = '__zodvexMeta'\n\nexport type ZodvexFunctionMeta = {\n type: 'function'\n zodArgs?: $ZodType\n zodReturns?: $ZodType\n}\n\nexport type ZodvexModelDefinitionSource = 'shape' | 'schema'\n\nexport type ZodvexModelMeta = {\n type: 'model'\n tableName: string\n definitionSource?: ZodvexModelDefinitionSource\n schemas?: {\n doc: $ZodType\n insert: $ZodType\n update: $ZodType\n docArray: $ZodType\n paginatedDoc: $ZodType\n }\n}\n\nexport type ZodvexMeta = ZodvexFunctionMeta | ZodvexModelMeta\n\nexport function attachMeta(target: object, meta: ZodvexMeta): void {\n Object.defineProperty(target, META_KEY, {\n value: meta,\n enumerable: false,\n writable: false,\n configurable: false\n })\n}\n\nexport function readMeta(target: unknown): ZodvexMeta | undefined {\n if (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n return undefined\n }\n return (target as Record<string, unknown>)[META_KEY] as ZodvexMeta | undefined\n}\n\nconst CODEC_BRAND_KEY = '__zodvexCodecBrand'\n\n/**\n * Attaches a provenance brand to a codec instance. Codegen reads this at\n * discovery time to match a function-embedded codec to its importable twin\n * by *declared* identity instead of inferring it from structure. Stored\n * non-enumerably so it never leaks into user data, and survives\n * `.optional()` / `.nullable()` wrapping (codegen unwraps to the codec).\n * See `docs/decisions/2026-06-08-codec-provenance-brands.md`.\n */\nexport function attachCodecBrand(target: object, brand: string): void {\n Object.defineProperty(target, CODEC_BRAND_KEY, {\n value: brand,\n enumerable: false,\n writable: false,\n configurable: false\n })\n}\n\n/** Reads a codec's provenance brand, or undefined if unbranded. */\nexport function readCodecBrand(target: unknown): string | undefined {\n if (target == null || typeof target !== 'object') return undefined\n const value = (target as Record<string, unknown>)[CODEC_BRAND_KEY]\n return typeof value === 'string' ? value : undefined\n}\n","import { z } from 'zod'\nimport {\n $ZodArray,\n $ZodCodec,\n $ZodDate,\n $ZodDefault,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodRecord,\n $ZodTuple,\n $ZodType,\n $ZodUnion\n} from '../zod-core'\n\n/**\n * @deprecated Use `zx.date()` instead for automatic Date ↔ timestamp conversion.\n */\nexport function mapDateFieldToNumber(field: $ZodType): $ZodType {\n if (field instanceof $ZodDate) {\n return z.number()\n }\n if (field instanceof $ZodOptional && field._zod.def.innerType instanceof $ZodDate) {\n return z.optional(z.number())\n }\n if (field instanceof $ZodNullable && field._zod.def.innerType instanceof $ZodDate) {\n return z.nullable(z.number())\n }\n if (field instanceof $ZodDefault) {\n const inner = field._zod.def.innerType\n if (inner instanceof $ZodDate) {\n return z.optional(z.number())\n }\n }\n return field\n}\n\nfunction containsNativeZodDate(schema: $ZodType): boolean {\n if (schema instanceof $ZodDate) return true\n if (schema instanceof $ZodCodec) return false\n\n if (\n schema instanceof $ZodOptional ||\n schema instanceof $ZodNullable ||\n schema instanceof $ZodDefault\n ) {\n return containsNativeZodDate(schema._zod.def.innerType)\n }\n\n if (schema instanceof $ZodObject) {\n return Object.values(schema._zod.def.shape).some(field => containsNativeZodDate(field))\n }\n if (schema instanceof $ZodArray) {\n return containsNativeZodDate(schema._zod.def.element)\n }\n if (schema instanceof $ZodUnion) {\n return schema._zod.def.options.some(opt => containsNativeZodDate(opt))\n }\n if (schema instanceof $ZodRecord) {\n return containsNativeZodDate(schema._zod.def.valueType)\n }\n if (schema instanceof $ZodTuple) {\n const items = schema._zod.def.items\n return items ? items.some(item => containsNativeZodDate(item)) : false\n }\n\n return false\n}\n\nexport function assertNoNativeZodDate(\n schema: $ZodType,\n context: 'args' | 'returns' | 'schema'\n): void {\n if (containsNativeZodDate(schema)) {\n throw new Error(\n `[zodvex] Native z.date() found in ${context}. ` +\n `Convex stores dates as timestamps (numbers), which z.date() cannot parse.\\n\\n` +\n `Fix: Replace z.date() with zx.date()\\n\\n` +\n `Before: { createdAt: z.date() }\\n` +\n `After: { createdAt: zx.date() }\\n\\n` +\n `zx.date() is a codec that handles timestamp ↔ Date conversion automatically.`\n )\n }\n}\n","/**\n * Server-only utilities — imports ConvexError from convex/values.\n * Do NOT re-export from core/index.ts or any client-safe barrel.\n */\nimport { ConvexError } from 'convex/values'\nimport { z } from 'zod'\nimport { $ZodError, $ZodType, encode, parse } from './zod-core'\n\n// Format ZodError issues into a compact, consistent structure\nexport function formatZodIssues(\n error: z.ZodError, // zod-ok\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 $ZodError) {\n throw new ConvexError(formatZodIssues(e as z.ZodError, context)) // zod-ok\n }\n throw e\n}\n\n/**\n * Validates a return value against a Zod schema, supporting both codecs and regular schemas.\n *\n * Tries z.encode() first (for codec support), then falls back to .parse() if the schema\n * contains unidirectional transforms (which don't support encoding).\n *\n * For codecs: returns the encoded wire format (z.input<T>)\n * For transforms: returns the transformed output (z.output<T>)\n * For plain schemas: returns the validated value\n *\n * @param schema - The Zod schema to validate against\n * @param value - The value to validate\n * @returns The validated/encoded value\n * @throws Calls handleZodValidationError on validation failure\n */\nexport function validateReturns(schema: $ZodType, value: unknown): unknown {\n try {\n // Try encode first - works for codecs and plain schemas\n return encode(schema, value)\n } catch (e: any) {\n // If it's a unidirectional transform error, fall back to parse\n if (e?.message?.includes('unidirectional transform')) {\n try {\n return parse(schema, value)\n } catch (parseError) {\n handleZodValidationError(parseError, 'returns')\n }\n }\n // For any other error, handle it normally\n handleZodValidationError(e, 'returns')\n }\n // TypeScript can't infer that handleZodValidationError always throws\n throw new Error('Unreachable')\n}\n","export 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","import { z } from 'zod'\nimport { getObjectShape, type ZodValidator, zodToConvex, zodToConvexFields } from './mapping'\nimport { attachMeta } from './meta'\nimport { assertNoNativeZodDate } from './schema/dateGuards'\nimport { handleZodValidationError, validateReturns } from './serverUtils'\nimport { pick } from './shared/object'\nimport { stripUndefined } from './stripUndefined'\nimport {\n $ZodCustom,\n $ZodDefault,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodType,\n $ZodUnion,\n safeParse,\n parse as zodParse\n} from './zod-core'\n\nexport type FunctionSchemaInput = $ZodType | Record<string, $ZodType> | undefined\nexport type DirectFunctionInput = $ZodType | Record<string, $ZodType>\n\nexport type CustomInputResult = {\n ctx?: Record<string, unknown>\n args?: Record<string, unknown>\n onSuccess?: (params: { ctx: unknown; args: unknown; result: unknown }) => unknown\n}\n\nexport function normalizeFunctionSchema(input: FunctionSchemaInput): $ZodType | undefined {\n if (!input) return undefined\n return input instanceof $ZodType ? input : z.object(input)\n}\n\nfunction normalizeFunctionMetaArgs(input: FunctionSchemaInput): z.ZodObject<any> | undefined {\n if (!input) return undefined\n if (input instanceof $ZodObject) {\n return input as unknown as z.ZodObject<any> // zod-ok\n }\n if (input instanceof $ZodType) {\n return undefined\n }\n return z.object(input)\n}\n\nexport function attachFunctionMeta(\n target: object,\n args: FunctionSchemaInput,\n returns: FunctionSchemaInput\n): void {\n attachMeta(target, {\n type: 'function',\n zodArgs: normalizeFunctionMetaArgs(args),\n zodReturns: normalizeFunctionSchema(returns)\n })\n}\n\n// Cache to avoid re-checking the same schema\nconst customCheckCache = new WeakMap<$ZodType, boolean>()\n\nfunction containsCustom(schema: $ZodType, maxDepth = 50, currentDepth = 0): boolean {\n const cached = customCheckCache.get(schema)\n if (cached !== undefined) {\n return cached\n }\n\n if (currentDepth > maxDepth) {\n return false\n }\n\n let result = false\n if (schema instanceof $ZodCustom) {\n result = true\n } else if (schema instanceof $ZodUnion) {\n result = schema._zod.def.options.some(opt => containsCustom(opt, maxDepth, currentDepth + 1))\n } else if (schema instanceof $ZodOptional) {\n result = containsCustom(schema._zod.def.innerType, maxDepth, currentDepth + 1)\n } else if (schema instanceof $ZodNullable) {\n result = containsCustom(schema._zod.def.innerType, maxDepth, currentDepth + 1)\n } else if (schema instanceof $ZodDefault) {\n result = containsCustom(schema._zod.def.innerType, maxDepth, currentDepth + 1)\n }\n\n customCheckCache.set(schema, result)\n return result\n}\n\nexport function normalizeDirectFunctionInput(input: DirectFunctionInput): {\n zodSchema: $ZodType\n convexArgs: Record<string, any>\n} {\n if (input instanceof $ZodObject) {\n return {\n zodSchema: input,\n convexArgs: zodToConvexFields(getObjectShape(input))\n }\n }\n\n if (input instanceof $ZodType) {\n return {\n zodSchema: z.object({ value: input as any }),\n convexArgs: { value: zodToConvex(input as any) }\n }\n }\n\n return {\n zodSchema: z.object(input),\n convexArgs: zodToConvexFields(input)\n }\n}\n\nexport function normalizeCustomArgsValidator(args: ZodValidator | $ZodObject): {\n argsValidator: ZodValidator\n argsSchema: $ZodObject\n} {\n if (args instanceof $ZodType) {\n if (args instanceof $ZodObject) {\n return {\n argsSchema: args as unknown as $ZodObject,\n argsValidator: args._zod.def.shape as any\n }\n }\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\n return {\n argsValidator: args,\n argsSchema: z.object(args)\n }\n}\n\nexport function createConvexReturnsValidator(\n schema?: $ZodType,\n options?: { skipCustomSchemas?: boolean; skipConvexValidation?: boolean }\n): any {\n if (!schema || options?.skipConvexValidation) {\n return undefined\n }\n if (options?.skipCustomSchemas && containsCustom(schema)) {\n return undefined\n }\n return zodToConvex(schema)\n}\n\nexport function assertFunctionSchemas(argsSchema: $ZodType, returnsSchema?: $ZodType): void {\n assertNoNativeZodDate(argsSchema, 'args')\n if (returnsSchema) {\n assertNoNativeZodDate(returnsSchema, 'returns')\n }\n}\n\nexport function parseFunctionArgsOrThrow(zodSchema: $ZodType, argsObject: unknown): any {\n try {\n return zodParse(zodSchema, argsObject) as any\n } catch (e) {\n handleZodValidationError(e, 'args')\n }\n}\n\nexport function parseObjectArgsOrThrow(\n argsSchema: $ZodObject,\n rawArgs: Record<string, unknown>\n): Record<string, unknown> {\n const parsed = safeParse(argsSchema, rawArgs)\n if (!parsed.success) {\n handleZodValidationError(parsed.error, 'args')\n }\n return parsed.data as Record<string, unknown>\n}\n\nexport async function runCustomizationInput(\n customInput: (ctx: unknown, args: unknown, extra?: unknown) => unknown,\n ctx: unknown,\n allArgs: Record<string, unknown>,\n inputArgs: Record<string, unknown>,\n extra: Record<string, unknown>\n): Promise<CustomInputResult | undefined> {\n return (await customInput(\n ctx,\n // Cast justification: customInput expects ObjectType<CustomArgsValidator>, but pick()\n // returns Partial<T>. The cast is safe because inputArgs keys are derived from\n // CustomArgsValidator at the type level.\n pick(allArgs, Object.keys(inputArgs)) as any,\n extra\n )) as CustomInputResult | undefined\n}\n\nexport function applyCustomizationResult(\n ctx: Record<string, unknown>,\n baseArgs: Record<string, unknown>,\n added?: CustomInputResult\n): { finalCtx: Record<string, unknown>; finalArgs: Record<string, unknown> } {\n const finalCtx = { ...ctx, ...(added?.ctx ?? {}) }\n const addedArgs = added?.args ?? {}\n return {\n finalCtx,\n finalArgs: { ...baseArgs, ...addedArgs }\n }\n}\n\nexport async function finalizeFunctionReturn(\n result: unknown,\n options?: {\n ctx?: Record<string, unknown>\n args?: Record<string, unknown>\n added?: CustomInputResult\n returns?: $ZodType\n }\n): Promise<unknown> {\n if (options?.added?.onSuccess) {\n await options.added.onSuccess({\n ctx: options.ctx,\n args: options.args,\n result\n })\n }\n\n if (options?.returns) {\n const validated = validateReturns(options.returns, result)\n return stripUndefined(validated)\n }\n\n return stripUndefined(result)\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 { type PropertyValidators } from 'convex/values'\nimport { type Customization, NoOp } from 'convex-helpers/server/customFunctions'\nimport { z } from 'zod'\nimport {\n applyCustomizationResult,\n attachFunctionMeta,\n createConvexReturnsValidator,\n finalizeFunctionReturn,\n normalizeCustomArgsValidator,\n normalizeFunctionSchema,\n parseObjectArgsOrThrow,\n runCustomizationInput\n} from './functionContracts'\nimport { type ZodValidator, zodToConvexFields } from './mapping'\nimport { assertNoNativeZodDate } from './schema/dateGuards'\nimport { pick } from './shared/object'\nimport type { ExtractCtx, ExtractVisibility, Overwrite } from './types'\nimport { $ZodObject, $ZodType } from './zod-core'\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\n// Uses z.output since the handler produces the internal representation (e.g., Date),\n// which is then encoded to wire format (e.g., string) before sending to the client\ntype ReturnValueInput<ReturnsValidator extends $ZodType | ZodValidator | void> = [\n ReturnsValidator\n] extends [$ZodType]\n ? Returns<z.output<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.output<$ZodObject<ReturnsValidator>>>\n : any\n\n// The return value after it's been validated: returned to the client\ntype ReturnValueOutput<ReturnsValidator extends $ZodType | ZodValidator | void> = [\n ReturnsValidator\n] extends [$ZodType]\n ? Returns<z.output<ReturnsValidator>>\n : [ReturnsValidator] extends [ZodValidator]\n ? Returns<z.output<$ZodObject<ReturnsValidator>>>\n : any\n\n// The args as seen by the caller: runtime types (z.output), not wire types (z.input).\n// For codecs (e.g., custom field types), z.output = runtime class, z.input = wire object.\n// Callers pass runtime types; encoding to wire format happens inside the wrapper.\ntype ArgsInput<ArgsValidator extends ZodValidator | $ZodObject | void> = [ArgsValidator] extends [\n $ZodObject\n]\n ? [z.output<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.output<$ZodObject<ArgsValidator>>]\n : OneArgArray\n\n// The args after they've been validated: passed to the handler\ntype ArgsOutput<ArgsValidator extends ZodValidator | $ZodObject | void> = [ArgsValidator] extends [\n $ZodObject\n]\n ? [z.output<ArgsValidator>]\n : [ArgsValidator] extends [ZodValidator]\n ? [z.output<$ZodObject<ArgsValidator>>]\n : OneArgArray\n\n// Re-export for backwards compatibility (canonical definition in types.ts)\nexport type { Overwrite } from './types'\n\n// Hack to simplify how TypeScript renders object types\ntype Expand<ObjectType extends Record<any, any>> =\n 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> =\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 | $ZodObject | void,\n ReturnsZodValidator extends $ZodType | 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 const skipConvexValidation = fn.skipConvexValidation ?? false\n\n const returns = normalizeFunctionSchema(maybeObject)\n const returnValidator = createConvexReturnsValidator(returns, { skipConvexValidation })\n const convexReturns = returnValidator ? { returns: returnValidator } : undefined\n\n // Check for z.date() usage at construction time (once), not on every invocation\n if (returns) {\n assertNoNativeZodDate(returns as $ZodType, 'returns')\n }\n\n if (args) {\n const { argsValidator, argsSchema } = normalizeCustomArgsValidator(args)\n\n // Only generate Convex args validator when not skipping Convex validation\n const convexArgs = skipConvexValidation\n ? inputArgs\n : { ...zodToConvexFields(argsValidator), ...inputArgs }\n\n // Check for z.date() usage at construction time (once), not on every invocation\n assertNoNativeZodDate(argsSchema, 'args')\n\n const registered = builder({\n args: convexArgs,\n ...convexReturns,\n handler: async (ctx: Ctx, allArgs: any) => {\n const added = await runCustomizationInput(\n customInput as any,\n ctx,\n allArgs,\n inputArgs,\n extra\n )\n const argKeys = Object.keys(argsValidator)\n const rawArgs = pick(allArgs, argKeys)\n const baseArgs = parseObjectArgsOrThrow(argsSchema, rawArgs)\n const { finalCtx, finalArgs } = applyCustomizationResult(ctx as any, baseArgs, added)\n\n const ret = await handler(finalCtx, finalArgs)\n return finalizeFunctionReturn(ret, { ctx: ctx as any, args: baseArgs, added, returns })\n }\n })\n attachFunctionMeta(registered, argsSchema, returns)\n return registered\n }\n const registered = builder({\n args: inputArgs,\n ...convexReturns,\n handler: async (ctx: Ctx, allArgs: any) => {\n const baseArgs = allArgs as Record<string, unknown>\n const added = await runCustomizationInput(\n customInput as any,\n ctx,\n allArgs,\n inputArgs,\n extra\n )\n const { finalCtx, finalArgs } = applyCustomizationResult(ctx as any, baseArgs, added)\n\n const ret = await handler(finalCtx, finalArgs)\n return finalizeFunctionReturn(ret, { ctx: ctx as any, args: baseArgs, added, returns })\n }\n })\n attachFunctionMeta(registered, undefined, returns)\n return registered\n }\n}\n\nfunction createCustomBuilderEntrypoint<\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<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n) {\n return customFnBuilder<any, Builder, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>(\n builder as any,\n customization as any\n ) as any\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 // Cast justification: This is the TypeScript overload implementation pattern. The function\n // has two overloads (with/without DataModel constraint) that provide precise types to callers.\n // The implementation must satisfy both overloads, which requires a broader signature.\n // The 'as any' casts allow the implementation to delegate to customFnBuilder without\n // TypeScript complaining about the generic parameter differences between overloads.\n // This is type-safe because: (1) callers only see the overload signatures which are strict,\n // (2) the runtime behavior is identical regardless of which overload matched.\n // TODO: Consider using a conditional type or branded types to create a single signature\n // that satisfies both overloads without casts. Alternatively, accept this as idiomatic\n // TypeScript for overloaded functions and keep the casts.\n return createCustomBuilderEntrypoint(query, customization)\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 // Cast justification: Same overload implementation pattern as zCustomQuery.\n // See detailed comment there. Type safety is enforced by the overload signature above.\n return createCustomBuilderEntrypoint(mutation, customization)\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 // Cast justification: Same overload implementation pattern as zCustomQuery.\n // See detailed comment there. Type safety is enforced by the overload signature above.\n return createCustomBuilderEntrypoint(action, customization)\n}\n","import type {\n FunctionVisibility,\n RegisteredAction,\n RegisteredMutation,\n RegisteredQuery\n} from 'convex/server'\nimport {\n assertFunctionSchemas,\n createConvexReturnsValidator,\n type DirectFunctionInput,\n finalizeFunctionReturn,\n normalizeDirectFunctionInput,\n parseFunctionArgsOrThrow\n} from './functionContracts'\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 { $ZodType } from './zod-core'\n\nfunction registerZodFunction<\n Builder extends (fn: any) => any,\n A extends DirectFunctionInput,\n R extends $ZodType | undefined\n>(\n builder: 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): any {\n const { zodSchema, convexArgs } = normalizeDirectFunctionInput(input)\n const returnsSchema = options?.returns as $ZodType | undefined\n const returns = createConvexReturnsValidator(returnsSchema, { skipCustomSchemas: true })\n\n assertFunctionSchemas(zodSchema, returnsSchema)\n\n return builder({\n args: convexArgs,\n returns,\n handler: async (ctx: any, argsObject: unknown) => {\n const parsed = parseFunctionArgsOrThrow(zodSchema, argsObject)\n const raw = await handler(ctx, parsed)\n return finalizeFunctionReturn(raw, { returns: returnsSchema })\n }\n }) as any\n}\n\nexport function zQuery<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 return registerZodFunction(query, input, handler, options)\n}\n\nexport function zInternalQuery<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 return registerZodFunction(mutation, input, handler, options)\n}\n\nexport function zInternalMutation<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 return registerZodFunction(action, input, handler, options)\n}\n\nexport function zInternalAction<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | 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 { type CustomBuilder, customFnBuilder } from './custom'\nimport { attachFunctionMeta } from './functionContracts'\nimport type {\n ExtractCtx,\n ExtractVisibility,\n InferHandlerReturns,\n InferReturns,\n ZodToConvexArgs\n} from './types'\nimport { zAction, zMutation, zQuery } from './wrappers'\nimport { $ZodType } from './zod-core'\n\ntype BuilderConfig<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType> | undefined,\n R extends $ZodType | undefined\n> = {\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}\n\nfunction registerBuilderFunction<\n Builder extends (fn: any) => any,\n A extends $ZodType | Record<string, $ZodType> | undefined,\n R extends $ZodType | undefined,\n Result\n>(\n register: (\n builder: Builder,\n input: A extends undefined ? Record<string, never> : A,\n handler: (\n ctx: ExtractCtx<Builder>,\n args: ZodToConvexArgs<A extends undefined ? Record<string, never> : A>\n ) => InferHandlerReturns<R> | Promise<InferHandlerReturns<R>>,\n options: { returns?: R }\n ) => Result,\n builder: Builder,\n config: BuilderConfig<Builder, A, R>\n): Result {\n const result = register(builder, (config.args ?? ({} as any)) as any, config.handler, {\n returns: config.returns\n })\n attachFunctionMeta(result as object, config.args, config.returns)\n return result\n}\n\nfunction createDirectBuilderFactory(\n register: (builder: any, input: any, handler: any, options: any) => any\n) {\n return function directBuilderFactory<Builder extends (fn: any) => any>(builder: Builder) {\n return <\n A extends $ZodType | Record<string, $ZodType>,\n R extends $ZodType | undefined = undefined\n >(\n config: BuilderConfig<Builder, A, R>\n ): any => registerBuilderFunction(register as any, builder, config) as any\n }\n}\n\nfunction createCustomBuilderFactory() {\n return function customBuilderFactory<\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 builder: Builder,\n customization: Customization<any, CustomArgsValidator, CustomCtx, CustomMadeArgs, ExtraArgs>\n ): CustomBuilder<\n 'query' | 'mutation' | '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 builder as any,\n customization as any\n ) as any\n }\n}\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 * @deprecated Use `initZodvex()` which returns `{ zq }` with built-in codec DB wrapping.\n *\n * @example\n * ```ts\n * import { query } from './_generated/server'\n * import { zQueryBuilder } from 'zodvex/server'\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 createDirectBuilderFactory(zQuery)(builder) as any\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 * @deprecated Use `initZodvex()` which returns `{ zm }` with built-in codec DB wrapping.\n *\n * @example\n * ```ts\n * import { mutation } from './_generated/server'\n * import { zMutationBuilder } from 'zodvex/server'\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 createDirectBuilderFactory(zMutation)(builder) as any\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 * @deprecated Use `initZodvex()` which returns `{ za }` with built-in codec DB wrapping.\n *\n * @example\n * ```ts\n * import { action } from './_generated/server'\n * import { zActionBuilder } from 'zodvex/server'\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 createDirectBuilderFactory(zAction)(builder) as any\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 * @deprecated Use `initZodvex()` and `zq.withContext()` instead.\n *\n * @example\n * ```ts\n * import { type QueryCtx, query } from './_generated/server'\n * import { zCustomQueryBuilder, customCtx } from 'zodvex/server'\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 createCustomBuilderFactory()(query, customization) 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 * @deprecated Use `initZodvex()` and `zm.withContext()` instead.\n *\n * @example\n * ```ts\n * import { type MutationCtx, mutation } from './_generated/server'\n * import { zCustomMutationBuilder, customCtx } from 'zodvex/server'\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 createCustomBuilderFactory()(mutation, customization) 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 * @deprecated Use `initZodvex()` and `za.withContext()` instead.\n *\n * @example\n * ```ts\n * import { type ActionCtx, action } from './_generated/server'\n * import { zCustomActionBuilder, customCtx } from 'zodvex/server'\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 createCustomBuilderFactory()(action, customization) as any\n}\n","import { z } from 'zod'\nimport { zodToConvex } from './mapping'\nimport { assertNoNativeZodDate } from './schema/dateGuards'\nimport { stripUndefined } from './stripUndefined'\nimport { type ZodvexCodec } from './types'\nimport {\n $ZodObject,\n $ZodOptional,\n $ZodType,\n encode,\n parse,\n type infer as zinfer,\n type input as zinput,\n type output as zoutput\n} from './zod-core'\n\n// Re-export ZodvexCodec type for convenience\nexport { type ZodvexCodec } from './types'\n\n/** @deprecated Use `initZodvex` or `decodeDoc`/`encodeDoc` instead. Will be removed in a future release. */\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\n/** @deprecated Use `initZodvex` or `decodeDoc`/`encodeDoc` instead. Will be removed in a future release. */\nexport function convexCodec<T>(schema: $ZodType<T>): ConvexCodec<T> {\n // Fail fast if z.date() is used - it won't encode correctly\n // Use zx.date() instead for Date ↔ timestamp conversion\n assertNoNativeZodDate(schema as $ZodType, 'schema')\n\n const validator = zodToConvex(schema)\n\n return {\n validator,\n // Strip undefined to ensure Convex-safe output (Convex rejects explicit undefined)\n encode: (value: T) => stripUndefined(encode(schema, value)),\n decode: (value: any) => parse(schema, value),\n pick: <K extends keyof T>(keys: K[] | Record<K, true>) => {\n if (!(schema instanceof $ZodObject)) {\n throw new Error('pick() can only be called on object schemas')\n }\n // Handle both array and object formats\n // Use manual shape extraction instead of .pick() — not available on zod/mini\n const pickKeys = Array.isArray(keys) ? keys : (Object.keys(keys) as K[])\n const shape = (schema as any)._zod.def.shape\n const pickedShape: Record<string, any> = {}\n for (const k of pickKeys) {\n if (k in shape) pickedShape[k as string] = shape[k as string]\n }\n const pickedSchema = z.object(pickedShape)\n return convexCodec(pickedSchema) as ConvexCodec<Pick<T, K>>\n }\n }\n}\n\n/**\n * Decodes a wire-format document (from Convex DB) to runtime types.\n * Runs Zod codec decode transforms (e.g., timestamp → Date via zx.date()).\n */\nexport function decodeDoc<S extends $ZodType>(schema: S, wireDoc: unknown): zoutput<S> {\n return parse(schema, wireDoc)\n}\n\n/**\n * Encodes a runtime document to wire format (for Convex DB writes).\n * Runs Zod codec encode transforms and strips undefined values.\n */\nexport function encodeDoc<S extends $ZodType>(schema: S, runtimeDoc: zoutput<S>): zinput<S> {\n return stripUndefined(encode(schema, runtimeDoc))\n}\n\n/**\n * Encodes a partial runtime document to wire format (for Convex DB patch operations).\n * Only encodes the fields present in the partial. Uses schema.partial() + z.encode().\n */\nexport function encodePartialDoc<S extends $ZodType>(\n schema: S,\n partial: Partial<zoutput<S>>\n): Partial<zinput<S>> {\n if (!(schema instanceof $ZodObject)) {\n // For non-object schemas (unions, etc.), fall back to full encode\n // Cast needed: Partial<output<S>> is structurally compatible but not assignable to output<S>\n return stripUndefined(encode(schema, partial as zoutput<S>)) as Partial<zinput<S>>\n }\n // Use manual shape wrapping instead of .partial() — not available on zod/mini\n const shape = (schema as any)._zod.def.shape\n const partialShape: Record<string, any> = {}\n for (const [key, value] of Object.entries(shape)) {\n partialShape[key] =\n value instanceof $ZodOptional\n ? value\n : new $ZodOptional({ type: 'optional', innerType: value as any })\n }\n const partialSchema = z.object(partialShape)\n return stripUndefined(encode(partialSchema, partial)) as Partial<zinput<S>>\n}\n\n/**\n * Creates a branded ZodCodec for use with zodvex type inference.\n * Thin wrapper around z.codec() that adds type branding, allowing\n * ConvexValidatorFromZod to extract the wire schema even when the\n * codec is wrapped in a custom type alias.\n *\n * @example\n * ```typescript\n * type MyCodec = ZodvexCodec<z.ZodObject<{ ts: z.ZodNumber }>, z.ZodCustom<Date>> // zod-ok\n *\n * function myCodec(): MyCodec {\n * return zodvexCodec(\n * z.object({ ts: z.number() }),\n * z.custom<Date>(() => true),\n * {\n * decode: (wire) => new Date(wire.ts),\n * encode: (date) => ({ ts: date.getTime() })\n * }\n * )\n * }\n * ```\n */\nexport function zodvexCodec<\n W extends $ZodType,\n R extends $ZodType,\n WO = zoutput<W>,\n RI = zoutput<R>\n>(\n wire: W,\n runtime: R,\n transforms: {\n decode: (wire: WO) => RI\n encode: (runtime: RI) => WO\n }\n): ZodvexCodec<W, R> {\n // Cast transforms to satisfy Zod's internal MaybeAsync typing while keeping our API simple\n return z.codec(wire as any, runtime as any, transforms as any) as unknown as ZodvexCodec<W, R>\n}\n","import type {\n GenericDataModel,\n GenericTableInfo,\n PaginationOptions,\n PaginationResult,\n TableNamesInDataModel\n} from 'convex/server'\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n// Type-only imports of db.ts classes — no runtime cycle. The actual class\n// references arrive at runtime via installRulesSubclasses() below, which\n// db.ts calls once its base classes are fully declared.\nimport type { ZodvexDatabaseReader, ZodvexDatabaseWriter, ZodvexQueryChain } from './db'\n\nexport {\n type DeleteRule,\n type InsertDoc,\n type InsertRule,\n type PatchRule,\n type ReaderAuditConfig,\n type ReadRule,\n type ReplaceRule,\n type ResolveDecodedDocForRules,\n type TableRules,\n type WriteEvent,\n type WriterAuditConfig,\n type ZodvexRules,\n type ZodvexRulesConfig\n} from './ruleTypes'\n\nimport type {\n InsertDoc,\n ReaderAuditConfig,\n ReadRule,\n ResolveDecodedDocForRules,\n TableRules,\n WriteEvent,\n WriterAuditConfig,\n ZodvexRules,\n ZodvexRulesConfig\n} from './ruleTypes'\n\n/**\n * Normalize a read rule result: true -> doc (pass-through), false/null -> null (deny), Doc -> Doc (transform).\n */\nexport function normalizeReadResult<Doc>(\n result: Doc | null | boolean,\n originalDoc: Doc\n): Doc | null {\n if (result === true) return originalDoc\n if (result === false) return null\n return result\n}\n\n// ============================================================================\n// Subclass storage + installer\n// ============================================================================\n//\n// The six classes below (Rules* and Audit*) all extend classes declared in\n// db.ts. Declaring them at module top level would force rules.ts to dereference\n// those base classes at its own module-init time — which in turn would force\n// db.ts to run first. But db.ts imports rules.ts, so it cannot. That's the\n// circular dependency.\n//\n// The fix: keep rules.ts top-level free of runtime references to db.ts. All\n// subclass declarations live inside `installRulesSubclasses`, which db.ts\n// calls AFTER its own class declarations are complete. At that point, the\n// base classes are real values and the extends chain resolves correctly.\n//\n// This replaces an earlier `dynamic import()` workaround, which had a timing\n// race: callers that invoked `.withRules()` or `.audit()` synchronously\n// (e.g., inside a `withContext` input function at mutation wire-up time)\n// could hit the guard before the dynamic import resolved.\n\ntype Subclasses = {\n RulesQueryChain: any\n RulesDatabaseReader: any\n RulesDatabaseWriter: any\n AuditQueryChain: any\n AuditDatabaseReader: any\n AuditDatabaseWriter: any\n}\n\nlet _subclasses: Subclasses | null = null\n\n/**\n * ESM live-binding for test-facing direct construction of `RulesQueryChain`.\n * Populated by `installRulesSubclasses`. Importers automatically see the\n * real class after install runs (which happens at db.ts module init).\n */\nexport let RulesQueryChain: any = null\n\nfunction getSubclasses(): Subclasses {\n if (!_subclasses) {\n throw new Error(\n 'zodvex rules subclasses not installed. This usually means the rules module ' +\n 'was loaded without db.ts running its installer. Import zodvex via the ' +\n 'public entry (zodvex/server) so db.ts initializes first.'\n )\n }\n return _subclasses\n}\n\n/**\n * Called once by db.ts after its base classes are declared. Builds the\n * Rules*/\n/* and Audit* subclasses with the correct extends chain. Safe to call\n * multiple times (idempotent).\n */\nexport function installRulesSubclasses(bases: {\n ZodvexQueryChain: typeof ZodvexQueryChain\n ZodvexDatabaseReader: typeof ZodvexDatabaseReader\n ZodvexDatabaseWriter: typeof ZodvexDatabaseWriter\n}): void {\n if (_subclasses) return\n\n const Base = bases as {\n ZodvexQueryChain: any\n ZodvexDatabaseReader: any\n ZodvexDatabaseWriter: any\n }\n\n /**\n * Extends ZodvexQueryChain, applying a read rule at every terminal method.\n * Intermediate methods are inherited from the base class via createChain().\n * Only terminals and createChain() are overridden.\n */\n class _RulesQueryChain<TableInfo extends GenericTableInfo, Doc> extends Base.ZodvexQueryChain {\n private readRule: ReadRule<any, Doc>\n private rulesConfig: ZodvexRulesConfig\n private ctx: any\n\n constructor(\n inner: any,\n schema: any,\n readRule: ReadRule<any, Doc>,\n config: ZodvexRulesConfig,\n ctx: any = {}\n ) {\n super(inner, schema)\n this.readRule = readRule\n this.rulesConfig = config\n this.ctx = ctx\n }\n\n protected createChain(inner: any): _RulesQueryChain<TableInfo, Doc> {\n return new _RulesQueryChain(\n inner,\n (this as any).schema,\n this.readRule,\n this.rulesConfig,\n this.ctx\n )\n }\n\n async first(): Promise<Doc | null> {\n for await (const doc of this as any) {\n return doc\n }\n return null\n }\n\n async unique(): Promise<Doc | null> {\n const doc = await super.unique()\n if (doc === null) return null\n return normalizeReadResult(await this.readRule(this.ctx, doc), doc)\n }\n\n async collect(): Promise<Doc[]> {\n const results: Doc[] = []\n for await (const doc of this as any) {\n results.push(doc)\n }\n return results\n }\n\n async take(n: number): Promise<Doc[]> {\n const results: Doc[] = []\n for await (const doc of this as any) {\n if (results.length >= n) break\n results.push(doc)\n }\n return results\n }\n\n async paginate(opts: PaginationOptions): Promise<PaginationResult<Doc>> {\n const result = await super.paginate(opts)\n const filtered: Doc[] = []\n for (const doc of result.page) {\n const allowed = normalizeReadResult(await this.readRule(this.ctx, doc), doc)\n if (allowed !== null) filtered.push(allowed)\n }\n return { ...result, page: filtered }\n }\n\n async count(): Promise<number> {\n if (!this.rulesConfig.allowCounting) {\n throw new Error('count is not allowed with rules')\n }\n return super.count()\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<Doc> {\n const iter = super[Symbol.asyncIterator]()\n while (true) {\n const { value, done } = await iter.next()\n if (done) break\n const result = normalizeReadResult(await this.readRule(this.ctx, value), value)\n if (result !== null) yield result\n }\n }\n }\n\n /**\n * Wraps a ZodvexDatabaseReader with per-table read rules.\n */\n class _RulesDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n > extends Base.ZodvexDatabaseReader {\n constructor(\n private inner: ZodvexDatabaseReader<DataModel, DecodedDocs>,\n private ctx: any,\n private rules: Record<string, TableRules<any, any>>,\n private rulesConfig: ZodvexRulesConfig\n ) {\n const { db, tableMap } = (inner as any)._internals\n super(db, tableMap)\n ;(this as any).system = (inner as any).system\n }\n\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n const doc = await this.inner.get(idOrTable, maybeId)\n if (doc === null) return null\n\n const tableName =\n maybeId !== undefined ? (idOrTable as string) : this.resolveTableFromId(idOrTable)\n\n if (!tableName) return doc\n return this.applyReadRule(tableName, doc)\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(tableName: TableName): any {\n const tableRules = this.rules[tableName as string]\n\n if (!tableRules?.read && (this.rulesConfig.defaultPolicy ?? 'allow') === 'allow') {\n return this.inner.query(tableName)\n }\n\n const innerChain = this.inner.query(tableName)\n const readRule = tableRules?.read ?? (async () => null)\n const passthroughSchema = z.any()\n return new _RulesQueryChain(\n innerChain,\n passthroughSchema,\n readRule,\n this.rulesConfig,\n this.ctx\n )\n }\n\n private resolveTableFromId(id: any): string | null {\n for (const tableName of Object.keys(this.rules)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n for (const tableName of Object.keys((this.inner as any)._internals.tableMap)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n }\n return null\n }\n\n private async applyReadRule(tableName: string, doc: any): Promise<any> {\n const tableRules = this.rules[tableName]\n if (!tableRules?.read) {\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') return null\n return doc\n }\n const result = await tableRules.read(this.ctx, doc)\n return normalizeReadResult(result, doc)\n }\n }\n\n /**\n * Wraps a ZodvexDatabaseWriter with per-table read and write rules.\n */\n class _RulesDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n > extends Base.ZodvexDatabaseWriter {\n private rulesReader: ZodvexDatabaseReader<DataModel, DecodedDocs>\n\n constructor(\n private inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>,\n private ctx: any,\n private rules: Record<string, TableRules<any, any>>,\n private rulesConfig: ZodvexRulesConfig\n ) {\n const { db, tableMap, reader: innerReader } = (inner as any)._internals\n super(db, tableMap)\n this.rulesReader = new _RulesDatabaseReader(innerReader, ctx, rules, rulesConfig) as any\n ;(this as any).system = (inner as any).system\n }\n\n normalizeId<TableName extends TableNamesInDataModel<DataModel>>(\n tableName: TableName,\n id: string\n ): GenericId<TableName> | null {\n return this.rulesReader.normalizeId(tableName, id)\n }\n\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n return this.rulesReader.get(idOrTable, maybeId)\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(tableName: TableName): any {\n return this.rulesReader.query(tableName)\n }\n\n async insert(table: any, value: any): Promise<any> {\n const tableName = table as string\n const tableRules = this.rules[tableName]\n\n if (tableRules?.insert) {\n const transformed = await tableRules.insert(this.ctx, value)\n return this.inner.insert(table, transformed)\n }\n\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n throw new Error(`insert not allowed on ${tableName}`)\n }\n\n return this.inner.insert(table, value)\n }\n\n async patch(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n }\n\n const doc = await this.rulesReader.get(id)\n if (doc === null) {\n throw new Error('no read access or doc does not exist')\n }\n\n const tableName = this.resolveTableFromId(id)\n const tableRules = tableName ? this.rules[tableName] : undefined\n\n if (tableRules?.patch) {\n const transformed = await tableRules.patch(this.ctx, doc, value)\n return this.inner.patch(id, transformed)\n }\n\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n throw new Error(`patch not allowed on ${tableName}`)\n }\n\n return this.inner.patch(id, value)\n }\n\n async replace(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n }\n\n const doc = await this.rulesReader.get(id)\n if (doc === null) {\n throw new Error('no read access or doc does not exist')\n }\n\n const tableName = this.resolveTableFromId(id)\n const tableRules = tableName ? this.rules[tableName] : undefined\n\n if (tableRules?.replace) {\n const transformed = await tableRules.replace(this.ctx, doc, value)\n return this.inner.replace(id, transformed)\n }\n\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n throw new Error(`replace not allowed on ${tableName}`)\n }\n\n return this.inner.replace(id, value)\n }\n\n async delete(idOrTable: any, maybeId?: any): Promise<void> {\n let id: any\n\n if (maybeId !== undefined) {\n id = maybeId\n } else {\n id = idOrTable\n }\n\n const doc = await this.rulesReader.get(id)\n if (doc === null) {\n throw new Error('no read access or doc does not exist')\n }\n\n const tableName = this.resolveTableFromId(id)\n const tableRules = tableName ? this.rules[tableName] : undefined\n\n if (tableRules?.delete) {\n await tableRules.delete(this.ctx, doc)\n return this.inner.delete(id)\n }\n\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n throw new Error(`delete not allowed on ${tableName}`)\n }\n\n return this.inner.delete(id)\n }\n\n private resolveTableFromId(id: any): string | null {\n for (const tableName of Object.keys(this.rules)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n if ((this.rulesConfig.defaultPolicy ?? 'allow') === 'deny') {\n for (const tableName of Object.keys((this.inner as any)._internals.tableMap)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n }\n return null\n }\n }\n\n // ==========================================================================\n // Audit wrapping — afterRead and afterWrite callbacks\n // ==========================================================================\n\n /**\n * Extends ZodvexQueryChain to fire an afterRead callback for each document\n * returned by terminal methods.\n */\n class _AuditQueryChain<TableInfo extends GenericTableInfo, Doc> extends Base.ZodvexQueryChain {\n private afterRead: (table: string, doc: any) => void | Promise<void>\n private tableName: string\n\n constructor(\n inner: any,\n schema: any,\n afterRead: (table: string, doc: any) => void | Promise<void>,\n tableName: string\n ) {\n super(inner, schema)\n this.afterRead = afterRead\n this.tableName = tableName\n }\n\n protected createChain(inner: any): _AuditQueryChain<TableInfo, Doc> {\n return new _AuditQueryChain(inner, (this as any).schema, this.afterRead, this.tableName)\n }\n\n async first(): Promise<Doc | null> {\n const doc = await super.first()\n if (doc !== null) await this.afterRead(this.tableName, doc)\n return doc\n }\n\n async unique(): Promise<Doc | null> {\n const doc = await super.unique()\n if (doc !== null) await this.afterRead(this.tableName, doc)\n return doc\n }\n\n async collect(): Promise<Doc[]> {\n const docs = await super.collect()\n for (const doc of docs) {\n await this.afterRead(this.tableName, doc)\n }\n return docs\n }\n\n async take(n: number): Promise<Doc[]> {\n const docs = await super.take(n)\n for (const doc of docs) {\n await this.afterRead(this.tableName, doc)\n }\n return docs\n }\n\n async paginate(opts: PaginationOptions): Promise<PaginationResult<Doc>> {\n const result = await super.paginate(opts)\n for (const doc of result.page) {\n await this.afterRead(this.tableName, doc)\n }\n return result\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<Doc> {\n const iter = super[Symbol.asyncIterator]()\n while (true) {\n const { value, done } = await iter.next()\n if (done) break\n await this.afterRead(this.tableName, value)\n yield value\n }\n }\n }\n\n /**\n * Wraps a ZodvexDatabaseReader with afterRead audit callbacks.\n */\n class _AuditDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n > extends Base.ZodvexDatabaseReader {\n private inner: ZodvexDatabaseReader<DataModel, DecodedDocs>\n private afterRead: (table: string, doc: any) => void | Promise<void>\n\n constructor(inner: ZodvexDatabaseReader<DataModel, DecodedDocs>, config: ReaderAuditConfig) {\n const { db, tableMap } = (inner as any)._internals\n super(db, tableMap)\n this.inner = inner\n this.afterRead =\n config.afterRead ??\n (() => {\n /* noop */\n })\n ;(this as any).system = (inner as any).system\n }\n\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n const doc = await this.inner.get(idOrTable, maybeId)\n if (doc !== null) {\n const tableName = this.resolveTableFromId(\n maybeId !== undefined ? maybeId : idOrTable,\n maybeId !== undefined ? idOrTable : undefined\n )\n if (tableName) {\n await this.afterRead(tableName, doc)\n }\n }\n return doc\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(tableName: TableName): any {\n const innerChain = this.inner.query(tableName)\n const passthroughSchema = z.any()\n return new _AuditQueryChain(\n innerChain,\n passthroughSchema,\n this.afterRead,\n tableName as string\n )\n }\n\n private resolveTableFromId(id: any, explicitTable?: string): string | null {\n if (explicitTable) return explicitTable\n for (const tableName of Object.keys((this as any).tableMap)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n return null\n }\n }\n\n /**\n * Wraps a ZodvexDatabaseWriter with afterRead and afterWrite audit callbacks.\n */\n class _AuditDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n > extends Base.ZodvexDatabaseWriter {\n private inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>\n private auditReader: ZodvexDatabaseReader<DataModel, DecodedDocs>\n private afterWrite: ((table: string, event: WriteEvent) => void | Promise<void>) | undefined\n\n constructor(inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>, config: WriterAuditConfig) {\n const { db, tableMap, reader: innerReader } = (inner as any)._internals\n super(db, tableMap)\n this.inner = inner\n this.afterWrite = config.afterWrite as typeof this.afterWrite\n\n this.auditReader = config.afterRead\n ? (new _AuditDatabaseReader(innerReader, { afterRead: config.afterRead }) as any)\n : innerReader\n ;(this as any).system = (inner as any).system\n }\n\n normalizeId<TableName extends TableNamesInDataModel<DataModel>>(\n tableName: TableName,\n id: string\n ): GenericId<TableName> | null {\n return this.auditReader.normalizeId(tableName, id)\n }\n\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n return this.auditReader.get(idOrTable, maybeId)\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(tableName: TableName): any {\n return this.auditReader.query(tableName)\n }\n\n async insert(table: any, value: any): Promise<any> {\n const id = await this.inner.insert(table, value)\n if (this.afterWrite) {\n await this.afterWrite(table as string, { type: 'insert', id, value })\n }\n return id\n }\n\n async patch(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n }\n\n const doc = await this.inner.get(id)\n\n if (maybeValue !== undefined) {\n await this.inner.patch(idOrTable, idOrValue, maybeValue)\n } else {\n await this.inner.patch(id, value)\n }\n\n if (this.afterWrite) {\n const tableName = this.resolveTableFromId(id)\n if (tableName) {\n await this.afterWrite(tableName, { type: 'patch', id, doc, value })\n }\n }\n }\n\n async replace(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n }\n\n const doc = await this.inner.get(id)\n\n if (maybeValue !== undefined) {\n await this.inner.replace(idOrTable, idOrValue, maybeValue)\n } else {\n await this.inner.replace(id, value)\n }\n\n if (this.afterWrite) {\n const tableName = this.resolveTableFromId(id)\n if (tableName) {\n await this.afterWrite(tableName, { type: 'replace', id, doc, value })\n }\n }\n }\n\n async delete(idOrTable: any, maybeId?: any): Promise<void> {\n let id: any\n\n if (maybeId !== undefined) {\n id = maybeId\n } else {\n id = idOrTable\n }\n\n const doc = await this.inner.get(id)\n\n if (maybeId !== undefined) {\n await this.inner.delete(idOrTable, maybeId)\n } else {\n await this.inner.delete(id)\n }\n\n if (this.afterWrite) {\n const tableName = this.resolveTableFromId(id)\n if (tableName) {\n await this.afterWrite(tableName, { type: 'delete', id, doc })\n }\n }\n }\n\n private resolveTableFromId(id: any): string | null {\n for (const tableName of Object.keys((this.inner as any)._internals.tableMap)) {\n if (this.inner.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n return null\n }\n }\n\n // Populate module slots. ESM live-binding updates importers of\n // `RulesQueryChain` automatically.\n RulesQueryChain = _RulesQueryChain\n _subclasses = {\n RulesQueryChain: _RulesQueryChain,\n RulesDatabaseReader: _RulesDatabaseReader,\n RulesDatabaseWriter: _RulesDatabaseWriter,\n AuditQueryChain: _AuditQueryChain,\n AuditDatabaseReader: _AuditDatabaseReader,\n AuditDatabaseWriter: _AuditDatabaseWriter\n }\n}\n\n// ============================================================================\n// Factory functions — public surface called by db.ts methods\n// ============================================================================\n\nexport function createRulesDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n>(\n inner: ZodvexDatabaseReader<DataModel, DecodedDocs>,\n ctx: any,\n rules: Record<string, TableRules<any, any>>,\n config?: ZodvexRulesConfig\n): ZodvexDatabaseReader<DataModel, DecodedDocs> {\n return new (getSubclasses().RulesDatabaseReader)(inner, ctx, rules, config ?? {})\n}\n\nexport function createRulesDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n>(\n inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>,\n ctx: any,\n rules: Record<string, TableRules<any, any>>,\n config?: ZodvexRulesConfig\n): ZodvexDatabaseWriter<DataModel, DecodedDocs> {\n return new (getSubclasses().RulesDatabaseWriter)(inner, ctx, rules, config ?? {})\n}\n\nexport function createAuditDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n>(\n inner: ZodvexDatabaseReader<DataModel, DecodedDocs>,\n config: ReaderAuditConfig\n): ZodvexDatabaseReader<DataModel, DecodedDocs> {\n return new (getSubclasses().AuditDatabaseReader)(inner, config)\n}\n\nexport function createAuditDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>\n>(\n inner: ZodvexDatabaseWriter<DataModel, DecodedDocs>,\n config: WriterAuditConfig\n): ZodvexDatabaseWriter<DataModel, DecodedDocs> {\n return new (getSubclasses().AuditDatabaseWriter)(inner, config)\n}\n","import type {\n DocumentByInfo,\n ExpressionOrValue,\n FieldPaths,\n FieldTypeFromFieldPath,\n FilterBuilder,\n GenericDatabaseReader,\n GenericDatabaseWriter,\n GenericDataModel,\n GenericDocument,\n GenericIndexFields,\n GenericTableInfo,\n IndexNames,\n IndexRange,\n NamedIndex,\n NamedSearchIndex,\n NamedTableInfo,\n PaginationOptions,\n PaginationResult,\n SearchFilter,\n SearchFilterBuilder,\n SearchIndexNames,\n TableNamesInDataModel\n} from 'convex/server'\nimport type { GenericId, NumericValue } from 'convex/values'\nimport { z } from 'zod'\nimport { decodeDoc, encodeDoc, encodePartialDoc } from './codec'\nimport {\n createAuditDatabaseReader,\n createAuditDatabaseWriter,\n createRulesDatabaseReader,\n createRulesDatabaseWriter,\n installRulesSubclasses\n} from './rules'\nimport type { ReaderAuditConfig, WriterAuditConfig, ZodvexRulesConfig } from './ruleTypes'\nimport type { ZodTableMap } from './schema'\nimport { $ZodObject, $ZodType, $ZodUnion, encode } from './zod-core'\n\n// Note on cycle: rules.ts imports ONLY types from db.ts, so this static import\n// triggers no runtime cycle. rules.ts loads first (its top level has no\n// references to db.ts values), then db.ts declares its base classes, and\n// installRulesSubclasses (called at the end of this file) lets rules.ts\n// build its subclass chain. This replaces a prior `dynamic import()`\n// workaround whose promise could race `.withRules()` / `.audit()` calls\n// made from within `withContext`-style input functions.\n\n// ============================================================================\n// Index builder types — decoded-aware replacements for Convex's IndexRangeBuilder\n// ============================================================================\n\n/**\n * Resolves the accepted value type for an index field comparison.\n *\n * - Dot-paths (e.g., \"email.value\"): resolve through the wire document,\n * since dot-paths navigate into wire-format sub-structures.\n * - Top-level fields present in DecodedDoc: use the decoded (runtime) type,\n * so codec fields accept decoded values (e.g., Date instead of number).\n * - Everything else: fall back to wire type via FieldTypeFromFieldPath.\n */\nexport type ZodvexIndexFieldValue<\n WireDoc extends GenericDocument,\n DecodedDoc,\n FieldPath extends string\n> = FieldPath extends `${string}.${string}`\n ? FieldTypeFromFieldPath<WireDoc, FieldPath>\n : FieldPath extends keyof DecodedDoc\n ? DecodedDoc[FieldPath]\n : FieldTypeFromFieldPath<WireDoc, FieldPath>\n\n/** Increments a numeric type literal by 1 (up to 15). Mirrors Convex's internal PlusOne. */\ntype PlusOne<N extends number> = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15][N]\n\n/**\n * Decoded-aware index range builder. Mirrors Convex's IndexRangeBuilder but uses\n * ZodvexIndexFieldValue for comparison value types, so codec fields accept\n * decoded/runtime types (e.g., Date) instead of requiring wire types (e.g., number).\n */\nexport interface ZodvexIndexRangeBuilder<\n WireDoc extends GenericDocument,\n DecodedDoc,\n IndexFields extends GenericIndexFields,\n FieldNum extends number = 0\n> extends ZodvexLowerBoundBuilder<WireDoc, DecodedDoc, IndexFields[FieldNum]> {\n eq(\n fieldName: IndexFields[FieldNum],\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFields[FieldNum]>\n ): ZodvexNextBuilder<WireDoc, DecodedDoc, IndexFields, FieldNum>\n}\n\n/** After .eq(), either another ZodvexIndexRangeBuilder (more fields) or IndexRange (done). */\ntype ZodvexNextBuilder<\n WireDoc extends GenericDocument,\n DecodedDoc,\n IndexFields extends GenericIndexFields,\n FieldNum extends number\n> =\n PlusOne<FieldNum> extends IndexFields['length']\n ? IndexRange\n : ZodvexIndexRangeBuilder<WireDoc, DecodedDoc, IndexFields, PlusOne<FieldNum>>\n\n/** Lower bound builder with decoded-aware value types. */\nexport interface ZodvexLowerBoundBuilder<\n WireDoc extends GenericDocument,\n DecodedDoc,\n IndexFieldName extends string\n> extends ZodvexUpperBoundBuilder<WireDoc, DecodedDoc, IndexFieldName> {\n gt(\n fieldName: IndexFieldName,\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFieldName>\n ): ZodvexUpperBoundBuilder<WireDoc, DecodedDoc, IndexFieldName>\n gte(\n fieldName: IndexFieldName,\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFieldName>\n ): ZodvexUpperBoundBuilder<WireDoc, DecodedDoc, IndexFieldName>\n}\n\n/** Upper bound builder with decoded-aware value types. */\nexport interface ZodvexUpperBoundBuilder<\n WireDoc extends GenericDocument,\n DecodedDoc,\n IndexFieldName extends string\n> extends IndexRange {\n lt(\n fieldName: IndexFieldName,\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFieldName>\n ): IndexRange\n lte(\n fieldName: IndexFieldName,\n value: ZodvexIndexFieldValue<WireDoc, DecodedDoc, IndexFieldName>\n ): IndexRange\n}\n\n// ============================================================================\n// Filter builder types — decoded-aware replacements for Convex's FilterBuilder\n// ============================================================================\n\ndeclare const _zodvexExpr: unique symbol\nexport type ZodvexExpression<T> = { readonly [_zodvexExpr]: T }\nexport type ZodvexExpressionOrValue<T> = ZodvexExpression<T> | T\n\nexport interface ZodvexFilterBuilder<\n TableInfo extends GenericTableInfo,\n Doc = DocumentByInfo<TableInfo>\n> {\n field<FP extends FieldPaths<TableInfo>>(\n fieldPath: FP\n ): ZodvexExpression<ZodvexIndexFieldValue<DocumentByInfo<TableInfo>, Doc, FP>>\n\n eq<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n neq<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n lt<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n lte<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n gt<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n gte<T>(l: ZodvexExpressionOrValue<T>, r: ZodvexExpressionOrValue<T>): ZodvexExpression<boolean>\n\n and(...exprs: ZodvexExpressionOrValue<boolean>[]): ZodvexExpression<boolean>\n or(...exprs: ZodvexExpressionOrValue<boolean>[]): ZodvexExpression<boolean>\n not(x: ZodvexExpressionOrValue<boolean>): ZodvexExpression<boolean>\n\n add<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n sub<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n mul<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n div<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n mod<T extends NumericValue>(\n l: ZodvexExpressionOrValue<T>,\n r: ZodvexExpressionOrValue<T>\n ): ZodvexExpression<T>\n neg<T extends NumericValue>(x: ZodvexExpressionOrValue<T>): ZodvexExpression<T>\n}\n\n/**\n * Encodes a comparison value for an index field through its Zod schema.\n *\n * - Top-level fields: encoded through their schema (codec fields transform,\n * non-codec fields are identity).\n * - Dot-paths: pass through unchanged (they target wire-format sub-fields\n * where the comparison value is already the correct primitive type).\n */\nfunction encodeIndexValue(schema: $ZodType, fieldPath: string, value: any): any {\n // Dot-paths target wire-format sub-fields — value is already correct\n if (fieldPath.includes('.')) return value\n\n // Object schemas: encode through the field's schema directly\n if (schema instanceof $ZodObject) {\n const fieldSchema = (schema as z.ZodObject<any>).shape[fieldPath] // zod-ok\n if (fieldSchema) return encode(fieldSchema, value)\n }\n\n // Union schemas (ZodDiscriminatedUnion extends ZodUnion): build a per-field\n // union from all variants, then encode through that. Handles discriminator\n // literals and codec fields (e.g., zx.date()) correctly.\n // Non-object variants are skipped — union tables require object variants.\n if (schema instanceof $ZodUnion) {\n const options = schema._zod.def.options\n const fieldSchemas = options\n .filter((v): v is z.ZodObject<any> => v instanceof $ZodObject) // zod-ok\n .map(v => v.shape[fieldPath])\n .filter(Boolean)\n if (fieldSchemas.length === 1) return encode(fieldSchemas[0], value)\n if (fieldSchemas.length > 1)\n return encode(z.union(fieldSchemas as [$ZodType, $ZodType, ...$ZodType[]]), value)\n }\n\n return value\n}\n\n/**\n * Wraps a Convex IndexRangeBuilder (or any builder with eq/gt/gte/lt/lte methods)\n * with automatic value encoding. Each comparison method encodes its value through\n * the table's doc schema before forwarding to the real builder.\n *\n * Returns another wrapped builder so chained calls (e.g., .eq().gte().lt()) are\n * all encoded.\n */\nfunction wrapIndexRangeBuilder(inner: any, schema: $ZodType): any {\n return new Proxy(inner, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && ['eq', 'gt', 'gte', 'lt', 'lte'].includes(prop)) {\n return (fieldName: string, value: any) => {\n const encoded = encodeIndexValue(schema, fieldName, value)\n const result = target[prop](fieldName, encoded)\n return wrapIndexRangeBuilder(result, schema)\n }\n }\n // Wrap .search() return value so SearchFilterFinalizer.eq() is encoded\n if (prop === 'search') {\n return (...args: any[]) => {\n const result = target.search(...args)\n return wrapIndexRangeBuilder(result, schema)\n }\n }\n return Reflect.get(target, prop, receiver)\n }\n })\n}\n\nfunction extractFieldPath(expr: any): string | null {\n if (expr && typeof expr.serialize === 'function') {\n const inner = expr.serialize()\n if (inner && typeof inner === 'object' && '$field' in inner) {\n return inner.$field\n }\n }\n return null\n}\n\nfunction wrapFilterBuilder(inner: any, schema: $ZodType): any {\n return new Proxy(inner, {\n get(target, prop, receiver) {\n if (typeof prop === 'string' && ['eq', 'neq', 'lt', 'lte', 'gt', 'gte'].includes(prop)) {\n return (l: any, r: any) => {\n const lField = extractFieldPath(l)\n const rField = extractFieldPath(r)\n if (lField && !rField) {\n r = encodeIndexValue(schema, lField, r)\n } else if (rField && !lField) {\n l = encodeIndexValue(schema, rField, l)\n }\n return target[prop](l, r)\n }\n }\n return Reflect.get(target, prop, receiver)\n }\n })\n}\n\n/**\n * Wraps a Convex query chain, decoding documents through a Zod schema\n * at terminal methods (first, unique, collect, take, paginate).\n *\n * Two type contexts (dual-generic design):\n * - `TableInfo`: Convex's wire-format table info. Used by intermediate methods\n * (filter, etc.) so FilterBuilder sees wire-format field types.\n * - `Doc`: The decoded/runtime document type. Used by terminal methods\n * (first, collect, paginate, etc.) and by ZodvexIndexRangeBuilder in\n * withIndex, so codec fields accept decoded values (e.g., Date).\n *\n * Consumer code never passes these generics manually — they're inferred\n * from ZodvexDatabaseReader.query() which gets them from defineZodSchema's\n * captured type parameter.\n *\n * Does NOT implement QueryInitializer<TableInfo> because terminal methods\n * return Doc (decoded) instead of DocumentByInfo<TableInfo> (wire).\n */\nexport class ZodvexQueryChain<TableInfo extends GenericTableInfo, Doc = DocumentByInfo<TableInfo>> {\n constructor(\n protected inner: any,\n protected schema: $ZodType\n ) {}\n\n /** Factory method for intermediate methods. Subclasses override to return their own type. */\n protected createChain(inner: any): ZodvexQueryChain<TableInfo, Doc> {\n return new ZodvexQueryChain(inner, this.schema)\n }\n\n /** Decode a wire-format doc and cast to the decoded document type. */\n private decode(doc: any): Doc {\n return decodeDoc(this.schema, doc) as Doc\n }\n\n // --- Intermediate methods: wire-typed TableInfo for Convex machinery ---\n\n fullTableScan(): ZodvexQueryChain<TableInfo, Doc> {\n return this.createChain(this.inner.fullTableScan())\n }\n\n withIndex<IndexName extends IndexNames<TableInfo>>(\n indexName: IndexName,\n indexRange?: (\n q: ZodvexIndexRangeBuilder<DocumentByInfo<TableInfo>, Doc, NamedIndex<TableInfo, IndexName>>\n ) => IndexRange\n ): ZodvexQueryChain<TableInfo, Doc> {\n const wrappedRange = indexRange\n ? (q: any) => indexRange(wrapIndexRangeBuilder(q, this.schema))\n : undefined\n return this.createChain(this.inner.withIndex(indexName, wrappedRange))\n }\n\n withSearchIndex<IndexName extends SearchIndexNames<TableInfo>>(\n indexName: IndexName,\n searchFilter: (\n q: SearchFilterBuilder<DocumentByInfo<TableInfo>, NamedSearchIndex<TableInfo, IndexName>>\n ) => SearchFilter\n ): ZodvexQueryChain<TableInfo, Doc> {\n const wrappedFilter = (q: any) => searchFilter(wrapIndexRangeBuilder(q, this.schema))\n return this.createChain(this.inner.withSearchIndex(indexName, wrappedFilter))\n }\n\n order(order: 'asc' | 'desc'): ZodvexQueryChain<TableInfo, Doc> {\n return this.createChain(this.inner.order(order))\n }\n\n // Overload 1: decoded-aware predicate (tried first)\n filter(\n predicate: (q: ZodvexFilterBuilder<TableInfo, Doc>) => ZodvexExpressionOrValue<boolean>\n ): ZodvexQueryChain<TableInfo, Doc>\n // Overload 2: Convex-native predicate (backwards compatible)\n filter(\n predicate: (q: FilterBuilder<TableInfo>) => ExpressionOrValue<boolean>\n ): ZodvexQueryChain<TableInfo, Doc>\n // Implementation\n filter(predicate: any): ZodvexQueryChain<TableInfo, Doc> {\n const wrappedPredicate = (q: any) => predicate(wrapFilterBuilder(q, this.schema))\n return this.createChain(this.inner.filter(wrappedPredicate))\n }\n\n limit(n: number): ZodvexQueryChain<TableInfo, Doc> {\n return this.createChain(this.inner.limit(n))\n }\n\n count(): Promise<number> {\n return this.inner.count()\n }\n\n // --- Terminal methods: return decoded Doc type ---\n\n async first(): Promise<Doc | null> {\n const doc = await this.inner.first()\n return doc ? this.decode(doc) : null\n }\n\n async unique(): Promise<Doc | null> {\n const doc = await this.inner.unique()\n return doc ? this.decode(doc) : null\n }\n\n async collect(): Promise<Doc[]> {\n const docs = await this.inner.collect()\n return docs.map((doc: any) => this.decode(doc))\n }\n\n async take(n: number): Promise<Doc[]> {\n const docs = await this.inner.take(n)\n return docs.map((doc: any) => this.decode(doc))\n }\n\n async paginate(paginationOpts: PaginationOptions): Promise<PaginationResult<Doc>> {\n const result = await this.inner.paginate(paginationOpts)\n return {\n ...result,\n page: result.page.map((doc: any) => this.decode(doc))\n }\n }\n\n // --- AsyncIterable: decode each yielded document ---\n\n async *[Symbol.asyncIterator](): AsyncIterator<Doc> {\n for await (const doc of this.inner) {\n yield this.decode(doc)\n }\n }\n}\n\n/**\n * Resolves the decoded document type for a given table.\n * If the table has a decoded type in DecodedDocs, use it.\n * Otherwise fall back to DocumentByInfo (wire types = runtime types for tables without codecs).\n */\ntype ResolveDecodedDoc<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>,\n TableName extends TableNamesInDataModel<DataModel>\n> = TableName extends keyof DecodedDocs\n ? DecodedDocs[TableName]\n : DocumentByInfo<NamedTableInfo<DataModel, TableName>>\n\n/** System fields auto-managed by Convex — not writable by consumers. */\ntype SystemFields = '_id' | '_creationTime'\n\n/** Decoded doc without system fields — for insert and replace values. */\ntype DecodedWriteValue<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>,\n TableName extends TableNamesInDataModel<DataModel>\n> = Omit<ResolveDecodedDoc<DataModel, DecodedDocs, TableName>, SystemFields>\n\n/** Partial decoded doc without system fields — for patch values. */\ntype DecodedPatchValue<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any>,\n TableName extends TableNamesInDataModel<DataModel>\n> = Partial<Omit<ResolveDecodedDoc<DataModel, DecodedDocs, TableName>, SystemFields>>\n\n/**\n * Resolves a table name from a GenericId by iterating the tableMap\n * and calling normalizeId. Same approach as convex-helpers' WrapReader.\n */\nfunction resolveTableName<DataModel extends GenericDataModel>(\n db: GenericDatabaseReader<DataModel>,\n tableMap: ZodTableMap,\n id: GenericId<any>\n): string | null {\n for (const tableName of Object.keys(tableMap)) {\n // tableName is a dynamic string key — can't narrow to TableNamesInDataModel\n if (db.normalizeId(tableName as any, id as unknown as string)) {\n return tableName\n }\n }\n return null\n}\n\n/**\n * Wraps a GenericDatabaseReader with automatic Zod codec decoding on reads.\n * Documents from tables in the zodTableMap are decoded through their schema.\n * Tables not in the map pass through without decoding.\n * System tables always pass through.\n *\n * DecodedDocs is a phantom type carrying the decoded document types for each\n * table (computed by DecodedDocFor<T> from defineZodSchema). It's never\n * accessed at runtime — it only drives the Doc generic on ZodvexQueryChain\n * so terminal methods return decoded types (e.g., Date instead of number).\n *\n * Does NOT implement GenericDatabaseReader<DataModel> because query() returns\n * ZodvexQueryChain (with decoded terminal types) instead of QueryInitializer\n * (with wire terminal types).\n */\nexport class ZodvexDatabaseReader<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any> = Record<string, any>\n> {\n system: GenericDatabaseReader<DataModel>['system']\n\n constructor(\n protected db: GenericDatabaseReader<DataModel>,\n protected tableMap: ZodTableMap\n ) {\n this.system = db.system\n }\n\n /** @internal Expose for wrapper construction (rules.ts, audit subclasses) */\n get _internals(): { db: GenericDatabaseReader<DataModel>; tableMap: ZodTableMap } {\n return { db: this.db, tableMap: this.tableMap }\n }\n\n normalizeId<TableName extends TableNamesInDataModel<DataModel>>(\n tableName: TableName,\n id: string\n ): GenericId<TableName> | null {\n return this.db.normalizeId(tableName, id)\n }\n\n get<TableName extends TableNamesInDataModel<DataModel>>(\n id: GenericId<TableName>\n ): Promise<ResolveDecodedDoc<DataModel, DecodedDocs, TableName> | null>\n /** @internal 2-arg form for table-first lookups */\n get(idOrTable: any, maybeId?: any): Promise<any>\n async get(idOrTable: any, maybeId?: any): Promise<any> {\n let tableName: string | null\n let doc: any\n\n if (maybeId !== undefined) {\n // get(table, id) form\n tableName = idOrTable as string\n // 2-arg get(table, id) is @internal in Convex types — cast required\n doc = await (this.db as any).get(idOrTable, maybeId)\n } else {\n // get(id) form\n doc = await this.db.get(idOrTable)\n tableName = doc ? resolveTableName(this.db, this.tableMap, idOrTable) : null\n }\n\n if (!doc) return null\n\n const schemas = tableName ? this.tableMap[tableName] : undefined\n return schemas ? decodeDoc(schemas.doc, doc) : doc\n }\n\n query<TableName extends TableNamesInDataModel<DataModel>>(\n tableName: TableName\n ): ZodvexQueryChain<\n NamedTableInfo<DataModel, TableName>,\n ResolveDecodedDoc<DataModel, DecodedDocs, TableName>\n > {\n const schemas = this.tableMap[tableName as string]\n const innerQuery = this.db.query(tableName)\n if (!schemas) {\n // No codec for this table — return unwrapped query as-is.\n // Wire types = runtime types for non-codec tables, and\n // ResolveDecodedDoc falls back to DocumentByInfo (wire) here.\n // Cast required: Convex QueryInitializer is structurally incompatible\n // with ZodvexQueryChain (decoded terminal return types).\n return innerQuery as any\n }\n return new ZodvexQueryChain<\n NamedTableInfo<DataModel, TableName>,\n ResolveDecodedDoc<DataModel, DecodedDocs, TableName>\n >(innerQuery, schemas.doc)\n }\n\n /**\n * Returns a new ZodvexDatabaseReader that applies per-table read rules.\n * The returned reader is also a ZodvexDatabaseReader, so `.withRules()` can be chained.\n */\n withRules<Ctx>(\n ctx: Ctx,\n rules: Record<string, any>,\n config?: ZodvexRulesConfig\n ): ZodvexDatabaseReader<DataModel, DecodedDocs> {\n return createRulesDatabaseReader(this, ctx, rules, config)\n }\n\n /**\n * Returns a new ZodvexDatabaseReader that fires audit callbacks on reads.\n * The returned reader is also a ZodvexDatabaseReader, so `.audit()` can be chained\n * with `.withRules()`.\n */\n audit(config: ReaderAuditConfig): ZodvexDatabaseReader<DataModel, DecodedDocs> {\n return createAuditDatabaseReader(this, config)\n }\n}\n\n/**\n * Wraps a GenericDatabaseWriter with automatic Zod codec encoding on writes\n * and decoding on reads. Inherits read methods from ZodvexDatabaseReader so\n * that `ZodvexDatabaseWriter` narrows to `ZodvexDatabaseReader` at call sites\n * — the native Convex `MutationCtx → QueryCtx` idiom (#64).\n *\n * Does NOT implement GenericDatabaseWriter<DataModel> because query() returns\n * ZodvexQueryChain (decoded types) instead of QueryInitializer (wire types).\n */\nexport class ZodvexDatabaseWriter<\n DataModel extends GenericDataModel,\n DecodedDocs extends Record<string, any> = Record<string, any>\n> extends ZodvexDatabaseReader<DataModel, DecodedDocs> {\n // Narrows the inherited `protected db` to the writer-typed view without\n // shadowing the underlying instance. Used by the write methods below.\n protected get writerDb(): GenericDatabaseWriter<DataModel> {\n return this.db as GenericDatabaseWriter<DataModel>\n }\n\n declare system: GenericDatabaseWriter<DataModel>['system']\n\n constructor(db: GenericDatabaseWriter<DataModel>, tableMap: ZodTableMap) {\n super(db, tableMap)\n this.system = db.system\n }\n\n /**\n * @internal Expose writer-typed internals for rules / audit subclasses.\n * Includes a `reader` field that aliases `this` (writer IS-A reader after\n * the #64 refactor) so callers expecting `_internals.reader` still work.\n */\n override get _internals(): {\n db: GenericDatabaseWriter<DataModel>\n tableMap: ZodTableMap\n reader: ZodvexDatabaseReader<DataModel, DecodedDocs>\n } {\n return { db: this.writerDb, tableMap: this.tableMap, reader: this }\n }\n\n // --- Write methods: encode before delegating ---\n\n insert<TableName extends TableNamesInDataModel<DataModel>>(\n table: TableName,\n value: DecodedWriteValue<DataModel, DecodedDocs, TableName>\n ): Promise<GenericId<TableName>>\n /** @internal untyped fallback */\n insert(table: any, value: any): Promise<any>\n async insert(table: any, value: any): Promise<any> {\n const schemas = this.tableMap[table as string]\n const wireValue = schemas ? encodeDoc(schemas.insert, value) : value\n return this.writerDb.insert(table, wireValue)\n }\n\n patch<TableName extends TableNamesInDataModel<DataModel>>(\n id: GenericId<TableName>,\n value: DecodedPatchValue<DataModel, DecodedDocs, TableName>\n ): Promise<void>\n /** @internal 3-arg form for table-first patches */\n patch(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void>\n async patch(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let tableName: string | null\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n // patch(table, id, value) form\n tableName = idOrTable\n id = idOrValue\n value = maybeValue\n } else {\n // patch(id, value) form\n id = idOrTable\n value = idOrValue\n tableName = resolveTableName(this.db, this.tableMap, id)\n }\n\n const schemas = tableName ? this.tableMap[tableName] : undefined\n const wireValue = schemas ? encodePartialDoc(schemas.insert, value) : value\n\n if (maybeValue !== undefined) {\n // 3-arg form (table, id, value) is @internal in Convex types — cast required\n return (this.writerDb as any).patch(idOrTable, id, wireValue)\n }\n return this.writerDb.patch(id, wireValue)\n }\n\n replace<TableName extends TableNamesInDataModel<DataModel>>(\n id: GenericId<TableName>,\n value: DecodedWriteValue<DataModel, DecodedDocs, TableName>\n ): Promise<void>\n /** @internal 3-arg form for table-first replaces */\n replace(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void>\n async replace(idOrTable: any, idOrValue: any, maybeValue?: any): Promise<void> {\n let tableName: string | null\n let id: any\n let value: any\n\n if (maybeValue !== undefined) {\n tableName = idOrTable\n id = idOrValue\n value = maybeValue\n } else {\n id = idOrTable\n value = idOrValue\n tableName = resolveTableName(this.db, this.tableMap, id)\n }\n\n const schemas = tableName ? this.tableMap[tableName] : undefined\n const wireValue = schemas ? encodeDoc(schemas.insert, value) : value\n\n if (maybeValue !== undefined) {\n // 3-arg form (table, id, value) is @internal in Convex types — cast required\n return (this.writerDb as any).replace(idOrTable, id, wireValue)\n }\n return this.writerDb.replace(id, wireValue)\n }\n\n delete<TableName extends TableNamesInDataModel<DataModel>>(\n id: GenericId<TableName>\n ): Promise<void>\n /** @internal 2-arg form for table-first deletes */\n delete(idOrTable: any, maybeId?: any): Promise<void>\n async delete(idOrTable: any, maybeId?: any): Promise<void> {\n if (maybeId !== undefined) {\n // 2-arg form (table, id) is @internal in Convex types — cast required\n return (this.writerDb as any).delete(idOrTable, maybeId)\n }\n return this.writerDb.delete(idOrTable)\n }\n\n /**\n * Returns a new ZodvexDatabaseWriter that applies per-table read and write rules.\n * The returned writer is also a ZodvexDatabaseWriter, so `.withRules()` can be chained.\n *\n * Overrides Reader's signature so a writer chained call returns a writer.\n */\n override withRules<Ctx>(\n ctx: Ctx,\n rules: Record<string, any>,\n config?: ZodvexRulesConfig\n ): ZodvexDatabaseWriter<DataModel, DecodedDocs> {\n return createRulesDatabaseWriter(this, ctx, rules, config)\n }\n\n /**\n * Returns a new ZodvexDatabaseWriter that fires audit callbacks on reads and writes.\n * The returned writer is also a ZodvexDatabaseWriter, so `.audit()` can be chained\n * with `.withRules()`.\n *\n * Overrides Reader's signature so a writer chained call returns a writer.\n */\n override audit(config: WriterAuditConfig): ZodvexDatabaseWriter<DataModel, DecodedDocs> {\n return createAuditDatabaseWriter(this, config)\n }\n}\n\n/**\n * Creates a ZodvexDatabaseReader from a Convex DatabaseReader and a schema\n * with __zodTableMap (as returned by defineZodSchema).\n *\n * When the schema carries __decodedDocs (from defineZodSchema), DD is inferred\n * automatically, providing decoded types on query terminal methods.\n */\nexport function createZodDbReader<\n DataModel extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n>(\n db: GenericDatabaseReader<DataModel>,\n schema: { __zodTableMap: ZodTableMap; __decodedDocs?: DD }\n): ZodvexDatabaseReader<DataModel, DD> {\n return new ZodvexDatabaseReader(db, schema.__zodTableMap) as ZodvexDatabaseReader<DataModel, DD>\n}\n\n/**\n * Creates a ZodvexDatabaseWriter from a Convex DatabaseWriter and a schema\n * with __zodTableMap (as returned by defineZodSchema).\n *\n * When the schema carries __decodedDocs (from defineZodSchema), DD is inferred\n * automatically, providing decoded types on query terminal methods.\n */\nexport function createZodDbWriter<\n DataModel extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n>(\n db: GenericDatabaseWriter<DataModel>,\n schema: { __zodTableMap: ZodTableMap; __decodedDocs?: DD }\n): ZodvexDatabaseWriter<DataModel, DD> {\n return new ZodvexDatabaseWriter(db, schema.__zodTableMap) as ZodvexDatabaseWriter<DataModel, DD>\n}\n\n// Wire rules.ts subclasses now that base classes above are fully declared.\n// Safe to run at module scope — synchronous, idempotent, no promises.\ninstallRulesSubclasses({\n ZodvexQueryChain,\n ZodvexDatabaseReader,\n ZodvexDatabaseWriter\n})\n","import { ZodvexDatabaseReader, ZodvexDatabaseWriter } from './db'\nimport type { ZodTableMap } from './schema'\n\n/**\n * Creates Convex Customization objects that wrap ctx.db with codec\n * readers/writers. Returns { query, mutation } for use with\n * zCustomQuery/zCustomMutation or manual composition.\n *\n * @example\n * ```typescript\n * const codec = createZodvexCustomization(schema.__zodTableMap)\n * const authQuery = zCustomQuery(query, {\n * args: {},\n * input: async (ctx) => {\n * const codecResult = await codec.query.input(ctx, {})\n * const user = await getUserOrThrow({ ...ctx, ...codecResult.ctx })\n * return { ctx: { ...codecResult.ctx, user }, args: {} }\n * }\n * })\n * ```\n */\nexport function createZodvexCustomization(tableMap: ZodTableMap) {\n return {\n query: {\n args: {} as Record<string, never>,\n input: async (ctx: any, _args: any, _extra?: any) => ({\n ctx: { db: new ZodvexDatabaseReader(ctx.db, tableMap) },\n args: {}\n })\n },\n mutation: {\n args: {} as Record<string, never>,\n input: async (ctx: any, _args: any, _extra?: any) => ({\n ctx: { db: new ZodvexDatabaseWriter(ctx.db, tableMap) },\n args: {}\n })\n }\n }\n}\n","import type {\n ActionBuilder,\n FunctionVisibility,\n GenericActionCtx,\n GenericDataModel,\n GenericMutationCtx,\n GenericQueryCtx,\n MutationBuilder,\n QueryBuilder\n} from 'convex/server'\nimport type { PropertyValidators } from 'convex/values'\nimport type { Customization } from 'convex-helpers/server/customFunctions'\nimport { NoOp } from 'convex-helpers/server/customFunctions'\nimport type { z } from 'zod'\nimport { createZodvexActionCtx } from './actionCtx'\nimport type { CustomBuilder } from './custom'\nimport { zCustomAction, zCustomMutation, zCustomQuery } from './custom'\nimport { createZodvexCustomization } from './customization'\nimport type { ZodvexDatabaseReader, ZodvexDatabaseWriter } from './db'\nimport type { ZodTableMap } from './schema'\nimport type { AnyRegistry, Overwrite } from './types'\n\n/**\n * The context type received by query handlers when wrapDb: true.\n * Replaces ctx.db with ZodvexDatabaseReader while preserving auth, storage, etc.\n */\nexport type ZodvexQueryCtx<\n DM extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n> = Overwrite<GenericQueryCtx<DM>, { db: ZodvexDatabaseReader<DM, DD> }>\n\n/**\n * The context type received by mutation handlers when wrapDb: true.\n * Replaces ctx.db with ZodvexDatabaseWriter while preserving auth, storage, etc.\n */\nexport type ZodvexMutationCtx<\n DM extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n> = Overwrite<GenericMutationCtx<DM>, { db: ZodvexDatabaseWriter<DM, DD> }>\n\n/**\n * The context type received by action handlers.\n * Currently identical to GenericActionCtx (actions don't have ctx.db),\n * but exported for API symmetry and forward compatibility.\n */\nexport type ZodvexActionCtx<DM extends GenericDataModel> = GenericActionCtx<DM>\n\n/**\n * Empty codec context — used when the codec layer adds nothing to ctx (e.g. actions, wrapDb:false).\n *\n * MUST be {} not Record<string, never>. Record<string, never> has keyof = string (index signature),\n * causing Overwrite<Ctx, Record<string, never>> to strip all properties via Omit<Ctx, string>.\n * The {} type has keyof = never, so Overwrite passes through correctly.\n */\n// biome-ignore lint/complexity/noBannedTypes: {} is semantically correct here — see comment above\ntype NoCodecCtx = {}\n\ntype InternalCustomization = {\n args: Record<string, never>\n input: (ctx: any, args: any, extra?: any) => any\n}\n\ntype InternalCustomFn = (builder: any, customization: any) => any\n\ntype InitServerBuilders = {\n query: QueryBuilder<any, 'public'>\n mutation: MutationBuilder<any, 'public'>\n action: ActionBuilder<any, 'public'>\n internalQuery: QueryBuilder<any, 'internal'>\n internalMutation: MutationBuilder<any, 'internal'>\n internalAction: ActionBuilder<any, 'internal'>\n}\n\n/**\n * A zodvex builder: callable CustomBuilder + .withContext() for composing\n * user customizations on top of the codec layer.\n *\n * .withContext() is NOT chainable — returns a plain CustomBuilder.\n * To compose multiple customizations, compose them before passing to .withContext().\n */\nexport type ZodvexBuilder<\n FuncType extends 'query' | 'mutation' | 'action',\n CodecCtx extends Record<string, any>,\n InputCtx extends Record<string, any>,\n Visibility extends FunctionVisibility\n> = CustomBuilder<\n FuncType,\n Record<string, never>,\n CodecCtx,\n Record<string, never>,\n InputCtx,\n Visibility,\n Record<string, any>\n> & {\n withContext: <\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 customization: Customization<\n Overwrite<InputCtx, CodecCtx>,\n CustomArgsValidator,\n CustomCtx,\n CustomMadeArgs,\n ExtraArgs\n >\n ) => CustomBuilder<\n FuncType,\n CustomArgsValidator,\n Overwrite<CodecCtx, CustomCtx>,\n CustomMadeArgs,\n InputCtx,\n Visibility,\n ExtraArgs\n >\n}\n\n// Overload 1: wrapDb: false — no codec DB wrapping\nexport function initZodvex<DM extends GenericDataModel>(\n schema: { __zodTableMap: ZodTableMap },\n server: {\n query: QueryBuilder<DM, 'public'>\n mutation: MutationBuilder<DM, 'public'>\n action: ActionBuilder<DM, 'public'>\n internalQuery: QueryBuilder<DM, 'internal'>\n internalMutation: MutationBuilder<DM, 'internal'>\n internalAction: ActionBuilder<DM, 'internal'>\n },\n options: { wrapDb: false; registry?: () => AnyRegistry }\n): {\n zq: ZodvexBuilder<'query', NoCodecCtx, GenericQueryCtx<DM>, 'public'>\n zm: ZodvexBuilder<'mutation', NoCodecCtx, GenericMutationCtx<DM>, 'public'>\n za: ZodvexBuilder<'action', NoCodecCtx, GenericActionCtx<DM>, 'public'>\n ziq: ZodvexBuilder<'query', NoCodecCtx, GenericQueryCtx<DM>, 'internal'>\n zim: ZodvexBuilder<'mutation', NoCodecCtx, GenericMutationCtx<DM>, 'internal'>\n zia: ZodvexBuilder<'action', NoCodecCtx, GenericActionCtx<DM>, 'internal'>\n}\n\n// Overload 2: wrapDb: true (default) — codec DB wrapping with decoded types\n// DD (DecodedDocs) is inferred from schema.__decodedDocs, carrying the decoded\n// document types computed by DecodedDocFor<T> in defineZodSchema.\nexport function initZodvex<\n DM extends GenericDataModel,\n DD extends Record<string, any> = Record<string, any>\n>(\n schema: { __zodTableMap: ZodTableMap; __decodedDocs: DD },\n server: {\n query: QueryBuilder<DM, 'public'>\n mutation: MutationBuilder<DM, 'public'>\n action: ActionBuilder<DM, 'public'>\n internalQuery: QueryBuilder<DM, 'internal'>\n internalMutation: MutationBuilder<DM, 'internal'>\n internalAction: ActionBuilder<DM, 'internal'>\n },\n options?: { wrapDb?: true; registry?: () => AnyRegistry }\n): {\n zq: ZodvexBuilder<'query', { db: ZodvexDatabaseReader<DM, DD> }, GenericQueryCtx<DM>, 'public'>\n zm: ZodvexBuilder<\n 'mutation',\n { db: ZodvexDatabaseWriter<DM, DD> },\n GenericMutationCtx<DM>,\n 'public'\n >\n za: ZodvexBuilder<'action', NoCodecCtx, GenericActionCtx<DM>, 'public'>\n ziq: ZodvexBuilder<'query', { db: ZodvexDatabaseReader<DM, DD> }, GenericQueryCtx<DM>, 'internal'>\n zim: ZodvexBuilder<\n 'mutation',\n { db: ZodvexDatabaseWriter<DM, DD> },\n GenericMutationCtx<DM>,\n 'internal'\n >\n zia: ZodvexBuilder<'action', NoCodecCtx, GenericActionCtx<DM>, 'internal'>\n}\n\n// Implementation\nexport function initZodvex(\n schema: { __zodTableMap: ZodTableMap },\n server: InitServerBuilders,\n options?: { wrapDb?: boolean; registry?: () => AnyRegistry }\n) {\n const codec = createZodvexCustomization(schema.__zodTableMap)\n const noOp = createNoOpCustomization()\n const wrap = options?.wrapDb !== false\n\n const actionCust = createActionCustomization(options?.registry, noOp)\n const customizations = {\n query: wrap ? codec.query : noOp,\n mutation: wrap ? codec.mutation : noOp,\n action: actionCust\n }\n\n return createInitBuilderBundle(server, customizations)\n}\n\nfunction createNoOpCustomization(): InternalCustomization {\n return { args: {} as Record<string, never>, input: NoOp.input }\n}\n\nfunction createActionCustomization(\n registryThunk: (() => AnyRegistry) | undefined,\n noOp: InternalCustomization\n): InternalCustomization {\n if (!registryThunk) {\n return noOp\n }\n\n return {\n args: {} as Record<string, never>,\n input: async (ctx: any) => {\n const wrapped = createZodvexActionCtx(registryThunk(), ctx)\n return {\n ctx: { runQuery: wrapped.runQuery, runMutation: wrapped.runMutation },\n args: {}\n }\n }\n }\n}\n\nfunction getInitBuilderSpecs(\n server: InitServerBuilders,\n customizations: {\n query: InternalCustomization\n mutation: InternalCustomization\n action: InternalCustomization\n }\n) {\n return [\n ['zq', server.query, customizations.query, zCustomQuery],\n ['zm', server.mutation, customizations.mutation, zCustomMutation],\n ['za', server.action, customizations.action, zCustomAction],\n ['ziq', server.internalQuery, customizations.query, zCustomQuery],\n ['zim', server.internalMutation, customizations.mutation, zCustomMutation],\n ['zia', server.internalAction, customizations.action, zCustomAction]\n ] as const\n}\n\nfunction createInitBuilderBundle(\n server: InitServerBuilders,\n customizations: {\n query: InternalCustomization\n mutation: InternalCustomization\n action: InternalCustomization\n }\n) {\n const builders: Record<string, any> = {}\n\n for (const [key, rawBuilder, customization, customFn] of getInitBuilderSpecs(\n server,\n customizations\n )) {\n builders[key] = createZodvexBuilder(rawBuilder, customization, customFn as InternalCustomFn)\n }\n\n return builders\n}\n\n/**\n * Composes a codec customization with a user customization.\n * Codec input runs first (wraps ctx.db), user input runs second\n * (sees codec-wrapped ctx.db).\n *\n * Propagates onSuccess from the user's customization through the composed\n * return value so customFnBuilder can find it.\n *\n * @internal Exported for testing only -- not part of the public API.\n */\nexport function composeCustomizations(\n codecCust: InternalCustomization,\n userCust: { args?: any; input?: (ctx: any, args: any, extra?: any) => any }\n) {\n return {\n args: userCust.args ?? {},\n input: async (ctx: any, args: any, extra?: any) => {\n // 1. Codec layer: wrap ctx.db\n const codecResult = await codecCust.input(ctx, {}, extra)\n const codecCtx = { ...ctx, ...codecResult.ctx }\n\n // 2. User layer: sees codec-wrapped ctx.db\n if (!userCust.input) {\n return { ctx: codecResult.ctx, args: {} }\n }\n const userResult = await userCust.input(codecCtx, args, extra)\n\n // 3. Merge ctx/args; pass through user's onSuccess (convex-helpers convention)\n return {\n ctx: { ...codecResult.ctx, ...(userResult.ctx ?? {}) },\n args: userResult.args ?? {},\n ...(userResult.onSuccess && { onSuccess: userResult.onSuccess })\n }\n }\n }\n}\n\n/**\n * Creates a zodvex-enhanced builder: a CustomBuilder callable with\n * a .withContext() method for composing user customizations.\n *\n * .withContext() is NOT chainable — returns a plain CustomBuilder.\n * To compose multiple customizations, compose them before passing\n * to .withContext().\n *\n * @internal Exported for testing only -- not part of the public API.\n */\nexport function createZodvexBuilder(\n rawBuilder: any,\n codecCust: InternalCustomization,\n customFn: (builder: any, customization: any) => any\n) {\n const base: any = customFn(rawBuilder as any, codecCust as any)\n\n base.withContext = (userCust: any) => {\n const composed = composeCustomizations(codecCust, userCust)\n return customFn(rawBuilder as any, composed as any)\n }\n\n return base\n}\n","/**\n * Schema helpers — Pure Zod utilities for union handling and system fields.\n *\n * This module contains helpers extracted from tables.ts that have NO server\n * dependencies (no convex/server, no convex-helpers/server). They are safe\n * to import from zodvex (client-side code).\n *\n * Used by:\n * - model.ts (defineZodModel) — client-safe model definitions\n * - tables.ts (zodTable) — server-side table definitions\n */\n\nimport { z } from 'zod'\nimport {\n $ZodArray,\n $ZodDiscriminatedUnion,\n $ZodNumber,\n $ZodObject,\n type $ZodShape,\n $ZodType,\n $ZodUnion,\n clone\n} from './zod-core'\nimport { type ZxId, zx } from './zx'\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Helper type for Convex system fields added to documents\n */\nexport type SystemFields<TableName extends string> = {\n _id: ZxId<TableName>\n _creationTime: $ZodNumber\n}\n\n/**\n * Maps over union options, extending each ZodObject variant with system fields.\n * Non-object variants are preserved as-is.\n */\nexport type MapSystemFields<TableName extends string, Options extends readonly $ZodType[]> = {\n [K in keyof Options]: Options[K] extends z.ZodObject<infer Shape extends $ZodShape> // zod-ok\n ? z.ZodObject<Shape & SystemFields<TableName>> // zod-ok\n : Options[K]\n}\n\n/**\n * Core-compatible version of MapSystemFields.\n * Uses $ZodObject from zod/v4/core instead of z.ZodObject from full zod. // zod-ok\n */\nexport type MapSystemFieldsCore<TableName extends string, Options extends readonly $ZodType[]> = {\n [K in keyof Options]: Options[K] extends $ZodObject<infer Shape extends $ZodShape>\n ? $ZodObject<Shape & SystemFields<TableName>>\n : Options[K]\n}\n\n/**\n * Computes the result of adding system fields to a union/object schema.\n * Uses only $Zod* types from zod/v4/core — safe for shared code and mini consumers.\n *\n * Handles:\n * - $ZodObject → $ZodObject with system fields\n * - $ZodUnion → $ZodUnion with system fields on each variant\n * - $ZodDiscriminatedUnion → $ZodDiscriminatedUnion with system fields on each variant\n * - Other → returned as-is\n */\nexport type AddSystemFieldsToUnion<TableName extends string, Schema extends $ZodType> =\n Schema extends $ZodObject<infer Shape extends $ZodShape>\n ? $ZodObject<Shape & SystemFields<TableName>>\n : Schema extends $ZodUnion<infer Options extends readonly $ZodType[]>\n ? $ZodUnion<MapSystemFieldsCore<TableName, Options>>\n : Schema extends $ZodDiscriminatedUnion<\n infer Options extends readonly $ZodType[],\n infer Disc extends string\n >\n ? $ZodDiscriminatedUnion<MapSystemFieldsCore<TableName, Options>, Disc>\n : Schema\n\n/**\n * Minimum tuple type required by z.union() - at least 2 elements.\n */\ntype UnionTuple<T extends $ZodType = $ZodType> = readonly [T, T, ...T[]]\n\n// ============================================================================\n// Union Helpers - Type-safe utilities for working with Zod unions\n// ============================================================================\n\n/** Full-zod union type alias used by isZodUnion/getUnionOptions — zod-ok by design. */\ntype AnyZodUnion =\n // zod-ok\n | z.ZodUnion<readonly $ZodType[]> // zod-ok\n | z.ZodDiscriminatedUnion<readonly z.ZodObject<$ZodShape>[], string> // zod-ok\n\n/**\n * Type guard to check if a schema is a union type (ZodUnion or ZodDiscriminatedUnion).\n */\nexport function isZodUnion(schema: $ZodType): schema is AnyZodUnion {\n return schema instanceof $ZodUnion || schema instanceof $ZodDiscriminatedUnion\n}\n\n/**\n * Extracts the options array from a ZodUnion or ZodDiscriminatedUnion.\n * Both union types have an `.options` property, but TypeScript doesn't\n * create a common accessor after instanceof checks.\n *\n * @param schema - A ZodUnion or ZodDiscriminatedUnion schema\n * @returns The array of union variant schemas\n */\nexport function getUnionOptions(schema: AnyZodUnion): readonly $ZodType[] {\n // $ZodDiscriminatedUnion extends $ZodUnion, so this covers both\n if (schema instanceof $ZodUnion) {\n return schema._zod.def.options\n }\n // cast: unreachable due to the union type constraint, but satisfies return type\n return (schema as any)._zod.def.options\n}\n\n/**\n * Asserts that an array has at least 2 elements, as required by z.union().\n * Throws an error if the array has fewer than 2 elements.\n *\n * @param options - Array of Zod schemas\n * @throws Error if array has fewer than 2 elements\n */\nexport function assertUnionOptions<T extends $ZodType>(\n options: readonly T[]\n): asserts options is UnionTuple<T> {\n if (options.length < 2) {\n throw new Error(\n `z.union() requires at least 2 options, but received ${options.length}. ` +\n 'This indicates an invalid union schema was passed to zodTable().'\n )\n }\n}\n\n/**\n * Creates a z.union() from an array of options with runtime validation.\n * Ensures the array has at least 2 elements as required by Zod.\n *\n * @param options - Array of Zod schemas (must have at least 2 elements)\n * @returns A ZodUnion schema\n * @throws Error if array has fewer than 2 elements\n */\n// Return type alias — prevents z.ZodUnion on a {-ending line (formatter-safe). // zod-ok\ntype ZodUnionOf<T extends $ZodType> = z.ZodUnion<UnionTuple<T>> // zod-ok\n\nexport function createUnionFromOptions<T extends $ZodType>(options: readonly T[]): ZodUnionOf<T> {\n assertUnionOptions(options)\n return z.union(options)\n}\n\n/**\n * Adds Convex system fields (_id, _creationTime) to a Zod schema.\n *\n * For object schemas: extends with system fields\n * For union schemas: adds system fields to each variant\n *\n * @param tableName - The Convex table name\n * @param schema - The Zod schema (object or union)\n * @returns Schema with system fields added\n */\n// Overload 1: ZodObject - extends with system fields\nexport function addSystemFields<TableName extends string, Shape extends $ZodShape>(\n tableName: TableName,\n schema: z.ZodObject<Shape> // zod-ok\n): z.ZodObject<Shape & SystemFields<TableName>> // zod-ok\n\n// Overload 2: ZodUnion - maps system fields to each variant\nexport function addSystemFields<TableName extends string, Options extends readonly $ZodType[]>(\n tableName: TableName,\n schema: z.ZodUnion<Options> // zod-ok\n): z.ZodUnion<MapSystemFields<TableName, Options>> // zod-ok\n\n// Overload 3: ZodDiscriminatedUnion - maps system fields preserving discriminator\n// Note: Zod v4 signature is ZodDiscriminatedUnion<Options, Discriminator>\nexport function addSystemFields<\n TableName extends string,\n Options extends readonly z.ZodObject<$ZodShape>[], // zod-ok\n Discriminator extends string\n>(\n tableName: TableName,\n schema: z.ZodDiscriminatedUnion<Options, Discriminator> // zod-ok\n): z.ZodDiscriminatedUnion<MapSystemFields<TableName, Options>, Discriminator> // zod-ok\n\n// Overload 4: Fallback for other ZodTypes - returns as-is\nexport function addSystemFields<TableName extends string, S extends $ZodType>(\n tableName: TableName,\n schema: S\n): S\n\n// Implementation\nexport function addSystemFields<TableName extends string>(\n tableName: TableName,\n schema: $ZodType\n): $ZodType {\n // Handle union schemas - add system fields to each variant\n if (isZodUnion(schema)) {\n const originalOptions = getUnionOptions(schema)\n const extendedOptions = originalOptions.map((variant: $ZodType) => {\n if (variant instanceof $ZodObject) {\n const newShape = {\n ...variant._zod.def.shape,\n _id: zx.id(tableName),\n _creationTime: z.number()\n }\n // Clone preserves the original's class + reinitializes with merged def\n return clone(variant, { ...variant._zod.def, shape: newShape })\n }\n // Non-object variants are returned as-is (shouldn't happen in practice)\n return variant\n })\n return createUnionFromOptions(extendedOptions)\n }\n\n // Handle object schemas — clone preserves class, checks, catchall, error\n if (schema instanceof $ZodObject) {\n const newShape = { ...schema._zod.def.shape, _id: zx.id(tableName), _creationTime: z.number() }\n return clone(schema, { ...schema._zod.def, shape: newShape })\n }\n\n // Fallback: return schema as-is\n return schema\n}\n","import { z } from 'zod'\nimport {\n addSystemFields,\n createUnionFromOptions,\n getUnionOptions,\n isZodUnion\n} from './schemaHelpers'\nimport { $ZodNullable, $ZodObject, $ZodOptional, type $ZodShape, $ZodType } from './zod-core'\nimport { zx } from './zx'\n\n// Return type alias so helper signatures don't expose full zod internals everywhere.\ntype AnyOptional = z.ZodOptional<any> // zod-ok\n\nexport type RuntimeModelSchemaBundle = {\n readonly doc: $ZodType\n readonly base: $ZodType\n readonly insert: $ZodType\n readonly update: $ZodType\n readonly docArray: $ZodType\n readonly paginatedDoc: $ZodType\n}\n\n/** Wrap in .optional() only if not already optional. Uses core constructor for zod-mini compat. */\nfunction ensureOptional(schema: $ZodType): AnyOptional {\n if (schema instanceof $ZodOptional) return schema as z.ZodOptional<any> // zod-ok\n return new $ZodOptional({ type: 'optional', innerType: schema }) as z.ZodOptional<any> // zod-ok\n}\n\n/** Wrap in .nullable().optional() using core constructors for zod-mini compat. */\nfunction nullableOptional(schema: $ZodType): $ZodType {\n return new $ZodOptional({\n type: 'optional',\n innerType: new $ZodNullable({ type: 'nullable', innerType: schema })\n }) as any\n}\n\nexport function createPartialShape(shape: Record<string, $ZodType>): Record<string, $ZodType> {\n const partialShape: Record<string, $ZodType> = {}\n for (const [key, value] of Object.entries(shape)) {\n partialShape[key] = ensureOptional(value)\n }\n return partialShape\n}\n\nexport function createUpdateObjectSchema<Name extends string>(\n name: Name,\n shape: Record<string, $ZodType>\n): z.ZodObject<any> {\n return z.object({\n _id: zx.id(name),\n _creationTime: z.optional(z.number()),\n ...createPartialShape(shape)\n })\n}\n\nexport function createPaginatedDocSchema(docSchema: $ZodType): z.ZodObject<any> {\n return z.object({\n page: z.array(docSchema),\n isDone: z.boolean(),\n continueCursor: z.string(),\n splitCursor: nullableOptional(z.string()),\n pageStatus: nullableOptional(z.enum(['SplitRecommended', 'SplitRequired']))\n })\n}\n\nexport function createObjectSchemaBundle<Name extends string>(\n name: Name,\n fields: $ZodShape,\n baseSchema: z.ZodObject<any> = z.object(fields)\n): RuntimeModelSchemaBundle {\n const docSchema = addSystemFields(name, baseSchema)\n\n return {\n doc: docSchema,\n base: baseSchema,\n insert: baseSchema,\n update: createUpdateObjectSchema(name, fields),\n docArray: z.array(docSchema),\n paginatedDoc: createPaginatedDocSchema(docSchema)\n }\n}\n\nexport function createSchemaUpdateSchema<Name extends string>(\n name: Name,\n inputSchema: $ZodType\n): $ZodType {\n if (isZodUnion(inputSchema)) {\n const updateOptions = getUnionOptions(inputSchema).map((variant: $ZodType) => {\n if (variant instanceof $ZodObject) {\n return createUpdateObjectSchema(name, variant._zod.def.shape)\n }\n return variant\n })\n return createUnionFromOptions(updateOptions)\n }\n\n if (inputSchema instanceof $ZodObject) {\n return createUpdateObjectSchema(name, inputSchema._zod.def.shape)\n }\n\n return inputSchema\n}\n\nexport function createSchemaBundle<Name extends string>(\n name: Name,\n inputSchema: $ZodType\n): RuntimeModelSchemaBundle {\n const docSchema = addSystemFields(name, inputSchema)\n\n return {\n doc: docSchema,\n base: inputSchema,\n insert: inputSchema,\n update: createSchemaUpdateSchema(name, inputSchema),\n docArray: z.array(docSchema),\n paginatedDoc: createPaginatedDocSchema(docSchema)\n }\n}\n","/**\n * zx - zodvex extended validators\n *\n * A namespace for zodvex-specific validators and codecs that handle\n * Convex wire format transformations. The \"zx\" prefix signals:\n * - \"zodvex\" or \"zod + convex\" extended types\n * - Explicit transformations (not magic)\n * - Discoverable via IDE autocomplete on `zx.`\n *\n * @example\n * ```typescript\n * import { z } from 'zod'\n * import { zx } from 'zodvex'\n *\n * const userShape = {\n * name: z.string(), // Standard Zod\n * createdAt: zx.date(), // zodvex: Date ↔ timestamp\n * teamId: zx.id('teams'), // zodvex: Convex ID\n * }\n * ```\n */\n\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\nimport { zodvexCodec } from './codec'\nimport { registryHelpers } from './ids'\nimport { attachCodecBrand } from './meta'\nimport { createSchemaUpdateSchema } from './modelSchemaBundle'\nimport { addSystemFields } from './schemaHelpers'\nimport type { ZodvexCodec } from './types'\nimport {\n type $ZodCustom,\n $ZodNullable,\n type $ZodNumber,\n $ZodOptional,\n type $ZodType,\n $ZodType as $ZodTypeValue,\n type output as zoutput\n} from './zod-core'\n\n/**\n * Date codec type for explicit type annotations\n */\nexport type FullZodvexCodec<W extends $ZodType, R extends $ZodType> = z.ZodCodec<W, R> &\n ZodvexCodec<W, R>\n\nexport type ZxDate = FullZodvexCodec<$ZodNumber, $ZodCustom<Date, Date>>\n\n/**\n * Creates a Date codec that transforms between Date objects and timestamps.\n *\n * Wire format: number (Unix timestamp in milliseconds)\n * Runtime format: Date object\n *\n * @example\n * ```typescript\n * const schema = z.object({\n * createdAt: zx.date(),\n * updatedAt: zx.date().optional(),\n * })\n * ```\n */\nfunction date(): ZxDate {\n return zodvexCodec(\n z.number(), // Wire: timestamp\n z.custom<Date>(val => val instanceof Date, {\n message: 'Expected Date instance'\n }),\n {\n decode: (timestamp: number) => new Date(timestamp),\n encode: (date: Date) => date.getTime()\n }\n ) as unknown as ZxDate\n}\n\n/**\n * ID type for explicit type annotations\n */\nexport type ZxId<TableName extends string> = z.ZodString &\n z.ZodType<GenericId<TableName>> & {\n _tableName: TableName\n }\n\n/**\n * Creates a Convex ID validator for a specific table.\n *\n * Wire format: string (Convex ID)\n * Runtime format: GenericId<TableName> (branded string type)\n *\n * Note: Unlike zx.date(), IDs don't require runtime transformation since\n * GenericId<T> is a branded string type. The branding is purely type-level.\n *\n * @param tableName - The Convex table name for this ID\n *\n * @example\n * ```typescript\n * const schema = z.object({\n * userId: zx.id('users'),\n * teamId: zx.id('teams').optional(),\n * })\n * ```\n */\nfunction id<TableName extends string>(tableName: TableName): ZxId<TableName> {\n // Create base string validator with refinement\n const baseSchema = z.string().check(\n z.refine(val => typeof val === 'string' && val.length > 0, {\n message: `Invalid ID for table \"${tableName}\"`\n }),\n z.describe(`convexId:${tableName}`)\n )\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 ZxId<TableName>\n}\n\n/**\n * Creates a custom codec for transforming between wire and runtime formats.\n *\n * Use this when you need custom transformations beyond the built-in helpers.\n *\n * @param wire - Zod schema for the wire format (stored in Convex)\n * @param runtime - Zod schema for the runtime format (used in code)\n * @param transforms - Encode/decode functions\n * @param opts.brand - Optional provenance brand. When set, codegen matches a\n * function-embedded instance of this codec to its importable twin (an\n * exported const or model field with the same brand) by *declared* identity\n * rather than inferring it from structure — collision-free and namespaced\n * across factories. Useful for codec factories like `tagged()` / `sensitive()`\n * whose every call returns a fresh instance. See\n * `docs/decisions/2026-06-08-codec-provenance-brands.md`.\n *\n * @example\n * ```typescript\n * // Encrypted data codec\n * const encryptedString = zx.codec(\n * z.object({ encrypted: z.string() }), // Wire format\n * z.custom<string>(() => true), // Runtime format\n * {\n * decode: (wire) => decrypt(wire.encrypted),\n * encode: (value) => ({ encrypted: encrypt(value) })\n * }\n * )\n *\n * // Branded factory codec — codegen matches inline instances by brand\n * function tagged(inner, name) {\n * return zx.codec(wire(inner), runtime(inner), transforms, { brand: `tagged:${name}` })\n * }\n * ```\n */\nfunction codec<W extends $ZodType, R extends $ZodType, WO = zoutput<W>, RI = zoutput<R>>(\n wire: W,\n runtime: R,\n transforms: {\n decode: (wire: WO) => RI\n encode: (runtime: RI) => WO\n },\n opts?: { brand?: string }\n): FullZodvexCodec<W, R> {\n const built = zodvexCodec(wire, runtime, transforms) as unknown as FullZodvexCodec<W, R>\n if (opts?.brand) attachCodecBrand(built as object, opts.brand)\n return built\n}\n\n/**\n * Minimal model shape accepted by zx helpers.\n * Both full and slim models satisfy this at runtime.\n */\ntype ZxModelInput = {\n readonly name: string\n readonly fields: Record<string, $ZodType>\n readonly schema?: unknown\n}\n\n/**\n * Per-model caches so repeated `zx.doc(model)` / `zx.base(model)` / etc. calls\n * across call sites share a single Zod schema instance.\n *\n * Caches are keyed on a stable identity that survives chain methods\n * (`.index()`, `.searchIndex()`, `.vectorIndex()`), which return new model\n * objects but preserve `fields` (object slim) and `schema` (union slim) by\n * reference. Keying on the model object would force every chain step to\n * re-allocate.\n *\n * Full models bypass these caches entirely — they carry a pre-built schema\n * bundle, and `zx.*(fullModel)` returns the bundle's schema directly so\n * identity matches `fullModel.schema.{doc,base,...}`.\n *\n * The cache maps are pinned to `globalThis` under a `Symbol.for` registry so\n * multiple bundled copies of this module share state. tsup splits each entry\n * into its own bundle (CLI, codegen, main, server, …), duplicating this file\n * per entry. Without the shared registry, `zx.doc(Model)` in user code\n * (loaded from `dist/index.js`) and `zx.doc(ref)` in codegen (loaded from\n * `dist/cli/index.js`) would write to distinct WeakMaps, producing different\n * instances for the same model — identity matching would silently fail.\n */\nfunction sharedWeakMap(name: string): WeakMap<object, $ZodType> {\n const key = Symbol.for(`zodvex.zx.cache.${name}`)\n const g = globalThis as unknown as Record<symbol, WeakMap<object, $ZodType>>\n const existing = g[key]\n if (existing) return existing\n const created = new WeakMap<object, $ZodType>()\n g[key] = created\n return created\n}\n\nconst baseCache = sharedWeakMap('base')\nconst docCache = sharedWeakMap('doc')\nconst updateCache = sharedWeakMap('update')\nconst docArrayCache = sharedWeakMap('docArray')\n\n/**\n * Stable cache key for slim models:\n * - union slim → the user-supplied schema (preserved across chains)\n * - object slim → the fields record (preserved across chains)\n */\nfunction slimCacheKey(model: ZxModelInput): object {\n const s = model.schema as any\n return s instanceof $ZodTypeValue ? s : model.fields\n}\n\n/**\n * Returns the base schema for a model — the user fields as a Zod object (or the\n * user-supplied union for discriminated-union models).\n *\n * Full models: returns the bundle's pre-built `.base` (no allocation).\n * Union slim: returns the user's schema (no allocation — it IS the base).\n * Object slim: builds `z.object(fields)` once, cached on `fields`.\n */\nfunction base(model: ZxModelInput): $ZodType {\n const s = model.schema as any\n if (s?.base instanceof $ZodTypeValue) return s.base\n if (s instanceof $ZodTypeValue) return s\n const cached = baseCache.get(model.fields)\n if (cached) return cached\n if (Object.keys(model.fields).length === 0) {\n throw new Error(`[zodvex] Cannot derive base schema for model '${model.name}'`)\n }\n const built = z.object(model.fields) as any\n baseCache.set(model.fields, built)\n return built\n}\n\n/**\n * Constructs a doc schema: base fields + _id + _creationTime.\n * Full models reuse `model.schema.doc`; slim models cache on slimCacheKey(model).\n */\nfunction doc(model: ZxModelInput) {\n const s = model.schema as any\n if (s?.doc instanceof $ZodTypeValue) return s.doc\n const key = slimCacheKey(model)\n const cached = docCache.get(key)\n if (cached) return cached\n const built = addSystemFields(model.name, base(model)) as any\n docCache.set(key, built)\n return built\n}\n\n/**\n * Constructs an update schema: _id required + _creationTime optional + all user fields optional.\n * Full models reuse `model.schema.update`; slim models cache on slimCacheKey(model).\n */\nfunction update(model: ZxModelInput) {\n const s = model.schema as any\n if (s?.update instanceof $ZodTypeValue) return s.update\n const key = slimCacheKey(model)\n const cached = updateCache.get(key)\n if (cached) return cached\n const built = createSchemaUpdateSchema(model.name, base(model)) as any\n updateCache.set(key, built)\n return built\n}\n\n/**\n * Constructs a doc array schema: z.array(doc(model)).\n * Full models reuse `model.schema.docArray`; slim models cache on slimCacheKey(model).\n */\nfunction docArray(model: ZxModelInput) {\n const s = model.schema as any\n if (s?.docArray instanceof $ZodTypeValue) return s.docArray\n const key = slimCacheKey(model)\n const cached = docArrayCache.get(key)\n if (cached) return cached\n const built = z.array(doc(model)) as any\n docArrayCache.set(key, built)\n return built\n}\n\n/** Wrap in .nullable() using core constructor for zod-mini compat. */\nfunction nullable(schema: $ZodType): $ZodType {\n return new $ZodNullable({ type: 'nullable', innerType: schema }) as any\n}\n\n/** Wrap in .optional() using core constructor for zod-mini compat. */\nfunction optional(schema: $ZodType): $ZodType {\n return new $ZodOptional({ type: 'optional', innerType: schema }) as any\n}\n\n/** Wrap in .nullable().optional() using core constructors for zod-mini compat. */\nfunction nullableOptional(schema: $ZodType): $ZodType {\n return optional(nullable(schema))\n}\n\n/**\n * Pagination options schema — matches Convex's PaginationOptions type.\n */\nfunction paginationOpts() {\n return z.object({\n numItems: z.number(),\n cursor: nullable(z.string()),\n endCursor: nullableOptional(z.string()),\n id: optional(z.number()),\n maximumRowsRead: optional(z.number()),\n maximumBytesRead: optional(z.number())\n })\n}\n\n/**\n * Paginated result schema — wraps any item schema in Convex's PaginationResult shape.\n */\nfunction paginationResult<T extends $ZodType>(itemSchema: T) {\n return z.object({\n page: z.array(itemSchema),\n isDone: z.boolean(),\n continueCursor: z.string(),\n splitCursor: nullableOptional(z.string()),\n pageStatus: nullableOptional(z.enum(['SplitRecommended', 'SplitRequired']))\n })\n}\n\n/**\n * zx namespace - zodvex extended validators\n *\n * Provides explicit, discoverable helpers for Convex-specific transformations.\n */\nexport const zx = {\n /**\n * Date ↔ timestamp codec\n * @see {@link date}\n */\n date,\n\n /**\n * Convex ID validator\n * @see {@link id}\n */\n id,\n\n /**\n * Custom codec builder\n * @see {@link codec}\n */\n codec,\n\n /**\n * Pagination options schema matching Convex's PaginationOptions type\n * @see {@link paginationOpts}\n */\n paginationOpts,\n\n /**\n * Paginated result schema wrapping any item schema in Convex's PaginationResult shape\n * @see {@link paginationResult}\n */\n paginationResult,\n\n /**\n * Base schema for a model (user fields only; no system fields).\n * For object models reconstructs from fields; for union models returns the\n * user-supplied union. Cached per-model.\n * @see {@link base}\n */\n base,\n\n /**\n * Doc schema: model fields + _id + _creationTime\n * @see {@link doc}\n */\n doc,\n\n /**\n * Update schema: _id required, all other fields optional\n * @see {@link update}\n */\n update,\n\n /**\n * Doc array schema: z.array(doc(model))\n * @see {@link docArray}\n */\n docArray\n} as const\n","import {\n type DataModelFromSchemaDefinition,\n defineSchema,\n defineTable,\n type NamedTableInfo,\n type TableDefinition,\n type TableNamesInDataModel\n} from 'convex/server'\nimport type { ObjectType, VObject } from 'convex/values'\nimport type { ZodvexFilterBuilder } from './db'\nimport {\n type ConvexValidatorFromZod,\n type ConvexValidatorFromZodFieldsAuto,\n zodToConvex,\n zodToConvexFields\n} from './mapping'\nimport { readMeta, type ZodvexModelMeta } from './meta'\nimport type { AnyZodModel, AnyZodModelBase, SearchIndexConfig, VectorIndexConfig } from './model'\nimport type {\n $ZodDiscriminatedUnion,\n $ZodShape,\n $ZodType,\n $ZodUnion,\n output as zoutput\n} from './zod-core'\nimport { zx } from './zx'\n\n/**\n * The runtime schema slice the DB wrapper needs for a single table:\n * - `doc` — decode shape for reads (full doc with system fields)\n * - `insert` — encode shape for writes (user fields only)\n *\n * Other derived schemas (`update`, `docArray`, `paginatedDoc`, `base`) are not\n * retained here — they're constructed on demand via `zx.*` at use sites, with\n * per-model WeakMap caches deduplicating across call sites. This keeps\n * `zodTableMap` minimal for the Convex 64MB isolate budget.\n */\nexport type ZodTableSchemas = {\n doc: $ZodType\n insert: $ZodType\n}\n\n/**\n * Maps table names to their full schema set.\n * Used by ZodvexDatabaseReader/Writer to look up decode/encode schemas.\n */\nexport type ZodTableMap = Record<string, ZodTableSchemas>\n\n// Accept any zodTable() result shape — both object-shape and union overloads\ntype ZodTableEntry = {\n table: any\n schema: ZodTableSchemas\n}\n\n// Accept defineZodModel() results — constrained against the base type\n// so both full models (with schema bundle) and slim models work.\nexport type ZodModelEntry = AnyZodModelBase\n\ntype ZodSchemaEntry = ZodTableEntry | ZodModelEntry\n\nfunction isZodModelEntry(entry: ZodSchemaEntry): entry is ZodModelEntry {\n return readMeta(entry)?.type === 'model'\n}\n\nfunction getZodModelMeta(model: ZodModelEntry): ZodvexModelMeta {\n const meta = readMeta(model)\n if (!meta || meta.type !== 'model') {\n throw new Error(`Model '${model.name}' is missing zodvex model metadata.`)\n }\n return meta\n}\n\n// ============================================================================\n// Type-level table definition computation\n// ============================================================================\n\n/**\n * Compute the Convex TableDefinition type for a single schema entry.\n *\n * - zodTable entries: extract the already-typed .table property.\n * At the call site, T[K] preserves the specific zodTable return type\n * (not the widened ZodTableEntry), so `infer` captures the full\n * TableDefinition<VObject<...>> type.\n *\n * - defineZodModel entries: compute from fields/schema + indexes.\n * This mirrors what tableFromModel() + defineTable() do at runtime.\n * For union models (schema.base extends $ZodUnion | $ZodDiscriminatedUnion),\n * uses ConvexValidatorFromZod<Base> (produces VUnion) instead of\n * ConvexValidatorFromZodFieldsAuto<F> (which would see empty fields).\n * Indexes are converted from readonly tuples to mutable (Convex's format).\n */\ntype ConvexTableFor<E> =\n // zodTable entry — extract .table with full VObject type\n E extends { table: infer T extends TableDefinition }\n ? T\n : // Full model entry — schema is nested bundle with .base\n E extends {\n fields: infer F extends Record<string, $ZodType>\n schema: { base: infer Base extends $ZodType }\n indexes: infer I extends Record<string, readonly string[]>\n searchIndexes: infer SI extends Record<string, SearchIndexConfig>\n vectorIndexes: infer VI extends Record<string, VectorIndexConfig>\n }\n ? Base extends $ZodUnion<any> | $ZodDiscriminatedUnion<any, any>\n ? TableDefinition<\n ConvexValidatorFromZod<Base, 'required'>,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : TableDefinition<\n VObject<\n ObjectType<ConvexValidatorFromZodFieldsAuto<F>>,\n ConvexValidatorFromZodFieldsAuto<F>\n >,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : // Slim union model entry — `schema` is the bare $ZodType (user-supplied union)\n E extends {\n fields: infer F extends Record<string, $ZodType>\n schema: infer Base extends $ZodType\n indexes: infer I extends Record<string, readonly string[]>\n searchIndexes: infer SI extends Record<string, SearchIndexConfig>\n vectorIndexes: infer VI extends Record<string, VectorIndexConfig>\n }\n ? Base extends $ZodUnion<any> | $ZodDiscriminatedUnion<any, any>\n ? TableDefinition<\n ConvexValidatorFromZod<Base, 'required'>,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : TableDefinition<\n VObject<\n ObjectType<ConvexValidatorFromZodFieldsAuto<F>>,\n ConvexValidatorFromZodFieldsAuto<F>\n >,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : // Slim object model entry — no `schema` property; derive from fields.\n E extends {\n fields: infer F extends Record<string, $ZodType>\n indexes: infer I extends Record<string, readonly string[]>\n searchIndexes: infer SI extends Record<string, SearchIndexConfig>\n vectorIndexes: infer VI extends Record<string, VectorIndexConfig>\n }\n ? TableDefinition<\n VObject<\n ObjectType<ConvexValidatorFromZodFieldsAuto<F>>,\n ConvexValidatorFromZodFieldsAuto<F>\n >,\n { [K in keyof I]: [...I[K]] },\n { [K in keyof SI]: { searchField: string; filterFields: string } },\n { [K in keyof VI]: { vectorField: string; dimensions: number; filterFields: string } }\n >\n : TableDefinition\n\n/**\n * Map all entries to their Convex TableDefinition types.\n * This is the type-level equivalent of the runtime loop that builds convexTables.\n */\ntype ConvexTablesFrom<T extends Record<string, ZodSchemaEntry>> = {\n [K in keyof T & string]: ConvexTableFor<T[K]>\n}\n\n/**\n * Computes decoded (runtime) document types for each table from the schema entry types.\n * Uses z.output<> on each table's doc schema, which resolves codec transforms\n * (e.g., zx.date() wire number → runtime Date).\n *\n * This is a phantom type — it exists only for TypeScript inference, never accessed at runtime.\n * Handles both full models (schema bundle with .doc) and slim models (no schema bundle)\n * by falling through to `any` when the schema shape doesn't match.\n */\nexport type DecodedDocFor<T extends Record<string, ZodSchemaEntry>> = {\n [K in keyof T & string]: T[K] extends { schema: { doc: infer D extends $ZodType } }\n ? zoutput<D>\n : T[K] extends { doc: infer D extends $ZodType }\n ? zoutput<D>\n : any\n}\n\n// ============================================================================\n// Runtime helpers\n// ============================================================================\n\n/**\n * Creates a Convex table definition from a ZodModel's fields and index metadata.\n */\nfunction tableFromModel(model: ZodModelEntry) {\n const meta = getZodModelMeta(model)\n const usesBaseSchema =\n meta.definitionSource === 'schema' ||\n (meta.definitionSource == null && Object.keys(model.fields).length === 0)\n\n let table = usesBaseSchema\n ? defineTable(zodToConvex(zx.base(model as any)) as any)\n : defineTable(zodToConvexFields(model.fields))\n\n for (const [indexName, indexFields] of Object.entries(model.indexes)) {\n // defineZodModel appends _creationTime to stored index fields,\n // but Convex adds it automatically — strip it\n const userFields = indexFields.filter(f => f !== '_creationTime')\n table = table.index(indexName, userFields as any)\n }\n\n for (const [indexName, config] of Object.entries(model.searchIndexes)) {\n table = table.searchIndex(indexName, config as any)\n }\n\n for (const [indexName, config] of Object.entries(model.vectorIndexes)) {\n table = table.vectorIndex(indexName, config as any)\n }\n\n return table\n}\n\n// ============================================================================\n// defineZodSchema\n// ============================================================================\n\n/**\n * Wraps Convex's defineSchema() and captures zodTable/model references.\n * The returned object is a valid Convex schema AND carries __zodTableMap\n * for use by createZodDbReader/createZodDbWriter.\n *\n * Accepts either zodTable() results or defineZodModel() results.\n * When given a model, creates the Convex table definition from the\n * model's fields and applies its index metadata.\n *\n * Type preservation: the ConvexTablesFrom<T> mapped type computes the\n * full TableDefinition<VObject<...>> for each entry, so defineSchema\n * receives specific document types and index metadata. This ensures\n * DataModelFromSchemaDefinition produces a DataModel with typed documents,\n * field paths, and index constraints — required for ctx.db and withIndex\n * type safety.\n *\n * @example With defineZodModel\n * ```typescript\n * // convex/schema.ts\n * import { UserModel } from './models/user'\n * import { TaskModel } from './models/task'\n *\n * export default defineZodSchema({\n * users: UserModel,\n * tasks: TaskModel,\n * })\n * ```\n *\n * @example With zodTable (legacy)\n * ```typescript\n * export default defineZodSchema({\n * users: Users, // zodTable() result\n * posts: Posts,\n * })\n * ```\n */\nexport function defineZodSchema<T extends Record<string, ZodSchemaEntry>>(tables: T) {\n const convexTables: Record<string, any> = {}\n const zodTableMap: ZodTableMap = {}\n\n for (const [name, entry] of Object.entries(tables)) {\n if (isZodModelEntry(entry)) {\n if (entry.name !== name) {\n throw new Error(\n `Model name '${entry.name}' does not match key '${name}'. ` +\n `The model name must match the key in the schema definition.`\n )\n }\n convexTables[name] = tableFromModel(entry)\n\n // Only `doc` (read decode) and `insert` (write encode) are consumed at\n // runtime by the DB wrapper. Full models already carry `meta.schemas.doc`\n // and `meta.schemas.insert` — alias them (no allocation). Slim models go\n // through cached zx helpers, so `doc`/`base` allocate at most once each.\n const meta = getZodModelMeta(entry)\n if (meta.schemas) {\n zodTableMap[name] = {\n doc: meta.schemas.doc,\n insert: meta.schemas.insert\n }\n } else {\n zodTableMap[name] = {\n doc: zx.doc(entry),\n insert: zx.base(entry)\n }\n }\n } else {\n convexTables[name] = entry.table\n // zodTable produces a 6-schema bundle; we only need doc + insert.\n zodTableMap[name] = {\n doc: entry.schema.doc,\n insert: entry.schema.insert\n }\n }\n }\n\n // Runtime builds convexTables dynamically (loop erases types).\n // ConvexTablesFrom<T> restores the full TableDefinition types that\n // defineSchema needs to produce a properly-typed DataModel.\n const convexSchema = defineSchema(convexTables as ConvexTablesFrom<T>)\n\n const result = Object.assign(convexSchema, { __zodTableMap: zodTableMap })\n return result as typeof result & { __decodedDocs: DecodedDocFor<T> }\n}\n\n// ============================================================================\n// Schema-derived helper types\n// ============================================================================\n\n/** Extract the DataModel from a defineZodSchema result */\nexport type InferDataModel<Schema extends ReturnType<typeof defineZodSchema>> =\n DataModelFromSchemaDefinition<Schema>\n\n/** Extract TableInfo for a specific table */\nexport type InferTableInfo<\n Schema extends ReturnType<typeof defineZodSchema>,\n TableName extends TableNamesInDataModel<InferDataModel<Schema>>\n> = NamedTableInfo<InferDataModel<Schema>, TableName>\n\n/** Extract the decoded document type for a specific table */\nexport type InferDecodedDoc<\n Schema extends ReturnType<typeof defineZodSchema>,\n TableName extends TableNamesInDataModel<InferDataModel<Schema>>\n> = Schema extends { __decodedDocs: infer DD }\n ? TableName extends keyof DD\n ? DD[TableName]\n : never\n : never\n\n/** A ZodvexFilterBuilder typed for a specific table */\nexport type InferFilterBuilder<\n Schema extends ReturnType<typeof defineZodSchema>,\n TableName extends TableNamesInDataModel<InferDataModel<Schema>>\n> = ZodvexFilterBuilder<InferTableInfo<Schema, TableName>, InferDecodedDoc<Schema, TableName>>\n","import { defineTable } from 'convex/server'\nimport type { GenericId } from 'convex/values'\nimport { Table } from 'convex-helpers/server'\nimport { z } from 'zod'\nimport {\n type ConvexValidatorFromZodFieldsAuto,\n zodToConvex,\n zodToConvexFields\n} from '../internal/mapping'\nimport { createObjectSchemaBundle, createSchemaBundle } from '../internal/modelSchemaBundle'\nimport { addSystemFields, type MapSystemFields, type SystemFields } from '../internal/schemaHelpers'\nimport { $ZodObject, type $ZodShape, $ZodType } from '../internal/zod-core'\nimport { type ZxId, zx } from '../internal/zx'\n\n/**\n * System fields added to Convex documents.\n */\ntype DocSystemFields<TableName extends string> = {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n}\n/**\n * Type for validators that can be used with Convex's defineTable.\n *\n * Convex's defineTable expects Validator<Record<string, any>, \"required\", any>,\n * but zodToConvex returns more specific types that TypeScript can't verify are\n * compatible. This type represents validators that produce object documents.\n *\n * @internal\n */\ntype TableValidator = Parameters<typeof defineTable>[0]\n\n/**\n * Asserts that a Convex validator can be used to define a table.\n *\n * This is needed because zodToConvex returns a specific validator type (like VUnion)\n * that TypeScript can't verify is assignable to defineTable's expected input type,\n * even though all union variants are objects that produce Record<string, any>.\n *\n * The runtime behavior is correct - Convex supports union validators in tables.\n * This is purely a TypeScript limitation with complex mapped types.\n *\n * @internal\n */\nfunction asTableValidator<V extends { kind: string }>(validator: V): TableValidator {\n return validator as unknown as TableValidator\n}\n\n/**\n * Creates a Zod schema for a Convex document with system fields.\n * Spreads the original def to preserve catchall, checks, and error settings.\n *\n * @deprecated Use `defineZodModel` instead. See `docs/migration/v0.6.md`.\n *\n * @param tableName - The Convex table name\n * @param schema - The Zod object schema for user fields\n * @returns A Zod object schema with _id and _creationTime added\n */\nexport function zodDoc<TableName extends string, Shape extends $ZodShape>(\n tableName: TableName,\n schema: z.ZodObject<Shape>\n): z.ZodObject<Shape & DocSystemFields<TableName>> {\n return addSystemFields(tableName, schema) as z.ZodObject<Shape & DocSystemFields<TableName>>\n}\n\n/**\n * @deprecated Use `defineZodModel` instead. See `docs/migration/v0.6.md`.\n */\nexport function zodDocOrNull<\n TableName extends string,\n Shape extends $ZodShape,\n Schema extends z.ZodObject<Shape>\n>(tableName: TableName, schema: Schema) {\n return z.union([zodDoc(tableName, schema), z.null()])\n}\n\n/**\n * Helper to detect if input is an object shape (plain object with Zod validators)\n */\nfunction isObjectShape(input: any): input is Record<string, $ZodType> {\n // Check if it's a plain object (not a Zod instance)\n if (!input || typeof input !== 'object') return false\n\n // If it's a Zod instance, it's not an object shape\n if (input instanceof $ZodType) return false\n\n // Check if all values are Zod types\n for (const key in input) {\n if (!(input[key] instanceof $ZodType)) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Defines a Convex table using either:\n * - A raw Zod shape (an object mapping field names to Zod types)\n * - A Zod union schema (for polymorphic tables)\n *\n * For object shapes, 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 *\n * For union schemas, this enables polymorphic tables with discriminated unions.\n *\n * Returns the Table definition along with Zod schemas for documents and arrays.\n *\n * @deprecated Use `defineZodModel` instead. See `docs/migration/v0.6.md`.\n *\n * @param name - The table name\n * @param schemaOrShape - Either a raw object shape or a Zod union schema\n * @returns A Table with attached helpers (shape, schema, zDoc, docArray, withSystemFields)\n *\n * @example Object shape\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 *\n * @example Union schema (polymorphic table)\n * ```ts\n * const shapeSchema = z.union([\n * z.object({ kind: z.literal('circle'), r: z.number() }),\n * z.object({ kind: z.literal('rectangle'), width: z.number() })\n * ])\n *\n * const Shapes = zodTable('shapes', shapeSchema)\n *\n * // Use in schema\n * export default defineSchema({ shapes: Shapes.table })\n *\n * // Use for return types with system fields\n * export const getShapes = zQuery(query, {},\n * async (ctx) => ctx.db.query('shapes').collect(),\n * { returns: Shapes.docArray }\n * )\n * ```\n */\n// Helper type to compute the result of addSystemFields for use in zodTable return type\ntype AddSystemFieldsResult<TableName extends string, Schema extends $ZodType> =\n Schema extends z.ZodObject<infer Shape extends z.ZodRawShape>\n ? z.ZodObject<Shape & SystemFields<TableName>>\n : Schema extends z.ZodUnion<infer Options extends readonly z.ZodTypeAny[]>\n ? z.ZodUnion<MapSystemFields<TableName, Options>>\n : Schema extends z.ZodDiscriminatedUnion<\n infer Options extends readonly z.ZodObject<z.ZodRawShape>[],\n infer Disc extends string\n >\n ? z.ZodDiscriminatedUnion<MapSystemFields<TableName, Options>, Disc>\n : Schema\n\n/**\n * Update schema shape: _id required, _creationTime optional, user fields partial\n */\ntype UpdateShape<TableName extends string, Shape extends z.ZodRawShape> = {\n _id: ZxId<TableName>\n _creationTime: z.ZodOptional<z.ZodNumber>\n} & {\n [K in keyof Shape]: z.ZodOptional<Shape[K]>\n}\n\n/**\n * Maps over union options for update schema.\n * Each variant gets _id required, _creationTime optional, and user fields partial.\n */\ntype MapUpdateVariants<TableName extends string, Options extends readonly z.ZodTypeAny[]> = {\n [K in keyof Options]: Options[K] extends z.ZodObject<infer Shape extends z.ZodRawShape>\n ? z.ZodObject<UpdateShape<TableName, Shape>>\n : Options[K]\n}\n\n/**\n * Computes the update schema type for a given schema.\n * Includes _id (required), _creationTime (optional), and partial user fields.\n * For unions: each variant gets update shape\n * For objects: the whole object gets update shape\n * For other types: returns as-is\n */\ntype UpdateSchemaType<TableName extends string, Schema extends $ZodType> =\n Schema extends z.ZodUnion<infer Options extends readonly z.ZodTypeAny[]>\n ? z.ZodUnion<MapUpdateVariants<TableName, Options>>\n : Schema extends z.ZodDiscriminatedUnion<\n infer Options extends readonly z.ZodObject<z.ZodRawShape>[],\n infer _Disc extends string\n >\n ? z.ZodUnion<MapUpdateVariants<TableName, Options>>\n : Schema extends z.ZodObject<infer Shape extends z.ZodRawShape>\n ? z.ZodObject<UpdateShape<TableName, Shape>>\n : Schema\n\n// Overload 1: Object shape (most common case - raw object with Zod validators)\nexport function zodTable<TableName extends string, Shape extends Record<string, $ZodType>>(\n name: TableName,\n shape: Shape\n): ReturnType<typeof Table<ConvexValidatorFromZodFieldsAuto<Shape>, TableName>> & {\n shape: Shape\n /** @deprecated Use `schema.doc` instead */\n zDoc: z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n /** @deprecated Use `schema.docArray` instead */\n docArray: z.ZodArray<\n z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n >\n schema: {\n doc: z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n docArray: z.ZodArray<\n z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n >\n /** Paginated result schema matching Convex's PaginationResult shape */\n paginatedDoc: z.ZodObject<{\n page: z.ZodArray<z.ZodObject<Shape & { _id: ZxId<TableName>; _creationTime: z.ZodNumber }>>\n isDone: z.ZodBoolean\n continueCursor: z.ZodOptional<z.ZodNullable<z.ZodString>>\n }>\n /** The base schema - user fields without system fields */\n base: z.ZodObject<Shape>\n /** Alias for base - user fields for insert operations */\n insert: z.ZodObject<Shape>\n /** Update schema - _id required, _creationTime optional, user fields partial */\n update: z.ZodObject<UpdateShape<TableName, Shape>>\n }\n}\n\n// Overload 2: ZodObject wrapper (extracts shape for same type inference as raw shape)\nexport function zodTable<TableName extends string, Shape extends $ZodShape>(\n name: TableName,\n schema: z.ZodObject<Shape>\n): ReturnType<typeof Table<ConvexValidatorFromZodFieldsAuto<Shape>, TableName>> & {\n shape: Shape\n /** @deprecated Use `schema.doc` instead */\n zDoc: z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n /** @deprecated Use `schema.docArray` instead */\n docArray: z.ZodArray<\n z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n >\n schema: {\n doc: z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n docArray: z.ZodArray<\n z.ZodObject<\n Shape & {\n _id: ZxId<TableName>\n _creationTime: z.ZodNumber\n }\n >\n >\n /** Paginated result schema matching Convex's PaginationResult shape */\n paginatedDoc: z.ZodObject<{\n page: z.ZodArray<z.ZodObject<Shape & { _id: ZxId<TableName>; _creationTime: z.ZodNumber }>>\n isDone: z.ZodBoolean\n continueCursor: z.ZodOptional<z.ZodNullable<z.ZodString>>\n }>\n /** The base schema - user fields without system fields */\n base: z.ZodObject<Shape>\n /** Alias for base - user fields for insert operations */\n insert: z.ZodObject<Shape>\n /** Update schema - _id required, _creationTime optional, user fields partial */\n update: z.ZodObject<UpdateShape<TableName, Shape>>\n }\n}\n\n// Overload 3: Union/schema types\nexport function zodTable<TableName extends string, Schema extends $ZodType>(\n name: TableName,\n schema: Schema\n): {\n table: ReturnType<typeof defineTable>\n tableName: TableName\n validator: ReturnType<typeof zodToConvex<Schema>>\n schema: {\n doc: AddSystemFieldsResult<TableName, Schema>\n docArray: z.ZodArray<AddSystemFieldsResult<TableName, Schema>>\n /** Paginated result schema matching Convex's PaginationResult shape */\n paginatedDoc: z.ZodObject<{\n page: z.ZodArray<AddSystemFieldsResult<TableName, Schema>>\n isDone: z.ZodBoolean\n continueCursor: z.ZodOptional<z.ZodNullable<z.ZodString>>\n }>\n /** The base schema - user fields without system fields */\n base: Schema\n /** Alias for base - user fields for insert operations */\n insert: Schema\n /** Update schema - _id required, _creationTime optional, user fields partial */\n update: UpdateSchemaType<TableName, Schema>\n }\n /** @deprecated Use `schema.docArray` instead */\n docArray: z.ZodArray<AddSystemFieldsResult<TableName, Schema>>\n withSystemFields: () => AddSystemFieldsResult<TableName, Schema>\n}\n\nexport function zodTable<\n TableName extends string,\n SchemaOrShape extends $ZodType | Record<string, $ZodType>\n>(name: TableName, schemaOrShape: SchemaOrShape): any {\n // Detect if it's an object shape, ZodObject, or other schema\n // For ZodObject: extract its shape to use the type-preserving path\n const isZodObject = schemaOrShape instanceof $ZodObject\n if (isObjectShape(schemaOrShape) || isZodObject) {\n // Extract shape from ZodObject or use raw shape directly\n const shape = isZodObject\n ? (schemaOrShape as z.ZodObject<z.ZodRawShape>).shape\n : (schemaOrShape as Record<string, $ZodType>)\n\n // Convert fields with proper types\n const convexFields = zodToConvexFields(shape) as ConvexValidatorFromZodFieldsAuto<typeof shape>\n\n // Create the Table from convex-helpers with explicit type\n const table = Table<ConvexValidatorFromZodFieldsAuto<typeof shape>, TableName>(\n name,\n convexFields\n )\n\n // Create base schema (user fields only, no system fields)\n // When a ZodObject is passed, preserve it to maintain options like .passthrough(), .strict(), .catchall()\n const baseSchema = isZodObject ? (schemaOrShape as z.ZodObject<z.ZodRawShape>) : z.object(shape)\n const schema = createObjectSchemaBundle(name, shape, baseSchema as z.ZodObject<any>)\n const zDoc = schema.doc\n const docArray = schema.docArray\n\n // Attach everything for comprehensive usage\n // zDoc and docArray are deprecated but kept for backwards compatibility\n // TypeScript @deprecated annotations provide compile-time warnings\n return Object.assign(table, {\n shape,\n schema,\n zDoc,\n docArray\n })\n } else {\n // Union or other schema type logic\n const schema = schemaOrShape as $ZodType\n\n // Convert schema to Convex validator\n const convexValidator = zodToConvex(schema)\n\n // For unions, use defineTable directly (not Table helper which expects object fields)\n // Convex supports union validators in tables, but TypeScript can't verify the types\n const table = defineTable(asTableValidator(convexValidator))\n const schemaNamespace = createSchemaBundle(name, schema)\n\n // Attach helpers for union tables\n // Return structure similar to Table() but without fields-based helpers\n return {\n table,\n tableName: name,\n validator: convexValidator,\n schema: schemaNamespace,\n docArray: schemaNamespace.docArray, // deprecated\n withSystemFields: () => schemaNamespace.doc\n }\n }\n}\n"]}