@simplysm/orm-common 13.0.100 → 14.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -147
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +312 -276
- package/dist/create-db-context.js.map +1 -6
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/column-ddl.js +41 -35
- package/dist/ddl/column-ddl.js.map +1 -6
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +200 -142
- package/dist/ddl/initialize.js.map +1 -6
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/relation-ddl.js +55 -48
- package/dist/ddl/relation-ddl.js.map +1 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/schema-ddl.js +21 -15
- package/dist/ddl/schema-ddl.js.map +1 -6
- package/dist/ddl/table-ddl.d.ts +20 -20
- package/dist/ddl/table-ddl.js +139 -93
- package/dist/ddl/table-ddl.js.map +1 -6
- package/dist/define-db-context.js +10 -13
- package/dist/define-db-context.js.map +1 -6
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/errors/db-transaction-error.js +53 -19
- package/dist/errors/db-transaction-error.js.map +1 -6
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +94 -40
- package/dist/exec/executable.js.map +1 -6
- package/dist/exec/queryable.d.ts +97 -97
- package/dist/exec/queryable.js +1310 -1204
- package/dist/exec/queryable.js.map +1 -6
- package/dist/exec/search-parser.d.ts +31 -31
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/exec/search-parser.js +158 -59
- package/dist/exec/search-parser.js.map +1 -6
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr-unit.js +24 -18
- package/dist/expr/expr-unit.js.map +1 -6
- package/dist/expr/expr.d.ts +108 -108
- package/dist/expr/expr.js +1872 -1844
- package/dist/expr/expr.js.map +1 -6
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -6
- package/dist/models/system-migration.js +7 -7
- package/dist/models/system-migration.js.map +1 -6
- package/dist/query-builder/base/expr-renderer-base.d.ts +10 -10
- package/dist/query-builder/base/expr-renderer-base.js +27 -21
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -6
- package/dist/query-builder/base/query-builder-base.d.ts +21 -21
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +90 -80
- package/dist/query-builder/base/query-builder-base.js.map +1 -6
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +447 -420
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -6
- package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.js +483 -443
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -6
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +451 -419
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -6
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +10 -10
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +570 -479
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -6
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +449 -422
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -6
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +511 -460
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -6
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/query-builder/query-builder.js +13 -13
- package/dist/query-builder/query-builder.js.map +1 -6
- package/dist/schema/factory/column-builder.d.ts +84 -84
- package/dist/schema/factory/column-builder.js +248 -185
- package/dist/schema/factory/column-builder.js.map +1 -6
- package/dist/schema/factory/index-builder.d.ts +38 -38
- package/dist/schema/factory/index-builder.js +144 -85
- package/dist/schema/factory/index-builder.js.map +1 -6
- package/dist/schema/factory/relation-builder.d.ts +99 -99
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +274 -136
- package/dist/schema/factory/relation-builder.js.map +1 -6
- package/dist/schema/procedure-builder.d.ts +51 -51
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +205 -131
- package/dist/schema/procedure-builder.js.map +1 -6
- package/dist/schema/table-builder.d.ts +55 -55
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +274 -205
- package/dist/schema/table-builder.js.map +1 -6
- package/dist/schema/view-builder.d.ts +44 -44
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +189 -116
- package/dist/schema/view-builder.js.map +1 -6
- package/dist/types/column.d.ts +21 -21
- package/dist/types/column.js +60 -30
- package/dist/types/column.js.map +1 -6
- package/dist/types/db-context-def.d.ts +9 -9
- package/dist/types/db-context-def.js +2 -1
- package/dist/types/db-context-def.js.map +1 -6
- package/dist/types/db.d.ts +47 -47
- package/dist/types/db.js +15 -5
- package/dist/types/db.js.map +1 -6
- package/dist/types/expr.d.ts +81 -81
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/expr.js +3 -1
- package/dist/types/expr.js.map +1 -6
- package/dist/types/query-def.d.ts +46 -46
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/types/query-def.js +31 -24
- package/dist/types/query-def.js.map +1 -6
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +362 -221
- package/dist/utils/result-parser.js.map +1 -6
- package/docs/core.md +117 -145
- package/docs/expression.md +186 -203
- package/docs/query-builder.md +75 -42
- package/docs/queryable.md +189 -151
- package/docs/schema-builders.md +172 -283
- package/docs/types.md +229 -173
- package/package.json +7 -5
- package/src/create-db-context.ts +31 -31
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +38 -38
- package/src/ddl/relation-ddl.ts +6 -6
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +24 -24
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +152 -152
- package/src/exec/search-parser.ts +50 -50
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +118 -118
- package/src/index.ts +8 -8
- package/src/models/system-migration.ts +1 -1
- package/src/query-builder/base/expr-renderer-base.ts +21 -21
- package/src/query-builder/base/query-builder-base.ts +33 -33
- package/src/query-builder/mssql/mssql-expr-renderer.ts +28 -28
- package/src/query-builder/mssql/mssql-query-builder.ts +37 -37
- package/src/query-builder/mysql/mysql-expr-renderer.ts +29 -29
- package/src/query-builder/mysql/mysql-query-builder.ts +70 -70
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +22 -22
- package/src/query-builder/postgresql/postgresql-query-builder.ts +54 -54
- package/src/query-builder/query-builder.ts +1 -1
- package/src/schema/factory/column-builder.ts +86 -86
- package/src/schema/factory/index-builder.ts +38 -38
- package/src/schema/factory/relation-builder.ts +102 -102
- package/src/schema/procedure-builder.ts +52 -52
- package/src/schema/table-builder.ts +56 -56
- package/src/schema/view-builder.ts +47 -47
- package/src/types/column.ts +24 -24
- package/src/types/db-context-def.ts +15 -15
- package/src/types/db.ts +50 -50
- package/src/types/expr.ts +103 -103
- package/src/types/query-def.ts +50 -50
- package/src/utils/result-parser.ts +88 -88
- package/docs/utilities.md +0 -27
- package/tests/db-context/create-db-context.spec.ts +0 -193
- package/tests/db-context/define-db-context.spec.ts +0 -17
- package/tests/ddl/basic.expected.ts +0 -341
- package/tests/ddl/basic.spec.ts +0 -557
- package/tests/ddl/column-builder.expected.ts +0 -310
- package/tests/ddl/column-builder.spec.ts +0 -525
- package/tests/ddl/index-builder.expected.ts +0 -38
- package/tests/ddl/index-builder.spec.ts +0 -148
- package/tests/ddl/procedure-builder.expected.ts +0 -52
- package/tests/ddl/procedure-builder.spec.ts +0 -128
- package/tests/ddl/relation-builder.expected.ts +0 -36
- package/tests/ddl/relation-builder.spec.ts +0 -171
- package/tests/ddl/table-builder.expected.ts +0 -113
- package/tests/ddl/table-builder.spec.ts +0 -399
- package/tests/ddl/view-builder.expected.ts +0 -38
- package/tests/ddl/view-builder.spec.ts +0 -116
- package/tests/dml/delete.expected.ts +0 -96
- package/tests/dml/delete.spec.ts +0 -127
- package/tests/dml/insert.expected.ts +0 -192
- package/tests/dml/insert.spec.ts +0 -210
- package/tests/dml/update.expected.ts +0 -176
- package/tests/dml/update.spec.ts +0 -222
- package/tests/dml/upsert.expected.ts +0 -215
- package/tests/dml/upsert.spec.ts +0 -190
- package/tests/errors/queryable-errors.spec.ts +0 -126
- package/tests/escape.spec.ts +0 -59
- package/tests/examples/pivot.expected.ts +0 -211
- package/tests/examples/pivot.spec.ts +0 -200
- package/tests/examples/sampling.expected.ts +0 -69
- package/tests/examples/sampling.spec.ts +0 -42
- package/tests/examples/unpivot.expected.ts +0 -120
- package/tests/examples/unpivot.spec.ts +0 -161
- package/tests/exec/search-parser.spec.ts +0 -267
- package/tests/executable/basic.expected.ts +0 -18
- package/tests/executable/basic.spec.ts +0 -54
- package/tests/expr/comparison.expected.ts +0 -282
- package/tests/expr/comparison.spec.ts +0 -334
- package/tests/expr/conditional.expected.ts +0 -134
- package/tests/expr/conditional.spec.ts +0 -249
- package/tests/expr/date.expected.ts +0 -332
- package/tests/expr/date.spec.ts +0 -459
- package/tests/expr/math.expected.ts +0 -62
- package/tests/expr/math.spec.ts +0 -59
- package/tests/expr/string.expected.ts +0 -218
- package/tests/expr/string.spec.ts +0 -300
- package/tests/expr/utility.expected.ts +0 -147
- package/tests/expr/utility.spec.ts +0 -155
- package/tests/select/basic.expected.ts +0 -322
- package/tests/select/basic.spec.ts +0 -433
- package/tests/select/filter.expected.ts +0 -357
- package/tests/select/filter.spec.ts +0 -954
- package/tests/select/group.expected.ts +0 -169
- package/tests/select/group.spec.ts +0 -159
- package/tests/select/join.expected.ts +0 -582
- package/tests/select/join.spec.ts +0 -692
- package/tests/select/order.expected.ts +0 -150
- package/tests/select/order.spec.ts +0 -140
- package/tests/select/recursive-cte.expected.ts +0 -244
- package/tests/select/recursive-cte.spec.ts +0 -514
- package/tests/select/result-meta.spec.ts +0 -270
- package/tests/select/subquery.expected.ts +0 -363
- package/tests/select/subquery.spec.ts +0 -441
- package/tests/select/view.expected.ts +0 -155
- package/tests/select/view.spec.ts +0 -235
- package/tests/select/window.expected.ts +0 -345
- package/tests/select/window.spec.ts +0 -433
- package/tests/setup/MockExecutor.ts +0 -18
- package/tests/setup/TestDbContext.ts +0 -59
- package/tests/setup/models/Company.ts +0 -13
- package/tests/setup/models/Employee.ts +0 -10
- package/tests/setup/models/MonthlySales.ts +0 -11
- package/tests/setup/models/Post.ts +0 -16
- package/tests/setup/models/Sales.ts +0 -10
- package/tests/setup/models/User.ts +0 -19
- package/tests/setup/procedure/GetAllUsers.ts +0 -9
- package/tests/setup/procedure/GetUserById.ts +0 -12
- package/tests/setup/test-utils.ts +0 -72
- package/tests/setup/views/ActiveUsers.ts +0 -8
- package/tests/setup/views/UserSummary.ts +0 -11
- package/tests/types/nullable-queryable-record.spec.ts +0 -97
- package/tests/utils/result-parser-perf.spec.ts +0 -143
- package/tests/utils/result-parser.spec.ts +0 -667
package/docs/schema-builders.md
CHANGED
|
@@ -1,28 +1,27 @@
|
|
|
1
1
|
# Schema Builders
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Fluent API builders for defining tables, views, procedures, columns, indexes, and relations.
|
|
4
4
|
|
|
5
|
-
Table
|
|
5
|
+
## Table (function)
|
|
6
|
+
|
|
7
|
+
Factory function that creates a `TableBuilder`.
|
|
6
8
|
|
|
7
9
|
```typescript
|
|
8
10
|
function Table(name: string): TableBuilder<{}, {}>;
|
|
9
11
|
```
|
|
10
12
|
|
|
11
|
-
##
|
|
13
|
+
## TableBuilder
|
|
12
14
|
|
|
13
|
-
Database table definition builder
|
|
15
|
+
Database table definition builder with fluent API for columns, primary keys, indexes, and relations.
|
|
14
16
|
|
|
15
17
|
```typescript
|
|
16
|
-
class TableBuilder<
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
>
|
|
20
|
-
readonly $
|
|
21
|
-
readonly $
|
|
22
|
-
readonly $
|
|
23
|
-
readonly $inferColumns!: InferColumns<TColumns>;
|
|
24
|
-
readonly $inferInsert!: InferInsertColumns<TColumns>;
|
|
25
|
-
readonly $inferUpdate!: InferUpdateColumns<TColumns>;
|
|
18
|
+
class TableBuilder<TColumns extends ColumnBuilderRecord, TRelations extends RelationBuilderRecord> {
|
|
19
|
+
readonly $columns: TColumns;
|
|
20
|
+
readonly $relations: TRelations;
|
|
21
|
+
readonly $inferSelect: InferColumns<TColumns> & InferDeepRelations<TRelations>;
|
|
22
|
+
readonly $inferColumns: InferColumns<TColumns>;
|
|
23
|
+
readonly $inferInsert: InferInsertColumns<TColumns>;
|
|
24
|
+
readonly $inferUpdate: InferUpdateColumns<TColumns>;
|
|
26
25
|
|
|
27
26
|
constructor(readonly meta: {
|
|
28
27
|
name: string;
|
|
@@ -34,49 +33,55 @@ class TableBuilder<
|
|
|
34
33
|
relations?: TRelations;
|
|
35
34
|
indexes?: IndexBuilder<(keyof TColumns & string)[]>[];
|
|
36
35
|
});
|
|
37
|
-
|
|
38
|
-
description(desc: string): TableBuilder<TColumns, TRelations>;
|
|
39
|
-
database(db: string): TableBuilder<TColumns, TRelations>;
|
|
40
|
-
schema(schema: string): TableBuilder<TColumns, TRelations>;
|
|
41
|
-
columns<TNewColumnDefs extends ColumnBuilderRecord>(
|
|
42
|
-
fn: (c: ReturnType<typeof createColumnFactory>) => TNewColumnDefs,
|
|
43
|
-
): TableBuilder<TNewColumnDefs, TRelations>;
|
|
44
|
-
primaryKey(...columns: (keyof TColumns & string)[]): TableBuilder<TColumns, TRelations>;
|
|
45
|
-
indexes(fn: (i: ...) => IndexBuilder<string[]>[]): TableBuilder<TColumns, TRelations>;
|
|
46
|
-
relations<T extends RelationBuilderRecord>(fn: (r: ...) => T): TableBuilder<TColumns, T>;
|
|
47
36
|
}
|
|
48
37
|
```
|
|
49
38
|
|
|
50
|
-
|
|
51
|
-
|--------|-------------|
|
|
52
|
-
| `description()` | Set table description (DDL comment) |
|
|
53
|
-
| `database()` | Set database name |
|
|
54
|
-
| `schema()` | Set schema name (MSSQL/PostgreSQL) |
|
|
55
|
-
| `columns()` | Define columns using the column factory |
|
|
56
|
-
| `primaryKey()` | Set primary key columns (composite PK supported) |
|
|
57
|
-
| `indexes()` | Define indexes using the index factory |
|
|
58
|
-
| `relations()` | Define relations using the relation factory |
|
|
39
|
+
### Methods
|
|
59
40
|
|
|
60
|
-
|
|
41
|
+
| Method | Signature | Description |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `description` | `(desc: string) => TableBuilder` | Set table description (DDL comment) |
|
|
44
|
+
| `database` | `(db: string) => TableBuilder` | Set database name |
|
|
45
|
+
| `schema` | `(schema: string) => TableBuilder` | Set schema name (MSSQL/PostgreSQL) |
|
|
46
|
+
| `columns` | `(fn: (c: ColumnFactory) => TNewCols) => TableBuilder<TNewCols, TRelations>` | Define columns using the column factory |
|
|
47
|
+
| `primaryKey` | `(...columns: string[]) => TableBuilder` | Set primary key (composite supported) |
|
|
48
|
+
| `indexes` | `(fn: (i: IndexFactory) => IndexBuilder[]) => TableBuilder` | Define indexes |
|
|
49
|
+
| `relations` | `(fn: (r: RelationFactory) => T) => TableBuilder<TColumns, T>` | Define relationships |
|
|
61
50
|
|
|
62
|
-
|
|
51
|
+
**Example:**
|
|
63
52
|
|
|
64
53
|
```typescript
|
|
65
|
-
|
|
54
|
+
const User = Table("User")
|
|
55
|
+
.database("mydb")
|
|
56
|
+
.columns((c) => ({
|
|
57
|
+
id: c.bigint().autoIncrement(),
|
|
58
|
+
name: c.varchar(100),
|
|
59
|
+
email: c.varchar(200).nullable(),
|
|
60
|
+
status: c.varchar(20).default("active"),
|
|
61
|
+
}))
|
|
62
|
+
.primaryKey("id")
|
|
63
|
+
.indexes((i) => [i.index("email").unique()])
|
|
64
|
+
.relations((r) => ({
|
|
65
|
+
posts: r.foreignKeyTarget(() => Post, "author"),
|
|
66
|
+
}));
|
|
66
67
|
```
|
|
67
68
|
|
|
68
|
-
##
|
|
69
|
+
## View (function)
|
|
69
70
|
|
|
70
|
-
|
|
71
|
+
Factory function that creates a `ViewBuilder`.
|
|
71
72
|
|
|
72
73
|
```typescript
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
function View(name: string): ViewBuilder<any, {}, {}>;
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## ViewBuilder
|
|
78
|
+
|
|
79
|
+
Database view definition builder.
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
class ViewBuilder<TDbContext, TData extends DataRecord, TRelations extends RelationBuilderRecord> {
|
|
83
|
+
readonly $relations: TRelations;
|
|
84
|
+
readonly $inferSelect: TData;
|
|
80
85
|
|
|
81
86
|
constructor(readonly meta: {
|
|
82
87
|
name: string;
|
|
@@ -86,44 +91,47 @@ class ViewBuilder<
|
|
|
86
91
|
viewFn?: (db: TDbContext) => Queryable<TData, any>;
|
|
87
92
|
relations?: TRelations;
|
|
88
93
|
});
|
|
89
|
-
|
|
90
|
-
description(desc: string): ViewBuilder<TDbContext, TData, TRelations>;
|
|
91
|
-
database(db: string): ViewBuilder<TDbContext, TData, TRelations>;
|
|
92
|
-
schema(schema: string): ViewBuilder<TDbContext, TData, TRelations>;
|
|
93
|
-
query<TViewData extends DataRecord, TDb extends DbContextBase>(
|
|
94
|
-
viewFn: (db: TDb) => Queryable<TViewData, any>,
|
|
95
|
-
): ViewBuilder<TDb, TViewData, TRelations>;
|
|
96
|
-
relations<T extends RelationBuilderRecord>(fn: (r: ...) => T): ViewBuilder<TDbContext, TData & InferDeepRelations<T>, TRelations>;
|
|
97
94
|
}
|
|
98
95
|
```
|
|
99
96
|
|
|
100
|
-
|
|
101
|
-
|--------|-------------|
|
|
102
|
-
| `description()` | Set view description (DDL comment) |
|
|
103
|
-
| `database()` | Set database name |
|
|
104
|
-
| `schema()` | Set schema name |
|
|
105
|
-
| `query()` | Define the view's SELECT query |
|
|
106
|
-
| `relations()` | Define relations with other tables/views |
|
|
97
|
+
### Methods
|
|
107
98
|
|
|
108
|
-
|
|
99
|
+
| Method | Signature | Description |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| `description` | `(desc: string) => ViewBuilder` | Set view description |
|
|
102
|
+
| `database` | `(db: string) => ViewBuilder` | Set database name |
|
|
103
|
+
| `schema` | `(schema: string) => ViewBuilder` | Set schema name |
|
|
104
|
+
| `query` | `(viewFn: (db: TDb) => Queryable) => ViewBuilder` | Define view query |
|
|
105
|
+
| `relations` | `(fn: (r: RelationFactory) => T) => ViewBuilder` | Define relationships |
|
|
109
106
|
|
|
110
|
-
|
|
107
|
+
**Example:**
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
const ActiveUsers = View("ActiveUsers")
|
|
111
|
+
.database("mydb")
|
|
112
|
+
.query((db: MyDb) =>
|
|
113
|
+
db.user()
|
|
114
|
+
.where((u) => [expr.eq(u.status, "active")])
|
|
115
|
+
.select((u) => ({ id: u.id, name: u.name }))
|
|
116
|
+
);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Procedure (function)
|
|
120
|
+
|
|
121
|
+
Factory function that creates a `ProcedureBuilder`.
|
|
111
122
|
|
|
112
123
|
```typescript
|
|
113
124
|
function Procedure(name: string): ProcedureBuilder<never, never>;
|
|
114
125
|
```
|
|
115
126
|
|
|
116
|
-
##
|
|
127
|
+
## ProcedureBuilder
|
|
117
128
|
|
|
118
|
-
Stored procedure definition builder.
|
|
129
|
+
Stored procedure definition builder.
|
|
119
130
|
|
|
120
131
|
```typescript
|
|
121
|
-
class ProcedureBuilder<
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
> {
|
|
125
|
-
readonly $params!: TParams;
|
|
126
|
-
readonly $returns!: TReturns;
|
|
132
|
+
class ProcedureBuilder<TParams extends ColumnBuilderRecord, TReturns extends ColumnBuilderRecord> {
|
|
133
|
+
readonly $params: TParams;
|
|
134
|
+
readonly $returns: TReturns;
|
|
127
135
|
|
|
128
136
|
constructor(readonly meta: {
|
|
129
137
|
name: string;
|
|
@@ -134,50 +142,52 @@ class ProcedureBuilder<
|
|
|
134
142
|
returns?: TReturns;
|
|
135
143
|
query?: string;
|
|
136
144
|
});
|
|
137
|
-
|
|
138
|
-
description(desc: string): ProcedureBuilder<TParams, TReturns>;
|
|
139
|
-
database(db: string): ProcedureBuilder<TParams, TReturns>;
|
|
140
|
-
schema(schema: string): ProcedureBuilder<TParams, TReturns>;
|
|
141
|
-
params<T extends ColumnBuilderRecord>(fn: (c: ...) => T): ProcedureBuilder<T, TReturns>;
|
|
142
|
-
returns<T extends ColumnBuilderRecord>(fn: (c: ...) => T): ProcedureBuilder<TParams, T>;
|
|
143
|
-
body(sql: string): ProcedureBuilder<TParams, TReturns>;
|
|
144
145
|
}
|
|
145
146
|
```
|
|
146
147
|
|
|
147
|
-
|
|
148
|
-
|--------|-------------|
|
|
149
|
-
| `description()` | Set procedure description |
|
|
150
|
-
| `database()` | Set database name |
|
|
151
|
-
| `schema()` | Set schema name |
|
|
152
|
-
| `params()` | Define input parameters |
|
|
153
|
-
| `returns()` | Define return type columns |
|
|
154
|
-
| `body()` | Set procedure body SQL |
|
|
148
|
+
### Methods
|
|
155
149
|
|
|
156
|
-
|
|
150
|
+
| Method | Signature | Description |
|
|
151
|
+
|---|---|---|
|
|
152
|
+
| `description` | `(desc: string) => ProcedureBuilder` | Set procedure description |
|
|
153
|
+
| `database` | `(db: string) => ProcedureBuilder` | Set database name |
|
|
154
|
+
| `schema` | `(schema: string) => ProcedureBuilder` | Set schema name |
|
|
155
|
+
| `params` | `(fn: (c: ColumnFactory) => T) => ProcedureBuilder<T, TReturns>` | Define input parameters |
|
|
156
|
+
| `returns` | `(fn: (c: ColumnFactory) => T) => ProcedureBuilder<TParams, T>` | Define return columns |
|
|
157
|
+
| `body` | `(sql: string) => ProcedureBuilder` | Set procedure body SQL |
|
|
157
158
|
|
|
158
|
-
|
|
159
|
+
**Example:**
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
const GetUserById = Procedure("GetUserById")
|
|
163
|
+
.database("mydb")
|
|
164
|
+
.params((c) => ({ userId: c.bigint() }))
|
|
165
|
+
.returns((c) => ({ id: c.bigint(), name: c.varchar(100) }))
|
|
166
|
+
.body("SELECT id, name FROM User WHERE id = userId");
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## ColumnBuilder
|
|
170
|
+
|
|
171
|
+
Column definition builder used inside `TableBuilder.columns()`.
|
|
159
172
|
|
|
160
173
|
```typescript
|
|
161
174
|
class ColumnBuilder<TValue extends ColumnPrimitive, TMeta extends ColumnMeta> {
|
|
162
175
|
constructor(readonly meta: TMeta);
|
|
163
|
-
|
|
164
|
-
autoIncrement(): ColumnBuilder<TValue, Omit<TMeta, "autoIncrement"> & { autoIncrement: true }>;
|
|
165
|
-
nullable(): ColumnBuilder<TValue | undefined, Omit<TMeta, "nullable"> & { nullable: true }>;
|
|
166
|
-
default(value: TValue): ColumnBuilder<TValue, Omit<TMeta, "default"> & { default: typeof value }>;
|
|
167
|
-
description(desc: string): ColumnBuilder<TValue, TMeta & { description: string }>;
|
|
168
176
|
}
|
|
169
177
|
```
|
|
170
178
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
|
174
|
-
|
|
175
|
-
| `
|
|
176
|
-
| `
|
|
179
|
+
### Methods
|
|
180
|
+
|
|
181
|
+
| Method | Signature | Description |
|
|
182
|
+
|---|---|---|
|
|
183
|
+
| `autoIncrement` | `() => ColumnBuilder` | Set auto-increment. Makes column optional in INSERT. |
|
|
184
|
+
| `nullable` | `() => ColumnBuilder<TValue \| undefined, ...>` | Allow NULL. Adds `undefined` to value type. |
|
|
185
|
+
| `default` | `(value: TValue) => ColumnBuilder` | Set default value. Makes column optional in INSERT. |
|
|
186
|
+
| `description` | `(desc: string) => ColumnBuilder` | Set column description (DDL comment) |
|
|
177
187
|
|
|
178
|
-
##
|
|
188
|
+
## createColumnFactory
|
|
179
189
|
|
|
180
|
-
|
|
190
|
+
Returns a column factory object with methods for all supported data types.
|
|
181
191
|
|
|
182
192
|
```typescript
|
|
183
193
|
function createColumnFactory(): {
|
|
@@ -198,26 +208,9 @@ function createColumnFactory(): {
|
|
|
198
208
|
};
|
|
199
209
|
```
|
|
200
210
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
| `bigint()` | BIGINT (8 bytes) | `number` |
|
|
205
|
-
| `float()` | FLOAT (4 bytes) | `number` |
|
|
206
|
-
| `double()` | DOUBLE (8 bytes) | `number` |
|
|
207
|
-
| `decimal()` | DECIMAL(p, s) | `number` |
|
|
208
|
-
| `varchar()` | VARCHAR(n) | `string` |
|
|
209
|
-
| `char()` | CHAR(n) | `string` |
|
|
210
|
-
| `text()` | TEXT | `string` |
|
|
211
|
-
| `binary()` | LONGBLOB/VARBINARY(MAX)/BYTEA | `Bytes` |
|
|
212
|
-
| `boolean()` | TINYINT(1)/BIT/BOOLEAN | `boolean` |
|
|
213
|
-
| `datetime()` | DATETIME | `DateTime` |
|
|
214
|
-
| `date()` | DATE | `DateOnly` |
|
|
215
|
-
| `time()` | TIME | `Time` |
|
|
216
|
-
| `uuid()` | BINARY(16)/UNIQUEIDENTIFIER/UUID | `Uuid` |
|
|
217
|
-
|
|
218
|
-
## `IndexBuilder`
|
|
219
|
-
|
|
220
|
-
Index definition builder. Define index columns, uniqueness, and sort order via fluent API.
|
|
211
|
+
## IndexBuilder
|
|
212
|
+
|
|
213
|
+
Index definition builder used inside `TableBuilder.indexes()`.
|
|
221
214
|
|
|
222
215
|
```typescript
|
|
223
216
|
class IndexBuilder<TKeys extends string[]> {
|
|
@@ -228,33 +221,34 @@ class IndexBuilder<TKeys extends string[]> {
|
|
|
228
221
|
orderBy?: { [K in keyof TKeys]: "ASC" | "DESC" };
|
|
229
222
|
description?: string;
|
|
230
223
|
});
|
|
231
|
-
|
|
232
|
-
name(name: string): IndexBuilder<TKeys>;
|
|
233
|
-
unique(): IndexBuilder<TKeys>;
|
|
234
|
-
orderBy(...orderBy: { [K in keyof TKeys]: "ASC" | "DESC" }): IndexBuilder<TKeys>;
|
|
235
|
-
description(description: string): IndexBuilder<TKeys>;
|
|
236
224
|
}
|
|
237
225
|
```
|
|
238
226
|
|
|
239
|
-
|
|
227
|
+
### Methods
|
|
240
228
|
|
|
241
|
-
|
|
229
|
+
| Method | Signature | Description |
|
|
230
|
+
|---|---|---|
|
|
231
|
+
| `name` | `(name: string) => IndexBuilder` | Set custom index name |
|
|
232
|
+
| `unique` | `() => IndexBuilder` | Mark as unique index |
|
|
233
|
+
| `orderBy` | `(...orderBy: ("ASC" \| "DESC")[]) => IndexBuilder` | Set column sort order |
|
|
234
|
+
| `description` | `(description: string) => IndexBuilder` | Set index description |
|
|
235
|
+
|
|
236
|
+
## createIndexFactory
|
|
237
|
+
|
|
238
|
+
Returns an index factory with the `index(...columns)` method.
|
|
242
239
|
|
|
243
240
|
```typescript
|
|
244
241
|
function createIndexFactory<TColumnKey extends string>(): {
|
|
245
|
-
index<TKeys extends TColumnKey[]>(...columns:
|
|
242
|
+
index<TKeys extends TColumnKey[]>(...columns: TKeys): IndexBuilder<TKeys>;
|
|
246
243
|
};
|
|
247
244
|
```
|
|
248
245
|
|
|
249
|
-
##
|
|
246
|
+
## ForeignKeyBuilder
|
|
250
247
|
|
|
251
|
-
Foreign key relation builder (N:1). Creates
|
|
248
|
+
Foreign key relation builder (N:1). Creates a real FK constraint in the database.
|
|
252
249
|
|
|
253
250
|
```typescript
|
|
254
|
-
class ForeignKeyBuilder<
|
|
255
|
-
TOwner extends TableBuilder<any, any>,
|
|
256
|
-
TTargetFn extends () => TableBuilder<any, any>,
|
|
257
|
-
> {
|
|
251
|
+
class ForeignKeyBuilder<TOwner extends TableBuilder, TTargetFn extends () => TableBuilder> {
|
|
258
252
|
constructor(readonly meta: {
|
|
259
253
|
ownerFn: () => TOwner;
|
|
260
254
|
columns: string[];
|
|
@@ -262,19 +256,16 @@ class ForeignKeyBuilder<
|
|
|
262
256
|
description?: string;
|
|
263
257
|
});
|
|
264
258
|
|
|
265
|
-
description(desc: string): ForeignKeyBuilder
|
|
259
|
+
description(desc: string): ForeignKeyBuilder;
|
|
266
260
|
}
|
|
267
261
|
```
|
|
268
262
|
|
|
269
|
-
##
|
|
263
|
+
## ForeignKeyTargetBuilder
|
|
270
264
|
|
|
271
|
-
Foreign key reverse-reference builder (1:N). Loaded as array
|
|
265
|
+
Foreign key reverse-reference builder (1:N). Loaded as array by default, call `.single()` for 1:1.
|
|
272
266
|
|
|
273
267
|
```typescript
|
|
274
|
-
class ForeignKeyTargetBuilder<
|
|
275
|
-
TTargetTableFn extends () => TableBuilder<any, any>,
|
|
276
|
-
TIsSingle extends boolean,
|
|
277
|
-
> {
|
|
268
|
+
class ForeignKeyTargetBuilder<TTargetTableFn extends () => TableBuilder, TIsSingle extends boolean> {
|
|
278
269
|
constructor(readonly meta: {
|
|
279
270
|
targetTableFn: TTargetTableFn;
|
|
280
271
|
relationName: string;
|
|
@@ -282,20 +273,17 @@ class ForeignKeyTargetBuilder<
|
|
|
282
273
|
isSingle?: TIsSingle;
|
|
283
274
|
});
|
|
284
275
|
|
|
285
|
-
description(desc: string): ForeignKeyTargetBuilder
|
|
276
|
+
description(desc: string): ForeignKeyTargetBuilder;
|
|
286
277
|
single(): ForeignKeyTargetBuilder<TTargetTableFn, true>;
|
|
287
278
|
}
|
|
288
279
|
```
|
|
289
280
|
|
|
290
|
-
##
|
|
281
|
+
## RelationKeyBuilder
|
|
291
282
|
|
|
292
|
-
Logical relation builder (N:1). Same as `ForeignKeyBuilder` but does
|
|
283
|
+
Logical relation builder (N:1). Same as `ForeignKeyBuilder` but does NOT create a FK constraint in the database. Usable from both Tables and Views.
|
|
293
284
|
|
|
294
285
|
```typescript
|
|
295
|
-
class RelationKeyBuilder<
|
|
296
|
-
TOwner extends TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
297
|
-
TTargetFn extends () => TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
298
|
-
> {
|
|
286
|
+
class RelationKeyBuilder<TOwner, TTargetFn extends () => TableBuilder | ViewBuilder> {
|
|
299
287
|
constructor(readonly meta: {
|
|
300
288
|
ownerFn: () => TOwner;
|
|
301
289
|
columns: string[];
|
|
@@ -303,19 +291,16 @@ class RelationKeyBuilder<
|
|
|
303
291
|
description?: string;
|
|
304
292
|
});
|
|
305
293
|
|
|
306
|
-
description(desc: string): RelationKeyBuilder
|
|
294
|
+
description(desc: string): RelationKeyBuilder;
|
|
307
295
|
}
|
|
308
296
|
```
|
|
309
297
|
|
|
310
|
-
##
|
|
298
|
+
## RelationKeyTargetBuilder
|
|
311
299
|
|
|
312
|
-
Logical
|
|
300
|
+
Logical reverse-reference builder (1:N). Same as `ForeignKeyTargetBuilder` but without FK constraint. Usable from both Tables and Views.
|
|
313
301
|
|
|
314
302
|
```typescript
|
|
315
|
-
class RelationKeyTargetBuilder<
|
|
316
|
-
TTargetTableFn extends () => TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
317
|
-
TIsSingle extends boolean,
|
|
318
|
-
> {
|
|
303
|
+
class RelationKeyTargetBuilder<TTargetTableFn, TIsSingle extends boolean> {
|
|
319
304
|
constructor(readonly meta: {
|
|
320
305
|
targetTableFn: TTargetTableFn;
|
|
321
306
|
relationName: string;
|
|
@@ -323,141 +308,45 @@ class RelationKeyTargetBuilder<
|
|
|
323
308
|
isSingle?: TIsSingle;
|
|
324
309
|
});
|
|
325
310
|
|
|
326
|
-
description(desc: string): RelationKeyTargetBuilder
|
|
311
|
+
description(desc: string): RelationKeyTargetBuilder;
|
|
327
312
|
single(): RelationKeyTargetBuilder<TTargetTableFn, true>;
|
|
328
313
|
}
|
|
329
314
|
```
|
|
330
315
|
|
|
331
|
-
##
|
|
332
|
-
|
|
333
|
-
Relation builder factory. Used in `TableBuilder.relations()` and `ViewBuilder.relations()`. Tables can use both FK + RelationKey; views can only use RelationKey.
|
|
334
|
-
|
|
335
|
-
```typescript
|
|
336
|
-
function createRelationFactory<
|
|
337
|
-
TOwner extends TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
338
|
-
TColumnKey extends string,
|
|
339
|
-
>(ownerFn: () => TOwner): TOwner extends TableBuilder<any, any>
|
|
340
|
-
? RelationFkFactory<TOwner, TColumnKey> & RelationRkFactory<TOwner, TColumnKey>
|
|
341
|
-
: RelationRkFactory<TOwner, TColumnKey>;
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
## `ColumnBuilderRecord`
|
|
345
|
-
|
|
346
|
-
Column builder record type. Used as the return type of `TableBuilder.columns()`.
|
|
347
|
-
|
|
348
|
-
```typescript
|
|
349
|
-
type ColumnBuilderRecord = Record<string, ColumnBuilder<ColumnPrimitive, ColumnMeta>>;
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
## `RelationBuilderRecord`
|
|
353
|
-
|
|
354
|
-
Relation builder record type. Return type of `TableBuilder.relations()` and `ViewBuilder.relations()`.
|
|
355
|
-
|
|
356
|
-
```typescript
|
|
357
|
-
type RelationBuilderRecord = Record<
|
|
358
|
-
string,
|
|
359
|
-
ForeignKeyBuilder<any, any> | ForeignKeyTargetBuilder<any, any> | RelationKeyBuilder<any, any> | RelationKeyTargetBuilder<any, any>
|
|
360
|
-
>;
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
## `InferColumns`
|
|
364
|
-
|
|
365
|
-
Infer actual value types from a column builder record.
|
|
366
|
-
|
|
367
|
-
```typescript
|
|
368
|
-
type InferColumns<TBuilders extends ColumnBuilderRecord> = {
|
|
369
|
-
[K in keyof TBuilders]: TBuilders[K] extends ColumnBuilder<infer V, any> ? V : never;
|
|
370
|
-
};
|
|
371
|
-
```
|
|
372
|
-
|
|
373
|
-
## `InferColumnExprs`
|
|
374
|
-
|
|
375
|
-
Infer expression input types from a column builder record.
|
|
376
|
-
|
|
377
|
-
```typescript
|
|
378
|
-
type InferColumnExprs<TBuilders extends ColumnBuilderRecord> = {
|
|
379
|
-
[K in keyof TBuilders]: TBuilders[K] extends ColumnBuilder<infer V, any> ? ExprInput<V> : never;
|
|
380
|
-
};
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
## `InferInsertColumns`
|
|
384
|
-
|
|
385
|
-
INSERT type inference. Required columns are required, optional columns (autoIncrement, nullable, default) are `Partial`.
|
|
386
|
-
|
|
387
|
-
```typescript
|
|
388
|
-
type InferInsertColumns<TBuilders extends ColumnBuilderRecord> = Pick<
|
|
389
|
-
InferColumns<TBuilders>,
|
|
390
|
-
RequiredInsertKeys<TBuilders>
|
|
391
|
-
> & Partial<Pick<InferColumns<TBuilders>, OptionalInsertKeys<TBuilders>>>;
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
## `InferUpdateColumns`
|
|
395
|
-
|
|
396
|
-
UPDATE type inference. All columns are optional.
|
|
397
|
-
|
|
398
|
-
```typescript
|
|
399
|
-
type InferUpdateColumns<TBuilders extends ColumnBuilderRecord> = Partial<InferColumns<TBuilders>>;
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
## `RequiredInsertKeys`
|
|
403
|
-
|
|
404
|
-
Extract required column keys for INSERT (columns without autoIncrement, nullable, or default).
|
|
405
|
-
|
|
406
|
-
```typescript
|
|
407
|
-
type RequiredInsertKeys<TBuilders extends ColumnBuilderRecord> = { ... }[keyof TBuilders];
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
## `OptionalInsertKeys`
|
|
411
|
-
|
|
412
|
-
Extract optional column keys for INSERT.
|
|
413
|
-
|
|
414
|
-
```typescript
|
|
415
|
-
type OptionalInsertKeys<TBuilders extends ColumnBuilderRecord> = Exclude<keyof TBuilders, RequiredInsertKeys<TBuilders>>;
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
## `DataToColumnBuilderRecord`
|
|
316
|
+
## createRelationFactory
|
|
419
317
|
|
|
420
|
-
|
|
318
|
+
Returns a relation factory. Tables get both FK and RelationKey methods; Views get only RelationKey methods.
|
|
421
319
|
|
|
422
320
|
```typescript
|
|
423
|
-
|
|
321
|
+
function createRelationFactory<TOwner, TColumnKey extends string>(
|
|
322
|
+
ownerFn: () => TOwner,
|
|
323
|
+
): TOwner extends TableBuilder
|
|
324
|
+
? RelationFkFactory & RelationRkFactory
|
|
325
|
+
: RelationRkFactory;
|
|
424
326
|
```
|
|
425
327
|
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
Deep relation type inference from relation definitions. Makes all relations optional.
|
|
429
|
-
|
|
430
|
-
```typescript
|
|
431
|
-
type InferDeepRelations<TRelations extends RelationBuilderRecord> = {
|
|
432
|
-
[K in keyof TRelations]?: ExtractRelationTarget<TRelations[K]> | ExtractRelationTargetResult<TRelations[K]>;
|
|
433
|
-
};
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
## `ExtractRelationTarget`
|
|
437
|
-
|
|
438
|
-
Extract target type from FK/RelationKey (single object, N:1 relation).
|
|
439
|
-
|
|
440
|
-
```typescript
|
|
441
|
-
type ExtractRelationTarget<TRelation> = ...;
|
|
442
|
-
```
|
|
328
|
+
**Factory methods (Table):**
|
|
443
329
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
330
|
+
| Method | Description |
|
|
331
|
+
|---|---|
|
|
332
|
+
| `foreignKey(columns, targetFn)` | N:1 FK relation (creates DB constraint) |
|
|
333
|
+
| `foreignKeyTarget(targetTableFn, relationName)` | 1:N FK reverse-reference |
|
|
334
|
+
| `relationKey(columns, targetFn)` | N:1 logical relation (no DB constraint) |
|
|
335
|
+
| `relationKeyTarget(targetTableFn, relationName)` | 1:N logical reverse-reference |
|
|
336
|
+
|
|
337
|
+
## Type Utilities
|
|
338
|
+
|
|
339
|
+
| Type | Description |
|
|
340
|
+
|---|---|
|
|
341
|
+
| `ColumnBuilderRecord` | `Record<string, ColumnBuilder<ColumnPrimitive, ColumnMeta>>` |
|
|
342
|
+
| `RelationBuilderRecord` | `Record<string, ForeignKeyBuilder \| ForeignKeyTargetBuilder \| RelationKeyBuilder \| RelationKeyTargetBuilder>` |
|
|
343
|
+
| `InferColumns<T>` | Infer runtime value types from column builders |
|
|
344
|
+
| `InferColumnExprs<T>` | Infer `ExprInput` types from column builders |
|
|
345
|
+
| `InferInsertColumns<T>` | INSERT type: required fields + optional for autoIncrement/nullable/default |
|
|
346
|
+
| `InferUpdateColumns<T>` | UPDATE type: all fields optional |
|
|
347
|
+
| `RequiredInsertKeys<T>` | Extract required INSERT column keys |
|
|
348
|
+
| `OptionalInsertKeys<T>` | Extract optional INSERT column keys |
|
|
349
|
+
| `DataToColumnBuilderRecord<T>` | Convert data record to column builder record |
|
|
350
|
+
| `ExtractRelationTarget<T>` | Extract target type from FK/RelationKey (single object) |
|
|
351
|
+
| `ExtractRelationTargetResult<T>` | Extract target type from FKTarget/RelationKeyTarget (array or single) |
|
|
352
|
+
| `InferDeepRelations<T>` | Deep relation type inference (all optional) |
|