@casekit/orm2-cli 0.0.0-20250331202540 → 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/build/cli.js +1 -2
  2. package/build/commands/db-drop/handler.js +0 -3
  3. package/build/commands/db-drop.test.js +1 -0
  4. package/build/commands/db-pull/handler.js +21 -8
  5. package/build/commands/db-pull/options.d.ts +5 -0
  6. package/build/commands/db-pull/options.js +5 -0
  7. package/build/commands/db-pull/util/relationNames.d.ts +3 -0
  8. package/build/commands/db-pull/util/relationNames.js +14 -0
  9. package/build/commands/db-pull/util/relationNames.test.js +61 -0
  10. package/build/commands/db-pull/util/renderDefault.d.ts +3 -0
  11. package/build/commands/db-pull/util/renderDefault.js +46 -0
  12. package/build/commands/db-pull/util/renderDefault.test.d.ts +1 -0
  13. package/build/commands/db-pull/util/renderDefault.test.js +67 -0
  14. package/build/commands/db-pull/util/renderFieldDefinition.d.ts +2 -0
  15. package/build/commands/db-pull/util/renderFieldDefinition.js +50 -0
  16. package/build/commands/db-pull/util/renderFieldDefinition.test.d.ts +1 -0
  17. package/build/commands/db-pull/util/renderFieldDefinition.test.js +182 -0
  18. package/build/commands/db-pull/util/renderModel.basic.test.d.ts +1 -0
  19. package/build/commands/db-pull/util/renderModel.basic.test.js +169 -0
  20. package/build/commands/db-pull/util/renderModel.constraints.test.d.ts +1 -0
  21. package/build/commands/db-pull/util/renderModel.constraints.test.js +677 -0
  22. package/build/commands/db-pull/util/renderModel.d.ts +2 -0
  23. package/build/commands/db-pull/util/renderModel.defaultValues.test.d.ts +1 -0
  24. package/build/commands/db-pull/util/renderModel.defaultValues.test.js +518 -0
  25. package/build/commands/db-pull/util/renderModel.js +88 -0
  26. package/build/commands/db-pull/util/renderModel.relations.test.d.ts +1 -0
  27. package/build/commands/db-pull/util/renderModel.relations.test.js +880 -0
  28. package/build/commands/db-pull/util/renderModel.types.test.d.ts +1 -0
  29. package/build/commands/db-pull/util/renderModel.types.test.js +703 -0
  30. package/build/commands/db-pull/util/renderRelations.d.ts +2 -0
  31. package/build/commands/db-pull/util/renderRelations.js +55 -0
  32. package/build/commands/db-pull/util/renderRelations.test.d.ts +1 -0
  33. package/build/commands/db-pull/util/renderRelations.test.js +165 -0
  34. package/build/commands/db-pull/util/renderType.d.ts +6 -0
  35. package/build/commands/db-pull/util/renderType.js +55 -0
  36. package/build/commands/db-pull/util/renderType.test.d.ts +1 -0
  37. package/build/commands/db-pull/util/renderType.test.js +46 -0
  38. package/build/commands/db-pull.d.ts +10 -0
  39. package/build/commands/db-pull.test.js +625 -0
  40. package/build/commands/db-push/handler.js +0 -3
  41. package/build/commands/init/handler.js +16 -3
  42. package/build/commands/init/util/generateConfigFile.js +2 -3
  43. package/build/commands/init/util/generateDbFile.js +13 -24
  44. package/build/commands/init/util/generateModelsFile.d.ts +1 -1
  45. package/build/commands/init/util/generateModelsFile.js +6 -2
  46. package/build/commands/init.test.js +19 -31
  47. package/build/types.d.ts +2 -2
  48. package/build/util/createOrOverwriteFile.d.ts +1 -1
  49. package/build/util/createOrOverwriteFile.js +1 -1
  50. package/build/util/loadConfig.js +5 -1
  51. package/package.json +26 -25
  52. package/build/commands/generate-model/handler.d.ts +0 -3
  53. package/build/commands/generate-model/handler.js +0 -10
  54. package/build/commands/generate-model/options.d.ts +0 -18
  55. package/build/commands/generate-model/options.js +0 -18
  56. package/build/commands/generate-model/util/generateModelFile.d.ts +0 -3
  57. package/build/commands/generate-model/util/generateModelFile.js +0 -59
  58. package/build/commands/generate-model/util/generateModelFile.test.js +0 -67
  59. package/build/commands/generate-model/util/regenerateModelsFile.d.ts +0 -2
  60. package/build/commands/generate-model/util/regenerateModelsFile.js +0 -50
  61. package/build/commands/generate-model.d.ts +0 -40
  62. package/build/commands/generate-model.js +0 -8
  63. package/build/commands/generate-model.test.js +0 -55
  64. /package/build/commands/{generate-model/util/generateModelFile.test.d.ts → db-pull/util/relationNames.test.d.ts} +0 -0
  65. /package/build/commands/{generate-model.test.d.ts → db-pull.test.d.ts} +0 -0
@@ -0,0 +1,677 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { unindent } from "@casekit/unindent";
3
+ import { renderModel } from "./renderModel.js";
4
+ describe("renderModel - constraints", () => {
5
+ it("handles single column primary key", async () => {
6
+ const table = {
7
+ schema: "public",
8
+ name: "users",
9
+ columns: [
10
+ {
11
+ schema: "public",
12
+ table: "users",
13
+ column: "id",
14
+ ordinalPosition: 1,
15
+ type: "integer",
16
+ default: null,
17
+ nullable: false,
18
+ udtSchema: "pg_catalog",
19
+ udt: "int4",
20
+ elementType: null,
21
+ elementTypeSchema: null,
22
+ cardinality: 0,
23
+ size: null,
24
+ isSerial: false,
25
+ },
26
+ {
27
+ schema: "public",
28
+ table: "users",
29
+ column: "name",
30
+ ordinalPosition: 2,
31
+ type: "text",
32
+ default: null,
33
+ nullable: false,
34
+ udtSchema: "pg_catalog",
35
+ udt: "text",
36
+ elementType: null,
37
+ elementTypeSchema: null,
38
+ cardinality: 0,
39
+ size: null,
40
+ isSerial: false,
41
+ },
42
+ ],
43
+ foreignKeys: [],
44
+ primaryKey: {
45
+ schema: "public",
46
+ table: "users",
47
+ constraintName: "users_pkey",
48
+ columns: ["id"],
49
+ },
50
+ uniqueConstraints: [],
51
+ };
52
+ const result = await renderModel(table, []);
53
+ expect(result.trim()).toBe(unindent `
54
+ import { type ModelDefinition } from "@casekit/orm2";
55
+
56
+ export const users = {
57
+ fields: {
58
+ id: { type: "integer", primaryKey: true },
59
+ name: { type: "text" },
60
+ },
61
+ } as const satisfies ModelDefinition;
62
+ `);
63
+ });
64
+ it("handles composite primary key", async () => {
65
+ const table = {
66
+ schema: "public",
67
+ name: "user_roles",
68
+ columns: [
69
+ {
70
+ schema: "public",
71
+ table: "user_roles",
72
+ column: "user_id",
73
+ ordinalPosition: 1,
74
+ type: "integer",
75
+ default: null,
76
+ nullable: false,
77
+ udtSchema: "pg_catalog",
78
+ udt: "int4",
79
+ elementType: null,
80
+ elementTypeSchema: null,
81
+ cardinality: 0,
82
+ size: null,
83
+ isSerial: false,
84
+ },
85
+ {
86
+ schema: "public",
87
+ table: "user_roles",
88
+ column: "role_id",
89
+ ordinalPosition: 2,
90
+ type: "integer",
91
+ default: null,
92
+ nullable: false,
93
+ udtSchema: "pg_catalog",
94
+ udt: "int4",
95
+ elementType: null,
96
+ elementTypeSchema: null,
97
+ cardinality: 0,
98
+ size: null,
99
+ isSerial: false,
100
+ },
101
+ {
102
+ schema: "public",
103
+ table: "user_roles",
104
+ column: "granted_at",
105
+ ordinalPosition: 3,
106
+ type: "timestamp",
107
+ default: null,
108
+ nullable: false,
109
+ udtSchema: "pg_catalog",
110
+ udt: "timestamp",
111
+ elementType: null,
112
+ elementTypeSchema: null,
113
+ cardinality: 0,
114
+ size: null,
115
+ isSerial: false,
116
+ },
117
+ ],
118
+ foreignKeys: [],
119
+ primaryKey: {
120
+ schema: "public",
121
+ table: "user_roles",
122
+ constraintName: "user_roles_pkey",
123
+ columns: ["user_id", "role_id"],
124
+ },
125
+ uniqueConstraints: [],
126
+ };
127
+ const result = await renderModel(table, []);
128
+ expect(result.trim()).toBe(unindent `
129
+ import { type ModelDefinition } from "@casekit/orm2";
130
+
131
+ export const userRoles = {
132
+ table: "user_roles",
133
+ fields: {
134
+ userId: { column: "user_id", type: "integer" },
135
+ roleId: { column: "role_id", type: "integer" },
136
+ grantedAt: { column: "granted_at", type: "timestamp" },
137
+ },
138
+ primaryKey: ["userId", "roleId"],
139
+ } as const satisfies ModelDefinition;
140
+ `);
141
+ });
142
+ it("handles single column unique constraint", async () => {
143
+ const table = {
144
+ schema: "public",
145
+ name: "users",
146
+ columns: [
147
+ {
148
+ schema: "public",
149
+ table: "users",
150
+ column: "id",
151
+ ordinalPosition: 1,
152
+ type: "integer",
153
+ default: null,
154
+ nullable: false,
155
+ udtSchema: "pg_catalog",
156
+ udt: "int4",
157
+ elementType: null,
158
+ elementTypeSchema: null,
159
+ cardinality: 0,
160
+ size: null,
161
+ isSerial: false,
162
+ },
163
+ {
164
+ schema: "public",
165
+ table: "users",
166
+ column: "email",
167
+ ordinalPosition: 2,
168
+ type: "text",
169
+ default: null,
170
+ nullable: false,
171
+ udtSchema: "pg_catalog",
172
+ udt: "text",
173
+ elementType: null,
174
+ elementTypeSchema: null,
175
+ cardinality: 0,
176
+ size: null,
177
+ isSerial: false,
178
+ },
179
+ ],
180
+ foreignKeys: [],
181
+ primaryKey: null,
182
+ uniqueConstraints: [
183
+ {
184
+ schema: "public",
185
+ table: "users",
186
+ name: "users_email_key",
187
+ definition: "CREATE UNIQUE INDEX users_email_key ON public.users USING btree (email)",
188
+ },
189
+ ],
190
+ };
191
+ const result = await renderModel(table, []);
192
+ expect(result.trim()).toBe(unindent `
193
+ import { type ModelDefinition } from "@casekit/orm2";
194
+
195
+ export const users = {
196
+ fields: {
197
+ id: { type: "integer" },
198
+ email: { type: "text", unique: true },
199
+ },
200
+ } as const satisfies ModelDefinition;
201
+ `);
202
+ });
203
+ it("handles unique constraint with nulls not distinct", async () => {
204
+ const table = {
205
+ schema: "public",
206
+ name: "users",
207
+ columns: [
208
+ {
209
+ schema: "public",
210
+ table: "users",
211
+ column: "id",
212
+ ordinalPosition: 1,
213
+ type: "integer",
214
+ default: null,
215
+ nullable: false,
216
+ udtSchema: "pg_catalog",
217
+ udt: "int4",
218
+ elementType: null,
219
+ elementTypeSchema: null,
220
+ cardinality: 0,
221
+ size: null,
222
+ isSerial: false,
223
+ },
224
+ {
225
+ schema: "public",
226
+ table: "users",
227
+ column: "email",
228
+ ordinalPosition: 2,
229
+ type: "text",
230
+ default: null,
231
+ nullable: true,
232
+ udtSchema: "pg_catalog",
233
+ udt: "text",
234
+ elementType: null,
235
+ elementTypeSchema: null,
236
+ cardinality: 0,
237
+ size: null,
238
+ isSerial: false,
239
+ },
240
+ ],
241
+ foreignKeys: [],
242
+ primaryKey: null,
243
+ uniqueConstraints: [
244
+ {
245
+ schema: "public",
246
+ table: "users",
247
+ name: "users_email_key",
248
+ definition: "CREATE UNIQUE INDEX users_email_key ON public.users USING btree (email) NULLS NOT DISTINCT",
249
+ },
250
+ ],
251
+ };
252
+ const result = await renderModel(table, []);
253
+ expect(result.trim()).toBe(unindent `
254
+ import { type ModelDefinition } from "@casekit/orm2";
255
+
256
+ export const users = {
257
+ fields: {
258
+ id: { type: "integer" },
259
+ email: {
260
+ type: "text",
261
+ unique: { nullsNotDistinct: true },
262
+ nullable: true,
263
+ },
264
+ },
265
+ } as const satisfies ModelDefinition;
266
+ `);
267
+ });
268
+ it("handles multi-column unique constraints", async () => {
269
+ const table = {
270
+ schema: "public",
271
+ name: "products",
272
+ columns: [
273
+ {
274
+ schema: "public",
275
+ table: "products",
276
+ column: "id",
277
+ ordinalPosition: 1,
278
+ type: "integer",
279
+ default: null,
280
+ nullable: false,
281
+ udtSchema: "pg_catalog",
282
+ udt: "int4",
283
+ elementType: null,
284
+ elementTypeSchema: null,
285
+ cardinality: 0,
286
+ size: null,
287
+ isSerial: false,
288
+ },
289
+ {
290
+ schema: "public",
291
+ table: "products",
292
+ column: "name",
293
+ ordinalPosition: 2,
294
+ type: "text",
295
+ default: null,
296
+ nullable: false,
297
+ udtSchema: "pg_catalog",
298
+ udt: "text",
299
+ elementType: null,
300
+ elementTypeSchema: null,
301
+ cardinality: 0,
302
+ size: null,
303
+ isSerial: false,
304
+ },
305
+ {
306
+ schema: "public",
307
+ table: "products",
308
+ column: "category",
309
+ ordinalPosition: 3,
310
+ type: "text",
311
+ default: null,
312
+ nullable: false,
313
+ udtSchema: "pg_catalog",
314
+ udt: "text",
315
+ elementType: null,
316
+ elementTypeSchema: null,
317
+ cardinality: 0,
318
+ size: null,
319
+ isSerial: false,
320
+ },
321
+ ],
322
+ foreignKeys: [],
323
+ primaryKey: null,
324
+ uniqueConstraints: [
325
+ {
326
+ schema: "public",
327
+ table: "products",
328
+ name: "products_name_category_key",
329
+ definition: "CREATE UNIQUE INDEX products_name_category_key ON public.products USING btree (name, category)",
330
+ },
331
+ ],
332
+ };
333
+ const result = await renderModel(table, []);
334
+ expect(result.trim()).toBe(unindent `
335
+ import { type ModelDefinition } from "@casekit/orm2";
336
+
337
+ export const products = {
338
+ fields: {
339
+ id: { type: "integer" },
340
+ name: { type: "text" },
341
+ category: { type: "text" },
342
+ },
343
+ uniqueConstraints: [{ fields: ["name", "category"] }],
344
+ } as const satisfies ModelDefinition;
345
+ `);
346
+ });
347
+ it("handles multi-column unique constraints with nulls not distinct", async () => {
348
+ const table = {
349
+ schema: "public",
350
+ name: "users",
351
+ columns: [
352
+ {
353
+ schema: "public",
354
+ table: "users",
355
+ column: "id",
356
+ ordinalPosition: 1,
357
+ type: "integer",
358
+ default: null,
359
+ nullable: false,
360
+ udtSchema: "pg_catalog",
361
+ udt: "int4",
362
+ elementType: null,
363
+ elementTypeSchema: null,
364
+ cardinality: 0,
365
+ size: null,
366
+ isSerial: false,
367
+ },
368
+ {
369
+ schema: "public",
370
+ table: "users",
371
+ column: "email",
372
+ ordinalPosition: 2,
373
+ type: "text",
374
+ default: null,
375
+ nullable: true,
376
+ udtSchema: "pg_catalog",
377
+ udt: "text",
378
+ elementType: null,
379
+ elementTypeSchema: null,
380
+ cardinality: 0,
381
+ size: null,
382
+ isSerial: false,
383
+ },
384
+ {
385
+ schema: "public",
386
+ table: "users",
387
+ column: "deleted_at",
388
+ ordinalPosition: 3,
389
+ type: "timestamp",
390
+ default: null,
391
+ nullable: true,
392
+ udtSchema: "pg_catalog",
393
+ udt: "timestamp",
394
+ elementType: null,
395
+ elementTypeSchema: null,
396
+ cardinality: 0,
397
+ size: null,
398
+ isSerial: false,
399
+ },
400
+ ],
401
+ foreignKeys: [],
402
+ primaryKey: null,
403
+ uniqueConstraints: [
404
+ {
405
+ schema: "public",
406
+ table: "users",
407
+ name: "users_email_deleted_at_key",
408
+ definition: "CREATE UNIQUE INDEX users_email_deleted_at_key ON public.users USING btree (email, deleted_at) NULLS NOT DISTINCT",
409
+ },
410
+ ],
411
+ };
412
+ const result = await renderModel(table, []);
413
+ expect(result.trim()).toBe(unindent `
414
+ import { type ModelDefinition } from "@casekit/orm2";
415
+
416
+ export const users = {
417
+ fields: {
418
+ id: { type: "integer" },
419
+ email: { type: "text", nullable: true },
420
+ deletedAt: { column: "deleted_at", type: "timestamp", nullable: true },
421
+ },
422
+ uniqueConstraints: [
423
+ { fields: ["email", "deletedAt"], nullsNotDistinct: true },
424
+ ],
425
+ } as const satisfies ModelDefinition;
426
+ `);
427
+ });
428
+ it("handles single column foreign key", async () => {
429
+ const table = {
430
+ schema: "public",
431
+ name: "posts",
432
+ columns: [
433
+ {
434
+ schema: "public",
435
+ table: "posts",
436
+ column: "id",
437
+ ordinalPosition: 1,
438
+ type: "integer",
439
+ default: null,
440
+ nullable: false,
441
+ udtSchema: "pg_catalog",
442
+ udt: "int4",
443
+ elementType: null,
444
+ elementTypeSchema: null,
445
+ cardinality: 0,
446
+ size: null,
447
+ isSerial: false,
448
+ },
449
+ {
450
+ schema: "public",
451
+ table: "posts",
452
+ column: "author_id",
453
+ ordinalPosition: 2,
454
+ type: "integer",
455
+ default: null,
456
+ nullable: false,
457
+ udtSchema: "pg_catalog",
458
+ udt: "int4",
459
+ elementType: null,
460
+ elementTypeSchema: null,
461
+ cardinality: 0,
462
+ size: null,
463
+ isSerial: false,
464
+ },
465
+ ],
466
+ foreignKeys: [
467
+ {
468
+ schema: "public",
469
+ constraintName: "posts_author_id_fkey",
470
+ tableFrom: "posts",
471
+ columnsFrom: ["author_id"],
472
+ tableTo: "users",
473
+ columnsTo: ["id"],
474
+ },
475
+ ],
476
+ primaryKey: null,
477
+ uniqueConstraints: [],
478
+ };
479
+ const result = await renderModel(table, []);
480
+ expect(result.trim()).toBe(unindent `
481
+ import { type ModelDefinition } from "@casekit/orm2";
482
+
483
+ export const posts = {
484
+ fields: {
485
+ id: { type: "integer" },
486
+ authorId: {
487
+ column: "author_id",
488
+ type: "integer",
489
+ references: { model: "users", field: "id" },
490
+ },
491
+ },
492
+ relations: {
493
+ author: {
494
+ type: "N:1",
495
+ model: "users",
496
+ fromField: "authorId",
497
+ toField: "id",
498
+ },
499
+ },
500
+ } as const satisfies ModelDefinition;
501
+ `);
502
+ });
503
+ it("handles foreign key with non-id reference", async () => {
504
+ const table = {
505
+ schema: "public",
506
+ name: "posts",
507
+ columns: [
508
+ {
509
+ schema: "public",
510
+ table: "posts",
511
+ column: "id",
512
+ ordinalPosition: 1,
513
+ type: "integer",
514
+ default: null,
515
+ nullable: false,
516
+ udtSchema: "pg_catalog",
517
+ udt: "int4",
518
+ elementType: null,
519
+ elementTypeSchema: null,
520
+ cardinality: 0,
521
+ size: null,
522
+ isSerial: false,
523
+ },
524
+ {
525
+ schema: "public",
526
+ table: "posts",
527
+ column: "color_hex",
528
+ ordinalPosition: 2,
529
+ type: "text",
530
+ default: null,
531
+ nullable: true,
532
+ udtSchema: "pg_catalog",
533
+ udt: "text",
534
+ elementType: null,
535
+ elementTypeSchema: null,
536
+ cardinality: 0,
537
+ size: null,
538
+ isSerial: false,
539
+ },
540
+ ],
541
+ foreignKeys: [
542
+ {
543
+ schema: "public",
544
+ constraintName: "posts_color_hex_fkey",
545
+ tableFrom: "posts",
546
+ columnsFrom: ["color_hex"],
547
+ tableTo: "colors",
548
+ columnsTo: ["hex"],
549
+ },
550
+ ],
551
+ primaryKey: null,
552
+ uniqueConstraints: [],
553
+ };
554
+ const result = await renderModel(table, []);
555
+ expect(result.trim()).toBe(unindent `
556
+ import { type ModelDefinition } from "@casekit/orm2";
557
+
558
+ export const posts = {
559
+ fields: {
560
+ id: { type: "integer" },
561
+ colorHex: {
562
+ column: "color_hex",
563
+ type: "text",
564
+ nullable: true,
565
+ references: { model: "colors", field: "hex" },
566
+ },
567
+ },
568
+ relations: {
569
+ colorHex: {
570
+ type: "N:1",
571
+ model: "colors",
572
+ fromField: "colorHex",
573
+ toField: "hex",
574
+ optional: true,
575
+ },
576
+ },
577
+ } as const satisfies ModelDefinition;
578
+ `);
579
+ });
580
+ it("handles multi-column foreign key", async () => {
581
+ const table = {
582
+ schema: "public",
583
+ name: "employees",
584
+ columns: [
585
+ {
586
+ schema: "public",
587
+ table: "employees",
588
+ column: "id",
589
+ ordinalPosition: 1,
590
+ type: "integer",
591
+ default: null,
592
+ nullable: false,
593
+ udtSchema: "pg_catalog",
594
+ udt: "int4",
595
+ elementType: null,
596
+ elementTypeSchema: null,
597
+ cardinality: 0,
598
+ size: null,
599
+ isSerial: false,
600
+ },
601
+ {
602
+ schema: "public",
603
+ table: "employees",
604
+ column: "company_id",
605
+ ordinalPosition: 2,
606
+ type: "integer",
607
+ default: null,
608
+ nullable: false,
609
+ udtSchema: "pg_catalog",
610
+ udt: "int4",
611
+ elementType: null,
612
+ elementTypeSchema: null,
613
+ cardinality: 0,
614
+ size: null,
615
+ isSerial: false,
616
+ },
617
+ {
618
+ schema: "public",
619
+ table: "employees",
620
+ column: "company_code",
621
+ ordinalPosition: 3,
622
+ type: "text",
623
+ default: null,
624
+ nullable: false,
625
+ udtSchema: "pg_catalog",
626
+ udt: "text",
627
+ elementType: null,
628
+ elementTypeSchema: null,
629
+ cardinality: 0,
630
+ size: null,
631
+ isSerial: false,
632
+ },
633
+ ],
634
+ foreignKeys: [
635
+ {
636
+ schema: "public",
637
+ constraintName: "employees_company_fkey",
638
+ tableFrom: "employees",
639
+ columnsFrom: ["company_id", "company_code"],
640
+ tableTo: "companies",
641
+ columnsTo: ["id", "code"],
642
+ },
643
+ ],
644
+ primaryKey: null,
645
+ uniqueConstraints: [],
646
+ };
647
+ const result = await renderModel(table, []);
648
+ expect(result.trim()).toBe(unindent `
649
+ import { type ModelDefinition } from "@casekit/orm2";
650
+
651
+ export const employees = {
652
+ fields: {
653
+ id: { type: "integer" },
654
+ companyId: { column: "company_id", type: "integer" },
655
+ companyCode: { column: "company_code", type: "text" },
656
+ },
657
+ foreignKeys: [
658
+ {
659
+ fields: ["companyId", "companyCode"],
660
+ references: {
661
+ model: "companies",
662
+ fields: ["id", "code"],
663
+ },
664
+ },
665
+ ],
666
+ relations: {
667
+ companyCompanyCode: {
668
+ type: "N:1",
669
+ model: "companies",
670
+ fromField: ["companyId", "companyCode"],
671
+ toField: ["id", "code"],
672
+ },
673
+ },
674
+ } as const satisfies ModelDefinition;
675
+ `);
676
+ });
677
+ });
@@ -0,0 +1,2 @@
1
+ import type { Table } from "@casekit/orm2-migrate";
2
+ export declare const renderModel: (table: Table, allTables: Table[]) => Promise<string>;