zodvex 0.7.6 → 0.7.7-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js.map +1 -1
- package/dist/codegen/index.js.map +1 -1
- package/dist/core/index.js +11 -2
- package/dist/core/index.js.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/codec.d.ts +4 -0
- package/dist/internal/codec.d.ts.map +1 -1
- package/dist/legacy/index.js.map +1 -1
- package/dist/mini/index.js +11 -2
- package/dist/mini/index.js.map +1 -1
- package/dist/mini/server/index.js +11 -2
- package/dist/mini/server/index.js.map +1 -1
- package/dist/server/index.js +11 -2
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
- package/src/internal/codec.ts +35 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/internal/meta.ts","../../src/internal/ids.ts","../../src/internal/codec.ts","../../src/internal/zx.ts","../../src/internal/schemaHelpers.ts","../../src/internal/modelSchemaBundle.ts","../../src/public/codegen/discovery-hooks.ts","../../src/public/codegen/extractCodec.ts","../../src/public/codegen/discover.ts","../../src/public/codegen/zodToSource.ts","../../src/public/codegen/generate.ts"],"names":["z","date","codec","path","v","exports","base"],"mappings":"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","file":"index.js","sourcesContent":["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","/**\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 { 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","/**\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","/**\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","import fs from 'node:fs'\nimport path from 'node:path'\n\n/**\n * JavaScript source for the ESM loader hook that intercepts `_generated/api`\n * imports during discovery. Runs in Node's loader thread (must be plain JS,\n * not TypeScript).\n *\n * Only `_generated/api` is stubbed — `_generated/server` re-exports generic\n * builders from `convex/server` which work natively outside the Convex runtime.\n * The api stub is needed because `_generated/api` exports a `components` object\n * that triggers component constructors at module scope (e.g. `new LocalDTA(components.localDTA)`).\n */\nconst HOOKS_SOURCE = `\nexport function resolve(specifier, context, nextResolve) {\n if (/_generated\\\\/api(\\\\.[mc]?[jt]sx?)?$/.test(specifier)) {\n return { shortCircuit: true, url: 'zodvex-stub://api' };\n }\n return nextResolve(specifier, context);\n}\n\nexport function load(url, context, nextLoad) {\n if (url === 'zodvex-stub://api') {\n return {\n shortCircuit: true,\n format: 'module',\n source: [\n 'const handler = {',\n ' get(_, prop) {',\n ' if (typeof prop === \"symbol\") return undefined;',\n ' if (prop === \"__esModule\") return true;',\n ' return new Proxy(function(){}, handler);',\n ' },',\n ' apply() { return new Proxy({}, handler); },',\n ' construct() { return new Proxy({}, handler); },',\n '};',\n 'const p = new Proxy(function(){}, handler);',\n 'export default p;',\n 'export const api = p;',\n 'export const internal = p;',\n 'export const components = p;',\n 'export const httpRouter = p;',\n ].join('\\\\n')\n };\n }\n return nextLoad(url, context);\n}\n`\n\nlet hooksRegistered = false\n\n/**\n * Registers an ESM loader hook via `Module.register()` that intercepts imports\n * of `_generated/api`, replacing it with a deeply-nested Proxy stub. Safe to\n * call multiple times.\n *\n * Only `_generated/api` is intercepted — `_generated/server` works natively\n * outside the Convex runtime.\n *\n * Returns true if hooks were registered, false if Module.register is\n * unavailable (e.g. Bun, older Node).\n */\nexport function registerDiscoveryHooks(): boolean {\n if (hooksRegistered) return true\n try {\n // Dynamic import to avoid hard dependency on node:module in non-Node runtimes\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { register } = require('node:module') as typeof import('node:module')\n if (typeof register !== 'function') return false\n register(`data:text/javascript,${encodeURIComponent(HOOKS_SOURCE)}`)\n hooksRegistered = true\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Proxy stub for _generated/api.ts.\n *\n * Replaces the real api module (which requires the Convex runtime for\n * `components`) with a deeply-nested Proxy that absorbs property access\n * and constructor calls. This lets module-scope code like\n * `new LocalDTA(components.localDTA)` succeed silently during discovery.\n */\nconst PROXY_STUB_API = `// zodvex discovery stub — replaced after discovery completes\nconst handler = {\n get(_, prop) {\n if (typeof prop === 'symbol') return undefined;\n if (prop === '__esModule') return true;\n return new Proxy(function(){}, handler);\n },\n apply() { return new Proxy(function(){}, handler); },\n construct() { return new Proxy(function(){}, handler); },\n};\nconst p = new Proxy(function(){}, handler);\nexport default p;\nexport const api = p;\nexport const internal = p;\nexport const components = p;\nexport const httpRouter = p;\n`\n\ntype StubCleanup = () => void\n\n/**\n * Writes a Proxy stub file to `_generated/api.ts` in the target convex\n * directory. This is a fallback for environments where `Module.register()`\n * is unavailable (Bun, vitest's vite-node, etc.).\n *\n * Only `_generated/api.ts` is stubbed — `_generated/server.ts` re-exports\n * generic builders from `convex/server` which work natively.\n *\n * Returns a cleanup function that restores the original file contents.\n */\nexport function writeGeneratedStubs(convexDir: string): StubCleanup {\n const generatedDir = path.join(convexDir, '_generated')\n const apiPath = path.join(generatedDir, 'api.ts')\n\n let original: string | null\n try {\n original = fs.readFileSync(apiPath, 'utf8')\n } catch {\n original = null\n }\n\n fs.mkdirSync(generatedDir, { recursive: true })\n fs.writeFileSync(apiPath, PROXY_STUB_API)\n\n return () => {\n if (original !== null) {\n fs.writeFileSync(apiPath, original)\n } else {\n try {\n fs.unlinkSync(apiPath)\n } catch {\n // File may not exist — that's fine\n }\n }\n }\n}\n","import { readMeta } from '../../internal/meta'\nimport {\n $ZodCodec,\n $ZodCustom,\n $ZodNullable,\n $ZodNumber,\n $ZodOptional,\n $ZodType\n} from '../../internal/zod-core'\n\n/**\n * Unwraps ZodOptional/ZodNullable layers to find the inner ZodCodec.\n * Returns the codec instance, or undefined if none found.\n * Skips zx.date() (ZodCodec with in=ZodNumber, out=ZodCustom).\n *\n * Used internally by the discovery pipeline to probe schemas for codecs.\n */\nexport function findCodec(schema: $ZodType): $ZodType | undefined {\n let current = schema\n for (let i = 0; i < 10; i++) {\n if (current instanceof $ZodCodec) {\n const isZxDate =\n current._zod.def.in instanceof $ZodNumber && current._zod.def.out instanceof $ZodCustom\n if (isZxDate) return undefined\n return current\n }\n if (current instanceof $ZodOptional || current instanceof $ZodNullable) {\n current = current._zod.def.innerType\n continue\n }\n break\n }\n return undefined\n}\n\n/**\n * Extracts the inner ZodCodec from a schema, throwing if none is found.\n * The codegen only emits extractCodec() calls for schemas it has verified\n * contain a codec during discovery, so a missing codec is a bug.\n *\n * Used by generated _zodvex/api.ts to extract codec references at runtime.\n */\nexport function extractCodec(schema: $ZodType): $ZodType {\n const codec = findCodec(schema)\n if (!codec) {\n throw new Error('zodvex: extractCodec() found no codec in schema — this is a codegen bug')\n }\n return codec\n}\n\n/**\n * Extracts the zodArgs schema from a zodvex-registered function.\n * Used by generated _zodvex/api.ts to access function-embedded codecs at runtime.\n */\nexport function readFnArgs(fn: unknown): $ZodType {\n const meta = readMeta(fn)\n if (!meta || meta.type !== 'function' || !meta.zodArgs) {\n throw new Error('zodvex: function has no zodArgs metadata')\n }\n return meta.zodArgs as $ZodType\n}\n\n/**\n * Extracts the zodReturns schema from a zodvex-registered function.\n * Used by generated _zodvex/api.ts to access function-embedded codecs at runtime.\n */\nexport function readFnReturns(fn: unknown): $ZodType {\n const meta = readMeta(fn)\n if (!meta || meta.type !== 'function' || !meta.zodReturns) {\n throw new Error('zodvex: function has no zodReturns metadata')\n }\n return meta.zodReturns as $ZodType\n}\n","import path from 'node:path'\nimport { globSync } from 'tinyglobby'\nimport { z } from 'zod'\nimport { readMeta, type ZodvexFunctionMeta, type ZodvexModelMeta } from '../../internal/meta'\nimport { createSchemaUpdateSchema } from '../../internal/modelSchemaBundle'\nimport {\n $ZodArray,\n $ZodCodec,\n $ZodCustom,\n $ZodNullable,\n $ZodNumber,\n $ZodObject,\n $ZodOptional,\n $ZodRecord,\n $ZodTuple,\n $ZodType,\n $ZodUnion\n} from '../../internal/zod-core'\nimport { zx } from '../../internal/zx'\nimport { registerDiscoveryHooks, writeGeneratedStubs } from './discovery-hooks'\nimport { findCodec } from './extractCodec'\n\nexport type DiscoveredModel = {\n exportName: string\n tableName: string\n sourceFile: string\n schemas: ZodvexModelMeta['schemas']\n /** @internal For slim models — used to reconstruct schemas at codegen time. */\n _modelRef?: unknown\n}\n\nexport type DiscoveredFunction = {\n functionPath: string\n exportName: string\n sourceFile: string\n zodArgs?: ZodvexFunctionMeta['zodArgs']\n zodReturns?: ZodvexFunctionMeta['zodReturns']\n}\n\nexport type DiscoveredCodec = {\n exportName: string\n sourceFile: string\n schema: $ZodType\n}\n\nexport type ModelEmbeddedCodec = {\n codec: $ZodType\n modelExportName: string\n modelSourceFile: string\n schemaKey: string\n /** Path expression from schema root, e.g. '.shape.email' or '.shape.payload._zod.def.options[0].shape.name' */\n accessPath: string\n}\n\nexport type FunctionEmbeddedCodec = {\n codec: $ZodType\n functionExportName: string\n functionSourceFile: string\n schemaSource: 'zodArgs' | 'zodReturns'\n accessPath: string\n}\n\nexport type DiscoveryResult = {\n models: DiscoveredModel[]\n functions: DiscoveredFunction[]\n codecs: DiscoveredCodec[]\n modelCodecs: ModelEmbeddedCodec[]\n functionCodecs: FunctionEmbeddedCodec[]\n}\n\n/**\n * Recursively walks a Zod schema tree to find embedded ZodCodec instances.\n * Navigates into ZodObject shapes, ZodUnion/ZodArray/ZodRecord/ZodTuple members,\n * and unwraps ZodOptional/ZodNullable at intermediate levels.\n *\n * Builds an access path string for each discovered codec that can be used\n * in generated code to navigate from the schema root to the codec's location.\n */\nfunction walkSchemaRecursive(\n schema: $ZodType,\n accessPath: string,\n visited: Set<$ZodType>,\n seenCodecs: Set<$ZodType>,\n results: { codec: $ZodType; accessPath: string }[]\n): void {\n if (visited.has(schema)) return\n visited.add(schema)\n\n // Check if this node is/contains a codec (findCodec unwraps optional/nullable)\n const codec = findCodec(schema)\n if (codec) {\n if (!seenCodecs.has(codec)) {\n seenCodecs.add(codec)\n results.push({ codec, accessPath })\n }\n return // Codec is a leaf — don't recurse into its internals\n }\n\n // Unwrap optional/nullable to get to the structural type\n let current: $ZodType = schema\n let currentPath = accessPath\n for (let i = 0; i < 10; i++) {\n if (current instanceof $ZodOptional || current instanceof $ZodNullable) {\n current = current._zod.def.innerType\n currentPath += '._zod.def.innerType'\n } else {\n break\n }\n }\n\n if (current instanceof $ZodObject) {\n const shape = current._zod.def.shape as Record<string, $ZodType>\n if (shape) {\n for (const [field, fieldSchema] of Object.entries(shape)) {\n walkSchemaRecursive(\n fieldSchema,\n `${currentPath}.shape.${field}`,\n visited,\n seenCodecs,\n results\n )\n }\n }\n } else if (current instanceof $ZodUnion) {\n const options = current._zod.def.options\n if (options) {\n for (let i = 0; i < options.length; i++) {\n walkSchemaRecursive(\n options[i],\n `${currentPath}._zod.def.options[${i}]`,\n visited,\n seenCodecs,\n results\n )\n }\n }\n } else if (current instanceof $ZodArray) {\n const element = current._zod.def.element\n if (element) {\n walkSchemaRecursive(element, `${currentPath}._zod.def.element`, visited, seenCodecs, results)\n }\n } else if (current instanceof $ZodRecord) {\n const valueType = current._zod.def.valueType\n if (valueType) {\n walkSchemaRecursive(\n valueType,\n `${currentPath}._zod.def.valueType`,\n visited,\n seenCodecs,\n results\n )\n }\n } else if (current instanceof $ZodTuple) {\n const items = current._zod.def.items\n if (items) {\n for (let i = 0; i < items.length; i++) {\n walkSchemaRecursive(\n items[i],\n `${currentPath}._zod.def.items[${i}]`,\n visited,\n seenCodecs,\n results\n )\n }\n }\n }\n}\n\n/**\n * Reconstructs the schemas bundle for a slim model by deriving doc, insert,\n * update, docArray, and paginatedDoc from the model's fields and schema.\n */\nfunction reconstructSchemas(model?: {\n name: string\n fields: Record<string, $ZodType>\n schema?: unknown\n doc?: unknown\n}): ZodvexModelMeta['schemas'] | null {\n if (!model) return null\n const modelInput = model as any\n const docSchema = modelInput.doc instanceof $ZodType ? modelInput.doc : zx.doc(modelInput)\n const baseSchema =\n modelInput.schema instanceof $ZodType ? modelInput.schema : z.object(model.fields)\n return {\n doc: docSchema,\n insert: baseSchema,\n update: createSchemaUpdateSchema(model.name, baseSchema),\n docArray: z.array(docSchema),\n paginatedDoc: zx.paginationResult(docSchema)\n }\n}\n\n/**\n * Walks a model's schema shapes to find embedded ZodCodec instances.\n * Recursively descends into objects, unions, arrays, records, and tuples.\n * Deduplicates by codec object identity across schema keys.\n * Skips zx.date() (handled natively by zodToSource via extractCodec).\n */\nexport function walkModelCodecs(\n modelExportName: string,\n sourceFile: string,\n schemas: ZodvexModelMeta['schemas'],\n model?: { name: string; fields: Record<string, $ZodType>; schema?: unknown; doc?: unknown }\n): ModelEmbeddedCodec[] {\n // Reconstruct schemas from model if meta.schemas is absent (slim model)\n const effectiveSchemas = schemas ?? reconstructSchemas(model)\n const found: ModelEmbeddedCodec[] = []\n if (!effectiveSchemas) return found\n const visited = new Set<$ZodType>()\n const seenCodecs = new Set<$ZodType>()\n\n for (const schemaKey of ['doc', 'insert', 'update'] as const) {\n const schema = effectiveSchemas[schemaKey]\n if (!schema) continue\n\n const results: { codec: $ZodType; accessPath: string }[] = []\n walkSchemaRecursive(schema as $ZodType, '', visited, seenCodecs, results)\n\n for (const r of results) {\n found.push({\n codec: r.codec,\n modelExportName,\n modelSourceFile: sourceFile,\n schemaKey,\n accessPath: r.accessPath\n })\n }\n }\n\n return found\n}\n\n/**\n * Walks a function's zodArgs and zodReturns schemas to find embedded ZodCodec instances.\n * Same recursive descent as walkModelCodecs, but uses function metadata as the entry point.\n */\nexport function walkFunctionCodecs(functions: DiscoveredFunction[]): FunctionEmbeddedCodec[] {\n const found: FunctionEmbeddedCodec[] = []\n const visited = new Set<$ZodType>()\n const seenCodecs = new Set<$ZodType>()\n\n for (const fn of functions) {\n for (const schemaSource of ['zodArgs', 'zodReturns'] as const) {\n const schema = schemaSource === 'zodArgs' ? fn.zodArgs : fn.zodReturns\n if (!schema) continue\n\n const results: { codec: $ZodType; accessPath: string }[] = []\n walkSchemaRecursive(schema as $ZodType, '', visited, seenCodecs, results)\n\n for (const r of results) {\n found.push({\n codec: r.codec,\n functionExportName: fn.exportName,\n functionSourceFile: fn.sourceFile,\n schemaSource,\n accessPath: r.accessPath\n })\n }\n }\n }\n\n return found\n}\n\n/**\n * Discovers all zodvex-decorated modules in a convex directory.\n * Imports each .ts/.js file, reads __zodvexMeta from exports,\n * and builds a registry of models and functions.\n *\n * Each file is imported once per process. Watch mode (`zodvex dev`) does NOT\n * re-import in-process between edits — query-string cache-busting is a\n * Node-only trick that Bun's loader ignores (Bun caches ESM modules by\n * resolved path), so the watcher spawns a fresh `generate` subprocess per\n * change instead. See `regenerate()` in cli/commands.ts.\n *\n * @param convexDir Absolute path to the convex directory to scan.\n */\nexport async function discoverModules(convexDir: string): Promise<DiscoveryResult> {\n const models: DiscoveredModel[] = []\n const functions: DiscoveredFunction[] = []\n const codecs: DiscoveredCodec[] = []\n\n // Stub _generated/api so module-scope code that accesses Convex components\n // (e.g. `new LocalDTA(components.localDTA)`) receives a harmless Proxy\n // instead of throwing outside the Convex runtime. _generated/server is NOT\n // stubbed — it re-exports generic builders from convex/server which work natively.\n registerDiscoveryHooks()\n const cleanupStubs = writeGeneratedStubs(convexDir)\n\n const files = globSync(['**/*.{ts,js}'], {\n cwd: convexDir,\n onlyFiles: true,\n ignore: [\n '_generated/**',\n '_zodvex/**',\n 'node_modules/**',\n '**/*.d.ts',\n '**/*.test.ts',\n '**/*.test.js',\n '**/*.spec.ts',\n '**/*.spec.js',\n 'convex.config.ts',\n 'convex.config.js',\n 'crons.ts',\n 'crons.js'\n ]\n }).sort()\n\n try {\n for (const file of files) {\n const absPath = path.resolve(convexDir, file)\n\n let moduleExports: Record<string, unknown>\n try {\n moduleExports = await import(absPath)\n } catch (err) {\n console.warn(`[zodvex] Warning: Failed to import ${file}:`, (err as Error).message)\n continue\n }\n\n // Derive module name from file path (strip extension, use forward slashes).\n // Used as-is for function paths — Convex's getFunctionName() returns the full\n // relative path including any subdirectory prefix (e.g. \"api/reports:summary\").\n const moduleName = file.replace(/\\.(ts|js)$/, '').replace(/\\\\/g, '/')\n\n for (const [exportName, value] of Object.entries(moduleExports)) {\n const meta = readMeta(value)\n if (meta) {\n if (meta.type === 'model') {\n const isBarrel = /(?:^|[\\\\/])index\\.(ts|js)$/.test(file)\n const existing = models.findIndex(m => m.tableName === meta.tableName)\n if (existing >= 0) {\n // Replace barrel source with direct module source\n const existingIsBarrel = /(?:^|[\\\\/])index\\.(ts|js)$/.test(\n models[existing].sourceFile\n )\n if (existingIsBarrel && !isBarrel) {\n models[existing] = {\n exportName,\n tableName: meta.tableName,\n sourceFile: file,\n schemas: meta.schemas,\n _modelRef: meta.schemas ? undefined : value\n }\n }\n // If existing is direct and new is barrel, skip\n } else {\n models.push({\n exportName,\n tableName: meta.tableName,\n sourceFile: file,\n schemas: meta.schemas,\n _modelRef: meta.schemas ? undefined : value\n })\n }\n } else if (meta.type === 'function') {\n functions.push({\n functionPath: `${moduleName}:${exportName}`,\n exportName,\n sourceFile: file,\n zodArgs: meta.zodArgs,\n zodReturns: meta.zodReturns\n })\n }\n }\n\n // Check for exported ZodCodec instances (custom codecs)\n // Skip zx.date() — it's handled natively by zodToSource\n if (value instanceof $ZodCodec) {\n const isZxDate =\n value._zod.def.in instanceof $ZodNumber && value._zod.def.out instanceof $ZodCustom\n if (!isZxDate) {\n // Deduplicate by object identity (same codec from re-exports)\n if (!codecs.some(c => c.schema === value)) {\n codecs.push({\n exportName,\n sourceFile: file,\n schema: value as $ZodType\n })\n }\n }\n }\n }\n }\n\n const modelCodecs: ModelEmbeddedCodec[] = []\n for (const model of models) {\n const found = walkModelCodecs(\n model.exportName,\n model.sourceFile,\n model.schemas,\n model._modelRef as any\n )\n modelCodecs.push(...found)\n }\n\n const functionCodecs = walkFunctionCodecs(functions)\n\n return { models, functions, codecs, modelCodecs, functionCodecs }\n } finally {\n cleanupStubs()\n }\n}\n","import {\n $ZodAny,\n $ZodArray,\n $ZodBoolean,\n $ZodCodec,\n $ZodCustom,\n $ZodEnum,\n $ZodLiteral,\n $ZodNull,\n $ZodNullable,\n $ZodNumber,\n $ZodObject,\n $ZodOptional,\n $ZodRecord,\n $ZodString,\n $ZodTuple,\n $ZodType,\n $ZodUndefined,\n $ZodUnion\n} from '../../internal/zod-core'\n\nexport type CodecRef = {\n exportName: string\n sourceFile: string\n}\n\nexport type UndiscoverableCodec = {\n functionPath?: string\n fieldPath: string\n}\n\nexport type ZodToSourceContext = {\n /** Map from ZodCodec schema identity → reference info */\n codecMap: Map<$ZodType, CodecRef>\n /** Accumulates needed imports: sourceFile → Set of export names */\n neededCodecImports: Map<string, Set<string>>\n /** Codecs found during serialization that aren't in the codecMap */\n undiscoverableCodecs: UndiscoverableCodec[]\n /** Emit functional forms (z.optional(x)) instead of chaining (x.optional()) for zod/mini */\n mini?: boolean\n}\n\n/**\n * Converts a runtime Zod schema to its source code representation.\n * Used by the codegen engine to serialize ad-hoc schemas in the generated api.ts.\n *\n * Supports: primitives, objects, arrays, optional, nullable, enums, literals,\n * unions, tuples, records, and zodvex extensions (zx.id, zx.date).\n *\n * Unsupported types fall back to `z.any()` with a comment.\n */\nexport function zodToSource(schema: $ZodType, ctx?: ZodToSourceContext): string {\n // Peel off wrappers first (optional, nullable)\n if (schema instanceof $ZodOptional) {\n const inner = zodToSource(schema._zod.def.innerType, ctx)\n return ctx?.mini ? `z.optional(${inner})` : `${inner}.optional()`\n }\n if (schema instanceof $ZodNullable) {\n const inner = zodToSource(schema._zod.def.innerType, ctx)\n return ctx?.mini ? `z.nullable(${inner})` : `${inner}.nullable()`\n }\n\n // zodvex extensions — detect before generic types\n\n // zx.id('tableName') — ZodString with _tableName property (set by zid())\n // Prefer _tableName check (works in both zod and zod/mini),\n // fall back to .description check (full zod only)\n if (schema instanceof $ZodString) {\n const tableName =\n (schema as any)._tableName ??\n ((schema as any).description?.startsWith('convexId:')\n ? (schema as any).description.slice('convexId:'.length)\n : undefined)\n if (tableName) {\n return `zx.id(\"${tableName}\")`\n }\n }\n\n // zx.date() — ZodCodec with in=ZodNumber, out=ZodCustom\n if (\n schema instanceof $ZodCodec &&\n schema._zod.def.in instanceof $ZodNumber &&\n schema._zod.def.out instanceof $ZodCustom\n ) {\n return 'zx.date()'\n }\n\n // Generic ZodCodec — check codec map for identity match\n if (schema instanceof $ZodCodec) {\n if (ctx?.codecMap) {\n const ref = ctx.codecMap.get(schema)\n if (ref) {\n // Track the needed import\n if (!ctx.neededCodecImports.has(ref.sourceFile)) {\n ctx.neededCodecImports.set(ref.sourceFile, new Set())\n }\n ctx.neededCodecImports.get(ref.sourceFile)?.add(ref.exportName)\n return ref.exportName\n }\n }\n // Unknown codec — fall back to wire schema with warning\n const wireSource = zodToSource(schema._zod.def.in, ctx)\n ctx?.undiscoverableCodecs?.push({ fieldPath: 'unknown' })\n return `${wireSource} /* codec: transforms lost */`\n }\n\n // Primitives\n if (schema instanceof $ZodString) return 'z.string()'\n if (schema instanceof $ZodNumber) return 'z.number()'\n if (schema instanceof $ZodBoolean) return 'z.boolean()'\n if (schema instanceof $ZodNull) return 'z.null()'\n if (schema instanceof $ZodUndefined) return 'z.undefined()'\n if (schema instanceof $ZodAny) return 'z.any()'\n\n // Objects\n if (schema instanceof $ZodObject) {\n const shape = schema._zod.def.shape\n const fields = Object.entries(shape)\n .map(([key, value]) => `${key}: ${zodToSource(value, ctx)}`)\n .join(', ')\n return `z.object({ ${fields} })`\n }\n\n // Arrays\n if (schema instanceof $ZodArray) {\n return `z.array(${zodToSource(schema._zod.def.element, ctx)})`\n }\n\n // Enums\n if (schema instanceof $ZodEnum) {\n const entries = schema._zod.def.entries\n const values = (Object.values(entries) as string[]).map((v: string) => `\"${v}\"`).join(', ')\n return `z.enum([${values}])`\n }\n\n // Literals\n if (schema instanceof $ZodLiteral) {\n const values = schema._zod.def.values\n const value = values.values().next().value\n if (typeof value === 'string') return `z.literal(\"${value}\")`\n return `z.literal(${value})`\n }\n\n // Unions\n if (schema instanceof $ZodUnion) {\n const members = schema._zod.def.options.map(s => zodToSource(s, ctx)).join(', ')\n return `z.union([${members}])`\n }\n\n // Tuples\n if (schema instanceof $ZodTuple) {\n const items = schema._zod.def.items.map(s => zodToSource(s, ctx)).join(', ')\n return `z.tuple([${items}])`\n }\n\n // Records\n if (schema instanceof $ZodRecord) {\n return `z.record(${zodToSource(schema._zod.def.keyType, ctx)}, ${zodToSource(schema._zod.def.valueType, ctx)})`\n }\n\n // Fallback for unsupported types\n const typeName = schema._zod.def.type ?? 'unknown'\n return `z.any() /* unsupported: ${typeName} */`\n}\n","import { readCodecBrand } from '../../internal/meta'\nimport {\n $ZodCodec,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodType\n} from '../../internal/zod-core'\nimport { zx } from '../../internal/zx'\nimport type {\n DiscoveredFunction,\n DiscoveredModel,\n FunctionEmbeddedCodec,\n ModelEmbeddedCodec\n} from './discover'\nimport { type CodecRef, type ZodToSourceContext, zodToSource } from './zodToSource'\n\nconst HEADER = `// AUTO-GENERATED by zodvex — do not edit\n// Run \\`zodvex generate\\` to regenerate\n`\n\nexport type GeneratedFile = { js: string; dts: string }\n\n/**\n * Produces a structural fingerprint for a ZodCodec by serializing its\n * wire (in) and runtime (out) schemas. Two factory-created codec instances\n * with the same arguments produce the same fingerprint, enabling dedup\n * even when object identity differs.\n *\n * The wire/runtime schemas are serialized via zodToSource, then suffixed\n * with a stable representation of any checks (`.max(n)`, `.min(n)`, etc.)\n * so that `sensitive(z.string())` and `sensitive(z.string().max(100))`\n * land on distinct fingerprints. Without this, codecs that differ only by\n * a constraint collide and the ambiguity-resolution path can't tell them\n * apart by structure alone.\n *\n * The transform bodies (decode/encode) are folded in too: two codecs with the\n * same wire+runtime shape but different transform logic must NOT share a\n * fingerprint, or the ambiguity path could reference a behaviorally-wrong\n * codec. `.toString()` discriminates transform source (a residual gap remains\n * for identical source with different captured closure config — documented).\n */\nfunction fingerprintCodec(schema: $ZodType): string {\n if (!(schema instanceof $ZodCodec)) return ''\n const def = schema._zod.def as {\n in: $ZodType\n out: $ZodType\n transform?: unknown\n reverseTransform?: unknown\n }\n const transform = typeof def.transform === 'function' ? def.transform.toString() : ''\n const reverse = typeof def.reverseTransform === 'function' ? def.reverseTransform.toString() : ''\n return `${fingerprintLeaf(def.in)}|${fingerprintLeaf(def.out)}|${transform}|${reverse}`\n}\n\nfunction fingerprintLeaf(schema: $ZodType): string {\n return `${zodToSource(schema)}#${fingerprintChecks(schema)}`\n}\n\nfunction fingerprintChecks(schema: $ZodType): string {\n const checks = (schema as any)?._zod?.def?.checks\n if (!Array.isArray(checks) || checks.length === 0) return ''\n const parts: string[] = []\n for (const check of checks) {\n const def = (check as any)?._zod?.def\n if (!def) continue\n const checkType = def.check ?? def.type ?? 'check'\n // Stringify only the data that distinguishes one check from another —\n // numeric bounds, regex sources, format names. Skip non-serializable\n // fields (functions, error contributors) so the fingerprint stays stable.\n const data: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(def)) {\n if (k === 'check' || k === 'type' || k === 'error' || k === 'message') continue\n const t = typeof v\n if (t === 'string' || t === 'number' || t === 'boolean' || v === null) {\n data[k] = v\n } else if (v instanceof RegExp) {\n data[k] = v.source\n }\n }\n parts.push(`${checkType}(${JSON.stringify(data)})`)\n }\n return parts.sort().join('&')\n}\n\n/**\n * Generates the schema file content — re-exports of all discovered models.\n * Returns { js, dts } with .js import extensions (TS resolves types from .js targets).\n */\nexport function generateSchemaFile(models: DiscoveredModel[]): GeneratedFile {\n const exports = models\n .map(m => {\n const importPath = `../${m.sourceFile.replace(/\\.ts$/, '.js')}`\n return `export { ${m.exportName} } from '${importPath}'`\n })\n .join('\\n')\n\n const content = `${HEADER}\\n${exports}\\n`\n return { js: content, dts: content }\n}\n\ntype SchemaRef = {\n importPath: string\n exportName: string\n /**\n * Property path relative to the model export, e.g. \"schema.doc\" for full\n * models or \"schema\" for union-slim. Emitted as `${exportName}.${schemaKey}`\n * unless `expression` is set.\n */\n schemaKey: string\n /**\n * Complete access expression to emit, e.g. \"zx.doc(TaskModel)\". Used for\n * slim models where there's no plain property path. When present, emitted\n * verbatim (the `zx` import is auto-added).\n */\n expression?: string\n}\n\n/** Emission helper: returns the full access expression for a SchemaRef. */\nfunction refExpression(ref: SchemaRef): string {\n return ref.expression ?? `${ref.exportName}.${ref.schemaKey}`\n}\n\nexport type CodecForGeneration = {\n exportName: string\n sourceFile: string\n schema: $ZodType\n}\n\n/**\n * Peels .optional() and .nullable() wrappers from a schema and checks\n * the identity map at each level. Returns the matched ref plus a\n * function that wraps an inner source string with the appropriate\n * optional/nullable syntax (chaining or functional for mini mode).\n */\nfunction tryUnwrapToIdentity(\n schema: $ZodType,\n identityMap: Map<$ZodType, SchemaRef>,\n mini?: boolean\n): { ref: SchemaRef; wrapSource: (inner: string) => string } | null {\n let current = schema\n const wrappers: Array<'optional' | 'nullable'> = []\n const maxDepth = 5\n\n for (let i = 0; i < maxDepth; i++) {\n if (current instanceof $ZodOptional) {\n wrappers.push('optional')\n current = current._zod.def.innerType\n } else if (current instanceof $ZodNullable) {\n wrappers.push('nullable')\n current = current._zod.def.innerType\n } else {\n break\n }\n\n const ref = identityMap.get(current)\n if (ref) {\n // Wrappers collected outermost-first, apply innermost-first\n const reversed = [...wrappers].reverse()\n return {\n ref,\n wrapSource: (inner: string) => {\n let result = inner\n for (const w of reversed) {\n result = mini ? `z.${w}(${result})` : `${result}.${w}()`\n }\n return result\n }\n }\n }\n }\n\n return null\n}\n\n/**\n * Checks if a ZodObject schema is structurally equivalent to\n * someModelSchema.partial() by comparing field-by-field identity.\n *\n * Zod's .partial() wraps each field in ZodOptional, preserving\n * the inner type identity. So we check: same keys, each field\n * is ZodOptional, and each inner type === the original model field.\n */\nfunction tryMatchPartial(\n schema: $ZodType,\n identityMap: Map<$ZodType, SchemaRef>,\n mini?: boolean\n): { ref: SchemaRef; wrapSource: (inner: string) => string } | null {\n if (!(schema instanceof $ZodObject)) return null\n const candidateShape = schema._zod.def.shape as Record<string, $ZodType>\n const candidateKeys = Object.keys(candidateShape).sort()\n\n for (const [modelSchema, ref] of identityMap) {\n if (!(modelSchema instanceof $ZodObject)) continue\n const modelShape = modelSchema._zod.def.shape as Record<string, $ZodType>\n const modelKeys = Object.keys(modelShape).sort()\n\n // Same key count and same keys\n if (candidateKeys.length !== modelKeys.length) continue\n if (candidateKeys.some((k, i) => k !== modelKeys[i])) continue\n\n // Every candidate field must be ZodOptional wrapping the model field by identity\n let allMatch = true\n for (const key of candidateKeys) {\n const candidateField = candidateShape[key]\n if (!(candidateField instanceof $ZodOptional)) {\n allMatch = false\n break\n }\n const inner = candidateField._zod.def.innerType\n if (inner !== modelShape[key]) {\n allMatch = false\n break\n }\n }\n\n if (allMatch) {\n return {\n ref,\n wrapSource: (inner: string) => (mini ? `z.partial(${inner})` : `${inner}.partial()`)\n }\n }\n }\n\n return null\n}\n\n/**\n * Derives a descriptive variable name for a model-embedded codec from\n * the model export name and the access path.\n *\n * Examples:\n * ('UserModel', '.shape.email') → '_userEmail'\n * ('ActivityModel', '.shape.payload._zod.def.options[0].shape.email') → '_activityPayloadEmail'\n * ('patients', '.shape.firstName') → '_patientsFirstName'\n */\nfunction deriveCodecVarName(modelExportName: string, accessPath: string): string {\n const base = modelExportName.replace(/Model$/, '')\n const prefix = base[0].toLowerCase() + base.slice(1)\n\n const fields = [...accessPath.matchAll(/\\.shape\\.(\\w+)/g)].map(m => m[1])\n if (fields.length === 0) return `_${prefix}Codec`\n\n const fieldPart = fields.map((f, i) => (i === 0 ? f : f[0].toUpperCase() + f.slice(1))).join('')\n\n return `_${prefix}${fieldPart[0].toUpperCase() + fieldPart.slice(1)}`\n}\n\n/**\n * Generates the api.ts file content — function-to-schema registry.\n */\nexport function generateApiFile(\n functions: DiscoveredFunction[],\n models: DiscoveredModel[],\n codecs?: CodecForGeneration[],\n modelCodecs?: ModelEmbeddedCodec[],\n functionCodecs?: FunctionEmbeddedCodec[],\n options?: { mini?: boolean }\n): GeneratedFile {\n // Sort every input collection by a stable key BEFORE walking. Discovery\n // order can vary across platforms (different filesystem traversal); we\n // need byte-identical output regardless of how the upstream walk ordered\n // things. See MR 206 in hotpot / zodvex codegen determinism investigation.\n const sortedModels = [...models].sort((a, b) =>\n `${a.sourceFile}|${a.exportName}`.localeCompare(`${b.sourceFile}|${b.exportName}`)\n )\n const sortedFunctions = [...functions].sort((a, b) =>\n a.functionPath.localeCompare(b.functionPath)\n )\n const sortedCodecs = codecs\n ? [...codecs].sort((a, b) =>\n `${a.sourceFile}|${a.exportName}`.localeCompare(`${b.sourceFile}|${b.exportName}`)\n )\n : undefined\n const sortedModelCodecs = modelCodecs\n ? [...modelCodecs].sort((a, b) =>\n `${a.modelSourceFile}|${a.modelExportName}|${a.schemaKey}|${a.accessPath}`.localeCompare(\n `${b.modelSourceFile}|${b.modelExportName}|${b.schemaKey}|${b.accessPath}`\n )\n )\n : undefined\n const sortedFunctionCodecs = functionCodecs\n ? [...functionCodecs].sort((a, b) =>\n `${a.functionSourceFile}|${a.functionExportName}|${a.schemaSource}|${a.accessPath}`.localeCompare(\n `${b.functionSourceFile}|${b.functionExportName}|${b.schemaSource}|${b.accessPath}`\n )\n )\n : undefined\n\n // Replace the parameter bindings with sorted views so the rest of the\n // function operates against deterministic order without further changes.\n models = sortedModels\n functions = sortedFunctions\n codecs = sortedCodecs\n modelCodecs = sortedModelCodecs\n functionCodecs = sortedFunctionCodecs\n\n // Build identity map: runtime schema object → model reference string\n const identityMap = new Map<$ZodType, SchemaRef>()\n const neededModelImports = new Set<string>()\n\n for (const model of models) {\n const importPath = `../${model.sourceFile.replace(/\\.ts$/, '.js')}`\n\n if (model.schemas) {\n // Full model: existing behavior — schema.doc, schema.insert, etc.\n for (const key of ['doc', 'insert', 'update', 'docArray', 'paginatedDoc'] as const) {\n identityMap.set(model.schemas[key] as $ZodType, {\n importPath,\n exportName: model.exportName,\n schemaKey: `schema.${key}`\n })\n }\n } else if (model._modelRef) {\n // Slim model: schemas live in the per-model zx WeakMap cache, not on the\n // model object. Populate identityMap with cached `zx.*` instances so\n // function code like `returns: zx.doc(SlimModel)` resolves by identity.\n // Emit `zx.doc(SlimModel)` (not `SlimModel.doc`) since slim models have\n // no such property.\n const ref = model._modelRef as any\n const slimKeys = [\n { key: 'doc', schema: zx.doc(ref) as $ZodType, expr: `zx.doc(${model.exportName})` },\n { key: 'insert', schema: zx.base(ref) as $ZodType, expr: `zx.base(${model.exportName})` },\n { key: 'base', schema: zx.base(ref) as $ZodType, expr: `zx.base(${model.exportName})` },\n {\n key: 'update',\n schema: zx.update(ref) as $ZodType,\n expr: `zx.update(${model.exportName})`\n },\n {\n key: 'docArray',\n schema: zx.docArray(ref) as $ZodType,\n expr: `zx.docArray(${model.exportName})`\n }\n ]\n for (const { key, schema, expr } of slimKeys) {\n identityMap.set(schema, {\n importPath,\n exportName: model.exportName,\n schemaKey: key,\n expression: expr\n })\n }\n // Union slim retains `.schema` on the model object — map that too so\n // `returns: SlimModel.schema` resolves as a direct property reference.\n if (ref.schema instanceof $ZodType) {\n identityMap.set(ref.schema, {\n importPath,\n exportName: model.exportName,\n schemaKey: 'schema'\n })\n }\n }\n }\n\n // Build codec identity map for zodToSource\n const codecMap = new Map<$ZodType, CodecRef>()\n if (codecs) {\n for (const codec of codecs) {\n const importPath = `../${codec.sourceFile.replace(/\\.ts$/, '.js')}`\n codecMap.set(codec.schema, {\n exportName: codec.exportName,\n sourceFile: importPath\n })\n }\n }\n\n // Add model-embedded codecs to the codecMap (exported codecs take precedence)\n const modelCodecVars: { varName: string; expression: string; modelExportName: string }[] = []\n const MODEL_CODEC_SENTINEL = '__model_codec__'\n // Build slim model lookup for codec expression generation\n const slimModelNames = new Set(\n models.filter(m => !m.schemas && m._modelRef).map(m => m.exportName)\n )\n if (modelCodecs) {\n for (const mc of modelCodecs) {\n // Skip if this codec is already in codecMap (exported codec takes precedence)\n if (codecMap.has(mc.codec)) continue\n\n const varName = deriveCodecVarName(mc.modelExportName, mc.accessPath)\n // Slim models: schemas are cached in the zx WeakMap, accessed via\n // zx.doc(Model) / zx.base(Model) / zx.update(Model).\n // Full models: schema bundle is at Model.schema.{doc,insert,update,...}.\n const isSlim = slimModelNames.has(mc.modelExportName)\n let schemaAccess: string\n if (isSlim) {\n // Map walkModelCodecs keys (doc/insert/update) to their zx equivalents.\n const slimKey = mc.schemaKey === 'insert' ? 'base' : mc.schemaKey\n schemaAccess = `zx.${slimKey}(${mc.modelExportName})`\n } else {\n schemaAccess = `${mc.modelExportName}.schema.${mc.schemaKey}`\n }\n const expression = `extractCodec(${schemaAccess}${mc.accessPath})`\n modelCodecVars.push({ varName, expression, modelExportName: mc.modelExportName })\n codecMap.set(mc.codec, {\n exportName: varName,\n sourceFile: MODEL_CODEC_SENTINEL\n })\n }\n }\n\n // Resolve function-embedded codecs against existing codecs by structural fingerprint.\n // Factory-created codecs (like tagged(), encrypted()) produce new instances each call,\n // so identity matching fails. Fingerprinting matches by wire+runtime+transform,\n // allowing us to reference the model/standalone codec instead of importing the function.\n // This avoids circular imports: functions.ts → _zodvex/api.ts → functionFile.ts → functions.ts\n //\n // Ambiguity handling: when multiple codecs share a fingerprint they are, by the\n // fingerprint contract, behaviorally interchangeable — so any one is a correct\n // reference. We prefer a same-source-file candidate, otherwise we pick the\n // stable-sorted-first so output is byte-identical across discovery orders\n // (hotpot MR 206). We MUST NOT fall through to inline serialization: a codec\n // inlined via zodToSource loses its transform (emits the wire schema only),\n // which silently breaks the client encode/decode path with no build signal.\n //\n // Zero candidates means the codec exists only inside the function (no model\n // twin, not exported standalone) and has no importable reference. We collect\n // every such case and hard-error after the loop — a loud build-time failure\n // beats silent boundary corruption.\n if (functionCodecs) {\n type Candidate = { ref: CodecRef; sourceFile: string | undefined; brand: string | undefined }\n const fingerprintMap = new Map<string, Candidate[]>()\n // brand → importable candidates that declared it. Brand is the author's\n // explicit identity (see docs/decisions/2026-06-08-codec-provenance-brands.md),\n // matched ahead of the structural fingerprint and namespaced across factories.\n const brandMap = new Map<string, Candidate[]>()\n\n // Build a lookup from codec schema → source file when we know it. Standalone\n // exported codecs carry a sourceFile in their CodecRef; model-embedded codecs\n // do not (their sourceFile is the MODEL_CODEC_SENTINEL).\n const codecSchemaToSourceFile = new Map<$ZodType, string>()\n for (const c of codecs ?? []) {\n codecSchemaToSourceFile.set(c.schema, c.sourceFile)\n }\n for (const mc of modelCodecs ?? []) {\n codecSchemaToSourceFile.set(mc.codec, mc.modelSourceFile)\n }\n\n for (const [codecSchema, ref] of codecMap) {\n const sourceFile = codecSchemaToSourceFile.get(codecSchema)\n const brand = readCodecBrand(codecSchema)\n const candidate: Candidate = { ref, sourceFile, brand }\n const fp = fingerprintCodec(codecSchema)\n if (fp) {\n const existing = fingerprintMap.get(fp)\n if (existing) existing.push(candidate)\n else fingerprintMap.set(fp, [candidate])\n }\n if (brand) {\n const existing = brandMap.get(brand)\n if (existing) existing.push(candidate)\n else brandMap.set(brand, [candidate])\n }\n }\n\n const undiscoverable: { fn: string; path: string }[] = []\n\n for (const fc of functionCodecs) {\n if (codecMap.has(fc.codec)) continue\n\n // 1. Brand match — declared identity. Collision-free and namespaced: a\n // branded codec resolves only against codecs that declared the same brand.\n const brand = readCodecBrand(fc.codec)\n let candidates: Candidate[] | undefined = brand ? brandMap.get(brand) : undefined\n\n // 2. Fingerprint fallback — structural identity. Exclude any candidate that\n // declared a *different* brand (a cross-factory match would violate the\n // brand's intent); unbranded candidates are always eligible.\n if (!candidates || candidates.length === 0) {\n const fp = fingerprintCodec(fc.codec)\n candidates = (fp ? fingerprintMap.get(fp) : undefined)?.filter(\n c => c.brand === undefined || c.brand === brand\n )\n }\n\n if (!candidates || candidates.length === 0) {\n undiscoverable.push({ fn: fc.functionExportName, path: fc.accessPath })\n continue\n }\n\n let chosen: CodecRef\n if (candidates.length === 1) {\n chosen = candidates[0].ref\n } else {\n // Prefer a unique same-source-file candidate; otherwise pick the\n // stable-sorted-first. Either way we reference a real codec — never\n // inline a transform-less husk.\n const sameFile = candidates.filter(c => c.sourceFile === fc.functionSourceFile)\n if (sameFile.length === 1) {\n chosen = sameFile[0].ref\n } else {\n const sorted = [...candidates].sort((a, b) =>\n `${a.sourceFile ?? ''}|${a.ref.exportName}`.localeCompare(\n `${b.sourceFile ?? ''}|${b.ref.exportName}`\n )\n )\n chosen = sorted[0].ref\n // Branded cohorts are interchangeable by the author's explicit\n // declaration — only flag ambiguity for inferred (unbranded) matches.\n if (!brand) {\n console.warn(\n `[zodvex] Note: Codec in ${fc.functionExportName}() (${fc.accessPath}) matches ${candidates.length} fingerprint-equivalent codecs ` +\n `(${candidates.map(c => c.ref.exportName).join(', ')}). Referencing '${chosen.exportName}'. ` +\n `Export the codec standalone or give it a brand if you want the reference to be explicit.`\n )\n }\n }\n }\n\n codecMap.set(fc.codec, chosen)\n }\n\n if (undiscoverable.length > 0) {\n const list = undiscoverable.map(u => ` - ${u.fn}() at ${u.path}`).join('\\n')\n throw new Error(\n `[zodvex] ${undiscoverable.length} codec(s) in function args/returns have no importable reference ` +\n `(not exported standalone, not embedded in a model). The generated client cannot encode or decode ` +\n `them, which silently breaks the codec boundary. Export each codec standalone (or add it to a model) ` +\n `so codegen can import it:\\n${list}`\n )\n }\n }\n\n const zodToSourceCtx: ZodToSourceContext = {\n codecMap,\n neededCodecImports: new Map(),\n undiscoverableCodecs: [],\n mini: options?.mini\n }\n\n // Track which imports we need\n let needsZod = false\n let needsZx = false\n\n function emitRef(ref: SchemaRef): string {\n neededModelImports.add(ref.exportName)\n const expr = refExpression(ref)\n // Slim-model refs use zx.* helpers; ensure `zx` is imported in the output.\n if (ref.expression?.startsWith('zx.')) needsZx = true\n return expr\n }\n\n // Resolve each schema to either a model reference or serialized source\n function resolveSchema(schema: $ZodType | unknown): string {\n if (!schema) return 'undefined'\n const s = schema as $ZodType\n\n // 1. Direct identity match\n const ref = identityMap.get(s)\n if (ref) return emitRef(ref)\n\n // 2. Wrapper-aware identity match (peel .nullable()/.optional())\n const unwrapped = tryUnwrapToIdentity(s, identityMap, options?.mini)\n if (unwrapped) return unwrapped.wrapSource(emitRef(unwrapped.ref))\n\n // 3. Partial-aware match (detect .partial() of a model schema)\n const partialMatch = tryMatchPartial(s, identityMap, options?.mini)\n if (partialMatch) return partialMatch.wrapSource(emitRef(partialMatch.ref))\n\n // 4. Fall back to zodToSource (with codec context)\n const source = zodToSource(s, zodToSourceCtx)\n if (source.includes('z.')) needsZod = true\n if (source.includes('zx.')) needsZx = true\n return source\n }\n\n // Build registry entries\n const entries = functions\n .map(fn => {\n const args = resolveSchema(fn.zodArgs)\n const returns = resolveSchema(fn.zodReturns)\n return ` '${fn.functionPath}': {\\n args: ${args},\\n returns: ${returns},\\n }`\n })\n .join(',\\n')\n\n // Determine which model codec vars were actually used (referenced by zodToSource)\n const usedModelCodecVars = modelCodecVars.filter(mc => {\n const sentinelExports = zodToSourceCtx.neededCodecImports.get(MODEL_CODEC_SENTINEL)\n return sentinelExports?.has(mc.varName)\n })\n\n // Add model imports for models referenced by used model codec vars.\n // Slim codec vars use zx.base(Model)/zx.doc(Model) expressions — require zx import.\n if (usedModelCodecVars.length > 0) {\n for (const mc of usedModelCodecVars) {\n neededModelImports.add(mc.modelExportName)\n if (mc.expression.includes('zx.')) needsZx = true\n }\n }\n\n // Build imports\n const imports: string[] = []\n const zodImport = options?.mini ? 'zod/mini' : 'zod'\n if (needsZod) imports.push(`import { z } from '${zodImport}'`)\n\n // Build single client-safe zodvex import (root full path or zodvex/mini)\n const zodvexImport = options?.mini ? 'zodvex/mini' : 'zodvex'\n const coreImports: string[] = []\n if (needsZx) coreImports.push('zx')\n if (usedModelCodecVars.length > 0) coreImports.push('extractCodec')\n if (coreImports.length > 0) {\n imports.push(`import { ${coreImports.join(', ')} } from '${zodvexImport}'`)\n }\n\n for (const exportName of [...neededModelImports].sort()) {\n const model = models.find(m => m.exportName === exportName)\n if (model) {\n const importPath = `../${model.sourceFile.replace(/\\.ts$/, '.js')}`\n imports.push(`import { ${exportName} } from '${importPath}'`)\n }\n }\n\n // Codec imports (collected by zodToSource via context). Sort the map's\n // outer keys (import paths) and the inner Set values (export names) so\n // the final import section is byte-stable across discovery orders.\n const sortedCodecImportPaths = [...zodToSourceCtx.neededCodecImports.keys()].sort()\n for (const importPath of sortedCodecImportPaths) {\n if (importPath === MODEL_CODEC_SENTINEL) continue\n const exportNames = zodToSourceCtx.neededCodecImports.get(importPath) ?? new Set<string>()\n const names = Array.from(exportNames).sort().join(', ')\n imports.push(`import { ${names} } from '${importPath}'`)\n }\n\n const importSection = imports.length > 0 ? `${imports.join('\\n')}\\n\\n` : ''\n\n // Build codec helper var declarations\n const allCodecVars = usedModelCodecVars.map(mc => `const ${mc.varName} = ${mc.expression}`)\n const codecVarSection = allCodecVars.length > 0 ? `${allCodecVars.join('\\n')}\\n\\n` : ''\n\n const registryEntries = entries.length > 0 ? `${entries},\\n` : ''\n const js = `${HEADER}\\n${importSection}${codecVarSection}export const zodvexRegistry = {\\n${registryEntries}}\\n`\n\n const dts = options?.mini\n ? `${HEADER}\nimport type { $ZodType } from 'zod/v4/core'\n\nexport declare const zodvexRegistry: Record<string, { args: $ZodType; returns: $ZodType | undefined }>\n`\n : `${HEADER}\nimport type { ZodTypeAny } from 'zod'\n\nexport declare const zodvexRegistry: Record<string, { args: ZodTypeAny; returns: ZodTypeAny | undefined }>\n`\n\n return { js, dts }\n}\n\n/**\n * Generates the server.ts file content — concrete context types for the app's schema.\n *\n * These parallel Convex's _generated/server.ts exports (QueryCtx, MutationCtx, ActionCtx)\n * but with zodvex's codec-wrapped db types baked in.\n */\nexport function generateServerFile(): GeneratedFile {\n const js = `${HEADER}`\n\n const dts = `${HEADER}\nimport type { DataModel } from '../_generated/dataModel.js'\nimport type { ZodvexActionCtx, ZodvexMutationCtx, ZodvexQueryCtx } from 'zodvex/server'\nimport type schema from '../schema.js'\n\ntype DecodedDocs = (typeof schema)['__decodedDocs']\n\n/** Query context with codec-wrapped db (decoded types on reads). */\nexport type QueryCtx = ZodvexQueryCtx<DataModel, DecodedDocs>\n\n/** Mutation context with codec-wrapped db (decoded reads, encoded writes). */\nexport type MutationCtx = ZodvexMutationCtx<DataModel, DecodedDocs>\n\n/** Action context (no db, but runQuery/runMutation may be codec-wrapped). */\nexport type ActionCtx = ZodvexActionCtx<DataModel>\n`\n\n return { js, dts }\n}\n\n/**\n * Generates the client file content — pre-bound hooks and client factory.\n * Returns { js, dts } for .js + .d.ts output.\n */\nexport function generateClientFile(options?: { mini?: boolean }): GeneratedFile {\n const zodvexClientImport = options?.mini ? 'zodvex/mini' : 'zodvex'\n // --- JS ---\n const jsImports = [\n \"import { createZodvexHooks } from 'zodvex/react'\",\n \"import { createZodvexReactClient } from 'zodvex/react'\",\n \"import { createZodvexClient } from 'zodvex/client'\",\n `import { createBoundaryHelpers } from '${zodvexClientImport}'`,\n \"import { zodvexRegistry } from './api.js'\"\n ]\n\n const jsExports = [\n 'export const { useZodQuery, useZodMutation } = createZodvexHooks(zodvexRegistry)',\n '',\n 'export const createClient = (options) =>',\n ' createZodvexClient(zodvexRegistry, options)',\n '',\n 'export const createReactClient = (options) =>',\n ' createZodvexReactClient(zodvexRegistry, options)',\n '',\n 'export const { encodeArgs, decodeResult } = createBoundaryHelpers(zodvexRegistry)'\n ]\n\n const js = `${HEADER}\\n${jsImports.join('\\n')}\\n\\n${jsExports.join('\\n')}\\n`\n\n // --- DTS ---\n const dtsImports = [\n \"import type { ZodvexHooks } from 'zodvex/react'\",\n \"import type { ZodvexClientOptions, ZodvexClient } from 'zodvex/client'\",\n \"import type { ZodvexReactClientOptions, ZodvexReactClient } from 'zodvex/react'\",\n `import type { BoundaryHelpers } from '${zodvexClientImport}'`\n ]\n\n const dtsDeclarations = [\n \"export declare const useZodQuery: ZodvexHooks['useZodQuery']\",\n \"export declare const useZodMutation: ZodvexHooks['useZodMutation']\",\n '',\n 'export declare const createClient: (options: ZodvexClientOptions) => ZodvexClient',\n '',\n 'export declare const createReactClient: (options: ZodvexReactClientOptions) => ZodvexReactClient',\n '',\n \"export declare const encodeArgs: BoundaryHelpers['encodeArgs']\",\n \"export declare const decodeResult: BoundaryHelpers['decodeResult']\"\n ]\n\n const dts = `${HEADER}\\n${dtsImports.join('\\n')}\\n\\n${dtsDeclarations.join('\\n')}\\n`\n\n return { js, dts }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/internal/meta.ts","../../src/internal/ids.ts","../../src/internal/codec.ts","../../src/internal/zx.ts","../../src/internal/schemaHelpers.ts","../../src/internal/modelSchemaBundle.ts","../../src/public/codegen/discovery-hooks.ts","../../src/public/codegen/extractCodec.ts","../../src/public/codegen/discover.ts","../../src/public/codegen/zodToSource.ts","../../src/public/codegen/generate.ts"],"names":["z","date","codec","path","v","exports","base"],"mappings":";;;;;;;;;;;;;;;AAEA,IAAM,QAAA,GAAW,cAAA;AAkCV,SAAS,SAAS,MAAA,EAAyC;AAChE,EAAA,IAAI,UAAU,IAAA,IAAS,OAAO,WAAW,QAAA,IAAY,OAAO,WAAW,UAAA,EAAa;AAClF,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAQ,OAAmC,QAAQ,CAAA;AACrD;AAEA,IAAM,eAAA,GAAkB,oBAAA;AAUjB,SAAS,gBAAA,CAAiB,QAAgB,KAAA,EAAqB;AACpE,EAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,eAAA,EAAiB;AAAA,IAC7C,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY,KAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc;AAAA,GACf,CAAA;AACH;AAGO,SAAS,eAAe,MAAA,EAAqC;AAClE,EAAA,IAAI,MAAA,IAAU,IAAA,IAAQ,OAAO,MAAA,KAAW,UAAU,OAAO,MAAA;AACzD,EAAA,MAAM,KAAA,GAAS,OAAmC,eAAe,CAAA;AACjE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C;AC1DA,IAAM,QAAA,uBAAe,OAAA,EAAuB;AAErC,IAAM,eAAA,GAAkB;AAAA,EAC7B,WAAA,EAAa,CAAC,IAAA,KAAmB,QAAA,CAAS,IAAI,IAAI,CAAA;AAAA,EAClD,aAAa,CAAC,IAAA,EAAgB,SAAc,QAAA,CAAS,GAAA,CAAI,MAAM,IAAI;AACrE,CAAA;;;AC6IO,SAAS,WAAA,CAMd,IAAA,EACA,OAAA,EACA,UAAA,EAImB;AAEnB,EAAA,OAAOA,CAAAA,CAAE,KAAA,CAAM,IAAA,EAAa,OAAA,EAAgB,UAAiB,CAAA;AAC/D;;;AC5GA,SAAS,IAAA,GAAe;AACtB,EAAA,OAAO,WAAA;AAAA,IACLA,EAAE,MAAA,EAAO;AAAA;AAAA,IACTA,CAAAA,CAAE,MAAA,CAAa,CAAA,GAAA,KAAO,GAAA,YAAe,IAAA,EAAM;AAAA,MACzC,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,IACD;AAAA,MACE,MAAA,EAAQ,CAAC,SAAA,KAAsB,IAAI,KAAK,SAAS,CAAA;AAAA,MACjD,MAAA,EAAQ,CAACC,KAAAA,KAAeA,KAAAA,CAAK,OAAA;AAAQ;AACvC,GACF;AACF;AA6BA,SAAS,GAA6B,SAAA,EAAuC;AAE3E,EAAA,MAAM,UAAA,GAAaD,CAAAA,CAAE,MAAA,EAAO,CAAE,KAAA;AAAA,IAC5BA,CAAAA,CAAE,OAAO,CAAA,GAAA,KAAO,OAAO,QAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAAA,MACzD,OAAA,EAAS,yBAAyB,SAAS,CAAA,CAAA;AAAA,KAC5C,CAAA;AAAA,IACDA,CAAAA,CAAE,QAAA,CAAS,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE;AAAA,GACpC;AAGA,EAAA,eAAA,CAAgB,YAAY,UAAA,EAAY;AAAA,IACtC,UAAA,EAAY,IAAA;AAAA,IACZ;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,UAAA;AAChB,EAAA,OAAA,CAAQ,UAAA,GAAa,SAAA;AAErB,EAAA,OAAO,OAAA;AACT;AAoCA,SAAS,KAAA,CACP,IAAA,EACA,OAAA,EACA,UAAA,EAIA,IAAA,EACuB;AACvB,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,UAAU,CAAA;AACnD,EAAA,IAAI,IAAA,EAAM,KAAA,EAAO,gBAAA,CAAiB,KAAA,EAAiB,KAAK,KAAK,CAAA;AAC7D,EAAA,OAAO,KAAA;AACT;AAkCA,SAAS,cAAc,IAAA,EAAyC;AAC9D,EAAA,MAAM,GAAA,mBAAM,MAAA,CAAO,GAAA,CAAI,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAE,CAAA;AAChD,EAAA,MAAM,CAAA,GAAI,UAAA;AACV,EAAA,MAAM,QAAA,GAAW,EAAE,GAAG,CAAA;AACtB,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAM,OAAA,uBAAc,OAAA,EAA0B;AAC9C,EAAA,CAAA,CAAE,GAAG,CAAA,GAAI,OAAA;AACT,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,SAAA,GAAY,cAAc,MAAM,CAAA;AACtC,IAAM,QAAA,GAAW,cAAc,KAAK,CAAA;AACpC,IAAM,WAAA,GAAc,cAAc,QAAQ,CAAA;AAC1C,IAAM,aAAA,GAAgB,cAAc,UAAU,CAAA;AAO9C,SAAS,aAAa,KAAA,EAA6B;AACjD,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,EAAA,OAAO,CAAA,YAAa,QAAA,GAAgB,CAAA,GAAI,KAAA,CAAM,MAAA;AAChD;AAUA,SAAS,KAAK,KAAA,EAA+B;AAC3C,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,EAAA,IAAI,CAAA,EAAG,IAAA,YAAgB,QAAA,EAAe,OAAO,CAAA,CAAE,IAAA;AAC/C,EAAA,IAAI,CAAA,YAAa,UAAe,OAAO,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACzC,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,IAAI,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAChF;AACA,EAAA,MAAM,KAAA,GAAQA,CAAAA,CAAE,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACnC,EAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA;AACjC,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,IAAI,KAAA,EAAqB;AAChC,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,EAAA,IAAI,CAAA,EAAG,GAAA,YAAe,QAAA,EAAe,OAAO,CAAA,CAAE,GAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAC/B,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAM,QAAQ,eAAA,CAAgB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AACrD,EAAA,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AACvB,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,OAAO,KAAA,EAAqB;AACnC,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,EAAA,IAAI,CAAA,EAAG,MAAA,YAAkB,QAAA,EAAe,OAAO,CAAA,CAAE,MAAA;AACjD,EAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAM,QAAQ,wBAAA,CAAyB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAC9D,EAAA,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,CAAA;AAC1B,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,SAAS,KAAA,EAAqB;AACrC,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,EAAA,IAAI,CAAA,EAAG,QAAA,YAAoB,QAAA,EAAe,OAAO,CAAA,CAAE,QAAA;AACnD,EAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACpC,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAM,KAAA,GAAQA,CAAAA,CAAE,KAAA,CAAM,GAAA,CAAI,KAAK,CAAC,CAAA;AAChC,EAAA,aAAA,CAAc,GAAA,CAAI,KAAK,KAAK,CAAA;AAC5B,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,SAAS,MAAA,EAA4B;AAC5C,EAAA,OAAO,IAAI,YAAA,CAAa,EAAE,MAAM,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAA;AACjE;AAGA,SAAS,SAAS,MAAA,EAA4B;AAC5C,EAAA,OAAO,IAAI,YAAA,CAAa,EAAE,MAAM,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAA;AACjE;AAGA,SAAS,iBAAiB,MAAA,EAA4B;AACpD,EAAA,OAAO,QAAA,CAAS,QAAA,CAAS,MAAM,CAAC,CAAA;AAClC;AAKA,SAAS,cAAA,GAAiB;AACxB,EAAA,OAAOA,EAAE,MAAA,CAAO;AAAA,IACd,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,IACnB,MAAA,EAAQ,QAAA,CAASA,CAAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,IAC3B,SAAA,EAAW,gBAAA,CAAiBA,CAAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,IACtC,EAAA,EAAI,QAAA,CAASA,CAAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,IACvB,eAAA,EAAiB,QAAA,CAASA,CAAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,IACpC,gBAAA,EAAkB,QAAA,CAASA,CAAAA,CAAE,MAAA,EAAQ;AAAA,GACtC,CAAA;AACH;AAKA,SAAS,iBAAqC,UAAA,EAAe;AAC3D,EAAA,OAAOA,EAAE,MAAA,CAAO;AAAA,IACd,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAM,UAAU,CAAA;AAAA,IACxB,MAAA,EAAQA,EAAE,OAAA,EAAQ;AAAA,IAClB,cAAA,EAAgBA,EAAE,MAAA,EAAO;AAAA,IACzB,WAAA,EAAa,gBAAA,CAAiBA,CAAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,IACxC,UAAA,EAAY,iBAAiBA,CAAAA,CAAE,IAAA,CAAK,CAAC,kBAAA,EAAoB,eAAe,CAAC,CAAC;AAAA,GAC3E,CAAA;AACH;AAOO,IAAM,EAAA,GAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AACF,CAAA;;;AC9SO,SAAS,WAAW,MAAA,EAAyC;AAClE,EAAA,OAAO,MAAA,YAAkB,aAAa,MAAA,YAAkB,sBAAA;AAC1D;AAUO,SAAS,gBAAgB,MAAA,EAA0C;AAExE,EAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,IAAA,OAAO,MAAA,CAAO,KAAK,GAAA,CAAI,OAAA;AAAA,EACzB;AAEA,EAAA,OAAQ,MAAA,CAAe,KAAK,GAAA,CAAI,OAAA;AAClC;AASO,SAAS,mBACd,OAAA,EACkC;AAClC,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oDAAA,EAAuD,QAAQ,MAAM,CAAA,kEAAA;AAAA,KAEvE;AAAA,EACF;AACF;AAaO,SAAS,uBAA2C,OAAA,EAAsC;AAC/F,EAAA,kBAAA,CAAmB,OAAO,CAAA;AAC1B,EAAA,OAAOA,CAAAA,CAAE,MAAM,OAAO,CAAA;AACxB;AA0CO,SAAS,eAAA,CACd,WACA,MAAA,EACU;AAEV,EAAA,IAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AACtB,IAAA,MAAM,eAAA,GAAkB,gBAAgB,MAAM,CAAA;AAC9C,IAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,GAAA,CAAI,CAAC,OAAA,KAAsB;AACjE,MAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,QAAA,MAAM,QAAA,GAAW;AAAA,UACf,GAAG,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,KAAA;AAAA,UACpB,GAAA,EAAK,EAAA,CAAG,EAAA,CAAG,SAAS,CAAA;AAAA,UACpB,aAAA,EAAeA,EAAE,MAAA;AAAO,SAC1B;AAEA,QAAA,OAAO,KAAA,CAAM,SAAS,EAAE,GAAG,QAAQ,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,MAChE;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,uBAAuB,eAAe,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,IAAA,MAAM,QAAA,GAAW,EAAE,GAAG,MAAA,CAAO,KAAK,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK,EAAA,CAAG,GAAG,SAAS,CAAA,EAAG,aAAA,EAAeA,CAAAA,CAAE,QAAO,EAAE;AAC9F,IAAA,OAAO,KAAA,CAAM,QAAQ,EAAE,GAAG,OAAO,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,EAC9D;AAGA,EAAA,OAAO,MAAA;AACT;;;ACxMA,SAAS,eAAe,MAAA,EAA+B;AACrD,EAAA,IAAI,MAAA,YAAkB,cAAc,OAAO,MAAA;AAC3C,EAAA,OAAO,IAAI,YAAA,CAAa,EAAE,MAAM,UAAA,EAAY,SAAA,EAAW,QAAQ,CAAA;AACjE;AAUO,SAAS,mBAAmB,KAAA,EAA2D;AAC5F,EAAA,MAAM,eAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,YAAA,CAAa,GAAG,CAAA,GAAI,cAAA,CAAe,KAAK,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,YAAA;AACT;AAEO,SAAS,wBAAA,CACd,MACA,KAAA,EACkB;AAClB,EAAA,OAAOA,EAAE,MAAA,CAAO;AAAA,IACd,GAAA,EAAK,EAAA,CAAG,EAAA,CAAG,IAAI,CAAA;AAAA,IACf,aAAA,EAAeA,CAAAA,CAAE,QAAA,CAASA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IACpC,GAAG,mBAAmB,KAAK;AAAA,GAC5B,CAAA;AACH;AA6BO,SAAS,wBAAA,CACd,MACA,WAAA,EACU;AACV,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,gBAAgB,eAAA,CAAgB,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,OAAA,KAAsB;AAC5E,MAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,QAAA,OAAO,wBAAA,CAAyB,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,MAC9D;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,uBAAuB,aAAa,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,uBAAuB,UAAA,EAAY;AACrC,IAAA,OAAO,wBAAA,CAAyB,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO,WAAA;AACT;ACxFA,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoCrB,IAAI,eAAA,GAAkB,KAAA;AAaf,SAAS,sBAAA,GAAkC;AAChD,EAAA,IAAI,iBAAiB,OAAO,IAAA;AAC5B,EAAA,IAAI;AAGF,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,SAAA,CAAQ,QAAa,CAAA;AAC1C,IAAA,IAAI,OAAO,QAAA,KAAa,UAAA,EAAY,OAAO,KAAA;AAC3C,IAAA,QAAA,CAAS,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,YAAY,CAAC,CAAA,CAAE,CAAA;AACnE,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAUA,IAAM,cAAA,GAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA8BhB,SAAS,oBAAoB,SAAA,EAAgC;AAClE,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA;AAEhD,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI;AACF,IAAA,QAAA,GAAW,EAAA,CAAG,YAAA,CAAa,OAAA,EAAS,MAAM,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,QAAA,GAAW,IAAA;AAAA,EACb;AAEA,EAAA,EAAA,CAAG,SAAA,CAAU,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,EAAA,EAAA,CAAG,aAAA,CAAc,SAAS,cAAc,CAAA;AAExC,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,EAAA,CAAG,aAAA,CAAc,SAAS,QAAQ,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,EAAA,CAAG,WAAW,OAAO,CAAA;AAAA,MACvB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;AC3HO,SAAS,UAAU,MAAA,EAAwC;AAChE,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAI,mBAAmB,SAAA,EAAW;AAChC,MAAA,MAAM,QAAA,GACJ,QAAQ,IAAA,CAAK,GAAA,CAAI,cAAc,UAAA,IAAc,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,YAAe,UAAA;AAC/E,MAAA,IAAI,UAAU,OAAO,MAAA;AACrB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,YAAmB,YAAA,IAAgB,OAAA,YAAmB,YAAA,EAAc;AACtE,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAK,GAAA,CAAI,SAAA;AAC3B,MAAA;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,aAAa,MAAA,EAA4B;AACvD,EAAA,MAAME,MAAAA,GAAQ,UAAU,MAAM,CAAA;AAC9B,EAAA,IAAI,CAACA,MAAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,8EAAyE,CAAA;AAAA,EAC3F;AACA,EAAA,OAAOA,MAAAA;AACT;AAMO,SAAS,WAAW,EAAA,EAAuB;AAChD,EAAA,MAAM,IAAA,GAAO,SAAS,EAAE,CAAA;AACxB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,SAAS,UAAA,IAAc,CAAC,KAAK,OAAA,EAAS;AACtD,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,IAAA,CAAK,OAAA;AACd;AAMO,SAAS,cAAc,EAAA,EAAuB;AACnD,EAAA,MAAM,IAAA,GAAO,SAAS,EAAE,CAAA;AACxB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,SAAS,UAAA,IAAc,CAAC,KAAK,UAAA,EAAY;AACzD,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,IAAA,CAAK,UAAA;AACd;;;ACMA,SAAS,mBAAA,CACP,MAAA,EACA,UAAA,EACA,OAAA,EACA,YACA,OAAA,EACM;AACN,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACzB,EAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAGlB,EAAA,MAAMA,MAAAA,GAAQ,UAAU,MAAM,CAAA;AAC9B,EAAA,IAAIA,MAAAA,EAAO;AACT,IAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAIA,MAAK,CAAA,EAAG;AAC1B,MAAA,UAAA,CAAW,IAAIA,MAAK,CAAA;AACpB,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAAA,MAAAA,EAAO,YAAY,CAAA;AAAA,IACpC;AACA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAoB,MAAA;AACxB,EAAA,IAAI,WAAA,GAAc,UAAA;AAClB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAI,OAAA,YAAmB,YAAA,IAAgB,OAAA,YAAmB,YAAA,EAAc;AACtE,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAK,GAAA,CAAI,SAAA;AAC3B,MAAA,WAAA,IAAe,qBAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,KAAA;AAC/B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxD,QAAA,mBAAA;AAAA,UACE,WAAA;AAAA,UACA,CAAA,EAAG,WAAW,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,UAC7B,OAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,mBAAmB,SAAA,EAAW;AACvC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,OAAA;AACjC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,mBAAA;AAAA,UACE,QAAQ,CAAC,CAAA;AAAA,UACT,CAAA,EAAG,WAAW,CAAA,kBAAA,EAAqB,CAAC,CAAA,CAAA,CAAA;AAAA,UACpC,OAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,mBAAmB,SAAA,EAAW;AACvC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,OAAA;AACjC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,mBAAA,CAAoB,SAAS,CAAA,EAAG,WAAW,CAAA,iBAAA,CAAA,EAAqB,OAAA,EAAS,YAAY,OAAO,CAAA;AAAA,IAC9F;AAAA,EACF,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AACxC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,SAAA;AACnC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,mBAAA;AAAA,QACE,SAAA;AAAA,QACA,GAAG,WAAW,CAAA,mBAAA,CAAA;AAAA,QACd,OAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,mBAAmB,SAAA,EAAW;AACvC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,KAAA;AAC/B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,mBAAA;AAAA,UACE,MAAM,CAAC,CAAA;AAAA,UACP,CAAA,EAAG,WAAW,CAAA,gBAAA,EAAmB,CAAC,CAAA,CAAA,CAAA;AAAA,UAClC,OAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,mBAAmB,KAAA,EAKU;AACpC,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,MAAM,UAAA,GAAa,KAAA;AACnB,EAAA,MAAM,SAAA,GAAY,WAAW,GAAA,YAAe,QAAA,GAAW,WAAW,GAAA,GAAM,EAAA,CAAG,IAAI,UAAU,CAAA;AACzF,EAAA,MAAM,UAAA,GACJ,WAAW,MAAA,YAAkB,QAAA,GAAW,WAAW,MAAA,GAASF,CAAAA,CAAE,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AACnF,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,SAAA;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,MAAA,EAAQ,wBAAA,CAAyB,KAAA,CAAM,IAAA,EAAM,UAAU,CAAA;AAAA,IACvD,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAM,SAAS,CAAA;AAAA,IAC3B,YAAA,EAAc,EAAA,CAAG,gBAAA,CAAiB,SAAS;AAAA,GAC7C;AACF;AAQO,SAAS,eAAA,CACd,eAAA,EACA,UAAA,EACA,OAAA,EACA,KAAA,EACsB;AAEtB,EAAA,MAAM,gBAAA,GAAmB,OAAA,IAAW,kBAAA,CAAmB,KAAK,CAAA;AAC5D,EAAA,MAAM,QAA8B,EAAC;AACrC,EAAA,IAAI,CAAC,kBAAkB,OAAO,KAAA;AAC9B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAc;AAClC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAc;AAErC,EAAA,KAAA,MAAW,SAAA,IAAa,CAAC,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA,EAAY;AAC5D,IAAA,MAAM,MAAA,GAAS,iBAAiB,SAAS,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,UAAqD,EAAC;AAC5D,IAAA,mBAAA,CAAoB,MAAA,EAAoB,EAAA,EAAI,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AAExE,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,eAAA;AAAA,QACA,eAAA,EAAiB,UAAA;AAAA,QACjB,SAAA;AAAA,QACA,YAAY,CAAA,CAAE;AAAA,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,mBAAmB,SAAA,EAA0D;AAC3F,EAAA,MAAM,QAAiC,EAAC;AACxC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAc;AAClC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAc;AAErC,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,KAAA,MAAW,YAAA,IAAgB,CAAC,SAAA,EAAW,YAAY,CAAA,EAAY;AAC7D,MAAA,MAAM,MAAA,GAAS,YAAA,KAAiB,SAAA,GAAY,EAAA,CAAG,UAAU,EAAA,CAAG,UAAA;AAC5D,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,UAAqD,EAAC;AAC5D,MAAA,mBAAA,CAAoB,MAAA,EAAoB,EAAA,EAAI,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AAExE,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,oBAAoB,EAAA,CAAG,UAAA;AAAA,UACvB,oBAAoB,EAAA,CAAG,UAAA;AAAA,UACvB,YAAA;AAAA,UACA,YAAY,CAAA,CAAE;AAAA,SACf,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAeA,eAAsB,gBAAgB,SAAA,EAA6C;AACjF,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,YAAkC,EAAC;AACzC,EAAA,MAAM,SAA4B,EAAC;AAMnC,EAAA,sBAAA,EAAuB;AACvB,EAAA,MAAM,YAAA,GAAe,oBAAoB,SAAS,CAAA;AAElD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAC,cAAc,CAAA,EAAG;AAAA,IACvC,GAAA,EAAK,SAAA;AAAA,IACL,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,eAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA;AACF,GACD,EAAE,IAAA,EAAK;AAER,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAUG,IAAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,IAAI,CAAA;AAE5C,MAAA,IAAI,aAAA;AACJ,MAAA,IAAI;AACF,QAAA,aAAA,GAAgB,MAAM,OAAO,OAAA,CAAA;AAAA,MAC/B,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mCAAA,EAAsC,IAAI,CAAA,CAAA,CAAA,EAAM,IAAc,OAAO,CAAA;AAClF,QAAA;AAAA,MACF;AAKA,MAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAEpE,MAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAC/D,QAAA,MAAM,IAAA,GAAO,SAAS,KAAK,CAAA;AAC3B,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,YAAA,MAAM,QAAA,GAAW,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAA;AACvD,YAAA,MAAM,WAAW,MAAA,CAAO,SAAA,CAAU,OAAK,CAAA,CAAE,SAAA,KAAc,KAAK,SAAS,CAAA;AACrE,YAAA,IAAI,YAAY,CAAA,EAAG;AAEjB,cAAA,MAAM,mBAAmB,4BAAA,CAA6B,IAAA;AAAA,gBACpD,MAAA,CAAO,QAAQ,CAAA,CAAE;AAAA,eACnB;AACA,cAAA,IAAI,gBAAA,IAAoB,CAAC,QAAA,EAAU;AACjC,gBAAA,MAAA,CAAO,QAAQ,CAAA,GAAI;AAAA,kBACjB,UAAA;AAAA,kBACA,WAAW,IAAA,CAAK,SAAA;AAAA,kBAChB,UAAA,EAAY,IAAA;AAAA,kBACZ,SAAS,IAAA,CAAK,OAAA;AAAA,kBACd,SAAA,EAAW,IAAA,CAAK,OAAA,GAAU,KAAA,CAAA,GAAY;AAAA,iBACxC;AAAA,cACF;AAAA,YAEF,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,IAAA,CAAK;AAAA,gBACV,UAAA;AAAA,gBACA,WAAW,IAAA,CAAK,SAAA;AAAA,gBAChB,UAAA,EAAY,IAAA;AAAA,gBACZ,SAAS,IAAA,CAAK,OAAA;AAAA,gBACd,SAAA,EAAW,IAAA,CAAK,OAAA,GAAU,KAAA,CAAA,GAAY;AAAA,eACvC,CAAA;AAAA,YACH;AAAA,UACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,YAAA,SAAA,CAAU,IAAA,CAAK;AAAA,cACb,YAAA,EAAc,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AAAA,cACzC,UAAA;AAAA,cACA,UAAA,EAAY,IAAA;AAAA,cACZ,SAAS,IAAA,CAAK,OAAA;AAAA,cACd,YAAY,IAAA,CAAK;AAAA,aAClB,CAAA;AAAA,UACH;AAAA,QACF;AAIA,QAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,UAAA,MAAM,QAAA,GACJ,MAAM,IAAA,CAAK,GAAA,CAAI,cAAc,UAAA,IAAc,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,YAAe,UAAA;AAC3E,UAAA,IAAI,CAAC,QAAA,EAAU;AAEb,YAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,OAAK,CAAA,CAAE,MAAA,KAAW,KAAK,CAAA,EAAG;AACzC,cAAA,MAAA,CAAO,IAAA,CAAK;AAAA,gBACV,UAAA;AAAA,gBACA,UAAA,EAAY,IAAA;AAAA,gBACZ,MAAA,EAAQ;AAAA,eACT,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,cAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,KAAA,GAAQ,eAAA;AAAA,QACZ,KAAA,CAAM,UAAA;AAAA,QACN,KAAA,CAAM,UAAA;AAAA,QACN,KAAA,CAAM,OAAA;AAAA,QACN,KAAA,CAAM;AAAA,OACR;AACA,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,cAAA,GAAiB,mBAAmB,SAAS,CAAA;AAEnD,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,aAAa,cAAA,EAAe;AAAA,EAClE,CAAA,SAAE;AACA,IAAA,YAAA,EAAa;AAAA,EACf;AACF;;;AC/VO,SAAS,WAAA,CAAY,QAAkB,GAAA,EAAkC;AAE9E,EAAA,IAAI,kBAAkB,YAAA,EAAc;AAClC,IAAA,MAAM,QAAQ,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,WAAW,GAAG,CAAA;AACxD,IAAA,OAAO,KAAK,IAAA,GAAO,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,CAAA,GAAM,GAAG,KAAK,CAAA,WAAA,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,kBAAkB,YAAA,EAAc;AAClC,IAAA,MAAM,QAAQ,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,WAAW,GAAG,CAAA;AACxD,IAAA,OAAO,KAAK,IAAA,GAAO,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,CAAA,GAAM,GAAG,KAAK,CAAA,WAAA,CAAA;AAAA,EACtD;AAOA,EAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,IAAA,MAAM,SAAA,GACH,MAAA,CAAe,UAAA,KACd,MAAA,CAAe,WAAA,EAAa,UAAA,CAAW,WAAW,CAAA,GAC/C,MAAA,CAAe,WAAA,CAAY,KAAA,CAAM,WAAA,CAAY,MAAM,CAAA,GACpD,MAAA,CAAA;AACN,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,UAAU,SAAS,CAAA,EAAA,CAAA;AAAA,IAC5B;AAAA,EACF;AAGA,EAAA,IACE,MAAA,YAAkB,SAAA,IAClB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAA,YAAc,UAAA,IAC9B,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,GAAA,YAAe,UAAA,EAC/B;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACnC,MAAA,IAAI,GAAA,EAAK;AAEP,QAAA,IAAI,CAAC,GAAA,CAAI,kBAAA,CAAmB,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AAC/C,UAAA,GAAA,CAAI,mBAAmB,GAAA,CAAI,GAAA,CAAI,UAAA,kBAAY,IAAI,KAAK,CAAA;AAAA,QACtD;AACA,QAAA,GAAA,CAAI,mBAAmB,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA,EAAG,GAAA,CAAI,IAAI,UAAU,CAAA;AAC9D,QAAA,OAAO,GAAA,CAAI,UAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAI,GAAG,CAAA;AACtD,IAAA,GAAA,EAAK,oBAAA,EAAsB,IAAA,CAAK,EAAE,SAAA,EAAW,WAAW,CAAA;AACxD,IAAA,OAAO,GAAG,UAAU,CAAA,6BAAA,CAAA;AAAA,EACtB;AAGA,EAAA,IAAI,MAAA,YAAkB,YAAY,OAAO,YAAA;AACzC,EAAA,IAAI,MAAA,YAAkB,YAAY,OAAO,YAAA;AACzC,EAAA,IAAI,MAAA,YAAkB,aAAa,OAAO,aAAA;AAC1C,EAAA,IAAI,MAAA,YAAkB,UAAU,OAAO,UAAA;AACvC,EAAA,IAAI,MAAA,YAAkB,eAAe,OAAO,eAAA;AAC5C,EAAA,IAAI,MAAA,YAAkB,SAAS,OAAO,SAAA;AAGtC,EAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,KAAK,EAChC,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,MAAM,CAAA,EAAG,GAAG,KAAK,WAAA,CAAY,KAAA,EAAO,GAAG,CAAC,CAAA,CAAE,CAAA,CAC1D,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,OAAO,cAAc,MAAM,CAAA,GAAA,CAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,IAAA,OAAO,WAAW,WAAA,CAAY,MAAA,CAAO,KAAK,GAAA,CAAI,OAAA,EAAS,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EAC7D;AAGA,EAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,OAAA;AAChC,IAAA,MAAM,MAAA,GAAU,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAe,GAAA,CAAI,CAACC,EAAAA,KAAc,CAAA,CAAA,EAAIA,EAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC1F,IAAA,OAAO,WAAW,MAAM,CAAA,EAAA,CAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,kBAAkB,WAAA,EAAa;AACjC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,MAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAO,CAAE,MAAK,CAAE,KAAA;AACrC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,cAAc,KAAK,CAAA,EAAA,CAAA;AACzD,IAAA,OAAO,aAAa,KAAK,CAAA,CAAA,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,WAAA,CAAY,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC/E,IAAA,OAAO,YAAY,OAAO,CAAA,EAAA,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,WAAA,CAAY,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3E,IAAA,OAAO,YAAY,KAAK,CAAA,EAAA,CAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,kBAAkB,UAAA,EAAY;AAChC,IAAA,OAAO,CAAA,SAAA,EAAY,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,IAAI,OAAA,EAAS,GAAG,CAAC,CAAA,EAAA,EAAK,YAAY,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EAC9G;AAGA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,IAAQ,SAAA;AACzC,EAAA,OAAO,2BAA2B,QAAQ,CAAA,GAAA,CAAA;AAC5C;;;AClJA,IAAM,MAAA,GAAS,CAAA;AAAA;AAAA,CAAA;AAyBf,SAAS,iBAAiB,MAAA,EAA0B;AAClD,EAAA,IAAI,EAAE,MAAA,YAAkB,SAAA,CAAA,EAAY,OAAO,EAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA;AAMxB,EAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,SAAA,KAAc,aAAa,GAAA,CAAI,SAAA,CAAU,UAAS,GAAI,EAAA;AACnF,EAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,gBAAA,KAAqB,aAAa,GAAA,CAAI,gBAAA,CAAiB,UAAS,GAAI,EAAA;AAC/F,EAAA,OAAO,CAAA,EAAG,eAAA,CAAgB,GAAA,CAAI,EAAE,CAAC,CAAA,CAAA,EAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA,EAAI,SAAS,IAAI,OAAO,CAAA,CAAA;AACvF;AAEA,SAAS,gBAAgB,MAAA,EAA0B;AACjD,EAAA,OAAO,GAAG,WAAA,CAAY,MAAM,CAAC,CAAA,CAAA,EAAI,iBAAA,CAAkB,MAAM,CAAC,CAAA,CAAA;AAC5D;AAEA,SAAS,kBAAkB,MAAA,EAA0B;AACnD,EAAA,MAAM,MAAA,GAAU,MAAA,EAAgB,IAAA,EAAM,GAAA,EAAK,MAAA;AAC3C,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,MAAM,KAAK,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,EAAA;AAC1D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAO,OAAe,IAAA,EAAM,GAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA,IAAQ,OAAA;AAI3C,IAAA,MAAM,OAAgC,EAAC;AACvC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAGA,EAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,MAAM,OAAA,IAAW,CAAA,KAAM,UAAU,CAAA,KAAM,OAAA,IAAW,MAAM,SAAA,EAAW;AACvE,MAAA,MAAM,IAAI,OAAOA,EAAAA;AACjB,MAAA,IAAI,MAAM,QAAA,IAAY,CAAA,KAAM,YAAY,CAAA,KAAM,SAAA,IAAaA,OAAM,IAAA,EAAM;AACrE,QAAA,IAAA,CAAK,CAAC,CAAA,GAAIA,EAAAA;AAAA,MACZ,CAAA,MAAA,IAAWA,cAAa,MAAA,EAAQ;AAC9B,QAAA,IAAA,CAAK,CAAC,IAAIA,EAAAA,CAAE,MAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,SAAS,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,IAAA,CAAK,GAAG,CAAA;AAC9B;AAMO,SAAS,mBAAmB,MAAA,EAA0C;AAC3E,EAAA,MAAMC,SAAA,GAAU,MAAA,CACb,GAAA,CAAI,CAAA,CAAA,KAAK;AACR,IAAA,MAAM,aAAa,CAAA,GAAA,EAAM,CAAA,CAAE,WAAW,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAC,CAAA,CAAA;AAC7D,IAAA,OAAO,CAAA,SAAA,EAAY,CAAA,CAAE,UAAU,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,CAAA;AAAA,EACvD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,OAAA,GAAU,GAAG,MAAM;AAAA,EAAKA,SAAO;AAAA,CAAA;AACrC,EAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,GAAA,EAAK,OAAA,EAAQ;AACrC;AAoBA,SAAS,cAAc,GAAA,EAAwB;AAC7C,EAAA,OAAO,IAAI,UAAA,IAAc,CAAA,EAAG,IAAI,UAAU,CAAA,CAAA,EAAI,IAAI,SAAS,CAAA,CAAA;AAC7D;AAcA,SAAS,mBAAA,CACP,MAAA,EACA,WAAA,EACA,IAAA,EACkE;AAClE,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,MAAM,WAA2C,EAAC;AAClD,EAAA,MAAM,QAAA,GAAW,CAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,mBAAmB,YAAA,EAAc;AACnC,MAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AACxB,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAK,GAAA,CAAI,SAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,mBAAmB,YAAA,EAAc;AAC1C,MAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AACxB,MAAA,OAAA,GAAU,OAAA,CAAQ,KAAK,GAAA,CAAI,SAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AACnC,IAAA,IAAI,GAAA,EAAK;AAEP,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,QAAQ,EAAE,OAAA,EAAQ;AACvC,MAAA,OAAO;AAAA,QACL,GAAA;AAAA,QACA,UAAA,EAAY,CAAC,KAAA,KAAkB;AAC7B,UAAA,IAAI,MAAA,GAAS,KAAA;AACb,UAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,YAAA,MAAA,GAAS,IAAA,GAAO,KAAK,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAA,GAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA,EAAA,CAAA;AAAA,UACtD;AACA,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAUA,SAAS,eAAA,CACP,MAAA,EACA,WAAA,EACA,IAAA,EACkE;AAClE,EAAA,IAAI,EAAE,MAAA,YAAkB,UAAA,CAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,KAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,cAAc,EAAE,IAAA,EAAK;AAEvD,EAAA,KAAA,MAAW,CAAC,WAAA,EAAa,GAAG,CAAA,IAAK,WAAA,EAAa;AAC5C,IAAA,IAAI,EAAE,uBAAuB,UAAA,CAAA,EAAa;AAC1C,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,IAAA,CAAK,GAAA,CAAI,KAAA;AACxC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,UAAU,EAAE,IAAA,EAAK;AAG/C,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ;AAC/C,IAAA,IAAI,aAAA,CAAc,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,KAAM,SAAA,CAAU,CAAC,CAAC,CAAA,EAAG;AAGtD,IAAA,IAAI,QAAA,GAAW,IAAA;AACf,IAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,MAAA,MAAM,cAAA,GAAiB,eAAe,GAAG,CAAA;AACzC,MAAA,IAAI,EAAE,0BAA0B,YAAA,CAAA,EAAe;AAC7C,QAAA,QAAA,GAAW,KAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,GAAA,CAAI,SAAA;AACtC,MAAA,IAAI,KAAA,KAAU,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7B,QAAA,QAAA,GAAW,KAAA;AACX,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,GAAA;AAAA,QACA,UAAA,EAAY,CAAC,KAAA,KAAmB,IAAA,GAAO,aAAa,KAAK,CAAA,CAAA,CAAA,GAAM,GAAG,KAAK,CAAA,UAAA;AAAA,OACzE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAWA,SAAS,kBAAA,CAAmB,iBAAyB,UAAA,EAA4B;AAC/E,EAAA,MAAMC,KAAAA,GAAO,eAAA,CAAgB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACjD,EAAA,MAAM,MAAA,GAASA,MAAK,CAAC,CAAA,CAAE,aAAY,GAAIA,KAAAA,CAAK,MAAM,CAAC,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,UAAA,CAAW,QAAA,CAAS,iBAAiB,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AACxE,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAI,MAAM,CAAA,KAAA,CAAA;AAE1C,EAAA,MAAM,SAAA,GAAY,OAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAO,CAAA,KAAM,IAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,KAAA,CAAM,CAAC,CAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAE/F,EAAA,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,SAAA,CAAU,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACrE;AAKO,SAAS,gBACd,SAAA,EACA,MAAA,EACA,MAAA,EACA,WAAA,EACA,gBACA,OAAA,EACe;AAKf,EAAA,MAAM,YAAA,GAAe,CAAC,GAAG,MAAM,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,CAAA,EAAG,CAAA,KACxC,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAA,CAAG,cAAc,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAE;AAAA,GACnF;AACA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,SAAS,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,CAAA,EAAG,CAAA,KAC9C,EAAE,YAAA,CAAa,aAAA,CAAc,EAAE,YAAY;AAAA,GAC7C;AACA,EAAA,MAAM,YAAA,GAAe,MAAA,GACjB,CAAC,GAAG,MAAM,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,CAAA,EAAG,CAAA,KACnB,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAA,CAAG,cAAc,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAE;AAAA,GACnF,GACA,MAAA;AACJ,EAAA,MAAM,iBAAA,GAAoB,WAAA,GACtB,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,CAAA,EAAG,CAAA,KACxB,CAAA,EAAG,EAAE,eAAe,CAAA,CAAA,EAAI,CAAA,CAAE,eAAe,IAAI,CAAA,CAAE,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAA,CAAG,aAAA;AAAA,MACzE,CAAA,EAAG,CAAA,CAAE,eAAe,CAAA,CAAA,EAAI,CAAA,CAAE,eAAe,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA;AAAA;AAC1E,GACF,GACA,MAAA;AACJ,EAAA,MAAM,oBAAA,GAAuB,cAAA,GACzB,CAAC,GAAG,cAAc,CAAA,CAAE,IAAA;AAAA,IAAK,CAAC,CAAA,EAAG,CAAA,KAC3B,CAAA,EAAG,EAAE,kBAAkB,CAAA,CAAA,EAAI,CAAA,CAAE,kBAAkB,IAAI,CAAA,CAAE,YAAY,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAA,CAAG,aAAA;AAAA,MAClF,CAAA,EAAG,CAAA,CAAE,kBAAkB,CAAA,CAAA,EAAI,CAAA,CAAE,kBAAkB,CAAA,CAAA,EAAI,CAAA,CAAE,YAAY,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA;AAAA;AACnF,GACF,GACA,MAAA;AAIJ,EAAA,MAAA,GAAS,YAAA;AACT,EAAA,SAAA,GAAY,eAAA;AACZ,EAAA,MAAA,GAAS,YAAA;AACT,EAAA,WAAA,GAAc,iBAAA;AACd,EAAA,cAAA,GAAiB,oBAAA;AAGjB,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAyB;AACjD,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAY;AAE3C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,aAAa,CAAA,GAAA,EAAM,KAAA,CAAM,WAAW,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAC,CAAA,CAAA;AAEjE,IAAA,IAAI,MAAM,OAAA,EAAS;AAEjB,MAAA,KAAA,MAAW,OAAO,CAAC,KAAA,EAAO,UAAU,QAAA,EAAU,UAAA,EAAY,cAAc,CAAA,EAAY;AAClF,QAAA,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAe;AAAA,UAC9C,UAAA;AAAA,UACA,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,SAAA,EAAW,UAAU,GAAG,CAAA;AAAA,SACzB,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAA,IAAW,MAAM,SAAA,EAAW;AAM1B,MAAA,MAAM,MAAM,KAAA,CAAM,SAAA;AAClB,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,EAAE,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,EAAA,CAAG,GAAA,CAAI,GAAG,CAAA,EAAe,IAAA,EAAM,CAAA,OAAA,EAAU,KAAA,CAAM,UAAU,CAAA,CAAA,CAAA,EAAI;AAAA,QACnF,EAAE,GAAA,EAAK,QAAA,EAAU,MAAA,EAAQ,EAAA,CAAG,IAAA,CAAK,GAAG,CAAA,EAAe,IAAA,EAAM,CAAA,QAAA,EAAW,KAAA,CAAM,UAAU,CAAA,CAAA,CAAA,EAAI;AAAA,QACxF,EAAE,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAQ,EAAA,CAAG,IAAA,CAAK,GAAG,CAAA,EAAe,IAAA,EAAM,CAAA,QAAA,EAAW,KAAA,CAAM,UAAU,CAAA,CAAA,CAAA,EAAI;AAAA,QACtF;AAAA,UACE,GAAA,EAAK,QAAA;AAAA,UACL,MAAA,EAAQ,EAAA,CAAG,MAAA,CAAO,GAAG,CAAA;AAAA,UACrB,IAAA,EAAM,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,SACrC;AAAA,QACA;AAAA,UACE,GAAA,EAAK,UAAA;AAAA,UACL,MAAA,EAAQ,EAAA,CAAG,QAAA,CAAS,GAAG,CAAA;AAAA,UACvB,IAAA,EAAM,CAAA,YAAA,EAAe,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA;AACvC,OACF;AACA,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,MAAU,QAAA,EAAU;AAC5C,QAAA,WAAA,CAAY,IAAI,MAAA,EAAQ;AAAA,UACtB,UAAA;AAAA,UACA,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,SAAA,EAAW,GAAA;AAAA,UACX,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,GAAA,CAAI,kBAAkB,QAAA,EAAU;AAClC,QAAA,WAAA,CAAY,GAAA,CAAI,IAAI,MAAA,EAAQ;AAAA,UAC1B,UAAA;AAAA,UACA,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAwB;AAC7C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,MAAWJ,UAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,aAAa,CAAA,GAAA,EAAMA,MAAAA,CAAM,WAAW,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAC,CAAA,CAAA;AACjE,MAAA,QAAA,CAAS,GAAA,CAAIA,OAAM,MAAA,EAAQ;AAAA,QACzB,YAAYA,MAAAA,CAAM,UAAA;AAAA,QAClB,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,iBAAqF,EAAC;AAC5F,EAAA,MAAM,oBAAA,GAAuB,iBAAA;AAE7B,EAAA,MAAM,iBAAiB,IAAI,GAAA;AAAA,IACzB,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,SAAS,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU;AAAA,GACrE;AACA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAE5B,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,EAAG;AAE5B,MAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,EAAA,CAAG,eAAA,EAAiB,GAAG,UAAU,CAAA;AAIpE,MAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,EAAA,CAAG,eAAe,CAAA;AACpD,MAAA,IAAI,YAAA;AACJ,MAAA,IAAI,MAAA,EAAQ;AAEV,QAAA,MAAM,OAAA,GAAU,EAAA,CAAG,SAAA,KAAc,QAAA,GAAW,SAAS,EAAA,CAAG,SAAA;AACxD,QAAA,YAAA,GAAe,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA,EAAI,EAAA,CAAG,eAAe,CAAA,CAAA,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,CAAA,EAAG,EAAA,CAAG,eAAe,CAAA,QAAA,EAAW,GAAG,SAAS,CAAA,CAAA;AAAA,MAC7D;AACA,MAAA,MAAM,UAAA,GAAa,CAAA,aAAA,EAAgB,YAAY,CAAA,EAAG,GAAG,UAAU,CAAA,CAAA,CAAA;AAC/D,MAAA,cAAA,CAAe,KAAK,EAAE,OAAA,EAAS,YAAY,eAAA,EAAiB,EAAA,CAAG,iBAAiB,CAAA;AAChF,MAAA,QAAA,CAAS,GAAA,CAAI,GAAG,KAAA,EAAO;AAAA,QACrB,UAAA,EAAY,OAAA;AAAA,QACZ,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAoBA,EAAA,IAAI,cAAA,EAAgB;AAElB,IAAA,MAAM,cAAA,uBAAqB,GAAA,EAAyB;AAIpD,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAyB;AAK9C,IAAA,MAAM,uBAAA,uBAA8B,GAAA,EAAsB;AAC1D,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,IAAU,EAAC,EAAG;AAC5B,MAAA,uBAAA,CAAwB,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,UAAU,CAAA;AAAA,IACpD;AACA,IAAA,KAAA,MAAW,EAAA,IAAM,WAAA,IAAe,EAAC,EAAG;AAClC,MAAA,uBAAA,CAAwB,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,EAAA,CAAG,eAAe,CAAA;AAAA,IAC1D;AAEA,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,GAAG,CAAA,IAAK,QAAA,EAAU;AACzC,MAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,GAAA,CAAI,WAAW,CAAA;AAC1D,MAAA,MAAM,KAAA,GAAQ,eAAe,WAAW,CAAA;AACxC,MAAA,MAAM,SAAA,GAAuB,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAM;AACtD,MAAA,MAAM,EAAA,GAAK,iBAAiB,WAAW,CAAA;AACvC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AACtC,QAAA,IAAI,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAAA,aAChC,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,CAAC,SAAS,CAAC,CAAA;AAAA,MACzC;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,QAAA,IAAI,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAAA,aAChC,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,CAAC,SAAS,CAAC,CAAA;AAAA,MACtC;AAAA,IACF;AAEA,IAAA,MAAM,iBAAiD,EAAC;AAExD,IAAA,KAAA,MAAW,MAAM,cAAA,EAAgB;AAC/B,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,EAAG;AAI5B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAA,CAAG,KAAK,CAAA;AACrC,MAAA,IAAI,UAAA,GAAsC,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA;AAKxE,MAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,QAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,EAAA,CAAG,KAAK,CAAA;AACpC,QAAA,UAAA,GAAA,CAAc,EAAA,GAAK,cAAA,CAAe,GAAA,CAAI,EAAE,IAAI,MAAA,GAAY,MAAA;AAAA,UACtD,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,KAAU,MAAA,IAAa,EAAE,KAAA,KAAU;AAAA,SAC5C;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC1C,QAAA,cAAA,CAAe,IAAA,CAAK,EAAE,EAAA,EAAI,EAAA,CAAG,oBAAoB,IAAA,EAAM,EAAA,CAAG,YAAY,CAAA;AACtE,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAA,GAAS,UAAA,CAAW,CAAC,CAAA,CAAE,GAAA;AAAA,MACzB,CAAA,MAAO;AAIL,QAAA,MAAM,WAAW,UAAA,CAAW,MAAA,CAAO,OAAK,CAAA,CAAE,UAAA,KAAe,GAAG,kBAAkB,CAAA;AAC9E,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,UAAA,MAAA,GAAS,QAAA,CAAS,CAAC,CAAA,CAAE,GAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,MAAM,MAAA,GAAS,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA;AAAA,YAAK,CAAC,CAAA,EAAG,CAAA,KACtC,CAAA,EAAG,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA,CAAA,CAAG,aAAA;AAAA,cAC1C,GAAG,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,UAAU,CAAA;AAAA;AAC3C,WACF;AACA,UAAA,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA,CAAE,GAAA;AAGnB,UAAA,IAAI,CAAC,KAAA,EAAO;AACV,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,CAAA,wBAAA,EAA2B,GAAG,kBAAkB,CAAA,IAAA,EAAO,GAAG,UAAU,CAAA,UAAA,EAAa,UAAA,CAAW,MAAM,CAAA,gCAAA,EAC5F,UAAA,CAAW,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,UAAU,CAAA,CAAE,KAAK,IAAI,CAAC,CAAA,gBAAA,EAAmB,MAAA,CAAO,UAAU,CAAA,2FAAA;AAAA,aAE5F;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,MAAM,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,EAAE,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC5E,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,SAAA,EAAY,eAAe,MAAM,CAAA;AAAA,EAGD,IAAI,CAAA;AAAA,OACtC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAqC;AAAA,IACzC,QAAA;AAAA,IACA,kBAAA,sBAAwB,GAAA,EAAI;AAAA,IAC5B,sBAAsB,EAAC;AAAA,IACvB,MAAM,OAAA,EAAS;AAAA,GACjB;AAGA,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,SAAS,QAAQ,GAAA,EAAwB;AACvC,IAAA,kBAAA,CAAmB,GAAA,CAAI,IAAI,UAAU,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,cAAc,GAAG,CAAA;AAE9B,IAAA,IAAI,GAAA,CAAI,UAAA,EAAY,UAAA,CAAW,KAAK,GAAG,OAAA,GAAU,IAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,SAAS,cAAc,MAAA,EAAoC;AACzD,IAAA,IAAI,CAAC,QAAQ,OAAO,WAAA;AACpB,IAAA,MAAM,CAAA,GAAI,MAAA;AAGV,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AAC7B,IAAA,IAAI,GAAA,EAAK,OAAO,OAAA,CAAQ,GAAG,CAAA;AAG3B,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,CAAA,EAAG,WAAA,EAAa,SAAS,IAAI,CAAA;AACnE,IAAA,IAAI,WAAW,OAAO,SAAA,CAAU,WAAW,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAC,CAAA;AAGjE,IAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,CAAA,EAAG,WAAA,EAAa,SAAS,IAAI,CAAA;AAClE,IAAA,IAAI,cAAc,OAAO,YAAA,CAAa,WAAW,OAAA,CAAQ,YAAA,CAAa,GAAG,CAAC,CAAA;AAG1E,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAA,EAAG,cAAc,CAAA;AAC5C,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG,QAAA,GAAW,IAAA;AACtC,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,OAAA,GAAU,IAAA;AACtC,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,OAAA,GAAU,SAAA,CACb,GAAA,CAAI,CAAA,EAAA,KAAM;AACT,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,EAAA,CAAG,OAAO,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,EAAA,CAAG,UAAU,CAAA;AAC3C,IAAA,OAAO,CAAA,GAAA,EAAM,GAAG,YAAY,CAAA;AAAA,UAAA,EAAmB,IAAI,CAAA;AAAA,aAAA,EAAmB,OAAO,CAAA;AAAA,GAAA,CAAA;AAAA,EAC/E,CAAC,CAAA,CACA,IAAA,CAAK,KAAK,CAAA;AAGb,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,MAAA,CAAO,CAAA,EAAA,KAAM;AACrD,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,kBAAA,CAAmB,GAAA,CAAI,oBAAoB,CAAA;AAClF,IAAA,OAAO,eAAA,EAAiB,GAAA,CAAI,EAAA,CAAG,OAAO,CAAA;AAAA,EACxC,CAAC,CAAA;AAID,EAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,IAAA,KAAA,MAAW,MAAM,kBAAA,EAAoB;AACnC,MAAA,kBAAA,CAAmB,GAAA,CAAI,GAAG,eAAe,CAAA;AACzC,MAAA,IAAI,EAAA,CAAG,UAAA,CAAW,QAAA,CAAS,KAAK,GAAG,OAAA,GAAU,IAAA;AAAA,IAC/C;AAAA,EACF;AAGA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,IAAA,GAAO,UAAA,GAAa,KAAA;AAC/C,EAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAA,CAAG,CAAA;AAG7D,EAAA,MAAM,YAAA,GAAe,OAAA,EAAS,IAAA,GAAO,aAAA,GAAgB,QAAA;AACrD,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,IAAI,OAAA,EAAS,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAClC,EAAA,IAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG,WAAA,CAAY,KAAK,cAAc,CAAA;AAClE,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAK,YAAY,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,SAAA,EAAY,YAAY,CAAA,CAAA,CAAG,CAAA;AAAA,EAC5E;AAEA,EAAA,KAAA,MAAW,cAAc,CAAC,GAAG,kBAAkB,CAAA,CAAE,MAAK,EAAG;AACvD,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,UAAU,CAAA;AAC1D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,aAAa,CAAA,GAAA,EAAM,KAAA,CAAM,WAAW,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAC,CAAA,CAAA;AACjE,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9D;AAAA,EACF;AAKA,EAAA,MAAM,sBAAA,GAAyB,CAAC,GAAG,cAAA,CAAe,mBAAmB,IAAA,EAAM,EAAE,IAAA,EAAK;AAClF,EAAA,KAAA,MAAW,cAAc,sBAAA,EAAwB;AAC/C,IAAA,IAAI,eAAe,oBAAA,EAAsB;AACzC,IAAA,MAAM,cAAc,cAAA,CAAe,kBAAA,CAAmB,IAAI,UAAU,CAAA,wBAAS,GAAA,EAAY;AACzF,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAW,EAAE,IAAA,EAAK,CAAE,KAAK,IAAI,CAAA;AACtD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,EAAY,KAAK,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,GAAS,CAAA,GAAI,GAAG,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC;;AAAA,CAAA,GAAS,EAAA;AAGzE,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,GAAA,CAAI,CAAA,EAAA,KAAM,CAAA,MAAA,EAAS,GAAG,OAAO,CAAA,GAAA,EAAM,EAAA,CAAG,UAAU,CAAA,CAAE,CAAA;AAC1F,EAAA,MAAM,eAAA,GAAkB,aAAa,MAAA,GAAS,CAAA,GAAI,GAAG,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC;;AAAA,CAAA,GAAS,EAAA;AAErF,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,GAAG,OAAO,CAAA;AAAA,CAAA,GAAQ,EAAA;AAC/D,EAAA,MAAM,EAAA,GAAK,GAAG,MAAM;AAAA,EAAK,aAAa,GAAG,eAAe,CAAA;AAAA,EAAoC,eAAe,CAAA;AAAA,CAAA;AAE3G,EAAA,MAAM,GAAA,GAAM,OAAA,EAAS,IAAA,GACjB,CAAA,EAAG,MAAM;AAAA;;AAAA;AAAA,CAAA,GAKT,GAAG,MAAM;AAAA;;AAAA;AAAA,CAAA;AAMb,EAAA,OAAO,EAAE,IAAI,GAAA,EAAI;AACnB;AAQO,SAAS,kBAAA,GAAoC;AAClD,EAAA,MAAM,EAAA,GAAK,GAAG,MAAM,CAAA,CAAA;AAEpB,EAAA,MAAM,GAAA,GAAM,GAAG,MAAM;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAiBrB,EAAA,OAAO,EAAE,IAAI,GAAA,EAAI;AACnB;AAMO,SAAS,mBAAmB,OAAA,EAA6C;AAC9E,EAAA,MAAM,kBAAA,GAAqB,OAAA,EAAS,IAAA,GAAO,aAAA,GAAgB,QAAA;AAE3D,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,kDAAA;AAAA,IACA,wDAAA;AAAA,IACA,oDAAA;AAAA,IACA,0CAA0C,kBAAkB,CAAA,CAAA,CAAA;AAAA,IAC5D;AAAA,GACF;AAEA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,kFAAA;AAAA,IACA,EAAA;AAAA,IACA,0CAAA;AAAA,IACA,+CAAA;AAAA,IACA,EAAA;AAAA,IACA,+CAAA;AAAA,IACA,oDAAA;AAAA,IACA,EAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,EAAA,GAAK,GAAG,MAAM;AAAA,EAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;;AAAA,EAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAGxE,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,iDAAA;AAAA,IACA,wEAAA;AAAA,IACA,iFAAA;AAAA,IACA,yCAAyC,kBAAkB,CAAA,CAAA;AAAA,GAC7D;AAEA,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,8DAAA;AAAA,IACA,oEAAA;AAAA,IACA,EAAA;AAAA,IACA,mFAAA;AAAA,IACA,EAAA;AAAA,IACA,kGAAA;AAAA,IACA,EAAA;AAAA,IACA,gEAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,GAAA,GAAM,GAAG,MAAM;AAAA,EAAK,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;;AAAA,EAAO,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAEhF,EAAA,OAAO,EAAE,IAAI,GAAA,EAAI;AACnB","file":"index.js","sourcesContent":["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","/**\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 { 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 * Strips `undefined` from nested values while preserving top-level `undefined` keys.\n *\n * This is the patch-specific counterpart to `stripUndefined`. On a Convex `patch`,\n * a top-level field set to `undefined` is the documented way to *delete* that field\n * (Convex serializes it to `{ $undefined: null }` via `patchValueToJson`). A blanket\n * `stripUndefined` would drop that key before Convex ever sees it, turning an intended\n * unset into a silent no-op (issue #82).\n *\n * So we keep top-level `undefined` keys intact (they reach Convex as deletes) but still\n * clean `undefined` *inside* nested values — matching how `encodeDoc` treats stored\n * values, where `undefined` means \"absent\" rather than \"delete\".\n */\nfunction stripUndefinedPreservingTopLevel(value: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n // Top-level undefined = intentional field deletion — preserve it for Convex.\n result[key] = val === undefined ? undefined : stripUndefined(val)\n }\n return result\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 *\n * Unlike `encodeDoc`, this preserves top-level `undefined` values so that\n * `patch(id, { field: undefined })` deletes the field, matching native Convex\n * `patch` semantics (issue #82). Nested `undefined` is still stripped.\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 const encoded = encode(schema, partial as zoutput<S>)\n // Top-level union docs are still objects — preserve top-level undefined for deletes.\n return (\n encoded !== null && typeof encoded === 'object' && !Array.isArray(encoded)\n ? stripUndefinedPreservingTopLevel(encoded as Record<string, unknown>)\n : stripUndefined(encoded)\n ) 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 const encoded = encode(partialSchema, partial) as Record<string, unknown>\n return stripUndefinedPreservingTopLevel(encoded) 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","/**\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","/**\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","import fs from 'node:fs'\nimport path from 'node:path'\n\n/**\n * JavaScript source for the ESM loader hook that intercepts `_generated/api`\n * imports during discovery. Runs in Node's loader thread (must be plain JS,\n * not TypeScript).\n *\n * Only `_generated/api` is stubbed — `_generated/server` re-exports generic\n * builders from `convex/server` which work natively outside the Convex runtime.\n * The api stub is needed because `_generated/api` exports a `components` object\n * that triggers component constructors at module scope (e.g. `new LocalDTA(components.localDTA)`).\n */\nconst HOOKS_SOURCE = `\nexport function resolve(specifier, context, nextResolve) {\n if (/_generated\\\\/api(\\\\.[mc]?[jt]sx?)?$/.test(specifier)) {\n return { shortCircuit: true, url: 'zodvex-stub://api' };\n }\n return nextResolve(specifier, context);\n}\n\nexport function load(url, context, nextLoad) {\n if (url === 'zodvex-stub://api') {\n return {\n shortCircuit: true,\n format: 'module',\n source: [\n 'const handler = {',\n ' get(_, prop) {',\n ' if (typeof prop === \"symbol\") return undefined;',\n ' if (prop === \"__esModule\") return true;',\n ' return new Proxy(function(){}, handler);',\n ' },',\n ' apply() { return new Proxy({}, handler); },',\n ' construct() { return new Proxy({}, handler); },',\n '};',\n 'const p = new Proxy(function(){}, handler);',\n 'export default p;',\n 'export const api = p;',\n 'export const internal = p;',\n 'export const components = p;',\n 'export const httpRouter = p;',\n ].join('\\\\n')\n };\n }\n return nextLoad(url, context);\n}\n`\n\nlet hooksRegistered = false\n\n/**\n * Registers an ESM loader hook via `Module.register()` that intercepts imports\n * of `_generated/api`, replacing it with a deeply-nested Proxy stub. Safe to\n * call multiple times.\n *\n * Only `_generated/api` is intercepted — `_generated/server` works natively\n * outside the Convex runtime.\n *\n * Returns true if hooks were registered, false if Module.register is\n * unavailable (e.g. Bun, older Node).\n */\nexport function registerDiscoveryHooks(): boolean {\n if (hooksRegistered) return true\n try {\n // Dynamic import to avoid hard dependency on node:module in non-Node runtimes\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { register } = require('node:module') as typeof import('node:module')\n if (typeof register !== 'function') return false\n register(`data:text/javascript,${encodeURIComponent(HOOKS_SOURCE)}`)\n hooksRegistered = true\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Proxy stub for _generated/api.ts.\n *\n * Replaces the real api module (which requires the Convex runtime for\n * `components`) with a deeply-nested Proxy that absorbs property access\n * and constructor calls. This lets module-scope code like\n * `new LocalDTA(components.localDTA)` succeed silently during discovery.\n */\nconst PROXY_STUB_API = `// zodvex discovery stub — replaced after discovery completes\nconst handler = {\n get(_, prop) {\n if (typeof prop === 'symbol') return undefined;\n if (prop === '__esModule') return true;\n return new Proxy(function(){}, handler);\n },\n apply() { return new Proxy(function(){}, handler); },\n construct() { return new Proxy(function(){}, handler); },\n};\nconst p = new Proxy(function(){}, handler);\nexport default p;\nexport const api = p;\nexport const internal = p;\nexport const components = p;\nexport const httpRouter = p;\n`\n\ntype StubCleanup = () => void\n\n/**\n * Writes a Proxy stub file to `_generated/api.ts` in the target convex\n * directory. This is a fallback for environments where `Module.register()`\n * is unavailable (Bun, vitest's vite-node, etc.).\n *\n * Only `_generated/api.ts` is stubbed — `_generated/server.ts` re-exports\n * generic builders from `convex/server` which work natively.\n *\n * Returns a cleanup function that restores the original file contents.\n */\nexport function writeGeneratedStubs(convexDir: string): StubCleanup {\n const generatedDir = path.join(convexDir, '_generated')\n const apiPath = path.join(generatedDir, 'api.ts')\n\n let original: string | null\n try {\n original = fs.readFileSync(apiPath, 'utf8')\n } catch {\n original = null\n }\n\n fs.mkdirSync(generatedDir, { recursive: true })\n fs.writeFileSync(apiPath, PROXY_STUB_API)\n\n return () => {\n if (original !== null) {\n fs.writeFileSync(apiPath, original)\n } else {\n try {\n fs.unlinkSync(apiPath)\n } catch {\n // File may not exist — that's fine\n }\n }\n }\n}\n","import { readMeta } from '../../internal/meta'\nimport {\n $ZodCodec,\n $ZodCustom,\n $ZodNullable,\n $ZodNumber,\n $ZodOptional,\n $ZodType\n} from '../../internal/zod-core'\n\n/**\n * Unwraps ZodOptional/ZodNullable layers to find the inner ZodCodec.\n * Returns the codec instance, or undefined if none found.\n * Skips zx.date() (ZodCodec with in=ZodNumber, out=ZodCustom).\n *\n * Used internally by the discovery pipeline to probe schemas for codecs.\n */\nexport function findCodec(schema: $ZodType): $ZodType | undefined {\n let current = schema\n for (let i = 0; i < 10; i++) {\n if (current instanceof $ZodCodec) {\n const isZxDate =\n current._zod.def.in instanceof $ZodNumber && current._zod.def.out instanceof $ZodCustom\n if (isZxDate) return undefined\n return current\n }\n if (current instanceof $ZodOptional || current instanceof $ZodNullable) {\n current = current._zod.def.innerType\n continue\n }\n break\n }\n return undefined\n}\n\n/**\n * Extracts the inner ZodCodec from a schema, throwing if none is found.\n * The codegen only emits extractCodec() calls for schemas it has verified\n * contain a codec during discovery, so a missing codec is a bug.\n *\n * Used by generated _zodvex/api.ts to extract codec references at runtime.\n */\nexport function extractCodec(schema: $ZodType): $ZodType {\n const codec = findCodec(schema)\n if (!codec) {\n throw new Error('zodvex: extractCodec() found no codec in schema — this is a codegen bug')\n }\n return codec\n}\n\n/**\n * Extracts the zodArgs schema from a zodvex-registered function.\n * Used by generated _zodvex/api.ts to access function-embedded codecs at runtime.\n */\nexport function readFnArgs(fn: unknown): $ZodType {\n const meta = readMeta(fn)\n if (!meta || meta.type !== 'function' || !meta.zodArgs) {\n throw new Error('zodvex: function has no zodArgs metadata')\n }\n return meta.zodArgs as $ZodType\n}\n\n/**\n * Extracts the zodReturns schema from a zodvex-registered function.\n * Used by generated _zodvex/api.ts to access function-embedded codecs at runtime.\n */\nexport function readFnReturns(fn: unknown): $ZodType {\n const meta = readMeta(fn)\n if (!meta || meta.type !== 'function' || !meta.zodReturns) {\n throw new Error('zodvex: function has no zodReturns metadata')\n }\n return meta.zodReturns as $ZodType\n}\n","import path from 'node:path'\nimport { globSync } from 'tinyglobby'\nimport { z } from 'zod'\nimport { readMeta, type ZodvexFunctionMeta, type ZodvexModelMeta } from '../../internal/meta'\nimport { createSchemaUpdateSchema } from '../../internal/modelSchemaBundle'\nimport {\n $ZodArray,\n $ZodCodec,\n $ZodCustom,\n $ZodNullable,\n $ZodNumber,\n $ZodObject,\n $ZodOptional,\n $ZodRecord,\n $ZodTuple,\n $ZodType,\n $ZodUnion\n} from '../../internal/zod-core'\nimport { zx } from '../../internal/zx'\nimport { registerDiscoveryHooks, writeGeneratedStubs } from './discovery-hooks'\nimport { findCodec } from './extractCodec'\n\nexport type DiscoveredModel = {\n exportName: string\n tableName: string\n sourceFile: string\n schemas: ZodvexModelMeta['schemas']\n /** @internal For slim models — used to reconstruct schemas at codegen time. */\n _modelRef?: unknown\n}\n\nexport type DiscoveredFunction = {\n functionPath: string\n exportName: string\n sourceFile: string\n zodArgs?: ZodvexFunctionMeta['zodArgs']\n zodReturns?: ZodvexFunctionMeta['zodReturns']\n}\n\nexport type DiscoveredCodec = {\n exportName: string\n sourceFile: string\n schema: $ZodType\n}\n\nexport type ModelEmbeddedCodec = {\n codec: $ZodType\n modelExportName: string\n modelSourceFile: string\n schemaKey: string\n /** Path expression from schema root, e.g. '.shape.email' or '.shape.payload._zod.def.options[0].shape.name' */\n accessPath: string\n}\n\nexport type FunctionEmbeddedCodec = {\n codec: $ZodType\n functionExportName: string\n functionSourceFile: string\n schemaSource: 'zodArgs' | 'zodReturns'\n accessPath: string\n}\n\nexport type DiscoveryResult = {\n models: DiscoveredModel[]\n functions: DiscoveredFunction[]\n codecs: DiscoveredCodec[]\n modelCodecs: ModelEmbeddedCodec[]\n functionCodecs: FunctionEmbeddedCodec[]\n}\n\n/**\n * Recursively walks a Zod schema tree to find embedded ZodCodec instances.\n * Navigates into ZodObject shapes, ZodUnion/ZodArray/ZodRecord/ZodTuple members,\n * and unwraps ZodOptional/ZodNullable at intermediate levels.\n *\n * Builds an access path string for each discovered codec that can be used\n * in generated code to navigate from the schema root to the codec's location.\n */\nfunction walkSchemaRecursive(\n schema: $ZodType,\n accessPath: string,\n visited: Set<$ZodType>,\n seenCodecs: Set<$ZodType>,\n results: { codec: $ZodType; accessPath: string }[]\n): void {\n if (visited.has(schema)) return\n visited.add(schema)\n\n // Check if this node is/contains a codec (findCodec unwraps optional/nullable)\n const codec = findCodec(schema)\n if (codec) {\n if (!seenCodecs.has(codec)) {\n seenCodecs.add(codec)\n results.push({ codec, accessPath })\n }\n return // Codec is a leaf — don't recurse into its internals\n }\n\n // Unwrap optional/nullable to get to the structural type\n let current: $ZodType = schema\n let currentPath = accessPath\n for (let i = 0; i < 10; i++) {\n if (current instanceof $ZodOptional || current instanceof $ZodNullable) {\n current = current._zod.def.innerType\n currentPath += '._zod.def.innerType'\n } else {\n break\n }\n }\n\n if (current instanceof $ZodObject) {\n const shape = current._zod.def.shape as Record<string, $ZodType>\n if (shape) {\n for (const [field, fieldSchema] of Object.entries(shape)) {\n walkSchemaRecursive(\n fieldSchema,\n `${currentPath}.shape.${field}`,\n visited,\n seenCodecs,\n results\n )\n }\n }\n } else if (current instanceof $ZodUnion) {\n const options = current._zod.def.options\n if (options) {\n for (let i = 0; i < options.length; i++) {\n walkSchemaRecursive(\n options[i],\n `${currentPath}._zod.def.options[${i}]`,\n visited,\n seenCodecs,\n results\n )\n }\n }\n } else if (current instanceof $ZodArray) {\n const element = current._zod.def.element\n if (element) {\n walkSchemaRecursive(element, `${currentPath}._zod.def.element`, visited, seenCodecs, results)\n }\n } else if (current instanceof $ZodRecord) {\n const valueType = current._zod.def.valueType\n if (valueType) {\n walkSchemaRecursive(\n valueType,\n `${currentPath}._zod.def.valueType`,\n visited,\n seenCodecs,\n results\n )\n }\n } else if (current instanceof $ZodTuple) {\n const items = current._zod.def.items\n if (items) {\n for (let i = 0; i < items.length; i++) {\n walkSchemaRecursive(\n items[i],\n `${currentPath}._zod.def.items[${i}]`,\n visited,\n seenCodecs,\n results\n )\n }\n }\n }\n}\n\n/**\n * Reconstructs the schemas bundle for a slim model by deriving doc, insert,\n * update, docArray, and paginatedDoc from the model's fields and schema.\n */\nfunction reconstructSchemas(model?: {\n name: string\n fields: Record<string, $ZodType>\n schema?: unknown\n doc?: unknown\n}): ZodvexModelMeta['schemas'] | null {\n if (!model) return null\n const modelInput = model as any\n const docSchema = modelInput.doc instanceof $ZodType ? modelInput.doc : zx.doc(modelInput)\n const baseSchema =\n modelInput.schema instanceof $ZodType ? modelInput.schema : z.object(model.fields)\n return {\n doc: docSchema,\n insert: baseSchema,\n update: createSchemaUpdateSchema(model.name, baseSchema),\n docArray: z.array(docSchema),\n paginatedDoc: zx.paginationResult(docSchema)\n }\n}\n\n/**\n * Walks a model's schema shapes to find embedded ZodCodec instances.\n * Recursively descends into objects, unions, arrays, records, and tuples.\n * Deduplicates by codec object identity across schema keys.\n * Skips zx.date() (handled natively by zodToSource via extractCodec).\n */\nexport function walkModelCodecs(\n modelExportName: string,\n sourceFile: string,\n schemas: ZodvexModelMeta['schemas'],\n model?: { name: string; fields: Record<string, $ZodType>; schema?: unknown; doc?: unknown }\n): ModelEmbeddedCodec[] {\n // Reconstruct schemas from model if meta.schemas is absent (slim model)\n const effectiveSchemas = schemas ?? reconstructSchemas(model)\n const found: ModelEmbeddedCodec[] = []\n if (!effectiveSchemas) return found\n const visited = new Set<$ZodType>()\n const seenCodecs = new Set<$ZodType>()\n\n for (const schemaKey of ['doc', 'insert', 'update'] as const) {\n const schema = effectiveSchemas[schemaKey]\n if (!schema) continue\n\n const results: { codec: $ZodType; accessPath: string }[] = []\n walkSchemaRecursive(schema as $ZodType, '', visited, seenCodecs, results)\n\n for (const r of results) {\n found.push({\n codec: r.codec,\n modelExportName,\n modelSourceFile: sourceFile,\n schemaKey,\n accessPath: r.accessPath\n })\n }\n }\n\n return found\n}\n\n/**\n * Walks a function's zodArgs and zodReturns schemas to find embedded ZodCodec instances.\n * Same recursive descent as walkModelCodecs, but uses function metadata as the entry point.\n */\nexport function walkFunctionCodecs(functions: DiscoveredFunction[]): FunctionEmbeddedCodec[] {\n const found: FunctionEmbeddedCodec[] = []\n const visited = new Set<$ZodType>()\n const seenCodecs = new Set<$ZodType>()\n\n for (const fn of functions) {\n for (const schemaSource of ['zodArgs', 'zodReturns'] as const) {\n const schema = schemaSource === 'zodArgs' ? fn.zodArgs : fn.zodReturns\n if (!schema) continue\n\n const results: { codec: $ZodType; accessPath: string }[] = []\n walkSchemaRecursive(schema as $ZodType, '', visited, seenCodecs, results)\n\n for (const r of results) {\n found.push({\n codec: r.codec,\n functionExportName: fn.exportName,\n functionSourceFile: fn.sourceFile,\n schemaSource,\n accessPath: r.accessPath\n })\n }\n }\n }\n\n return found\n}\n\n/**\n * Discovers all zodvex-decorated modules in a convex directory.\n * Imports each .ts/.js file, reads __zodvexMeta from exports,\n * and builds a registry of models and functions.\n *\n * Each file is imported once per process. Watch mode (`zodvex dev`) does NOT\n * re-import in-process between edits — query-string cache-busting is a\n * Node-only trick that Bun's loader ignores (Bun caches ESM modules by\n * resolved path), so the watcher spawns a fresh `generate` subprocess per\n * change instead. See `regenerate()` in cli/commands.ts.\n *\n * @param convexDir Absolute path to the convex directory to scan.\n */\nexport async function discoverModules(convexDir: string): Promise<DiscoveryResult> {\n const models: DiscoveredModel[] = []\n const functions: DiscoveredFunction[] = []\n const codecs: DiscoveredCodec[] = []\n\n // Stub _generated/api so module-scope code that accesses Convex components\n // (e.g. `new LocalDTA(components.localDTA)`) receives a harmless Proxy\n // instead of throwing outside the Convex runtime. _generated/server is NOT\n // stubbed — it re-exports generic builders from convex/server which work natively.\n registerDiscoveryHooks()\n const cleanupStubs = writeGeneratedStubs(convexDir)\n\n const files = globSync(['**/*.{ts,js}'], {\n cwd: convexDir,\n onlyFiles: true,\n ignore: [\n '_generated/**',\n '_zodvex/**',\n 'node_modules/**',\n '**/*.d.ts',\n '**/*.test.ts',\n '**/*.test.js',\n '**/*.spec.ts',\n '**/*.spec.js',\n 'convex.config.ts',\n 'convex.config.js',\n 'crons.ts',\n 'crons.js'\n ]\n }).sort()\n\n try {\n for (const file of files) {\n const absPath = path.resolve(convexDir, file)\n\n let moduleExports: Record<string, unknown>\n try {\n moduleExports = await import(absPath)\n } catch (err) {\n console.warn(`[zodvex] Warning: Failed to import ${file}:`, (err as Error).message)\n continue\n }\n\n // Derive module name from file path (strip extension, use forward slashes).\n // Used as-is for function paths — Convex's getFunctionName() returns the full\n // relative path including any subdirectory prefix (e.g. \"api/reports:summary\").\n const moduleName = file.replace(/\\.(ts|js)$/, '').replace(/\\\\/g, '/')\n\n for (const [exportName, value] of Object.entries(moduleExports)) {\n const meta = readMeta(value)\n if (meta) {\n if (meta.type === 'model') {\n const isBarrel = /(?:^|[\\\\/])index\\.(ts|js)$/.test(file)\n const existing = models.findIndex(m => m.tableName === meta.tableName)\n if (existing >= 0) {\n // Replace barrel source with direct module source\n const existingIsBarrel = /(?:^|[\\\\/])index\\.(ts|js)$/.test(\n models[existing].sourceFile\n )\n if (existingIsBarrel && !isBarrel) {\n models[existing] = {\n exportName,\n tableName: meta.tableName,\n sourceFile: file,\n schemas: meta.schemas,\n _modelRef: meta.schemas ? undefined : value\n }\n }\n // If existing is direct and new is barrel, skip\n } else {\n models.push({\n exportName,\n tableName: meta.tableName,\n sourceFile: file,\n schemas: meta.schemas,\n _modelRef: meta.schemas ? undefined : value\n })\n }\n } else if (meta.type === 'function') {\n functions.push({\n functionPath: `${moduleName}:${exportName}`,\n exportName,\n sourceFile: file,\n zodArgs: meta.zodArgs,\n zodReturns: meta.zodReturns\n })\n }\n }\n\n // Check for exported ZodCodec instances (custom codecs)\n // Skip zx.date() — it's handled natively by zodToSource\n if (value instanceof $ZodCodec) {\n const isZxDate =\n value._zod.def.in instanceof $ZodNumber && value._zod.def.out instanceof $ZodCustom\n if (!isZxDate) {\n // Deduplicate by object identity (same codec from re-exports)\n if (!codecs.some(c => c.schema === value)) {\n codecs.push({\n exportName,\n sourceFile: file,\n schema: value as $ZodType\n })\n }\n }\n }\n }\n }\n\n const modelCodecs: ModelEmbeddedCodec[] = []\n for (const model of models) {\n const found = walkModelCodecs(\n model.exportName,\n model.sourceFile,\n model.schemas,\n model._modelRef as any\n )\n modelCodecs.push(...found)\n }\n\n const functionCodecs = walkFunctionCodecs(functions)\n\n return { models, functions, codecs, modelCodecs, functionCodecs }\n } finally {\n cleanupStubs()\n }\n}\n","import {\n $ZodAny,\n $ZodArray,\n $ZodBoolean,\n $ZodCodec,\n $ZodCustom,\n $ZodEnum,\n $ZodLiteral,\n $ZodNull,\n $ZodNullable,\n $ZodNumber,\n $ZodObject,\n $ZodOptional,\n $ZodRecord,\n $ZodString,\n $ZodTuple,\n $ZodType,\n $ZodUndefined,\n $ZodUnion\n} from '../../internal/zod-core'\n\nexport type CodecRef = {\n exportName: string\n sourceFile: string\n}\n\nexport type UndiscoverableCodec = {\n functionPath?: string\n fieldPath: string\n}\n\nexport type ZodToSourceContext = {\n /** Map from ZodCodec schema identity → reference info */\n codecMap: Map<$ZodType, CodecRef>\n /** Accumulates needed imports: sourceFile → Set of export names */\n neededCodecImports: Map<string, Set<string>>\n /** Codecs found during serialization that aren't in the codecMap */\n undiscoverableCodecs: UndiscoverableCodec[]\n /** Emit functional forms (z.optional(x)) instead of chaining (x.optional()) for zod/mini */\n mini?: boolean\n}\n\n/**\n * Converts a runtime Zod schema to its source code representation.\n * Used by the codegen engine to serialize ad-hoc schemas in the generated api.ts.\n *\n * Supports: primitives, objects, arrays, optional, nullable, enums, literals,\n * unions, tuples, records, and zodvex extensions (zx.id, zx.date).\n *\n * Unsupported types fall back to `z.any()` with a comment.\n */\nexport function zodToSource(schema: $ZodType, ctx?: ZodToSourceContext): string {\n // Peel off wrappers first (optional, nullable)\n if (schema instanceof $ZodOptional) {\n const inner = zodToSource(schema._zod.def.innerType, ctx)\n return ctx?.mini ? `z.optional(${inner})` : `${inner}.optional()`\n }\n if (schema instanceof $ZodNullable) {\n const inner = zodToSource(schema._zod.def.innerType, ctx)\n return ctx?.mini ? `z.nullable(${inner})` : `${inner}.nullable()`\n }\n\n // zodvex extensions — detect before generic types\n\n // zx.id('tableName') — ZodString with _tableName property (set by zid())\n // Prefer _tableName check (works in both zod and zod/mini),\n // fall back to .description check (full zod only)\n if (schema instanceof $ZodString) {\n const tableName =\n (schema as any)._tableName ??\n ((schema as any).description?.startsWith('convexId:')\n ? (schema as any).description.slice('convexId:'.length)\n : undefined)\n if (tableName) {\n return `zx.id(\"${tableName}\")`\n }\n }\n\n // zx.date() — ZodCodec with in=ZodNumber, out=ZodCustom\n if (\n schema instanceof $ZodCodec &&\n schema._zod.def.in instanceof $ZodNumber &&\n schema._zod.def.out instanceof $ZodCustom\n ) {\n return 'zx.date()'\n }\n\n // Generic ZodCodec — check codec map for identity match\n if (schema instanceof $ZodCodec) {\n if (ctx?.codecMap) {\n const ref = ctx.codecMap.get(schema)\n if (ref) {\n // Track the needed import\n if (!ctx.neededCodecImports.has(ref.sourceFile)) {\n ctx.neededCodecImports.set(ref.sourceFile, new Set())\n }\n ctx.neededCodecImports.get(ref.sourceFile)?.add(ref.exportName)\n return ref.exportName\n }\n }\n // Unknown codec — fall back to wire schema with warning\n const wireSource = zodToSource(schema._zod.def.in, ctx)\n ctx?.undiscoverableCodecs?.push({ fieldPath: 'unknown' })\n return `${wireSource} /* codec: transforms lost */`\n }\n\n // Primitives\n if (schema instanceof $ZodString) return 'z.string()'\n if (schema instanceof $ZodNumber) return 'z.number()'\n if (schema instanceof $ZodBoolean) return 'z.boolean()'\n if (schema instanceof $ZodNull) return 'z.null()'\n if (schema instanceof $ZodUndefined) return 'z.undefined()'\n if (schema instanceof $ZodAny) return 'z.any()'\n\n // Objects\n if (schema instanceof $ZodObject) {\n const shape = schema._zod.def.shape\n const fields = Object.entries(shape)\n .map(([key, value]) => `${key}: ${zodToSource(value, ctx)}`)\n .join(', ')\n return `z.object({ ${fields} })`\n }\n\n // Arrays\n if (schema instanceof $ZodArray) {\n return `z.array(${zodToSource(schema._zod.def.element, ctx)})`\n }\n\n // Enums\n if (schema instanceof $ZodEnum) {\n const entries = schema._zod.def.entries\n const values = (Object.values(entries) as string[]).map((v: string) => `\"${v}\"`).join(', ')\n return `z.enum([${values}])`\n }\n\n // Literals\n if (schema instanceof $ZodLiteral) {\n const values = schema._zod.def.values\n const value = values.values().next().value\n if (typeof value === 'string') return `z.literal(\"${value}\")`\n return `z.literal(${value})`\n }\n\n // Unions\n if (schema instanceof $ZodUnion) {\n const members = schema._zod.def.options.map(s => zodToSource(s, ctx)).join(', ')\n return `z.union([${members}])`\n }\n\n // Tuples\n if (schema instanceof $ZodTuple) {\n const items = schema._zod.def.items.map(s => zodToSource(s, ctx)).join(', ')\n return `z.tuple([${items}])`\n }\n\n // Records\n if (schema instanceof $ZodRecord) {\n return `z.record(${zodToSource(schema._zod.def.keyType, ctx)}, ${zodToSource(schema._zod.def.valueType, ctx)})`\n }\n\n // Fallback for unsupported types\n const typeName = schema._zod.def.type ?? 'unknown'\n return `z.any() /* unsupported: ${typeName} */`\n}\n","import { readCodecBrand } from '../../internal/meta'\nimport {\n $ZodCodec,\n $ZodNullable,\n $ZodObject,\n $ZodOptional,\n $ZodType\n} from '../../internal/zod-core'\nimport { zx } from '../../internal/zx'\nimport type {\n DiscoveredFunction,\n DiscoveredModel,\n FunctionEmbeddedCodec,\n ModelEmbeddedCodec\n} from './discover'\nimport { type CodecRef, type ZodToSourceContext, zodToSource } from './zodToSource'\n\nconst HEADER = `// AUTO-GENERATED by zodvex — do not edit\n// Run \\`zodvex generate\\` to regenerate\n`\n\nexport type GeneratedFile = { js: string; dts: string }\n\n/**\n * Produces a structural fingerprint for a ZodCodec by serializing its\n * wire (in) and runtime (out) schemas. Two factory-created codec instances\n * with the same arguments produce the same fingerprint, enabling dedup\n * even when object identity differs.\n *\n * The wire/runtime schemas are serialized via zodToSource, then suffixed\n * with a stable representation of any checks (`.max(n)`, `.min(n)`, etc.)\n * so that `sensitive(z.string())` and `sensitive(z.string().max(100))`\n * land on distinct fingerprints. Without this, codecs that differ only by\n * a constraint collide and the ambiguity-resolution path can't tell them\n * apart by structure alone.\n *\n * The transform bodies (decode/encode) are folded in too: two codecs with the\n * same wire+runtime shape but different transform logic must NOT share a\n * fingerprint, or the ambiguity path could reference a behaviorally-wrong\n * codec. `.toString()` discriminates transform source (a residual gap remains\n * for identical source with different captured closure config — documented).\n */\nfunction fingerprintCodec(schema: $ZodType): string {\n if (!(schema instanceof $ZodCodec)) return ''\n const def = schema._zod.def as {\n in: $ZodType\n out: $ZodType\n transform?: unknown\n reverseTransform?: unknown\n }\n const transform = typeof def.transform === 'function' ? def.transform.toString() : ''\n const reverse = typeof def.reverseTransform === 'function' ? def.reverseTransform.toString() : ''\n return `${fingerprintLeaf(def.in)}|${fingerprintLeaf(def.out)}|${transform}|${reverse}`\n}\n\nfunction fingerprintLeaf(schema: $ZodType): string {\n return `${zodToSource(schema)}#${fingerprintChecks(schema)}`\n}\n\nfunction fingerprintChecks(schema: $ZodType): string {\n const checks = (schema as any)?._zod?.def?.checks\n if (!Array.isArray(checks) || checks.length === 0) return ''\n const parts: string[] = []\n for (const check of checks) {\n const def = (check as any)?._zod?.def\n if (!def) continue\n const checkType = def.check ?? def.type ?? 'check'\n // Stringify only the data that distinguishes one check from another —\n // numeric bounds, regex sources, format names. Skip non-serializable\n // fields (functions, error contributors) so the fingerprint stays stable.\n const data: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(def)) {\n if (k === 'check' || k === 'type' || k === 'error' || k === 'message') continue\n const t = typeof v\n if (t === 'string' || t === 'number' || t === 'boolean' || v === null) {\n data[k] = v\n } else if (v instanceof RegExp) {\n data[k] = v.source\n }\n }\n parts.push(`${checkType}(${JSON.stringify(data)})`)\n }\n return parts.sort().join('&')\n}\n\n/**\n * Generates the schema file content — re-exports of all discovered models.\n * Returns { js, dts } with .js import extensions (TS resolves types from .js targets).\n */\nexport function generateSchemaFile(models: DiscoveredModel[]): GeneratedFile {\n const exports = models\n .map(m => {\n const importPath = `../${m.sourceFile.replace(/\\.ts$/, '.js')}`\n return `export { ${m.exportName} } from '${importPath}'`\n })\n .join('\\n')\n\n const content = `${HEADER}\\n${exports}\\n`\n return { js: content, dts: content }\n}\n\ntype SchemaRef = {\n importPath: string\n exportName: string\n /**\n * Property path relative to the model export, e.g. \"schema.doc\" for full\n * models or \"schema\" for union-slim. Emitted as `${exportName}.${schemaKey}`\n * unless `expression` is set.\n */\n schemaKey: string\n /**\n * Complete access expression to emit, e.g. \"zx.doc(TaskModel)\". Used for\n * slim models where there's no plain property path. When present, emitted\n * verbatim (the `zx` import is auto-added).\n */\n expression?: string\n}\n\n/** Emission helper: returns the full access expression for a SchemaRef. */\nfunction refExpression(ref: SchemaRef): string {\n return ref.expression ?? `${ref.exportName}.${ref.schemaKey}`\n}\n\nexport type CodecForGeneration = {\n exportName: string\n sourceFile: string\n schema: $ZodType\n}\n\n/**\n * Peels .optional() and .nullable() wrappers from a schema and checks\n * the identity map at each level. Returns the matched ref plus a\n * function that wraps an inner source string with the appropriate\n * optional/nullable syntax (chaining or functional for mini mode).\n */\nfunction tryUnwrapToIdentity(\n schema: $ZodType,\n identityMap: Map<$ZodType, SchemaRef>,\n mini?: boolean\n): { ref: SchemaRef; wrapSource: (inner: string) => string } | null {\n let current = schema\n const wrappers: Array<'optional' | 'nullable'> = []\n const maxDepth = 5\n\n for (let i = 0; i < maxDepth; i++) {\n if (current instanceof $ZodOptional) {\n wrappers.push('optional')\n current = current._zod.def.innerType\n } else if (current instanceof $ZodNullable) {\n wrappers.push('nullable')\n current = current._zod.def.innerType\n } else {\n break\n }\n\n const ref = identityMap.get(current)\n if (ref) {\n // Wrappers collected outermost-first, apply innermost-first\n const reversed = [...wrappers].reverse()\n return {\n ref,\n wrapSource: (inner: string) => {\n let result = inner\n for (const w of reversed) {\n result = mini ? `z.${w}(${result})` : `${result}.${w}()`\n }\n return result\n }\n }\n }\n }\n\n return null\n}\n\n/**\n * Checks if a ZodObject schema is structurally equivalent to\n * someModelSchema.partial() by comparing field-by-field identity.\n *\n * Zod's .partial() wraps each field in ZodOptional, preserving\n * the inner type identity. So we check: same keys, each field\n * is ZodOptional, and each inner type === the original model field.\n */\nfunction tryMatchPartial(\n schema: $ZodType,\n identityMap: Map<$ZodType, SchemaRef>,\n mini?: boolean\n): { ref: SchemaRef; wrapSource: (inner: string) => string } | null {\n if (!(schema instanceof $ZodObject)) return null\n const candidateShape = schema._zod.def.shape as Record<string, $ZodType>\n const candidateKeys = Object.keys(candidateShape).sort()\n\n for (const [modelSchema, ref] of identityMap) {\n if (!(modelSchema instanceof $ZodObject)) continue\n const modelShape = modelSchema._zod.def.shape as Record<string, $ZodType>\n const modelKeys = Object.keys(modelShape).sort()\n\n // Same key count and same keys\n if (candidateKeys.length !== modelKeys.length) continue\n if (candidateKeys.some((k, i) => k !== modelKeys[i])) continue\n\n // Every candidate field must be ZodOptional wrapping the model field by identity\n let allMatch = true\n for (const key of candidateKeys) {\n const candidateField = candidateShape[key]\n if (!(candidateField instanceof $ZodOptional)) {\n allMatch = false\n break\n }\n const inner = candidateField._zod.def.innerType\n if (inner !== modelShape[key]) {\n allMatch = false\n break\n }\n }\n\n if (allMatch) {\n return {\n ref,\n wrapSource: (inner: string) => (mini ? `z.partial(${inner})` : `${inner}.partial()`)\n }\n }\n }\n\n return null\n}\n\n/**\n * Derives a descriptive variable name for a model-embedded codec from\n * the model export name and the access path.\n *\n * Examples:\n * ('UserModel', '.shape.email') → '_userEmail'\n * ('ActivityModel', '.shape.payload._zod.def.options[0].shape.email') → '_activityPayloadEmail'\n * ('patients', '.shape.firstName') → '_patientsFirstName'\n */\nfunction deriveCodecVarName(modelExportName: string, accessPath: string): string {\n const base = modelExportName.replace(/Model$/, '')\n const prefix = base[0].toLowerCase() + base.slice(1)\n\n const fields = [...accessPath.matchAll(/\\.shape\\.(\\w+)/g)].map(m => m[1])\n if (fields.length === 0) return `_${prefix}Codec`\n\n const fieldPart = fields.map((f, i) => (i === 0 ? f : f[0].toUpperCase() + f.slice(1))).join('')\n\n return `_${prefix}${fieldPart[0].toUpperCase() + fieldPart.slice(1)}`\n}\n\n/**\n * Generates the api.ts file content — function-to-schema registry.\n */\nexport function generateApiFile(\n functions: DiscoveredFunction[],\n models: DiscoveredModel[],\n codecs?: CodecForGeneration[],\n modelCodecs?: ModelEmbeddedCodec[],\n functionCodecs?: FunctionEmbeddedCodec[],\n options?: { mini?: boolean }\n): GeneratedFile {\n // Sort every input collection by a stable key BEFORE walking. Discovery\n // order can vary across platforms (different filesystem traversal); we\n // need byte-identical output regardless of how the upstream walk ordered\n // things. See MR 206 in hotpot / zodvex codegen determinism investigation.\n const sortedModels = [...models].sort((a, b) =>\n `${a.sourceFile}|${a.exportName}`.localeCompare(`${b.sourceFile}|${b.exportName}`)\n )\n const sortedFunctions = [...functions].sort((a, b) =>\n a.functionPath.localeCompare(b.functionPath)\n )\n const sortedCodecs = codecs\n ? [...codecs].sort((a, b) =>\n `${a.sourceFile}|${a.exportName}`.localeCompare(`${b.sourceFile}|${b.exportName}`)\n )\n : undefined\n const sortedModelCodecs = modelCodecs\n ? [...modelCodecs].sort((a, b) =>\n `${a.modelSourceFile}|${a.modelExportName}|${a.schemaKey}|${a.accessPath}`.localeCompare(\n `${b.modelSourceFile}|${b.modelExportName}|${b.schemaKey}|${b.accessPath}`\n )\n )\n : undefined\n const sortedFunctionCodecs = functionCodecs\n ? [...functionCodecs].sort((a, b) =>\n `${a.functionSourceFile}|${a.functionExportName}|${a.schemaSource}|${a.accessPath}`.localeCompare(\n `${b.functionSourceFile}|${b.functionExportName}|${b.schemaSource}|${b.accessPath}`\n )\n )\n : undefined\n\n // Replace the parameter bindings with sorted views so the rest of the\n // function operates against deterministic order without further changes.\n models = sortedModels\n functions = sortedFunctions\n codecs = sortedCodecs\n modelCodecs = sortedModelCodecs\n functionCodecs = sortedFunctionCodecs\n\n // Build identity map: runtime schema object → model reference string\n const identityMap = new Map<$ZodType, SchemaRef>()\n const neededModelImports = new Set<string>()\n\n for (const model of models) {\n const importPath = `../${model.sourceFile.replace(/\\.ts$/, '.js')}`\n\n if (model.schemas) {\n // Full model: existing behavior — schema.doc, schema.insert, etc.\n for (const key of ['doc', 'insert', 'update', 'docArray', 'paginatedDoc'] as const) {\n identityMap.set(model.schemas[key] as $ZodType, {\n importPath,\n exportName: model.exportName,\n schemaKey: `schema.${key}`\n })\n }\n } else if (model._modelRef) {\n // Slim model: schemas live in the per-model zx WeakMap cache, not on the\n // model object. Populate identityMap with cached `zx.*` instances so\n // function code like `returns: zx.doc(SlimModel)` resolves by identity.\n // Emit `zx.doc(SlimModel)` (not `SlimModel.doc`) since slim models have\n // no such property.\n const ref = model._modelRef as any\n const slimKeys = [\n { key: 'doc', schema: zx.doc(ref) as $ZodType, expr: `zx.doc(${model.exportName})` },\n { key: 'insert', schema: zx.base(ref) as $ZodType, expr: `zx.base(${model.exportName})` },\n { key: 'base', schema: zx.base(ref) as $ZodType, expr: `zx.base(${model.exportName})` },\n {\n key: 'update',\n schema: zx.update(ref) as $ZodType,\n expr: `zx.update(${model.exportName})`\n },\n {\n key: 'docArray',\n schema: zx.docArray(ref) as $ZodType,\n expr: `zx.docArray(${model.exportName})`\n }\n ]\n for (const { key, schema, expr } of slimKeys) {\n identityMap.set(schema, {\n importPath,\n exportName: model.exportName,\n schemaKey: key,\n expression: expr\n })\n }\n // Union slim retains `.schema` on the model object — map that too so\n // `returns: SlimModel.schema` resolves as a direct property reference.\n if (ref.schema instanceof $ZodType) {\n identityMap.set(ref.schema, {\n importPath,\n exportName: model.exportName,\n schemaKey: 'schema'\n })\n }\n }\n }\n\n // Build codec identity map for zodToSource\n const codecMap = new Map<$ZodType, CodecRef>()\n if (codecs) {\n for (const codec of codecs) {\n const importPath = `../${codec.sourceFile.replace(/\\.ts$/, '.js')}`\n codecMap.set(codec.schema, {\n exportName: codec.exportName,\n sourceFile: importPath\n })\n }\n }\n\n // Add model-embedded codecs to the codecMap (exported codecs take precedence)\n const modelCodecVars: { varName: string; expression: string; modelExportName: string }[] = []\n const MODEL_CODEC_SENTINEL = '__model_codec__'\n // Build slim model lookup for codec expression generation\n const slimModelNames = new Set(\n models.filter(m => !m.schemas && m._modelRef).map(m => m.exportName)\n )\n if (modelCodecs) {\n for (const mc of modelCodecs) {\n // Skip if this codec is already in codecMap (exported codec takes precedence)\n if (codecMap.has(mc.codec)) continue\n\n const varName = deriveCodecVarName(mc.modelExportName, mc.accessPath)\n // Slim models: schemas are cached in the zx WeakMap, accessed via\n // zx.doc(Model) / zx.base(Model) / zx.update(Model).\n // Full models: schema bundle is at Model.schema.{doc,insert,update,...}.\n const isSlim = slimModelNames.has(mc.modelExportName)\n let schemaAccess: string\n if (isSlim) {\n // Map walkModelCodecs keys (doc/insert/update) to their zx equivalents.\n const slimKey = mc.schemaKey === 'insert' ? 'base' : mc.schemaKey\n schemaAccess = `zx.${slimKey}(${mc.modelExportName})`\n } else {\n schemaAccess = `${mc.modelExportName}.schema.${mc.schemaKey}`\n }\n const expression = `extractCodec(${schemaAccess}${mc.accessPath})`\n modelCodecVars.push({ varName, expression, modelExportName: mc.modelExportName })\n codecMap.set(mc.codec, {\n exportName: varName,\n sourceFile: MODEL_CODEC_SENTINEL\n })\n }\n }\n\n // Resolve function-embedded codecs against existing codecs by structural fingerprint.\n // Factory-created codecs (like tagged(), encrypted()) produce new instances each call,\n // so identity matching fails. Fingerprinting matches by wire+runtime+transform,\n // allowing us to reference the model/standalone codec instead of importing the function.\n // This avoids circular imports: functions.ts → _zodvex/api.ts → functionFile.ts → functions.ts\n //\n // Ambiguity handling: when multiple codecs share a fingerprint they are, by the\n // fingerprint contract, behaviorally interchangeable — so any one is a correct\n // reference. We prefer a same-source-file candidate, otherwise we pick the\n // stable-sorted-first so output is byte-identical across discovery orders\n // (hotpot MR 206). We MUST NOT fall through to inline serialization: a codec\n // inlined via zodToSource loses its transform (emits the wire schema only),\n // which silently breaks the client encode/decode path with no build signal.\n //\n // Zero candidates means the codec exists only inside the function (no model\n // twin, not exported standalone) and has no importable reference. We collect\n // every such case and hard-error after the loop — a loud build-time failure\n // beats silent boundary corruption.\n if (functionCodecs) {\n type Candidate = { ref: CodecRef; sourceFile: string | undefined; brand: string | undefined }\n const fingerprintMap = new Map<string, Candidate[]>()\n // brand → importable candidates that declared it. Brand is the author's\n // explicit identity (see docs/decisions/2026-06-08-codec-provenance-brands.md),\n // matched ahead of the structural fingerprint and namespaced across factories.\n const brandMap = new Map<string, Candidate[]>()\n\n // Build a lookup from codec schema → source file when we know it. Standalone\n // exported codecs carry a sourceFile in their CodecRef; model-embedded codecs\n // do not (their sourceFile is the MODEL_CODEC_SENTINEL).\n const codecSchemaToSourceFile = new Map<$ZodType, string>()\n for (const c of codecs ?? []) {\n codecSchemaToSourceFile.set(c.schema, c.sourceFile)\n }\n for (const mc of modelCodecs ?? []) {\n codecSchemaToSourceFile.set(mc.codec, mc.modelSourceFile)\n }\n\n for (const [codecSchema, ref] of codecMap) {\n const sourceFile = codecSchemaToSourceFile.get(codecSchema)\n const brand = readCodecBrand(codecSchema)\n const candidate: Candidate = { ref, sourceFile, brand }\n const fp = fingerprintCodec(codecSchema)\n if (fp) {\n const existing = fingerprintMap.get(fp)\n if (existing) existing.push(candidate)\n else fingerprintMap.set(fp, [candidate])\n }\n if (brand) {\n const existing = brandMap.get(brand)\n if (existing) existing.push(candidate)\n else brandMap.set(brand, [candidate])\n }\n }\n\n const undiscoverable: { fn: string; path: string }[] = []\n\n for (const fc of functionCodecs) {\n if (codecMap.has(fc.codec)) continue\n\n // 1. Brand match — declared identity. Collision-free and namespaced: a\n // branded codec resolves only against codecs that declared the same brand.\n const brand = readCodecBrand(fc.codec)\n let candidates: Candidate[] | undefined = brand ? brandMap.get(brand) : undefined\n\n // 2. Fingerprint fallback — structural identity. Exclude any candidate that\n // declared a *different* brand (a cross-factory match would violate the\n // brand's intent); unbranded candidates are always eligible.\n if (!candidates || candidates.length === 0) {\n const fp = fingerprintCodec(fc.codec)\n candidates = (fp ? fingerprintMap.get(fp) : undefined)?.filter(\n c => c.brand === undefined || c.brand === brand\n )\n }\n\n if (!candidates || candidates.length === 0) {\n undiscoverable.push({ fn: fc.functionExportName, path: fc.accessPath })\n continue\n }\n\n let chosen: CodecRef\n if (candidates.length === 1) {\n chosen = candidates[0].ref\n } else {\n // Prefer a unique same-source-file candidate; otherwise pick the\n // stable-sorted-first. Either way we reference a real codec — never\n // inline a transform-less husk.\n const sameFile = candidates.filter(c => c.sourceFile === fc.functionSourceFile)\n if (sameFile.length === 1) {\n chosen = sameFile[0].ref\n } else {\n const sorted = [...candidates].sort((a, b) =>\n `${a.sourceFile ?? ''}|${a.ref.exportName}`.localeCompare(\n `${b.sourceFile ?? ''}|${b.ref.exportName}`\n )\n )\n chosen = sorted[0].ref\n // Branded cohorts are interchangeable by the author's explicit\n // declaration — only flag ambiguity for inferred (unbranded) matches.\n if (!brand) {\n console.warn(\n `[zodvex] Note: Codec in ${fc.functionExportName}() (${fc.accessPath}) matches ${candidates.length} fingerprint-equivalent codecs ` +\n `(${candidates.map(c => c.ref.exportName).join(', ')}). Referencing '${chosen.exportName}'. ` +\n `Export the codec standalone or give it a brand if you want the reference to be explicit.`\n )\n }\n }\n }\n\n codecMap.set(fc.codec, chosen)\n }\n\n if (undiscoverable.length > 0) {\n const list = undiscoverable.map(u => ` - ${u.fn}() at ${u.path}`).join('\\n')\n throw new Error(\n `[zodvex] ${undiscoverable.length} codec(s) in function args/returns have no importable reference ` +\n `(not exported standalone, not embedded in a model). The generated client cannot encode or decode ` +\n `them, which silently breaks the codec boundary. Export each codec standalone (or add it to a model) ` +\n `so codegen can import it:\\n${list}`\n )\n }\n }\n\n const zodToSourceCtx: ZodToSourceContext = {\n codecMap,\n neededCodecImports: new Map(),\n undiscoverableCodecs: [],\n mini: options?.mini\n }\n\n // Track which imports we need\n let needsZod = false\n let needsZx = false\n\n function emitRef(ref: SchemaRef): string {\n neededModelImports.add(ref.exportName)\n const expr = refExpression(ref)\n // Slim-model refs use zx.* helpers; ensure `zx` is imported in the output.\n if (ref.expression?.startsWith('zx.')) needsZx = true\n return expr\n }\n\n // Resolve each schema to either a model reference or serialized source\n function resolveSchema(schema: $ZodType | unknown): string {\n if (!schema) return 'undefined'\n const s = schema as $ZodType\n\n // 1. Direct identity match\n const ref = identityMap.get(s)\n if (ref) return emitRef(ref)\n\n // 2. Wrapper-aware identity match (peel .nullable()/.optional())\n const unwrapped = tryUnwrapToIdentity(s, identityMap, options?.mini)\n if (unwrapped) return unwrapped.wrapSource(emitRef(unwrapped.ref))\n\n // 3. Partial-aware match (detect .partial() of a model schema)\n const partialMatch = tryMatchPartial(s, identityMap, options?.mini)\n if (partialMatch) return partialMatch.wrapSource(emitRef(partialMatch.ref))\n\n // 4. Fall back to zodToSource (with codec context)\n const source = zodToSource(s, zodToSourceCtx)\n if (source.includes('z.')) needsZod = true\n if (source.includes('zx.')) needsZx = true\n return source\n }\n\n // Build registry entries\n const entries = functions\n .map(fn => {\n const args = resolveSchema(fn.zodArgs)\n const returns = resolveSchema(fn.zodReturns)\n return ` '${fn.functionPath}': {\\n args: ${args},\\n returns: ${returns},\\n }`\n })\n .join(',\\n')\n\n // Determine which model codec vars were actually used (referenced by zodToSource)\n const usedModelCodecVars = modelCodecVars.filter(mc => {\n const sentinelExports = zodToSourceCtx.neededCodecImports.get(MODEL_CODEC_SENTINEL)\n return sentinelExports?.has(mc.varName)\n })\n\n // Add model imports for models referenced by used model codec vars.\n // Slim codec vars use zx.base(Model)/zx.doc(Model) expressions — require zx import.\n if (usedModelCodecVars.length > 0) {\n for (const mc of usedModelCodecVars) {\n neededModelImports.add(mc.modelExportName)\n if (mc.expression.includes('zx.')) needsZx = true\n }\n }\n\n // Build imports\n const imports: string[] = []\n const zodImport = options?.mini ? 'zod/mini' : 'zod'\n if (needsZod) imports.push(`import { z } from '${zodImport}'`)\n\n // Build single client-safe zodvex import (root full path or zodvex/mini)\n const zodvexImport = options?.mini ? 'zodvex/mini' : 'zodvex'\n const coreImports: string[] = []\n if (needsZx) coreImports.push('zx')\n if (usedModelCodecVars.length > 0) coreImports.push('extractCodec')\n if (coreImports.length > 0) {\n imports.push(`import { ${coreImports.join(', ')} } from '${zodvexImport}'`)\n }\n\n for (const exportName of [...neededModelImports].sort()) {\n const model = models.find(m => m.exportName === exportName)\n if (model) {\n const importPath = `../${model.sourceFile.replace(/\\.ts$/, '.js')}`\n imports.push(`import { ${exportName} } from '${importPath}'`)\n }\n }\n\n // Codec imports (collected by zodToSource via context). Sort the map's\n // outer keys (import paths) and the inner Set values (export names) so\n // the final import section is byte-stable across discovery orders.\n const sortedCodecImportPaths = [...zodToSourceCtx.neededCodecImports.keys()].sort()\n for (const importPath of sortedCodecImportPaths) {\n if (importPath === MODEL_CODEC_SENTINEL) continue\n const exportNames = zodToSourceCtx.neededCodecImports.get(importPath) ?? new Set<string>()\n const names = Array.from(exportNames).sort().join(', ')\n imports.push(`import { ${names} } from '${importPath}'`)\n }\n\n const importSection = imports.length > 0 ? `${imports.join('\\n')}\\n\\n` : ''\n\n // Build codec helper var declarations\n const allCodecVars = usedModelCodecVars.map(mc => `const ${mc.varName} = ${mc.expression}`)\n const codecVarSection = allCodecVars.length > 0 ? `${allCodecVars.join('\\n')}\\n\\n` : ''\n\n const registryEntries = entries.length > 0 ? `${entries},\\n` : ''\n const js = `${HEADER}\\n${importSection}${codecVarSection}export const zodvexRegistry = {\\n${registryEntries}}\\n`\n\n const dts = options?.mini\n ? `${HEADER}\nimport type { $ZodType } from 'zod/v4/core'\n\nexport declare const zodvexRegistry: Record<string, { args: $ZodType; returns: $ZodType | undefined }>\n`\n : `${HEADER}\nimport type { ZodTypeAny } from 'zod'\n\nexport declare const zodvexRegistry: Record<string, { args: ZodTypeAny; returns: ZodTypeAny | undefined }>\n`\n\n return { js, dts }\n}\n\n/**\n * Generates the server.ts file content — concrete context types for the app's schema.\n *\n * These parallel Convex's _generated/server.ts exports (QueryCtx, MutationCtx, ActionCtx)\n * but with zodvex's codec-wrapped db types baked in.\n */\nexport function generateServerFile(): GeneratedFile {\n const js = `${HEADER}`\n\n const dts = `${HEADER}\nimport type { DataModel } from '../_generated/dataModel.js'\nimport type { ZodvexActionCtx, ZodvexMutationCtx, ZodvexQueryCtx } from 'zodvex/server'\nimport type schema from '../schema.js'\n\ntype DecodedDocs = (typeof schema)['__decodedDocs']\n\n/** Query context with codec-wrapped db (decoded types on reads). */\nexport type QueryCtx = ZodvexQueryCtx<DataModel, DecodedDocs>\n\n/** Mutation context with codec-wrapped db (decoded reads, encoded writes). */\nexport type MutationCtx = ZodvexMutationCtx<DataModel, DecodedDocs>\n\n/** Action context (no db, but runQuery/runMutation may be codec-wrapped). */\nexport type ActionCtx = ZodvexActionCtx<DataModel>\n`\n\n return { js, dts }\n}\n\n/**\n * Generates the client file content — pre-bound hooks and client factory.\n * Returns { js, dts } for .js + .d.ts output.\n */\nexport function generateClientFile(options?: { mini?: boolean }): GeneratedFile {\n const zodvexClientImport = options?.mini ? 'zodvex/mini' : 'zodvex'\n // --- JS ---\n const jsImports = [\n \"import { createZodvexHooks } from 'zodvex/react'\",\n \"import { createZodvexReactClient } from 'zodvex/react'\",\n \"import { createZodvexClient } from 'zodvex/client'\",\n `import { createBoundaryHelpers } from '${zodvexClientImport}'`,\n \"import { zodvexRegistry } from './api.js'\"\n ]\n\n const jsExports = [\n 'export const { useZodQuery, useZodMutation } = createZodvexHooks(zodvexRegistry)',\n '',\n 'export const createClient = (options) =>',\n ' createZodvexClient(zodvexRegistry, options)',\n '',\n 'export const createReactClient = (options) =>',\n ' createZodvexReactClient(zodvexRegistry, options)',\n '',\n 'export const { encodeArgs, decodeResult } = createBoundaryHelpers(zodvexRegistry)'\n ]\n\n const js = `${HEADER}\\n${jsImports.join('\\n')}\\n\\n${jsExports.join('\\n')}\\n`\n\n // --- DTS ---\n const dtsImports = [\n \"import type { ZodvexHooks } from 'zodvex/react'\",\n \"import type { ZodvexClientOptions, ZodvexClient } from 'zodvex/client'\",\n \"import type { ZodvexReactClientOptions, ZodvexReactClient } from 'zodvex/react'\",\n `import type { BoundaryHelpers } from '${zodvexClientImport}'`\n ]\n\n const dtsDeclarations = [\n \"export declare const useZodQuery: ZodvexHooks['useZodQuery']\",\n \"export declare const useZodMutation: ZodvexHooks['useZodMutation']\",\n '',\n 'export declare const createClient: (options: ZodvexClientOptions) => ZodvexClient',\n '',\n 'export declare const createReactClient: (options: ZodvexReactClientOptions) => ZodvexReactClient',\n '',\n \"export declare const encodeArgs: BoundaryHelpers['encodeArgs']\",\n \"export declare const decodeResult: BoundaryHelpers['decodeResult']\"\n ]\n\n const dts = `${HEADER}\\n${dtsImports.join('\\n')}\\n\\n${dtsDeclarations.join('\\n')}\\n`\n\n return { js, dts }\n}\n"]}
|