@simplysm/orm-common 13.0.69 → 13.0.70

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 (204) hide show
  1. package/README.md +54 -1447
  2. package/dist/create-db-context.d.ts +10 -10
  3. package/dist/create-db-context.js +9 -9
  4. package/dist/create-db-context.js.map +1 -1
  5. package/dist/ddl/column-ddl.d.ts +4 -4
  6. package/dist/ddl/initialize.d.ts +17 -17
  7. package/dist/ddl/initialize.js +2 -2
  8. package/dist/ddl/initialize.js.map +1 -1
  9. package/dist/ddl/relation-ddl.d.ts +6 -6
  10. package/dist/ddl/schema-ddl.d.ts +4 -4
  11. package/dist/ddl/table-ddl.d.ts +24 -24
  12. package/dist/ddl/table-ddl.js +4 -4
  13. package/dist/ddl/table-ddl.js.map +1 -1
  14. package/dist/errors/db-transaction-error.d.ts +15 -15
  15. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  16. package/dist/exec/executable.d.ts +23 -23
  17. package/dist/exec/executable.js +3 -3
  18. package/dist/exec/executable.js.map +1 -1
  19. package/dist/exec/queryable.d.ts +160 -160
  20. package/dist/exec/queryable.js +119 -119
  21. package/dist/exec/queryable.js.map +1 -1
  22. package/dist/exec/search-parser.d.ts +37 -37
  23. package/dist/exec/search-parser.d.ts.map +1 -1
  24. package/dist/expr/expr-unit.d.ts +4 -4
  25. package/dist/expr/expr.d.ts +257 -257
  26. package/dist/expr/expr.js +265 -265
  27. package/dist/expr/expr.js.map +1 -1
  28. package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
  29. package/dist/query-builder/base/expr-renderer-base.js +2 -2
  30. package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
  31. package/dist/query-builder/base/query-builder-base.d.ts +26 -26
  32. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  33. package/dist/query-builder/base/query-builder-base.js +22 -22
  34. package/dist/query-builder/base/query-builder-base.js.map +1 -1
  35. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
  36. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  37. package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
  38. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
  39. package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
  40. package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
  41. package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
  42. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
  43. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
  44. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  45. package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
  46. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
  47. package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
  48. package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
  49. package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
  50. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
  51. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
  52. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  53. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
  54. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
  55. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
  56. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  57. package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
  58. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
  59. package/dist/query-builder/query-builder.d.ts +1 -1
  60. package/dist/schema/factory/column-builder.d.ts +79 -79
  61. package/dist/schema/factory/column-builder.js +42 -42
  62. package/dist/schema/factory/index-builder.d.ts +39 -39
  63. package/dist/schema/factory/index-builder.js +26 -26
  64. package/dist/schema/factory/relation-builder.d.ts +99 -99
  65. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  66. package/dist/schema/factory/relation-builder.js +38 -38
  67. package/dist/schema/procedure-builder.d.ts +49 -49
  68. package/dist/schema/procedure-builder.d.ts.map +1 -1
  69. package/dist/schema/procedure-builder.js +33 -33
  70. package/dist/schema/table-builder.d.ts +59 -59
  71. package/dist/schema/table-builder.d.ts.map +1 -1
  72. package/dist/schema/table-builder.js +43 -43
  73. package/dist/schema/view-builder.d.ts +49 -49
  74. package/dist/schema/view-builder.d.ts.map +1 -1
  75. package/dist/schema/view-builder.js +32 -32
  76. package/dist/types/column.d.ts +22 -22
  77. package/dist/types/column.js +1 -1
  78. package/dist/types/column.js.map +1 -1
  79. package/dist/types/db.d.ts +40 -40
  80. package/dist/types/expr.d.ts +59 -59
  81. package/dist/types/expr.d.ts.map +1 -1
  82. package/dist/types/query-def.d.ts +44 -44
  83. package/dist/types/query-def.d.ts.map +1 -1
  84. package/dist/utils/result-parser.d.ts +11 -11
  85. package/dist/utils/result-parser.js +3 -3
  86. package/dist/utils/result-parser.js.map +1 -1
  87. package/package.json +5 -5
  88. package/src/create-db-context.ts +20 -20
  89. package/src/ddl/column-ddl.ts +4 -4
  90. package/src/ddl/initialize.ts +259 -259
  91. package/src/ddl/relation-ddl.ts +89 -89
  92. package/src/ddl/schema-ddl.ts +4 -4
  93. package/src/ddl/table-ddl.ts +189 -189
  94. package/src/errors/db-transaction-error.ts +13 -13
  95. package/src/exec/executable.ts +25 -25
  96. package/src/exec/queryable.ts +2033 -2033
  97. package/src/exec/search-parser.ts +57 -57
  98. package/src/expr/expr-unit.ts +4 -4
  99. package/src/expr/expr.ts +2140 -2140
  100. package/src/query-builder/base/expr-renderer-base.ts +237 -237
  101. package/src/query-builder/base/query-builder-base.ts +213 -213
  102. package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
  103. package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
  104. package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
  105. package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
  106. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
  107. package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
  108. package/src/query-builder/query-builder.ts +19 -19
  109. package/src/schema/factory/column-builder.ts +423 -423
  110. package/src/schema/factory/index-builder.ts +164 -164
  111. package/src/schema/factory/relation-builder.ts +453 -453
  112. package/src/schema/procedure-builder.ts +232 -232
  113. package/src/schema/table-builder.ts +319 -319
  114. package/src/schema/view-builder.ts +221 -221
  115. package/src/types/column.ts +188 -188
  116. package/src/types/db.ts +208 -208
  117. package/src/types/expr.ts +697 -697
  118. package/src/types/query-def.ts +513 -513
  119. package/src/utils/result-parser.ts +458 -458
  120. package/tests/db-context/create-db-context.spec.ts +224 -0
  121. package/tests/db-context/define-db-context.spec.ts +68 -0
  122. package/tests/ddl/basic.expected.ts +341 -0
  123. package/tests/ddl/basic.spec.ts +714 -0
  124. package/tests/ddl/column-builder.expected.ts +310 -0
  125. package/tests/ddl/column-builder.spec.ts +637 -0
  126. package/tests/ddl/index-builder.expected.ts +38 -0
  127. package/tests/ddl/index-builder.spec.ts +202 -0
  128. package/tests/ddl/procedure-builder.expected.ts +52 -0
  129. package/tests/ddl/procedure-builder.spec.ts +234 -0
  130. package/tests/ddl/relation-builder.expected.ts +36 -0
  131. package/tests/ddl/relation-builder.spec.ts +372 -0
  132. package/tests/ddl/table-builder.expected.ts +113 -0
  133. package/tests/ddl/table-builder.spec.ts +433 -0
  134. package/tests/ddl/view-builder.expected.ts +38 -0
  135. package/tests/ddl/view-builder.spec.ts +176 -0
  136. package/tests/dml/delete.expected.ts +96 -0
  137. package/tests/dml/delete.spec.ts +160 -0
  138. package/tests/dml/insert.expected.ts +192 -0
  139. package/tests/dml/insert.spec.ts +288 -0
  140. package/tests/dml/update.expected.ts +176 -0
  141. package/tests/dml/update.spec.ts +318 -0
  142. package/tests/dml/upsert.expected.ts +215 -0
  143. package/tests/dml/upsert.spec.ts +242 -0
  144. package/tests/errors/queryable-errors.spec.ts +177 -0
  145. package/tests/escape.spec.ts +100 -0
  146. package/tests/examples/pivot.expected.ts +211 -0
  147. package/tests/examples/pivot.spec.ts +533 -0
  148. package/tests/examples/sampling.expected.ts +69 -0
  149. package/tests/examples/sampling.spec.ts +104 -0
  150. package/tests/examples/unpivot.expected.ts +120 -0
  151. package/tests/examples/unpivot.spec.ts +226 -0
  152. package/tests/exec/search-parser.spec.ts +283 -0
  153. package/tests/executable/basic.expected.ts +18 -0
  154. package/tests/executable/basic.spec.ts +54 -0
  155. package/tests/expr/comparison.expected.ts +282 -0
  156. package/tests/expr/comparison.spec.ts +400 -0
  157. package/tests/expr/conditional.expected.ts +134 -0
  158. package/tests/expr/conditional.spec.ts +276 -0
  159. package/tests/expr/date.expected.ts +332 -0
  160. package/tests/expr/date.spec.ts +526 -0
  161. package/tests/expr/math.expected.ts +62 -0
  162. package/tests/expr/math.spec.ts +106 -0
  163. package/tests/expr/string.expected.ts +218 -0
  164. package/tests/expr/string.spec.ts +356 -0
  165. package/tests/expr/utility.expected.ts +147 -0
  166. package/tests/expr/utility.spec.ts +182 -0
  167. package/tests/select/basic.expected.ts +322 -0
  168. package/tests/select/basic.spec.ts +502 -0
  169. package/tests/select/filter.expected.ts +357 -0
  170. package/tests/select/filter.spec.ts +1068 -0
  171. package/tests/select/group.expected.ts +169 -0
  172. package/tests/select/group.spec.ts +244 -0
  173. package/tests/select/join.expected.ts +582 -0
  174. package/tests/select/join.spec.ts +805 -0
  175. package/tests/select/order.expected.ts +150 -0
  176. package/tests/select/order.spec.ts +189 -0
  177. package/tests/select/recursive-cte.expected.ts +244 -0
  178. package/tests/select/recursive-cte.spec.ts +514 -0
  179. package/tests/select/result-meta.spec.ts +270 -0
  180. package/tests/select/subquery.expected.ts +363 -0
  181. package/tests/select/subquery.spec.ts +537 -0
  182. package/tests/select/view.expected.ts +155 -0
  183. package/tests/select/view.spec.ts +235 -0
  184. package/tests/select/window.expected.ts +345 -0
  185. package/tests/select/window.spec.ts +618 -0
  186. package/tests/setup/MockExecutor.ts +18 -0
  187. package/tests/setup/TestDbContext.ts +59 -0
  188. package/tests/setup/models/Company.ts +13 -0
  189. package/tests/setup/models/Employee.ts +10 -0
  190. package/tests/setup/models/MonthlySales.ts +11 -0
  191. package/tests/setup/models/Post.ts +16 -0
  192. package/tests/setup/models/Sales.ts +10 -0
  193. package/tests/setup/models/User.ts +19 -0
  194. package/tests/setup/procedure/GetAllUsers.ts +9 -0
  195. package/tests/setup/procedure/GetUserById.ts +12 -0
  196. package/tests/setup/test-utils.ts +72 -0
  197. package/tests/setup/views/ActiveUsers.ts +8 -0
  198. package/tests/setup/views/UserSummary.ts +11 -0
  199. package/tests/types/nullable-queryable-record.spec.ts +145 -0
  200. package/tests/utils/result-parser-perf.spec.ts +210 -0
  201. package/tests/utils/result-parser.spec.ts +701 -0
  202. package/docs/expressions.md +0 -172
  203. package/docs/queries.md +0 -444
  204. package/docs/schema.md +0 -245
@@ -1,232 +1,232 @@
1
- import { type ColumnBuilderRecord, createColumnFactory } from "./factory/column-builder";
2
-
3
- // ============================================
4
- // ProcedureBuilder
5
- // ============================================
6
-
7
- /**
8
- * 저장 프로시저 정의 빌더
9
- *
10
- * Fluent API를 통해 프로시저의 파라미터, 반환 타입, 본문을 정의
11
- * DbContext의 executable()과 함께 사용하여 타입 안전한 프로시저 호출
12
- *
13
- * @template TParams - 파라미터 컬럼 정의 타입
14
- * @template TReturns - 반환 컬럼 정의 타입
15
- *
16
- * @example
17
- * ```typescript
18
- * // 프로시저 정의
19
- * const GetUserById = Procedure("GetUserById")
20
- * .database("mydb")
21
- * .params((c) => ({
22
- * userId: c.bigint(),
23
- * }))
24
- * .returns((c) => ({
25
- * id: c.bigint(),
26
- * name: c.varchar(100),
27
- * email: c.varchar(200),
28
- * }))
29
- * .body("SELECT id, name, email FROM User WHERE id = userId");
30
- *
31
- * // DbContext에서 사용
32
- * class MyDb extends DbContext {
33
- * readonly getUserById = executable(this, GetUserById);
34
- * }
35
- *
36
- * // 호출
37
- * const users = await db.getUserById({ userId: 1n }).result();
38
- * ```
39
- *
40
- * @see {@link Procedure} 팩토리 함수
41
- * @see {@link executable} Executable 생성
42
- */
43
- export class ProcedureBuilder<
44
- TParams extends ColumnBuilderRecord,
45
- TReturns extends ColumnBuilderRecord,
46
- > {
47
- /** 파라미터 정의 (타입 추론용) */
48
- readonly $params!: TParams;
49
- /** 반환 타입 정의 (타입 추론용) */
50
- readonly $returns!: TReturns;
51
-
52
- /**
53
- * @param meta - 프로시저 메타데이터
54
- * @param meta.name - 프로시저 이름
55
- * @param meta.description - 프로시저 설명 (주석)
56
- * @param meta.database - 데이터베이스 이름
57
- * @param meta.schema - 스키마 이름 (MSSQL/PostgreSQL)
58
- * @param meta.params - 파라미터 정의
59
- * @param meta.returns - 반환 타입 정의
60
- * @param meta.query - 프로시저 본문 SQL
61
- */
62
- constructor(
63
- readonly meta: {
64
- name: string;
65
- description?: string;
66
- database?: string;
67
- schema?: string;
68
- params?: TParams;
69
- returns?: TReturns;
70
- query?: string;
71
- },
72
- ) {}
73
-
74
- /**
75
- * 프로시저 설명 설정
76
- *
77
- * @param desc - 프로시저 설명 (DDL 주석으로 사용)
78
- * @returns ProcedureBuilder 인스턴스
79
- */
80
- description(desc: string): ProcedureBuilder<TParams, TReturns> {
81
- return new ProcedureBuilder({ ...this.meta, description: desc });
82
- }
83
-
84
- /**
85
- * 데이터베이스 이름 설정
86
- *
87
- * @param db - 데이터베이스 이름
88
- * @returns ProcedureBuilder 인스턴스
89
- *
90
- * @example
91
- * ```typescript
92
- * const GetUser = Procedure("GetUser").database("mydb");
93
- * ```
94
- */
95
- database(db: string): ProcedureBuilder<TParams, TReturns> {
96
- return new ProcedureBuilder({ ...this.meta, database: db });
97
- }
98
-
99
- /**
100
- * 스키마 이름 설정
101
- *
102
- * MSSQL, PostgreSQL에서 사용
103
- *
104
- * @param schema - 스키마 이름 (MSSQL: dbo, PostgreSQL: public)
105
- * @returns ProcedureBuilder 인스턴스
106
- */
107
- schema(schema: string): ProcedureBuilder<TParams, TReturns> {
108
- return new ProcedureBuilder({ ...this.meta, schema });
109
- }
110
-
111
- /**
112
- * 파라미터 정의
113
- *
114
- * 프로시저 입력 파라미터 정의
115
- * DBMS별 파라미터 문법 차이 주의 (MSSQL: @param, MySQL/PostgreSQL: param)
116
- *
117
- * @template T - 새 파라미터 정의 타입
118
- * @param fn - 컬럼 팩토리를 받아 파라미터 정의를 반환하는 함수
119
- * @returns ProcedureBuilder 인스턴스
120
- *
121
- * @example
122
- * ```typescript
123
- * const GetUserById = Procedure("GetUserById")
124
- * .params((c) => ({
125
- * userId: c.bigint(),
126
- * includeDeleted: c.boolean().default(false),
127
- * }));
128
- * ```
129
- */
130
- params<T extends ColumnBuilderRecord>(
131
- fn: (c: ReturnType<typeof createColumnFactory>) => T,
132
- ): ProcedureBuilder<T, TReturns> {
133
- return new ProcedureBuilder({ ...this.meta, params: fn(createColumnFactory()) });
134
- }
135
-
136
- /**
137
- * 반환 타입 정의
138
- *
139
- * 프로시저 반환 결과 컬럼 정의
140
- *
141
- * @template T - 새 반환 타입 정의
142
- * @param fn - 컬럼 팩토리를 받아 반환 컬럼 정의를 반환하는 함수
143
- * @returns ProcedureBuilder 인스턴스
144
- *
145
- * @example
146
- * ```typescript
147
- * const GetUserById = Procedure("GetUserById")
148
- * .params((c) => ({ userId: c.bigint() }))
149
- * .returns((c) => ({
150
- * id: c.bigint(),
151
- * name: c.varchar(100),
152
- * email: c.varchar(200).nullable(),
153
- * }));
154
- * ```
155
- */
156
- returns<T extends ColumnBuilderRecord>(
157
- fn: (c: ReturnType<typeof createColumnFactory>) => T,
158
- ): ProcedureBuilder<TParams, T> {
159
- return new ProcedureBuilder({ ...this.meta, returns: fn(createColumnFactory()) });
160
- }
161
-
162
- /**
163
- * 프로시저 본문 SQL 설정
164
- *
165
- * DBMS별 SQL 문법 차이 주의:
166
- * - MySQL: 파라미터명 그대로 (userId)
167
- * - MSSQL: @ 접두사 (@userId)
168
- * - PostgreSQL: RETURN QUERY 필요
169
- *
170
- * @param sql - 프로시저 본문 SQL
171
- * @returns ProcedureBuilder 인스턴스
172
- *
173
- * @example
174
- * ```typescript
175
- * // MySQL/PostgreSQL
176
- * const GetUser = Procedure("GetUser")
177
- * .params((c) => ({ userId: c.bigint() }))
178
- * .body("SELECT * FROM User WHERE id = userId");
179
- *
180
- * // MSSQL
181
- * const GetUser = Procedure("GetUser")
182
- * .params((c) => ({ userId: c.bigint() }))
183
- * .body("SELECT * FROM [User] WHERE id = @userId");
184
- * ```
185
- */
186
- body(sql: string): ProcedureBuilder<TParams, TReturns> {
187
- return new ProcedureBuilder({ ...this.meta, query: sql });
188
- }
189
- }
190
-
191
- // ============================================
192
- // Procedure 함수
193
- // ============================================
194
-
195
- /**
196
- * 프로시저 빌더 생성 팩토리 함수
197
- *
198
- * ProcedureBuilder를 생성하여 Fluent API로 저장 프로시저 스키마 정의
199
- *
200
- * @param name - 프로시저 이름
201
- * @returns ProcedureBuilder 인스턴스
202
- *
203
- * @example
204
- * ```typescript
205
- * // 기본 사용
206
- * const GetUserById = Procedure("GetUserById")
207
- * .database("mydb")
208
- * .params((c) => ({
209
- * userId: c.bigint(),
210
- * }))
211
- * .returns((c) => ({
212
- * id: c.bigint(),
213
- * name: c.varchar(100),
214
- * email: c.varchar(200),
215
- * }))
216
- * .body("SELECT id, name, email FROM User WHERE id = userId");
217
- *
218
- * // 파라미터 없는 프로시저
219
- * const GetAllActiveUsers = Procedure("GetAllActiveUsers")
220
- * .database("mydb")
221
- * .returns((c) => ({
222
- * id: c.bigint(),
223
- * name: c.varchar(100),
224
- * }))
225
- * .body("SELECT id, name FROM User WHERE status = 'active'");
226
- * ```
227
- *
228
- * @see {@link ProcedureBuilder} 빌더 클래스
229
- */
230
- export function Procedure(name: string): ProcedureBuilder<never, never> {
231
- return new ProcedureBuilder({ name });
232
- }
1
+ import { type ColumnBuilderRecord, createColumnFactory } from "./factory/column-builder";
2
+
3
+ // ============================================
4
+ // ProcedureBuilder
5
+ // ============================================
6
+
7
+ /**
8
+ * 저장 Procedure definition builder
9
+ *
10
+ * Fluent API를 통해 Procedure의 파라미터, return type, 본문을 definition
11
+ * DbContext의 executable()과 함께 사용하여 type 안전한 Procedure 호출
12
+ *
13
+ * @template TParams - 파라미터 Column definition type
14
+ * @template TReturns - return Column definition type
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Procedure definition
19
+ * const GetUserById = Procedure("GetUserById")
20
+ * .database("mydb")
21
+ * .params((c) => ({
22
+ * userId: c.bigint(),
23
+ * }))
24
+ * .returns((c) => ({
25
+ * id: c.bigint(),
26
+ * name: c.varchar(100),
27
+ * email: c.varchar(200),
28
+ * }))
29
+ * .body("SELECT id, name, email FROM User WHERE id = userId");
30
+ *
31
+ * // DbContextused in
32
+ * class MyDb extends DbContext {
33
+ * readonly getUserById = executable(this, GetUserById);
34
+ * }
35
+ *
36
+ * // 호출
37
+ * const users = await db.getUserById({ userId: 1n }).result();
38
+ * ```
39
+ *
40
+ * @see {@link Procedure} factory function
41
+ * @see {@link executable} Executable Generate
42
+ */
43
+ export class ProcedureBuilder<
44
+ TParams extends ColumnBuilderRecord,
45
+ TReturns extends ColumnBuilderRecord,
46
+ > {
47
+ /** 파라미터 definition (type for inference) */
48
+ readonly $params!: TParams;
49
+ /** return type definition (type for inference) */
50
+ readonly $returns!: TReturns;
51
+
52
+ /**
53
+ * @param meta - Procedure Metadata
54
+ * @param meta.name - Procedure 이름
55
+ * @param meta.description - Procedure description (주석)
56
+ * @param meta.database - Database 이름
57
+ * @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
58
+ * @param meta.params - 파라미터 definition
59
+ * @param meta.returns - return type definition
60
+ * @param meta.query - Procedure 본문 SQL
61
+ */
62
+ constructor(
63
+ readonly meta: {
64
+ name: string;
65
+ description?: string;
66
+ database?: string;
67
+ schema?: string;
68
+ params?: TParams;
69
+ returns?: TReturns;
70
+ query?: string;
71
+ },
72
+ ) {}
73
+
74
+ /**
75
+ * Procedure set description
76
+ *
77
+ * @param desc - Procedure description (DDL Comment으로 사용)
78
+ * @returns new ProcedureBuilder instance
79
+ */
80
+ description(desc: string): ProcedureBuilder<TParams, TReturns> {
81
+ return new ProcedureBuilder({ ...this.meta, description: desc });
82
+ }
83
+
84
+ /**
85
+ * Database set name
86
+ *
87
+ * @param db - Database 이름
88
+ * @returns new ProcedureBuilder instance
89
+ *
90
+ * @example
91
+ * ```typescript
92
+ * const GetUser = Procedure("GetUser").database("mydb");
93
+ * ```
94
+ */
95
+ database(db: string): ProcedureBuilder<TParams, TReturns> {
96
+ return new ProcedureBuilder({ ...this.meta, database: db });
97
+ }
98
+
99
+ /**
100
+ * schema set name
101
+ *
102
+ * MSSQL, PostgreSQLused in
103
+ *
104
+ * @param schema - Schema 이름 (MSSQL: dbo, PostgreSQL: public)
105
+ * @returns new ProcedureBuilder instance
106
+ */
107
+ schema(schema: string): ProcedureBuilder<TParams, TReturns> {
108
+ return new ProcedureBuilder({ ...this.meta, schema });
109
+ }
110
+
111
+ /**
112
+ * 파라미터 definition
113
+ *
114
+ * Procedure 입력 파라미터 definition
115
+ * DBMS별 파라미터 문법 차이 주의 (MSSQL: @param, MySQL/PostgreSQL: param)
116
+ *
117
+ * @template T - 새 파라미터 definition type
118
+ * @param fn - Column factory를 받아 파라미터 정의를 반환하는 function
119
+ * @returns new ProcedureBuilder instance
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * const GetUserById = Procedure("GetUserById")
124
+ * .params((c) => ({
125
+ * userId: c.bigint(),
126
+ * includeDeleted: c.boolean().default(false),
127
+ * }));
128
+ * ```
129
+ */
130
+ params<T extends ColumnBuilderRecord>(
131
+ fn: (c: ReturnType<typeof createColumnFactory>) => T,
132
+ ): ProcedureBuilder<T, TReturns> {
133
+ return new ProcedureBuilder({ ...this.meta, params: fn(createColumnFactory()) });
134
+ }
135
+
136
+ /**
137
+ * return type definition
138
+ *
139
+ * Procedure return result Column definition
140
+ *
141
+ * @template T - 새 return type definition
142
+ * @param fn - Column factory를 받아 return Column definition를 반환하는 function
143
+ * @returns new ProcedureBuilder instance
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const GetUserById = Procedure("GetUserById")
148
+ * .params((c) => ({ userId: c.bigint() }))
149
+ * .returns((c) => ({
150
+ * id: c.bigint(),
151
+ * name: c.varchar(100),
152
+ * email: c.varchar(200).nullable(),
153
+ * }));
154
+ * ```
155
+ */
156
+ returns<T extends ColumnBuilderRecord>(
157
+ fn: (c: ReturnType<typeof createColumnFactory>) => T,
158
+ ): ProcedureBuilder<TParams, T> {
159
+ return new ProcedureBuilder({ ...this.meta, returns: fn(createColumnFactory()) });
160
+ }
161
+
162
+ /**
163
+ * Procedure 본문 SQL 설정
164
+ *
165
+ * DBMS별 SQL 문법 차이 주의:
166
+ * - MySQL: 파라미터명 그대로 (userId)
167
+ * - MSSQL: @ 접두사 (@userId)
168
+ * - PostgreSQL: RETURN QUERY 필요
169
+ *
170
+ * @param sql - Procedure 본문 SQL
171
+ * @returns new ProcedureBuilder instance
172
+ *
173
+ * @example
174
+ * ```typescript
175
+ * // MySQL/PostgreSQL
176
+ * const GetUser = Procedure("GetUser")
177
+ * .params((c) => ({ userId: c.bigint() }))
178
+ * .body("SELECT * FROM User WHERE id = userId");
179
+ *
180
+ * // MSSQL
181
+ * const GetUser = Procedure("GetUser")
182
+ * .params((c) => ({ userId: c.bigint() }))
183
+ * .body("SELECT * FROM [User] WHERE id = @userId");
184
+ * ```
185
+ */
186
+ body(sql: string): ProcedureBuilder<TParams, TReturns> {
187
+ return new ProcedureBuilder({ ...this.meta, query: sql });
188
+ }
189
+ }
190
+
191
+ // ============================================
192
+ // Procedure function
193
+ // ============================================
194
+
195
+ /**
196
+ * Procedure builder Generate factory function
197
+ *
198
+ * ProcedureBuilder를 생성하여 Fluent API로 저장 Procedure schema definition
199
+ *
200
+ * @param name - Procedure 이름
201
+ * @returns ProcedureBuilder instance
202
+ *
203
+ * @example
204
+ * ```typescript
205
+ * // Basic 사용
206
+ * const GetUserById = Procedure("GetUserById")
207
+ * .database("mydb")
208
+ * .params((c) => ({
209
+ * userId: c.bigint(),
210
+ * }))
211
+ * .returns((c) => ({
212
+ * id: c.bigint(),
213
+ * name: c.varchar(100),
214
+ * email: c.varchar(200),
215
+ * }))
216
+ * .body("SELECT id, name, email FROM User WHERE id = userId");
217
+ *
218
+ * // 파라미터 없는 Procedure
219
+ * const GetAllActiveUsers = Procedure("GetAllActiveUsers")
220
+ * .database("mydb")
221
+ * .returns((c) => ({
222
+ * id: c.bigint(),
223
+ * name: c.varchar(100),
224
+ * }))
225
+ * .body("SELECT id, name FROM User WHERE status = 'active'");
226
+ * ```
227
+ *
228
+ * @see {@link ProcedureBuilder} builder class
229
+ */
230
+ export function Procedure(name: string): ProcedureBuilder<never, never> {
231
+ return new ProcedureBuilder({ name });
232
+ }