@simplysm/orm-common 13.0.0-beta.50 → 13.0.1

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 (65) hide show
  1. package/README.md +135 -7
  2. package/dist/create-db-context.d.ts +34 -0
  3. package/dist/create-db-context.d.ts.map +1 -0
  4. package/dist/create-db-context.js +283 -0
  5. package/dist/create-db-context.js.map +6 -0
  6. package/dist/ddl/column-ddl.d.ts +19 -0
  7. package/dist/ddl/column-ddl.d.ts.map +1 -0
  8. package/dist/ddl/column-ddl.js +39 -0
  9. package/dist/ddl/column-ddl.js.map +6 -0
  10. package/dist/ddl/initialize.d.ts +36 -0
  11. package/dist/ddl/initialize.d.ts.map +1 -0
  12. package/dist/ddl/initialize.js +157 -0
  13. package/dist/ddl/initialize.js.map +6 -0
  14. package/dist/ddl/relation-ddl.d.ts +29 -0
  15. package/dist/ddl/relation-ddl.d.ts.map +1 -0
  16. package/dist/ddl/relation-ddl.js +56 -0
  17. package/dist/ddl/relation-ddl.js.map +6 -0
  18. package/dist/ddl/schema-ddl.d.ts +21 -0
  19. package/dist/ddl/schema-ddl.d.ts.map +1 -0
  20. package/dist/ddl/schema-ddl.js +19 -0
  21. package/dist/ddl/schema-ddl.js.map +6 -0
  22. package/dist/ddl/table-ddl.d.ts +66 -0
  23. package/dist/ddl/table-ddl.d.ts.map +1 -0
  24. package/dist/ddl/table-ddl.js +106 -0
  25. package/dist/ddl/table-ddl.js.map +6 -0
  26. package/dist/define-db-context.d.ts +12 -0
  27. package/dist/define-db-context.d.ts.map +1 -0
  28. package/dist/define-db-context.js +14 -0
  29. package/dist/define-db-context.js.map +6 -0
  30. package/dist/exec/executable.d.ts +3 -3
  31. package/dist/exec/executable.d.ts.map +1 -1
  32. package/dist/exec/queryable.d.ts +4 -4
  33. package/dist/exec/queryable.d.ts.map +1 -1
  34. package/dist/index.d.ts +3 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +4 -2
  37. package/dist/index.js.map +1 -1
  38. package/dist/schema/view-builder.d.ts +4 -4
  39. package/dist/schema/view-builder.d.ts.map +1 -1
  40. package/dist/types/db-context-def.d.ts +117 -0
  41. package/dist/types/db-context-def.d.ts.map +1 -0
  42. package/dist/types/db-context-def.js +1 -0
  43. package/dist/types/db-context-def.js.map +6 -0
  44. package/dist/types/db.d.ts +2 -2
  45. package/dist/types/db.d.ts.map +1 -1
  46. package/docs/schema.md +51 -10
  47. package/package.json +2 -2
  48. package/src/create-db-context.ts +368 -0
  49. package/src/ddl/column-ddl.ts +68 -0
  50. package/src/ddl/initialize.ts +249 -0
  51. package/src/ddl/relation-ddl.ts +86 -0
  52. package/src/ddl/schema-ddl.ts +35 -0
  53. package/src/ddl/table-ddl.ts +180 -0
  54. package/src/define-db-context.ts +25 -0
  55. package/src/exec/executable.ts +3 -3
  56. package/src/exec/queryable.ts +4 -4
  57. package/src/index.ts +12 -1
  58. package/src/schema/view-builder.ts +3 -3
  59. package/src/types/db-context-def.ts +134 -0
  60. package/src/types/db.ts +2 -2
  61. package/dist/db-context.d.ts +0 -669
  62. package/dist/db-context.d.ts.map +0 -1
  63. package/dist/db-context.js +0 -1065
  64. package/dist/db-context.js.map +0 -6
  65. package/src/db-context.ts +0 -1293
package/README.md CHANGED
@@ -76,6 +76,134 @@ See [docs/expressions.md](docs/expressions.md) for full documentation.
76
76
  - **[Window Functions](docs/expressions.md#window-functions)** - `expr.rowNumber()`, `expr.rank()`, `expr.denseRank()`, `expr.lag()`, `expr.lead()`, `expr.sumOver()`, `expr.avgOver()`
77
77
  - **[Other Expressions](docs/expressions.md#other-expressions)** - `expr.val()`, `expr.raw()`, `expr.cast()`, `expr.subquery()`, `expr.random()`
78
78
 
79
+ ## DbContext API
80
+
81
+ ### Functional API (Recommended)
82
+
83
+ The functional API uses `defineDbContext` + `createDbContext` for better type safety and composability.
84
+
85
+ ```typescript
86
+ import { defineDbContext, createDbContext, createColumnFactory } from "@simplysm/orm-common";
87
+
88
+ // Step 1: Define DbContext schema
89
+ const MyDbDef = defineDbContext({
90
+ tables: { user: User, post: Post },
91
+ views: { activeUsers: ActiveUsers },
92
+ procedures: { getUserById: GetUserById },
93
+ migrations: [
94
+ {
95
+ name: "20260101_add_status",
96
+ up: async (db) => {
97
+ const c = createColumnFactory();
98
+ await db.addColumn(
99
+ { database: "mydb", name: "User" },
100
+ "status",
101
+ c.varchar(20).nullable(),
102
+ );
103
+ },
104
+ },
105
+ ],
106
+ });
107
+
108
+ // Step 2: Create instance with executor
109
+ const db = createDbContext(MyDbDef, executor, { database: "mydb" });
110
+
111
+ // Use queryable accessors
112
+ await db.connect(async () => {
113
+ const users = await db.user().result();
114
+ const posts = await db.post().result();
115
+ });
116
+ ```
117
+
118
+ #### Type Definitions
119
+
120
+ | Type | Description |
121
+ |------|-------------|
122
+ | `DbContextDef<TTables, TViews, TProcedures>` | DbContext definition (schema blueprint) |
123
+ | `DbContextInstance<TDef>` | Full DbContext instance with queryable accessors and DDL methods |
124
+ | `DbContextBase` | Core interface used internally (status, executeDefs, etc.) |
125
+
126
+ ### Class-based API (Deprecated)
127
+
128
+ The old class-based API is deprecated. Migrate to the functional API for better type safety.
129
+
130
+ ```typescript
131
+ // Old (deprecated):
132
+ import { DbContext, queryable } from "@simplysm/orm-common";
133
+
134
+ class MyDb extends DbContext {
135
+ readonly user = queryable(this, User);
136
+ readonly migrations = [...];
137
+ }
138
+ const db = new MyDb(executor, { database: "mydb" });
139
+
140
+ // New (recommended):
141
+ const MyDbDef = defineDbContext({
142
+ tables: { user: User },
143
+ migrations: [...],
144
+ });
145
+ const db = createDbContext(MyDbDef, executor, { database: "mydb" });
146
+ ```
147
+
148
+ ### Migration Guide
149
+
150
+ To migrate from class-based to functional API:
151
+
152
+ **Step 1: Replace class definition**
153
+
154
+ ```typescript
155
+ // Before:
156
+ class MyDb extends DbContext {
157
+ readonly user = queryable(this, User);
158
+ readonly post = queryable(this, Post);
159
+ readonly getUserById = executable(this, GetUserById);
160
+
161
+ readonly migrations = [
162
+ { name: "...", up: async (db: MyDb) => { ... } }
163
+ ];
164
+ }
165
+
166
+ // After:
167
+ const MyDbDef = defineDbContext({
168
+ tables: { user: User, post: Post },
169
+ procedures: { getUserById: GetUserById },
170
+ migrations: [
171
+ { name: "...", up: async (db) => { ... } }
172
+ ],
173
+ });
174
+ ```
175
+
176
+ **Step 2: Replace instantiation**
177
+
178
+ ```typescript
179
+ // Before:
180
+ const db = new MyDb(executor, { database: "mydb" });
181
+
182
+ // After:
183
+ const db = createDbContext(MyDbDef, executor, { database: "mydb" });
184
+ ```
185
+
186
+ **Step 3: Update usage (no changes needed)**
187
+
188
+ ```typescript
189
+ // Both APIs use the same queryable accessors:
190
+ await db.connect(async () => {
191
+ const users = await db.user().result(); // Same syntax
192
+ });
193
+ ```
194
+
195
+ **Type inference:**
196
+
197
+ ```typescript
198
+ // Extract instance type:
199
+ type MyDb = DbContextInstance<typeof MyDbDef>;
200
+
201
+ // Use in function parameters:
202
+ async function doSomething(db: MyDb) {
203
+ await db.user().result();
204
+ }
205
+ ```
206
+
79
207
  ## Security Notes
80
208
 
81
209
  orm-common uses **enhanced string escaping** instead of parameter binding due to its dynamic query nature.
@@ -99,7 +227,7 @@ await db.user().where((u) => [expr.eq(u.id, userId)]).result();
99
227
  ## Quick Start
100
228
 
101
229
  ```typescript
102
- import { Table, DbContext, queryable, expr } from "@simplysm/orm-common";
230
+ import { Table, defineDbContext, createDbContext, expr, DateTime } from "@simplysm/orm-common";
103
231
 
104
232
  // Define table schema
105
233
  const User = Table("User")
@@ -112,13 +240,13 @@ const User = Table("User")
112
240
  }))
113
241
  .primaryKey("id");
114
242
 
115
- // Create DbContext
116
- class MyDb extends DbContext {
117
- readonly user = queryable(this, User);
118
- }
243
+ // Define DbContext
244
+ const MyDbDef = defineDbContext({
245
+ tables: { user: User },
246
+ });
119
247
 
120
- // Use with executor (from orm-node package)
121
- const db = new MyDb(executor, { database: "mydb" });
248
+ // Create DbContext instance with executor (from orm-node package)
249
+ const db = createDbContext(MyDbDef, executor, { database: "mydb" });
122
250
 
123
251
  // Execute queries
124
252
  await db.connect(async () => {
@@ -0,0 +1,34 @@
1
+ import type { DbContextDef, DbContextInstance } from "./types/db-context-def";
2
+ import type { DbContextExecutor } from "./types/db";
3
+ /**
4
+ * DbContext 인스턴스 팩토리
5
+ *
6
+ * DbContextDef(정의)와 DbContextExecutor(실행기)를 받아
7
+ * queryable 접근자, DDL 메서드, 연결/트랜잭션 관리를 포함한
8
+ * 완전한 DbContext 인스턴스를 생성
9
+ *
10
+ * @param def - defineDbContext()로 생성한 정의 객체
11
+ * @param executor - 쿼리 실행기 (NodeDbContextExecutor, ServiceDbContextExecutor 등)
12
+ * @param opt - 데이터베이스 옵션
13
+ * @param opt.database - 데이터베이스 이름
14
+ * @param opt.schema - 스키마 이름 (MSSQL: dbo, PostgreSQL: public)
15
+ * @returns 완전한 DbContext 인스턴스
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const MyDb = defineDbContext({
20
+ * tables: { user: User, post: Post },
21
+ * });
22
+ *
23
+ * const db = createDbContext(MyDb, executor, { database: "mydb" });
24
+ *
25
+ * await db.connect(async () => {
26
+ * const users = await db.user().result();
27
+ * });
28
+ * ```
29
+ */
30
+ export declare function createDbContext<TDef extends DbContextDef<any, any, any>>(def: TDef, executor: DbContextExecutor, opt: {
31
+ database: string;
32
+ schema?: string;
33
+ }): DbContextInstance<TDef>;
34
+ //# sourceMappingURL=create-db-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-db-context.d.ts","sourceRoot":"","sources":["../src/create-db-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAkC,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC9G,OAAO,KAAK,EAAc,iBAAiB,EAA8B,MAAM,YAAY,CAAC;AAuB5F;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EACtE,GAAG,EAAE,IAAI,EACT,QAAQ,EAAE,iBAAiB,EAC3B,GAAG,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC,iBAAiB,CAAC,IAAI,CAAC,CAwTzB"}
@@ -0,0 +1,283 @@
1
+ import { DDL_TYPES } from "./types/query-def.js";
2
+ import { DbErrorCode, DbTransactionError } from "./errors/db-transaction-error.js";
3
+ import { TableBuilder } from "./schema/table-builder.js";
4
+ import { ViewBuilder } from "./schema/view-builder.js";
5
+ import { queryable } from "./exec/queryable.js";
6
+ import { executable } from "./exec/executable.js";
7
+ import { objClearUndefined } from "@simplysm/core-common";
8
+ import { SystemMigration } from "./models/system-migration.js";
9
+ import * as tableDdl from "./ddl/table-ddl.js";
10
+ import * as columnDdl from "./ddl/column-ddl.js";
11
+ import * as relationDdl from "./ddl/relation-ddl.js";
12
+ import * as schemaDdl from "./ddl/schema-ddl.js";
13
+ import { initialize as initializeImpl, validateRelations as validateRelationsImpl } from "./ddl/initialize.js";
14
+ function createDbContext(def, executor, opt) {
15
+ let aliasCounter = 0;
16
+ let status = "ready";
17
+ const base = {
18
+ get status() {
19
+ return status;
20
+ },
21
+ set status(v) {
22
+ status = v;
23
+ },
24
+ get database() {
25
+ return opt.database;
26
+ },
27
+ get schema() {
28
+ return opt.schema;
29
+ },
30
+ getNextAlias() {
31
+ return `T${++aliasCounter}`;
32
+ },
33
+ resetAliasCounter() {
34
+ aliasCounter = 0;
35
+ },
36
+ executeDefs(defs, resultMetas) {
37
+ if (status === "transact" && defs.some((d) => DDL_TYPES.includes(d.type))) {
38
+ throw new Error("TRANSACTION \uC0C1\uD0DC\uC5D0\uC11C\uB294 DDL\uC744 \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
39
+ }
40
+ return executor.executeDefs(defs, resultMetas);
41
+ },
42
+ getQueryDefObjectName(tableOrView) {
43
+ return objClearUndefined({
44
+ database: tableOrView.meta.database ?? opt.database,
45
+ schema: tableOrView.meta.schema ?? opt.schema,
46
+ name: tableOrView.meta.name
47
+ });
48
+ },
49
+ async switchFk(table, switch_) {
50
+ await base.executeDefs([schemaDdl.getSwitchFkQueryDef(table, switch_)]);
51
+ }
52
+ };
53
+ const db = {
54
+ // Spread base properties (getters/setters need special handling)
55
+ get status() {
56
+ return base.status;
57
+ },
58
+ set status(v) {
59
+ base.status = v;
60
+ },
61
+ get database() {
62
+ return base.database;
63
+ },
64
+ get schema() {
65
+ return base.schema;
66
+ },
67
+ getNextAlias: base.getNextAlias,
68
+ resetAliasCounter: base.resetAliasCounter,
69
+ executeDefs: base.executeDefs,
70
+ getQueryDefObjectName: base.getQueryDefObjectName,
71
+ //#region ========== Connection management ==========
72
+ /**
73
+ * 트랜잭션 내에서 콜백 실행 (자동 커밋/롤백)
74
+ *
75
+ * 연결 -> 트랜잭션 시작 -> 콜백 실행 -> 커밋 -> 연결 종료
76
+ * 에러 발생 시 자동 롤백 후 연결 종료
77
+ */
78
+ async connect(fn, isolationLevel) {
79
+ validateRelationsImpl(def);
80
+ base.resetAliasCounter();
81
+ await executor.connect();
82
+ status = "connect";
83
+ await executor.beginTransaction(isolationLevel);
84
+ status = "transact";
85
+ let result;
86
+ try {
87
+ result = await fn();
88
+ await executor.commitTransaction();
89
+ status = "connect";
90
+ } catch (err) {
91
+ try {
92
+ await executor.rollbackTransaction();
93
+ status = "connect";
94
+ } catch (err1) {
95
+ if (err1 instanceof DbTransactionError) {
96
+ if (err1.code !== DbErrorCode.NO_ACTIVE_TRANSACTION) {
97
+ await executor.close();
98
+ status = "ready";
99
+ throw err1;
100
+ }
101
+ } else {
102
+ await executor.close();
103
+ status = "ready";
104
+ throw err1;
105
+ }
106
+ }
107
+ await executor.close();
108
+ status = "ready";
109
+ throw err;
110
+ }
111
+ await executor.close();
112
+ status = "ready";
113
+ return result;
114
+ },
115
+ /**
116
+ * 트랜잭션 없이 연결하여 콜백 실행 후 자동 종료
117
+ *
118
+ * DDL 작업이나 트랜잭션이 필요 없는 조회 작업에 사용
119
+ */
120
+ async connectWithoutTransaction(callback) {
121
+ validateRelationsImpl(def);
122
+ base.resetAliasCounter();
123
+ await executor.connect();
124
+ status = "connect";
125
+ let result;
126
+ try {
127
+ result = await callback();
128
+ } catch (err) {
129
+ await executor.close();
130
+ status = "ready";
131
+ throw err;
132
+ }
133
+ await executor.close();
134
+ status = "ready";
135
+ return result;
136
+ },
137
+ /**
138
+ * 이미 연결된 상태에서 트랜잭션 시작 (자동 커밋/롤백)
139
+ *
140
+ * connectWithoutTransaction 내에서 부분적으로 트랜잭션이 필요할 때 사용
141
+ */
142
+ async trans(fn, isolationLevel) {
143
+ if (status === "transact") {
144
+ throw new Error("\uC774\uBBF8 TRANSACTION \uC0C1\uD0DC\uC785\uB2C8\uB2E4.");
145
+ }
146
+ await executor.beginTransaction(isolationLevel);
147
+ status = "transact";
148
+ let result;
149
+ try {
150
+ result = await fn();
151
+ await executor.commitTransaction();
152
+ status = "connect";
153
+ } catch (err) {
154
+ try {
155
+ await executor.rollbackTransaction();
156
+ status = "connect";
157
+ } catch (err1) {
158
+ if (err1 instanceof DbTransactionError) {
159
+ if (err1.code !== DbErrorCode.NO_ACTIVE_TRANSACTION) {
160
+ throw err1;
161
+ }
162
+ } else {
163
+ throw err1;
164
+ }
165
+ status = "connect";
166
+ }
167
+ throw err;
168
+ }
169
+ return result;
170
+ },
171
+ //#endregion
172
+ //#region ========== DDL execution methods ==========
173
+ async createTable(table) {
174
+ await base.executeDefs([tableDdl.getCreateTableQueryDef(base, table)]);
175
+ },
176
+ async dropTable(table) {
177
+ await base.executeDefs([tableDdl.getDropTableQueryDef(table)]);
178
+ },
179
+ async renameTable(table, newName) {
180
+ await base.executeDefs([tableDdl.getRenameTableQueryDef(table, newName)]);
181
+ },
182
+ async createView(view) {
183
+ await base.executeDefs([tableDdl.getCreateViewQueryDef(db, view)]);
184
+ },
185
+ async dropView(view) {
186
+ await base.executeDefs([tableDdl.getDropViewQueryDef(view)]);
187
+ },
188
+ async createProc(procedure) {
189
+ await base.executeDefs([tableDdl.getCreateProcQueryDef(base, procedure)]);
190
+ },
191
+ async dropProc(procedure) {
192
+ await base.executeDefs([tableDdl.getDropProcQueryDef(procedure)]);
193
+ },
194
+ async addColumn(table, columnName, column) {
195
+ await base.executeDefs([columnDdl.getAddColumnQueryDef(table, columnName, column)]);
196
+ },
197
+ async dropColumn(table, column) {
198
+ await base.executeDefs([columnDdl.getDropColumnQueryDef(table, column)]);
199
+ },
200
+ async modifyColumn(table, columnName, column) {
201
+ await base.executeDefs([columnDdl.getModifyColumnQueryDef(table, columnName, column)]);
202
+ },
203
+ async renameColumn(table, column, newName) {
204
+ await base.executeDefs([columnDdl.getRenameColumnQueryDef(table, column, newName)]);
205
+ },
206
+ async addPk(table, columns) {
207
+ await base.executeDefs([relationDdl.getAddPkQueryDef(table, columns)]);
208
+ },
209
+ async dropPk(table) {
210
+ await base.executeDefs([relationDdl.getDropPkQueryDef(table)]);
211
+ },
212
+ async addFk(table, relationName, relationDef) {
213
+ await base.executeDefs([relationDdl.getAddFkQueryDef(base, table, relationName, relationDef)]);
214
+ },
215
+ async addIdx(table, indexBuilder) {
216
+ await base.executeDefs([relationDdl.getAddIdxQueryDef(table, indexBuilder)]);
217
+ },
218
+ async dropFk(table, relationName) {
219
+ await base.executeDefs([relationDdl.getDropFkQueryDef(table, relationName)]);
220
+ },
221
+ async dropIdx(table, columns) {
222
+ await base.executeDefs([relationDdl.getDropIdxQueryDef(table, columns)]);
223
+ },
224
+ async clearSchema(params) {
225
+ await base.executeDefs([schemaDdl.getClearSchemaQueryDef(params)]);
226
+ },
227
+ async schemaExists(database, schema) {
228
+ const result = await base.executeDefs([schemaDdl.getSchemaExistsQueryDef(database, schema)]);
229
+ return result[0].length > 0;
230
+ },
231
+ async truncate(table) {
232
+ await base.executeDefs([schemaDdl.getTruncateQueryDef(table)]);
233
+ },
234
+ async switchFk(table, switch_) {
235
+ await base.executeDefs([schemaDdl.getSwitchFkQueryDef(table, switch_)]);
236
+ },
237
+ //#endregion
238
+ //#region ========== DDL QueryDef generators ==========
239
+ getCreateTableQueryDef: (table) => tableDdl.getCreateTableQueryDef(base, table),
240
+ getCreateViewQueryDef: (view) => tableDdl.getCreateViewQueryDef(db, view),
241
+ getCreateProcQueryDef: (procedure) => tableDdl.getCreateProcQueryDef(base, procedure),
242
+ getCreateObjectQueryDef: (builder) => tableDdl.getCreateObjectQueryDef(db, builder),
243
+ getDropTableQueryDef: tableDdl.getDropTableQueryDef,
244
+ getRenameTableQueryDef: tableDdl.getRenameTableQueryDef,
245
+ getDropViewQueryDef: tableDdl.getDropViewQueryDef,
246
+ getDropProcQueryDef: tableDdl.getDropProcQueryDef,
247
+ getAddColumnQueryDef: columnDdl.getAddColumnQueryDef,
248
+ getDropColumnQueryDef: columnDdl.getDropColumnQueryDef,
249
+ getModifyColumnQueryDef: columnDdl.getModifyColumnQueryDef,
250
+ getRenameColumnQueryDef: columnDdl.getRenameColumnQueryDef,
251
+ getAddPkQueryDef: relationDdl.getAddPkQueryDef,
252
+ getDropPkQueryDef: relationDdl.getDropPkQueryDef,
253
+ getAddFkQueryDef: (table, relationName, relationDef) => relationDdl.getAddFkQueryDef(base, table, relationName, relationDef),
254
+ getAddIdxQueryDef: relationDdl.getAddIdxQueryDef,
255
+ getDropFkQueryDef: relationDdl.getDropFkQueryDef,
256
+ getDropIdxQueryDef: relationDdl.getDropIdxQueryDef,
257
+ getClearSchemaQueryDef: schemaDdl.getClearSchemaQueryDef,
258
+ getSchemaExistsQueryDef: schemaDdl.getSchemaExistsQueryDef,
259
+ getTruncateQueryDef: schemaDdl.getTruncateQueryDef,
260
+ getSwitchFkQueryDef: schemaDdl.getSwitchFkQueryDef,
261
+ //#endregion
262
+ //#region ========== Initialize ==========
263
+ async initialize(options) {
264
+ await initializeImpl(db, def, options);
265
+ }
266
+ //#endregion
267
+ };
268
+ for (const [key, tableOrView] of Object.entries(def.meta.tables)) {
269
+ db[key] = queryable(db, tableOrView);
270
+ }
271
+ for (const [key, view] of Object.entries(def.meta.views)) {
272
+ db[key] = queryable(db, view);
273
+ }
274
+ for (const [key, proc] of Object.entries(def.meta.procedures)) {
275
+ db[key] = executable(base, proc);
276
+ }
277
+ db.systemMigration = queryable(db, SystemMigration);
278
+ return db;
279
+ }
280
+ export {
281
+ createDbContext
282
+ };
283
+ //# sourceMappingURL=create-db-context.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/create-db-context.ts"],
4
+ "mappings": "AAGA,SAAS,iBAAiB;AAC1B,SAAS,aAAa,0BAA0B;AAChD,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAE5B,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAClC,SAAS,uBAAuB;AAGhC,YAAY,cAAc;AAC1B,YAAY,eAAe;AAC3B,YAAY,iBAAiB;AAC7B,YAAY,eAAe;AAC3B,SAAS,cAAc,gBAAgB,qBAAqB,6BAA6B;AAiClF,SAAS,gBACd,KACA,UACA,KACyB;AAEzB,MAAI,eAAe;AACnB,MAAI,SAA0B;AAG9B,QAAM,OAAsB;AAAA,IAC1B,IAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAO,GAAoB;AAC7B,eAAS;AAAA,IACX;AAAA,IACA,IAAI,WAAW;AACb,aAAO,IAAI;AAAA,IACb;AAAA,IACA,IAAI,SAAS;AACX,aAAO,IAAI;AAAA,IACb;AAAA,IACA,eAAe;AACb,aAAO,IAAI,EAAE,YAAY;AAAA,IAC3B;AAAA,IACA,oBAAoB;AAClB,qBAAe;AAAA,IACjB;AAAA,IACA,YAA4B,MAAkB,aAA0D;AACtG,UAAI,WAAW,cAAc,KAAK,KAAK,CAAC,MAAO,UAAgC,SAAS,EAAE,IAAI,CAAC,GAAG;AAChG,cAAM,IAAI,MAAM,0GAAoC;AAAA,MACtD;AACA,aAAO,SAAS,YAAY,MAAM,WAAW;AAAA,IAC/C;AAAA,IACA,sBAAsB,aAAsF;AAC1G,aAAO,kBAAkB;AAAA,QACvB,UAAU,YAAY,KAAK,YAAY,IAAI;AAAA,QAC3C,QAAQ,YAAY,KAAK,UAAU,IAAI;AAAA,QACvC,MAAM,YAAY,KAAK;AAAA,MACzB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,SAAS,OAA2B,SAAsC;AAC9E,YAAM,KAAK,YAAY,CAAC,UAAU,oBAAoB,OAAO,OAAO,CAAC,CAAC;AAAA,IACxE;AAAA,EACF;AAGA,QAAM,KAAK;AAAA;AAAA,IAET,IAAI,SAAS;AACX,aAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,OAAO,GAAoB;AAC7B,WAAK,SAAS;AAAA,IAChB;AAAA,IACA,IAAI,WAAW;AACb,aAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,SAAS;AACX,aAAO,KAAK;AAAA,IACd;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,mBAAmB,KAAK;AAAA,IACxB,aAAa,KAAK;AAAA,IAClB,uBAAuB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAU5B,MAAM,QAAW,IAAsB,gBAA6C;AAClF,4BAAsB,GAAG;AACzB,WAAK,kBAAkB;AAEvB,YAAM,SAAS,QAAQ;AACvB,eAAS;AAET,YAAM,SAAS,iBAAiB,cAAc;AAC9C,eAAS;AAET,UAAI;AACJ,UAAI;AACF,iBAAS,MAAM,GAAG;AAElB,cAAM,SAAS,kBAAkB;AACjC,iBAAS;AAAA,MACX,SAAS,KAAK;AACZ,YAAI;AACF,gBAAM,SAAS,oBAAoB;AACnC,mBAAS;AAAA,QACX,SAAS,MAAM;AACb,cAAI,gBAAgB,oBAAoB;AACtC,gBAAI,KAAK,SAAS,YAAY,uBAAuB;AACnD,oBAAM,SAAS,MAAM;AACrB,uBAAS;AACT,oBAAM;AAAA,YACR;AAAA,UACF,OAAO;AACL,kBAAM,SAAS,MAAM;AACrB,qBAAS;AACT,kBAAM;AAAA,UACR;AAAA,QACF;AAEA,cAAM,SAAS,MAAM;AACrB,iBAAS;AACT,cAAM;AAAA,MACR;AAEA,YAAM,SAAS,MAAM;AACrB,eAAS;AACT,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,0BAA6B,UAAwC;AACzE,4BAAsB,GAAG;AACzB,WAAK,kBAAkB;AAEvB,YAAM,SAAS,QAAQ;AACvB,eAAS;AAET,UAAI;AACJ,UAAI;AACF,iBAAS,MAAM,SAAS;AAAA,MAC1B,SAAS,KAAK;AACZ,cAAM,SAAS,MAAM;AACrB,iBAAS;AACT,cAAM;AAAA,MACR;AAEA,YAAM,SAAS,MAAM;AACrB,eAAS;AACT,aAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,MAAM,MAAS,IAAsB,gBAA6C;AAChF,UAAI,WAAW,YAAY;AACzB,cAAM,IAAI,MAAM,0DAAuB;AAAA,MACzC;AAEA,YAAM,SAAS,iBAAiB,cAAc;AAC9C,eAAS;AAET,UAAI;AACJ,UAAI;AACF,iBAAS,MAAM,GAAG;AAElB,cAAM,SAAS,kBAAkB;AACjC,iBAAS;AAAA,MACX,SAAS,KAAK;AACZ,YAAI;AACF,gBAAM,SAAS,oBAAoB;AACnC,mBAAS;AAAA,QACX,SAAS,MAAM;AACb,cAAI,gBAAgB,oBAAoB;AACtC,gBAAI,KAAK,SAAS,YAAY,uBAAuB;AACnD,oBAAM;AAAA,YACR;AAAA,UACF,OAAO;AACL,kBAAM;AAAA,UACR;AAEA,mBAAS;AAAA,QACX;AACA,cAAM;AAAA,MACR;AAEA,aAAO;AAAA,IACT;AAAA;AAAA;AAAA,IAMA,MAAM,YAAY,OAA8C;AAC9D,YAAM,KAAK,YAAY,CAAC,SAAS,uBAAuB,MAAM,KAAK,CAAC,CAAC;AAAA,IACvE;AAAA,IACA,MAAM,UAAU,OAA0C;AACxD,YAAM,KAAK,YAAY,CAAC,SAAS,qBAAqB,KAAK,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA,MAAM,YAAY,OAA2B,SAAgC;AAC3E,YAAM,KAAK,YAAY,CAAC,SAAS,uBAAuB,OAAO,OAAO,CAAC,CAAC;AAAA,IAC1E;AAAA,IACA,MAAM,WAAW,MAAiD;AAChE,YAAM,KAAK,YAAY,CAAC,SAAS,sBAAsB,IAAW,IAAI,CAAC,CAAC;AAAA,IAC1E;AAAA,IACA,MAAM,SAAS,MAAyC;AACtD,YAAM,KAAK,YAAY,CAAC,SAAS,oBAAoB,IAAI,CAAC,CAAC;AAAA,IAC7D;AAAA,IACA,MAAM,WAAW,WAAsD;AACrE,YAAM,KAAK,YAAY,CAAC,SAAS,sBAAsB,MAAM,SAAS,CAAC,CAAC;AAAA,IAC1E;AAAA,IACA,MAAM,SAAS,WAA8C;AAC3D,YAAM,KAAK,YAAY,CAAC,SAAS,oBAAoB,SAAS,CAAC,CAAC;AAAA,IAClE;AAAA,IACA,MAAM,UAAU,OAA2B,YAAoB,QAAgD;AAC7G,YAAM,KAAK,YAAY,CAAC,UAAU,qBAAqB,OAAO,YAAY,MAAM,CAAC,CAAC;AAAA,IACpF;AAAA,IACA,MAAM,WAAW,OAA2B,QAA+B;AACzE,YAAM,KAAK,YAAY,CAAC,UAAU,sBAAsB,OAAO,MAAM,CAAC,CAAC;AAAA,IACzE;AAAA,IACA,MAAM,aAAa,OAA2B,YAAoB,QAAgD;AAChH,YAAM,KAAK,YAAY,CAAC,UAAU,wBAAwB,OAAO,YAAY,MAAM,CAAC,CAAC;AAAA,IACvF;AAAA,IACA,MAAM,aAAa,OAA2B,QAAgB,SAAgC;AAC5F,YAAM,KAAK,YAAY,CAAC,UAAU,wBAAwB,OAAO,QAAQ,OAAO,CAAC,CAAC;AAAA,IACpF;AAAA,IACA,MAAM,MAAM,OAA2B,SAAkC;AACvE,YAAM,KAAK,YAAY,CAAC,YAAY,iBAAiB,OAAO,OAAO,CAAC,CAAC;AAAA,IACvE;AAAA,IACA,MAAM,OAAO,OAA0C;AACrD,YAAM,KAAK,YAAY,CAAC,YAAY,kBAAkB,KAAK,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA,MAAM,MACJ,OACA,cACA,aACe;AACf,YAAM,KAAK,YAAY,CAAC,YAAY,iBAAiB,MAAM,OAAO,cAAc,WAAW,CAAC,CAAC;AAAA,IAC/F;AAAA,IACA,MAAM,OAAO,OAA2B,cAAqD;AAC3F,YAAM,KAAK,YAAY,CAAC,YAAY,kBAAkB,OAAO,YAAY,CAAC,CAAC;AAAA,IAC7E;AAAA,IACA,MAAM,OAAO,OAA2B,cAAqC;AAC3E,YAAM,KAAK,YAAY,CAAC,YAAY,kBAAkB,OAAO,YAAY,CAAC,CAAC;AAAA,IAC7E;AAAA,IACA,MAAM,QAAQ,OAA2B,SAAkC;AACzE,YAAM,KAAK,YAAY,CAAC,YAAY,mBAAmB,OAAO,OAAO,CAAC,CAAC;AAAA,IACzE;AAAA,IACA,MAAM,YAAY,QAA8D;AAC9E,YAAM,KAAK,YAAY,CAAC,UAAU,uBAAuB,MAAM,CAAC,CAAC;AAAA,IACnE;AAAA,IACA,MAAM,aAAa,UAAkB,QAAmC;AACtE,YAAM,SAAS,MAAM,KAAK,YAAY,CAAC,UAAU,wBAAwB,UAAU,MAAM,CAAC,CAAC;AAC3F,aAAO,OAAO,CAAC,EAAE,SAAS;AAAA,IAC5B;AAAA,IACA,MAAM,SAAS,OAA0C;AACvD,YAAM,KAAK,YAAY,CAAC,UAAU,oBAAoB,KAAK,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA,MAAM,SAAS,OAA2B,SAAsC;AAC9E,YAAM,KAAK,YAAY,CAAC,UAAU,oBAAoB,OAAO,OAAO,CAAC,CAAC;AAAA,IACxE;AAAA;AAAA;AAAA,IAMA,wBAAwB,CAAC,UAAkC,SAAS,uBAAuB,MAAM,KAAK;AAAA,IACtG,uBAAuB,CAAC,SAAqC,SAAS,sBAAsB,IAAW,IAAI;AAAA,IAC3G,uBAAuB,CAAC,cAA0C,SAAS,sBAAsB,MAAM,SAAS;AAAA,IAChH,yBAAyB,CACvB,YACG,SAAS,wBAAwB,IAAW,OAAO;AAAA,IACxD,sBAAsB,SAAS;AAAA,IAC/B,wBAAwB,SAAS;AAAA,IACjC,qBAAqB,SAAS;AAAA,IAC9B,qBAAqB,SAAS;AAAA,IAC9B,sBAAsB,UAAU;AAAA,IAChC,uBAAuB,UAAU;AAAA,IACjC,yBAAyB,UAAU;AAAA,IACnC,yBAAyB,UAAU;AAAA,IACnC,kBAAkB,YAAY;AAAA,IAC9B,mBAAmB,YAAY;AAAA,IAC/B,kBAAkB,CAAC,OAA2B,cAAsB,gBAClE,YAAY,iBAAiB,MAAM,OAAO,cAAc,WAAW;AAAA,IACrE,mBAAmB,YAAY;AAAA,IAC/B,mBAAmB,YAAY;AAAA,IAC/B,oBAAoB,YAAY;AAAA,IAChC,wBAAwB,UAAU;AAAA,IAClC,yBAAyB,UAAU;AAAA,IACnC,qBAAqB,UAAU;AAAA,IAC/B,qBAAqB,UAAU;AAAA;AAAA;AAAA,IAM/B,MAAM,WAAW,SAA8D;AAC7E,YAAM,eAAe,IAAW,KAAK,OAAO;AAAA,IAC9C;AAAA;AAAA,EAGF;AAGA,aAAW,CAAC,KAAK,WAAW,KAAK,OAAO,QAAQ,IAAI,KAAK,MAAM,GAAG;AAChE,IAAC,GAAW,GAAG,IAAI,UAAU,IAAW,WAAqC;AAAA,EAC/E;AACA,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,IAAI,KAAK,KAAK,GAAG;AACxD,IAAC,GAAW,GAAG,IAAI,UAAU,IAAW,IAAkC;AAAA,EAC5E;AAGA,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,IAAI,KAAK,UAAU,GAAG;AAC7D,IAAC,GAAW,GAAG,IAAI,WAAW,MAAM,IAAkC;AAAA,EACxE;AAGA,EAAC,GAAW,kBAAkB,UAAU,IAAW,eAAe;AAElE,SAAO;AACT;",
5
+ "names": []
6
+ }
@@ -0,0 +1,19 @@
1
+ import type { ColumnBuilder } from "../schema/factory/column-builder";
2
+ import type { QueryDefObjectName, AddColumnQueryDef, DropColumnQueryDef, ModifyColumnQueryDef, RenameColumnQueryDef } from "../types/query-def";
3
+ /**
4
+ * ADD COLUMN QueryDef 생성
5
+ */
6
+ export declare function getAddColumnQueryDef(table: QueryDefObjectName, columnName: string, column: ColumnBuilder<any, any>): AddColumnQueryDef;
7
+ /**
8
+ * DROP COLUMN QueryDef 생성
9
+ */
10
+ export declare function getDropColumnQueryDef(table: QueryDefObjectName, column: string): DropColumnQueryDef;
11
+ /**
12
+ * MODIFY COLUMN QueryDef 생성
13
+ */
14
+ export declare function getModifyColumnQueryDef(table: QueryDefObjectName, columnName: string, column: ColumnBuilder<any, any>): ModifyColumnQueryDef;
15
+ /**
16
+ * RENAME COLUMN QueryDef 생성
17
+ */
18
+ export declare function getRenameColumnQueryDef(table: QueryDefObjectName, column: string, newName: string): RenameColumnQueryDef;
19
+ //# sourceMappingURL=column-ddl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-ddl.d.ts","sourceRoot":"","sources":["../../src/ddl/column-ddl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,kBAAkB,EACzB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAC9B,iBAAiB,CAYnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAEnG;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,kBAAkB,EACzB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,GAC9B,oBAAoB,CAYtB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,kBAAkB,EACzB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,oBAAoB,CAEtB"}
@@ -0,0 +1,39 @@
1
+ function getAddColumnQueryDef(table, columnName, column) {
2
+ return {
3
+ type: "addColumn",
4
+ table,
5
+ column: {
6
+ name: columnName,
7
+ dataType: column.meta.dataType,
8
+ autoIncrement: column.meta.autoIncrement,
9
+ nullable: column.meta.nullable,
10
+ default: column.meta.default
11
+ }
12
+ };
13
+ }
14
+ function getDropColumnQueryDef(table, column) {
15
+ return { type: "dropColumn", table, column };
16
+ }
17
+ function getModifyColumnQueryDef(table, columnName, column) {
18
+ return {
19
+ type: "modifyColumn",
20
+ table,
21
+ column: {
22
+ name: columnName,
23
+ dataType: column.meta.dataType,
24
+ autoIncrement: column.meta.autoIncrement,
25
+ nullable: column.meta.nullable,
26
+ default: column.meta.default
27
+ }
28
+ };
29
+ }
30
+ function getRenameColumnQueryDef(table, column, newName) {
31
+ return { type: "renameColumn", table, column, newName };
32
+ }
33
+ export {
34
+ getAddColumnQueryDef,
35
+ getDropColumnQueryDef,
36
+ getModifyColumnQueryDef,
37
+ getRenameColumnQueryDef
38
+ };
39
+ //# sourceMappingURL=column-ddl.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/ddl/column-ddl.ts"],
4
+ "mappings": "AAYO,SAAS,qBACd,OACA,YACA,QACmB;AACnB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU,OAAO,KAAK;AAAA,MACtB,eAAe,OAAO,KAAK;AAAA,MAC3B,UAAU,OAAO,KAAK;AAAA,MACtB,SAAS,OAAO,KAAK;AAAA,IACvB;AAAA,EACF;AACF;AAKO,SAAS,sBAAsB,OAA2B,QAAoC;AACnG,SAAO,EAAE,MAAM,cAAc,OAAO,OAAO;AAC7C;AAKO,SAAS,wBACd,OACA,YACA,QACsB;AACtB,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU,OAAO,KAAK;AAAA,MACtB,eAAe,OAAO,KAAK;AAAA,MAC3B,UAAU,OAAO,KAAK;AAAA,MACtB,SAAS,OAAO,KAAK;AAAA,IACvB;AAAA,EACF;AACF;AAKO,SAAS,wBACd,OACA,QACA,SACsB;AACtB,SAAO,EAAE,MAAM,gBAAgB,OAAO,QAAQ,QAAQ;AACxD;",
5
+ "names": []
6
+ }
@@ -0,0 +1,36 @@
1
+ import type { DbContextBase, DbContextDef, DbContextDdlMethods } from "../types/db-context-def";
2
+ import type { Queryable } from "../exec/queryable";
3
+ /**
4
+ * Code First 데이터베이스 초기화
5
+ *
6
+ * DbContext에 정의된 테이블/뷰/프로시저를 데이터베이스에 생성하고,
7
+ * 마이그레이션을 적용
8
+ *
9
+ * @param db - DbContext 인스턴스
10
+ * @param def - DbContext 정의
11
+ * @param options - 초기화 옵션
12
+ * @param options.dbs - 초기화 대상 데이터베이스 목록 (미지정 시 현재 database)
13
+ * @param options.force - true 시 기존 스키마 삭제 후 전체 재생성
14
+ * @throws {Error} 초기화할 데이터베이스가 없을 때
15
+ * @throws {Error} 지정한 데이터베이스가 존재하지 않을 때
16
+ *
17
+ * 동작 방식:
18
+ * - **force=true**: clearSchema → 전체 생성 → 모든 migration "적용됨" 등록
19
+ * - **force=false** (기본):
20
+ * - SystemMigration 테이블 없음: 전체 생성 + 모든 migration 등록
21
+ * - SystemMigration 테이블 있음: 미적용 migration만 실행
22
+ */
23
+ export declare function initialize(db: DbContextBase & DbContextDdlMethods & {
24
+ systemMigration: () => Queryable<{
25
+ code: string;
26
+ }, any>;
27
+ }, def: DbContextDef<any, any, any>, options?: {
28
+ dbs?: string[];
29
+ force?: boolean;
30
+ }): Promise<void>;
31
+ /**
32
+ * ForeignKeyTarget/RelationKeyTarget 관계의 유효성 검증
33
+ * - targetTableFn()이 반환하는 테이블에 relationName에 해당하는 FK/RelationKey가 있는지 확인
34
+ */
35
+ export declare function validateRelations(def: DbContextDef<any, any, any>): void;
36
+ //# sourceMappingURL=initialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialize.d.ts","sourceRoot":"","sources":["../../src/ddl/initialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAChG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAenD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,UAAU,CAC9B,EAAE,EAAE,aAAa,GAAG,mBAAmB,GAAG;IAAE,eAAe,EAAE,MAAM,SAAS,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,CAAC,CAAA;CAAE,EACrG,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAChC,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CA6Df;AA+ED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAyBxE"}