@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.
Files changed (89) hide show
  1. package/dist/db-context.d.ts +11 -10
  2. package/dist/db-context.d.ts.map +1 -1
  3. package/dist/db-context.js +14 -11
  4. package/dist/db-context.js.map +1 -1
  5. package/dist/ddl/initialize.js.map +1 -1
  6. package/dist/ddl/relation-ddl.d.ts +1 -1
  7. package/dist/ddl/relation-ddl.d.ts.map +1 -1
  8. package/dist/ddl/relation-ddl.js.map +1 -1
  9. package/dist/ddl/table-ddl.d.ts +3 -3
  10. package/dist/ddl/table-ddl.d.ts.map +1 -1
  11. package/dist/ddl/table-ddl.js.map +1 -1
  12. package/dist/errors/db-transaction-error.d.ts +4 -5
  13. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  14. package/dist/errors/db-transaction-error.js +5 -6
  15. package/dist/errors/db-transaction-error.js.map +1 -1
  16. package/dist/exec/executable.d.ts +4 -13
  17. package/dist/exec/executable.d.ts.map +1 -1
  18. package/dist/exec/executable.js.map +1 -1
  19. package/dist/exec/queryable.d.ts +11 -9
  20. package/dist/exec/queryable.d.ts.map +1 -1
  21. package/dist/exec/queryable.js +9 -5
  22. package/dist/exec/queryable.js.map +1 -1
  23. package/dist/expr/expr.d.ts +7 -4
  24. package/dist/expr/expr.d.ts.map +1 -1
  25. package/dist/expr/expr.js +5 -2
  26. package/dist/expr/expr.js.map +1 -1
  27. package/dist/models/system-migration.d.ts +1 -1
  28. package/dist/models/system-migration.d.ts.map +1 -1
  29. package/dist/query-builder/base/expr-renderer-base.d.ts +2 -1
  30. package/dist/query-builder/base/expr-renderer-base.d.ts.map +1 -1
  31. package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
  32. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +2 -2
  33. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  34. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
  35. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +2 -2
  36. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  37. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
  38. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +2 -2
  39. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  40. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
  41. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  42. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
  43. package/dist/schema/factory/column-builder.d.ts +1 -1
  44. package/dist/schema/factory/column-builder.d.ts.map +1 -1
  45. package/dist/schema/factory/relation-builder.d.ts +55 -49
  46. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  47. package/dist/schema/factory/relation-builder.js +12 -15
  48. package/dist/schema/factory/relation-builder.js.map +1 -1
  49. package/dist/schema/table-builder.d.ts +35 -18
  50. package/dist/schema/table-builder.d.ts.map +1 -1
  51. package/dist/schema/table-builder.js +32 -15
  52. package/dist/schema/table-builder.js.map +1 -1
  53. package/dist/schema/view-builder.d.ts +28 -24
  54. package/dist/schema/view-builder.d.ts.map +1 -1
  55. package/dist/schema/view-builder.js +18 -14
  56. package/dist/schema/view-builder.js.map +1 -1
  57. package/dist/types/column.d.ts +6 -17
  58. package/dist/types/column.d.ts.map +1 -1
  59. package/dist/types/column.js +3 -19
  60. package/dist/types/column.js.map +1 -1
  61. package/dist/types/db-context-def.d.ts +7 -7
  62. package/dist/types/db-context-def.d.ts.map +1 -1
  63. package/dist/types/query-def.d.ts +1 -1
  64. package/dist/types/query-def.d.ts.map +1 -1
  65. package/dist/utils/result-parser.d.ts.map +1 -1
  66. package/dist/utils/result-parser.js +3 -7
  67. package/dist/utils/result-parser.js.map +1 -1
  68. package/package.json +3 -3
  69. package/src/db-context.ts +23 -20
  70. package/src/ddl/initialize.ts +4 -4
  71. package/src/ddl/relation-ddl.ts +1 -1
  72. package/src/ddl/table-ddl.ts +3 -3
  73. package/src/errors/db-transaction-error.ts +6 -4
  74. package/src/exec/executable.ts +5 -4
  75. package/src/exec/queryable.ts +31 -24
  76. package/src/expr/expr.ts +10 -4
  77. package/src/query-builder/base/expr-renderer-base.ts +2 -1
  78. package/src/query-builder/mssql/mssql-expr-renderer.ts +5 -5
  79. package/src/query-builder/mysql/mysql-expr-renderer.ts +2 -2
  80. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +5 -5
  81. package/src/query-builder/postgresql/postgresql-query-builder.ts +4 -3
  82. package/src/schema/factory/column-builder.ts +3 -3
  83. package/src/schema/factory/relation-builder.ts +350 -346
  84. package/src/schema/table-builder.ts +209 -193
  85. package/src/schema/view-builder.ts +148 -143
  86. package/src/types/column.ts +7 -26
  87. package/src/types/db-context-def.ts +7 -7
  88. package/src/types/query-def.ts +1 -1
  89. 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 RelationBuilderRecord,
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
- * @template TColumns - Column 정의 레코드 타입
26
- * @template TRelations - 관계 정의 레코드 타입
27
- *
28
- * @see {@link Table} factory 함수
29
- * @see {@link queryable} Queryable 생성
30
- */
31
- export class TableBuilder<
32
- TName extends string,
33
- TColumns extends ColumnBuilderRecord,
34
- TRelations extends RelationBuilderRecord,
35
- > {
36
- /** Column 정의 (타입 추론용) */
37
- readonly $columns!: TColumns;
38
- /** 관계 정의 (타입 추론용) */
39
- readonly $relations!: TRelations;
40
-
41
- /** 전체 타입 추론 (column + 관계) — 순환 감지: 같은 테이블 재방문 시 끊김 */
42
- readonly $inferSelect!: InferColumns<TColumns> & InferDeepRelations<TRelations>;
43
- /** Column 전용 타입 추론 */
44
- readonly $inferColumns!: InferColumns<TColumns>;
45
- /** INSERT 타입 추론 (autoIncrement 제외, nullable/default는 optional) */
46
- readonly $inferInsert!: InferInsertColumns<TColumns>;
47
- /** UPDATE 타입 추론 (모든 필드 optional) */
48
- readonly $inferUpdate!: InferUpdateColumns<TColumns>;
49
-
50
- /**
51
- * @param meta - Table 메타데이터
52
- * @param meta.name - Table 이름
53
- * @param meta.description - Table 설명 (comment)
54
- * @param meta.database - Database 이름
55
- * @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
56
- * @param meta.columns - Column 정의
57
- * @param meta.primaryKey - PK column 배열
58
- * @param meta.relations - 관계 정의
59
- * @param meta.indexes - Index 정의
60
- */
61
- constructor(
62
- readonly meta: {
63
- name: TName;
64
- description?: string;
65
- database?: string;
66
- schema?: string;
67
-
68
- columns?: TColumns;
69
- primaryKey?: (keyof TColumns & string)[];
70
- relations?: TRelations;
71
- indexes?: IndexBuilder<(keyof TColumns & string)[]>[];
72
- },
73
- ) {}
74
-
75
- /**
76
- * Table 설명 설정
77
- *
78
- * @param desc - Table 설명 (DDL Comment로 사용됨)
79
- * @returns 새 TableBuilder 인스턴스
80
- */
81
- description(desc: string): TableBuilder<TName, TColumns, TRelations> {
82
- return new TableBuilder({ ...this.meta, description: desc });
83
- }
84
-
85
- /**
86
- * Database 이름 설정
87
- *
88
- * @param db - Database 이름
89
- * @returns 새 TableBuilder 인스턴스
90
- */
91
- database(db: string): TableBuilder<TName, TColumns, TRelations> {
92
- return new TableBuilder({ ...this.meta, database: db });
93
- }
94
-
95
- /**
96
- * Schema 이름 설정
97
- *
98
- * MSSQL, PostgreSQL에서 사용
99
- *
100
- * @param schema - Schema 이름 (MSSQL: dbo, PostgreSQL: public)
101
- * @returns 새 TableBuilder 인스턴스
102
- */
103
- schema(schema: string): TableBuilder<TName, TColumns, TRelations> {
104
- return new TableBuilder({ ...this.meta, schema });
105
- }
106
-
107
- /**
108
- * Column 정의
109
- *
110
- * Column factory를 통한 타입 안전한 column 정의
111
- *
112
- * @template TNewColumnDefs - 새 Column 정의 타입
113
- * @param fn - Column factory를 받아 column 정의를 반환하는 함수
114
- * @returns 새 TableBuilder 인스턴스
115
- */
116
- columns<TNewColumnDefs extends ColumnBuilderRecord>(
117
- fn: (c: ReturnType<typeof createColumnFactory>) => TNewColumnDefs,
118
- ): TableBuilder<TName, TNewColumnDefs, TRelations> {
119
- return new TableBuilder<TName, TNewColumnDefs, TRelations>({
120
- ...this.meta,
121
- columns: fn(createColumnFactory()),
122
- });
123
- }
124
-
125
- /**
126
- * Primary Key 설정
127
- *
128
- * @param columns - PK를 구성하는 column 이름 (복합 PK 지원)
129
- * @returns 새 TableBuilder 인스턴스
130
- */
131
- primaryKey(...columns: (keyof TColumns & string)[]): TableBuilder<TName, TColumns, TRelations> {
132
- return new TableBuilder({
133
- ...this.meta,
134
- primaryKey: columns,
135
- });
136
- }
137
-
138
- /**
139
- * Index 정의
140
- *
141
- * @param fn - Index factory를 받아 index 배열을 반환하는 함수
142
- * @returns 새 TableBuilder 인스턴스
143
- */
144
- indexes(
145
- fn: (
146
- i: ReturnType<typeof createIndexFactory<keyof TColumns & string>>,
147
- ) => IndexBuilder<string[]>[],
148
- ): TableBuilder<TName, TColumns, TRelations> {
149
- return new TableBuilder({
150
- ...this.meta,
151
- indexes: fn(createIndexFactory<keyof TColumns & string>()),
152
- });
153
- }
154
-
155
- /**
156
- * 관계 정의
157
- *
158
- * FK, 역참조 등 Table 간 관계를 설정
159
- *
160
- * @template T - 관계 정의 타입
161
- * @param fn - 관계 factory를 받아 관계 정의를 반환하는 함수
162
- * @returns TableBuilder 인스턴스
163
- *
164
- * @see {@link ForeignKeyBuilder} FK builder
165
- * @see {@link ForeignKeyTargetBuilder} FK reverse-reference builder
166
- */
167
- relations<T extends RelationBuilderRecord>(
168
- fn: (r: ReturnType<typeof createRelationFactory<this, keyof TColumns & string>>) => T,
169
- ): TableBuilder<TName, TColumns, T> {
170
- return new TableBuilder({
171
- ...this.meta,
172
- relations: fn(createRelationFactory<this, keyof TColumns & string>(() => this)),
173
- });
174
- }
175
- }
176
-
177
- // ============================================
178
- // Table 함수
179
- // ============================================
180
-
181
- /**
182
- * Table builder factory 함수
183
- *
184
- * Fluent API로 Table schema를 정의하기 위한 TableBuilder를 생성
185
- *
186
- * @param name - Table 이름
187
- * @returns TableBuilder 인스턴스
188
- *
189
- * @see {@link TableBuilder} builder 클래스
190
- */
191
- export function Table<TName extends string>(name: TName) {
192
- return new TableBuilder<TName, ColumnBuilderRecord, RelationBuilderRecord>({ name });
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
+ }