@simplysm/orm-common 14.1.2 → 14.1.7
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/db-context.d.ts +11 -10
- package/dist/db-context.d.ts.map +1 -1
- package/dist/db-context.js +14 -11
- package/dist/db-context.js.map +1 -1
- package/dist/ddl/initialize.js.map +1 -1
- package/dist/ddl/relation-ddl.d.ts +1 -1
- package/dist/ddl/relation-ddl.d.ts.map +1 -1
- package/dist/ddl/relation-ddl.js.map +1 -1
- package/dist/ddl/table-ddl.d.ts +3 -3
- package/dist/ddl/table-ddl.d.ts.map +1 -1
- package/dist/ddl/table-ddl.js.map +1 -1
- package/dist/errors/db-transaction-error.d.ts +4 -5
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/errors/db-transaction-error.js +5 -6
- package/dist/errors/db-transaction-error.js.map +1 -1
- package/dist/exec/executable.d.ts +4 -13
- package/dist/exec/executable.d.ts.map +1 -1
- package/dist/exec/executable.js.map +1 -1
- package/dist/exec/queryable.d.ts +11 -9
- package/dist/exec/queryable.d.ts.map +1 -1
- package/dist/exec/queryable.js +9 -5
- package/dist/exec/queryable.js.map +1 -1
- package/dist/expr/expr.d.ts +7 -4
- package/dist/expr/expr.d.ts.map +1 -1
- package/dist/expr/expr.js +5 -2
- package/dist/expr/expr.js.map +1 -1
- package/dist/models/system-migration.d.ts +1 -1
- package/dist/models/system-migration.d.ts.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts +2 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +2 -2
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +2 -2
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
- package/dist/schema/factory/column-builder.d.ts +1 -1
- package/dist/schema/factory/column-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.d.ts +55 -49
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +12 -15
- package/dist/schema/factory/relation-builder.js.map +1 -1
- package/dist/schema/table-builder.d.ts +35 -18
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +32 -15
- package/dist/schema/table-builder.js.map +1 -1
- package/dist/schema/view-builder.d.ts +28 -24
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +18 -14
- package/dist/schema/view-builder.js.map +1 -1
- package/dist/types/column.d.ts +6 -17
- package/dist/types/column.d.ts.map +1 -1
- package/dist/types/column.js +3 -19
- package/dist/types/column.js.map +1 -1
- package/dist/types/db-context-def.d.ts +7 -7
- package/dist/types/db-context-def.d.ts.map +1 -1
- package/dist/types/query-def.d.ts +1 -1
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/utils/result-parser.d.ts.map +1 -1
- package/dist/utils/result-parser.js +3 -7
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +3 -3
- package/src/db-context.ts +23 -20
- package/src/ddl/initialize.ts +4 -4
- package/src/ddl/relation-ddl.ts +1 -1
- package/src/ddl/table-ddl.ts +3 -3
- package/src/errors/db-transaction-error.ts +6 -4
- package/src/exec/executable.ts +5 -4
- package/src/exec/queryable.ts +31 -24
- package/src/expr/expr.ts +10 -4
- package/src/query-builder/base/expr-renderer-base.ts +2 -1
- package/src/query-builder/mssql/mssql-expr-renderer.ts +5 -5
- package/src/query-builder/mysql/mysql-expr-renderer.ts +2 -2
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +5 -5
- package/src/query-builder/postgresql/postgresql-query-builder.ts +4 -3
- package/src/schema/factory/column-builder.ts +3 -3
- package/src/schema/factory/relation-builder.ts +350 -346
- package/src/schema/table-builder.ts +209 -193
- package/src/schema/view-builder.ts +148 -143
- package/src/types/column.ts +7 -26
- package/src/types/db-context-def.ts +7 -7
- package/src/types/query-def.ts +1 -1
- package/src/utils/result-parser.ts +11 -19
|
@@ -1,193 +1,209 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type ColumnBuilderRecord,
|
|
3
|
-
createColumnFactory,
|
|
4
|
-
type InferColumns,
|
|
5
|
-
type InferInsertColumns,
|
|
6
|
-
type InferUpdateColumns,
|
|
7
|
-
} from "./factory/column-builder";
|
|
8
|
-
import { createIndexFactory, type IndexBuilder } from "./factory/index-builder";
|
|
9
|
-
import {
|
|
10
|
-
createRelationFactory,
|
|
11
|
-
type InferDeepRelations,
|
|
12
|
-
type
|
|
13
|
-
} from "./factory/relation-builder";
|
|
14
|
-
|
|
15
|
-
// ============================================
|
|
16
|
-
// TableBuilder
|
|
17
|
-
// ============================================
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Database Table 정의 builder
|
|
21
|
-
*
|
|
22
|
-
* Fluent API로 Table column, PK, index, 관계를 정의
|
|
23
|
-
* DbContext의 queryable()과 함께 사용하여 타입 안전한 query 구성
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
readonly $
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
* @param meta
|
|
58
|
-
* @param meta.
|
|
59
|
-
* @param meta.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
*
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
1
|
+
import {
|
|
2
|
+
type ColumnBuilderRecord,
|
|
3
|
+
createColumnFactory,
|
|
4
|
+
type InferColumns,
|
|
5
|
+
type InferInsertColumns,
|
|
6
|
+
type InferUpdateColumns,
|
|
7
|
+
} from "./factory/column-builder";
|
|
8
|
+
import { createIndexFactory, type IndexBuilder } from "./factory/index-builder";
|
|
9
|
+
import {
|
|
10
|
+
createRelationFactory,
|
|
11
|
+
type InferDeepRelations,
|
|
12
|
+
type TableRelationFactory,
|
|
13
|
+
} from "./factory/relation-builder";
|
|
14
|
+
|
|
15
|
+
// ============================================
|
|
16
|
+
// TableBuilder
|
|
17
|
+
// ============================================
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Database Table 정의 builder
|
|
21
|
+
*
|
|
22
|
+
* Fluent API로 Table column, PK, index, 관계를 정의
|
|
23
|
+
* DbContext의 queryable()과 함께 사용하여 타입 안전한 query 구성
|
|
24
|
+
*
|
|
25
|
+
* 관계는 `.relations((r) => ({ ... }))` 메서드 체이닝으로 정의한다.
|
|
26
|
+
* 관계를 잡는 3번째 제네릭 `TRelations` 는 **무제약**이라, `() => typeof X` 타겟
|
|
27
|
+
* 화살표가 const 형성 중 eager 평가되지 않는다(TS6 순환 회피). 관계 대상 해소는
|
|
28
|
+
* `$inferSelect` 접근 시점에 lazy 하게 이루어진다.
|
|
29
|
+
*
|
|
30
|
+
* @template TName - Table 이름
|
|
31
|
+
* @template TColumns - Column 정의 레코드 타입
|
|
32
|
+
* @template TRelations - 관계 정의 레코드 타입 (무제약, 기본값 `{}`)
|
|
33
|
+
*
|
|
34
|
+
* @see {@link Table} factory 함수
|
|
35
|
+
* @see {@link queryable} Queryable 생성
|
|
36
|
+
*/
|
|
37
|
+
export class TableBuilder<
|
|
38
|
+
TName extends string,
|
|
39
|
+
TColumns extends ColumnBuilderRecord,
|
|
40
|
+
TRelations = {},
|
|
41
|
+
> {
|
|
42
|
+
/**
|
|
43
|
+
* 전체 타입 추론 (column + 관계).
|
|
44
|
+
*
|
|
45
|
+
* 관계는 `TRelations` 를 구조적으로 lazy walk 하여 다단계로 해소된다.
|
|
46
|
+
* (순환 감지: 같은 테이블 재방문 시 컬럼만 반환하여 끊김)
|
|
47
|
+
*/
|
|
48
|
+
readonly $inferSelect!: InferColumns<TColumns> & InferDeepRelations<TRelations>;
|
|
49
|
+
/** Column 전용 타입 추론 */
|
|
50
|
+
readonly $inferColumns!: InferColumns<TColumns>;
|
|
51
|
+
/** INSERT 타입 추론 (autoIncrement 제외, nullable/default는 optional) */
|
|
52
|
+
readonly $inferInsert!: InferInsertColumns<TColumns>;
|
|
53
|
+
/** UPDATE 타입 추론 (모든 필드 optional) */
|
|
54
|
+
readonly $inferUpdate!: InferUpdateColumns<TColumns>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @param meta - Table 메타데이터
|
|
58
|
+
* @param meta.name - Table 이름
|
|
59
|
+
* @param meta.description - Table 설명 (comment)
|
|
60
|
+
* @param meta.database - Database 이름
|
|
61
|
+
* @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
|
|
62
|
+
* @param meta.columns - Column 정의
|
|
63
|
+
* @param meta.primaryKey - PK column 배열
|
|
64
|
+
* @param meta.relations - 관계 정의 (런타임: `.relations(fn)` 호출 시 부착됨)
|
|
65
|
+
* @param meta.indexes - Index 정의
|
|
66
|
+
*/
|
|
67
|
+
constructor(
|
|
68
|
+
readonly meta: {
|
|
69
|
+
name: TName;
|
|
70
|
+
description?: string;
|
|
71
|
+
database?: string;
|
|
72
|
+
schema?: string;
|
|
73
|
+
|
|
74
|
+
columns?: TColumns;
|
|
75
|
+
primaryKey?: (keyof TColumns & string)[];
|
|
76
|
+
relations?: TRelations;
|
|
77
|
+
indexes?: IndexBuilder<(keyof TColumns & string)[]>[];
|
|
78
|
+
},
|
|
79
|
+
) {}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Table 설명 설정
|
|
83
|
+
*
|
|
84
|
+
* @param desc - Table 설명 (DDL Comment로 사용됨)
|
|
85
|
+
* @returns 새 TableBuilder 인스턴스
|
|
86
|
+
*/
|
|
87
|
+
description(desc: string): TableBuilder<TName, TColumns, TRelations> {
|
|
88
|
+
return new TableBuilder({ ...this.meta, description: desc });
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Database 이름 설정
|
|
93
|
+
*
|
|
94
|
+
* @param db - Database 이름
|
|
95
|
+
* @returns 새 TableBuilder 인스턴스
|
|
96
|
+
*/
|
|
97
|
+
database(db: string): TableBuilder<TName, TColumns, TRelations> {
|
|
98
|
+
return new TableBuilder({ ...this.meta, database: db });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Schema 이름 설정
|
|
103
|
+
*
|
|
104
|
+
* MSSQL, PostgreSQL에서 사용
|
|
105
|
+
*
|
|
106
|
+
* @param schema - Schema 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
107
|
+
* @returns 새 TableBuilder 인스턴스
|
|
108
|
+
*/
|
|
109
|
+
schema(schema: string): TableBuilder<TName, TColumns, TRelations> {
|
|
110
|
+
return new TableBuilder({ ...this.meta, schema });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Column 정의
|
|
115
|
+
*
|
|
116
|
+
* Column factory를 통한 타입 안전한 column 정의
|
|
117
|
+
*
|
|
118
|
+
* @template TNewColumnDefs - 새 Column 정의 타입
|
|
119
|
+
* @param fn - Column factory를 받아 column 정의를 반환하는 함수
|
|
120
|
+
* @returns 새 TableBuilder 인스턴스
|
|
121
|
+
*/
|
|
122
|
+
columns<TNewColumnDefs extends ColumnBuilderRecord>(
|
|
123
|
+
fn: (c: ReturnType<typeof createColumnFactory>) => TNewColumnDefs,
|
|
124
|
+
): TableBuilder<TName, TNewColumnDefs, TRelations> {
|
|
125
|
+
return new TableBuilder<TName, TNewColumnDefs, TRelations>({
|
|
126
|
+
...this.meta,
|
|
127
|
+
columns: fn(createColumnFactory()),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Primary Key 설정
|
|
133
|
+
*
|
|
134
|
+
* @param columns - PK를 구성하는 column 이름 (복합 PK 지원)
|
|
135
|
+
* @returns 새 TableBuilder 인스턴스
|
|
136
|
+
*/
|
|
137
|
+
primaryKey(...columns: (keyof TColumns & string)[]): TableBuilder<TName, TColumns, TRelations> {
|
|
138
|
+
return new TableBuilder({
|
|
139
|
+
...this.meta,
|
|
140
|
+
primaryKey: columns,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Index 정의
|
|
146
|
+
*
|
|
147
|
+
* @param fn - Index factory를 받아 index 배열을 반환하는 함수
|
|
148
|
+
* @returns 새 TableBuilder 인스턴스
|
|
149
|
+
*/
|
|
150
|
+
indexes(
|
|
151
|
+
fn: (
|
|
152
|
+
i: ReturnType<typeof createIndexFactory<keyof TColumns & string>>,
|
|
153
|
+
) => IndexBuilder<string[]>[],
|
|
154
|
+
): TableBuilder<TName, TColumns, TRelations> {
|
|
155
|
+
return new TableBuilder({
|
|
156
|
+
...this.meta,
|
|
157
|
+
indexes: fn(createIndexFactory<keyof TColumns & string>()),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 관계 정의 (FK / FKTarget / RelationKey / RelationKeyTarget)
|
|
163
|
+
*
|
|
164
|
+
* 관계 타입 `T` 는 **무제약**으로 추론되며, 내부적으로 런타임 결과를
|
|
165
|
+
* `meta.relations` 에 저장한다(`as any`). 무제약이므로 콜백 안의 `() => typeof X`
|
|
166
|
+
* 타겟 화살표가 const 형성 중 eager 평가되지 않아 TS6 순환을 회피한다.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```ts
|
|
170
|
+
* export const User = Table("User")
|
|
171
|
+
* .columns((c) => ({ id: c.bigint().autoIncrement(), companyId: c.bigint().nullable() }))
|
|
172
|
+
* .primaryKey("id")
|
|
173
|
+
* .relations((r) => ({
|
|
174
|
+
* company: r.foreignKey(["companyId"], () => Company),
|
|
175
|
+
* posts: r.foreignKeyTarget(() => Post, "user"),
|
|
176
|
+
* }));
|
|
177
|
+
* ```
|
|
178
|
+
*
|
|
179
|
+
* @template T - 관계 정의 레코드 타입 (무제약)
|
|
180
|
+
* @param fn - 관계 factory를 받아 관계 정의를 반환하는 함수
|
|
181
|
+
* @returns 관계가 부착된 새 TableBuilder 인스턴스
|
|
182
|
+
*/
|
|
183
|
+
relations<T>(
|
|
184
|
+
fn: (r: TableRelationFactory<keyof TColumns & string>) => T,
|
|
185
|
+
): TableBuilder<TName, TColumns, T> {
|
|
186
|
+
return new TableBuilder({
|
|
187
|
+
...this.meta,
|
|
188
|
+
relations: fn(createRelationFactory<keyof TColumns & string>()) as any,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ============================================
|
|
194
|
+
// Table 함수
|
|
195
|
+
// ============================================
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Table builder factory 함수
|
|
199
|
+
*
|
|
200
|
+
* Fluent API로 Table schema를 정의하기 위한 TableBuilder를 생성
|
|
201
|
+
*
|
|
202
|
+
* @param name - Table 이름
|
|
203
|
+
* @returns TableBuilder 인스턴스
|
|
204
|
+
*
|
|
205
|
+
* @see {@link TableBuilder} builder 클래스
|
|
206
|
+
*/
|
|
207
|
+
export function Table<TName extends string>(name: TName) {
|
|
208
|
+
return new TableBuilder<TName, ColumnBuilderRecord, {}>({ name });
|
|
209
|
+
}
|