@simplysm/orm-common 14.0.46 → 14.0.48

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 (54) hide show
  1. package/README.md +269 -0
  2. package/dist/exec/queryable.d.ts +7 -2
  3. package/dist/exec/queryable.d.ts.map +1 -1
  4. package/dist/exec/queryable.js +10 -2
  5. package/dist/exec/queryable.js.map +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/query-builder/base/query-builder-base.d.ts +7 -0
  11. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  12. package/dist/query-builder/base/query-builder-base.js +9 -0
  13. package/dist/query-builder/base/query-builder-base.js.map +1 -1
  14. package/dist/query-builder/mssql/mssql-expr-renderer.js +1 -1
  15. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
  16. package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
  17. package/dist/query-builder/mssql/mssql-query-builder.js +3 -0
  18. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
  19. package/dist/query-builder/mysql/mysql-expr-renderer.js +1 -1
  20. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
  21. package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
  22. package/dist/query-builder/mysql/mysql-query-builder.js +23 -7
  23. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
  24. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +1 -1
  25. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
  26. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  27. package/dist/query-builder/postgresql/postgresql-query-builder.js +3 -0
  28. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
  29. package/dist/utils/pick-result-sets.d.ts +11 -0
  30. package/dist/utils/pick-result-sets.d.ts.map +1 -0
  31. package/dist/utils/pick-result-sets.js +23 -0
  32. package/dist/utils/pick-result-sets.js.map +1 -0
  33. package/dist/utils/result-parser.d.ts.map +1 -1
  34. package/dist/utils/result-parser.js +36 -7
  35. package/dist/utils/result-parser.js.map +1 -1
  36. package/docs/core.md +188 -0
  37. package/docs/expression.md +190 -0
  38. package/docs/models.md +17 -0
  39. package/docs/query-builder.md +97 -0
  40. package/docs/queryable-executable.md +311 -0
  41. package/docs/schema-builders.md +364 -0
  42. package/docs/types.md +537 -0
  43. package/package.json +4 -3
  44. package/src/exec/queryable.ts +13 -2
  45. package/src/index.ts +1 -0
  46. package/src/query-builder/base/query-builder-base.ts +16 -6
  47. package/src/query-builder/mssql/mssql-expr-renderer.ts +3 -3
  48. package/src/query-builder/mssql/mssql-query-builder.ts +10 -7
  49. package/src/query-builder/mysql/mysql-expr-renderer.ts +3 -3
  50. package/src/query-builder/mysql/mysql-query-builder.ts +40 -22
  51. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +3 -3
  52. package/src/query-builder/postgresql/postgresql-query-builder.ts +10 -7
  53. package/src/utils/pick-result-sets.ts +30 -0
  54. package/src/utils/result-parser.ts +56 -22
@@ -0,0 +1,364 @@
1
+ # Schema Builders
2
+
3
+ ## `Table`
4
+
5
+ TableBuilder 팩토리 함수.
6
+
7
+ ```typescript
8
+ export function Table(name: string): TableBuilder<never, never>;
9
+ ```
10
+
11
+ ## `TableBuilder`
12
+
13
+ Fluent API로 테이블 스키마를 정의하는 빌더. 메서드 체인마다 새 인스턴스를 반환한다 (불변).
14
+
15
+ ```typescript
16
+ export class TableBuilder<TColumns extends ColumnBuilderRecord, TRelations extends RelationBuilderRecord> {
17
+ readonly $columns!: TColumns;
18
+ readonly $relations!: TRelations;
19
+ readonly $inferSelect!: InferColumns<TColumns> & InferDeepRelations<TRelations>;
20
+ readonly $inferColumns!: InferColumns<TColumns>;
21
+ readonly $inferInsert!: InferInsertColumns<TColumns>;
22
+ readonly $inferUpdate!: InferUpdateColumns<TColumns>;
23
+
24
+ constructor(readonly meta: {
25
+ name: string;
26
+ description?: string;
27
+ database?: string;
28
+ schema?: string;
29
+ columns?: TColumns;
30
+ primaryKey?: (keyof TColumns & string)[];
31
+ relations?: TRelations;
32
+ indexes?: IndexBuilder<(keyof TColumns & string)[]>[];
33
+ });
34
+
35
+ description(desc: string): TableBuilder;
36
+ database(db: string): TableBuilder;
37
+ schema(schema: string): TableBuilder;
38
+ columns<TNewColumnDefs>(fn: (c: ReturnType<typeof createColumnFactory>) => TNewColumnDefs): TableBuilder<TNewColumnDefs, TRelations>;
39
+ primaryKey(...columns: (keyof TColumns & string)[]): TableBuilder;
40
+ indexes(fn: (i: ReturnType<typeof createIndexFactory>) => IndexBuilder[]): TableBuilder;
41
+ relations<T extends RelationBuilderRecord>(fn: (r: RelationFactory) => T): TableBuilder<TColumns, T>;
42
+ }
43
+ ```
44
+
45
+ ## `View`
46
+
47
+ ViewBuilder 팩토리 함수.
48
+
49
+ ```typescript
50
+ export function View(name: string): ViewBuilder<never, never, never>;
51
+ ```
52
+
53
+ ## `ViewBuilder`
54
+
55
+ Fluent API로 뷰 스키마를 정의하는 빌더.
56
+
57
+ ```typescript
58
+ export class ViewBuilder<TDbContext extends DbContextBase, TData extends DataRecord, TRelations extends RelationBuilderRecord> {
59
+ readonly $relations!: TRelations;
60
+ readonly $inferSelect!: TData;
61
+
62
+ constructor(readonly meta: {
63
+ name: string;
64
+ description?: string;
65
+ database?: string;
66
+ schema?: string;
67
+ viewFn?: (db: TDbContext) => Queryable<TData, any>;
68
+ relations?: TRelations;
69
+ });
70
+
71
+ description(desc: string): ViewBuilder;
72
+ database(db: string): ViewBuilder;
73
+ schema(schema: string): ViewBuilder;
74
+ query<TViewData, TDb>(viewFn: (db: TDb) => Queryable<TViewData, any>): ViewBuilder<TDb, TViewData, TRelations>;
75
+ relations<T extends RelationBuilderRecord>(fn: (r: RelationFactory) => T): ViewBuilder<TDbContext, TData & InferDeepRelations<T>, T>;
76
+ }
77
+ ```
78
+
79
+ ## `Procedure`
80
+
81
+ ProcedureBuilder 팩토리 함수.
82
+
83
+ ```typescript
84
+ export function Procedure(name: string): ProcedureBuilder<never, never>;
85
+ ```
86
+
87
+ ## `ProcedureBuilder`
88
+
89
+ Fluent API로 Stored Procedure를 정의하는 빌더.
90
+
91
+ ```typescript
92
+ export class ProcedureBuilder<TParams extends ColumnBuilderRecord, TReturns extends ColumnBuilderRecord> {
93
+ readonly $params!: TParams;
94
+ readonly $returns!: TReturns;
95
+
96
+ constructor(readonly meta: {
97
+ name: string;
98
+ description?: string;
99
+ database?: string;
100
+ schema?: string;
101
+ params?: TParams;
102
+ returns?: TReturns;
103
+ query?: string;
104
+ });
105
+
106
+ description(desc: string): ProcedureBuilder;
107
+ database(db: string): ProcedureBuilder;
108
+ schema(schema: string): ProcedureBuilder;
109
+ params<T>(fn: (c: ReturnType<typeof createColumnFactory>) => T): ProcedureBuilder<T, TReturns>;
110
+ returns<T>(fn: (c: ReturnType<typeof createColumnFactory>) => T): ProcedureBuilder<TParams, T>;
111
+ body(sql: string): ProcedureBuilder;
112
+ }
113
+ ```
114
+
115
+ ## `ColumnBuilder`
116
+
117
+ Column 정의 빌더. Fluent API로 타입, nullable, autoIncrement, default, description을 정의한다.
118
+
119
+ ```typescript
120
+ export class ColumnBuilder<TValue extends ColumnPrimitive, TMeta extends ColumnMeta> {
121
+ constructor(readonly meta: TMeta);
122
+
123
+ autoIncrement(): ColumnBuilder<TValue, TMeta & { autoIncrement: true }>;
124
+ nullable(): ColumnBuilder<TValue | undefined, TMeta & { nullable: true }>;
125
+ default(value: TValue): ColumnBuilder<TValue, TMeta & { default: typeof value }>;
126
+ description(desc: string): ColumnBuilder<TValue, TMeta & { description: string }>;
127
+ }
128
+ ```
129
+
130
+ ## `createColumnFactory`
131
+
132
+ Column 타입 팩토리 생성. 반환 객체의 메서드:
133
+
134
+ | 메서드 | SQL 타입 | TypeScript 타입 | 비고 |
135
+ |--------|----------|----------------|------|
136
+ | `int()` | INT | `number` | 4바이트 |
137
+ | `bigint()` | BIGINT | `number` | 8바이트 |
138
+ | `float()` | FLOAT | `number` | 4바이트 단정밀도 |
139
+ | `double()` | DOUBLE | `number` | 8바이트 배정밀도 |
140
+ | `decimal(precision, scale?)` | DECIMAL | `number` | 고정 소수점 |
141
+ | `varchar(length)` | VARCHAR | `string` | 가변 길이 문자열 |
142
+ | `char(length)` | CHAR | `string` | 고정 길이 문자열 |
143
+ | `text()` | TEXT | `string` | 대용량 텍스트 |
144
+ | `binary()` | LONGBLOB/VARBINARY/BYTEA | `Bytes` | 바이너리 |
145
+ | `boolean()` | TINYINT(1)/BIT/BOOLEAN | `boolean` | |
146
+ | `datetime()` | DATETIME | `DateTime` | 날짜+시간 |
147
+ | `date()` | DATE | `DateOnly` | 날짜만 |
148
+ | `time()` | TIME | `Time` | 시간만 |
149
+ | `uuid()` | BINARY(16)/UNIQUEIDENTIFIER/UUID | `Uuid` | |
150
+
151
+ ## `ColumnBuilderRecord`
152
+
153
+ Column builder 레코드 타입.
154
+
155
+ ```typescript
156
+ export type ColumnBuilderRecord = Record<string, ColumnBuilder<ColumnPrimitive, ColumnMeta>>;
157
+ ```
158
+
159
+ ## `InferColumns`
160
+
161
+ Column builder 레코드에서 실제 값 타입 추론.
162
+
163
+ ```typescript
164
+ export type InferColumns<TBuilders extends ColumnBuilderRecord> = {
165
+ [K in keyof TBuilders]: TBuilders[K] extends ColumnBuilder<infer V, any> ? V : never;
166
+ };
167
+ ```
168
+
169
+ ## `InferColumnExprs`
170
+
171
+ Column builder 레코드에서 expression 입력 타입 추론.
172
+
173
+ ```typescript
174
+ export type InferColumnExprs<TBuilders extends ColumnBuilderRecord> = {
175
+ [K in keyof TBuilders]: TBuilders[K] extends ColumnBuilder<infer V, any> ? ExprInput<V> : never;
176
+ };
177
+ ```
178
+
179
+ ## `RequiredInsertKeys`
180
+
181
+ INSERT용 필수 column key 추출. autoIncrement, nullable, default가 없는 column만 필수.
182
+
183
+ ```typescript
184
+ export type RequiredInsertKeys<TBuilders extends ColumnBuilderRecord> = /* ... */;
185
+ ```
186
+
187
+ ## `OptionalInsertKeys`
188
+
189
+ INSERT용 선택적 column key 추출.
190
+
191
+ ```typescript
192
+ export type OptionalInsertKeys<TBuilders extends ColumnBuilderRecord> = Exclude<keyof TBuilders, RequiredInsertKeys<TBuilders>>;
193
+ ```
194
+
195
+ ## `InferInsertColumns`
196
+
197
+ INSERT 타입 추론. 필수 column은 필수, autoIncrement/nullable/default column은 optional.
198
+
199
+ ```typescript
200
+ export type InferInsertColumns<TBuilders extends ColumnBuilderRecord> =
201
+ Pick<InferColumns<TBuilders>, RequiredInsertKeys<TBuilders>> &
202
+ Partial<Pick<InferColumns<TBuilders>, OptionalInsertKeys<TBuilders>>>;
203
+ ```
204
+
205
+ ## `InferUpdateColumns`
206
+
207
+ UPDATE 타입 추론. 모든 column이 optional.
208
+
209
+ ```typescript
210
+ export type InferUpdateColumns<TBuilders extends ColumnBuilderRecord> = Partial<InferColumns<TBuilders>>;
211
+ ```
212
+
213
+ ## `DataToColumnBuilderRecord`
214
+
215
+ 데이터 레코드를 Column builder 레코드로 변환.
216
+
217
+ ```typescript
218
+ export type DataToColumnBuilderRecord<TData extends DataRecord> = {
219
+ [K in keyof TData as TData[K] extends ColumnPrimitive ? K : never]: ColumnBuilder<TData[K] extends ColumnPrimitive ? TData[K] : never, any>;
220
+ };
221
+ ```
222
+
223
+ ## `IndexBuilder`
224
+
225
+ Index 정의 빌더. Fluent API로 index column, unique, 정렬 순서를 정의한다.
226
+
227
+ ```typescript
228
+ export class IndexBuilder<TKeys extends string[]> {
229
+ constructor(readonly meta: {
230
+ columns: TKeys;
231
+ name?: string;
232
+ unique?: boolean;
233
+ orderBy?: { [K in keyof TKeys]: "ASC" | "DESC" };
234
+ description?: string;
235
+ });
236
+
237
+ name(name: string): IndexBuilder<TKeys>;
238
+ unique(): IndexBuilder<TKeys>;
239
+ orderBy(...orderBy: { [K in keyof TKeys]: "ASC" | "DESC" }): IndexBuilder<TKeys>;
240
+ description(description: string): IndexBuilder<TKeys>;
241
+ }
242
+ ```
243
+
244
+ ## `createIndexFactory`
245
+
246
+ Index 팩토리 생성.
247
+
248
+ ```typescript
249
+ export function createIndexFactory<TColumnKey extends string>(): {
250
+ index<TKeys extends TColumnKey[]>(...columns: [...TKeys]): IndexBuilder<TKeys>;
251
+ };
252
+ ```
253
+
254
+ ## `ForeignKeyBuilder`
255
+
256
+ FK 관계 빌더 (N:1). DB에 실제 FK 제약조건을 생성한다. description 설정은 factory 함수의 opts 파라미터로 전달한다.
257
+
258
+ ```typescript
259
+ export class ForeignKeyBuilder<TOwner extends TableBuilder, TTargetFn extends () => TableBuilder> {
260
+ constructor(readonly meta: {
261
+ ownerFn: () => TOwner;
262
+ columns: string[];
263
+ targetFn: TTargetFn;
264
+ description?: string;
265
+ });
266
+ }
267
+ ```
268
+
269
+ ## `ForeignKeyTargetBuilder`
270
+
271
+ FK 역참조 빌더 (1:N). include() 시 배열로 로드됨 (opts.single: true 시 단일 객체). description, single 설정은 factory 함수의 opts 파라미터로 전달한다.
272
+
273
+ ```typescript
274
+ export class ForeignKeyTargetBuilder<TTargetTableFn extends () => TableBuilder, TIsSingle extends boolean> {
275
+ constructor(readonly meta: {
276
+ targetTableFn: TTargetTableFn;
277
+ relationName: string;
278
+ description?: string;
279
+ isSingle?: TIsSingle;
280
+ });
281
+ }
282
+ ```
283
+
284
+ ## `RelationKeyBuilder`
285
+
286
+ 논리적 관계 빌더 (N:1). ForeignKeyBuilder와 동일하지만 DB에 FK 제약조건을 생성하지 않음. View에서도 사용 가능.
287
+
288
+ ```typescript
289
+ export class RelationKeyBuilder<TOwner extends TableBuilder | ViewBuilder, TTargetFn extends () => TableBuilder | ViewBuilder> {
290
+ constructor(readonly meta: {
291
+ ownerFn: () => TOwner;
292
+ columns: string[];
293
+ targetFn: TTargetFn;
294
+ description?: string;
295
+ });
296
+ }
297
+ ```
298
+
299
+ ## `RelationKeyTargetBuilder`
300
+
301
+ 논리적 역참조 빌더 (1:N). ForeignKeyTargetBuilder와 동일하지만 DB FK 미생성. View에서도 사용 가능.
302
+
303
+ ```typescript
304
+ export class RelationKeyTargetBuilder<TTargetTableFn extends () => TableBuilder | ViewBuilder, TIsSingle extends boolean> {
305
+ constructor(readonly meta: {
306
+ targetTableFn: TTargetTableFn;
307
+ relationName: string;
308
+ description?: string;
309
+ isSingle?: TIsSingle;
310
+ });
311
+ }
312
+ ```
313
+
314
+ ## `createRelationFactory`
315
+
316
+ 관계 빌더 팩토리 생성. Table은 FK + RelationKey 모두 사용 가능, View는 RelationKey만 사용 가능.
317
+
318
+ ```typescript
319
+ export function createRelationFactory<TOwner, TColumnKey extends string>(
320
+ ownerFn: () => TOwner,
321
+ ): TOwner extends TableBuilder
322
+ ? RelationFkFactory & RelationRkFactory
323
+ : RelationRkFactory;
324
+ ```
325
+
326
+ Table용 팩토리에서 사용 가능한 메서드:
327
+ - `foreignKey(columns, targetFn, opts?)`: N:1 FK 관계 정의 (DB FK 생성)
328
+ - `foreignKeyTarget(targetTableFn, relationName, opts?)`: 1:N FK 역참조 (single: true -> 단일 객체)
329
+ - `relationKey(columns, targetFn, opts?)`: N:1 논리적 관계 (DB FK 미생성)
330
+ - `relationKeyTarget(targetTableFn, relationName, opts?)`: 1:N 논리적 역참조
331
+
332
+ ## `RelationBuilderRecord`
333
+
334
+ 관계 builder 레코드 타입.
335
+
336
+ ```typescript
337
+ export type RelationBuilderRecord = Record<string, ForeignKeyBuilder | ForeignKeyTargetBuilder | RelationKeyBuilder | RelationKeyTargetBuilder>;
338
+ ```
339
+
340
+ ## `ExtractRelationTarget`
341
+
342
+ FK/RelationKey에서 대상 타입 추출 (단일 객체, N:1 관계).
343
+
344
+ ```typescript
345
+ export type ExtractRelationTarget<TRelation> = /* FK/RK의 대상 Table/View 타입 추론 */;
346
+ ```
347
+
348
+ ## `ExtractRelationTargetResult`
349
+
350
+ FKTarget/RelationKeyTarget에서 대상 타입 추출 (배열 또는 단일 객체, 1:N 관계).
351
+
352
+ ```typescript
353
+ export type ExtractRelationTargetResult<TRelation> = /* isSingle: true -> 단일, false -> 배열 */;
354
+ ```
355
+
356
+ ## `InferDeepRelations`
357
+
358
+ 관계 정의에서 심층 관계 타입 추론. include() 없이 접근 시 undefined가 되도록 모든 관계를 optional로 설정.
359
+
360
+ ```typescript
361
+ export type InferDeepRelations<TRelations extends RelationBuilderRecord> = {
362
+ [K in keyof TRelations]?: ExtractRelationTarget<TRelations[K]> | ExtractRelationTargetResult<TRelations[K]>;
363
+ };
364
+ ```