cvx-kit 0.1.18 → 0.1.19
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/README.md +15 -0
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +1 -1
- package/dist/zod-table.d.mts +2 -0
- package/dist/zod-table.mjs +1 -1
- package/dist/zod-table.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -97,6 +97,21 @@ export const documents = zodTable(
|
|
|
97
97
|
// documents.toPublicDto(row) → projects AND re-parses (runtime redaction)
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
+
For fields shared across tables, create a reusable declaration function:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import { createTable } from 'cvx-kit/zod-table'
|
|
104
|
+
|
|
105
|
+
const customTable = createTable({ ref: z.string(), nextActivity: z.string() })
|
|
106
|
+
const tasks = customTable('tasks', () => ({ title: z.string() }))
|
|
107
|
+
const projects = customTable('projects', () => ({ name: z.string() }))
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
It accepts the same arguments and returns the same boundary as `zodTable`.
|
|
111
|
+
Table-specific fields cannot repeat shared field names. See the
|
|
112
|
+
[`zod-table` guide](https://github.com/ImRLopezAG/cvx-kit/blob/main/skills/cvx-kit/references/zod-table.md)
|
|
113
|
+
for field masks and examples.
|
|
114
|
+
|
|
100
115
|
Every table gets `createdAt`, `updatedAt`, and `archivedAt` baked in —
|
|
101
116
|
opinionated, server-owned, always excluded from inserts and commands
|
|
102
117
|
(expose them via `publicFields` when a DTO needs them). Register the
|
package/dist/index.d.mts
CHANGED
|
@@ -6,7 +6,7 @@ import { AnyQueryMiddleware, QueryMiddleware } from "./components/foundation/mod
|
|
|
6
6
|
import { AnyCommandMiddleware, ApplicationCommand, AuditEntryInput, AuditWriter, AuditedOperation, AuditedRegistry, CommandConstructor, CommandDefaults, CommandMiddleware, Foundation, FoundationOptions, PermissionChecker } from "./components/foundation/client.mjs";
|
|
7
7
|
import { CrudConfig, createCrudCommands } from "./crud.mjs";
|
|
8
8
|
import { ScalarFilters, ScalarSelection, ServerFilter } from "./querying/filters.mjs";
|
|
9
|
-
import { DtoOptions, TIMESTAMP_FIELDS, TableBoundaryOptions, createModule, jsonSafeZid, paginated, tenantTable, zodTable, zodVariantTable } from "./zod-table.mjs";
|
|
9
|
+
import { DtoOptions, TIMESTAMP_FIELDS, TableBoundaryOptions, createModule, createTable, jsonSafeZid, paginated, tenantTable, zodTable, zodVariantTable } from "./zod-table.mjs";
|
|
10
10
|
import { RateLimiterLike, rateLimit } from "./middleware.mjs";
|
|
11
11
|
import { WebhookBoundaryConfig, createWebhookBoundary, recordWebhookEvent, webhookEventsTable } from "./webhooks.mjs";
|
|
12
12
|
import { createStateMachine } from "./state-machine.mjs";
|
|
@@ -14,4 +14,4 @@ import { Change, Trigger, Triggers, appendOnly, createTriggers, noDelete, tenant
|
|
|
14
14
|
import { FoundationRegistry, FoundationRegistryOptions, createFoundation } from "./modules/foundation/foundation.mjs";
|
|
15
15
|
import { FieldReference, RelationBuilder, RelationDeclarations, RelationEdge, RelationFilterSelection, RelationFilters, RelationRegistry, RelationRegistryIdentity, RelationRow, RelationSelection, RelationTable, RelationTableHelpers, RelationTables, ThroughReference, defineRelations } from "./relations.mjs";
|
|
16
16
|
import { QueryEngineConfig, createQueryEngine } from "./querying.mjs";
|
|
17
|
-
export { type Actor, type AgentToolHandlers, type AgentToolRecord, type AnyCommandMiddleware, type AnyQueryMiddleware, type ApplicationCommand, type AuditEntryInput, type AuditWriter, type AuditedOperation, type AuditedRegistry, type AuthBundle, type AuthFunctions, type AuthFunctionsConfig, type Change, type CommandConstructor, type CommandDefaults, type CommandMiddleware, type CrudConfig, type DefaultRole, type DtoOptions, type ErrorFactory, type FieldReference, Foundation, type FoundationOptions, type FoundationRegistry, type FoundationRegistryOptions, type Include, type IncludedQuery, KitError, type PermissionChecker, type QueryEngineConfig, type QueryMiddleware, type RLSConfig, type RateLimiterLike, type RelationBuilder, type RelationDeclarations, type RelationEdge, type RelationFilterSelection, type RelationFilters, type RelationRegistry, type RelationRegistryIdentity, type RelationRow, type RelationSelection, type RelationTable, type RelationTableHelpers, type RelationTables, type Rules, type ScalarFilters, type ScalarSelection, type SecurityConfig, type ServerFilter, TENANT_FIELD, TIMESTAMP_FIELDS, type TableBoundaryOptions, type ThroughReference, type Trigger, Triggers, type WebhookBoundaryConfig, appendOnly, assertTenantOwned, composeRules, createAgentTools, createAuthFunctions, createCrudCommands, createFoundation, createInclude, createModule, createQueryEngine, createStateMachine, createTenantRules, createTriggers, createWebhookBoundary, defaultErrors, defaultRoleMap, defineRelations, jsonSafeZid, noDelete, paginated, rateLimit, recordWebhookEvent, requireTenantReference, tenantOwnership, tenantTable, timestamps, webhookEventsTable, zodTable, zodVariantTable };
|
|
17
|
+
export { type Actor, type AgentToolHandlers, type AgentToolRecord, type AnyCommandMiddleware, type AnyQueryMiddleware, type ApplicationCommand, type AuditEntryInput, type AuditWriter, type AuditedOperation, type AuditedRegistry, type AuthBundle, type AuthFunctions, type AuthFunctionsConfig, type Change, type CommandConstructor, type CommandDefaults, type CommandMiddleware, type CrudConfig, type DefaultRole, type DtoOptions, type ErrorFactory, type FieldReference, Foundation, type FoundationOptions, type FoundationRegistry, type FoundationRegistryOptions, type Include, type IncludedQuery, KitError, type PermissionChecker, type QueryEngineConfig, type QueryMiddleware, type RLSConfig, type RateLimiterLike, type RelationBuilder, type RelationDeclarations, type RelationEdge, type RelationFilterSelection, type RelationFilters, type RelationRegistry, type RelationRegistryIdentity, type RelationRow, type RelationSelection, type RelationTable, type RelationTableHelpers, type RelationTables, type Rules, type ScalarFilters, type ScalarSelection, type SecurityConfig, type ServerFilter, TENANT_FIELD, TIMESTAMP_FIELDS, type TableBoundaryOptions, type ThroughReference, type Trigger, Triggers, type WebhookBoundaryConfig, appendOnly, assertTenantOwned, composeRules, createAgentTools, createAuthFunctions, createCrudCommands, createFoundation, createInclude, createModule, createQueryEngine, createStateMachine, createTable, createTenantRules, createTriggers, createWebhookBoundary, defaultErrors, defaultRoleMap, defineRelations, jsonSafeZid, noDelete, paginated, rateLimit, recordWebhookEvent, requireTenantReference, tenantOwnership, tenantTable, timestamps, webhookEventsTable, zodTable, zodVariantTable };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createAgentTools as e}from"./agent-tools.mjs";import{KitError as t,defaultErrors as n}from"./errors.mjs";import{TENANT_FIELD as r,assertTenantOwned as i,composeRules as a,createTenantRules as o,requireTenantReference as s}from"./tenancy.mjs";import{createAuthFunctions as c,createInclude as l,defaultRoleMap as u}from"./auth.mjs";import{createCrudCommands as d}from"./crud.mjs";import{TIMESTAMP_FIELDS as f,createModule as p,
|
|
1
|
+
import{createAgentTools as e}from"./agent-tools.mjs";import{KitError as t,defaultErrors as n}from"./errors.mjs";import{TENANT_FIELD as r,assertTenantOwned as i,composeRules as a,createTenantRules as o,requireTenantReference as s}from"./tenancy.mjs";import{createAuthFunctions as c,createInclude as l,defaultRoleMap as u}from"./auth.mjs";import{createCrudCommands as d}from"./crud.mjs";import{TIMESTAMP_FIELDS as f,createModule as p,createTable as m,jsonSafeZid as h,paginated as g,tenantTable as _,zodTable as v,zodVariantTable as y}from"./zod-table.mjs";import{rateLimit as b}from"./middleware.mjs";import{createWebhookBoundary as x,recordWebhookEvent as S,webhookEventsTable as C}from"./webhooks.mjs";import{createStateMachine as w}from"./state-machine.mjs";import{Triggers as T,appendOnly as E,createTriggers as D,noDelete as O,tenantOwnership as k,timestamps as A}from"./triggers.mjs";import{Foundation as j}from"./components/foundation/client.mjs";import{createFoundation as M}from"./modules/foundation/foundation.mjs";import{defineRelations as N}from"./relations.mjs";import{createQueryEngine as P}from"./querying.mjs";export{j as Foundation,t as KitError,r as TENANT_FIELD,f as TIMESTAMP_FIELDS,T as Triggers,E as appendOnly,i as assertTenantOwned,a as composeRules,e as createAgentTools,c as createAuthFunctions,d as createCrudCommands,M as createFoundation,l as createInclude,p as createModule,P as createQueryEngine,w as createStateMachine,m as createTable,o as createTenantRules,D as createTriggers,x as createWebhookBoundary,n as defaultErrors,u as defaultRoleMap,N as defineRelations,h as jsonSafeZid,O as noDelete,g as paginated,b as rateLimit,S as recordWebhookEvent,s as requireTenantReference,k as tenantOwnership,_ as tenantTable,A as timestamps,C as webhookEventsTable,v as zodTable,y as zodVariantTable};
|
package/dist/zod-table.d.mts
CHANGED
|
@@ -108,6 +108,8 @@ export type TableBoundary<Table extends string, Fields extends FieldSchemas, Ser
|
|
|
108
108
|
};
|
|
109
109
|
/** Defines one table and derives its storage, document, write, and DTO boundaries. */
|
|
110
110
|
export declare function zodTable<Table extends string, Fields extends FieldSchemas, const ServerFields extends readonly FieldKey<Fields>[] = readonly [], const CommandFields extends readonly FieldKey<Fields>[] = readonly [], const PublicFields extends readonly FieldKey<Fields & TimestampFields>[] = readonly []>(tableName: Table, fields: (id: typeof zid$1) => Fields & OwnedFields<Fields>, options?: TableBoundaryOptions<Fields, ServerFields, CommandFields, PublicFields>): TableBoundary<Table, Fields, ServerFields, CommandFields, PublicFields>;
|
|
111
|
+
/** Reuses ordinary fields while deriving every boundary through zodTable. */
|
|
112
|
+
export declare function createTable<Shared extends FieldSchemas>(shared: Shared & OwnedFields<Shared>): <Table extends string, Fields extends FieldSchemas, const ServerFields extends readonly FieldKey<Shared & Fields>[] = readonly [], const CommandFields extends readonly FieldKey<Shared & Fields>[] = readonly [], const PublicFields extends readonly FieldKey<Shared & Fields & TimestampFields>[] = readonly []>(tableName: Table, fields: (id: typeof zid$1) => Fields & OwnedFields<Fields> & { [Key in keyof Fields]: Key extends (string extends keyof Shared ? never : keyof Shared) ? never : Fields[Key]; }, options?: TableBoundaryOptions<Shared & Fields, ServerFields, CommandFields, PublicFields>) => TableBoundary<Table, Shared & Fields, ServerFields, CommandFields, PublicFields>;
|
|
111
113
|
declare const tenantFields: {
|
|
112
114
|
tenant: z.ZodString;
|
|
113
115
|
};
|
package/dist/zod-table.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{zodToConvex as e}from"./zod-convex.mjs";import{scalarPaginationSchema as t}from"./querying/filters.mjs";import{convexToZod as n,convexToZod as r,zid as i,zid as a}from"convex-helpers/server/zod4";import{defineTable as o,paginationOptsValidator as s}from"convex/server";import{z as c}from"zod";const l={createdAt:c.number().optional(),updatedAt:c.number().optional(),archivedAt:c.number().optional()},u=[`createdAt`,`updatedAt`,`archivedAt`];function d(n,r,i={}){let s=r(a);
|
|
1
|
+
import{zodToConvex as e}from"./zod-convex.mjs";import{scalarPaginationSchema as t}from"./querying/filters.mjs";import{convexToZod as n,convexToZod as r,zid as i,zid as a}from"convex-helpers/server/zod4";import{defineTable as o,paginationOptsValidator as s}from"convex/server";import{z as c}from"zod";const l={createdAt:c.number().optional(),updatedAt:c.number().optional(),archivedAt:c.number().optional()},u=[`createdAt`,`updatedAt`,`archivedAt`];function d(n,r,i={}){let s=r(a);T(s,[`_id`,`_creationTime`,...u]);let d={...s,...l};E(d,i.serverFields??[],i.commandFields??[],i.publicFields??[]);let f=c.object(d).strict(),p=x(f,n),m=[...u,...i.serverFields??[]],h=i.commandFields??[],g=i.publicFields??[],_=c.object(C(d,m)).strict(),y=_.partial(),b=c.object(S(d,h)).strict(),D=c.object(S(d,g)).strict(),O=/* @__PURE__ */ new Set([`_id`,`_creationTime`,`tenant`,`__proto__`,...u]);function k(e){return A(e)}function A(e){let t=e===!0||e===!1?{_id:e}:e,r=t?.extend??{};for(let e of Object.keys(r)){if(O.has(e)||Object.hasOwn(D.shape,e))throw Error(`DTO extension collision for field "${e}" on table "${n}"`);w(r[e])}if(!t?._id&&Object.keys(r).length===0)return D;let i=c.object({...D.shape,...r}).strict();return t?._id?i.extend({_id:p.shape._id}):i}function j(e,t){let n=t===!0||t===!1?{_id:t}:t;A(t);let r=D.parse(Object.fromEntries(Object.keys(D.shape).map(t=>[t,e[t]]))),i=c.object(n?.extend??{}).strict().parse(n?.values??{}),a={...r,...i};return n?._id&&(a._id=p.shape._id.parse(`_id`in e?e._id:void 0)),a}function M(e){return e?_.omit(e):_}function N(e){return e?y.omit(e):y}let P=e(f),F=o(P);function I(n){return t(e(p).fields,n)}return{tableName:n,schema:p,storage:f,insertSchema:_,updateSchema:y,commandInput:b,publicDto:D,dto:k,toPublicDto:j,paginationOpts:I,table:F,insert:M,update:N,tools:{insert:b,update:c.object({data:b.partial(),id:v(n)}).strict(),id:c.object({id:v(n)}).strict()}}}function f(e){return T(e,[`_id`,`_creationTime`,...u]),function(t,n,r={}){return d(t,r=>{let i=n(r);for(let n of Object.keys(i))if(Object.hasOwn(e,n))throw Error(`Duplicate shared table field "${n}" on table "${t}"`);return T(i,[`_id`,`_creationTime`,...u]),{...e,...i}},r)}}const p={tenant:c.string().min(1)};function m(e,t,n={}){return d(e,e=>{let n=t(e);return T(n,[`tenant`,`_id`,`_creationTime`,...u]),{...n,...p}},{...n,serverFields:[...n.serverFields??[],`tenant`]})}function h(...e){let t={};for(let n of e)for(let[e,r]of Object.entries(n)){if(e in t)throw Error(`Table "${e}" is declared by more than one module`);t[e]=r}return t}function g(e){return{args:{paginationOpts:r(s)},result:c.object({page:c.array(e),isDone:c.boolean(),continueCursor:c.string(),splitCursor:c.string().nullable().optional(),pageStatus:c.enum([`SplitRecommended`,`SplitRequired`]).nullable().optional()})}}function _(t,n,r){return r?y(t,n,r):{tableName:t,storage:n,insertSchema:n,table:o(e(n))}}function v(e){let t=a(e);return c.string().refine(e=>t.safeParse(e).success).describe(`Convex document id for table "${e}"; validated against the table by Convex`)}function y(t,n,r){if(!(n instanceof c.ZodDiscriminatedUnion)||n.def.discriminator!==r.discriminator)throw Error(`Variant boundaries require a discriminated union with the configured discriminator`);if(n.def.checks?.length)throw Error(`Variant boundaries do not support union-level refinements`);let i=r.discriminator;if([`_id`,`_creationTime`,...u].includes(i))throw Error(`Variant discriminator cannot be a reserved field`);let s=/* @__PURE__ */ new Map;for(let e of n.options){if(!(e instanceof c.ZodObject)||!(e.def.catchall instanceof c.ZodNever))throw Error(`Variant boundaries require strict object branches`);if(e.def.checks?.length)throw Error(`Variant boundaries do not support object-level refinements`);try{w(e,/* @__PURE__ */ new Set,!0)}catch(e){throw Error(`Variant boundaries require supported value-preserving field validators without object catchalls`,{cause:e})}let n=e.shape[i];if(!(n instanceof c.ZodLiteral)||n.values.size!==1)throw Error(`Variant branches require one string literal discriminator`);let a=[...n.values][0];if(!c.string().safeParse(a).success)throw Error(`Variant branches require a string discriminator`);let o=a;if(s.has(o))throw Error(`Duplicate variant discriminator "${o}"`);if(!Object.hasOwn(r.variants,o))throw Error(`Missing variant configuration "${o}"`);let d=r.variants[o];T(e.shape,[`_id`,`_creationTime`,...r.timestamps===!1?[]:u]);let f={...e.shape};r.timestamps&&Object.assign(f,l),E(f,d.serverFields??[],d.commandFields??[],d.publicFields??[],r.timestamps!==!1);for(let e of[d.serverFields,d.commandFields,d.publicFields])if(e?.includes(i))throw Error(`The variant discriminator is retained automatically and cannot appear in masks`);let p=c.strictObject(f),m=c.strictObject(C(f,[...r.timestamps===!1?[]:u,...d.serverFields??[]])),h=c.strictObject(S(f,[i,...d.commandFields??[]])),g=e=>e.partial().extend({[i]:n});s.set(o,{storage:p,document:x(p,t),insert:m,update:g(m),command:h,commandUpdate:g(h),public:c.strictObject(S(f,[i,...d.publicFields??[]]))})}for(let e of Object.keys(r.variants))if(!s.has(e))throw Error(`Unknown variant configuration "${e}"`);function d(e,n=!1,r=!1){let o=[...s.values()].map(i=>{let o=i[e];return r?c.strictObject(Object.fromEntries(Object.entries(o.shape).map(([e,t])=>[e,b(t)]))):n?o.extend({_id:a(t)}):o});if(!o.length)throw Error(`Variant boundaries require at least one branch`);return c.discriminatedUnion(i,o)}let f=d(`storage`),p=d(`document`),m=d(`insert`),h=d(`update`),g=d(`command`),_=d(`public`);function y(e=!1){return e?d(`public`,!0):_}function D(e,n=!1){let r=c.string().parse(e[i]),o=s.get(r);if(!o)throw Error(`Unknown variant discriminator "${r}"`);let l=n?o.public.extend({_id:a(t)}):o.public;return l.parse(Object.fromEntries(Object.keys(l.shape).filter(t=>Object.hasOwn(e,t)).map(t=>[t,e[t]])))}return{tableName:t,storage:f,schema:p,insertSchema:m,updateSchema:h,commandInput:g,publicDto:_,dto:y,toPublicDto:D,table:o(e(f)),tools:{id:c.strictObject({id:v(t)}),insert:d(`command`,!1,!0),update:c.strictObject({id:v(t),data:d(`commandUpdate`,!1,!0)})}}}function b(t){if(!(t instanceof c.ZodType))throw Error(`Variant tools require classic Zod field schemas`);if(t instanceof c.ZodBigInt||t instanceof c.ZodLiteral&&[...t.values].some(e=>c.bigint().safeParse(e).success))throw Error(`Variant tool command fields cannot contain bigint; JSON Schema cannot represent it`);let n=e(t);if(n.kind===`id`){let e=v(n.tableName);return n.isOptional===`optional`?e.optional().refine(e=>t.safeParse(e).success):e.refine(e=>t.safeParse(e).success)}if(t instanceof c.ZodOptional||t instanceof c.ZodNullable||t instanceof c.ZodNonOptional)return t.clone({...t.def,innerType:b(t.unwrap())});if(t instanceof c.ZodArray)return t.clone({...t.def,element:b(t.element)});if(t instanceof c.ZodObject){let e=Object.fromEntries(Object.entries(t.shape).map(([e,t])=>[e,b(t)]));return t.clone(Object.assign({},t.def,{shape:e}))}return t instanceof c.ZodUnion?t.clone({...t.def,options:t.options.map(b)}):t instanceof c.ZodRecord?t.clone({...t.def,keyType:b(t.keyType),valueType:b(t.valueType)}):t instanceof c.ZodTuple?t.clone({...t.def,items:t.def.items.map(b),rest:t.def.rest?b(t.def.rest):null}):t instanceof c.ZodIntersection?t.clone({...t.def,left:b(t.def.left),right:b(t.def.right)}):t}function x(e,t){return e.extend({_id:a(t),_creationTime:c.number()})}function S(e,t){return Object.fromEntries(t.map(t=>[t,e[t]]))}function C(e,t){let n=new Set(t);return Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e)))}function w(t,n=/* @__PURE__ */ new Set,r=!1){if(n.has(t))return;n.add(t);let i=t._zod.def,a=()=>{throw Error(`DTO extensions require supported value-preserving validation schemas`)};`coerce`in i&&i.coerce&&a(),`normalize`in i&&i.normalize&&a();let o=e=>w(e,n,r);for(let e of i.checks??[])if(e._zod.def.check===`overwrite`&&a(),`normalize`in e._zod.def&&e._zod.def.normalize&&a(),e._zod.def.check===`property`&&o(e._zod.def.schema),e._zod.def.check===`properties`)for(let t of Object.values(e._zod.def.shape))o(t);switch(i.type){case`custom`:if(r&&e(t).kind===`id`)return;a();return;case`string`:case`number`:case`boolean`:case`bigint`:case`date`:case`symbol`:case`null`:case`undefined`:case`void`:case`never`:case`literal`:case`enum`:return;case`object`:if(r&&i.catchall&&i.catchall._zod.def.type!==`never`)throw Error(`Variant fields cannot use object catchalls; use a record field instead`);for(let e of Object.values(i.shape))o(e);i.catchall&&o(i.catchall);return;case`array`:o(i.element);return;case`optional`:case`nullable`:case`nonoptional`:o(i.innerType);return;case`union`:for(let e of i.options)o(e);return;case`intersection`:o(i.left),o(i.right);return;case`tuple`:for(let e of i.items)o(e);i.rest&&o(i.rest);return;case`record`:o(i.keyType),o(i.valueType);return;default:a()}}function T(e,t){for(let n of t)if(Object.hasOwn(e,n))throw Error(`Reserved table field "${n}" cannot be declared`)}function E(e,t,n,r,i=!0){for(let i of[...t,...n,...r])if(!Object.hasOwn(e,i))throw Error(`Unknown table field "${i}"`);let a=/* @__PURE__ */ new Set([...i?u:[],...t]);for(let e of n)if(a.has(e))throw Error(`Server-owned field "${e}" cannot be a command input`)}export{u as TIMESTAMP_FIELDS,n as convexToZod,h as createModule,f as createTable,v as jsonSafeZid,g as paginated,m as tenantTable,i as zid,d as zodTable,e as zodToConvex,_ as zodVariantTable};
|
|
2
2
|
//# sourceMappingURL=zod-table.mjs.map
|
package/dist/zod-table.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-table.mjs","names":["zid","convexToZod","convexToZod$1","zid$1","timestampFields","z","TIMESTAMP_FIELDS","zodTable","declared","fields","assertOwnedFields","columns","assertFieldLists","options","storage","schema","documentSchema","tableName","omittedKeys","commandKeys","publicKeys","insertSchema","omitFields","updateSchema","commandInput","pickFields","publicDto","reservedDtoFields","dto","deriveDto","normalized","extension","key","assertDtoValidationSchema","resultSchema","toPublicDto","projected","row","result","insert","omit","update","nativeStorage","zodToConvex","table","defineTable","paginationOpts","scalarPaginationSchema","selection","jsonSafeZid","tenantFields","tenantTable","id","createModule","maps","combined","map","definition","paginated","paginationOptsValidator","zodVariantTable","deriveVariantTable","value","discriminator","branches","branch","cause","tagSchema","tag","tagValue","config","mask","stored","command","partial","union","schemas","mode","tool","field","variantToolField","includeId","projection","native","child","\"shape\"","keys","omitted","seen","def","reject","visit","allowNativeIds","check","reserved","server","managed","managedTimestamps","convexToZod","zid"],"sources":["../src/zod-table.ts"],"sourcesContent":["import { convexToZod, zid, type ConvexValidatorFromZod, type Zid } from 'convex-helpers/server/zod4'\nimport { defineTable, paginationOptsValidator, type TableDefinition } from 'convex/server'\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n\nimport { zodToConvex } from './zod-convex'\n\nimport {\n\tscalarPaginationSchema,\n\ttype ScalarPaginationSchema,\n\ttype ScalarSelection,\n\ttype ExactScalarSelection,\n} from './querying/filters'\n\n// Use this entry point when deriving validators from kit-owned schemas so\n// the producer and converter consult the same convex-helpers ID registry.\nexport { zid, convexToZod } from 'convex-helpers/server/zod4'\nexport { zodToConvex } from './zod-convex'\n\ntype FieldSchemas = Record<string, z.ZodType>\ntype FieldKey<Fields extends FieldSchemas> = Extract<keyof Fields, string>\n\n/**\n * Opinionated lifecycle timestamps — every table has them, server-owned,\n * always excluded from insert/command boundaries. Maintained by the\n * `timestamps` trigger helper (see cvx-kit/triggers).\n */\nconst timestampFields = {\n\tcreatedAt: z.number().optional(),\n\tupdatedAt: z.number().optional(),\n\tarchivedAt: z.number().optional(),\n} satisfies FieldSchemas\n\ntype TimestampFields = typeof timestampFields\ntype ReservedStorageField = '_id' | '_creationTime' | keyof TimestampFields\ntype OwnedFields<Fields> = {\n\t[Key in keyof Fields]: Key extends ReservedStorageField ? never : Fields[Key]\n}\ntype SystemFields<Table extends string> = { _id: Zid<Table>; _creationTime: z.ZodNumber }\n\nexport const TIMESTAMP_FIELDS = ['createdAt', 'updatedAt', 'archivedAt'] as const\n\nexport type TableBoundaryOptions<\n\tFields extends FieldSchemas,\n\tServerFields extends readonly FieldKey<Fields>[],\n\tCommandFields extends readonly FieldKey<Fields>[],\n\tPublicFields extends readonly FieldKey<Fields & TimestampFields>[],\n> = {\n\tserverFields?: ServerFields\n\tcommandFields?: CommandFields &\n\t\treadonly Exclude<FieldKey<Fields>, ServerFields[number] | keyof TimestampFields>[]\n\tpublicFields?: PublicFields\n}\n\ntype StrictObject<Fields extends FieldSchemas> = z.ZodObject<Fields, z.core.$strict>\ntype WriteFields<\n\tFields extends FieldSchemas,\n\tServerFields extends readonly FieldKey<Fields>[],\n> = Omit<Fields & TimestampFields, ServerFields[number] | (typeof TIMESTAMP_FIELDS)[number]>\ntype PartialFields<Fields extends FieldSchemas> = {\n\t[Key in keyof Fields]: z.ZodOptional<Fields[Key]>\n}\n\n/** Options shared by the DTO return schema and row projector.\n * Promised contributions must be present, including in reusable options.\n * New extension schemas support validation only: no transforms, pipes,\n * coercion, preprocess, defaults, catches, or overwrites, even when nested.\n * Refinements must validate without mutating their input.\n */\nexport type DtoOptions<IncludeId extends boolean = false, Extension extends FieldSchemas = {}> = ([\n\tIncludeId,\n] extends [true]\n\t? { _id: IncludeId }\n\t: { _id?: IncludeId }) &\n\t(keyof Extension extends never ? { extend?: Extension } : { extend: Extension })\n\ntype DtoProjectionOptions<IncludeId extends boolean> = DtoOptions<IncludeId> & {\n\textend?: Record<string, never>\n\tvalues?: never\n}\n\ntype ReservedDtoField =\n\t| '_id'\n\t| '_creationTime'\n\t| 'tenant'\n\t| '__proto__'\n\t| (typeof TIMESTAMP_FIELDS)[number]\ntype DtoExtension<Public extends FieldSchemas, Extension extends FieldSchemas> = {\n\t[Key in keyof Extension]: Key extends keyof Public | ReservedDtoField\n\t\t? never\n\t\t: Extension[Key] extends z.ZodPipe | z.ZodTransform\n\t\t\t? never\n\t\t\t: unknown\n}\n// Broad dictionaries cannot promise any particular extension field.\ntype KnownExtension<Extension> = string extends keyof Extension ? {} : Extension\n\ntype DtoSchema<\n\tTable extends string,\n\tPublic extends FieldSchemas,\n\tIncludeId extends boolean,\n\tExtension extends FieldSchemas = {},\n> = IncludeId extends true\n\t? StrictObject<Public & { _id: Zid<Table> } & KnownExtension<Extension>>\n\t: StrictObject<Public & KnownExtension<Extension>>\ntype DtoRow<Row, IncludeId extends boolean> = Row & (true extends IncludeId ? { _id: string } : {})\ntype DtoValues<Extension extends FieldSchemas> = keyof Extension extends never\n\t? { values?: never }\n\t: { values: z.input<StrictObject<NoInfer<Extension>>> }\n\ntype DtoBoundary<Table extends string, Fields extends FieldSchemas, Public extends FieldSchemas> = {\n\tdto(): StrictObject<Public>\n\tdto<const IncludeId extends boolean>(includeId: IncludeId): DtoSchema<Table, Public, IncludeId>\n\tdto<const IncludeId extends boolean = false>(\n\t\toptions: DtoProjectionOptions<IncludeId>,\n\t): DtoSchema<Table, Public, IncludeId>\n\tdto<const IncludeId extends boolean = false, const Extension extends FieldSchemas = {}>(\n\t\toptions: DtoOptions<IncludeId, Extension> & { extend?: DtoExtension<Public, Extension> },\n\t): DtoSchema<Table, Public, IncludeId, Extension>\n\ttoPublicDto(row: z.input<StrictObject<Fields>>): z.output<StrictObject<Public>>\n\ttoPublicDto<const IncludeId extends boolean>(\n\t\trow: DtoRow<z.input<StrictObject<Fields>>, IncludeId>,\n\t\tincludeId: IncludeId,\n\t): z.output<DtoSchema<Table, Public, IncludeId>>\n\ttoPublicDto<const IncludeId extends boolean = false>(\n\t\trow: DtoRow<z.input<StrictObject<Fields>>, IncludeId>,\n\t\toptions: DtoProjectionOptions<IncludeId>,\n\t): z.output<DtoSchema<Table, Public, IncludeId>>\n\ttoPublicDto<const IncludeId extends boolean = false, const Extension extends FieldSchemas = {}>(\n\t\trow: DtoRow<z.input<StrictObject<Fields>>, IncludeId>,\n\t\toptions: DtoOptions<IncludeId, Extension> & {\n\t\t\textend?: DtoExtension<Public, Extension>\n\t\t} & DtoValues<Extension>,\n\t): z.output<DtoSchema<Table, Public, IncludeId, Extension>>\n}\n\n/** Named schema relationships keep generated declarations bounded and consumers fully typed. */\nexport type TableBoundary<\n\tTable extends string,\n\tFields extends FieldSchemas,\n\tServerFields extends readonly FieldKey<Fields>[],\n\tCommandFields extends readonly FieldKey<Fields>[],\n\tPublicFields extends readonly FieldKey<Fields & TimestampFields>[],\n> = DtoBoundary<\n\tTable,\n\tFields & TimestampFields,\n\tPick<Fields & TimestampFields, PublicFields[number]>\n> & {\n\tpaginationOpts<\n\t\tconst Selection extends ScalarSelection<Fields & TimestampFields & SystemFields<Table>>,\n\t>(\n\t\tselection: ExactScalarSelection<Fields & TimestampFields & SystemFields<Table>, Selection>,\n\t): ScalarPaginationSchema<Fields & TimestampFields & SystemFields<Table>, Selection>\n\ttableName: Table\n\tstorage: StrictObject<Fields & TimestampFields>\n\tschema: ReturnType<typeof documentSchema<Fields & TimestampFields, Table>>\n\tinsertSchema: StrictObject<WriteFields<Fields, ServerFields>>\n\tupdateSchema: StrictObject<PartialFields<WriteFields<Fields, ServerFields>>>\n\tcommandInput: StrictObject<Pick<Fields & TimestampFields, CommandFields[number]>>\n\tpublicDto: StrictObject<Pick<Fields & TimestampFields, PublicFields[number]>>\n\ttable: TableDefinition<ConvexValidatorFromZod<StrictObject<Fields & TimestampFields>, 'required'>>\n\tinsert(): StrictObject<WriteFields<Fields, ServerFields>>\n\tinsert<Mask extends z.util.Mask<keyof WriteFields<Fields, ServerFields>>>(\n\t\tomit: Mask,\n\t): ZodObjectOmit<StrictObject<WriteFields<Fields, ServerFields>>, Mask>\n\tupdate(): StrictObject<PartialFields<WriteFields<Fields, ServerFields>>>\n\tupdate<Mask extends z.util.Mask<keyof WriteFields<Fields, ServerFields>>>(\n\t\tomit: Mask,\n\t): ZodObjectOmit<StrictObject<PartialFields<WriteFields<Fields, ServerFields>>>, Mask>\n\ttools: {\n\t\tinsert: StrictObject<Pick<Fields & TimestampFields, CommandFields[number]>>\n\t\tupdate: StrictObject<{\n\t\t\tdata: StrictObject<PartialFields<Pick<Fields & TimestampFields, CommandFields[number]>>>\n\t\t\tid: z.ZodType<GenericId<Table>, string>\n\t\t}>\n\t\tid: StrictObject<{ id: z.ZodType<GenericId<Table>, string> }>\n\t}\n}\n\n/** Defines one table and derives its storage, document, write, and DTO boundaries. */\nexport function zodTable<\n\tTable extends string,\n\tFields extends FieldSchemas,\n\tconst ServerFields extends readonly FieldKey<Fields>[] = readonly [],\n\tconst CommandFields extends readonly FieldKey<Fields>[] = readonly [],\n\tconst PublicFields extends readonly FieldKey<Fields & TimestampFields>[] = readonly [],\n>(\n\ttableName: Table,\n\tfields: (id: typeof zid) => Fields & OwnedFields<Fields>,\n\toptions: TableBoundaryOptions<Fields, ServerFields, CommandFields, PublicFields> = {},\n): TableBoundary<Table, Fields, ServerFields, CommandFields, PublicFields> {\n\tconst declared = fields(zid)\n\tassertOwnedFields(declared, ['_id', '_creationTime', ...TIMESTAMP_FIELDS])\n\tconst columns: Fields & TimestampFields = { ...declared, ...timestampFields }\n\tassertFieldLists(\n\t\tcolumns,\n\t\toptions.serverFields ?? [],\n\t\toptions.commandFields ?? [],\n\t\toptions.publicFields ?? [],\n\t)\n\tconst storage: z.ZodObject<Fields & TimestampFields, z.core.$strict> = z.object(columns).strict()\n\tconst schema = documentSchema(storage, tableName)\n\tconst omittedKeys: readonly (ServerFields[number] | (typeof TIMESTAMP_FIELDS)[number])[] = [\n\t\t...TIMESTAMP_FIELDS,\n\t\t...(options.serverFields ?? []),\n\t]\n\tconst commandKeys: readonly CommandFields[number][] = options.commandFields ?? []\n\tconst publicKeys: readonly PublicFields[number][] = options.publicFields ?? []\n\tconst insertSchema: z.ZodObject<WriteFields<Fields, ServerFields>, z.core.$strict> = z\n\t\t.object(omitFields(columns, omittedKeys))\n\t\t.strict()\n\tconst updateSchema = insertSchema.partial()\n\tconst commandInput: z.ZodObject<\n\t\tPick<Fields & TimestampFields, CommandFields[number]>,\n\t\tz.core.$strict\n\t> = z.object(pickFields(columns, commandKeys)).strict()\n\tconst publicDto: z.ZodObject<\n\t\tPick<Fields & TimestampFields, PublicFields[number]>,\n\t\tz.core.$strict\n\t> = z.object(pickFields(columns, publicKeys)).strict()\n\ttype Public = Pick<Fields & TimestampFields, PublicFields[number]>\n\ttype Row = z.input<typeof storage>\n\ttype RuntimeDtoFields = Public & FieldSchemas\n\ttype RuntimeDto = z.output<StrictObject<RuntimeDtoFields>> & { _id?: GenericId<Table> }\n\ttype RuntimeOptions = { _id?: boolean; extend?: FieldSchemas; values?: unknown }\n\tconst reservedDtoFields = new Set<string>([\n\t\t'_id',\n\t\t'_creationTime',\n\t\t'tenant',\n\t\t'__proto__',\n\t\t...TIMESTAMP_FIELDS,\n\t])\n\n\tfunction dto(): typeof publicDto\n\tfunction dto<const IncludeId extends boolean>(\n\t\tincludeId: IncludeId,\n\t): DtoSchema<Table, Public, IncludeId>\n\tfunction dto<const IncludeId extends boolean = false>(\n\t\toptions: DtoProjectionOptions<IncludeId>,\n\t): DtoSchema<Table, Public, IncludeId>\n\tfunction dto<const IncludeId extends boolean = false, const Extension extends FieldSchemas = {}>(\n\t\toptions: DtoOptions<IncludeId, Extension> & { extend?: DtoExtension<Public, Extension> },\n\t): DtoSchema<Table, Public, IncludeId, Extension>\n\tfunction dto(options?: boolean | RuntimeOptions) {\n\t\treturn deriveDto(options)\n\t}\n\n\tfunction deriveDto(options?: boolean | RuntimeOptions) {\n\t\tconst normalized = options === true || options === false ? { _id: options } : options\n\t\tconst extension = normalized?.extend ?? {}\n\t\tfor (const key of Object.keys(extension)) {\n\t\t\tif (reservedDtoFields.has(key) || Object.hasOwn(publicDto.shape, key)) {\n\t\t\t\tthrow new Error(`DTO extension collision for field \"${key}\" on table \"${tableName}\"`)\n\t\t\t}\n\t\t\tassertDtoValidationSchema(extension[key])\n\t\t}\n\t\tif (!normalized?._id && Object.keys(extension).length === 0) return publicDto\n\t\tconst resultSchema = z.object({ ...publicDto.shape, ...extension }).strict()\n\t\treturn normalized?._id ? resultSchema.extend({ _id: schema.shape._id }) : resultSchema\n\t}\n\n\tfunction toPublicDto(row: Row): z.output<typeof publicDto>\n\tfunction toPublicDto<const IncludeId extends boolean>(\n\t\trow: DtoRow<Row, IncludeId>,\n\t\tincludeId: IncludeId,\n\t): z.output<DtoSchema<Table, Public, IncludeId>>\n\tfunction toPublicDto<const IncludeId extends boolean = false>(\n\t\trow: DtoRow<Row, IncludeId>,\n\t\toptions: DtoProjectionOptions<IncludeId>,\n\t): z.output<DtoSchema<Table, Public, IncludeId>>\n\tfunction toPublicDto<\n\t\tconst IncludeId extends boolean = false,\n\t\tconst Extension extends FieldSchemas = {},\n\t>(\n\t\trow: DtoRow<Row, IncludeId>,\n\t\toptions: DtoOptions<IncludeId, Extension> & {\n\t\t\textend?: DtoExtension<Public, Extension>\n\t\t} & DtoValues<Extension>,\n\t): z.output<DtoSchema<Table, Public, IncludeId, Extension>>\n\tfunction toPublicDto(row: Row, options?: boolean | RuntimeOptions): RuntimeDto {\n\t\tconst normalized = options === true || options === false ? { _id: options } : options\n\t\t// Enforce extension collisions and validation-only schemas before parsing values.\n\t\tderiveDto(options)\n\t\tconst projected = publicDto.parse(\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.keys(publicDto.shape).map((key) => {\n\t\t\t\t\t// SAFETY: publicDto contains only keys selected from the storage fields.\n\t\t\t\t\treturn [key, row[key as keyof typeof row]]\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\tconst extension = z\n\t\t\t.object(normalized?.extend ?? {})\n\t\t\t.strict()\n\t\t\t.parse(normalized?.values ?? {})\n\t\tconst result: RuntimeDto = { ...projected, ...extension }\n\t\tif (normalized?._id) {\n\t\t\tresult._id = schema.shape._id.parse('_id' in row ? row._id : undefined)\n\t\t}\n\t\treturn result\n\t}\n\n\ttype InsertSchema = typeof insertSchema\n\ttype UpdateSchema = typeof updateSchema\n\ttype InsertMask = z.util.Mask<keyof InsertSchema['shape']>\n\ttype UpdateMask = z.util.Mask<keyof UpdateSchema['shape']>\n\n\tfunction insert(): InsertSchema\n\tfunction insert<OmitMask extends InsertMask>(\n\t\tomit: OmitMask,\n\t): ZodObjectOmit<InsertSchema, OmitMask>\n\tfunction insert(omit?: InsertMask) {\n\t\t// SAFETY: InsertMask contains only insertSchema keys; the overload retains Zod's exact mask relationship.\n\t\treturn omit ? insertSchema.omit(omit as never) : insertSchema\n\t}\n\n\tfunction update(): UpdateSchema\n\tfunction update<OmitMask extends UpdateMask>(\n\t\tomit: OmitMask,\n\t): ZodObjectOmit<UpdateSchema, OmitMask>\n\tfunction update(omit?: UpdateMask) {\n\t\t// SAFETY: UpdateMask contains only updateSchema keys; the overload retains Zod's exact mask relationship.\n\t\treturn omit ? updateSchema.omit(omit as never) : updateSchema\n\t}\n\n\tconst nativeStorage = zodToConvex(storage)\n\tconst table: TableDefinition<ConvexValidatorFromZod<typeof storage, 'required'>> =\n\t\tdefineTable(nativeStorage)\n\ttype EntityFields = Fields & TimestampFields & SystemFields<Table>\n\tfunction paginationOpts<const Selection extends ScalarSelection<EntityFields>>(\n\t\tselection: ExactScalarSelection<EntityFields, Selection>,\n\t): ScalarPaginationSchema<EntityFields, Selection> {\n\t\treturn scalarPaginationSchema<EntityFields, Selection>(zodToConvex(schema).fields, selection)\n\t}\n\treturn {\n\t\ttableName,\n\t\tschema,\n\t\tstorage,\n\t\tinsertSchema,\n\t\tupdateSchema,\n\t\tcommandInput,\n\t\tpublicDto,\n\t\tdto,\n\t\ttoPublicDto,\n\t\tpaginationOpts,\n\t\ttable,\n\t\tinsert,\n\t\tupdate,\n\t\ttools: {\n\t\t\t// jsonSafeZid (not zid): tool masks feed generated JSON schemas, so\n\t\t\t// ids must present as plain strings while keeping the Id<...> type.\n\t\t\tinsert: commandInput,\n\t\t\tupdate: z.object({ data: commandInput.partial(), id: jsonSafeZid(tableName) }).strict(),\n\t\t\tid: z.object({ id: jsonSafeZid(tableName) }).strict(),\n\t\t},\n\t}\n}\n\nconst tenantFields = {\n\ttenant: z.string().min(1),\n} satisfies FieldSchemas\n\ntype TenantFields = typeof tenantFields\n\n/**\n * A zodTable whose rows are tenant-owned: injects the server-owned `tenant`\n * field (the tenancy boundary — see cvx-kit/tenancy). Like timestamps, it is\n * excluded from insert/update/command boundaries; handlers stamp it from\n * ctx.tenant, row-level security matches on it, and the tenantOwnership\n * trigger forbids reassigning it. Expose it via publicFields only when a DTO\n * genuinely needs it.\n */\nexport function tenantTable<\n\tTable extends string,\n\tFields extends FieldSchemas,\n\tconst ServerFields extends readonly FieldKey<Fields>[] = readonly [],\n\tconst CommandFields extends readonly FieldKey<Fields>[] = readonly [],\n\tconst PublicFields extends readonly FieldKey<Fields & TenantFields & TimestampFields>[] =\n\t\treadonly [],\n>(\n\ttableName: Table,\n\tfields: (\n\t\tid: typeof zid,\n\t) => Fields &\n\t\tOwnedFields<Fields> & { [Key in keyof Fields]: Key extends 'tenant' ? never : Fields[Key] },\n\toptions: TableBoundaryOptions<\n\t\tFields & TenantFields,\n\t\treadonly (ServerFields[number] | 'tenant')[],\n\t\tCommandFields,\n\t\tPublicFields\n\t> = {},\n) {\n\treturn zodTable<\n\t\tTable,\n\t\tFields & TenantFields,\n\t\treadonly (ServerFields[number] | 'tenant')[],\n\t\tCommandFields,\n\t\tPublicFields\n\t>(\n\t\ttableName,\n\t\t(id) => {\n\t\t\tconst declared = fields(id)\n\t\t\tassertOwnedFields(declared, ['tenant', '_id', '_creationTime', ...TIMESTAMP_FIELDS])\n\t\t\t// SAFETY: reserved keys were rejected before injecting tenant; the generic\n\t\t\t// wrapper forwards the same checked fields to the ordinary table constructor.\n\t\t\treturn { ...declared, ...tenantFields } as Fields &\n\t\t\t\tTenantFields &\n\t\t\t\tOwnedFields<Fields & TenantFields>\n\t\t},\n\t\t{\n\t\t\t...options,\n\t\t\tserverFields: [...(options.serverFields ?? []), 'tenant'],\n\t\t},\n\t)\n}\n\n/**\n * Merges per-module table maps into the application schema map, rejecting\n * duplicate table names across modules — the module-registry combinator for\n * domain/table.ts: `defineSchema(createModule(catalogTables, salesTables))`.\n */\nexport function createModule<const Maps extends readonly Record<string, TableDefinition<any>>[]>(\n\t...maps: Maps\n): UnionToIntersection<Maps[number]> {\n\tconst combined: Record<string, TableDefinition<any>> = {}\n\tfor (const map of maps) {\n\t\tfor (const [tableName, definition] of Object.entries(map)) {\n\t\t\tif (tableName in combined) {\n\t\t\t\tthrow new Error(`Table \"${tableName}\" is declared by more than one module`)\n\t\t\t}\n\t\t\tcombined[tableName] = definition\n\t\t}\n\t}\n\t// SAFETY: every input entry is copied, and duplicate keys are rejected above.\n\treturn combined as UnionToIntersection<Maps[number]>\n}\n\ntype UnionToIntersection<Union> = (\n\tUnion extends unknown ? (member: Union) => void : never\n) extends (member: infer Intersection) => void\n\t? Intersection\n\t: never\n\n/**\n * Cursor-pagination boundary schemas bridged from Convex's own validators:\n * `args.paginationOpts` for function args, `result` for the page shape.\n * Pair with `include(...).paginate(opts)` (cvx-kit/auth). The result object\n * is deliberately non-strict — Convex may attach engine fields (splitCursor,\n * pageStatus); the page items themselves are validated against the dto.\n * Note: under row-level security, pages may be SHORTER than numItems when\n * rules reject rows mid-page; cursors remain correct.\n */\nexport function paginated<Dto extends z.ZodType>(dto: Dto) {\n\treturn {\n\t\targs: { paginationOpts: convexToZod(paginationOptsValidator) },\n\t\tresult: z.object({\n\t\t\tpage: z.array(dto),\n\t\t\tisDone: z.boolean(),\n\t\t\tcontinueCursor: z.string(),\n\t\t\tsplitCursor: z.string().nullable().optional(),\n\t\t\tpageStatus: z.enum(['SplitRecommended', 'SplitRequired']).nullable().optional(),\n\t\t}),\n\t}\n}\n\ntype VariantSchema = z.ZodDiscriminatedUnion<readonly StrictObject<FieldSchemas>[], string>\ntype VariantDiscriminator<Schema extends VariantSchema> = Schema['_zod']['def']['discriminator']\ntype VariantTags<Schema extends VariantSchema> = Extract<\n\tz.output<Schema>[VariantDiscriminator<Schema>],\n\tstring\n>\ntype VariantBranch<Schema extends VariantSchema, Tag extends string> = Extract<\n\tSchema['options'][number],\n\tz.ZodObject<{ [Key in VariantDiscriminator<Schema>]: z.ZodLiteral<Tag> }, z.core.$strict>\n>\ntype VariantKeys<Schema extends VariantSchema, Tag extends string> = FieldKey<\n\tVariantBranch<Schema, Tag>['shape']\n>\n\n/** Boundary mode supports strict object branches with one string literal tag each. */\nexport type VariantBoundaryOptions<Schema extends VariantSchema> = {\n\tdiscriminator: VariantDiscriminator<Schema>\n\ttimestamps?: boolean\n\tvariants: {\n\t\t[Tag in VariantTags<Schema>]: {\n\t\t\tserverFields?: readonly Exclude<VariantKeys<Schema, Tag>, VariantDiscriminator<Schema>>[]\n\t\t\tcommandFields?: readonly Exclude<VariantKeys<Schema, Tag>, VariantDiscriminator<Schema>>[]\n\t\t\tpublicFields?: readonly (\n\t\t\t\t| Exclude<VariantKeys<Schema, Tag>, VariantDiscriminator<Schema>>\n\t\t\t\t| keyof TimestampFields\n\t\t\t)[]\n\t\t}\n\t}\n}\ntype VariantMaskKeys<Config, Mask extends string> = Config extends {\n\t[Key in Mask]?: readonly (infer Field)[]\n}\n\t? Extract<Field, string>\n\t: never\ntype CheckedVariantOptions<\n\tSchema extends VariantSchema,\n\tOptions extends VariantBoundaryOptions<Schema>,\n> = {\n\tvariants: {\n\t\t[Tag in keyof Options['variants']]: Tag extends VariantTags<Schema>\n\t\t\t? {\n\t\t\t\t\tcommandFields?: readonly Exclude<\n\t\t\t\t\t\tVariantKeys<Schema, Tag>,\n\t\t\t\t\t\tVariantDiscriminator<Schema> | VariantMaskKeys<Options['variants'][Tag], 'serverFields'>\n\t\t\t\t\t>[]\n\t\t\t\t\tpublicFields?: readonly (\n\t\t\t\t\t\t| Exclude<VariantKeys<Schema, Tag>, VariantDiscriminator<Schema>>\n\t\t\t\t\t\t| (Options extends { timestamps: true } ? keyof TimestampFields : never)\n\t\t\t\t\t)[]\n\t\t\t\t}\n\t\t\t: never\n\t}\n}\ntype VariantMode =\n\t| 'storage'\n\t| 'document'\n\t| 'insert'\n\t| 'update'\n\t| 'command'\n\t| 'commandUpdate'\n\t| 'public'\ntype VariantFields<\n\tTable extends string,\n\tBranch extends StrictObject<FieldSchemas>,\n\tDiscriminator extends string,\n\tConfig,\n\tTimestamps extends boolean,\n\tMode extends VariantMode,\n> = Mode extends 'storage'\n\t? Branch['shape'] & (true extends Timestamps ? TimestampFields : {})\n\t: Mode extends 'document'\n\t\t? VariantFields<Table, Branch, Discriminator, Config, Timestamps, 'storage'> &\n\t\t\t\tSystemFields<Table>\n\t\t: Mode extends 'public' | 'command'\n\t\t\t? Pick<\n\t\t\t\t\tVariantFields<Table, Branch, Discriminator, Config, Timestamps, 'storage'>,\n\t\t\t\t\tExtract<\n\t\t\t\t\t\t| Discriminator\n\t\t\t\t\t\t| VariantMaskKeys<Config, Mode extends 'public' ? 'publicFields' : 'commandFields'>,\n\t\t\t\t\t\tkeyof VariantFields<Table, Branch, Discriminator, Config, Timestamps, 'storage'>\n\t\t\t\t\t>\n\t\t\t\t>\n\t\t\t: Mode extends 'insert'\n\t\t\t\t? Omit<Branch['shape'], VariantMaskKeys<Config, 'serverFields'>>\n\t\t\t\t: PartialFields<\n\t\t\t\t\t\tOmit<\n\t\t\t\t\t\t\tVariantFields<\n\t\t\t\t\t\t\t\tTable,\n\t\t\t\t\t\t\t\tBranch,\n\t\t\t\t\t\t\t\tDiscriminator,\n\t\t\t\t\t\t\t\tConfig,\n\t\t\t\t\t\t\t\tTimestamps,\n\t\t\t\t\t\t\t\tMode extends 'update' ? 'insert' : 'command'\n\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\tDiscriminator\n\t\t\t\t\t\t>\n\t\t\t\t\t> &\n\t\t\t\t\t\tPick<Branch['shape'], Extract<Discriminator, keyof Branch['shape']>>\ntype DerivedVariantBranches<\n\tTable extends string,\n\tSchema extends VariantSchema,\n\tOptions extends VariantBoundaryOptions<Schema>,\n\tMode extends VariantMode,\n\tIncludeId extends boolean,\n\tBranches extends readonly StrictObject<FieldSchemas>[],\n> = {\n\t[Index in keyof Branches]: Branches[Index] extends StrictObject<FieldSchemas>\n\t\t? StrictObject<\n\t\t\t\tVariantFields<\n\t\t\t\t\tTable,\n\t\t\t\t\tBranches[Index],\n\t\t\t\t\tVariantDiscriminator<Schema>,\n\t\t\t\t\tOptions['variants'][Extract<\n\t\t\t\t\t\tz.output<Branches[Index]>[VariantDiscriminator<Schema>],\n\t\t\t\t\t\tkeyof Options['variants']\n\t\t\t\t\t>],\n\t\t\t\t\tOptions extends { timestamps: infer Enabled }\n\t\t\t\t\t\t? true extends Enabled\n\t\t\t\t\t\t\t? true\n\t\t\t\t\t\t\t: false\n\t\t\t\t\t\t: false,\n\t\t\t\t\tMode\n\t\t\t\t> &\n\t\t\t\t\t(IncludeId extends true ? { _id: Zid<Table> } : {})\n\t\t\t>\n\t\t: never\n}\ntype DerivedVariant<\n\tTable extends string,\n\tSchema extends VariantSchema,\n\tOptions extends VariantBoundaryOptions<Schema>,\n\tMode extends VariantMode,\n\tIncludeId extends boolean = false,\n> = IncludeId extends true\n\t? z.ZodDiscriminatedUnion<\n\t\t\tDerivedVariantBranches<Table, Schema, Options, Mode, true, Schema['options']>,\n\t\t\tVariantDiscriminator<Schema>\n\t\t>\n\t: z.ZodDiscriminatedUnion<\n\t\t\tDerivedVariantBranches<Table, Schema, Options, Mode, false, Schema['options']>,\n\t\t\tVariantDiscriminator<Schema>\n\t\t>\n\nexport type VariantTableBoundary<\n\tTable extends string,\n\tSchema extends VariantSchema,\n\tOptions extends VariantBoundaryOptions<Schema>,\n> = {\n\ttableName: Table\n\tstorage: DerivedVariant<Table, Schema, Options, 'storage'>\n\tschema: DerivedVariant<Table, Schema, Options, 'document'>\n\tinsertSchema: DerivedVariant<Table, Schema, Options, 'insert'>\n\tupdateSchema: DerivedVariant<Table, Schema, Options, 'update'>\n\tcommandInput: DerivedVariant<Table, Schema, Options, 'command'>\n\tpublicDto: DerivedVariant<Table, Schema, Options, 'public'>\n\ttable: TableDefinition<\n\t\tConvexValidatorFromZod<DerivedVariant<Table, Schema, Options, 'storage'>, 'required'>\n\t>\n\tdto(): DerivedVariant<Table, Schema, Options, 'public'>\n\tdto<const IncludeId extends boolean>(\n\t\tincludeId: IncludeId,\n\t): DerivedVariant<Table, Schema, Options, 'public', IncludeId>\n\ttoPublicDto(\n\t\trow: z.input<DerivedVariant<Table, Schema, Options, 'storage'>>,\n\t): z.output<DerivedVariant<Table, Schema, Options, 'public'>>\n\ttoPublicDto<const IncludeId extends boolean>(\n\t\trow: DtoRow<z.input<DerivedVariant<Table, Schema, Options, 'storage'>>, IncludeId>,\n\t\tincludeId: IncludeId,\n\t): z.output<DerivedVariant<Table, Schema, Options, 'public', IncludeId>>\n\ttools: {\n\t\tid: StrictObject<{ id: z.ZodType<GenericId<Table>, string> }>\n\t\tinsert: z.ZodType<\n\t\t\tz.output<DerivedVariant<Table, Schema, Options, 'command'>>,\n\t\t\tz.input<DerivedVariant<Table, Schema, Options, 'command'>>\n\t\t>\n\t\tupdate: StrictObject<{\n\t\t\tid: z.ZodType<GenericId<Table>, string>\n\t\t\tdata: z.ZodType<\n\t\t\t\tz.output<DerivedVariant<Table, Schema, Options, 'commandUpdate'>>,\n\t\t\t\tz.input<DerivedVariant<Table, Schema, Options, 'commandUpdate'>>\n\t\t\t>\n\t\t}>\n\t}\n}\n\n/** Legacy mode preserves arbitrary storage; the third argument opts into derived boundaries. */\nexport function zodVariantTable<Table extends string, Schema extends z.ZodType>(\n\ttableName: Table,\n\tstorage: Schema,\n): {\n\ttableName: Table\n\tstorage: Schema\n\tinsertSchema: Schema\n\ttable: TableDefinition<ConvexValidatorFromZod<Schema, 'required'>>\n}\nexport function zodVariantTable<\n\tTable extends string,\n\tSchema extends VariantSchema,\n\tconst Options extends VariantBoundaryOptions<Schema>,\n>(\n\ttableName: Table,\n\tstorage: Schema,\n\toptions: Options & CheckedVariantOptions<Schema, NoInfer<Options>>,\n): VariantTableBoundary<Table, Schema, Options>\nexport function zodVariantTable(\n\ttableName: string,\n\tstorage: z.ZodType,\n\toptions?: {\n\t\tdiscriminator: string\n\t\ttimestamps?: boolean\n\t\tvariants: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tserverFields?: readonly string[]\n\t\t\t\tcommandFields?: readonly string[]\n\t\t\t\tpublicFields?: readonly string[]\n\t\t\t}\n\t\t>\n\t},\n) {\n\tif (options) return deriveVariantTable(tableName, storage, options)\n\treturn {\n\t\ttableName,\n\t\tstorage,\n\t\tinsertSchema: storage,\n\t\ttable: defineTable(zodToConvex(storage)),\n\t}\n}\n\n/**\n * A zid that presents as a plain string in generated JSON schemas so\n * LLM-tool inputs stay primitive, while keeping the Id type at compile time.\n */\nexport function jsonSafeZid<Table extends string>(\n\ttableName: Table,\n): z.ZodType<GenericId<Table>, string> {\n\tconst id = zid(tableName)\n\treturn z\n\t\t.string()\n\t\t.refine((value): value is GenericId<Table> => id.safeParse(value).success)\n\t\t.describe(`Convex document id for table \"${tableName}\"; validated against the table by Convex`)\n}\n\nfunction deriveVariantTable(\n\ttableName: string,\n\tdeclared: z.ZodType,\n\toptions: {\n\t\tdiscriminator: string\n\t\ttimestamps?: boolean\n\t\tvariants: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tserverFields?: readonly string[]\n\t\t\t\tcommandFields?: readonly string[]\n\t\t\t\tpublicFields?: readonly string[]\n\t\t\t}\n\t\t>\n\t},\n) {\n\tif (\n\t\t!(declared instanceof z.ZodDiscriminatedUnion) ||\n\t\tdeclared.def.discriminator !== options.discriminator\n\t)\n\t\tthrow new Error(\n\t\t\t'Variant boundaries require a discriminated union with the configured discriminator',\n\t\t)\n\tif (declared.def.checks?.length)\n\t\tthrow new Error('Variant boundaries do not support union-level refinements')\n\tconst discriminator = options.discriminator\n\tif (['_id', '_creationTime', ...TIMESTAMP_FIELDS].includes(discriminator))\n\t\tthrow new Error('Variant discriminator cannot be a reserved field')\n\tconst branches = new Map<\n\t\tstring,\n\t\t{\n\t\t\tstorage: StrictObject<FieldSchemas>\n\t\t\tdocument: StrictObject<FieldSchemas>\n\t\t\tinsert: StrictObject<FieldSchemas>\n\t\t\tupdate: StrictObject<FieldSchemas>\n\t\t\tcommand: StrictObject<FieldSchemas>\n\t\t\tcommandUpdate: StrictObject<FieldSchemas>\n\t\t\tpublic: StrictObject<FieldSchemas>\n\t\t}\n\t>()\n\tfor (const branch of declared.options) {\n\t\tif (!(branch instanceof z.ZodObject) || !(branch.def.catchall instanceof z.ZodNever))\n\t\t\tthrow new Error('Variant boundaries require strict object branches')\n\t\tif (branch.def.checks?.length)\n\t\t\tthrow new Error('Variant boundaries do not support object-level refinements')\n\t\ttry {\n\t\t\tassertDtoValidationSchema(branch, new Set(), true)\n\t\t} catch (cause) {\n\t\t\tthrow new Error(\n\t\t\t\t'Variant boundaries require supported value-preserving field validators without object catchalls',\n\t\t\t\t{ cause },\n\t\t\t)\n\t\t}\n\t\tconst tagSchema = branch.shape[discriminator]\n\t\tif (!(tagSchema instanceof z.ZodLiteral) || tagSchema.values.size !== 1)\n\t\t\tthrow new Error('Variant branches require one string literal discriminator')\n\t\tconst tag = [...tagSchema.values][0]\n\t\tif (!z.string().safeParse(tag).success)\n\t\t\tthrow new Error('Variant branches require a string discriminator')\n\t\t// SAFETY: a single literal value was checked as a string above.\n\t\tconst tagValue = tag as string\n\t\tif (branches.has(tagValue)) throw new Error(`Duplicate variant discriminator \"${tagValue}\"`)\n\t\tif (!Object.hasOwn(options.variants, tagValue))\n\t\t\tthrow new Error(`Missing variant configuration \"${tagValue}\"`)\n\t\tconst config = options.variants[tagValue]\n\t\tassertOwnedFields(branch.shape, [\n\t\t\t'_id',\n\t\t\t'_creationTime',\n\t\t\t...(options.timestamps === false ? [] : TIMESTAMP_FIELDS),\n\t\t])\n\t\tconst columns = { ...branch.shape } satisfies FieldSchemas\n\t\tif (options.timestamps) Object.assign(columns, timestampFields)\n\t\tassertFieldLists(\n\t\t\tcolumns,\n\t\t\tconfig.serverFields ?? [],\n\t\t\tconfig.commandFields ?? [],\n\t\t\tconfig.publicFields ?? [],\n\t\t\toptions.timestamps !== false,\n\t\t)\n\t\tfor (const mask of [config.serverFields, config.commandFields, config.publicFields]) {\n\t\t\tif (mask?.includes(discriminator))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'The variant discriminator is retained automatically and cannot appear in masks',\n\t\t\t\t)\n\t\t}\n\t\tconst stored = z.strictObject(columns)\n\t\tconst insert = z.strictObject(\n\t\t\tomitFields(columns, [\n\t\t\t\t...(options.timestamps === false ? [] : TIMESTAMP_FIELDS),\n\t\t\t\t...(config.serverFields ?? []),\n\t\t\t]),\n\t\t)\n\t\tconst command = z.strictObject(\n\t\t\tpickFields(columns, [discriminator, ...(config.commandFields ?? [])]),\n\t\t)\n\t\tconst partial = (schema: StrictObject<FieldSchemas>) =>\n\t\t\tschema.partial().extend({ [discriminator]: tagSchema })\n\t\tbranches.set(tagValue, {\n\t\t\tstorage: stored,\n\t\t\tdocument: documentSchema(stored, tableName),\n\t\t\tinsert,\n\t\t\tupdate: partial(insert),\n\t\t\tcommand,\n\t\t\tcommandUpdate: partial(command),\n\t\t\tpublic: z.strictObject(pickFields(columns, [discriminator, ...(config.publicFields ?? [])])),\n\t\t})\n\t}\n\tfor (const tag of Object.keys(options.variants)) {\n\t\tif (!branches.has(tag)) throw new Error(`Unknown variant configuration \"${tag}\"`)\n\t}\n\tfunction union(mode: VariantMode, includeId = false, tool = false) {\n\t\tconst schemas = [...branches.values()].map((branch) => {\n\t\t\tconst schema = branch[mode]\n\t\t\tif (tool)\n\t\t\t\treturn z.strictObject(\n\t\t\t\t\tObject.fromEntries(\n\t\t\t\t\t\tObject.entries(schema.shape).map(([key, field]) => [key, variantToolField(field)]),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\treturn includeId ? schema.extend({ _id: zid(tableName) }) : schema\n\t\t})\n\t\tif (!schemas.length) throw new Error('Variant boundaries require at least one branch')\n\t\t// SAFETY: all entries are checked strict objects with a unique required literal tag; nonempty checked above.\n\t\treturn z.discriminatedUnion(\n\t\t\tdiscriminator,\n\t\t\tschemas as [StrictObject<FieldSchemas>, ...StrictObject<FieldSchemas>[]],\n\t\t)\n\t}\n\tconst storage = union('storage')\n\tconst schema = union('document')\n\tconst insertSchema = union('insert')\n\tconst updateSchema = union('update')\n\tconst commandInput = union('command')\n\tconst publicDto = union('public')\n\tfunction dto(includeId = false) {\n\t\treturn includeId ? union('public', true) : publicDto\n\t}\n\tfunction toPublicDto(row: z.input<StrictObject<FieldSchemas>>, includeId = false) {\n\t\tconst tag = z.string().parse(row[discriminator])\n\t\tconst branch = branches.get(tag)\n\t\tif (!branch) throw new Error(`Unknown variant discriminator \"${tag}\"`)\n\t\tconst projection = includeId ? branch.public.extend({ _id: zid(tableName) }) : branch.public\n\t\treturn projection.parse(\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.keys(projection.shape)\n\t\t\t\t\t.filter((key) => Object.hasOwn(row, key))\n\t\t\t\t\t.map((key) => [key, row[key]]),\n\t\t\t),\n\t\t)\n\t}\n\treturn {\n\t\ttableName,\n\t\tstorage,\n\t\tschema,\n\t\tinsertSchema,\n\t\tupdateSchema,\n\t\tcommandInput,\n\t\tpublicDto,\n\t\tdto,\n\t\ttoPublicDto,\n\t\ttable: defineTable(zodToConvex(storage)),\n\t\ttools: {\n\t\t\tid: z.strictObject({ id: jsonSafeZid(tableName) }),\n\t\t\tinsert: union('command', false, true),\n\t\t\tupdate: z.strictObject({\n\t\t\t\tid: jsonSafeZid(tableName),\n\t\t\t\tdata: union('commandUpdate', false, true),\n\t\t\t}),\n\t\t},\n\t}\n}\n\nfunction variantToolField(schema: z.core.$ZodType): z.ZodType {\n\tif (!(schema instanceof z.ZodType))\n\t\tthrow new Error('Variant tools require classic Zod field schemas')\n\tif (\n\t\tschema instanceof z.ZodBigInt ||\n\t\t(schema instanceof z.ZodLiteral &&\n\t\t\t[...schema.values].some((value) => z.bigint().safeParse(value).success))\n\t)\n\t\tthrow new Error(\n\t\t\t'Variant tool command fields cannot contain bigint; JSON Schema cannot represent it',\n\t\t)\n\tconst native = zodToConvex(schema)\n\tif (native.kind === 'id') {\n\t\tconst id = jsonSafeZid(native.tableName)\n\t\tif (native.isOptional === 'optional')\n\t\t\treturn id.optional().refine((value) => schema.safeParse(value).success)\n\t\treturn id.refine((value) => schema.safeParse(value).success)\n\t}\n\tif (schema instanceof z.ZodOptional)\n\t\treturn schema.clone({ ...schema.def, innerType: variantToolField(schema.unwrap()) })\n\tif (schema instanceof z.ZodNullable)\n\t\treturn schema.clone({ ...schema.def, innerType: variantToolField(schema.unwrap()) })\n\tif (schema instanceof z.ZodNonOptional)\n\t\treturn schema.clone({ ...schema.def, innerType: variantToolField(schema.unwrap()) })\n\tif (schema instanceof z.ZodArray)\n\t\treturn schema.clone({ ...schema.def, element: variantToolField(schema.element) })\n\tif (schema instanceof z.ZodObject) {\n\t\tconst fields = Object.fromEntries(\n\t\t\tObject.entries(schema.shape).map(([key, child]) => [key, variantToolField(child)]),\n\t\t)\n\t\treturn schema.clone(Object.assign({}, schema.def, { ['shape']: fields }))\n\t}\n\tif (schema instanceof z.ZodUnion)\n\t\treturn schema.clone({ ...schema.def, options: schema.options.map(variantToolField) })\n\tif (schema instanceof z.ZodRecord)\n\t\treturn schema.clone({\n\t\t\t...schema.def,\n\t\t\t// SAFETY: conversion preserves the original record key output; IDs remain strings.\n\t\t\tkeyType: variantToolField(schema.keyType) as z.core.$ZodRecordKey,\n\t\t\tvalueType: variantToolField(schema.valueType),\n\t\t})\n\tif (schema instanceof z.ZodTuple)\n\t\treturn schema.clone({\n\t\t\t...schema.def,\n\t\t\titems: schema.def.items.map(variantToolField),\n\t\t\trest: schema.def.rest ? variantToolField(schema.def.rest) : null,\n\t\t})\n\tif (schema instanceof z.ZodIntersection)\n\t\treturn schema.clone({\n\t\t\t...schema.def,\n\t\t\tleft: variantToolField(schema.def.left),\n\t\t\tright: variantToolField(schema.def.right),\n\t\t})\n\treturn schema\n}\n\ntype ZodObjectOmit<\n\tSchema extends z.ZodObject<any, any>,\n\tOmitMask extends z.util.Mask<keyof Schema['shape']>,\n> =\n\tSchema extends z.ZodObject<infer ObjectFields, infer Config>\n\t\t? z.ZodObject<\n\t\t\t\tz.util.Flatten<Omit<ObjectFields, Extract<keyof ObjectFields, keyof OmitMask>>>,\n\t\t\t\tConfig\n\t\t\t>\n\t\t: never\n\nfunction documentSchema<Fields extends FieldSchemas, Table extends string>(\n\tstorage: StrictObject<Fields>,\n\ttableName: Table,\n) {\n\treturn storage.extend({ _id: zid(tableName), _creationTime: z.number() })\n}\n\nfunction pickFields<Fields extends FieldSchemas, const Keys extends readonly FieldKey<Fields>[]>(\n\tfields: Fields,\n\tkeys: Keys,\n) {\n\t// SAFETY: each entry uses a requested key and its original validator, preserving Pick.\n\treturn Object.fromEntries(keys.map((key) => [key, fields[key]])) as Pick<Fields, Keys[number]>\n}\n\nfunction omitFields<Fields extends FieldSchemas, const Keys extends readonly FieldKey<Fields>[]>(\n\tfields: Fields,\n\tkeys: Keys,\n) {\n\tconst omitted = new Set<string>(keys)\n\t// SAFETY: filtering removes exactly the supplied keys and keeps every remaining validator.\n\treturn Object.fromEntries(Object.entries(fields).filter(([key]) => !omitted.has(key))) as Omit<\n\t\tFields,\n\t\tKeys[number]\n\t>\n}\n\ntype DtoPropertiesCheck = z.core.$ZodCheck & {\n\treadonly _zod: {\n\t\treadonly def: { readonly check: 'properties' } & Record<\n\t\t\t'shape',\n\t\t\tRecord<string, z.core.$ZodType>\n\t\t>\n\t}\n}\n\n/** Inspect Zod 4's discriminated definitions, failing closed for unsupported nodes.\n * Used by DTO extensions and opt-in variant boundaries; legacy schemas are unchanged.\n */\nfunction assertDtoValidationSchema(\n\tschema: z.core.$ZodType,\n\tseen = new Set<z.core.$ZodType>(),\n\tallowNativeIds = false,\n): void {\n\tif (seen.has(schema)) return\n\tseen.add(schema)\n\t// SAFETY: Zod 4 exposes its built-in schema definitions as this discriminated union.\n\tconst def = (schema as z.core.$ZodTypes)._zod.def\n\tconst reject = () => {\n\t\tthrow new Error('DTO extensions require supported value-preserving validation schemas')\n\t}\n\tif ('coerce' in def && def.coerce) reject()\n\tif ('normalize' in def && def.normalize) reject()\n\tconst visit = (child: z.core.$ZodType) => assertDtoValidationSchema(child, seen, allowNativeIds)\n\tfor (const check of def.checks ?? []) {\n\t\tif (check._zod.def.check === 'overwrite') reject()\n\t\tif ('normalize' in check._zod.def && check._zod.def.normalize) reject()\n\t\tif (check._zod.def.check === 'property') {\n\t\t\t// SAFETY: the property discriminator owns this embedded schema in Zod 4.\n\t\t\tvisit((check as z.core.$ZodCheckProperty)._zod.def.schema)\n\t\t}\n\t\tif (check._zod.def.check === 'properties') {\n\t\t\t// SAFETY: the properties discriminator owns this schema shape in Zod 4.\n\t\t\tfor (const child of Object.values((check as DtoPropertiesCheck)._zod.def.shape)) {\n\t\t\t\tvisit(child)\n\t\t\t}\n\t\t}\n\t}\n\tswitch (def.type) {\n\t\tcase 'custom':\n\t\t\tif (allowNativeIds && zodToConvex(schema).kind === 'id') return\n\t\t\treject()\n\t\t\treturn\n\t\tcase 'string':\n\t\tcase 'number':\n\t\tcase 'boolean':\n\t\tcase 'bigint':\n\t\tcase 'date':\n\t\tcase 'symbol':\n\t\tcase 'null':\n\t\tcase 'undefined':\n\t\tcase 'void':\n\t\tcase 'never':\n\t\tcase 'literal':\n\t\tcase 'enum':\n\t\t\treturn\n\t\tcase 'object':\n\t\t\tif (allowNativeIds && def.catchall && def.catchall._zod.def.type !== 'never')\n\t\t\t\tthrow new Error('Variant fields cannot use object catchalls; use a record field instead')\n\t\t\tfor (const child of Object.values(def.shape)) visit(child)\n\t\t\tif (def.catchall) visit(def.catchall)\n\t\t\treturn\n\t\tcase 'array':\n\t\t\tvisit(def.element)\n\t\t\treturn\n\t\tcase 'optional':\n\t\tcase 'nullable':\n\t\tcase 'nonoptional':\n\t\t\tvisit(def.innerType)\n\t\t\treturn\n\t\tcase 'union':\n\t\t\tfor (const child of def.options) visit(child)\n\t\t\treturn\n\t\tcase 'intersection':\n\t\t\tvisit(def.left)\n\t\t\tvisit(def.right)\n\t\t\treturn\n\t\tcase 'tuple':\n\t\t\tfor (const child of def.items) visit(child)\n\t\t\tif (def.rest) visit(def.rest)\n\t\t\treturn\n\t\tcase 'record':\n\t\t\tvisit(def.keyType)\n\t\t\tvisit(def.valueType)\n\t\t\treturn\n\t\tdefault:\n\t\t\treject()\n\t}\n}\n\nfunction assertOwnedFields(fields: FieldSchemas, reserved: readonly string[]): void {\n\tfor (const key of reserved) {\n\t\tif (Object.hasOwn(fields, key))\n\t\t\tthrow new Error(`Reserved table field \"${key}\" cannot be declared`)\n\t}\n}\n\nfunction assertFieldLists(\n\tfields: FieldSchemas,\n\tserver: readonly string[],\n\tcommand: readonly string[],\n\tpublicKeys: readonly string[],\n\tmanagedTimestamps = true,\n): void {\n\tfor (const key of [...server, ...command, ...publicKeys]) {\n\t\tif (!Object.hasOwn(fields, key)) throw new Error(`Unknown table field \"${key}\"`)\n\t}\n\tconst managed = new Set<string>([...(managedTimestamps ? TIMESTAMP_FIELDS : []), ...server])\n\tfor (const key of command) {\n\t\tif (managed.has(key)) throw new Error(`Server-owned field \"${key}\" cannot be a command input`)\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zod-table.mjs","names":["zid","convexToZod","convexToZod$1","zid$1","timestampFields","z","TIMESTAMP_FIELDS","zodTable","declared","fields","assertOwnedFields","columns","assertFieldLists","options","storage","schema","documentSchema","tableName","omittedKeys","commandKeys","publicKeys","insertSchema","omitFields","updateSchema","commandInput","pickFields","publicDto","reservedDtoFields","dto","deriveDto","normalized","extension","key","assertDtoValidationSchema","resultSchema","toPublicDto","projected","row","result","insert","omit","update","nativeStorage","zodToConvex","table","defineTable","paginationOpts","scalarPaginationSchema","selection","jsonSafeZid","createTable","shared","id","tenantFields","tenantTable","createModule","maps","combined","map","definition","paginated","paginationOptsValidator","zodVariantTable","deriveVariantTable","value","discriminator","branches","branch","cause","tagSchema","tag","tagValue","config","mask","stored","command","partial","union","schemas","mode","tool","field","variantToolField","includeId","projection","native","child","\"shape\"","keys","omitted","seen","def","reject","visit","allowNativeIds","check","reserved","server","managed","managedTimestamps","convexToZod","zid"],"sources":["../src/zod-table.ts"],"sourcesContent":["import { convexToZod, zid, type ConvexValidatorFromZod, type Zid } from 'convex-helpers/server/zod4'\nimport { defineTable, paginationOptsValidator, type TableDefinition } from 'convex/server'\nimport type { GenericId } from 'convex/values'\nimport { z } from 'zod'\n\nimport { zodToConvex } from './zod-convex'\n\nimport {\n\tscalarPaginationSchema,\n\ttype ScalarPaginationSchema,\n\ttype ScalarSelection,\n\ttype ExactScalarSelection,\n} from './querying/filters'\n\n// Use this entry point when deriving validators from kit-owned schemas so\n// the producer and converter consult the same convex-helpers ID registry.\nexport { zid, convexToZod } from 'convex-helpers/server/zod4'\nexport { zodToConvex } from './zod-convex'\n\ntype FieldSchemas = Record<string, z.ZodType>\ntype FieldKey<Fields extends FieldSchemas> = Extract<keyof Fields, string>\n\n/**\n * Opinionated lifecycle timestamps — every table has them, server-owned,\n * always excluded from insert/command boundaries. Maintained by the\n * `timestamps` trigger helper (see cvx-kit/triggers).\n */\nconst timestampFields = {\n\tcreatedAt: z.number().optional(),\n\tupdatedAt: z.number().optional(),\n\tarchivedAt: z.number().optional(),\n} satisfies FieldSchemas\n\ntype TimestampFields = typeof timestampFields\ntype ReservedStorageField = '_id' | '_creationTime' | keyof TimestampFields\ntype OwnedFields<Fields> = {\n\t[Key in keyof Fields]: Key extends ReservedStorageField ? never : Fields[Key]\n}\ntype SystemFields<Table extends string> = { _id: Zid<Table>; _creationTime: z.ZodNumber }\n\nexport const TIMESTAMP_FIELDS = ['createdAt', 'updatedAt', 'archivedAt'] as const\n\nexport type TableBoundaryOptions<\n\tFields extends FieldSchemas,\n\tServerFields extends readonly FieldKey<Fields>[],\n\tCommandFields extends readonly FieldKey<Fields>[],\n\tPublicFields extends readonly FieldKey<Fields & TimestampFields>[],\n> = {\n\tserverFields?: ServerFields\n\tcommandFields?: CommandFields &\n\t\treadonly Exclude<FieldKey<Fields>, ServerFields[number] | keyof TimestampFields>[]\n\tpublicFields?: PublicFields\n}\n\ntype StrictObject<Fields extends FieldSchemas> = z.ZodObject<Fields, z.core.$strict>\ntype WriteFields<\n\tFields extends FieldSchemas,\n\tServerFields extends readonly FieldKey<Fields>[],\n> = Omit<Fields & TimestampFields, ServerFields[number] | (typeof TIMESTAMP_FIELDS)[number]>\ntype PartialFields<Fields extends FieldSchemas> = {\n\t[Key in keyof Fields]: z.ZodOptional<Fields[Key]>\n}\n\n/** Options shared by the DTO return schema and row projector.\n * Promised contributions must be present, including in reusable options.\n * New extension schemas support validation only: no transforms, pipes,\n * coercion, preprocess, defaults, catches, or overwrites, even when nested.\n * Refinements must validate without mutating their input.\n */\nexport type DtoOptions<IncludeId extends boolean = false, Extension extends FieldSchemas = {}> = ([\n\tIncludeId,\n] extends [true]\n\t? { _id: IncludeId }\n\t: { _id?: IncludeId }) &\n\t(keyof Extension extends never ? { extend?: Extension } : { extend: Extension })\n\ntype DtoProjectionOptions<IncludeId extends boolean> = DtoOptions<IncludeId> & {\n\textend?: Record<string, never>\n\tvalues?: never\n}\n\ntype ReservedDtoField =\n\t| '_id'\n\t| '_creationTime'\n\t| 'tenant'\n\t| '__proto__'\n\t| (typeof TIMESTAMP_FIELDS)[number]\ntype DtoExtension<Public extends FieldSchemas, Extension extends FieldSchemas> = {\n\t[Key in keyof Extension]: Key extends keyof Public | ReservedDtoField\n\t\t? never\n\t\t: Extension[Key] extends z.ZodPipe | z.ZodTransform\n\t\t\t? never\n\t\t\t: unknown\n}\n// Broad dictionaries cannot promise any particular extension field.\ntype KnownExtension<Extension> = string extends keyof Extension ? {} : Extension\n\ntype DtoSchema<\n\tTable extends string,\n\tPublic extends FieldSchemas,\n\tIncludeId extends boolean,\n\tExtension extends FieldSchemas = {},\n> = IncludeId extends true\n\t? StrictObject<Public & { _id: Zid<Table> } & KnownExtension<Extension>>\n\t: StrictObject<Public & KnownExtension<Extension>>\ntype DtoRow<Row, IncludeId extends boolean> = Row & (true extends IncludeId ? { _id: string } : {})\ntype DtoValues<Extension extends FieldSchemas> = keyof Extension extends never\n\t? { values?: never }\n\t: { values: z.input<StrictObject<NoInfer<Extension>>> }\n\ntype DtoBoundary<Table extends string, Fields extends FieldSchemas, Public extends FieldSchemas> = {\n\tdto(): StrictObject<Public>\n\tdto<const IncludeId extends boolean>(includeId: IncludeId): DtoSchema<Table, Public, IncludeId>\n\tdto<const IncludeId extends boolean = false>(\n\t\toptions: DtoProjectionOptions<IncludeId>,\n\t): DtoSchema<Table, Public, IncludeId>\n\tdto<const IncludeId extends boolean = false, const Extension extends FieldSchemas = {}>(\n\t\toptions: DtoOptions<IncludeId, Extension> & { extend?: DtoExtension<Public, Extension> },\n\t): DtoSchema<Table, Public, IncludeId, Extension>\n\ttoPublicDto(row: z.input<StrictObject<Fields>>): z.output<StrictObject<Public>>\n\ttoPublicDto<const IncludeId extends boolean>(\n\t\trow: DtoRow<z.input<StrictObject<Fields>>, IncludeId>,\n\t\tincludeId: IncludeId,\n\t): z.output<DtoSchema<Table, Public, IncludeId>>\n\ttoPublicDto<const IncludeId extends boolean = false>(\n\t\trow: DtoRow<z.input<StrictObject<Fields>>, IncludeId>,\n\t\toptions: DtoProjectionOptions<IncludeId>,\n\t): z.output<DtoSchema<Table, Public, IncludeId>>\n\ttoPublicDto<const IncludeId extends boolean = false, const Extension extends FieldSchemas = {}>(\n\t\trow: DtoRow<z.input<StrictObject<Fields>>, IncludeId>,\n\t\toptions: DtoOptions<IncludeId, Extension> & {\n\t\t\textend?: DtoExtension<Public, Extension>\n\t\t} & DtoValues<Extension>,\n\t): z.output<DtoSchema<Table, Public, IncludeId, Extension>>\n}\n\n/** Named schema relationships keep generated declarations bounded and consumers fully typed. */\nexport type TableBoundary<\n\tTable extends string,\n\tFields extends FieldSchemas,\n\tServerFields extends readonly FieldKey<Fields>[],\n\tCommandFields extends readonly FieldKey<Fields>[],\n\tPublicFields extends readonly FieldKey<Fields & TimestampFields>[],\n> = DtoBoundary<\n\tTable,\n\tFields & TimestampFields,\n\tPick<Fields & TimestampFields, PublicFields[number]>\n> & {\n\tpaginationOpts<\n\t\tconst Selection extends ScalarSelection<Fields & TimestampFields & SystemFields<Table>>,\n\t>(\n\t\tselection: ExactScalarSelection<Fields & TimestampFields & SystemFields<Table>, Selection>,\n\t): ScalarPaginationSchema<Fields & TimestampFields & SystemFields<Table>, Selection>\n\ttableName: Table\n\tstorage: StrictObject<Fields & TimestampFields>\n\tschema: ReturnType<typeof documentSchema<Fields & TimestampFields, Table>>\n\tinsertSchema: StrictObject<WriteFields<Fields, ServerFields>>\n\tupdateSchema: StrictObject<PartialFields<WriteFields<Fields, ServerFields>>>\n\tcommandInput: StrictObject<Pick<Fields & TimestampFields, CommandFields[number]>>\n\tpublicDto: StrictObject<Pick<Fields & TimestampFields, PublicFields[number]>>\n\ttable: TableDefinition<ConvexValidatorFromZod<StrictObject<Fields & TimestampFields>, 'required'>>\n\tinsert(): StrictObject<WriteFields<Fields, ServerFields>>\n\tinsert<Mask extends z.util.Mask<keyof WriteFields<Fields, ServerFields>>>(\n\t\tomit: Mask,\n\t): ZodObjectOmit<StrictObject<WriteFields<Fields, ServerFields>>, Mask>\n\tupdate(): StrictObject<PartialFields<WriteFields<Fields, ServerFields>>>\n\tupdate<Mask extends z.util.Mask<keyof WriteFields<Fields, ServerFields>>>(\n\t\tomit: Mask,\n\t): ZodObjectOmit<StrictObject<PartialFields<WriteFields<Fields, ServerFields>>>, Mask>\n\ttools: {\n\t\tinsert: StrictObject<Pick<Fields & TimestampFields, CommandFields[number]>>\n\t\tupdate: StrictObject<{\n\t\t\tdata: StrictObject<PartialFields<Pick<Fields & TimestampFields, CommandFields[number]>>>\n\t\t\tid: z.ZodType<GenericId<Table>, string>\n\t\t}>\n\t\tid: StrictObject<{ id: z.ZodType<GenericId<Table>, string> }>\n\t}\n}\n\n/** Defines one table and derives its storage, document, write, and DTO boundaries. */\nexport function zodTable<\n\tTable extends string,\n\tFields extends FieldSchemas,\n\tconst ServerFields extends readonly FieldKey<Fields>[] = readonly [],\n\tconst CommandFields extends readonly FieldKey<Fields>[] = readonly [],\n\tconst PublicFields extends readonly FieldKey<Fields & TimestampFields>[] = readonly [],\n>(\n\ttableName: Table,\n\tfields: (id: typeof zid) => Fields & OwnedFields<Fields>,\n\toptions: TableBoundaryOptions<Fields, ServerFields, CommandFields, PublicFields> = {},\n): TableBoundary<Table, Fields, ServerFields, CommandFields, PublicFields> {\n\tconst declared = fields(zid)\n\tassertOwnedFields(declared, ['_id', '_creationTime', ...TIMESTAMP_FIELDS])\n\tconst columns: Fields & TimestampFields = { ...declared, ...timestampFields }\n\tassertFieldLists(\n\t\tcolumns,\n\t\toptions.serverFields ?? [],\n\t\toptions.commandFields ?? [],\n\t\toptions.publicFields ?? [],\n\t)\n\tconst storage: z.ZodObject<Fields & TimestampFields, z.core.$strict> = z.object(columns).strict()\n\tconst schema = documentSchema(storage, tableName)\n\tconst omittedKeys: readonly (ServerFields[number] | (typeof TIMESTAMP_FIELDS)[number])[] = [\n\t\t...TIMESTAMP_FIELDS,\n\t\t...(options.serverFields ?? []),\n\t]\n\tconst commandKeys: readonly CommandFields[number][] = options.commandFields ?? []\n\tconst publicKeys: readonly PublicFields[number][] = options.publicFields ?? []\n\tconst insertSchema: z.ZodObject<WriteFields<Fields, ServerFields>, z.core.$strict> = z\n\t\t.object(omitFields(columns, omittedKeys))\n\t\t.strict()\n\tconst updateSchema = insertSchema.partial()\n\tconst commandInput: z.ZodObject<\n\t\tPick<Fields & TimestampFields, CommandFields[number]>,\n\t\tz.core.$strict\n\t> = z.object(pickFields(columns, commandKeys)).strict()\n\tconst publicDto: z.ZodObject<\n\t\tPick<Fields & TimestampFields, PublicFields[number]>,\n\t\tz.core.$strict\n\t> = z.object(pickFields(columns, publicKeys)).strict()\n\ttype Public = Pick<Fields & TimestampFields, PublicFields[number]>\n\ttype Row = z.input<typeof storage>\n\ttype RuntimeDtoFields = Public & FieldSchemas\n\ttype RuntimeDto = z.output<StrictObject<RuntimeDtoFields>> & { _id?: GenericId<Table> }\n\ttype RuntimeOptions = { _id?: boolean; extend?: FieldSchemas; values?: unknown }\n\tconst reservedDtoFields = new Set<string>([\n\t\t'_id',\n\t\t'_creationTime',\n\t\t'tenant',\n\t\t'__proto__',\n\t\t...TIMESTAMP_FIELDS,\n\t])\n\n\tfunction dto(): typeof publicDto\n\tfunction dto<const IncludeId extends boolean>(\n\t\tincludeId: IncludeId,\n\t): DtoSchema<Table, Public, IncludeId>\n\tfunction dto<const IncludeId extends boolean = false>(\n\t\toptions: DtoProjectionOptions<IncludeId>,\n\t): DtoSchema<Table, Public, IncludeId>\n\tfunction dto<const IncludeId extends boolean = false, const Extension extends FieldSchemas = {}>(\n\t\toptions: DtoOptions<IncludeId, Extension> & { extend?: DtoExtension<Public, Extension> },\n\t): DtoSchema<Table, Public, IncludeId, Extension>\n\tfunction dto(options?: boolean | RuntimeOptions) {\n\t\treturn deriveDto(options)\n\t}\n\n\tfunction deriveDto(options?: boolean | RuntimeOptions) {\n\t\tconst normalized = options === true || options === false ? { _id: options } : options\n\t\tconst extension = normalized?.extend ?? {}\n\t\tfor (const key of Object.keys(extension)) {\n\t\t\tif (reservedDtoFields.has(key) || Object.hasOwn(publicDto.shape, key)) {\n\t\t\t\tthrow new Error(`DTO extension collision for field \"${key}\" on table \"${tableName}\"`)\n\t\t\t}\n\t\t\tassertDtoValidationSchema(extension[key])\n\t\t}\n\t\tif (!normalized?._id && Object.keys(extension).length === 0) return publicDto\n\t\tconst resultSchema = z.object({ ...publicDto.shape, ...extension }).strict()\n\t\treturn normalized?._id ? resultSchema.extend({ _id: schema.shape._id }) : resultSchema\n\t}\n\n\tfunction toPublicDto(row: Row): z.output<typeof publicDto>\n\tfunction toPublicDto<const IncludeId extends boolean>(\n\t\trow: DtoRow<Row, IncludeId>,\n\t\tincludeId: IncludeId,\n\t): z.output<DtoSchema<Table, Public, IncludeId>>\n\tfunction toPublicDto<const IncludeId extends boolean = false>(\n\t\trow: DtoRow<Row, IncludeId>,\n\t\toptions: DtoProjectionOptions<IncludeId>,\n\t): z.output<DtoSchema<Table, Public, IncludeId>>\n\tfunction toPublicDto<\n\t\tconst IncludeId extends boolean = false,\n\t\tconst Extension extends FieldSchemas = {},\n\t>(\n\t\trow: DtoRow<Row, IncludeId>,\n\t\toptions: DtoOptions<IncludeId, Extension> & {\n\t\t\textend?: DtoExtension<Public, Extension>\n\t\t} & DtoValues<Extension>,\n\t): z.output<DtoSchema<Table, Public, IncludeId, Extension>>\n\tfunction toPublicDto(row: Row, options?: boolean | RuntimeOptions): RuntimeDto {\n\t\tconst normalized = options === true || options === false ? { _id: options } : options\n\t\t// Enforce extension collisions and validation-only schemas before parsing values.\n\t\tderiveDto(options)\n\t\tconst projected = publicDto.parse(\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.keys(publicDto.shape).map((key) => {\n\t\t\t\t\t// SAFETY: publicDto contains only keys selected from the storage fields.\n\t\t\t\t\treturn [key, row[key as keyof typeof row]]\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t\tconst extension = z\n\t\t\t.object(normalized?.extend ?? {})\n\t\t\t.strict()\n\t\t\t.parse(normalized?.values ?? {})\n\t\tconst result: RuntimeDto = { ...projected, ...extension }\n\t\tif (normalized?._id) {\n\t\t\tresult._id = schema.shape._id.parse('_id' in row ? row._id : undefined)\n\t\t}\n\t\treturn result\n\t}\n\n\ttype InsertSchema = typeof insertSchema\n\ttype UpdateSchema = typeof updateSchema\n\ttype InsertMask = z.util.Mask<keyof InsertSchema['shape']>\n\ttype UpdateMask = z.util.Mask<keyof UpdateSchema['shape']>\n\n\tfunction insert(): InsertSchema\n\tfunction insert<OmitMask extends InsertMask>(\n\t\tomit: OmitMask,\n\t): ZodObjectOmit<InsertSchema, OmitMask>\n\tfunction insert(omit?: InsertMask) {\n\t\t// SAFETY: InsertMask contains only insertSchema keys; the overload retains Zod's exact mask relationship.\n\t\treturn omit ? insertSchema.omit(omit as never) : insertSchema\n\t}\n\n\tfunction update(): UpdateSchema\n\tfunction update<OmitMask extends UpdateMask>(\n\t\tomit: OmitMask,\n\t): ZodObjectOmit<UpdateSchema, OmitMask>\n\tfunction update(omit?: UpdateMask) {\n\t\t// SAFETY: UpdateMask contains only updateSchema keys; the overload retains Zod's exact mask relationship.\n\t\treturn omit ? updateSchema.omit(omit as never) : updateSchema\n\t}\n\n\tconst nativeStorage = zodToConvex(storage)\n\tconst table: TableDefinition<ConvexValidatorFromZod<typeof storage, 'required'>> =\n\t\tdefineTable(nativeStorage)\n\ttype EntityFields = Fields & TimestampFields & SystemFields<Table>\n\tfunction paginationOpts<const Selection extends ScalarSelection<EntityFields>>(\n\t\tselection: ExactScalarSelection<EntityFields, Selection>,\n\t): ScalarPaginationSchema<EntityFields, Selection> {\n\t\treturn scalarPaginationSchema<EntityFields, Selection>(zodToConvex(schema).fields, selection)\n\t}\n\treturn {\n\t\ttableName,\n\t\tschema,\n\t\tstorage,\n\t\tinsertSchema,\n\t\tupdateSchema,\n\t\tcommandInput,\n\t\tpublicDto,\n\t\tdto,\n\t\ttoPublicDto,\n\t\tpaginationOpts,\n\t\ttable,\n\t\tinsert,\n\t\tupdate,\n\t\ttools: {\n\t\t\t// jsonSafeZid (not zid): tool masks feed generated JSON schemas, so\n\t\t\t// ids must present as plain strings while keeping the Id<...> type.\n\t\t\tinsert: commandInput,\n\t\t\tupdate: z.object({ data: commandInput.partial(), id: jsonSafeZid(tableName) }).strict(),\n\t\t\tid: z.object({ id: jsonSafeZid(tableName) }).strict(),\n\t\t},\n\t}\n}\n\n/** Reuses ordinary fields while deriving every boundary through zodTable. */\nexport function createTable<Shared extends FieldSchemas>(shared: Shared & OwnedFields<Shared>) {\n\tassertOwnedFields(shared, ['_id', '_creationTime', ...TIMESTAMP_FIELDS])\n\treturn function customTable<\n\t\tTable extends string,\n\t\tFields extends FieldSchemas,\n\t\tconst ServerFields extends readonly FieldKey<Shared & Fields>[] = readonly [],\n\t\tconst CommandFields extends readonly FieldKey<Shared & Fields>[] = readonly [],\n\t\tconst PublicFields extends readonly FieldKey<Shared & Fields & TimestampFields>[] = readonly [],\n\t>(\n\t\ttableName: Table,\n\t\tfields: (id: typeof zid) => Fields &\n\t\t\tOwnedFields<Fields> & {\n\t\t\t\t[Key in keyof Fields]: Key extends (string extends keyof Shared ? never : keyof Shared)\n\t\t\t\t\t? never\n\t\t\t\t\t: Fields[Key]\n\t\t\t},\n\t\toptions: TableBoundaryOptions<Shared & Fields, ServerFields, CommandFields, PublicFields> = {},\n\t): TableBoundary<Table, Shared & Fields, ServerFields, CommandFields, PublicFields> {\n\t\treturn zodTable<Table, Shared & Fields, ServerFields, CommandFields, PublicFields>(\n\t\t\ttableName,\n\t\t\t(id) => {\n\t\t\t\tconst declared = fields(id)\n\t\t\t\tfor (const key of Object.keys(declared)) {\n\t\t\t\t\tif (Object.hasOwn(shared, key))\n\t\t\t\t\t\tthrow new Error(`Duplicate shared table field \"${key}\" on table \"${tableName}\"`)\n\t\t\t\t}\n\t\t\t\tassertOwnedFields(declared, ['_id', '_creationTime', ...TIMESTAMP_FIELDS])\n\t\t\t\tconst combined: Shared & Fields = { ...shared, ...declared }\n\t\t\t\t// SAFETY: duplicates and reserved keys are rejected before merging; like\n\t\t\t\t// tenantTable, this wrapper forwards the unchanged validators to zodTable.\n\t\t\t\treturn combined as Shared & Fields & OwnedFields<Shared & Fields>\n\t\t\t},\n\t\t\toptions,\n\t\t)\n\t}\n}\n\nconst tenantFields = {\n\ttenant: z.string().min(1),\n} satisfies FieldSchemas\n\ntype TenantFields = typeof tenantFields\n\n/**\n * A zodTable whose rows are tenant-owned: injects the server-owned `tenant`\n * field (the tenancy boundary — see cvx-kit/tenancy). Like timestamps, it is\n * excluded from insert/update/command boundaries; handlers stamp it from\n * ctx.tenant, row-level security matches on it, and the tenantOwnership\n * trigger forbids reassigning it. Expose it via publicFields only when a DTO\n * genuinely needs it.\n */\nexport function tenantTable<\n\tTable extends string,\n\tFields extends FieldSchemas,\n\tconst ServerFields extends readonly FieldKey<Fields>[] = readonly [],\n\tconst CommandFields extends readonly FieldKey<Fields>[] = readonly [],\n\tconst PublicFields extends readonly FieldKey<Fields & TenantFields & TimestampFields>[] =\n\t\treadonly [],\n>(\n\ttableName: Table,\n\tfields: (\n\t\tid: typeof zid,\n\t) => Fields &\n\t\tOwnedFields<Fields> & { [Key in keyof Fields]: Key extends 'tenant' ? never : Fields[Key] },\n\toptions: TableBoundaryOptions<\n\t\tFields & TenantFields,\n\t\treadonly (ServerFields[number] | 'tenant')[],\n\t\tCommandFields,\n\t\tPublicFields\n\t> = {},\n) {\n\treturn zodTable<\n\t\tTable,\n\t\tFields & TenantFields,\n\t\treadonly (ServerFields[number] | 'tenant')[],\n\t\tCommandFields,\n\t\tPublicFields\n\t>(\n\t\ttableName,\n\t\t(id) => {\n\t\t\tconst declared = fields(id)\n\t\t\tassertOwnedFields(declared, ['tenant', '_id', '_creationTime', ...TIMESTAMP_FIELDS])\n\t\t\t// SAFETY: reserved keys were rejected before injecting tenant; the generic\n\t\t\t// wrapper forwards the same checked fields to the ordinary table constructor.\n\t\t\treturn { ...declared, ...tenantFields } as Fields &\n\t\t\t\tTenantFields &\n\t\t\t\tOwnedFields<Fields & TenantFields>\n\t\t},\n\t\t{\n\t\t\t...options,\n\t\t\tserverFields: [...(options.serverFields ?? []), 'tenant'],\n\t\t},\n\t)\n}\n\n/**\n * Merges per-module table maps into the application schema map, rejecting\n * duplicate table names across modules — the module-registry combinator for\n * domain/table.ts: `defineSchema(createModule(catalogTables, salesTables))`.\n */\nexport function createModule<const Maps extends readonly Record<string, TableDefinition<any>>[]>(\n\t...maps: Maps\n): UnionToIntersection<Maps[number]> {\n\tconst combined: Record<string, TableDefinition<any>> = {}\n\tfor (const map of maps) {\n\t\tfor (const [tableName, definition] of Object.entries(map)) {\n\t\t\tif (tableName in combined) {\n\t\t\t\tthrow new Error(`Table \"${tableName}\" is declared by more than one module`)\n\t\t\t}\n\t\t\tcombined[tableName] = definition\n\t\t}\n\t}\n\t// SAFETY: every input entry is copied, and duplicate keys are rejected above.\n\treturn combined as UnionToIntersection<Maps[number]>\n}\n\ntype UnionToIntersection<Union> = (\n\tUnion extends unknown ? (member: Union) => void : never\n) extends (member: infer Intersection) => void\n\t? Intersection\n\t: never\n\n/**\n * Cursor-pagination boundary schemas bridged from Convex's own validators:\n * `args.paginationOpts` for function args, `result` for the page shape.\n * Pair with `include(...).paginate(opts)` (cvx-kit/auth). The result object\n * is deliberately non-strict — Convex may attach engine fields (splitCursor,\n * pageStatus); the page items themselves are validated against the dto.\n * Note: under row-level security, pages may be SHORTER than numItems when\n * rules reject rows mid-page; cursors remain correct.\n */\nexport function paginated<Dto extends z.ZodType>(dto: Dto) {\n\treturn {\n\t\targs: { paginationOpts: convexToZod(paginationOptsValidator) },\n\t\tresult: z.object({\n\t\t\tpage: z.array(dto),\n\t\t\tisDone: z.boolean(),\n\t\t\tcontinueCursor: z.string(),\n\t\t\tsplitCursor: z.string().nullable().optional(),\n\t\t\tpageStatus: z.enum(['SplitRecommended', 'SplitRequired']).nullable().optional(),\n\t\t}),\n\t}\n}\n\ntype VariantSchema = z.ZodDiscriminatedUnion<readonly StrictObject<FieldSchemas>[], string>\ntype VariantDiscriminator<Schema extends VariantSchema> = Schema['_zod']['def']['discriminator']\ntype VariantTags<Schema extends VariantSchema> = Extract<\n\tz.output<Schema>[VariantDiscriminator<Schema>],\n\tstring\n>\ntype VariantBranch<Schema extends VariantSchema, Tag extends string> = Extract<\n\tSchema['options'][number],\n\tz.ZodObject<{ [Key in VariantDiscriminator<Schema>]: z.ZodLiteral<Tag> }, z.core.$strict>\n>\ntype VariantKeys<Schema extends VariantSchema, Tag extends string> = FieldKey<\n\tVariantBranch<Schema, Tag>['shape']\n>\n\n/** Boundary mode supports strict object branches with one string literal tag each. */\nexport type VariantBoundaryOptions<Schema extends VariantSchema> = {\n\tdiscriminator: VariantDiscriminator<Schema>\n\ttimestamps?: boolean\n\tvariants: {\n\t\t[Tag in VariantTags<Schema>]: {\n\t\t\tserverFields?: readonly Exclude<VariantKeys<Schema, Tag>, VariantDiscriminator<Schema>>[]\n\t\t\tcommandFields?: readonly Exclude<VariantKeys<Schema, Tag>, VariantDiscriminator<Schema>>[]\n\t\t\tpublicFields?: readonly (\n\t\t\t\t| Exclude<VariantKeys<Schema, Tag>, VariantDiscriminator<Schema>>\n\t\t\t\t| keyof TimestampFields\n\t\t\t)[]\n\t\t}\n\t}\n}\ntype VariantMaskKeys<Config, Mask extends string> = Config extends {\n\t[Key in Mask]?: readonly (infer Field)[]\n}\n\t? Extract<Field, string>\n\t: never\ntype CheckedVariantOptions<\n\tSchema extends VariantSchema,\n\tOptions extends VariantBoundaryOptions<Schema>,\n> = {\n\tvariants: {\n\t\t[Tag in keyof Options['variants']]: Tag extends VariantTags<Schema>\n\t\t\t? {\n\t\t\t\t\tcommandFields?: readonly Exclude<\n\t\t\t\t\t\tVariantKeys<Schema, Tag>,\n\t\t\t\t\t\tVariantDiscriminator<Schema> | VariantMaskKeys<Options['variants'][Tag], 'serverFields'>\n\t\t\t\t\t>[]\n\t\t\t\t\tpublicFields?: readonly (\n\t\t\t\t\t\t| Exclude<VariantKeys<Schema, Tag>, VariantDiscriminator<Schema>>\n\t\t\t\t\t\t| (Options extends { timestamps: true } ? keyof TimestampFields : never)\n\t\t\t\t\t)[]\n\t\t\t\t}\n\t\t\t: never\n\t}\n}\ntype VariantMode =\n\t| 'storage'\n\t| 'document'\n\t| 'insert'\n\t| 'update'\n\t| 'command'\n\t| 'commandUpdate'\n\t| 'public'\ntype VariantFields<\n\tTable extends string,\n\tBranch extends StrictObject<FieldSchemas>,\n\tDiscriminator extends string,\n\tConfig,\n\tTimestamps extends boolean,\n\tMode extends VariantMode,\n> = Mode extends 'storage'\n\t? Branch['shape'] & (true extends Timestamps ? TimestampFields : {})\n\t: Mode extends 'document'\n\t\t? VariantFields<Table, Branch, Discriminator, Config, Timestamps, 'storage'> &\n\t\t\t\tSystemFields<Table>\n\t\t: Mode extends 'public' | 'command'\n\t\t\t? Pick<\n\t\t\t\t\tVariantFields<Table, Branch, Discriminator, Config, Timestamps, 'storage'>,\n\t\t\t\t\tExtract<\n\t\t\t\t\t\t| Discriminator\n\t\t\t\t\t\t| VariantMaskKeys<Config, Mode extends 'public' ? 'publicFields' : 'commandFields'>,\n\t\t\t\t\t\tkeyof VariantFields<Table, Branch, Discriminator, Config, Timestamps, 'storage'>\n\t\t\t\t\t>\n\t\t\t\t>\n\t\t\t: Mode extends 'insert'\n\t\t\t\t? Omit<Branch['shape'], VariantMaskKeys<Config, 'serverFields'>>\n\t\t\t\t: PartialFields<\n\t\t\t\t\t\tOmit<\n\t\t\t\t\t\t\tVariantFields<\n\t\t\t\t\t\t\t\tTable,\n\t\t\t\t\t\t\t\tBranch,\n\t\t\t\t\t\t\t\tDiscriminator,\n\t\t\t\t\t\t\t\tConfig,\n\t\t\t\t\t\t\t\tTimestamps,\n\t\t\t\t\t\t\t\tMode extends 'update' ? 'insert' : 'command'\n\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\tDiscriminator\n\t\t\t\t\t\t>\n\t\t\t\t\t> &\n\t\t\t\t\t\tPick<Branch['shape'], Extract<Discriminator, keyof Branch['shape']>>\ntype DerivedVariantBranches<\n\tTable extends string,\n\tSchema extends VariantSchema,\n\tOptions extends VariantBoundaryOptions<Schema>,\n\tMode extends VariantMode,\n\tIncludeId extends boolean,\n\tBranches extends readonly StrictObject<FieldSchemas>[],\n> = {\n\t[Index in keyof Branches]: Branches[Index] extends StrictObject<FieldSchemas>\n\t\t? StrictObject<\n\t\t\t\tVariantFields<\n\t\t\t\t\tTable,\n\t\t\t\t\tBranches[Index],\n\t\t\t\t\tVariantDiscriminator<Schema>,\n\t\t\t\t\tOptions['variants'][Extract<\n\t\t\t\t\t\tz.output<Branches[Index]>[VariantDiscriminator<Schema>],\n\t\t\t\t\t\tkeyof Options['variants']\n\t\t\t\t\t>],\n\t\t\t\t\tOptions extends { timestamps: infer Enabled }\n\t\t\t\t\t\t? true extends Enabled\n\t\t\t\t\t\t\t? true\n\t\t\t\t\t\t\t: false\n\t\t\t\t\t\t: false,\n\t\t\t\t\tMode\n\t\t\t\t> &\n\t\t\t\t\t(IncludeId extends true ? { _id: Zid<Table> } : {})\n\t\t\t>\n\t\t: never\n}\ntype DerivedVariant<\n\tTable extends string,\n\tSchema extends VariantSchema,\n\tOptions extends VariantBoundaryOptions<Schema>,\n\tMode extends VariantMode,\n\tIncludeId extends boolean = false,\n> = IncludeId extends true\n\t? z.ZodDiscriminatedUnion<\n\t\t\tDerivedVariantBranches<Table, Schema, Options, Mode, true, Schema['options']>,\n\t\t\tVariantDiscriminator<Schema>\n\t\t>\n\t: z.ZodDiscriminatedUnion<\n\t\t\tDerivedVariantBranches<Table, Schema, Options, Mode, false, Schema['options']>,\n\t\t\tVariantDiscriminator<Schema>\n\t\t>\n\nexport type VariantTableBoundary<\n\tTable extends string,\n\tSchema extends VariantSchema,\n\tOptions extends VariantBoundaryOptions<Schema>,\n> = {\n\ttableName: Table\n\tstorage: DerivedVariant<Table, Schema, Options, 'storage'>\n\tschema: DerivedVariant<Table, Schema, Options, 'document'>\n\tinsertSchema: DerivedVariant<Table, Schema, Options, 'insert'>\n\tupdateSchema: DerivedVariant<Table, Schema, Options, 'update'>\n\tcommandInput: DerivedVariant<Table, Schema, Options, 'command'>\n\tpublicDto: DerivedVariant<Table, Schema, Options, 'public'>\n\ttable: TableDefinition<\n\t\tConvexValidatorFromZod<DerivedVariant<Table, Schema, Options, 'storage'>, 'required'>\n\t>\n\tdto(): DerivedVariant<Table, Schema, Options, 'public'>\n\tdto<const IncludeId extends boolean>(\n\t\tincludeId: IncludeId,\n\t): DerivedVariant<Table, Schema, Options, 'public', IncludeId>\n\ttoPublicDto(\n\t\trow: z.input<DerivedVariant<Table, Schema, Options, 'storage'>>,\n\t): z.output<DerivedVariant<Table, Schema, Options, 'public'>>\n\ttoPublicDto<const IncludeId extends boolean>(\n\t\trow: DtoRow<z.input<DerivedVariant<Table, Schema, Options, 'storage'>>, IncludeId>,\n\t\tincludeId: IncludeId,\n\t): z.output<DerivedVariant<Table, Schema, Options, 'public', IncludeId>>\n\ttools: {\n\t\tid: StrictObject<{ id: z.ZodType<GenericId<Table>, string> }>\n\t\tinsert: z.ZodType<\n\t\t\tz.output<DerivedVariant<Table, Schema, Options, 'command'>>,\n\t\t\tz.input<DerivedVariant<Table, Schema, Options, 'command'>>\n\t\t>\n\t\tupdate: StrictObject<{\n\t\t\tid: z.ZodType<GenericId<Table>, string>\n\t\t\tdata: z.ZodType<\n\t\t\t\tz.output<DerivedVariant<Table, Schema, Options, 'commandUpdate'>>,\n\t\t\t\tz.input<DerivedVariant<Table, Schema, Options, 'commandUpdate'>>\n\t\t\t>\n\t\t}>\n\t}\n}\n\n/** Legacy mode preserves arbitrary storage; the third argument opts into derived boundaries. */\nexport function zodVariantTable<Table extends string, Schema extends z.ZodType>(\n\ttableName: Table,\n\tstorage: Schema,\n): {\n\ttableName: Table\n\tstorage: Schema\n\tinsertSchema: Schema\n\ttable: TableDefinition<ConvexValidatorFromZod<Schema, 'required'>>\n}\nexport function zodVariantTable<\n\tTable extends string,\n\tSchema extends VariantSchema,\n\tconst Options extends VariantBoundaryOptions<Schema>,\n>(\n\ttableName: Table,\n\tstorage: Schema,\n\toptions: Options & CheckedVariantOptions<Schema, NoInfer<Options>>,\n): VariantTableBoundary<Table, Schema, Options>\nexport function zodVariantTable(\n\ttableName: string,\n\tstorage: z.ZodType,\n\toptions?: {\n\t\tdiscriminator: string\n\t\ttimestamps?: boolean\n\t\tvariants: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tserverFields?: readonly string[]\n\t\t\t\tcommandFields?: readonly string[]\n\t\t\t\tpublicFields?: readonly string[]\n\t\t\t}\n\t\t>\n\t},\n) {\n\tif (options) return deriveVariantTable(tableName, storage, options)\n\treturn {\n\t\ttableName,\n\t\tstorage,\n\t\tinsertSchema: storage,\n\t\ttable: defineTable(zodToConvex(storage)),\n\t}\n}\n\n/**\n * A zid that presents as a plain string in generated JSON schemas so\n * LLM-tool inputs stay primitive, while keeping the Id type at compile time.\n */\nexport function jsonSafeZid<Table extends string>(\n\ttableName: Table,\n): z.ZodType<GenericId<Table>, string> {\n\tconst id = zid(tableName)\n\treturn z\n\t\t.string()\n\t\t.refine((value): value is GenericId<Table> => id.safeParse(value).success)\n\t\t.describe(`Convex document id for table \"${tableName}\"; validated against the table by Convex`)\n}\n\nfunction deriveVariantTable(\n\ttableName: string,\n\tdeclared: z.ZodType,\n\toptions: {\n\t\tdiscriminator: string\n\t\ttimestamps?: boolean\n\t\tvariants: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tserverFields?: readonly string[]\n\t\t\t\tcommandFields?: readonly string[]\n\t\t\t\tpublicFields?: readonly string[]\n\t\t\t}\n\t\t>\n\t},\n) {\n\tif (\n\t\t!(declared instanceof z.ZodDiscriminatedUnion) ||\n\t\tdeclared.def.discriminator !== options.discriminator\n\t)\n\t\tthrow new Error(\n\t\t\t'Variant boundaries require a discriminated union with the configured discriminator',\n\t\t)\n\tif (declared.def.checks?.length)\n\t\tthrow new Error('Variant boundaries do not support union-level refinements')\n\tconst discriminator = options.discriminator\n\tif (['_id', '_creationTime', ...TIMESTAMP_FIELDS].includes(discriminator))\n\t\tthrow new Error('Variant discriminator cannot be a reserved field')\n\tconst branches = new Map<\n\t\tstring,\n\t\t{\n\t\t\tstorage: StrictObject<FieldSchemas>\n\t\t\tdocument: StrictObject<FieldSchemas>\n\t\t\tinsert: StrictObject<FieldSchemas>\n\t\t\tupdate: StrictObject<FieldSchemas>\n\t\t\tcommand: StrictObject<FieldSchemas>\n\t\t\tcommandUpdate: StrictObject<FieldSchemas>\n\t\t\tpublic: StrictObject<FieldSchemas>\n\t\t}\n\t>()\n\tfor (const branch of declared.options) {\n\t\tif (!(branch instanceof z.ZodObject) || !(branch.def.catchall instanceof z.ZodNever))\n\t\t\tthrow new Error('Variant boundaries require strict object branches')\n\t\tif (branch.def.checks?.length)\n\t\t\tthrow new Error('Variant boundaries do not support object-level refinements')\n\t\ttry {\n\t\t\tassertDtoValidationSchema(branch, new Set(), true)\n\t\t} catch (cause) {\n\t\t\tthrow new Error(\n\t\t\t\t'Variant boundaries require supported value-preserving field validators without object catchalls',\n\t\t\t\t{ cause },\n\t\t\t)\n\t\t}\n\t\tconst tagSchema = branch.shape[discriminator]\n\t\tif (!(tagSchema instanceof z.ZodLiteral) || tagSchema.values.size !== 1)\n\t\t\tthrow new Error('Variant branches require one string literal discriminator')\n\t\tconst tag = [...tagSchema.values][0]\n\t\tif (!z.string().safeParse(tag).success)\n\t\t\tthrow new Error('Variant branches require a string discriminator')\n\t\t// SAFETY: a single literal value was checked as a string above.\n\t\tconst tagValue = tag as string\n\t\tif (branches.has(tagValue)) throw new Error(`Duplicate variant discriminator \"${tagValue}\"`)\n\t\tif (!Object.hasOwn(options.variants, tagValue))\n\t\t\tthrow new Error(`Missing variant configuration \"${tagValue}\"`)\n\t\tconst config = options.variants[tagValue]\n\t\tassertOwnedFields(branch.shape, [\n\t\t\t'_id',\n\t\t\t'_creationTime',\n\t\t\t...(options.timestamps === false ? [] : TIMESTAMP_FIELDS),\n\t\t])\n\t\tconst columns = { ...branch.shape } satisfies FieldSchemas\n\t\tif (options.timestamps) Object.assign(columns, timestampFields)\n\t\tassertFieldLists(\n\t\t\tcolumns,\n\t\t\tconfig.serverFields ?? [],\n\t\t\tconfig.commandFields ?? [],\n\t\t\tconfig.publicFields ?? [],\n\t\t\toptions.timestamps !== false,\n\t\t)\n\t\tfor (const mask of [config.serverFields, config.commandFields, config.publicFields]) {\n\t\t\tif (mask?.includes(discriminator))\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'The variant discriminator is retained automatically and cannot appear in masks',\n\t\t\t\t)\n\t\t}\n\t\tconst stored = z.strictObject(columns)\n\t\tconst insert = z.strictObject(\n\t\t\tomitFields(columns, [\n\t\t\t\t...(options.timestamps === false ? [] : TIMESTAMP_FIELDS),\n\t\t\t\t...(config.serverFields ?? []),\n\t\t\t]),\n\t\t)\n\t\tconst command = z.strictObject(\n\t\t\tpickFields(columns, [discriminator, ...(config.commandFields ?? [])]),\n\t\t)\n\t\tconst partial = (schema: StrictObject<FieldSchemas>) =>\n\t\t\tschema.partial().extend({ [discriminator]: tagSchema })\n\t\tbranches.set(tagValue, {\n\t\t\tstorage: stored,\n\t\t\tdocument: documentSchema(stored, tableName),\n\t\t\tinsert,\n\t\t\tupdate: partial(insert),\n\t\t\tcommand,\n\t\t\tcommandUpdate: partial(command),\n\t\t\tpublic: z.strictObject(pickFields(columns, [discriminator, ...(config.publicFields ?? [])])),\n\t\t})\n\t}\n\tfor (const tag of Object.keys(options.variants)) {\n\t\tif (!branches.has(tag)) throw new Error(`Unknown variant configuration \"${tag}\"`)\n\t}\n\tfunction union(mode: VariantMode, includeId = false, tool = false) {\n\t\tconst schemas = [...branches.values()].map((branch) => {\n\t\t\tconst schema = branch[mode]\n\t\t\tif (tool)\n\t\t\t\treturn z.strictObject(\n\t\t\t\t\tObject.fromEntries(\n\t\t\t\t\t\tObject.entries(schema.shape).map(([key, field]) => [key, variantToolField(field)]),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\treturn includeId ? schema.extend({ _id: zid(tableName) }) : schema\n\t\t})\n\t\tif (!schemas.length) throw new Error('Variant boundaries require at least one branch')\n\t\t// SAFETY: all entries are checked strict objects with a unique required literal tag; nonempty checked above.\n\t\treturn z.discriminatedUnion(\n\t\t\tdiscriminator,\n\t\t\tschemas as [StrictObject<FieldSchemas>, ...StrictObject<FieldSchemas>[]],\n\t\t)\n\t}\n\tconst storage = union('storage')\n\tconst schema = union('document')\n\tconst insertSchema = union('insert')\n\tconst updateSchema = union('update')\n\tconst commandInput = union('command')\n\tconst publicDto = union('public')\n\tfunction dto(includeId = false) {\n\t\treturn includeId ? union('public', true) : publicDto\n\t}\n\tfunction toPublicDto(row: z.input<StrictObject<FieldSchemas>>, includeId = false) {\n\t\tconst tag = z.string().parse(row[discriminator])\n\t\tconst branch = branches.get(tag)\n\t\tif (!branch) throw new Error(`Unknown variant discriminator \"${tag}\"`)\n\t\tconst projection = includeId ? branch.public.extend({ _id: zid(tableName) }) : branch.public\n\t\treturn projection.parse(\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.keys(projection.shape)\n\t\t\t\t\t.filter((key) => Object.hasOwn(row, key))\n\t\t\t\t\t.map((key) => [key, row[key]]),\n\t\t\t),\n\t\t)\n\t}\n\treturn {\n\t\ttableName,\n\t\tstorage,\n\t\tschema,\n\t\tinsertSchema,\n\t\tupdateSchema,\n\t\tcommandInput,\n\t\tpublicDto,\n\t\tdto,\n\t\ttoPublicDto,\n\t\ttable: defineTable(zodToConvex(storage)),\n\t\ttools: {\n\t\t\tid: z.strictObject({ id: jsonSafeZid(tableName) }),\n\t\t\tinsert: union('command', false, true),\n\t\t\tupdate: z.strictObject({\n\t\t\t\tid: jsonSafeZid(tableName),\n\t\t\t\tdata: union('commandUpdate', false, true),\n\t\t\t}),\n\t\t},\n\t}\n}\n\nfunction variantToolField(schema: z.core.$ZodType): z.ZodType {\n\tif (!(schema instanceof z.ZodType))\n\t\tthrow new Error('Variant tools require classic Zod field schemas')\n\tif (\n\t\tschema instanceof z.ZodBigInt ||\n\t\t(schema instanceof z.ZodLiteral &&\n\t\t\t[...schema.values].some((value) => z.bigint().safeParse(value).success))\n\t)\n\t\tthrow new Error(\n\t\t\t'Variant tool command fields cannot contain bigint; JSON Schema cannot represent it',\n\t\t)\n\tconst native = zodToConvex(schema)\n\tif (native.kind === 'id') {\n\t\tconst id = jsonSafeZid(native.tableName)\n\t\tif (native.isOptional === 'optional')\n\t\t\treturn id.optional().refine((value) => schema.safeParse(value).success)\n\t\treturn id.refine((value) => schema.safeParse(value).success)\n\t}\n\tif (schema instanceof z.ZodOptional)\n\t\treturn schema.clone({ ...schema.def, innerType: variantToolField(schema.unwrap()) })\n\tif (schema instanceof z.ZodNullable)\n\t\treturn schema.clone({ ...schema.def, innerType: variantToolField(schema.unwrap()) })\n\tif (schema instanceof z.ZodNonOptional)\n\t\treturn schema.clone({ ...schema.def, innerType: variantToolField(schema.unwrap()) })\n\tif (schema instanceof z.ZodArray)\n\t\treturn schema.clone({ ...schema.def, element: variantToolField(schema.element) })\n\tif (schema instanceof z.ZodObject) {\n\t\tconst fields = Object.fromEntries(\n\t\t\tObject.entries(schema.shape).map(([key, child]) => [key, variantToolField(child)]),\n\t\t)\n\t\treturn schema.clone(Object.assign({}, schema.def, { ['shape']: fields }))\n\t}\n\tif (schema instanceof z.ZodUnion)\n\t\treturn schema.clone({ ...schema.def, options: schema.options.map(variantToolField) })\n\tif (schema instanceof z.ZodRecord)\n\t\treturn schema.clone({\n\t\t\t...schema.def,\n\t\t\t// SAFETY: conversion preserves the original record key output; IDs remain strings.\n\t\t\tkeyType: variantToolField(schema.keyType) as z.core.$ZodRecordKey,\n\t\t\tvalueType: variantToolField(schema.valueType),\n\t\t})\n\tif (schema instanceof z.ZodTuple)\n\t\treturn schema.clone({\n\t\t\t...schema.def,\n\t\t\titems: schema.def.items.map(variantToolField),\n\t\t\trest: schema.def.rest ? variantToolField(schema.def.rest) : null,\n\t\t})\n\tif (schema instanceof z.ZodIntersection)\n\t\treturn schema.clone({\n\t\t\t...schema.def,\n\t\t\tleft: variantToolField(schema.def.left),\n\t\t\tright: variantToolField(schema.def.right),\n\t\t})\n\treturn schema\n}\n\ntype ZodObjectOmit<\n\tSchema extends z.ZodObject<any, any>,\n\tOmitMask extends z.util.Mask<keyof Schema['shape']>,\n> =\n\tSchema extends z.ZodObject<infer ObjectFields, infer Config>\n\t\t? z.ZodObject<\n\t\t\t\tz.util.Flatten<Omit<ObjectFields, Extract<keyof ObjectFields, keyof OmitMask>>>,\n\t\t\t\tConfig\n\t\t\t>\n\t\t: never\n\nfunction documentSchema<Fields extends FieldSchemas, Table extends string>(\n\tstorage: StrictObject<Fields>,\n\ttableName: Table,\n) {\n\treturn storage.extend({ _id: zid(tableName), _creationTime: z.number() })\n}\n\nfunction pickFields<Fields extends FieldSchemas, const Keys extends readonly FieldKey<Fields>[]>(\n\tfields: Fields,\n\tkeys: Keys,\n) {\n\t// SAFETY: each entry uses a requested key and its original validator, preserving Pick.\n\treturn Object.fromEntries(keys.map((key) => [key, fields[key]])) as Pick<Fields, Keys[number]>\n}\n\nfunction omitFields<Fields extends FieldSchemas, const Keys extends readonly FieldKey<Fields>[]>(\n\tfields: Fields,\n\tkeys: Keys,\n) {\n\tconst omitted = new Set<string>(keys)\n\t// SAFETY: filtering removes exactly the supplied keys and keeps every remaining validator.\n\treturn Object.fromEntries(Object.entries(fields).filter(([key]) => !omitted.has(key))) as Omit<\n\t\tFields,\n\t\tKeys[number]\n\t>\n}\n\ntype DtoPropertiesCheck = z.core.$ZodCheck & {\n\treadonly _zod: {\n\t\treadonly def: { readonly check: 'properties' } & Record<\n\t\t\t'shape',\n\t\t\tRecord<string, z.core.$ZodType>\n\t\t>\n\t}\n}\n\n/** Inspect Zod 4's discriminated definitions, failing closed for unsupported nodes.\n * Used by DTO extensions and opt-in variant boundaries; legacy schemas are unchanged.\n */\nfunction assertDtoValidationSchema(\n\tschema: z.core.$ZodType,\n\tseen = new Set<z.core.$ZodType>(),\n\tallowNativeIds = false,\n): void {\n\tif (seen.has(schema)) return\n\tseen.add(schema)\n\t// SAFETY: Zod 4 exposes its built-in schema definitions as this discriminated union.\n\tconst def = (schema as z.core.$ZodTypes)._zod.def\n\tconst reject = () => {\n\t\tthrow new Error('DTO extensions require supported value-preserving validation schemas')\n\t}\n\tif ('coerce' in def && def.coerce) reject()\n\tif ('normalize' in def && def.normalize) reject()\n\tconst visit = (child: z.core.$ZodType) => assertDtoValidationSchema(child, seen, allowNativeIds)\n\tfor (const check of def.checks ?? []) {\n\t\tif (check._zod.def.check === 'overwrite') reject()\n\t\tif ('normalize' in check._zod.def && check._zod.def.normalize) reject()\n\t\tif (check._zod.def.check === 'property') {\n\t\t\t// SAFETY: the property discriminator owns this embedded schema in Zod 4.\n\t\t\tvisit((check as z.core.$ZodCheckProperty)._zod.def.schema)\n\t\t}\n\t\tif (check._zod.def.check === 'properties') {\n\t\t\t// SAFETY: the properties discriminator owns this schema shape in Zod 4.\n\t\t\tfor (const child of Object.values((check as DtoPropertiesCheck)._zod.def.shape)) {\n\t\t\t\tvisit(child)\n\t\t\t}\n\t\t}\n\t}\n\tswitch (def.type) {\n\t\tcase 'custom':\n\t\t\tif (allowNativeIds && zodToConvex(schema).kind === 'id') return\n\t\t\treject()\n\t\t\treturn\n\t\tcase 'string':\n\t\tcase 'number':\n\t\tcase 'boolean':\n\t\tcase 'bigint':\n\t\tcase 'date':\n\t\tcase 'symbol':\n\t\tcase 'null':\n\t\tcase 'undefined':\n\t\tcase 'void':\n\t\tcase 'never':\n\t\tcase 'literal':\n\t\tcase 'enum':\n\t\t\treturn\n\t\tcase 'object':\n\t\t\tif (allowNativeIds && def.catchall && def.catchall._zod.def.type !== 'never')\n\t\t\t\tthrow new Error('Variant fields cannot use object catchalls; use a record field instead')\n\t\t\tfor (const child of Object.values(def.shape)) visit(child)\n\t\t\tif (def.catchall) visit(def.catchall)\n\t\t\treturn\n\t\tcase 'array':\n\t\t\tvisit(def.element)\n\t\t\treturn\n\t\tcase 'optional':\n\t\tcase 'nullable':\n\t\tcase 'nonoptional':\n\t\t\tvisit(def.innerType)\n\t\t\treturn\n\t\tcase 'union':\n\t\t\tfor (const child of def.options) visit(child)\n\t\t\treturn\n\t\tcase 'intersection':\n\t\t\tvisit(def.left)\n\t\t\tvisit(def.right)\n\t\t\treturn\n\t\tcase 'tuple':\n\t\t\tfor (const child of def.items) visit(child)\n\t\t\tif (def.rest) visit(def.rest)\n\t\t\treturn\n\t\tcase 'record':\n\t\t\tvisit(def.keyType)\n\t\t\tvisit(def.valueType)\n\t\t\treturn\n\t\tdefault:\n\t\t\treject()\n\t}\n}\n\nfunction assertOwnedFields(fields: FieldSchemas, reserved: readonly string[]): void {\n\tfor (const key of reserved) {\n\t\tif (Object.hasOwn(fields, key))\n\t\t\tthrow new Error(`Reserved table field \"${key}\" cannot be declared`)\n\t}\n}\n\nfunction assertFieldLists(\n\tfields: FieldSchemas,\n\tserver: readonly string[],\n\tcommand: readonly string[],\n\tpublicKeys: readonly string[],\n\tmanagedTimestamps = true,\n): void {\n\tfor (const key of [...server, ...command, ...publicKeys]) {\n\t\tif (!Object.hasOwn(fields, key)) throw new Error(`Unknown table field \"${key}\"`)\n\t}\n\tconst managed = new Set<string>([...(managedTimestamps ? TIMESTAMP_FIELDS : []), ...server])\n\tfor (const key of command) {\n\t\tif (managed.has(key)) throw new Error(`Server-owned field \"${key}\" cannot be a command input`)\n\t}\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cvx-kit",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"description": "Reusable Convex application kit: foundation kernels, approvals component, zod table boundaries, WorkOS-backed auth function constructors, and audited command protocol.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"component",
|