cogsbox-shape 0.5.108 → 0.5.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/schema.d.ts CHANGED
@@ -110,6 +110,10 @@ export type Builder<TStage extends Stage, T extends SQLType | RelationConfig<any
110
110
  zodValidationSchema: TValidation;
111
111
  };
112
112
  } & Pick<IBuilderMethods<T, TSql, TNew, TInitialValue, TClient, TValidation>, StageMethods[TStage]>;
113
+ type HasManyDefault = true | undefined | [] | {
114
+ count: number;
115
+ };
116
+ type HasOneDefault = true | undefined | null;
113
117
  export type Reference<TGetter extends () => any> = {
114
118
  __type: "reference";
115
119
  getter: TGetter;
@@ -117,12 +121,11 @@ export type Reference<TGetter extends () => any> = {
117
121
  interface ShapeAPI {
118
122
  sql: <T extends SQLType>(sqlConfig: T) => Builder<"sql", T, SQLToZodType<T, false>, SQLToZodType<T, false>, z.infer<SQLToZodType<T, false>>, SQLToZodType<T, false>, SQLToZodType<T, false>>;
119
123
  reference: <TGetter extends () => any>(getter: TGetter) => Reference<TGetter>;
120
- hasMany: (config?: {
121
- defaultCount?: number;
122
- }) => PlaceholderRelation<"hasMany">;
123
- hasOne: () => PlaceholderRelation<"hasOne">;
124
+ hasMany: <T extends HasManyDefault>(config?: T) => PlaceholderRelation<"hasMany">;
125
+ hasOne: (config?: HasOneDefault) => PlaceholderRelation<"hasOne">;
124
126
  manyToMany: (config?: {
125
127
  defaultCount?: number;
128
+ defaultConfig?: HasManyDefault;
126
129
  }) => PlaceholderRelation<"manyToMany">;
127
130
  }
128
131
  export declare const s: ShapeAPI;
@@ -187,6 +190,7 @@ export type PlaceholderRelation<T extends RelationType> = {
187
190
  __type: "placeholder-relation";
188
191
  relationType: T;
189
192
  defaultCount?: number;
193
+ defaultConfig?: HasManyDefault | HasOneDefault;
190
194
  };
191
195
  type SchemaWithPlaceholders = {
192
196
  _tableName: string;
@@ -195,11 +199,6 @@ type SchemaWithPlaceholders = {
195
199
  type KnownKeys<T> = keyof {
196
200
  [K in keyof T as string extends K ? never : K]: T[K];
197
201
  };
198
- /**
199
- * This is the new, core type. It is NOT a validator. It is a strict TEMPLATE
200
- * that defines the exact shape the resolver's return object must have.
201
- * It provides the structure for autocompletion and error checking.
202
- */
203
202
  type ResolutionMap<S extends Record<string, SchemaWithPlaceholders>> = {
204
203
  [TableName in keyof S]?: {
205
204
  [FieldName in keyof S[TableName] as S[TableName][FieldName] extends PlaceholderReference | PlaceholderRelation<any> ? FieldName : never]?: S[TableName][FieldName] extends PlaceholderRelation<any> ? {
@@ -252,508 +251,85 @@ type ResolvedRegistryWithSchemas<S extends Record<string, SchemaWithPlaceholders
252
251
  };
253
252
  };
254
253
  };
255
- export declare function createSchemaBox<S extends Record<string, SchemaWithPlaceholders>, R extends ResolutionMap<S>>(schemas: S, resolver: (proxy: SchemaProxy<S>) => R): { [key in keyof ResolvedRegistryWithSchemas<S, R>]: {
256
- rawSchema: ResolvedRegistryWithSchemas<S, R>[key]["rawSchema"];
257
- zodSchemas: ResolvedRegistryWithSchemas<S, R>[key]["zodSchemas"];
258
- test: S;
259
- nav: key & string extends infer T ? T extends key & string ? T extends keyof S ? { [K in keyof ResolvedRegistryWithSchemas<S, R>[T]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T]["rawSchema"][K] extends infer T_1 ? T_1 extends ResolvedRegistryWithSchemas<S, R>[T]["rawSchema"][K] ? T_1 extends {
260
- config: {
261
- sql: {
262
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
263
- schema: () => any;
264
- };
265
- };
266
- } ? true : false : never : never) extends true ? K : never]: (ResolvedRegistryWithSchemas<S, R>[T]["rawSchema"][K] extends infer T_2 ? T_2 extends ResolvedRegistryWithSchemas<S, R>[T]["rawSchema"][K] ? T_2 extends {
267
- config: {
268
- sql: {
269
- schema: () => infer TargetSchema;
270
- };
271
- };
272
- } ? TargetSchema extends {
273
- _tableName: infer TableName;
274
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_3 ? T_3 extends TargetTable & string ? T_3 extends keyof S ? { [K_1 in keyof ResolvedRegistryWithSchemas<S, R>[T_3]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_3]["rawSchema"][K_1] extends infer T_4 ? T_4 extends ResolvedRegistryWithSchemas<S, R>[T_3]["rawSchema"][K_1] ? T_4 extends {
275
- config: {
276
- sql: {
277
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
278
- schema: () => any;
279
- };
280
- };
281
- } ? true : false : never : never) extends true ? K_1 : never]: (ResolvedRegistryWithSchemas<S, R>[T_3]["rawSchema"][K_1] extends infer T_5 ? T_5 extends ResolvedRegistryWithSchemas<S, R>[T_3]["rawSchema"][K_1] ? T_5 extends {
282
- config: {
283
- sql: {
284
- schema: () => infer TargetSchema;
285
- };
286
- };
287
- } ? TargetSchema extends {
288
- _tableName: infer TableName;
289
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_6 ? T_6 extends TargetTable & string ? T_6 extends keyof S ? { [K_2 in keyof ResolvedRegistryWithSchemas<S, R>[T_6]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_6]["rawSchema"][K_2] extends infer T_7 ? T_7 extends ResolvedRegistryWithSchemas<S, R>[T_6]["rawSchema"][K_2] ? T_7 extends {
290
- config: {
291
- sql: {
292
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
293
- schema: () => any;
294
- };
295
- };
296
- } ? true : false : never : never) extends true ? K_2 : never]: (ResolvedRegistryWithSchemas<S, R>[T_6]["rawSchema"][K_2] extends infer T_8 ? T_8 extends ResolvedRegistryWithSchemas<S, R>[T_6]["rawSchema"][K_2] ? T_8 extends {
297
- config: {
298
- sql: {
299
- schema: () => infer TargetSchema;
300
- };
301
- };
302
- } ? TargetSchema extends {
303
- _tableName: infer TableName;
304
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_9 ? T_9 extends TargetTable & string ? T_9 extends keyof S ? { [K_3 in keyof ResolvedRegistryWithSchemas<S, R>[T_9]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_9]["rawSchema"][K_3] extends infer T_10 ? T_10 extends ResolvedRegistryWithSchemas<S, R>[T_9]["rawSchema"][K_3] ? T_10 extends {
305
- config: {
306
- sql: {
307
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
308
- schema: () => any;
309
- };
310
- };
311
- } ? true : false : never : never) extends true ? K_3 : never]: (ResolvedRegistryWithSchemas<S, R>[T_9]["rawSchema"][K_3] extends infer T_11 ? T_11 extends ResolvedRegistryWithSchemas<S, R>[T_9]["rawSchema"][K_3] ? T_11 extends {
312
- config: {
313
- sql: {
314
- schema: () => infer TargetSchema;
315
- };
316
- };
317
- } ? TargetSchema extends {
318
- _tableName: infer TableName;
319
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_12 ? T_12 extends TargetTable & string ? T_12 extends keyof S ? { [K_4 in keyof ResolvedRegistryWithSchemas<S, R>[T_12]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_12]["rawSchema"][K_4] extends infer T_13 ? T_13 extends ResolvedRegistryWithSchemas<S, R>[T_12]["rawSchema"][K_4] ? T_13 extends {
320
- config: {
321
- sql: {
322
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
323
- schema: () => any;
324
- };
325
- };
326
- } ? true : false : never : never) extends true ? K_4 : never]: (ResolvedRegistryWithSchemas<S, R>[T_12]["rawSchema"][K_4] extends infer T_14 ? T_14 extends ResolvedRegistryWithSchemas<S, R>[T_12]["rawSchema"][K_4] ? T_14 extends {
327
- config: {
328
- sql: {
329
- schema: () => infer TargetSchema;
330
- };
331
- };
332
- } ? TargetSchema extends {
333
- _tableName: infer TableName;
334
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_15 ? T_15 extends TargetTable & string ? T_15 extends keyof S ? { [K_5 in keyof ResolvedRegistryWithSchemas<S, R>[T_15]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_15]["rawSchema"][K_5] extends infer T_16 ? T_16 extends ResolvedRegistryWithSchemas<S, R>[T_15]["rawSchema"][K_5] ? T_16 extends {
335
- config: {
336
- sql: {
337
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
338
- schema: () => any;
339
- };
340
- };
341
- } ? true : false : never : never) extends true ? K_5 : never]: (ResolvedRegistryWithSchemas<S, R>[T_15]["rawSchema"][K_5] extends infer T_17 ? T_17 extends ResolvedRegistryWithSchemas<S, R>[T_15]["rawSchema"][K_5] ? T_17 extends {
342
- config: {
343
- sql: {
344
- schema: () => infer TargetSchema;
345
- };
346
- };
347
- } ? TargetSchema extends {
348
- _tableName: infer TableName;
349
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_18 ? T_18 extends TargetTable & string ? T_18 extends keyof S ? { [K_6 in keyof ResolvedRegistryWithSchemas<S, R>[T_18]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_18]["rawSchema"][K_6] extends infer T_19 ? T_19 extends ResolvedRegistryWithSchemas<S, R>[T_18]["rawSchema"][K_6] ? T_19 extends {
350
- config: {
351
- sql: {
352
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
353
- schema: () => any;
354
- };
355
- };
356
- } ? true : false : never : never) extends true ? K_6 : never]: (ResolvedRegistryWithSchemas<S, R>[T_18]["rawSchema"][K_6] extends infer T_20 ? T_20 extends ResolvedRegistryWithSchemas<S, R>[T_18]["rawSchema"][K_6] ? T_20 extends {
357
- config: {
358
- sql: {
359
- schema: () => infer TargetSchema;
360
- };
361
- };
362
- } ? TargetSchema extends {
363
- _tableName: infer TableName;
364
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_21 ? T_21 extends TargetTable & string ? T_21 extends keyof S ? { [K_7 in keyof ResolvedRegistryWithSchemas<S, R>[T_21]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_21]["rawSchema"][K_7] extends infer T_22 ? T_22 extends ResolvedRegistryWithSchemas<S, R>[T_21]["rawSchema"][K_7] ? T_22 extends {
365
- config: {
366
- sql: {
367
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
368
- schema: () => any;
369
- };
370
- };
371
- } ? true : false : never : never) extends true ? K_7 : never]: (ResolvedRegistryWithSchemas<S, R>[T_21]["rawSchema"][K_7] extends infer T_23 ? T_23 extends ResolvedRegistryWithSchemas<S, R>[T_21]["rawSchema"][K_7] ? T_23 extends {
372
- config: {
373
- sql: {
374
- schema: () => infer TargetSchema;
375
- };
376
- };
377
- } ? TargetSchema extends {
378
- _tableName: infer TableName;
379
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_24 ? T_24 extends TargetTable & string ? T_24 extends keyof S ? { [K_8 in keyof ResolvedRegistryWithSchemas<S, R>[T_24]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_24]["rawSchema"][K_8] extends infer T_25 ? T_25 extends ResolvedRegistryWithSchemas<S, R>[T_24]["rawSchema"][K_8] ? T_25 extends {
380
- config: {
381
- sql: {
382
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
383
- schema: () => any;
384
- };
385
- };
386
- } ? true : false : never : never) extends true ? K_8 : never]: (ResolvedRegistryWithSchemas<S, R>[T_24]["rawSchema"][K_8] extends infer T_26 ? T_26 extends ResolvedRegistryWithSchemas<S, R>[T_24]["rawSchema"][K_8] ? T_26 extends {
387
- config: {
388
- sql: {
389
- schema: () => infer TargetSchema;
390
- };
391
- };
392
- } ? TargetSchema extends {
393
- _tableName: infer TableName;
394
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_27 ? T_27 extends TargetTable & string ? T_27 extends keyof S ? { [K_9 in keyof ResolvedRegistryWithSchemas<S, R>[T_27]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_27]["rawSchema"][K_9] extends infer T_28 ? T_28 extends ResolvedRegistryWithSchemas<S, R>[T_27]["rawSchema"][K_9] ? T_28 extends {
395
- config: {
396
- sql: {
397
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
398
- schema: () => any;
399
- };
400
- };
401
- } ? true : false : never : never) extends true ? K_9 : never]: (ResolvedRegistryWithSchemas<S, R>[T_27]["rawSchema"][K_9] extends infer T_29 ? T_29 extends ResolvedRegistryWithSchemas<S, R>[T_27]["rawSchema"][K_9] ? T_29 extends {
402
- config: {
403
- sql: {
404
- schema: () => infer TargetSchema;
405
- };
406
- };
407
- } ? TargetSchema extends {
408
- _tableName: infer TableName;
409
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_30 ? T_30 extends TargetTable & string ? T_30 extends keyof S ? { [K_10 in keyof ResolvedRegistryWithSchemas<S, R>[T_30]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_30]["rawSchema"][K_10] extends infer T_31 ? T_31 extends ResolvedRegistryWithSchemas<S, R>[T_30]["rawSchema"][K_10] ? T_31 extends {
410
- config: {
411
- sql: {
412
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
413
- schema: () => any;
414
- };
415
- };
416
- } ? true : false : never : never) extends true ? K_10 : never]: (ResolvedRegistryWithSchemas<S, R>[T_30]["rawSchema"][K_10] extends infer T_32 ? T_32 extends ResolvedRegistryWithSchemas<S, R>[T_30]["rawSchema"][K_10] ? T_32 extends {
417
- config: {
418
- sql: {
419
- schema: () => infer TargetSchema;
420
- };
421
- };
422
- } ? TargetSchema extends {
423
- _tableName: infer TableName;
424
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? /*elided*/ any : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never;
425
- RelationSelection: (key & string extends infer T_66 ? T_66 extends key & string ? T_66 extends keyof S ? { [K_22 in keyof ResolvedRegistryWithSchemas<S, R>[T_66]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_66]["rawSchema"][K_22] extends infer T_67 ? T_67 extends ResolvedRegistryWithSchemas<S, R>[T_66]["rawSchema"][K_22] ? T_67 extends {
426
- config: {
427
- sql: {
428
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
429
- schema: () => any;
430
- };
431
- };
432
- } ? true : false : never : never) extends true ? K_22 : never]: (ResolvedRegistryWithSchemas<S, R>[T_66]["rawSchema"][K_22] extends infer T_68 ? T_68 extends ResolvedRegistryWithSchemas<S, R>[T_66]["rawSchema"][K_22] ? T_68 extends {
433
- config: {
434
- sql: {
435
- schema: () => infer TargetSchema;
436
- };
437
- };
438
- } ? TargetSchema extends {
439
- _tableName: infer TableName;
440
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_69 ? T_69 extends TargetTable & string ? T_69 extends keyof S ? { [K_23 in keyof ResolvedRegistryWithSchemas<S, R>[T_69]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_69]["rawSchema"][K_23] extends infer T_70 ? T_70 extends ResolvedRegistryWithSchemas<S, R>[T_69]["rawSchema"][K_23] ? T_70 extends {
441
- config: {
442
- sql: {
443
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
444
- schema: () => any;
445
- };
446
- };
447
- } ? true : false : never : never) extends true ? K_23 : never]: (ResolvedRegistryWithSchemas<S, R>[T_69]["rawSchema"][K_23] extends infer T_71 ? T_71 extends ResolvedRegistryWithSchemas<S, R>[T_69]["rawSchema"][K_23] ? T_71 extends {
448
- config: {
449
- sql: {
450
- schema: () => infer TargetSchema;
451
- };
452
- };
453
- } ? TargetSchema extends {
454
- _tableName: infer TableName;
455
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_72 ? T_72 extends TargetTable & string ? T_72 extends keyof S ? { [K_24 in keyof ResolvedRegistryWithSchemas<S, R>[T_72]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_72]["rawSchema"][K_24] extends infer T_73 ? T_73 extends ResolvedRegistryWithSchemas<S, R>[T_72]["rawSchema"][K_24] ? T_73 extends {
456
- config: {
457
- sql: {
458
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
459
- schema: () => any;
460
- };
461
- };
462
- } ? true : false : never : never) extends true ? K_24 : never]: (ResolvedRegistryWithSchemas<S, R>[T_72]["rawSchema"][K_24] extends infer T_74 ? T_74 extends ResolvedRegistryWithSchemas<S, R>[T_72]["rawSchema"][K_24] ? T_74 extends {
463
- config: {
464
- sql: {
465
- schema: () => infer TargetSchema;
466
- };
467
- };
468
- } ? TargetSchema extends {
469
- _tableName: infer TableName;
470
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_75 ? T_75 extends TargetTable & string ? T_75 extends keyof S ? { [K_25 in keyof ResolvedRegistryWithSchemas<S, R>[T_75]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_75]["rawSchema"][K_25] extends infer T_76 ? T_76 extends ResolvedRegistryWithSchemas<S, R>[T_75]["rawSchema"][K_25] ? T_76 extends {
471
- config: {
472
- sql: {
473
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
474
- schema: () => any;
475
- };
476
- };
477
- } ? true : false : never : never) extends true ? K_25 : never]: (ResolvedRegistryWithSchemas<S, R>[T_75]["rawSchema"][K_25] extends infer T_77 ? T_77 extends ResolvedRegistryWithSchemas<S, R>[T_75]["rawSchema"][K_25] ? T_77 extends {
478
- config: {
479
- sql: {
480
- schema: () => infer TargetSchema;
481
- };
482
- };
483
- } ? TargetSchema extends {
484
- _tableName: infer TableName;
485
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_78 ? T_78 extends TargetTable & string ? T_78 extends keyof S ? { [K_26 in keyof ResolvedRegistryWithSchemas<S, R>[T_78]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_78]["rawSchema"][K_26] extends infer T_79 ? T_79 extends ResolvedRegistryWithSchemas<S, R>[T_78]["rawSchema"][K_26] ? T_79 extends {
486
- config: {
487
- sql: {
488
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
489
- schema: () => any;
490
- };
491
- };
492
- } ? true : false : never : never) extends true ? K_26 : never]: (ResolvedRegistryWithSchemas<S, R>[T_78]["rawSchema"][K_26] extends infer T_80 ? T_80 extends ResolvedRegistryWithSchemas<S, R>[T_78]["rawSchema"][K_26] ? T_80 extends {
493
- config: {
494
- sql: {
495
- schema: () => infer TargetSchema;
496
- };
497
- };
498
- } ? TargetSchema extends {
499
- _tableName: infer TableName;
500
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_81 ? T_81 extends TargetTable & string ? T_81 extends keyof S ? { [K_27 in keyof ResolvedRegistryWithSchemas<S, R>[T_81]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_81]["rawSchema"][K_27] extends infer T_82 ? T_82 extends ResolvedRegistryWithSchemas<S, R>[T_81]["rawSchema"][K_27] ? T_82 extends {
501
- config: {
502
- sql: {
503
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
504
- schema: () => any;
505
- };
506
- };
507
- } ? true : false : never : never) extends true ? K_27 : never]: (ResolvedRegistryWithSchemas<S, R>[T_81]["rawSchema"][K_27] extends infer T_83 ? T_83 extends ResolvedRegistryWithSchemas<S, R>[T_81]["rawSchema"][K_27] ? T_83 extends {
508
- config: {
509
- sql: {
510
- schema: () => infer TargetSchema;
511
- };
512
- };
513
- } ? TargetSchema extends {
514
- _tableName: infer TableName;
515
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_84 ? T_84 extends TargetTable & string ? T_84 extends keyof S ? { [K_28 in keyof ResolvedRegistryWithSchemas<S, R>[T_84]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_84]["rawSchema"][K_28] extends infer T_85 ? T_85 extends ResolvedRegistryWithSchemas<S, R>[T_84]["rawSchema"][K_28] ? T_85 extends {
516
- config: {
517
- sql: {
518
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
519
- schema: () => any;
520
- };
521
- };
522
- } ? true : false : never : never) extends true ? K_28 : never]: (ResolvedRegistryWithSchemas<S, R>[T_84]["rawSchema"][K_28] extends infer T_86 ? T_86 extends ResolvedRegistryWithSchemas<S, R>[T_84]["rawSchema"][K_28] ? T_86 extends {
523
- config: {
524
- sql: {
525
- schema: () => infer TargetSchema;
526
- };
527
- };
528
- } ? TargetSchema extends {
529
- _tableName: infer TableName;
530
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_87 ? T_87 extends TargetTable & string ? T_87 extends keyof S ? { [K_29 in keyof ResolvedRegistryWithSchemas<S, R>[T_87]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_87]["rawSchema"][K_29] extends infer T_88 ? T_88 extends ResolvedRegistryWithSchemas<S, R>[T_87]["rawSchema"][K_29] ? T_88 extends {
531
- config: {
532
- sql: {
533
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
534
- schema: () => any;
535
- };
536
- };
537
- } ? true : false : never : never) extends true ? K_29 : never]: (ResolvedRegistryWithSchemas<S, R>[T_87]["rawSchema"][K_29] extends infer T_89 ? T_89 extends ResolvedRegistryWithSchemas<S, R>[T_87]["rawSchema"][K_29] ? T_89 extends {
538
- config: {
539
- sql: {
540
- schema: () => infer TargetSchema;
541
- };
542
- };
543
- } ? TargetSchema extends {
544
- _tableName: infer TableName;
545
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_90 ? T_90 extends TargetTable & string ? T_90 extends keyof S ? { [K_30 in keyof ResolvedRegistryWithSchemas<S, R>[T_90]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_90]["rawSchema"][K_30] extends infer T_91 ? T_91 extends ResolvedRegistryWithSchemas<S, R>[T_90]["rawSchema"][K_30] ? T_91 extends {
546
- config: {
547
- sql: {
548
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
549
- schema: () => any;
550
- };
551
- };
552
- } ? true : false : never : never) extends true ? K_30 : never]: (ResolvedRegistryWithSchemas<S, R>[T_90]["rawSchema"][K_30] extends infer T_92 ? T_92 extends ResolvedRegistryWithSchemas<S, R>[T_90]["rawSchema"][K_30] ? T_92 extends {
553
- config: {
554
- sql: {
555
- schema: () => infer TargetSchema;
556
- };
557
- };
558
- } ? TargetSchema extends {
559
- _tableName: infer TableName;
560
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_93 ? T_93 extends TargetTable & string ? T_93 extends keyof S ? { [K_31 in keyof ResolvedRegistryWithSchemas<S, R>[T_93]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_93]["rawSchema"][K_31] extends infer T_94 ? T_94 extends ResolvedRegistryWithSchemas<S, R>[T_93]["rawSchema"][K_31] ? T_94 extends {
561
- config: {
562
- sql: {
563
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
564
- schema: () => any;
565
- };
566
- };
567
- } ? true : false : never : never) extends true ? K_31 : never]: (ResolvedRegistryWithSchemas<S, R>[T_93]["rawSchema"][K_31] extends infer T_95 ? T_95 extends ResolvedRegistryWithSchemas<S, R>[T_93]["rawSchema"][K_31] ? T_95 extends {
568
- config: {
569
- sql: {
570
- schema: () => infer TargetSchema;
571
- };
572
- };
573
- } ? TargetSchema extends {
574
- _tableName: infer TableName;
575
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_96 ? T_96 extends TargetTable & string ? T_96 extends keyof S ? { [K_32 in keyof ResolvedRegistryWithSchemas<S, R>[T_96]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_96]["rawSchema"][K_32] extends infer T_97 ? T_97 extends ResolvedRegistryWithSchemas<S, R>[T_96]["rawSchema"][K_32] ? T_97 extends {
576
- config: {
577
- sql: {
578
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
579
- schema: () => any;
580
- };
581
- };
582
- } ? true : false : never : never) extends true ? K_32 : never]: (ResolvedRegistryWithSchemas<S, R>[T_96]["rawSchema"][K_32] extends infer T_98 ? T_98 extends ResolvedRegistryWithSchemas<S, R>[T_96]["rawSchema"][K_32] ? T_98 extends {
583
- config: {
584
- sql: {
585
- schema: () => infer TargetSchema;
586
- };
587
- };
588
- } ? TargetSchema extends {
589
- _tableName: infer TableName;
590
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? /*elided*/ any : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never) extends infer T_99 ? T_99 extends (key & string extends infer T_110 ? T_110 extends key & string ? T_110 extends keyof S ? { [K_44 in keyof ResolvedRegistryWithSchemas<S, R>[T_110]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_110]["rawSchema"][K_44] extends infer T_111 ? T_111 extends ResolvedRegistryWithSchemas<S, R>[T_110]["rawSchema"][K_44] ? T_111 extends {
591
- config: {
592
- sql: {
593
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
594
- schema: () => any;
595
- };
596
- };
597
- } ? true : false : never : never) extends true ? K_44 : never]: (ResolvedRegistryWithSchemas<S, R>[T_110]["rawSchema"][K_44] extends infer T_112 ? T_112 extends ResolvedRegistryWithSchemas<S, R>[T_110]["rawSchema"][K_44] ? T_112 extends {
598
- config: {
599
- sql: {
600
- schema: () => infer TargetSchema;
601
- };
602
- };
603
- } ? TargetSchema extends {
604
- _tableName: infer TableName;
605
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_113 ? T_113 extends TargetTable & string ? T_113 extends keyof S ? { [K_45 in keyof ResolvedRegistryWithSchemas<S, R>[T_113]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_113]["rawSchema"][K_45] extends infer T_114 ? T_114 extends ResolvedRegistryWithSchemas<S, R>[T_113]["rawSchema"][K_45] ? T_114 extends {
606
- config: {
607
- sql: {
608
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
609
- schema: () => any;
610
- };
611
- };
612
- } ? true : false : never : never) extends true ? K_45 : never]: (ResolvedRegistryWithSchemas<S, R>[T_113]["rawSchema"][K_45] extends infer T_115 ? T_115 extends ResolvedRegistryWithSchemas<S, R>[T_113]["rawSchema"][K_45] ? T_115 extends {
613
- config: {
614
- sql: {
615
- schema: () => infer TargetSchema;
616
- };
617
- };
618
- } ? TargetSchema extends {
619
- _tableName: infer TableName;
620
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_116 ? T_116 extends TargetTable & string ? T_116 extends keyof S ? { [K_46 in keyof ResolvedRegistryWithSchemas<S, R>[T_116]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_116]["rawSchema"][K_46] extends infer T_117 ? T_117 extends ResolvedRegistryWithSchemas<S, R>[T_116]["rawSchema"][K_46] ? T_117 extends {
621
- config: {
622
- sql: {
623
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
624
- schema: () => any;
625
- };
626
- };
627
- } ? true : false : never : never) extends true ? K_46 : never]: (ResolvedRegistryWithSchemas<S, R>[T_116]["rawSchema"][K_46] extends infer T_118 ? T_118 extends ResolvedRegistryWithSchemas<S, R>[T_116]["rawSchema"][K_46] ? T_118 extends {
628
- config: {
629
- sql: {
630
- schema: () => infer TargetSchema;
631
- };
632
- };
633
- } ? TargetSchema extends {
634
- _tableName: infer TableName;
635
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_119 ? T_119 extends TargetTable & string ? T_119 extends keyof S ? { [K_47 in keyof ResolvedRegistryWithSchemas<S, R>[T_119]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_119]["rawSchema"][K_47] extends infer T_120 ? T_120 extends ResolvedRegistryWithSchemas<S, R>[T_119]["rawSchema"][K_47] ? T_120 extends {
636
- config: {
637
- sql: {
638
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
639
- schema: () => any;
640
- };
641
- };
642
- } ? true : false : never : never) extends true ? K_47 : never]: (ResolvedRegistryWithSchemas<S, R>[T_119]["rawSchema"][K_47] extends infer T_121 ? T_121 extends ResolvedRegistryWithSchemas<S, R>[T_119]["rawSchema"][K_47] ? T_121 extends {
643
- config: {
644
- sql: {
645
- schema: () => infer TargetSchema;
646
- };
647
- };
648
- } ? TargetSchema extends {
649
- _tableName: infer TableName;
650
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_122 ? T_122 extends TargetTable & string ? T_122 extends keyof S ? { [K_48 in keyof ResolvedRegistryWithSchemas<S, R>[T_122]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_122]["rawSchema"][K_48] extends infer T_123 ? T_123 extends ResolvedRegistryWithSchemas<S, R>[T_122]["rawSchema"][K_48] ? T_123 extends {
651
- config: {
652
- sql: {
653
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
654
- schema: () => any;
655
- };
656
- };
657
- } ? true : false : never : never) extends true ? K_48 : never]: (ResolvedRegistryWithSchemas<S, R>[T_122]["rawSchema"][K_48] extends infer T_124 ? T_124 extends ResolvedRegistryWithSchemas<S, R>[T_122]["rawSchema"][K_48] ? T_124 extends {
658
- config: {
659
- sql: {
660
- schema: () => infer TargetSchema;
661
- };
662
- };
663
- } ? TargetSchema extends {
664
- _tableName: infer TableName;
665
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_125 ? T_125 extends TargetTable & string ? T_125 extends keyof S ? { [K_49 in keyof ResolvedRegistryWithSchemas<S, R>[T_125]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_125]["rawSchema"][K_49] extends infer T_126 ? T_126 extends ResolvedRegistryWithSchemas<S, R>[T_125]["rawSchema"][K_49] ? T_126 extends {
666
- config: {
667
- sql: {
668
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
669
- schema: () => any;
670
- };
671
- };
672
- } ? true : false : never : never) extends true ? K_49 : never]: (ResolvedRegistryWithSchemas<S, R>[T_125]["rawSchema"][K_49] extends infer T_127 ? T_127 extends ResolvedRegistryWithSchemas<S, R>[T_125]["rawSchema"][K_49] ? T_127 extends {
673
- config: {
674
- sql: {
675
- schema: () => infer TargetSchema;
676
- };
677
- };
678
- } ? TargetSchema extends {
679
- _tableName: infer TableName;
680
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_128 ? T_128 extends TargetTable & string ? T_128 extends keyof S ? { [K_50 in keyof ResolvedRegistryWithSchemas<S, R>[T_128]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_128]["rawSchema"][K_50] extends infer T_129 ? T_129 extends ResolvedRegistryWithSchemas<S, R>[T_128]["rawSchema"][K_50] ? T_129 extends {
681
- config: {
682
- sql: {
683
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
684
- schema: () => any;
685
- };
686
- };
687
- } ? true : false : never : never) extends true ? K_50 : never]: (ResolvedRegistryWithSchemas<S, R>[T_128]["rawSchema"][K_50] extends infer T_130 ? T_130 extends ResolvedRegistryWithSchemas<S, R>[T_128]["rawSchema"][K_50] ? T_130 extends {
688
- config: {
689
- sql: {
690
- schema: () => infer TargetSchema;
691
- };
692
- };
693
- } ? TargetSchema extends {
694
- _tableName: infer TableName;
695
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_131 ? T_131 extends TargetTable & string ? T_131 extends keyof S ? { [K_51 in keyof ResolvedRegistryWithSchemas<S, R>[T_131]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_131]["rawSchema"][K_51] extends infer T_132 ? T_132 extends ResolvedRegistryWithSchemas<S, R>[T_131]["rawSchema"][K_51] ? T_132 extends {
696
- config: {
697
- sql: {
698
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
699
- schema: () => any;
700
- };
701
- };
702
- } ? true : false : never : never) extends true ? K_51 : never]: (ResolvedRegistryWithSchemas<S, R>[T_131]["rawSchema"][K_51] extends infer T_133 ? T_133 extends ResolvedRegistryWithSchemas<S, R>[T_131]["rawSchema"][K_51] ? T_133 extends {
703
- config: {
704
- sql: {
705
- schema: () => infer TargetSchema;
706
- };
707
- };
708
- } ? TargetSchema extends {
709
- _tableName: infer TableName;
710
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_134 ? T_134 extends TargetTable & string ? T_134 extends keyof S ? { [K_52 in keyof ResolvedRegistryWithSchemas<S, R>[T_134]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_134]["rawSchema"][K_52] extends infer T_135 ? T_135 extends ResolvedRegistryWithSchemas<S, R>[T_134]["rawSchema"][K_52] ? T_135 extends {
711
- config: {
712
- sql: {
713
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
714
- schema: () => any;
715
- };
716
- };
717
- } ? true : false : never : never) extends true ? K_52 : never]: (ResolvedRegistryWithSchemas<S, R>[T_134]["rawSchema"][K_52] extends infer T_136 ? T_136 extends ResolvedRegistryWithSchemas<S, R>[T_134]["rawSchema"][K_52] ? T_136 extends {
718
- config: {
719
- sql: {
720
- schema: () => infer TargetSchema;
721
- };
722
- };
723
- } ? TargetSchema extends {
724
- _tableName: infer TableName;
725
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_137 ? T_137 extends TargetTable & string ? T_137 extends keyof S ? { [K_53 in keyof ResolvedRegistryWithSchemas<S, R>[T_137]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_137]["rawSchema"][K_53] extends infer T_138 ? T_138 extends ResolvedRegistryWithSchemas<S, R>[T_137]["rawSchema"][K_53] ? T_138 extends {
726
- config: {
727
- sql: {
728
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
729
- schema: () => any;
730
- };
254
+ type IsRelationField<Field> = Field extends {
255
+ config: {
256
+ sql: {
257
+ type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
258
+ schema: () => any;
731
259
  };
732
- } ? true : false : never : never) extends true ? K_53 : never]: (ResolvedRegistryWithSchemas<S, R>[T_137]["rawSchema"][K_53] extends infer T_139 ? T_139 extends ResolvedRegistryWithSchemas<S, R>[T_137]["rawSchema"][K_53] ? T_139 extends {
733
- config: {
734
- sql: {
735
- schema: () => infer TargetSchema;
736
- };
260
+ };
261
+ } ? true : false;
262
+ type GetRelationTarget<Field> = Field extends {
263
+ config: {
264
+ sql: {
265
+ schema: () => infer TargetSchema;
737
266
  };
738
- } ? TargetSchema extends {
739
- _tableName: infer TableName;
740
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? TargetTable & string extends infer T_140 ? T_140 extends TargetTable & string ? T_140 extends keyof S ? { [K_54 in keyof ResolvedRegistryWithSchemas<S, R>[T_140]["rawSchema"] as (ResolvedRegistryWithSchemas<S, R>[T_140]["rawSchema"][K_54] extends infer T_141 ? T_141 extends ResolvedRegistryWithSchemas<S, R>[T_140]["rawSchema"][K_54] ? T_141 extends {
741
- config: {
742
- sql: {
743
- type: "hasMany" | "hasOne" | "belongsTo" | "manyToMany";
744
- schema: () => any;
267
+ };
268
+ } ? TargetSchema extends {
269
+ _tableName: infer TableName;
270
+ } ? TableName : never : never;
271
+ type NavigationProxy<CurrentTable extends string, Registry extends RegistryShape> = CurrentTable extends keyof Registry ? {
272
+ [K in keyof Registry[CurrentTable]["rawSchema"] as IsRelationField<Registry[CurrentTable]["rawSchema"][K]> extends true ? K : never]: GetRelationTarget<Registry[CurrentTable]["rawSchema"][K]> extends infer TargetTable ? TargetTable extends keyof Registry ? NavigationProxy<TargetTable & string, Registry> : never : never;
273
+ } : {};
274
+ type NavigationToSelection<Nav> = Nav extends object ? {
275
+ [K in keyof Nav]?: boolean | NavigationToSelection<Nav[K]>;
276
+ } : never;
277
+ type BuildZodShape<TTableName extends keyof TRegistry, TSelection, TKey extends "clientSchema" | "validationSchema", TRegistry extends RegistryShape> = TRegistry[TTableName]["zodSchemas"][TKey] extends z.ZodObject<infer Base> ? TSelection extends Record<string, any> ? Omit<Base, keyof TSelection> & {
278
+ [K in keyof TSelection & keyof TRegistry[TTableName]["rawSchema"]]: TRegistry[TTableName]["rawSchema"][K] extends {
279
+ config: {
280
+ sql: {
281
+ type: infer RelType;
282
+ schema: () => infer S;
745
283
  };
746
284
  };
747
- } ? true : false : never : never) extends true ? K_54 : never]: (ResolvedRegistryWithSchemas<S, R>[T_140]["rawSchema"][K_54] extends infer T_142 ? T_142 extends ResolvedRegistryWithSchemas<S, R>[T_140]["rawSchema"][K_54] ? T_142 extends {
748
- config: {
749
- sql: {
750
- schema: () => infer TargetSchema;
751
- };
285
+ } ? S extends {
286
+ _tableName: infer Target;
287
+ } ? Target extends keyof TRegistry ? RelType extends "hasMany" | "manyToMany" ? TSelection[K] extends true ? TRegistry[Target]["zodSchemas"][TKey] extends z.ZodObject<infer Shape extends Record<string, any>> ? z.ZodArray<z.ZodObject<OmitRelations<Shape, TRegistry[Target]["rawSchema"]>>> : never : z.ZodArray<z.ZodObject<BuildZodShape<Target, TSelection[K], TKey, TRegistry>>> : TSelection[K] extends true ? TRegistry[Target]["zodSchemas"][TKey] extends z.ZodObject<infer Shape extends Record<string, any>> ? z.ZodOptional<z.ZodObject<OmitRelations<Shape, TRegistry[Target]["rawSchema"]>>> : never : z.ZodOptional<z.ZodObject<BuildZodShape<Target, TSelection[K], TKey, TRegistry>>> : never : never : never;
288
+ } : Base : never;
289
+ type OmitRelations<Shape, RawSchema> = Omit<Shape, {
290
+ [K in keyof Shape]: K extends keyof RawSchema ? RawSchema[K] extends {
291
+ config: {
292
+ sql: {
293
+ schema: any;
294
+ };
295
+ };
296
+ } ? K : never : never;
297
+ }[keyof Shape]>;
298
+ type RegistryShape = Record<string, {
299
+ rawSchema: any;
300
+ zodSchemas: {
301
+ sqlSchema: z.ZodObject<any>;
302
+ clientSchema: z.ZodObject<any>;
303
+ validationSchema: z.ZodObject<any>;
304
+ defaultValues: any;
305
+ toClient: (dbObject: any) => any;
306
+ toDb: (clientObject: any) => any;
307
+ };
308
+ }>;
309
+ type CreateSchemaBoxReturn<S extends Record<string, SchemaWithPlaceholders>, R extends ResolutionMap<S>, Resolved extends RegistryShape = ResolvedRegistryWithSchemas<S, R> extends RegistryShape ? ResolvedRegistryWithSchemas<S, R> : RegistryShape> = {
310
+ [K in keyof Resolved]: {
311
+ definition: Resolved[K]["rawSchema"];
312
+ schemas: {
313
+ sql: Resolved[K]["zodSchemas"]["sqlSchema"];
314
+ client: Resolved[K]["zodSchemas"]["clientSchema"];
315
+ validation: Resolved[K]["zodSchemas"]["validationSchema"];
316
+ };
317
+ transforms: {
318
+ toClient: Resolved[K]["zodSchemas"]["toClient"];
319
+ toDb: Resolved[K]["zodSchemas"]["toDb"];
320
+ };
321
+ defaults: Resolved[K]["zodSchemas"]["defaultValues"];
322
+ nav: NavigationProxy<K & string, Resolved>;
323
+ RelationSelection: NavigationToSelection<NavigationProxy<K & string, Resolved>>;
324
+ createView: <const TSelection extends NavigationToSelection<NavigationProxy<K & string, Resolved>>>(selection: TSelection) => {
325
+ sql: Resolved[K]["zodSchemas"]["sqlSchema"];
326
+ client: z.ZodObject<BuildZodShape<K, TSelection, "clientSchema", Resolved>>;
327
+ validation: z.ZodObject<BuildZodShape<K, TSelection, "validationSchema", Resolved>>;
328
+ defaults: any;
752
329
  };
753
- } ? TargetSchema extends {
754
- _tableName: infer TableName;
755
- } ? TableName : never : never : never : never) extends infer TargetTable ? TargetTable extends keyof S ? /*elided*/ any : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never : never : never; } : {} : never : never) ? T_99 extends object ? { [K_33 in keyof T_99]?: boolean | (T_99[K_33] extends infer T_100 ? T_100 extends T_99[K_33] ? T_100 extends object ? { [K_34 in keyof T_100]?: boolean | (T_100[K_34] extends infer T_101 ? T_101 extends T_100[K_34] ? T_101 extends object ? { [K_35 in keyof T_101]?: boolean | (T_101[K_35] extends infer T_102 ? T_102 extends T_101[K_35] ? T_102 extends object ? { [K_36 in keyof T_102]?: boolean | (T_102[K_36] extends infer T_103 ? T_103 extends T_102[K_36] ? T_103 extends object ? { [K_37 in keyof T_103]?: boolean | (T_103[K_37] extends infer T_104 ? T_104 extends T_103[K_37] ? T_104 extends object ? { [K_38 in keyof T_104]?: boolean | (T_104[K_38] extends infer T_105 ? T_105 extends T_104[K_38] ? T_105 extends object ? { [K_39 in keyof T_105]?: boolean | (T_105[K_39] extends infer T_106 ? T_106 extends T_105[K_39] ? T_106 extends object ? { [K_40 in keyof T_106]?: boolean | (T_106[K_40] extends infer T_107 ? T_107 extends T_106[K_40] ? T_107 extends object ? { [K_41 in keyof T_107]?: boolean | (T_107[K_41] extends infer T_108 ? T_108 extends T_107[K_41] ? T_108 extends object ? { [K_42 in keyof T_108]?: boolean | (T_108[K_42] extends infer T_109 ? T_109 extends T_108[K_42] ? T_109 extends object ? { [K_43 in keyof T_109]?: boolean | /*elided*/ any; } : never : never : never); } : never : never : never); } : never : never : never); } : never : never : never); } : never : never : never); } : never : never : never); } : never : never : never); } : never : never : never); } : never : never : never); } : never : never : never); } : never : never : never;
756
- }; };
330
+ };
331
+ };
332
+ export declare function createSchemaBox<S extends Record<string, SchemaWithPlaceholders>, R extends ResolutionMap<S>>(schemas: S, resolver: (proxy: SchemaProxy<S>) => R): CreateSchemaBoxReturn<S, R>;
757
333
  type SchemaProxy<S extends Record<string, SchemaWithPlaceholders>> = {
758
334
  [K in keyof S]: {
759
335
  [F in keyof S[K] as F extends "_tableName" ? never : F]: S[K][F] extends {
@@ -777,31 +353,7 @@ type DeriveSchemaByKey<T, Key extends "zodSqlSchema" | "zodClientSchema" | "zodV
777
353
  type: "hasMany" | "manyToMany" | "hasOne" | "belongsTo";
778
354
  };
779
355
  };
780
- } ? Key extends "zodSqlSchema" ? never : K : K : never]: T[K] extends Reference<infer TGetter> ? ReturnType<TGetter> extends {
781
- config: {
782
- [P in Key]: infer ZodSchema extends z.ZodTypeAny;
783
- };
784
- } ? ZodSchema : never : T[K] extends {
785
- config: {
786
- sql: {
787
- type: "hasMany" | "manyToMany";
788
- schema: () => infer S;
789
- };
790
- };
791
- } ? S extends {
792
- _tableName: string;
793
- } ? z.ZodArray<z.ZodObject<Prettify<DeriveSchemaByKey<S, Key, [...Depth, 1]>>>> : never : T[K] extends {
794
- config: {
795
- sql: {
796
- schema: () => infer S;
797
- };
798
- };
799
- } ? S extends {
800
- _tableName: string;
801
- } ? z.ZodObject<Prettify<DeriveSchemaByKey<S, Key, [...Depth, 1]>>> : z.ZodObject<any> : T[K] extends {
802
- type: "reference";
803
- to: () => infer RefField;
804
- } ? RefField extends {
356
+ } ? never : K : never]: T[K] extends Reference<infer TGetter> ? ReturnType<TGetter> extends {
805
357
  config: {
806
358
  [P in Key]: infer ZodSchema extends z.ZodTypeAny;
807
359
  };
@@ -812,29 +364,21 @@ type DeriveSchemaByKey<T, Key extends "zodSqlSchema" | "zodClientSchema" | "zodV
812
364
  } ? ZodSchema : never;
813
365
  };
814
366
  type DeriveDefaults<T, Depth extends any[] = []> = Prettify<Depth["length"] extends 10 ? any : {
815
- [K in keyof T as K extends "_tableName" | typeof SchemaWrapperBrand ? never : K]: T[K] extends Reference<infer TGetter> ? ReturnType<TGetter> extends {
367
+ [K in keyof T as K extends "_tableName" | typeof SchemaWrapperBrand ? never : K extends keyof T ? T[K] extends Reference<any> ? K : T[K] extends {
816
368
  config: {
817
- initialValue: infer D;
369
+ sql: {
370
+ type: "hasMany" | "manyToMany" | "hasOne" | "belongsTo";
371
+ };
818
372
  };
819
- } ? D extends () => infer R ? R : D : never : T[K] extends {
373
+ } ? never : K : never]: T[K] extends Reference<infer TGetter> ? ReturnType<TGetter> extends {
820
374
  config: {
821
- sql: infer SqlConfig;
822
375
  initialValue: infer D;
823
376
  };
824
- } ? SqlConfig extends {
825
- type: "hasMany" | "manyToMany";
826
- schema: () => infer S;
827
- } ? Array<DeriveDefaults<S, [...Depth, 1]>> : SqlConfig extends {
828
- type: "hasOne" | "belongsTo";
829
- schema: () => infer S;
830
- } ? DeriveDefaults<S, [...Depth, 1]> : D extends () => infer R ? R : D : T[K] extends {
831
- type: "reference";
832
- to: () => infer RefField;
833
- } ? RefField extends {
377
+ } ? D extends () => infer R ? R : D : never : T[K] extends {
834
378
  config: {
835
379
  initialValue: infer D;
836
380
  };
837
- } ? D extends () => infer R ? R : D : never : never;
381
+ } ? D extends () => infer R ? R : D : never;
838
382
  }>;
839
383
  export type InferFromSchema<T extends {
840
384
  _tableName: string;
package/dist/schema.js CHANGED
@@ -57,11 +57,15 @@ export const s = {
57
57
  hasMany: (config) => ({
58
58
  __type: "placeholder-relation",
59
59
  relationType: "hasMany",
60
- defaultCount: config?.defaultCount ?? 0,
60
+ defaultCount: config && typeof config === "object" && "count" in config
61
+ ? config.count
62
+ : 0,
63
+ defaultConfig: config,
61
64
  }),
62
- hasOne: () => ({
65
+ hasOne: (config) => ({
63
66
  __type: "placeholder-relation",
64
67
  relationType: "hasOne",
68
+ defaultConfig: config, // This line is the crucial fix
65
69
  }),
66
70
  manyToMany: (config) => ({
67
71
  __type: "placeholder-relation",
@@ -440,14 +444,12 @@ export function createSchema(schema, relations) {
440
444
  const definition = fullSchema[key];
441
445
  // Handle new-style references
442
446
  if (isReference(definition)) {
443
- // Call the getter to get the actual field
444
447
  const targetField = definition.getter();
445
448
  if (targetField && targetField.config) {
446
449
  const config = targetField.config;
447
450
  sqlFields[key] = config.zodSqlSchema;
448
451
  clientFields[key] = config.zodClientSchema;
449
452
  validationFields[key] = config.zodValidationSchema;
450
- // For references, typically use undefined as default
451
453
  defaultValues[key] = inferDefaultFromZod(config.zodClientSchema, {
452
454
  ...config.sql,
453
455
  default: undefined,
@@ -472,49 +474,24 @@ export function createSchema(schema, relations) {
472
474
  if (definition && definition.config) {
473
475
  const config = definition.config;
474
476
  const sqlConfig = config.sql;
475
- if (definition && definition.config) {
476
- const config = definition.config;
477
- const sqlConfig = config.sql;
478
- if (sqlConfig &&
479
- typeof sqlConfig === "object" &&
480
- ["hasMany", "hasOne", "belongsTo", "manyToMany"].includes(sqlConfig.type)) {
481
- // Handle relations
482
- const relatedSchemaFactory = sqlConfig.schema;
483
- let baseClientSchema;
484
- if (sqlConfig.type === "hasMany" || sqlConfig.type === "manyToMany") {
485
- baseClientSchema = z.array(z.any()).optional();
486
- // Make it a FUNCTION that returns the array
487
- defaultValues[key] = () => Array.from({ length: sqlConfig.defaultCount || 0 }, () => {
488
- const childSchema = createSchema(relatedSchemaFactory());
489
- return childSchema.defaultValues;
490
- });
491
- }
492
- else {
493
- baseClientSchema = z.any().optional();
494
- // Make it a FUNCTION that returns the object
495
- defaultValues[key] = () => {
496
- const childSchema = createSchema(relatedSchemaFactory());
497
- return childSchema.defaultValues;
498
- };
499
- }
500
- clientFields[key] = config.clientTransform
501
- ? config.clientTransform(baseClientSchema)
502
- : baseClientSchema;
503
- validationFields[key] = clientFields[key];
504
- }
505
- else {
506
- // Handle regular fields
507
- sqlFields[key] = config.zodSqlSchema;
508
- clientFields[key] = config.zodClientSchema;
509
- validationFields[key] = config.zodValidationSchema;
510
- if (config.transforms) {
511
- fieldTransforms[key] = config.transforms;
512
- }
513
- const initialValueOrFn = config.initialValue;
514
- defaultValues[key] = isFunction(initialValueOrFn)
515
- ? initialValueOrFn()
516
- : initialValueOrFn;
477
+ if (sqlConfig &&
478
+ typeof sqlConfig === "object" &&
479
+ ["hasMany", "hasOne", "belongsTo", "manyToMany"].includes(sqlConfig.type)) {
480
+ console.log(`Skipping relation: ${key}`);
481
+ continue;
482
+ }
483
+ else {
484
+ // Handle regular fields
485
+ sqlFields[key] = config.zodSqlSchema;
486
+ clientFields[key] = config.zodClientSchema;
487
+ validationFields[key] = config.zodValidationSchema;
488
+ if (config.transforms) {
489
+ fieldTransforms[key] = config.transforms;
517
490
  }
491
+ const initialValueOrFn = config.initialValue;
492
+ defaultValues[key] = isFunction(initialValueOrFn)
493
+ ? initialValueOrFn()
494
+ : initialValueOrFn;
518
495
  }
519
496
  }
520
497
  }
@@ -545,8 +522,56 @@ export function createSchema(schema, relations) {
545
522
  toDb,
546
523
  };
547
524
  }
525
+ function createViewObject(tableName, selection, registry) {
526
+ // A recursive helper that builds ONE schema (client or validation) for a view.
527
+ function buildView(currentTable, schemaType, subSelection) {
528
+ const registryEntry = registry[currentTable];
529
+ const rawSchema = registryEntry.rawSchema;
530
+ const baseSchema = registryEntry.zodSchemas[`${schemaType}Schema`];
531
+ // Get all relation keys
532
+ const relationsToOmit = {};
533
+ for (const key in rawSchema) {
534
+ if (rawSchema[key]?.config?.sql?.schema) {
535
+ relationsToOmit[key] = true;
536
+ }
537
+ }
538
+ // Start with primitive fields only
539
+ const schemaWithPrimitives = baseSchema.omit(relationsToOmit);
540
+ // If selection is just `true`, return primitives only (no nested relations)
541
+ if (subSelection === true) {
542
+ return schemaWithPrimitives;
543
+ }
544
+ // Otherwise, add selected relations
545
+ const selectedRelationShapes = {};
546
+ if (typeof subSelection === "object") {
547
+ for (const key in subSelection) {
548
+ if (subSelection[key] && relationsToOmit[key]) {
549
+ const relationConfig = rawSchema[key].config.sql;
550
+ const targetTable = relationConfig.schema()._tableName;
551
+ // Recursively build the sub-schema
552
+ const subSchema = buildView(targetTable, schemaType, subSelection[key]);
553
+ if (relationConfig.type === "hasMany" ||
554
+ relationConfig.type === "manyToMany") {
555
+ selectedRelationShapes[key] = z.array(subSchema);
556
+ }
557
+ else {
558
+ selectedRelationShapes[key] = subSchema.optional();
559
+ }
560
+ }
561
+ }
562
+ }
563
+ return schemaWithPrimitives.extend(selectedRelationShapes);
564
+ }
565
+ // The main function builds the final object with all three schemas.
566
+ const sourceRegistryEntry = registry[tableName];
567
+ return {
568
+ sql: sourceRegistryEntry.zodSchemas.sqlSchema, // Changed from sqlSchema
569
+ client: buildView(tableName, "client", selection), // Changed from clientSchema
570
+ validation: buildView(tableName, "validation", selection), // Changed from validationSchema
571
+ };
572
+ }
548
573
  export function createSchemaBox(schemas, resolver) {
549
- // Create a proxy to allow for a clean syntax in the resolver function (e.g., s.users.id)
574
+ // Your existing implementation stays exactly the same
550
575
  const schemaProxy = new Proxy({}, {
551
576
  get(target, tableName) {
552
577
  const schema = schemas[tableName];
@@ -555,8 +580,6 @@ export function createSchemaBox(schemas, resolver) {
555
580
  return new Proxy({}, {
556
581
  get(target, fieldName) {
557
582
  const field = schema[fieldName];
558
- // Enrich the field with metadata when accessed through the proxy.
559
- // This metadata is crucial for resolving relationships later.
560
583
  if (field && typeof field === "object") {
561
584
  return {
562
585
  ...field,
@@ -572,31 +595,24 @@ export function createSchemaBox(schemas, resolver) {
572
595
  });
573
596
  },
574
597
  });
575
- // Get the user-defined resolution configuration
576
598
  const resolutionConfig = resolver(schemaProxy);
577
- // Start with a deep copy of the initial schemas
578
599
  const resolvedSchemas = { ...schemas };
579
- // ===============================================================
580
- // FIX: Implement a two-stage resolution process to avoid deadlock
581
- // ===============================================================
582
- // STAGE 1: Resolve all `s.reference()` fields first.
600
+ // STAGE 1: Resolve references
583
601
  for (const tableName in schemas) {
584
602
  for (const fieldName in schemas[tableName]) {
585
603
  const field = schemas[tableName][fieldName];
586
604
  if (isReference(field)) {
587
- // A reference is defined in the base schema, so its getter gives the target
588
605
  const targetField = field.getter();
589
606
  if (targetField && targetField.config) {
590
- // Replace the reference placeholder with the actual field it points to
591
607
  resolvedSchemas[tableName][fieldName] = targetField;
592
608
  }
593
609
  else {
594
- throw new Error(`Could not resolve reference for ${tableName}.${fieldName}. Ensure it points to a valid schema field.`);
610
+ throw new Error(`Could not resolve reference for ${tableName}.${fieldName}`);
595
611
  }
596
612
  }
597
613
  }
598
614
  }
599
- // STAGE 2: Now, resolve all relation placeholders (`hasMany`, `hasOne`, etc.).
615
+ // STAGE 2: Resolve relations
600
616
  for (const tableName in schemas) {
601
617
  const tableConfig = resolutionConfig[tableName];
602
618
  if (!tableConfig)
@@ -604,12 +620,10 @@ export function createSchemaBox(schemas, resolver) {
604
620
  for (const fieldName in tableConfig) {
605
621
  const field = schemas[tableName][fieldName];
606
622
  const resolution = tableConfig[fieldName];
607
- // Ensure this is a relation placeholder we are trying to resolve
608
623
  if (field && field.__type === "placeholder-relation") {
609
624
  const targetKey = resolution.toKey;
610
- // The target key should now be a fully resolved field from STAGE 1
611
625
  if (!targetKey || !targetKey.__parentTableType) {
612
- throw new Error(`Could not resolve relation for ${tableName}.${fieldName}. The 'toKey' (${targetKey}) is invalid.`);
626
+ throw new Error(`Could not resolve relation for ${tableName}.${fieldName}`);
613
627
  }
614
628
  const targetSchema = targetKey.__parentTableType;
615
629
  const relationType = field.relationType;
@@ -620,15 +634,15 @@ export function createSchemaBox(schemas, resolver) {
620
634
  const initialValue = relationType === "hasMany" || relationType === "manyToMany"
621
635
  ? Array.from({ length: defaultCount || 0 }, () => ({}))
622
636
  : {};
623
- // Create the full relation builder now that the dependency is available
624
637
  const resolvedBuilder = createBuilder({
625
638
  stage: "relation",
626
639
  sqlConfig: {
627
640
  type: relationType,
628
641
  fromKey: resolution.fromKey,
629
- toKey: () => targetKey, // The toKey is now a function returning the resolved field
642
+ toKey: () => targetKey,
630
643
  schema: () => targetSchema,
631
644
  defaultCount: defaultCount,
645
+ defaultConfig: field.defaultConfig,
632
646
  },
633
647
  sqlZod: zodSchema,
634
648
  newZod: zodSchema,
@@ -636,15 +650,10 @@ export function createSchemaBox(schemas, resolver) {
636
650
  clientZod: zodSchema,
637
651
  validationZod: zodSchema,
638
652
  });
639
- // Replace the placeholder in our schemas object with the final builder
640
- if (!resolvedSchemas[tableName]) {
641
- throw new Error(`Could not resolve relation for ${tableName}.${fieldName}. The 'toKey' (${targetKey}) is invalid.`);
642
- }
643
653
  resolvedSchemas[tableName][fieldName] = resolvedBuilder;
644
654
  }
645
655
  }
646
656
  }
647
- // Update the createSchemaBoxRegistry function's final section:
648
657
  const finalRegistry = {};
649
658
  for (const tableName in resolvedSchemas) {
650
659
  const zodSchemas = createSchema(resolvedSchemas[tableName]);
@@ -653,7 +662,6 @@ export function createSchemaBox(schemas, resolver) {
653
662
  zodSchemas: zodSchemas,
654
663
  };
655
664
  }
656
- // Simple navigation proxy creator
657
665
  const createNavProxy = (currentTable, registry) => {
658
666
  return new Proxy({}, {
659
667
  get(target, relationName) {
@@ -664,7 +672,7 @@ export function createSchemaBox(schemas, resolver) {
664
672
  if (!field?.config?.sql?.schema)
665
673
  return undefined;
666
674
  const targetSchema = field.config.sql.schema();
667
- const targetTable = targetSchema?._tableName; // Now just a simple string!
675
+ const targetTable = targetSchema?._tableName;
668
676
  if (targetTable && registry[targetTable]) {
669
677
  return createNavProxy(targetTable, registry);
670
678
  }
@@ -672,19 +680,88 @@ export function createSchemaBox(schemas, resolver) {
672
680
  },
673
681
  });
674
682
  };
675
- // Build the final registry
676
- for (const tableName in resolvedSchemas) {
677
- const zodSchemas = createSchema(resolvedSchemas[tableName]);
678
- finalRegistry[tableName] = {
679
- rawSchema: resolvedSchemas[tableName],
680
- zodSchemas: zodSchemas,
681
- test: schemas,
682
- nav: null, // Will be set after all entries are created
683
+ const cleanerRegistry = {};
684
+ for (const tableName in finalRegistry) {
685
+ const entry = finalRegistry[tableName];
686
+ cleanerRegistry[tableName] = {
687
+ definition: entry.rawSchema,
688
+ schemas: {
689
+ sql: entry.zodSchemas.sqlSchema,
690
+ client: entry.zodSchemas.clientSchema,
691
+ validation: entry.zodSchemas.validationSchema,
692
+ },
693
+ transforms: {
694
+ toClient: entry.zodSchemas.toClient,
695
+ toDb: entry.zodSchemas.toDb,
696
+ },
697
+ defaults: entry.zodSchemas.defaultValues,
698
+ nav: createNavProxy(tableName, finalRegistry),
699
+ // Add this
700
+ RelationSelection: {},
701
+ createView: function (selection) {
702
+ const view = createViewObject(tableName, selection, finalRegistry);
703
+ const defaults = computeViewDefaults(tableName, selection, finalRegistry);
704
+ console.log("View defaults:", defaults); // ADD THIS
705
+ return {
706
+ ...view,
707
+ defaults: defaults,
708
+ };
709
+ },
683
710
  };
684
711
  }
685
- // Now add navigation proxies
686
- for (const tableName in finalRegistry) {
687
- finalRegistry[tableName].nav = createNavProxy(tableName, finalRegistry);
712
+ return cleanerRegistry;
713
+ }
714
+ function computeViewDefaults(tableName, selection, registry, visited = new Set()) {
715
+ if (visited.has(tableName)) {
716
+ return undefined; // Prevent circular references
717
+ }
718
+ visited.add(tableName);
719
+ const entry = registry[tableName];
720
+ const rawSchema = entry.rawSchema;
721
+ const baseDefaults = { ...entry.zodSchemas.defaultValues };
722
+ if (selection === true || typeof selection !== "object") {
723
+ return baseDefaults;
724
+ }
725
+ // Add relation defaults based on selection
726
+ for (const key in selection) {
727
+ if (!selection[key])
728
+ continue;
729
+ const field = rawSchema[key];
730
+ if (!field?.config?.sql?.schema)
731
+ continue;
732
+ const relationConfig = field.config.sql;
733
+ const targetTable = relationConfig.schema()._tableName;
734
+ // ----- FIX IS HERE -----
735
+ // Look for the defaultConfig on the nested relationConfig object.
736
+ const defaultConfig = relationConfig.defaultConfig;
737
+ // Handle different default configurations
738
+ if (defaultConfig === undefined) {
739
+ // Don't include in defaults
740
+ delete baseDefaults[key];
741
+ }
742
+ else if (defaultConfig === null) {
743
+ baseDefaults[key] = null;
744
+ }
745
+ else if (Array.isArray(defaultConfig)) {
746
+ baseDefaults[key] = [];
747
+ }
748
+ else if (defaultConfig === true) {
749
+ // Generate based on nested selection
750
+ if (relationConfig.type === "hasMany" ||
751
+ relationConfig.type === "manyToMany") {
752
+ const count = relationConfig.defaultCount || 1;
753
+ baseDefaults[key] = Array.from({ length: count }, () => computeViewDefaults(targetTable, selection[key], registry, new Set(visited)));
754
+ }
755
+ else {
756
+ baseDefaults[key] = computeViewDefaults(targetTable, selection[key], registry, new Set(visited));
757
+ }
758
+ }
759
+ else if (typeof defaultConfig === "object" && "count" in defaultConfig) {
760
+ baseDefaults[key] = Array.from({ length: defaultConfig.count }, () => computeViewDefaults(targetTable, selection[key], registry, new Set(visited)));
761
+ }
688
762
  }
689
- return finalRegistry;
763
+ // NOTE: This was in the original code but is not needed for the recursive logic.
764
+ // It's safe to remove, but also safe to keep.
765
+ // visited.delete(tableName);
766
+ return baseDefaults;
690
767
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cogsbox-shape",
3
- "version": "0.5.108",
3
+ "version": "0.5.110",
4
4
  "description": "A TypeScript library for creating type-safe database schemas with Zod validation, SQL type definitions, and automatic client/server transformations. Unifies client, server, and database types through a single schema definition, with built-in support for relationships and serialization.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",