cvx-kit 0.1.17 → 0.1.18

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.
@@ -39,19 +39,22 @@ type Native<T extends RelationTable, K extends keyof Fields<T>> = ConvexValidato
39
39
  declare const fieldBrand: unique symbol;
40
40
  declare const edgeBrand: unique symbol;
41
41
  type Comparable<Value> = Exclude<Value, null | undefined>;
42
+ type IdMembers<Value, Registered extends string> = [Comparable<Value>] extends [never] ? never : [Comparable<Value>] extends [GenericId<string>] ? Extract<Comparable<Value>, GenericId<string>>['__tableName'] & Registered : never;
42
43
  type Same<A, B> = [Comparable<A> | Comparable<B>] extends [never] ? false : [Comparable<A>] extends [Comparable<B>] ? [Comparable<B>] extends [Comparable<A>] ? true : false : false;
43
- export interface FieldReference<Table extends string, Field extends string, Value, Scope extends string = never> {
44
+ export interface FieldReference<Table extends string, Field extends string, Value, Scope extends string = never, Registered extends string = string, Member extends string = never> {
44
45
  readonly guard?: RelationGuard<Scope>;
45
46
  readonly [fieldBrand]: Value;
46
47
  readonly table: Table;
47
48
  readonly field: Field;
48
- through<J extends AnyField>(junction: J & (Same<Value, J[typeof fieldBrand]> extends true ? {} : never)): ThroughReference<Table, Field, Value, J, Scope>;
49
+ /** Select a registered native-ID member, retaining this field's nullish wrappers. */
50
+ forTable<const T extends ([Scope] extends [never] ? IdMembers<Value, Registered> : never)>(table: T): FieldReference<Table, Field, Extract<Value, GenericId<T> | null | undefined>, Scope, Registered, T>;
51
+ through<J extends AnyField>(junction: J & ([Member] extends [never] ? {} : never) & (J extends FieldReference<string, string, any, any, any, infer M> ? [M] extends [never] ? {} : never : never) & (Same<Value, J[typeof fieldBrand]> extends true ? {} : never)): ThroughReference<Table, Field, Value, J, Scope>;
49
52
  }
50
53
  export interface RelationGuard<Tag extends string = string> {
51
54
  readonly discriminator: string;
52
55
  readonly tag: Tag;
53
56
  }
54
- type AnyField = FieldReference<string, string, any, any>;
57
+ type AnyField = FieldReference<string, string, any, any, any, any>;
55
58
  export interface ThroughReference<Table extends string, Field extends string, Value, Junction extends AnyField, Scope extends string = never> {
56
59
  readonly base: FieldReference<Table, Field, Value, Scope>;
57
60
  readonly junction: Junction;
@@ -65,6 +68,8 @@ export interface RelationEdge<Source extends string, Target extends string, Card
65
68
  readonly sourceGuard?: RelationGuard<SourceScope>;
66
69
  readonly targetGuard?: RelationGuard<TargetScope>;
67
70
  readonly junctionGuard?: RelationGuard;
71
+ readonly sourceMember?: RelationMember;
72
+ readonly targetMember?: RelationMember;
68
73
  readonly [edgeBrand]: true;
69
74
  readonly source: Source;
70
75
  readonly target: Target;
@@ -72,8 +77,11 @@ export interface RelationEdge<Source extends string, Target extends string, Card
72
77
  readonly from: Leg;
73
78
  readonly to: Leg;
74
79
  }
80
+ interface RelationMember {
81
+ readonly table: string;
82
+ }
75
83
  type AnyEdge = RelationEdge<string, string, 'one' | 'many', any, any>;
76
- type FieldReferences<Tables extends RelationTables> = { [T in keyof Tables]: { [K in Extract<keyof Fields<Tables[T]>, string>]: FieldReference<Extract<T, string>, K, Native<Tables[T], K>>; }; };
84
+ type FieldReferences<Tables extends RelationTables> = { [T in keyof Tables]: { [K in Extract<keyof Fields<Tables[T]>, string>]: FieldReference<Extract<T, string>, K, Native<Tables[T], K>, never, Extract<keyof Tables, string>>; }; };
77
85
  export type BranchBuilder<Tables extends RelationTables> = <const T extends keyof Tables & string, const Tag extends Tags<Tables[T]>>(table: T, tag: Tag) => { [K in keyof BranchFields<Tables[T], Tag> & string]: FieldReference<T, K, ConvexValidatorFromZod<Extract<BranchFields<Tables[T], Tag>[K], z.ZodType>, 'required'>['type'], Tag>; };
78
86
  type Scope<L extends Leg> = NonNullable<Base<L>['guard']>['tag'];
79
87
  type AllReferences<Tables extends RelationTables> = { [T in keyof Tables]: FieldReferences<Tables>[T][Extract<keyof FieldReferences<Tables>[T], string>]; }[keyof Tables];
@@ -1,2 +1,2 @@
1
- import{nativePagination as e,relationFilterSchema as t,scalarPredicateSchema as n}from"./querying/filters.mjs";import{paginated as r}from"./zod-table.mjs";import{convexToZod as i,zodToConvex as a}from"convex-helpers/server/zod4";import{z as o}from"zod";import{v as s}from"convex/values";const c=Symbol(`relationField`),l=Symbol(`relationEdge`),u=/* @__PURE__ */ new WeakMap,d=/* @__PURE__ */ new WeakMap,f=/* @__PURE__ */ new WeakMap,p=/* @__PURE__ */ new WeakSet,m=/* @__PURE__ */ new WeakSet,h=o.object({indexes:o.array(o.object({indexDescriptor:o.string(),fields:o.array(o.string())}))});function g(n,i){let s={},l=/* @__PURE__ */ new Set,g=/* @__PURE__ */ new Map,_={},v={},y={};for(let[e,t]of Object.entries(n)){if(t.tableName!==e||[`one`,`many`,`__proto__`,`constructor`,`prototype`].includes(e))throw Error(`Invalid relation table "${e}"`);let n=t.dto(!0);if(!(n instanceof o.ZodObject)&&!(n instanceof o.ZodDiscriminatedUnion))throw Error(`Expected object or discriminated union DTO`);let r=B(n),i=N(t.table);I(i.documentType);let u=j(e,t.schema,n,i.documentType),d=h.parse(i).indexes.map(e=>({name:e.indexDescriptor,fields:[...e.fields]})).sort((e,t)=>e.name.localeCompare(t.name));I(P(a(n))),s[e]={...u,indexes:d,dto:n,assertUnchanged:r};let m=(t,n)=>{let r=Object.create(null);for(let[i,a]of Object.entries(t)){let t={[c]:void 0,table:e,field:i,guard:n,through(e){let n=f.get(e);if(!l.has(e)||!n||!w(a,n))throw Error(`Invalid junction field or registry`);let r=Object.freeze({base:t,junction:e});return p.add(r),r}};f.set(t,a),l.add(t),r[i]=Object.freeze(t)}return Object.freeze(r)};if(_[e]=m(u.fields),u.branches)for(let[t,n]of Object.entries(u.branches.options))g.set(JSON.stringify([e,t]),m(n.fields,Object.freeze({discriminator:u.branches.discriminator,tag:t})));v[e]=t=>S(e,`one`,t,l),y[e]=t=>S(e,`many`,t,l)}let C=i(Object.freeze({..._,one:Object.freeze(v),many:Object.freeze(y)}),((e,t)=>{let n=g.get(JSON.stringify([e,t]));if(!n)throw Error(`Unknown variant scope "${e}.${t}"`);return n})),T=Object.fromEntries(Object.entries(C).map(([e,t])=>[e,Object.freeze({...t})]));Object.freeze(T);for(let[e,t]of Object.entries(T)){if(!Object.hasOwn(n,e))throw Error(`Unknown source table "${e}"`);for(let[n,r]of Object.entries(t)){if(s[e].allFields.has(n)||s[e].branches&&[`variant`,`variants`].includes(n)||[`and`,`or`,`not`,`fields`,`then`,`__proto__`,`constructor`,`prototype`].includes(n))throw Error(`Relation name collision "${n}"`);if(!m.has(r)||!l.has(x(r.from))||!l.has(x(r.to))||r.source!==e)throw Error(`Relation source bucket mismatch`);E(r,s)}}let D={metadata:s,declarations:T},M={};for(let i of Object.keys(n))M[i]={paginationOpts(n){return W(D),b(n),K(e.extend({filters:t(k(D,i,n)).optional(),order:o.enum([`asc`,`desc`]).optional()}),()=>W(D))},pageDto(e){return W(D),b(e),K(r(A(D,i,e)).result,()=>W(D))}};let L=JSON.stringify([2,Object.entries(s).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Object.entries(t.fields).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t.isOptional,P(t)]),t.branches?[t.branches.discriminator,Object.entries(t.branches.options).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Object.entries(t.fields).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t.isOptional,P(t)])])]:null,t.indexes,F(P(a(t.dto)))]),Object.entries(T).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t.cardinality,t.target,O(t.from),O(t.to)])])]),R=Object.freeze({identity:L,version:1,tables:Object.freeze(M)});u.set(R,Y(D));let z=Object.freeze({...n}),V=Object.fromEntries(Object.entries(z).map(([e,t])=>{let n=U(t.schema,`stored`),r=U(t.publicDto,`dto`),i=t.table.validator,a=i.isOptional,o=JSON.stringify(N(t.table));return[e,()=>{if(n(),r(),t.table.validator!==i||i.isOptional!==a||JSON.stringify(N(t.table))!==o)throw Error(`Native schema mutated after registry construction: ${e}`)}]}));for(let[e,t]of Object.entries(s)){if(!t.branches)continue;let n=t.assertUnchanged;t.assertUnchanged=()=>{n(),V[e]()}}return d.set(R,{internal:D,tables:z,assertStoredUnchanged:()=>{for(let e of Object.values(V))e()},assertNativeTable(e,t){if(!Object.hasOwn(z,e)||z[e].table!==t)throw Error(`Native schema/table ownership disagrees with relation registry`);V[e]()}}),R}function _(a){let c=d.get(a);if(!c)throw Error(`Unknown relation registry`);let l=()=>{W(c.internal),c.assertStoredUnchanged()},u=e=>{l();let t=Object.keys(c.tables);if(t.length!==Object.keys(e).length||t.some(t=>e[t]!==c.tables[t].table))throw Error(`Native schema/table ownership disagrees with relation registry`)};l();let f=/* @__PURE__ */ new WeakMap;function p(e,t){l();let n=c.internal.metadata[e];if(!n)throw Error(`Unknown query table`);if(!n.branches)return;let r=o.string().safeParse(t[n.branches.discriminator]),a=r.success&&Object.hasOwn(n.branches.options,r.data)?n.branches.options[r.data]:void 0;if(!a)throw Error(`Invalid variant document`);let u=Object.fromEntries(Object.keys(a.fields).filter(e=>Object.hasOwn(t,e)).map(e=>[e,t[e]])),d=f.get(a);d||(d=i(s.object(a.fields)),f.set(a,d)),d.parse(u)}return Object.freeze({assertUnchanged:l,validateDocument:p,assertNativeTable:c.assertNativeTable,assertSchema:u,pagination(r){l();let i=c.internal,a=/* @__PURE__ */ new Map;function s(e,t,r){let o=i.metadata[e];if(!o)throw Error(`Unknown query table`);let c=JSON.stringify([e,r??null]),l=a.get(c);if(!l){l={};for(let[e,t]of Object.entries(r===void 0?o.fields:o.branches.options[r].fields))y(t)&&(l[e]=n(t).optional());a.set(c,l)}return{fields:l,variants:o.branches&&r===void 0&&t<4?{discriminator:o.branches.discriminator,options:Object.fromEntries(Object.keys(o.branches.options).map(n=>[n,s(e,t+1,n)]))}:void 0,relations:t>=4?{}:Object.fromEntries(Object.entries(i.declarations[e]??{}).map(([e,n])=>[e,{cardinality:n.cardinality,target:s(n.target,t+1)}]))}}return e.extend({filters:t(s(r,0)).optional(),order:o.enum([`asc`,`desc`]).optional()})},page(e,t){return l(),b(t),r(A(c.internal,e,t)).result},project(e,t,n,r){if(u(e),!r())return null;let i=c.internal.metadata[t];if(!i)throw Error(`Unknown query table`);let a=i.branches?i.branches.options[String(n[i.branches.discriminator])]:void 0;if(i.branches&&!a)throw Error(`Invalid variant document`);let s=a?.dto??i.dto;if(!(s instanceof o.ZodObject))throw Error(`Invalid variant DTO`);return p(t,n),s.parse(Object.fromEntries(Object.keys(s.shape).filter(e=>Object.hasOwn(n,e)).map(e=>[e,n[e]])))}})}function v(e){let t=u.get(e);if(!t)throw Error(`Unknown relation registry`);return t}function y(e){return[`id`,`string`,`float64`,`int64`,`boolean`,`null`,`literal`].includes(e.kind)||e.kind===`union`&&e.members.every(y)}function b(e){let t=[{value:e,depth:0,ancestors:[]}],n=0;for(;t.length;){let{value:e,depth:r,ancestors:i}=t.pop();if(++n>256||r>4||i.includes(e))throw Error(`Selection cycle or depth/node budget exceeded`);let a=Object.getPrototypeOf(e);if(a!==Object.prototype&&a!==null)throw Error(`Invalid selection`);let o=Reflect.ownKeys(e);if(o.length+n+t.length>256)throw Error(`Selection node budget exceeded`);for(let a of o){let o=Object.getOwnPropertyDescriptor(e,a);if(!o.enumerable||!(`value`in o)||String(a)!==a)throw Error(`Invalid selection property`);if(o.value!==!0)t.push({value:o.value,depth:r+1,ancestors:[...i,e]});else if(++n>256)throw Error(`Selection node budget exceeded`)}}}function x(e){return`base`in e?e.base:e}function S(e,t,n,r){for(let e of[n.from,n.to])if(!r.has(x(e))||`base`in e&&(!p.has(e)||!r.has(e.junction)))throw Error(`Foreign registry or invalid field reference`);if(x(n.to).table!==e)throw Error(`Wrong relation target table`);let i=Object.freeze({[l]:!0,source:x(n.from).table,target:e,cardinality:t,from:n.from,to:n.to,sourceGuard:x(n.from).guard,targetGuard:x(n.to).guard,junctionGuard:C(n.from,n.to)});return m.add(i),i}function C(e,t){let n=`base`in e?e.junction.guard:void 0,r=`base`in t?t.junction.guard:void 0;if(n&&r&&(n.discriminator!==r.discriminator||n.tag!==r.tag))throw Error(`Contradictory junction scopes`);return n??r}function w(e,t){let n=T(e);return n.length>0&&JSON.stringify(n)===JSON.stringify(T(t))}function T(e){if(e.kind===`union`)return[...new Set(e.members.flatMap(T))].sort();if(e.kind===`null`)return[];if(![`id`,`string`,`float64`,`int64`,`boolean`,`literal`].includes(e.kind))throw Error(`Unsupported relation field kind`);return[JSON.stringify(P(e))]}function E(e,t){let n=e.from,r=e.to;if(`base`in n!=`base`in r)throw Error(`Both relation legs must use through`);if(`base`in n&&`base`in r){if(n.junction.table!==r.junction.table)throw Error(`Different junction tables`);D(t,n.junction.table,n.junction.field,e.junctionGuard),D(t,e.target,r.base.field,e.targetGuard);return}if(!w(f.get(x(n)),f.get(x(r))))throw Error(`Incompatible relation field types`);D(t,e.target,x(r).field,e.targetGuard)}function D(e,t,n,r){if(n!==`_id`&&!e[t].indexes.some(e=>{let t=e.fields.indexOf(n);return t>=0&&e.fields.slice(0,t).every(e=>e===r?.discriminator)}))throw Error(`No active index begins with or has a guarded prefix for "${t}.${n}"`)}function O(e){return`base`in e?[e.base.table,e.base.field,e.base.guard??null,e.junction.table,e.junction.field,e.junction.guard??null]:[e.table,e.field,e.guard??null]}function k(e,t,r,i=0,a){let o={},s={},c=e.metadata[t],l={};for(let[u,d]of Object.entries(r)){if(u===`variants`&&d!==!0&&c.branches&&a===void 0){if(i>=4)throw Error(`Invalid variant selection`);for(let[n,a]of Object.entries(d)){if(!Object.hasOwn(c.branches.options,n)||a===!0)throw Error(`Unknown variant filter selection`);l[n]=k(e,t,{...Object.fromEntries(Object.entries(r).filter(([e])=>e!==`variants`)),...a},i+1,n)}continue}let f=(a===void 0?c.fields:c.branches.options[a].fields)[u],p=e.declarations[t]?.[u];if(d===!0&&f)o[u]=n(f).optional();else if(d!==!0&&p&&i<4)s[u]={cardinality:p.cardinality,target:k(e,p.target,d,i+1)};else throw Error(`Invalid relation filter selection "${t}.${u}"`)}return{fields:o,relations:s,variants:c.branches&&a===void 0?{discriminator:c.branches.discriminator,options:l}:void 0}}function A(e,t,n,i=0){let a={};for(let[s,c]of Object.entries(n)){let n=e.declarations[t]?.[s];if(!n||i>=4)throw Error(`Unknown or too deep relation "${t}.${s}"`);let l=c===!0?e.metadata[n.target].dto:A(e,n.target,c,i+1);if(n.targetGuard){if(!(l instanceof o.ZodDiscriminatedUnion))throw Error(`Invalid target scope`);l=l.options.find(e=>e.shape[n.targetGuard.discriminator]instanceof o.ZodLiteral&&e.shape[n.targetGuard.discriminator].value===n.targetGuard.tag)}a[s]=n.cardinality===`one`?l.nullable():r(l).result}let s=e.metadata[t];function c(n,r){let i={...a};for(let n of Object.keys(i)){let a=e.declarations[t][n];a.sourceGuard&&r!==a.sourceGuard.tag&&a.cardinality===`one`&&(i[n]=o.null())}return K(n.extend(i).strict(),()=>W(e))}if(s.branches){let t=Object.entries(s.branches.options).map(([e,t])=>c(t.dto,e));return J(o.discriminatedUnion(s.branches.discriminator,[t[0],...t.slice(1)]),()=>W(e))}if(!(s.dto instanceof o.ZodObject))throw Error(`Expected object DTO`);return c(s.dto)}function j(e,t,n,r){if(t instanceof o.ZodObject&&n instanceof o.ZodObject){let n=a(t).fields;return L(e,n,r),{fields:n,allFields:new Set(Object.keys(n))}}if(!(t instanceof o.ZodDiscriminatedUnion)||!(n instanceof o.ZodDiscriminatedUnion))throw Error(`Expected matching discriminated union boundaries "${e}"`);let i=t._zod.def.discriminator;if(n._zod.def.discriminator!==i)throw Error(`DTO discriminator mismatch`);function c(e){let t=Object.create(null);for(let n of e.options){if(!(n instanceof o.ZodObject))throw Error(`Variant branches must be objects`);let e=n.shape[i];if(!(e instanceof o.ZodLiteral)||e.values.size!==1)throw Error(`Variant tags must be unique required string literals`);let r=o.string().safeParse(e.value);if(!r.success||Object.hasOwn(t,r.data))throw Error(`Variant tags must be unique required string literals`);t[r.data]=n}if(Object.keys(t).length===0)throw Error(`Expected at least one variant branch`);return t}let l=c(t),u=c(n);if(Object.keys(l).sort().join(`\0`)!==Object.keys(u).sort().join(`\0`))throw Error(`DTO variant tags mismatch`);let d={discriminator:i,options:Object.create(null)},f=[];for(let[t,n]of Object.entries(l)){let r=a(n).fields,{_id:i,_creationTime:o,...c}=r;L(e,r,P(s.object(c))),f.push(s.object(c)),d.options[t]={fields:r,dto:u[t]}}if(F(r)!==F(P(s.union(...f))))throw Error(`Native stored document disagrees with boundary "${e}"`);let p=Object.values(d.options).map(e=>e.fields),m={};for(let e of Object.keys(p[0])){if(!p.every(t=>Object.hasOwn(t,e))||e!==i&&!p.every(t=>M(t[e],p[0][e])))continue;let t=p.map(t=>t[e]),n=s.union(...t);m[e]=t.some(e=>e.isOptional===`optional`)?s.optional(n):n}return{fields:m,branches:d,allFields:new Set(p.flatMap(e=>Object.keys(e)))}}function M(e,t){try{return w(e,t)}catch{return F(P(e))===F(P(t))}}function N(e){return e.export()}function P(e){return e.json}function F(e){if(Array.isArray(e))return`[${e.map(F).join(`,`)}]`;if(e!==null&&Object(e)===e){let t=e;return`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${F(t[e])}`).join(`,`)}}`}return JSON.stringify(e)}function I(e){if(e===null||Object(e)!==e)return;let t=e;if(t.type===`any`)throw Error(`Unsupported native validation form`);for(let e of Object.values(t))I(e)}function L(e,t,n){let{_id:r,_creationTime:i,...a}=t;if(!r||!i||F(P(r))!==F(P(s.id(e)))||F(P(i))!==F(P(s.number()))||r.isOptional!==`required`||i.isOptional!==`required`||F(n)!==F(P(s.object(a))))throw Error(`Native stored document disagrees with boundary "${e}"`)}const R=o.object({field:o.string()}),z=new Set([R,R.pick({field:!0}),R.omit({field:!0}),R.extend({other:o.string()}),R.safeExtend({other:o.string()}),R.merge(o.object({other:o.string()})),R.partial(),R.required()].flatMap(e=>{let t=Object.getOwnPropertyDescriptor(e._zod.def,`shape`)?.get;return t?[Function.prototype.toString.call(t)]:[]}));function B(e){return U(e,`dto`)}const V=Function.prototype.toString.call(Object.getOwnPropertyDescriptor(o.string().default(``)._zod.def,`defaultValue`).get),H=Function.prototype.toString.call(Object.getOwnPropertyDescriptor(o.string().prefault(``)._zod.def,`defaultValue`).get);function U(e,t){let n=[],r=/* @__PURE__ */ new Set,i=[],a=/* @__PURE__ */ new Set,s=/* @__PURE__ */ new Set,c=[];function l(e,u){if(s.has(e))throw Error(`Unsupported cyclic DTO schema`);if(!a.has(e)){if(u>32||n.length>=4096)throw Error(`DTO schema graph budget exceeded`);a.add(e),s.add(e);try{if(e instanceof RegExp&&i.push({expression:e,source:e.source,flags:e.flags}),e instanceof o.core.$ZodCheck&&`check`in e._zod.def){if(t===`dto`&&e._zod.def.check===`overwrite`)throw Error(`Unsupported DTO overwrite check`);l(e._zod.def,u+1),n.push({object:e._zod,exactKeys:!1,keys:[`def`,`check`],values:[`def`,`check`].map(t=>Object.getOwnPropertyDescriptor(e._zod,t))});return}if(e instanceof o.core.$ZodType){let i=e._zod.def;if(t===`dto`&&(![`object`,`array`,`optional`,`nullable`,`nonoptional`,`union`,`intersection`,`tuple`,`record`,`string`,`number`,`boolean`,`bigint`,`null`,`never`,`literal`,`enum`].includes(i.type)||`coerce`in i&&i.coerce))throw Error(`Unsupported DTO schema "${i.type}"`);if(t===`stored`&&(i.type==="default"||i.type===`prefault`)){let e=Object.getOwnPropertyDescriptor(i,`defaultValue`);if(e?.get){if(e.set||Function.prototype.toString.call(e.get)!==(i.type==="default"?V:H))throw Error(`Unsupported stored schema accessor`);r.add(i)}}if(e instanceof o.ZodUnion&&(l(e.options,u+1),n.push({object:e,exactKeys:!1,keys:[`options`],values:[Object.getOwnPropertyDescriptor(e,`options`)]})),i.type===`object`){let t=Object.getOwnPropertyDescriptor(i,`shape`);if(t?.get){if(t.set||!z.has(Function.prototype.toString.call(t.get)))throw Error(`Unsupported DTO schema accessor`);let e=i.shape;l(e,u+1),Object.getOwnPropertyDescriptor(i,`shape`)?.get&&c.push({definition:i,fields:e})}if(e instanceof o.ZodObject){let t=Object.getOwnPropertyDescriptor(e,`shape`);if(t&&!(`value`in t))throw Error(`Unsupported DTO schema accessor`);l(e.shape,u+1)}}l(i,u+1),n.push({object:e._zod,exactKeys:!1,keys:[`def`],values:[Object.getOwnPropertyDescriptor(e._zod,`def`)]});return}let a=Reflect.ownKeys(e),s=a.map(t=>Object.getOwnPropertyDescriptor(e,t));if(s.some((t,n)=>!(`value`in t)&&!c.some(({definition:t})=>t===e&&a[n]===`shape`)&&!(r.has(e)&&a[n]===`defaultValue`)))throw Error(`Unsupported DTO schema accessor`);n.push({object:e,exactKeys:!0,keys:a,values:s});for(let e of s)e.value!==null&&Object(e.value)===e.value&&!(e.value instanceof Function)&&l(e.value,u+1)}finally{s.delete(e)}}}return l(e,0),()=>{for(let e of i)if(e.expression.source!==e.source||e.expression.flags!==e.flags)throw Error(`DTO schema mutated after registry construction`);for(let e of n){let t=e.keys;if(e.exactKeys&&Reflect.ownKeys(e.object).length!==t.length)throw Error(`DTO schema mutated after registry construction`);for(let n=0;n<t.length;n++){if(e.object instanceof RegExp&&t[n]===`lastIndex`)continue;let r=Object.getOwnPropertyDescriptor(e.object,t[n]),i=e.values[n];if(!r||r.value!==i.value||r.get!==i.get||r.set!==i.set||r.enumerable!==i.enumerable)throw Error(`DTO schema mutated after registry construction`)}}for(let{definition:e,fields:t}of c){let n=e.shape,r=Reflect.ownKeys(t);if(Reflect.ownKeys(n).length!==r.length||r.some(e=>Object.getOwnPropertyDescriptor(n,e)?.value!==Object.getOwnPropertyDescriptor(t,e)?.value))throw Error(`DTO schema mutated after registry construction`)}}}function W(e){for(let t of Object.values(e.metadata))t.assertUnchanged()}const G=o.core.$constructor(`GuardedDtoObject`,(e,t)=>{let n=t;o.ZodObject.init(e,t),e._zod.deferred??=[],e._zod.deferred.push(()=>{let t=e._zod.run;e._zod.run=(e,r)=>{try{n.assertUnchanged()}catch{return e.issues.push({code:`custom`,input:e.value,message:`DTO schema mutated after registry construction`}),e}return t(e,r)}})});function K(e,t){let n=e.shape,r={...e._zod.def,assertUnchanged:t};return Object.defineProperty(r,"shape",{enumerable:!0,configurable:!0,get:()=>(t(),n)}),new G(r)}const q=o.core.$constructor(`GuardedDtoUnion`,(e,t)=>{let n=t;o.ZodDiscriminatedUnion.init(e,t),e._zod.deferred??=[],e._zod.deferred.push(()=>{let t=e._zod.run;e._zod.run=(e,r)=>{try{n.assertUnchanged()}catch{return e.issues.push({code:`custom`,input:e.value,message:`DTO schema mutated after registry construction`}),e}return t(e,r)}})});function J(e,t){let n=e.options,r={...e._zod.def,assertUnchanged:t};return Object.defineProperty(r,"options",{enumerable:!0,configurable:!0,get:()=>(t(),n)}),new q(r)}function Y(e){let t={};for(let[n,r]of Object.entries(e.metadata)){let e={};for(let[t,n]of Object.entries(r.fields))e[t]=Object.freeze({kind:n.kind,optional:n.isOptional===`optional`,nullable:X(n),idTables:Object.freeze(Z(n)),native:Q(P(n))});t[n]=Object.freeze({fields:Object.freeze(e),variant:r.branches?Object.freeze({discriminator:r.branches.discriminator,tags:Object.freeze(Object.keys(r.branches.options))}):void 0,indexes:Object.freeze(r.indexes.map(e=>Object.freeze({name:e.name,fields:Object.freeze([...e.fields])})))})}return Object.freeze({tables:Object.freeze(t),declarations:e.declarations})}function X(e){return e.kind===`null`||e.kind===`union`&&e.members.some(X)}function Z(e){return e.kind===`id`?[e.tableName]:e.kind===`union`?[...new Set(e.members.flatMap(Z))].sort():[]}function Q(e){let t=structuredClone(e),n=[t];for(;n.length;){let e=n.pop();if(Object(e)!==e)continue;let t=e;Object.freeze(t),n.push(...Object.values(t))}return t}export{g as defineRelations,_ as getRelationExecutor,v as getRelationMetadata};
1
+ import{nativePagination as e,relationFilterSchema as t,scalarPredicateSchema as n}from"./querying/filters.mjs";import{paginated as r}from"./zod-table.mjs";import{convexToZod as i,zodToConvex as a}from"convex-helpers/server/zod4";import{z as o}from"zod";import{v as s}from"convex/values";const c=Symbol(`relationField`),l=Symbol(`relationEdge`),u=/* @__PURE__ */ new WeakMap,d=/* @__PURE__ */ new WeakMap,f=/* @__PURE__ */ new WeakMap,p=/* @__PURE__ */ new WeakMap,m=/* @__PURE__ */ new WeakSet,h=/* @__PURE__ */ new WeakSet,g=o.object({indexes:o.array(o.object({indexDescriptor:o.string(),fields:o.array(o.string())}))});function _(n,i){let l={},_=/* @__PURE__ */ new Set,v=/* @__PURE__ */ new Map,y={},b={},w={};for(let[e,t]of Object.entries(n)){if(t.tableName!==e||[`one`,`many`,`__proto__`,`constructor`,`prototype`].includes(e))throw Error(`Invalid relation table "${e}"`);let n=t.dto(!0);if(!(n instanceof o.ZodObject)&&!(n instanceof o.ZodDiscriminatedUnion))throw Error(`Expected object or discriminated union DTO`);let r=H(n),i=F(t.table);R(i.documentType);let u=N(e,t.schema,n,i.documentType),d=g.parse(i).indexes.map(e=>({name:e.indexDescriptor,fields:[...e.fields]})).sort((e,t)=>e.name.localeCompare(t.name));R(I(a(n))),l[e]={...u,indexes:d,dto:n,assertUnchanged:r};let h=(t,n)=>{let r=Object.create(null);function i(t,r,a){let o={[c]:void 0,table:e,field:t,guard:n,forTable(e){if(n)throw Error(`forTable on branch-scoped fields is unsupported`);if(!T(r)?.includes(e))throw Error(`Invalid native ID member selection`);if(!Object.hasOwn(l,e))throw Error(`Native ID member table is not registered`);let a=Q(r)?s.union(s.id(e),s.null()):s.id(e);return i(t,r.isOptional===`optional`?s.optional(a):a,Object.freeze({table:e}))},through(e){if(a||p.has(e))throw Error(`forTable with through is unsupported`);let t=f.get(e);if(!_.has(e)||!t||!E(r,t))throw Error(`Invalid junction field or registry`);let n=Object.freeze({base:o,junction:e});return m.add(n),n}};return f.set(o,r),a&&p.set(o,a),_.add(o),Object.freeze(o)}for(let[e,n]of Object.entries(t))r[e]=i(e,n);return Object.freeze(r)};if(y[e]=h(u.fields),u.branches)for(let[t,n]of Object.entries(u.branches.options))v.set(JSON.stringify([e,t]),h(n.fields,Object.freeze({discriminator:u.branches.discriminator,tag:t})));b[e]=t=>C(e,`one`,t,_),w[e]=t=>C(e,`many`,t,_)}let D=i(Object.freeze({...y,one:Object.freeze(b),many:Object.freeze(w)}),((e,t)=>{let n=v.get(JSON.stringify([e,t]));if(!n)throw Error(`Unknown variant scope "${e}.${t}"`);return n})),k=Object.fromEntries(Object.entries(D).map(([e,t])=>[e,Object.freeze({...t})]));Object.freeze(k);for(let[e,t]of Object.entries(k)){if(!Object.hasOwn(n,e))throw Error(`Unknown source table "${e}"`);for(let[n,r]of Object.entries(t)){if(l[e].allFields.has(n)||l[e].branches&&[`variant`,`variants`].includes(n)||[`and`,`or`,`not`,`fields`,`then`,`__proto__`,`constructor`,`prototype`].includes(n))throw Error(`Relation name collision "${n}"`);if(!h.has(r)||!_.has(S(r.from))||!_.has(S(r.to))||r.source!==e)throw Error(`Relation source bucket mismatch`);O(r,l)}}let P={metadata:l,declarations:k},z={};for(let i of Object.keys(n))z[i]={paginationOpts(n){return K(P),x(n),J(e.extend({filters:t(j(P,i,n)).optional(),order:o.enum([`asc`,`desc`]).optional()}),()=>K(P))},pageDto(e){return K(P),x(e),J(r(M(P,i,e)).result,()=>K(P))}};let B=JSON.stringify([2,Object.entries(l).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Object.entries(t.fields).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t.isOptional,I(t)]),t.branches?[t.branches.discriminator,Object.entries(t.branches.options).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Object.entries(t.fields).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t.isOptional,I(t)])])]:null,t.indexes,L(I(a(t.dto)))]),Object.entries(k).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t.cardinality,t.target,A(t.from),A(t.to)])])]),V=Object.freeze({identity:B,version:1,tables:Object.freeze(z)});u.set(V,Z(P));let U=Object.freeze({...n}),W=Object.fromEntries(Object.entries(U).map(([e,t])=>{let n=G(t.schema,`stored`),r=G(t.publicDto,`dto`),i=t.table.validator,a=i.isOptional,o=JSON.stringify(F(t.table));return[e,()=>{if(n(),r(),t.table.validator!==i||i.isOptional!==a||JSON.stringify(F(t.table))!==o)throw Error(`Native schema mutated after registry construction: ${e}`)}]}));for(let[e,t]of Object.entries(l)){if(!t.branches)continue;let n=t.assertUnchanged;t.assertUnchanged=()=>{n(),W[e]()}}return d.set(V,{internal:P,tables:U,assertStoredUnchanged:()=>{for(let e of Object.values(W))e()},assertNativeTable(e,t){if(!Object.hasOwn(U,e)||U[e].table!==t)throw Error(`Native schema/table ownership disagrees with relation registry`);W[e]()}}),V}function v(a){let c=d.get(a);if(!c)throw Error(`Unknown relation registry`);let l=()=>{K(c.internal),c.assertStoredUnchanged()},u=e=>{l();let t=Object.keys(c.tables);if(t.length!==Object.keys(e).length||t.some(t=>e[t]!==c.tables[t].table))throw Error(`Native schema/table ownership disagrees with relation registry`)};l();let f=/* @__PURE__ */ new WeakMap,p=/* @__PURE__ */ new Map,m=/* @__PURE__ */ new Map,h=/* @__PURE__ */ new WeakMap;function g(e,t){l();let n=c.internal.metadata[e];if(!n)throw Error(`Unknown query table`);if(!n.branches)return;let r=o.string().safeParse(t[n.branches.discriminator]),a=r.success&&Object.hasOwn(n.branches.options,r.data)?n.branches.options[r.data]:void 0;if(!a)throw Error(`Invalid variant document`);let u=Object.fromEntries(Object.keys(a.fields).filter(e=>Object.hasOwn(t,e)).map(e=>[e,t[e]])),d=f.get(a);d||(d=i(s.object(a.fields)),f.set(a,d)),d.parse(u)}return Object.freeze({assertUnchanged:l,validateDocument:g,assertNativeTable:c.assertNativeTable,assertSchema:u,pagination(r){l();let i=c.internal;function a(e,t,r){let o=JSON.stringify([e,t,r??null]),s=m.get(o);if(s)return s;let c=i.metadata[e];if(!c)throw Error(`Unknown query table`);let l=JSON.stringify([e,r??null]),u=p.get(l);if(!u){u={};for(let[e,t]of Object.entries(r===void 0?c.fields:c.branches.options[r].fields))b(t)&&(u[e]=n(t).optional());p.set(l,u)}let d={fields:u,variants:c.branches&&r===void 0&&t<4?{discriminator:c.branches.discriminator,options:Object.fromEntries(Object.keys(c.branches.options).map(n=>[n,a(e,t+1,n)]))}:void 0,relations:t>=4?{}:Object.fromEntries(Object.entries(i.declarations[e]??{}).map(([e,n])=>[e,{cardinality:n.cardinality,target:a(n.target,t+1)}]))};return m.set(o,d),d}return e.extend({filters:t(a(r,0),h).optional(),order:o.enum([`asc`,`desc`]).optional()})},page(e,t){return l(),x(t),r(M(c.internal,e,t)).result},project(e,t,n,r){if(u(e),!r())return null;let i=c.internal.metadata[t];if(!i)throw Error(`Unknown query table`);let a=i.branches?i.branches.options[String(n[i.branches.discriminator])]:void 0;if(i.branches&&!a)throw Error(`Invalid variant document`);let s=a?.dto??i.dto;if(!(s instanceof o.ZodObject))throw Error(`Invalid variant DTO`);return g(t,n),s.parse(Object.fromEntries(Object.keys(s.shape).filter(e=>Object.hasOwn(n,e)).map(e=>[e,n[e]])))}})}function y(e){let t=u.get(e);if(!t)throw Error(`Unknown relation registry`);return t}function b(e){return[`id`,`string`,`float64`,`int64`,`boolean`,`null`,`literal`].includes(e.kind)||e.kind===`union`&&e.members.every(b)}function x(e){let t=[{value:e,depth:0,ancestors:[]}],n=0;for(;t.length;){let{value:e,depth:r,ancestors:i}=t.pop();if(++n>256||r>4||i.includes(e))throw Error(`Selection cycle or depth/node budget exceeded`);let a=Object.getPrototypeOf(e);if(a!==Object.prototype&&a!==null)throw Error(`Invalid selection`);let o=Reflect.ownKeys(e);if(o.length+n+t.length>256)throw Error(`Selection node budget exceeded`);for(let a of o){let o=Object.getOwnPropertyDescriptor(e,a);if(!o.enumerable||!(`value`in o)||String(a)!==a)throw Error(`Invalid selection property`);if(o.value!==!0)t.push({value:o.value,depth:r+1,ancestors:[...i,e]});else if(++n>256)throw Error(`Selection node budget exceeded`)}}}function S(e){return`base`in e?e.base:e}function C(e,t,n,r){for(let e of[n.from,n.to])if(!r.has(S(e))||`base`in e&&(!m.has(e)||!r.has(e.junction)))throw Error(`Foreign registry or invalid field reference`);if(S(n.to).table!==e)throw Error(`Wrong relation target table`);let i=Object.freeze({[l]:!0,source:S(n.from).table,target:e,cardinality:t,from:n.from,to:n.to,sourceGuard:S(n.from).guard,targetGuard:S(n.to).guard,junctionGuard:w(n.from,n.to),sourceMember:p.get(S(n.from)),targetMember:p.get(S(n.to))});return h.add(i),i}function w(e,t){let n=`base`in e?e.junction.guard:void 0,r=`base`in t?t.junction.guard:void 0;if(n&&r&&(n.discriminator!==r.discriminator||n.tag!==r.tag))throw Error(`Contradictory junction scopes`);return n??r}function T(e){if(e.kind===`id`)return[e.tableName];if(e.kind===`null`)return[];if(e.kind!==`union`)return null;let t=e.members.map(T);return t.some(e=>e===null)?null:[...new Set(t.flatMap(e=>e))].sort()}function E(e,t){let n=D(e);return n.length>0&&JSON.stringify(n)===JSON.stringify(D(t))}function D(e){if(e.kind===`union`)return[...new Set(e.members.flatMap(D))].sort();if(e.kind===`null`)return[];if(![`id`,`string`,`float64`,`int64`,`boolean`,`literal`].includes(e.kind))throw Error(`Unsupported relation field kind`);return[JSON.stringify(I(e))]}function O(e,t){let n=e.from,r=e.to;if(`base`in n!=`base`in r)throw Error(`Both relation legs must use through`);if(`base`in n&&`base`in r){if(n.junction.table!==r.junction.table)throw Error(`Different junction tables`);k(t,n.junction.table,n.junction.field,e.junctionGuard),k(t,e.target,r.base.field,e.targetGuard);return}if(!E(f.get(S(n)),f.get(S(r))))throw Error(`Incompatible relation field types`);k(t,e.target,S(r).field,e.targetGuard)}function k(e,t,n,r){if(n!==`_id`&&!e[t].indexes.some(e=>{let t=e.fields.indexOf(n);return t>=0&&e.fields.slice(0,t).every(e=>e===r?.discriminator)}))throw Error(`No active index begins with or has a guarded prefix for "${t}.${n}"`)}function A(e){return`base`in e?[e.base.table,e.base.field,e.base.guard??null,e.junction.table,e.junction.field,e.junction.guard??null]:p.has(e)?[e.table,e.field,e.guard??null,p.get(e)]:[e.table,e.field,e.guard??null]}function j(e,t,r,i=0,a){let o={},s={},c=e.metadata[t],l={};for(let[u,d]of Object.entries(r)){if(u===`variants`&&d!==!0&&c.branches&&a===void 0){if(i>=4)throw Error(`Invalid variant selection`);for(let[n,a]of Object.entries(d)){if(!Object.hasOwn(c.branches.options,n)||a===!0)throw Error(`Unknown variant filter selection`);l[n]=j(e,t,{...Object.fromEntries(Object.entries(r).filter(([e])=>e!==`variants`)),...a},i+1,n)}continue}let f=(a===void 0?c.fields:c.branches.options[a].fields)[u],p=e.declarations[t]?.[u];if(d===!0&&f)o[u]=n(f).optional();else if(d!==!0&&p&&i<4)s[u]={cardinality:p.cardinality,target:j(e,p.target,d,i+1)};else throw Error(`Invalid relation filter selection "${t}.${u}"`)}return{fields:o,relations:s,variants:c.branches&&a===void 0?{discriminator:c.branches.discriminator,options:l}:void 0}}function M(e,t,n,i=0){let a={};for(let[s,c]of Object.entries(n)){let n=e.declarations[t]?.[s];if(!n||i>=4)throw Error(`Unknown or too deep relation "${t}.${s}"`);let l=c===!0?e.metadata[n.target].dto:M(e,n.target,c,i+1);if(n.targetGuard){if(!(l instanceof o.ZodDiscriminatedUnion))throw Error(`Invalid target scope`);l=l.options.find(e=>e.shape[n.targetGuard.discriminator]instanceof o.ZodLiteral&&e.shape[n.targetGuard.discriminator].value===n.targetGuard.tag)}a[s]=n.cardinality===`one`?l.nullable():r(l).result}let s=e.metadata[t];function c(n,r){let i={...a};for(let n of Object.keys(i)){let a=e.declarations[t][n];a.sourceGuard&&r!==a.sourceGuard.tag&&a.cardinality===`one`&&(i[n]=o.null())}return J(n.extend(i).strict(),()=>K(e))}if(s.branches){let t=Object.entries(s.branches.options).map(([e,t])=>c(t.dto,e));return X(o.discriminatedUnion(s.branches.discriminator,[t[0],...t.slice(1)]),()=>K(e))}if(!(s.dto instanceof o.ZodObject))throw Error(`Expected object DTO`);return c(s.dto)}function N(e,t,n,r){if(t instanceof o.ZodObject&&n instanceof o.ZodObject){let n=a(t).fields;return z(e,n,r),{fields:n,allFields:new Set(Object.keys(n))}}if(!(t instanceof o.ZodDiscriminatedUnion)||!(n instanceof o.ZodDiscriminatedUnion))throw Error(`Expected matching discriminated union boundaries "${e}"`);let i=t._zod.def.discriminator;if(n._zod.def.discriminator!==i)throw Error(`DTO discriminator mismatch`);function c(e){let t=Object.create(null);for(let n of e.options){if(!(n instanceof o.ZodObject))throw Error(`Variant branches must be objects`);let e=n.shape[i];if(!(e instanceof o.ZodLiteral)||e.values.size!==1)throw Error(`Variant tags must be unique required string literals`);let r=o.string().safeParse(e.value);if(!r.success||Object.hasOwn(t,r.data))throw Error(`Variant tags must be unique required string literals`);t[r.data]=n}if(Object.keys(t).length===0)throw Error(`Expected at least one variant branch`);return t}let l=c(t),u=c(n);if(Object.keys(l).sort().join(`\0`)!==Object.keys(u).sort().join(`\0`))throw Error(`DTO variant tags mismatch`);let d={discriminator:i,options:Object.create(null)},f=[];for(let[t,n]of Object.entries(l)){let r=a(n).fields,{_id:i,_creationTime:o,...c}=r;z(e,r,I(s.object(c))),f.push(s.object(c)),d.options[t]={fields:r,dto:u[t]}}if(L(r)!==L(I(s.union(...f))))throw Error(`Native stored document disagrees with boundary "${e}"`);let p=Object.values(d.options).map(e=>e.fields),m={};for(let e of Object.keys(p[0])){if(!p.every(t=>Object.hasOwn(t,e))||e!==i&&!p.every(t=>P(t[e],p[0][e])))continue;let t=p.map(t=>t[e]),n=s.union(...t);m[e]=t.some(e=>e.isOptional===`optional`)?s.optional(n):n}return{fields:m,branches:d,allFields:new Set(p.flatMap(e=>Object.keys(e)))}}function P(e,t){try{return E(e,t)}catch{return L(I(e))===L(I(t))}}function F(e){return e.export()}function I(e){return e.json}function L(e){if(Array.isArray(e))return`[${e.map(L).join(`,`)}]`;if(e!==null&&Object(e)===e){let t=e;return`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${L(t[e])}`).join(`,`)}}`}return JSON.stringify(e)}function R(e){if(e===null||Object(e)!==e)return;let t=e;if(t.type===`any`)throw Error(`Unsupported native validation form`);for(let e of Object.values(t))R(e)}function z(e,t,n){let{_id:r,_creationTime:i,...a}=t;if(!r||!i||L(I(r))!==L(I(s.id(e)))||L(I(i))!==L(I(s.number()))||r.isOptional!==`required`||i.isOptional!==`required`||L(n)!==L(I(s.object(a))))throw Error(`Native stored document disagrees with boundary "${e}"`)}const B=o.object({field:o.string()}),V=new Set([B,B.pick({field:!0}),B.omit({field:!0}),B.extend({other:o.string()}),B.safeExtend({other:o.string()}),B.merge(o.object({other:o.string()})),B.partial(),B.required()].flatMap(e=>{let t=Object.getOwnPropertyDescriptor(e._zod.def,`shape`)?.get;return t?[Function.prototype.toString.call(t)]:[]}));function H(e){return G(e,`dto`)}const U=Function.prototype.toString.call(Object.getOwnPropertyDescriptor(o.string().default(``)._zod.def,`defaultValue`).get),W=Function.prototype.toString.call(Object.getOwnPropertyDescriptor(o.string().prefault(``)._zod.def,`defaultValue`).get);function G(e,t){let n=[],r=/* @__PURE__ */ new Set,i=[],a=/* @__PURE__ */ new Set,s=/* @__PURE__ */ new Set,c=[];function l(e,u){if(s.has(e))throw Error(`Unsupported cyclic DTO schema`);if(!a.has(e)){if(u>32||n.length>=4096)throw Error(`DTO schema graph budget exceeded`);a.add(e),s.add(e);try{if(e instanceof RegExp&&i.push({expression:e,source:e.source,flags:e.flags}),e instanceof o.core.$ZodCheck&&`check`in e._zod.def){if(t===`dto`&&e._zod.def.check===`overwrite`)throw Error(`Unsupported DTO overwrite check`);l(e._zod.def,u+1),n.push({object:e._zod,exactKeys:!1,keys:[`def`,`check`],values:[`def`,`check`].map(t=>Object.getOwnPropertyDescriptor(e._zod,t))});return}if(e instanceof o.core.$ZodType){let i=e._zod.def;if(t===`dto`&&(![`object`,`array`,`optional`,`nullable`,`nonoptional`,`union`,`intersection`,`tuple`,`record`,`string`,`number`,`boolean`,`bigint`,`null`,`never`,`literal`,`enum`].includes(i.type)||`coerce`in i&&i.coerce))throw Error(`Unsupported DTO schema "${i.type}"`);if(t===`stored`&&(i.type==="default"||i.type===`prefault`)){let e=Object.getOwnPropertyDescriptor(i,`defaultValue`);if(e?.get){if(e.set||Function.prototype.toString.call(e.get)!==(i.type==="default"?U:W))throw Error(`Unsupported stored schema accessor`);r.add(i)}}if(e instanceof o.ZodUnion&&(l(e.options,u+1),n.push({object:e,exactKeys:!1,keys:[`options`],values:[Object.getOwnPropertyDescriptor(e,`options`)]})),i.type===`object`){let t=Object.getOwnPropertyDescriptor(i,`shape`);if(t?.get){if(t.set||!V.has(Function.prototype.toString.call(t.get)))throw Error(`Unsupported DTO schema accessor`);let e=i.shape;l(e,u+1),Object.getOwnPropertyDescriptor(i,`shape`)?.get&&c.push({definition:i,fields:e})}if(e instanceof o.ZodObject){let t=Object.getOwnPropertyDescriptor(e,`shape`);if(t&&!(`value`in t))throw Error(`Unsupported DTO schema accessor`);l(e.shape,u+1)}}l(i,u+1),n.push({object:e._zod,exactKeys:!1,keys:[`def`],values:[Object.getOwnPropertyDescriptor(e._zod,`def`)]});return}let a=Reflect.ownKeys(e),s=a.map(t=>Object.getOwnPropertyDescriptor(e,t));if(s.some((t,n)=>!(`value`in t)&&!c.some(({definition:t})=>t===e&&a[n]===`shape`)&&!(r.has(e)&&a[n]===`defaultValue`)))throw Error(`Unsupported DTO schema accessor`);n.push({object:e,exactKeys:!0,keys:a,values:s});for(let e of s)e.value!==null&&Object(e.value)===e.value&&!(e.value instanceof Function)&&l(e.value,u+1)}finally{s.delete(e)}}}return l(e,0),()=>{for(let e of i)if(e.expression.source!==e.source||e.expression.flags!==e.flags)throw Error(`DTO schema mutated after registry construction`);for(let e of n){let t=e.keys;if(e.exactKeys&&Reflect.ownKeys(e.object).length!==t.length)throw Error(`DTO schema mutated after registry construction`);for(let n=0;n<t.length;n++){if(e.object instanceof RegExp&&t[n]===`lastIndex`)continue;let r=Object.getOwnPropertyDescriptor(e.object,t[n]),i=e.values[n];if(!r||r.value!==i.value||r.get!==i.get||r.set!==i.set||r.enumerable!==i.enumerable)throw Error(`DTO schema mutated after registry construction`)}}for(let{definition:e,fields:t}of c){let n=e.shape,r=Reflect.ownKeys(t);if(Reflect.ownKeys(n).length!==r.length||r.some(e=>Object.getOwnPropertyDescriptor(n,e)?.value!==Object.getOwnPropertyDescriptor(t,e)?.value))throw Error(`DTO schema mutated after registry construction`)}}}function K(e){for(let t of Object.values(e.metadata))t.assertUnchanged()}const q=o.core.$constructor(`GuardedDtoObject`,(e,t)=>{let n=t;o.ZodObject.init(e,t),e._zod.deferred??=[],e._zod.deferred.push(()=>{let t=e._zod.run;e._zod.run=(e,r)=>{try{n.assertUnchanged()}catch{return e.issues.push({code:`custom`,input:e.value,message:`DTO schema mutated after registry construction`}),e}return t(e,r)}})});function J(e,t){let n=e.shape,r={...e._zod.def,assertUnchanged:t};return Object.defineProperty(r,"shape",{enumerable:!0,configurable:!0,get:()=>(t(),n)}),new q(r)}const Y=o.core.$constructor(`GuardedDtoUnion`,(e,t)=>{let n=t;o.ZodDiscriminatedUnion.init(e,t),e._zod.deferred??=[],e._zod.deferred.push(()=>{let t=e._zod.run;e._zod.run=(e,r)=>{try{n.assertUnchanged()}catch{return e.issues.push({code:`custom`,input:e.value,message:`DTO schema mutated after registry construction`}),e}return t(e,r)}})});function X(e,t){let n=e.options,r={...e._zod.def,assertUnchanged:t};return Object.defineProperty(r,"options",{enumerable:!0,configurable:!0,get:()=>(t(),n)}),new Y(r)}function Z(e){let t={};for(let[n,r]of Object.entries(e.metadata)){let e={};for(let[t,n]of Object.entries(r.fields))e[t]=Object.freeze({kind:n.kind,optional:n.isOptional===`optional`,nullable:Q(n),idTables:Object.freeze($(n)),native:ee(I(n))});t[n]=Object.freeze({fields:Object.freeze(e),variant:r.branches?Object.freeze({discriminator:r.branches.discriminator,tags:Object.freeze(Object.keys(r.branches.options))}):void 0,indexes:Object.freeze(r.indexes.map(e=>Object.freeze({name:e.name,fields:Object.freeze([...e.fields])})))})}return Object.freeze({tables:Object.freeze(t),declarations:e.declarations})}function Q(e){return e.kind===`null`||e.kind===`union`&&e.members.some(Q)}function $(e){return e.kind===`id`?[e.tableName]:e.kind===`union`?[...new Set(e.members.flatMap($))].sort():[]}function ee(e){let t=structuredClone(e),n=[t];for(;n.length;){let e=n.pop();if(Object(e)!==e)continue;let t=e;Object.freeze(t),n.push(...Object.values(t))}return t}export{_ as defineRelations,v as getRelationExecutor,y as getRelationMetadata};
2
2
  //# sourceMappingURL=relations.mjs.map