@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
|
@@ -17,13 +17,13 @@ import {
|
|
|
17
17
|
// ============================================
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* Database Table
|
|
20
|
+
* Database Table 정의 builder
|
|
21
21
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
22
|
+
* Fluent API로 Table column, PK, index, 관계를 정의
|
|
23
|
+
* DbContext의 queryable()과 함께 사용하여 타입 안전한 query 구성
|
|
24
24
|
*
|
|
25
|
-
* @template TColumns - Column
|
|
26
|
-
* @template TRelations -
|
|
25
|
+
* @template TColumns - Column 정의 레코드 타입
|
|
26
|
+
* @template TRelations - 관계 정의 레코드 타입
|
|
27
27
|
*
|
|
28
28
|
* @example
|
|
29
29
|
* ```typescript
|
|
@@ -45,37 +45,37 @@ import {
|
|
|
45
45
|
* }
|
|
46
46
|
* ```
|
|
47
47
|
*
|
|
48
|
-
* @see {@link Table} factory
|
|
49
|
-
* @see {@link queryable} Queryable
|
|
48
|
+
* @see {@link Table} factory 함수
|
|
49
|
+
* @see {@link queryable} Queryable 생성
|
|
50
50
|
*/
|
|
51
51
|
export class TableBuilder<
|
|
52
52
|
TColumns extends ColumnBuilderRecord,
|
|
53
53
|
TRelations extends RelationBuilderRecord,
|
|
54
54
|
> {
|
|
55
|
-
/** Column
|
|
55
|
+
/** Column 정의 (타입 추론용) */
|
|
56
56
|
readonly $columns!: TColumns;
|
|
57
|
-
/**
|
|
57
|
+
/** 관계 정의 (타입 추론용) */
|
|
58
58
|
readonly $relations!: TRelations;
|
|
59
59
|
|
|
60
|
-
/**
|
|
60
|
+
/** 전체 타입 추론 (column + 관계) */
|
|
61
61
|
readonly $inferSelect!: InferColumns<TColumns> & InferDeepRelations<TRelations>;
|
|
62
|
-
/** Column
|
|
62
|
+
/** Column 전용 타입 추론 */
|
|
63
63
|
readonly $inferColumns!: InferColumns<TColumns>;
|
|
64
|
-
/** INSERT
|
|
64
|
+
/** INSERT 타입 추론 (autoIncrement 제외, nullable/default는 optional) */
|
|
65
65
|
readonly $inferInsert!: InferInsertColumns<TColumns>;
|
|
66
|
-
/** UPDATE
|
|
66
|
+
/** UPDATE 타입 추론 (모든 필드 optional) */
|
|
67
67
|
readonly $inferUpdate!: InferUpdateColumns<TColumns>;
|
|
68
68
|
|
|
69
69
|
/**
|
|
70
|
-
* @param meta - Table
|
|
71
|
-
* @param meta.name - Table
|
|
72
|
-
* @param meta.description - Table
|
|
73
|
-
* @param meta.database - Database
|
|
74
|
-
* @param meta.schema - Schema
|
|
75
|
-
* @param meta.columns - Column
|
|
76
|
-
* @param meta.primaryKey - PK column
|
|
77
|
-
* @param meta.relations -
|
|
78
|
-
* @param meta.indexes - Index
|
|
70
|
+
* @param meta - Table 메타데이터
|
|
71
|
+
* @param meta.name - Table 이름
|
|
72
|
+
* @param meta.description - Table 설명 (comment)
|
|
73
|
+
* @param meta.database - Database 이름
|
|
74
|
+
* @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
|
|
75
|
+
* @param meta.columns - Column 정의
|
|
76
|
+
* @param meta.primaryKey - PK column 배열
|
|
77
|
+
* @param meta.relations - 관계 정의
|
|
78
|
+
* @param meta.indexes - Index 정의
|
|
79
79
|
*/
|
|
80
80
|
constructor(
|
|
81
81
|
readonly meta: {
|
|
@@ -92,20 +92,20 @@ export class TableBuilder<
|
|
|
92
92
|
) {}
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
|
-
* Table
|
|
95
|
+
* Table 설명 설정
|
|
96
96
|
*
|
|
97
|
-
* @param desc - Table
|
|
98
|
-
* @returns
|
|
97
|
+
* @param desc - Table 설명 (DDL Comment로 사용됨)
|
|
98
|
+
* @returns 새 TableBuilder 인스턴스
|
|
99
99
|
*/
|
|
100
100
|
description(desc: string) {
|
|
101
101
|
return new TableBuilder({ ...this.meta, description: desc });
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
/**
|
|
105
|
-
* Database
|
|
105
|
+
* Database 이름 설정
|
|
106
106
|
*
|
|
107
|
-
* @param db - Database
|
|
108
|
-
* @returns
|
|
107
|
+
* @param db - Database 이름
|
|
108
|
+
* @returns 새 TableBuilder 인스턴스
|
|
109
109
|
*
|
|
110
110
|
* @example
|
|
111
111
|
* ```typescript
|
|
@@ -117,12 +117,12 @@ export class TableBuilder<
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
/**
|
|
120
|
-
*
|
|
120
|
+
* Schema 이름 설정
|
|
121
121
|
*
|
|
122
|
-
*
|
|
122
|
+
* MSSQL, PostgreSQL에서 사용
|
|
123
123
|
*
|
|
124
|
-
* @param schema - Schema
|
|
125
|
-
* @returns
|
|
124
|
+
* @param schema - Schema 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
125
|
+
* @returns 새 TableBuilder 인스턴스
|
|
126
126
|
*
|
|
127
127
|
* @example
|
|
128
128
|
* ```typescript
|
|
@@ -136,13 +136,13 @@ export class TableBuilder<
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
/**
|
|
139
|
-
* Column
|
|
139
|
+
* Column 정의
|
|
140
140
|
*
|
|
141
|
-
*
|
|
141
|
+
* Column factory를 통한 타입 안전한 column 정의
|
|
142
142
|
*
|
|
143
|
-
* @template TNewColumnDefs -
|
|
144
|
-
* @param fn -
|
|
145
|
-
* @returns
|
|
143
|
+
* @template TNewColumnDefs - 새 Column 정의 타입
|
|
144
|
+
* @param fn - Column factory를 받아 column 정의를 반환하는 함수
|
|
145
|
+
* @returns 새 TableBuilder 인스턴스
|
|
146
146
|
*
|
|
147
147
|
* @example
|
|
148
148
|
* ```typescript
|
|
@@ -165,19 +165,19 @@ export class TableBuilder<
|
|
|
165
165
|
}
|
|
166
166
|
|
|
167
167
|
/**
|
|
168
|
-
* Primary Key
|
|
168
|
+
* Primary Key 설정
|
|
169
169
|
*
|
|
170
|
-
* @param columns -
|
|
171
|
-
* @returns
|
|
170
|
+
* @param columns - PK를 구성하는 column 이름 (복합 PK 지원)
|
|
171
|
+
* @returns 새 TableBuilder 인스턴스
|
|
172
172
|
*
|
|
173
173
|
* @example
|
|
174
174
|
* ```typescript
|
|
175
|
-
* //
|
|
175
|
+
* // 단일 PK
|
|
176
176
|
* const User = Table("User")
|
|
177
177
|
* .columns((c) => ({ id: c.bigint() }))
|
|
178
178
|
* .primaryKey("id");
|
|
179
179
|
*
|
|
180
|
-
* //
|
|
180
|
+
* // 복합 PK
|
|
181
181
|
* const UserRole = Table("UserRole")
|
|
182
182
|
* .columns((c) => ({
|
|
183
183
|
* userId: c.bigint(),
|
|
@@ -194,10 +194,10 @@ export class TableBuilder<
|
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
/**
|
|
197
|
-
* Index
|
|
197
|
+
* Index 정의
|
|
198
198
|
*
|
|
199
|
-
* @param fn -
|
|
200
|
-
* @returns
|
|
199
|
+
* @param fn - Index factory를 받아 index 배열을 반환하는 함수
|
|
200
|
+
* @returns 새 TableBuilder 인스턴스
|
|
201
201
|
*
|
|
202
202
|
* @example
|
|
203
203
|
* ```typescript
|
|
@@ -225,13 +225,13 @@ export class TableBuilder<
|
|
|
225
225
|
}
|
|
226
226
|
|
|
227
227
|
/**
|
|
228
|
-
*
|
|
228
|
+
* 관계 정의
|
|
229
229
|
*
|
|
230
|
-
*
|
|
230
|
+
* FK, 역참조 등 Table 간 관계를 설정
|
|
231
231
|
*
|
|
232
|
-
* @template T -
|
|
233
|
-
* @param fn -
|
|
234
|
-
* @returns
|
|
232
|
+
* @template T - 관계 정의 타입
|
|
233
|
+
* @param fn - 관계 factory를 받아 관계 정의를 반환하는 함수
|
|
234
|
+
* @returns 새 TableBuilder 인스턴스
|
|
235
235
|
*
|
|
236
236
|
* @example
|
|
237
237
|
* ```typescript
|
|
@@ -273,16 +273,16 @@ export class TableBuilder<
|
|
|
273
273
|
}
|
|
274
274
|
|
|
275
275
|
// ============================================
|
|
276
|
-
// Table
|
|
276
|
+
// Table 함수
|
|
277
277
|
// ============================================
|
|
278
278
|
|
|
279
279
|
/**
|
|
280
|
-
* Table builder factory
|
|
280
|
+
* Table builder factory 함수
|
|
281
281
|
*
|
|
282
|
-
*
|
|
282
|
+
* Fluent API로 Table schema를 정의하기 위한 TableBuilder를 생성
|
|
283
283
|
*
|
|
284
|
-
* @param name - Table
|
|
285
|
-
* @returns TableBuilder
|
|
284
|
+
* @param name - Table 이름
|
|
285
|
+
* @returns TableBuilder 인스턴스
|
|
286
286
|
*
|
|
287
287
|
* @example
|
|
288
288
|
* ```typescript
|
|
@@ -312,7 +312,7 @@ export class TableBuilder<
|
|
|
312
312
|
* }));
|
|
313
313
|
* ```
|
|
314
314
|
*
|
|
315
|
-
* @see {@link TableBuilder} builder
|
|
315
|
+
* @see {@link TableBuilder} builder 클래스
|
|
316
316
|
*/
|
|
317
317
|
export function Table(name: string) {
|
|
318
318
|
return new TableBuilder({ name });
|
|
@@ -12,14 +12,14 @@ import {
|
|
|
12
12
|
// ============================================
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
* Database View
|
|
15
|
+
* Database View 정의 builder
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* Fluent API로 View query와 관계를 정의
|
|
18
|
+
* DbContext의 queryable()과 함께 사용하여 타입 안전한 query 구성
|
|
19
19
|
*
|
|
20
|
-
* @template TDbContext - DbContext
|
|
21
|
-
* @template TData - View
|
|
22
|
-
* @template TRelations -
|
|
20
|
+
* @template TDbContext - DbContext 타입
|
|
21
|
+
* @template TData - View 데이터 레코드 타입
|
|
22
|
+
* @template TRelations - 관계 정의 레코드 타입
|
|
23
23
|
*
|
|
24
24
|
* @example
|
|
25
25
|
* ```typescript
|
|
@@ -44,27 +44,27 @@ import {
|
|
|
44
44
|
* }
|
|
45
45
|
* ```
|
|
46
46
|
*
|
|
47
|
-
* @see {@link View} factory
|
|
48
|
-
* @see {@link queryable} Queryable
|
|
47
|
+
* @see {@link View} factory 함수
|
|
48
|
+
* @see {@link queryable} Queryable 생성
|
|
49
49
|
*/
|
|
50
50
|
export class ViewBuilder<
|
|
51
51
|
TDbContext extends DbContextBase,
|
|
52
52
|
TData extends DataRecord,
|
|
53
53
|
TRelations extends RelationBuilderRecord,
|
|
54
54
|
> {
|
|
55
|
-
/**
|
|
55
|
+
/** 관계 정의 (타입 추론용) */
|
|
56
56
|
readonly $relations!: TRelations;
|
|
57
|
-
/**
|
|
57
|
+
/** 전체 타입 추론 */
|
|
58
58
|
readonly $inferSelect!: TData;
|
|
59
59
|
|
|
60
60
|
/**
|
|
61
|
-
* @param meta - View
|
|
62
|
-
* @param meta.name - View
|
|
63
|
-
* @param meta.description - View
|
|
64
|
-
* @param meta.database - Database
|
|
65
|
-
* @param meta.schema - Schema
|
|
66
|
-
* @param meta.viewFn - View
|
|
67
|
-
* @param meta.relations -
|
|
61
|
+
* @param meta - View 메타데이터
|
|
62
|
+
* @param meta.name - View 이름
|
|
63
|
+
* @param meta.description - View 설명 (comment)
|
|
64
|
+
* @param meta.database - Database 이름
|
|
65
|
+
* @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
|
|
66
|
+
* @param meta.viewFn - View query 정의 함수
|
|
67
|
+
* @param meta.relations - 관계 정의
|
|
68
68
|
*/
|
|
69
69
|
constructor(
|
|
70
70
|
readonly meta: {
|
|
@@ -78,20 +78,20 @@ export class ViewBuilder<
|
|
|
78
78
|
) {}
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
|
-
* View
|
|
81
|
+
* View 설명 설정
|
|
82
82
|
*
|
|
83
|
-
* @param desc - View
|
|
84
|
-
* @returns
|
|
83
|
+
* @param desc - View 설명 (DDL Comment로 사용됨)
|
|
84
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
85
85
|
*/
|
|
86
86
|
description(desc: string): ViewBuilder<TDbContext, TData, TRelations> {
|
|
87
87
|
return new ViewBuilder({ ...this.meta, description: desc });
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
/**
|
|
91
|
-
* Database
|
|
91
|
+
* Database 이름 설정
|
|
92
92
|
*
|
|
93
|
-
* @param db - Database
|
|
94
|
-
* @returns
|
|
93
|
+
* @param db - Database 이름
|
|
94
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
95
95
|
*
|
|
96
96
|
* @example
|
|
97
97
|
* ```typescript
|
|
@@ -103,26 +103,26 @@ export class ViewBuilder<
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
/**
|
|
106
|
-
*
|
|
106
|
+
* Schema 이름 설정
|
|
107
107
|
*
|
|
108
|
-
*
|
|
108
|
+
* MSSQL, PostgreSQL에서 사용
|
|
109
109
|
*
|
|
110
|
-
* @param schema - Schema
|
|
111
|
-
* @returns
|
|
110
|
+
* @param schema - Schema 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
111
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
112
112
|
*/
|
|
113
113
|
schema(schema: string): ViewBuilder<TDbContext, TData, TRelations> {
|
|
114
114
|
return new ViewBuilder({ ...this.meta, schema });
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
/**
|
|
118
|
-
* View
|
|
118
|
+
* View query 정의
|
|
119
119
|
*
|
|
120
|
-
*
|
|
120
|
+
* SELECT query를 통해 View의 데이터 소스를 정의
|
|
121
121
|
*
|
|
122
|
-
* @template TViewData - View
|
|
123
|
-
* @template TDb - DbContext
|
|
124
|
-
* @param viewFn -
|
|
125
|
-
* @returns
|
|
122
|
+
* @template TViewData - View 데이터 타입
|
|
123
|
+
* @template TDb - DbContext 타입
|
|
124
|
+
* @param viewFn - DbContext를 받아 Queryable을 반환하는 함수
|
|
125
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
126
126
|
*
|
|
127
127
|
* @example
|
|
128
128
|
* ```typescript
|
|
@@ -146,13 +146,13 @@ export class ViewBuilder<
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/**
|
|
149
|
-
*
|
|
149
|
+
* 관계 정의
|
|
150
150
|
*
|
|
151
|
-
*
|
|
151
|
+
* 다른 Table/View와의 관계를 설정
|
|
152
152
|
*
|
|
153
|
-
* @template T -
|
|
154
|
-
* @param fn -
|
|
155
|
-
* @returns
|
|
153
|
+
* @template T - 관계 정의 타입
|
|
154
|
+
* @param fn - 관계 factory를 받아 관계 정의를 반환하는 함수
|
|
155
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
156
156
|
*
|
|
157
157
|
* @example
|
|
158
158
|
* ```typescript
|
|
@@ -169,8 +169,8 @@ export class ViewBuilder<
|
|
|
169
169
|
relations<T extends RelationBuilderRecord>(
|
|
170
170
|
fn: (r: ReturnType<typeof createRelationFactory<this, keyof TData & string>>) => T,
|
|
171
171
|
): ViewBuilder<TDbContext, TData & InferDeepRelations<T>, TRelations> {
|
|
172
|
-
//
|
|
173
|
-
//
|
|
172
|
+
// TypeScript 제네릭 타입 추론 한계로 인해 캐스팅이 불가피
|
|
173
|
+
// TRelations 타입 파라미터와 새로 생성된 관계 타입 T 간의 타입 불일치 해결
|
|
174
174
|
return new ViewBuilder({
|
|
175
175
|
...this.meta,
|
|
176
176
|
relations: fn(createRelationFactory<this, keyof TData & string>(() => this)),
|
|
@@ -179,16 +179,16 @@ export class ViewBuilder<
|
|
|
179
179
|
}
|
|
180
180
|
|
|
181
181
|
// ============================================
|
|
182
|
-
// View
|
|
182
|
+
// View 함수
|
|
183
183
|
// ============================================
|
|
184
184
|
|
|
185
185
|
/**
|
|
186
|
-
* View builder factory
|
|
186
|
+
* View builder factory 함수
|
|
187
187
|
*
|
|
188
|
-
*
|
|
188
|
+
* Fluent API로 View schema를 정의하기 위한 ViewBuilder를 생성
|
|
189
189
|
*
|
|
190
|
-
* @param name - View
|
|
191
|
-
* @returns ViewBuilder
|
|
190
|
+
* @param name - View 이름
|
|
191
|
+
* @returns ViewBuilder 인스턴스
|
|
192
192
|
*
|
|
193
193
|
* @example
|
|
194
194
|
* ```typescript
|
|
@@ -201,7 +201,7 @@ export class ViewBuilder<
|
|
|
201
201
|
* .select(u => ({ id: u.id, name: u.name }))
|
|
202
202
|
* );
|
|
203
203
|
*
|
|
204
|
-
* //
|
|
204
|
+
* // 집계 View
|
|
205
205
|
* const UserStats = View("UserStats")
|
|
206
206
|
* .database("mydb")
|
|
207
207
|
* .query((db: MyDb) =>
|
|
@@ -214,7 +214,7 @@ export class ViewBuilder<
|
|
|
214
214
|
* );
|
|
215
215
|
* ```
|
|
216
216
|
*
|
|
217
|
-
* @see {@link ViewBuilder} builder
|
|
217
|
+
* @see {@link ViewBuilder} builder 클래스
|
|
218
218
|
*/
|
|
219
219
|
export function View(name: string) {
|
|
220
220
|
return new ViewBuilder({ name });
|
package/src/types/column.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { DateOnly, DateTime, Time, Uuid, type Bytes } from "@simplysm/core-common";
|
|
2
2
|
|
|
3
3
|
// ============================================
|
|
4
|
-
// DataType (SQL
|
|
4
|
+
// DataType (SQL 타입 정의)
|
|
5
5
|
// ============================================
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* SQL
|
|
8
|
+
* SQL 데이터 타입 정의
|
|
9
9
|
*
|
|
10
|
-
* DBMS
|
|
10
|
+
* DBMS 매핑:
|
|
11
11
|
* - `int`: INT (4 bytes)
|
|
12
12
|
* - `bigint`: BIGINT (8 bytes)
|
|
13
13
|
* - `float`: FLOAT/REAL (4 bytes)
|
|
@@ -47,13 +47,13 @@ export type DataType =
|
|
|
47
47
|
| { type: "uuid" };
|
|
48
48
|
|
|
49
49
|
// ============================================
|
|
50
|
-
// ColumnPrimitive (TypeScript
|
|
50
|
+
// ColumnPrimitive (TypeScript 타입)
|
|
51
51
|
// ============================================
|
|
52
52
|
|
|
53
53
|
/**
|
|
54
|
-
* Column
|
|
54
|
+
* Column 원시 타입 매핑
|
|
55
55
|
*
|
|
56
|
-
* TypeScript
|
|
56
|
+
* TypeScript 타입 이름 (문자열) → 실제 TypeScript 타입 매핑
|
|
57
57
|
*
|
|
58
58
|
* @example
|
|
59
59
|
* ```typescript
|
|
@@ -73,7 +73,7 @@ export type ColumnPrimitiveMap = {
|
|
|
73
73
|
};
|
|
74
74
|
|
|
75
75
|
/**
|
|
76
|
-
* Column
|
|
76
|
+
* Column 원시 타입 이름 (문자열)
|
|
77
77
|
*
|
|
78
78
|
* @example
|
|
79
79
|
* ```typescript
|
|
@@ -84,9 +84,9 @@ export type ColumnPrimitiveMap = {
|
|
|
84
84
|
export type ColumnPrimitiveStr = keyof ColumnPrimitiveMap;
|
|
85
85
|
|
|
86
86
|
/**
|
|
87
|
-
*
|
|
87
|
+
* Column에 저장 가능한 모든 원시 타입
|
|
88
88
|
*
|
|
89
|
-
* undefined
|
|
89
|
+
* undefined는 NULL을 나타냄
|
|
90
90
|
*/
|
|
91
91
|
export type ColumnPrimitive = ColumnPrimitiveMap[ColumnPrimitiveStr] | undefined;
|
|
92
92
|
|
|
@@ -95,7 +95,7 @@ export type ColumnPrimitive = ColumnPrimitiveMap[ColumnPrimitiveStr] | undefined
|
|
|
95
95
|
// ============================================
|
|
96
96
|
|
|
97
97
|
/**
|
|
98
|
-
* SQL DataType → TypeScript
|
|
98
|
+
* SQL DataType → TypeScript 타입 이름 매핑
|
|
99
99
|
*
|
|
100
100
|
* @example
|
|
101
101
|
* ```typescript
|
|
@@ -121,7 +121,7 @@ export const dataTypeStrToColumnPrimitiveStr = {
|
|
|
121
121
|
};
|
|
122
122
|
|
|
123
123
|
/**
|
|
124
|
-
* TypeScript
|
|
124
|
+
* DataType으로부터 TypeScript 타입 추론
|
|
125
125
|
*
|
|
126
126
|
* @template T - DataType
|
|
127
127
|
*
|
|
@@ -135,11 +135,11 @@ export type InferColumnPrimitiveFromDataType<TDataType extends DataType> =
|
|
|
135
135
|
ColumnPrimitiveMap[(typeof dataTypeStrToColumnPrimitiveStr)[TDataType["type"]]];
|
|
136
136
|
|
|
137
137
|
/**
|
|
138
|
-
*
|
|
138
|
+
* 런타임 값에서 ColumnPrimitiveStr 추론
|
|
139
139
|
*
|
|
140
|
-
* @param value - Column
|
|
141
|
-
* @returns ColumnPrimitiveStr
|
|
142
|
-
* @throws
|
|
140
|
+
* @param value - Column 값
|
|
141
|
+
* @returns ColumnPrimitiveStr 타입 이름
|
|
142
|
+
* @throws 값 타입이 알 수 없을 때 Error
|
|
143
143
|
*
|
|
144
144
|
* @example
|
|
145
145
|
* ```typescript
|
|
@@ -157,7 +157,7 @@ export function inferColumnPrimitiveStr(value: ColumnPrimitive): ColumnPrimitive
|
|
|
157
157
|
if (value instanceof Time) return "Time";
|
|
158
158
|
if (value instanceof Uuid) return "Uuid";
|
|
159
159
|
if (value instanceof Uint8Array) return "Bytes";
|
|
160
|
-
throw new Error(
|
|
160
|
+
throw new Error(`알 수 없는 값 타입: ${typeof value}`);
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
// ============================================
|
|
@@ -165,16 +165,16 @@ export function inferColumnPrimitiveStr(value: ColumnPrimitive): ColumnPrimitive
|
|
|
165
165
|
// ============================================
|
|
166
166
|
|
|
167
167
|
/**
|
|
168
|
-
* Column
|
|
168
|
+
* Column 메타데이터
|
|
169
169
|
*
|
|
170
|
-
*
|
|
170
|
+
* ColumnBuilder에서 생성되어 TableBuilder에 전달됨
|
|
171
171
|
*
|
|
172
|
-
* @property type - TypeScript
|
|
173
|
-
* @property dataType - SQL
|
|
174
|
-
* @property autoIncrement -
|
|
175
|
-
* @property nullable -
|
|
176
|
-
* @property default -
|
|
177
|
-
* @property description - Column
|
|
172
|
+
* @property type - TypeScript 타입 이름 (ColumnPrimitiveStr)
|
|
173
|
+
* @property dataType - SQL 데이터 타입
|
|
174
|
+
* @property autoIncrement - 자동 증가 여부
|
|
175
|
+
* @property nullable - NULL 허용 여부
|
|
176
|
+
* @property default - 기본값
|
|
177
|
+
* @property description - Column 설명 (DDL 코멘트)
|
|
178
178
|
*
|
|
179
179
|
* @see {@link ColumnBuilder} Column builder
|
|
180
180
|
*/
|
|
@@ -8,11 +8,11 @@ import type { DataRecord, IsolationLevel, Migration, ResultMeta } from "./db";
|
|
|
8
8
|
import type { QueryDef, QueryDefObjectName } from "./query-def";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* DbContext
|
|
11
|
+
* DbContext 핵심 인터페이스
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* Queryable, Executable, ViewBuilder에서 사용하는 내부 인터페이스.
|
|
14
|
+
* 기존 DbContext 클래스와 새로운 createDbContext 반환 객체 모두
|
|
15
|
+
* 이 인터페이스를 만족함.
|
|
16
16
|
*/
|
|
17
17
|
export interface DbContextBase {
|
|
18
18
|
status: DbContextStatus;
|
|
@@ -33,9 +33,9 @@ export interface DbContextBase {
|
|
|
33
33
|
export type DbContextStatus = "ready" | "connect" | "transact";
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
|
-
* DbContext
|
|
36
|
+
* DbContext 정의 (blueprint)
|
|
37
37
|
*
|
|
38
|
-
*
|
|
38
|
+
* defineDbContext()로 생성됨. Schema 메타데이터만 포함하며 런타임 상태는 없음.
|
|
39
39
|
*/
|
|
40
40
|
export interface DbContextDef<
|
|
41
41
|
TTables extends Record<string, TableBuilder<any, any>>,
|
|
@@ -51,35 +51,35 @@ export interface DbContextDef<
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
54
|
+
* 전체 DbContext 인스턴스 타입 (createDbContext로 생성)
|
|
55
55
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
56
|
+
* DbContextBase를 queryable 접근자, DDL 메서드,
|
|
57
|
+
* 연결/트랜잭션 관리로 확장.
|
|
58
58
|
*/
|
|
59
59
|
export type DbContextInstance<TDef extends DbContextDef<any, any, any>> = DbContextBase &
|
|
60
60
|
DbContextConnectionMethods &
|
|
61
61
|
DbContextDdlMethods & {
|
|
62
|
-
//
|
|
62
|
+
// 자동 매핑된 table queryable 접근자
|
|
63
63
|
[K in keyof TDef["meta"]["tables"]]: () => import("../exec/queryable").Queryable<
|
|
64
64
|
TDef["meta"]["tables"][K]["$inferSelect"],
|
|
65
65
|
TDef["meta"]["tables"][K]
|
|
66
66
|
>;
|
|
67
67
|
} & {
|
|
68
|
-
//
|
|
68
|
+
// 자동 매핑된 view queryable 접근자
|
|
69
69
|
[K in keyof TDef["meta"]["views"]]: () => import("../exec/queryable").Queryable<
|
|
70
70
|
TDef["meta"]["views"][K]["$inferSelect"],
|
|
71
71
|
never
|
|
72
72
|
>;
|
|
73
73
|
} & {
|
|
74
|
-
//
|
|
74
|
+
// 자동 매핑된 procedure executable 접근자
|
|
75
75
|
[K in keyof TDef["meta"]["procedures"]]: () => import("../exec/executable").Executable<
|
|
76
76
|
TDef["meta"]["procedures"][K]["$params"],
|
|
77
77
|
TDef["meta"]["procedures"][K]["$returns"]
|
|
78
78
|
>;
|
|
79
79
|
} & {
|
|
80
|
-
//
|
|
80
|
+
// 시스템 table
|
|
81
81
|
_migration: () => import("../exec/queryable").Queryable<{ code: string }, any>;
|
|
82
|
-
//
|
|
82
|
+
// 초기화
|
|
83
83
|
initialize(options?: { dbs?: string[]; force?: boolean }): Promise<void>;
|
|
84
84
|
};
|
|
85
85
|
|
|
@@ -123,7 +123,7 @@ export interface DbContextDdlMethods {
|
|
|
123
123
|
schemaExists(database: string, schema?: string): Promise<boolean>;
|
|
124
124
|
truncate(table: QueryDefObjectName): Promise<void>;
|
|
125
125
|
switchFk(table: QueryDefObjectName, enabled: boolean): Promise<void>;
|
|
126
|
-
// QueryDef
|
|
126
|
+
// QueryDef 생성기
|
|
127
127
|
getCreateTableQueryDef(table: TableBuilder<any, any>): QueryDef;
|
|
128
128
|
getCreateViewQueryDef(view: ViewBuilder<any, any, any>): QueryDef;
|
|
129
129
|
getCreateProcQueryDef(procedure: ProcedureBuilder<any, any>): QueryDef;
|