@simplysm/orm-node 13.0.0-beta.11
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 +418 -0
- package/dist/connections/mssql-db-conn.js +386 -0
- package/dist/connections/mssql-db-conn.js.map +7 -0
- package/dist/connections/mysql-db-conn.js +227 -0
- package/dist/connections/mysql-db-conn.js.map +7 -0
- package/dist/connections/postgresql-db-conn.js +191 -0
- package/dist/connections/postgresql-db-conn.js.map +7 -0
- package/dist/core-common/src/common.types.d.ts +74 -0
- package/dist/core-common/src/common.types.d.ts.map +1 -0
- package/dist/core-common/src/env.d.ts +6 -0
- package/dist/core-common/src/env.d.ts.map +1 -0
- package/dist/core-common/src/errors/argument-error.d.ts +25 -0
- package/dist/core-common/src/errors/argument-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts +29 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/sd-error.d.ts +27 -0
- package/dist/core-common/src/errors/sd-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/timeout-error.d.ts +31 -0
- package/dist/core-common/src/errors/timeout-error.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts +15 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +19 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts +215 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +1 -0
- package/dist/core-common/src/extensions/map-ext.d.ts +57 -0
- package/dist/core-common/src/extensions/map-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/set-ext.d.ts +36 -0
- package/dist/core-common/src/extensions/set-ext.d.ts.map +1 -0
- package/dist/core-common/src/features/debounce-queue.d.ts +53 -0
- package/dist/core-common/src/features/debounce-queue.d.ts.map +1 -0
- package/dist/core-common/src/features/event-emitter.d.ts +66 -0
- package/dist/core-common/src/features/event-emitter.d.ts.map +1 -0
- package/dist/core-common/src/features/serial-queue.d.ts +47 -0
- package/dist/core-common/src/features/serial-queue.d.ts.map +1 -0
- package/dist/core-common/src/index.d.ts +32 -0
- package/dist/core-common/src/index.d.ts.map +1 -0
- package/dist/core-common/src/types/date-only.d.ts +152 -0
- package/dist/core-common/src/types/date-only.d.ts.map +1 -0
- package/dist/core-common/src/types/date-time.d.ts +96 -0
- package/dist/core-common/src/types/date-time.d.ts.map +1 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts +80 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts.map +1 -0
- package/dist/core-common/src/types/time.d.ts +68 -0
- package/dist/core-common/src/types/time.d.ts.map +1 -0
- package/dist/core-common/src/types/uuid.d.ts +35 -0
- package/dist/core-common/src/types/uuid.d.ts.map +1 -0
- package/dist/core-common/src/utils/bytes.d.ts +51 -0
- package/dist/core-common/src/utils/bytes.d.ts.map +1 -0
- package/dist/core-common/src/utils/date-format.d.ts +90 -0
- package/dist/core-common/src/utils/date-format.d.ts.map +1 -0
- package/dist/core-common/src/utils/json.d.ts +34 -0
- package/dist/core-common/src/utils/json.d.ts.map +1 -0
- package/dist/core-common/src/utils/num.d.ts +60 -0
- package/dist/core-common/src/utils/num.d.ts.map +1 -0
- package/dist/core-common/src/utils/obj.d.ts +258 -0
- package/dist/core-common/src/utils/obj.d.ts.map +1 -0
- package/dist/core-common/src/utils/path.d.ts +23 -0
- package/dist/core-common/src/utils/path.d.ts.map +1 -0
- package/dist/core-common/src/utils/primitive.d.ts +18 -0
- package/dist/core-common/src/utils/primitive.d.ts.map +1 -0
- package/dist/core-common/src/utils/str.d.ts +103 -0
- package/dist/core-common/src/utils/str.d.ts.map +1 -0
- package/dist/core-common/src/utils/template-strings.d.ts +84 -0
- package/dist/core-common/src/utils/template-strings.d.ts.map +1 -0
- package/dist/core-common/src/utils/transferable.d.ts +47 -0
- package/dist/core-common/src/utils/transferable.d.ts.map +1 -0
- package/dist/core-common/src/utils/wait.d.ts +19 -0
- package/dist/core-common/src/utils/wait.d.ts.map +1 -0
- package/dist/core-common/src/utils/xml.d.ts +36 -0
- package/dist/core-common/src/utils/xml.d.ts.map +1 -0
- package/dist/core-common/src/zip/sd-zip.d.ts +80 -0
- package/dist/core-common/src/zip/sd-zip.d.ts.map +1 -0
- package/dist/db-conn-factory.js +88 -0
- package/dist/db-conn-factory.js.map +7 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +7 -0
- package/dist/node-db-context-executor.js +129 -0
- package/dist/node-db-context-executor.js.map +7 -0
- package/dist/orm-common/src/db-context.d.ts +669 -0
- package/dist/orm-common/src/db-context.d.ts.map +1 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts +51 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +1 -0
- package/dist/orm-common/src/exec/executable.d.ts +79 -0
- package/dist/orm-common/src/exec/executable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/queryable.d.ts +708 -0
- package/dist/orm-common/src/exec/queryable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/search-parser.d.ts +72 -0
- package/dist/orm-common/src/exec/search-parser.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts +25 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr.d.ts +1369 -0
- package/dist/orm-common/src/expr/expr.d.ts.map +1 -0
- package/dist/orm-common/src/index.d.ts +32 -0
- package/dist/orm-common/src/index.d.ts.map +1 -0
- package/dist/orm-common/src/models/system-migration.d.ts +10 -0
- package/dist/orm-common/src/models/system-migration.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +95 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +66 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +45 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +54 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +52 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts +7 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts +394 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts +151 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts +337 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts +202 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/table-builder.d.ts +259 -0
- package/dist/orm-common/src/schema/table-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/view-builder.d.ts +183 -0
- package/dist/orm-common/src/schema/view-builder.d.ts.map +1 -0
- package/dist/orm-common/src/types/column.d.ts +172 -0
- package/dist/orm-common/src/types/column.d.ts.map +1 -0
- package/dist/orm-common/src/types/db.d.ts +175 -0
- package/dist/orm-common/src/types/db.d.ts.map +1 -0
- package/dist/orm-common/src/types/expr.d.ts +474 -0
- package/dist/orm-common/src/types/expr.d.ts.map +1 -0
- package/dist/orm-common/src/types/query-def.d.ts +351 -0
- package/dist/orm-common/src/types/query-def.d.ts.map +1 -0
- package/dist/orm-common/src/utils/result-parser.d.ts +38 -0
- package/dist/orm-common/src/utils/result-parser.d.ts.map +1 -0
- package/dist/orm-node/src/connections/mssql-db-conn.d.ts +44 -0
- package/dist/orm-node/src/connections/mssql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/connections/mysql-db-conn.d.ts +38 -0
- package/dist/orm-node/src/connections/mysql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/connections/postgresql-db-conn.d.ts +39 -0
- package/dist/orm-node/src/connections/postgresql-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/db-conn-factory.d.ts +25 -0
- package/dist/orm-node/src/db-conn-factory.d.ts.map +1 -0
- package/dist/orm-node/src/index.d.ts +9 -0
- package/dist/orm-node/src/index.d.ts.map +1 -0
- package/dist/orm-node/src/node-db-context-executor.d.ts +77 -0
- package/dist/orm-node/src/node-db-context-executor.d.ts.map +1 -0
- package/dist/orm-node/src/pooled-db-conn.d.ts +79 -0
- package/dist/orm-node/src/pooled-db-conn.d.ts.map +1 -0
- package/dist/orm-node/src/sd-orm.d.ts +78 -0
- package/dist/orm-node/src/sd-orm.d.ts.map +1 -0
- package/dist/orm-node/src/types/db-conn.d.ts +159 -0
- package/dist/orm-node/src/types/db-conn.d.ts.map +1 -0
- package/dist/pooled-db-conn.js +134 -0
- package/dist/pooled-db-conn.js.map +7 -0
- package/dist/sd-orm.js +44 -0
- package/dist/sd-orm.js.map +7 -0
- package/dist/types/db-conn.js +17 -0
- package/dist/types/db-conn.js.map +7 -0
- package/package.json +53 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { type ColumnBuilderRecord, createColumnFactory } from "./factory/column-builder";
|
|
2
|
+
/**
|
|
3
|
+
* 저장 프로시저 정의 빌더
|
|
4
|
+
*
|
|
5
|
+
* Fluent API를 통해 프로시저의 파라미터, 반환 타입, 본문을 정의
|
|
6
|
+
* DbContext의 executable()과 함께 사용하여 타입 안전한 프로시저 호출
|
|
7
|
+
*
|
|
8
|
+
* @template TParams - 파라미터 컬럼 정의 타입
|
|
9
|
+
* @template TReturns - 반환 컬럼 정의 타입
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // 프로시저 정의
|
|
14
|
+
* const GetUserById = Procedure("GetUserById")
|
|
15
|
+
* .database("mydb")
|
|
16
|
+
* .params((c) => ({
|
|
17
|
+
* userId: c.bigint(),
|
|
18
|
+
* }))
|
|
19
|
+
* .returns((c) => ({
|
|
20
|
+
* id: c.bigint(),
|
|
21
|
+
* name: c.varchar(100),
|
|
22
|
+
* email: c.varchar(200),
|
|
23
|
+
* }))
|
|
24
|
+
* .body("SELECT id, name, email FROM User WHERE id = userId");
|
|
25
|
+
*
|
|
26
|
+
* // DbContext에서 사용
|
|
27
|
+
* class MyDb extends DbContext {
|
|
28
|
+
* readonly getUserById = executable(this, GetUserById);
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* // 호출
|
|
32
|
+
* const users = await db.getUserById({ userId: 1n }).result();
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* @see {@link Procedure} 팩토리 함수
|
|
36
|
+
* @see {@link executable} Executable 생성
|
|
37
|
+
*/
|
|
38
|
+
export declare class ProcedureBuilder<TParams extends ColumnBuilderRecord, TReturns extends ColumnBuilderRecord> {
|
|
39
|
+
readonly meta: {
|
|
40
|
+
name: string;
|
|
41
|
+
description?: string;
|
|
42
|
+
database?: string;
|
|
43
|
+
schema?: string;
|
|
44
|
+
params?: TParams;
|
|
45
|
+
returns?: TReturns;
|
|
46
|
+
query?: string;
|
|
47
|
+
};
|
|
48
|
+
/** 파라미터 정의 (타입 추론용) */
|
|
49
|
+
readonly $params: TParams;
|
|
50
|
+
/** 반환 타입 정의 (타입 추론용) */
|
|
51
|
+
readonly $returns: TReturns;
|
|
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(meta: {
|
|
63
|
+
name: string;
|
|
64
|
+
description?: string;
|
|
65
|
+
database?: string;
|
|
66
|
+
schema?: string;
|
|
67
|
+
params?: TParams;
|
|
68
|
+
returns?: TReturns;
|
|
69
|
+
query?: string;
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* 프로시저 설명 설정
|
|
73
|
+
*
|
|
74
|
+
* @param desc - 프로시저 설명 (DDL 주석으로 사용)
|
|
75
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
76
|
+
*/
|
|
77
|
+
description(desc: string): ProcedureBuilder<TParams, TReturns>;
|
|
78
|
+
/**
|
|
79
|
+
* 데이터베이스 이름 설정
|
|
80
|
+
*
|
|
81
|
+
* @param db - 데이터베이스 이름
|
|
82
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const GetUser = Procedure("GetUser").database("mydb");
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
database(db: string): ProcedureBuilder<TParams, TReturns>;
|
|
90
|
+
/**
|
|
91
|
+
* 스키마 이름 설정
|
|
92
|
+
*
|
|
93
|
+
* MSSQL, PostgreSQL에서 사용
|
|
94
|
+
*
|
|
95
|
+
* @param schema - 스키마 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
96
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
97
|
+
*/
|
|
98
|
+
schema(schema: string): ProcedureBuilder<TParams, TReturns>;
|
|
99
|
+
/**
|
|
100
|
+
* 파라미터 정의
|
|
101
|
+
*
|
|
102
|
+
* 프로시저 입력 파라미터 정의
|
|
103
|
+
* DBMS별 파라미터 문법 차이 주의 (MSSQL: @param, MySQL/PostgreSQL: param)
|
|
104
|
+
*
|
|
105
|
+
* @template T - 새 파라미터 정의 타입
|
|
106
|
+
* @param fn - 컬럼 팩토리를 받아 파라미터 정의를 반환하는 함수
|
|
107
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const GetUserById = Procedure("GetUserById")
|
|
112
|
+
* .params((c) => ({
|
|
113
|
+
* userId: c.bigint(),
|
|
114
|
+
* includeDeleted: c.boolean().default(false),
|
|
115
|
+
* }));
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
params<T extends ColumnBuilderRecord>(fn: (c: ReturnType<typeof createColumnFactory>) => T): ProcedureBuilder<T, TReturns>;
|
|
119
|
+
/**
|
|
120
|
+
* 반환 타입 정의
|
|
121
|
+
*
|
|
122
|
+
* 프로시저 반환 결과 컬럼 정의
|
|
123
|
+
*
|
|
124
|
+
* @template T - 새 반환 타입 정의
|
|
125
|
+
* @param fn - 컬럼 팩토리를 받아 반환 컬럼 정의를 반환하는 함수
|
|
126
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const GetUserById = Procedure("GetUserById")
|
|
131
|
+
* .params((c) => ({ userId: c.bigint() }))
|
|
132
|
+
* .returns((c) => ({
|
|
133
|
+
* id: c.bigint(),
|
|
134
|
+
* name: c.varchar(100),
|
|
135
|
+
* email: c.varchar(200).nullable(),
|
|
136
|
+
* }));
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
returns<T extends ColumnBuilderRecord>(fn: (c: ReturnType<typeof createColumnFactory>) => T): ProcedureBuilder<TParams, T>;
|
|
140
|
+
/**
|
|
141
|
+
* 프로시저 본문 SQL 설정
|
|
142
|
+
*
|
|
143
|
+
* DBMS별 SQL 문법 차이 주의:
|
|
144
|
+
* - MySQL: 파라미터명 그대로 (userId)
|
|
145
|
+
* - MSSQL: @ 접두사 (@userId)
|
|
146
|
+
* - PostgreSQL: RETURN QUERY 필요
|
|
147
|
+
*
|
|
148
|
+
* @param sql - 프로시저 본문 SQL
|
|
149
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* // MySQL/PostgreSQL
|
|
154
|
+
* const GetUser = Procedure("GetUser")
|
|
155
|
+
* .params((c) => ({ userId: c.bigint() }))
|
|
156
|
+
* .body("SELECT * FROM User WHERE id = userId");
|
|
157
|
+
*
|
|
158
|
+
* // MSSQL
|
|
159
|
+
* const GetUser = Procedure("GetUser")
|
|
160
|
+
* .params((c) => ({ userId: c.bigint() }))
|
|
161
|
+
* .body("SELECT * FROM [User] WHERE id = @userId");
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
body(sql: string): ProcedureBuilder<TParams, TReturns>;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 프로시저 빌더 생성 팩토리 함수
|
|
168
|
+
*
|
|
169
|
+
* ProcedureBuilder를 생성하여 Fluent API로 저장 프로시저 스키마 정의
|
|
170
|
+
*
|
|
171
|
+
* @param name - 프로시저 이름
|
|
172
|
+
* @returns ProcedureBuilder 인스턴스
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* // 기본 사용
|
|
177
|
+
* const GetUserById = Procedure("GetUserById")
|
|
178
|
+
* .database("mydb")
|
|
179
|
+
* .params((c) => ({
|
|
180
|
+
* userId: c.bigint(),
|
|
181
|
+
* }))
|
|
182
|
+
* .returns((c) => ({
|
|
183
|
+
* id: c.bigint(),
|
|
184
|
+
* name: c.varchar(100),
|
|
185
|
+
* email: c.varchar(200),
|
|
186
|
+
* }))
|
|
187
|
+
* .body("SELECT id, name, email FROM User WHERE id = userId");
|
|
188
|
+
*
|
|
189
|
+
* // 파라미터 없는 프로시저
|
|
190
|
+
* const GetAllActiveUsers = Procedure("GetAllActiveUsers")
|
|
191
|
+
* .database("mydb")
|
|
192
|
+
* .returns((c) => ({
|
|
193
|
+
* id: c.bigint(),
|
|
194
|
+
* name: c.varchar(100),
|
|
195
|
+
* }))
|
|
196
|
+
* .body("SELECT id, name FROM User WHERE status = 'active'");
|
|
197
|
+
* ```
|
|
198
|
+
*
|
|
199
|
+
* @see {@link ProcedureBuilder} 빌더 클래스
|
|
200
|
+
*/
|
|
201
|
+
export declare function Procedure(name: string): ProcedureBuilder<never, never>;
|
|
202
|
+
//# sourceMappingURL=procedure-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"procedure-builder.d.ts","sourceRoot":"","sources":["../../../../../orm-common/src/schema/procedure-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAMzF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,gBAAgB,CAAC,OAAO,SAAS,mBAAmB,EAAE,QAAQ,SAAS,mBAAmB;IAiBnG,QAAQ,CAAC,IAAI,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAxBH,uBAAuB;IACvB,QAAQ,CAAC,OAAO,EAAG,OAAO,CAAC;IAC3B,wBAAwB;IACxB,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAC;IAE7B;;;;;;;;;OASG;gBAEQ,IAAI,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAGH;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAI9D;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAIzD;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;IAI3D;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,CAAC,SAAS,mBAAmB,EAClC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,GACnD,gBAAgB,CAAC,CAAC,EAAE,QAAQ,CAAC;IAIhC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,CAAC,SAAS,mBAAmB,EACnC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,GACnD,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;IAI/B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC;CAGvD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAEtE"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { type ColumnBuilderRecord, createColumnFactory, type InferColumns, type InferInsertColumns, type InferUpdateColumns } from "./factory/column-builder";
|
|
2
|
+
import { createIndexFactory, type IndexBuilder } from "./factory/index-builder";
|
|
3
|
+
import { createRelationFactory, type InferDeepRelations, type RelationBuilderRecord } from "./factory/relation-builder";
|
|
4
|
+
/**
|
|
5
|
+
* 데이터베이스 테이블 정의 빌더
|
|
6
|
+
*
|
|
7
|
+
* Fluent API를 통해 테이블의 컬럼, PK, 인덱스, 관계를 정의
|
|
8
|
+
* DbContext에서 queryable()과 함께 사용하여 타입 안전한 쿼리 작성
|
|
9
|
+
*
|
|
10
|
+
* @template TColumns - 컬럼 정의 레코드 타입
|
|
11
|
+
* @template TRelations - 관계 정의 레코드 타입
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* // 테이블 정의
|
|
16
|
+
* const User = Table("User")
|
|
17
|
+
* .database("mydb")
|
|
18
|
+
* .columns((c) => ({
|
|
19
|
+
* id: c.bigint().autoIncrement(),
|
|
20
|
+
* name: c.varchar(100),
|
|
21
|
+
* email: c.varchar(200).nullable(),
|
|
22
|
+
* status: c.varchar(20).default("active"),
|
|
23
|
+
* }))
|
|
24
|
+
* .primaryKey("id")
|
|
25
|
+
* .indexes((i) => [i.index("email").unique()]);
|
|
26
|
+
*
|
|
27
|
+
* // DbContext에서 사용
|
|
28
|
+
* class MyDb extends DbContext {
|
|
29
|
+
* readonly user = queryable(this, User);
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* @see {@link Table} 팩토리 함수
|
|
34
|
+
* @see {@link queryable} Queryable 생성
|
|
35
|
+
*/
|
|
36
|
+
export declare class TableBuilder<TColumns extends ColumnBuilderRecord, TRelations extends RelationBuilderRecord> {
|
|
37
|
+
readonly meta: {
|
|
38
|
+
name: string;
|
|
39
|
+
description?: string;
|
|
40
|
+
database?: string;
|
|
41
|
+
schema?: string;
|
|
42
|
+
columns?: TColumns;
|
|
43
|
+
primaryKey?: (keyof TColumns & string)[];
|
|
44
|
+
relations?: TRelations;
|
|
45
|
+
indexes?: IndexBuilder<(keyof TColumns & string)[]>[];
|
|
46
|
+
};
|
|
47
|
+
/** 컬럼 정의 (타입 추론용) */
|
|
48
|
+
readonly $columns: TColumns;
|
|
49
|
+
/** 관계 정의 (타입 추론용) */
|
|
50
|
+
readonly $relations: TRelations;
|
|
51
|
+
/** 전체 타입 추론 (컬럼 + 관계) */
|
|
52
|
+
readonly $infer: InferColumns<TColumns> & InferDeepRelations<TRelations>;
|
|
53
|
+
/** 컬럼만 타입 추론 */
|
|
54
|
+
readonly $inferColumns: InferColumns<TColumns>;
|
|
55
|
+
/** INSERT용 타입 추론 (autoIncrement 제외, nullable/default는 optional) */
|
|
56
|
+
readonly $inferInsert: InferInsertColumns<TColumns>;
|
|
57
|
+
/** UPDATE용 타입 추론 (모든 필드 optional) */
|
|
58
|
+
readonly $inferUpdate: InferUpdateColumns<TColumns>;
|
|
59
|
+
/**
|
|
60
|
+
* @param meta - 테이블 메타데이터
|
|
61
|
+
* @param meta.name - 테이블 이름
|
|
62
|
+
* @param meta.description - 테이블 설명 (주석)
|
|
63
|
+
* @param meta.database - 데이터베이스 이름
|
|
64
|
+
* @param meta.schema - 스키마 이름 (MSSQL/PostgreSQL)
|
|
65
|
+
* @param meta.columns - 컬럼 정의
|
|
66
|
+
* @param meta.primaryKey - PK 컬럼 배열
|
|
67
|
+
* @param meta.relations - 관계 정의
|
|
68
|
+
* @param meta.indexes - 인덱스 정의
|
|
69
|
+
*/
|
|
70
|
+
constructor(meta: {
|
|
71
|
+
name: string;
|
|
72
|
+
description?: string;
|
|
73
|
+
database?: string;
|
|
74
|
+
schema?: string;
|
|
75
|
+
columns?: TColumns;
|
|
76
|
+
primaryKey?: (keyof TColumns & string)[];
|
|
77
|
+
relations?: TRelations;
|
|
78
|
+
indexes?: IndexBuilder<(keyof TColumns & string)[]>[];
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* 테이블 설명 설정
|
|
82
|
+
*
|
|
83
|
+
* @param desc - 테이블 설명 (DDL 주석으로 사용)
|
|
84
|
+
* @returns 새 TableBuilder 인스턴스
|
|
85
|
+
*/
|
|
86
|
+
description(desc: string): TableBuilder<TColumns, TRelations>;
|
|
87
|
+
/**
|
|
88
|
+
* 데이터베이스 이름 설정
|
|
89
|
+
*
|
|
90
|
+
* @param db - 데이터베이스 이름
|
|
91
|
+
* @returns 새 TableBuilder 인스턴스
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```typescript
|
|
95
|
+
* const User = Table("User").database("mydb");
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
database(db: string): TableBuilder<TColumns, TRelations>;
|
|
99
|
+
/**
|
|
100
|
+
* 스키마 이름 설정
|
|
101
|
+
*
|
|
102
|
+
* MSSQL, PostgreSQL에서 사용
|
|
103
|
+
*
|
|
104
|
+
* @param schema - 스키마 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
105
|
+
* @returns 새 TableBuilder 인스턴스
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const User = Table("User")
|
|
110
|
+
* .database("mydb")
|
|
111
|
+
* .schema("custom_schema");
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
schema(schema: string): TableBuilder<TColumns, TRelations>;
|
|
115
|
+
/**
|
|
116
|
+
* 컬럼 정의
|
|
117
|
+
*
|
|
118
|
+
* 컬럼 팩토리를 통해 타입 안전한 컬럼 정의
|
|
119
|
+
*
|
|
120
|
+
* @template TNewColumnDefs - 새 컬럼 정의 타입
|
|
121
|
+
* @param fn - 컬럼 팩토리를 받아 컬럼 정의를 반환하는 함수
|
|
122
|
+
* @returns 새 TableBuilder 인스턴스
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const User = Table("User")
|
|
127
|
+
* .columns((c) => ({
|
|
128
|
+
* id: c.bigint().autoIncrement(),
|
|
129
|
+
* name: c.varchar(100),
|
|
130
|
+
* email: c.varchar(200).nullable(),
|
|
131
|
+
* createdAt: c.datetime().default("CURRENT_TIMESTAMP"),
|
|
132
|
+
* }));
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
columns<TNewColumnDefs extends ColumnBuilderRecord>(fn: (c: ReturnType<typeof createColumnFactory>) => TNewColumnDefs): TableBuilder<TNewColumnDefs, TRelations>;
|
|
136
|
+
/**
|
|
137
|
+
* Primary Key 설정
|
|
138
|
+
*
|
|
139
|
+
* @param columns - PK를 구성할 컬럼 이름들 (복합 PK 가능)
|
|
140
|
+
* @returns 새 TableBuilder 인스턴스
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* ```typescript
|
|
144
|
+
* // 단일 PK
|
|
145
|
+
* const User = Table("User")
|
|
146
|
+
* .columns((c) => ({ id: c.bigint() }))
|
|
147
|
+
* .primaryKey("id");
|
|
148
|
+
*
|
|
149
|
+
* // 복합 PK
|
|
150
|
+
* const UserRole = Table("UserRole")
|
|
151
|
+
* .columns((c) => ({
|
|
152
|
+
* userId: c.bigint(),
|
|
153
|
+
* roleId: c.bigint(),
|
|
154
|
+
* }))
|
|
155
|
+
* .primaryKey("userId", "roleId");
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
primaryKey(...columns: (keyof TColumns & string)[]): TableBuilder<TColumns, TRelations>;
|
|
159
|
+
/**
|
|
160
|
+
* 인덱스 정의
|
|
161
|
+
*
|
|
162
|
+
* @param fn - 인덱스 팩토리를 받아 인덱스 배열을 반환하는 함수
|
|
163
|
+
* @returns 새 TableBuilder 인스턴스
|
|
164
|
+
*
|
|
165
|
+
* @example
|
|
166
|
+
* ```typescript
|
|
167
|
+
* const User = Table("User")
|
|
168
|
+
* .columns((c) => ({
|
|
169
|
+
* id: c.bigint(),
|
|
170
|
+
* email: c.varchar(200),
|
|
171
|
+
* name: c.varchar(100),
|
|
172
|
+
* }))
|
|
173
|
+
* .indexes((i) => [
|
|
174
|
+
* i.index("email").unique(),
|
|
175
|
+
* i.index("name").orderBy("ASC"),
|
|
176
|
+
* ]);
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
indexes(fn: (i: ReturnType<typeof createIndexFactory<keyof TColumns & string>>) => IndexBuilder<string[]>[]): TableBuilder<TColumns, TRelations>;
|
|
180
|
+
/**
|
|
181
|
+
* 관계 정의
|
|
182
|
+
*
|
|
183
|
+
* FK, 역참조 등 테이블 간 관계 설정
|
|
184
|
+
*
|
|
185
|
+
* @template T - 관계 정의 타입
|
|
186
|
+
* @param fn - 관계 팩토리를 받아 관계 정의를 반환하는 함수
|
|
187
|
+
* @returns 새 TableBuilder 인스턴스
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```typescript
|
|
191
|
+
* const Post = Table("Post")
|
|
192
|
+
* .columns((c) => ({
|
|
193
|
+
* id: c.bigint().autoIncrement(),
|
|
194
|
+
* authorId: c.bigint(),
|
|
195
|
+
* title: c.varchar(200),
|
|
196
|
+
* }))
|
|
197
|
+
* .primaryKey("id")
|
|
198
|
+
* .relations((r) => ({
|
|
199
|
+
* // FK 관계 (N:1)
|
|
200
|
+
* author: r.foreignKey(["authorId"], () => User),
|
|
201
|
+
* }));
|
|
202
|
+
*
|
|
203
|
+
* const User = Table("User")
|
|
204
|
+
* .columns((c) => ({
|
|
205
|
+
* id: c.bigint().autoIncrement(),
|
|
206
|
+
* name: c.varchar(100),
|
|
207
|
+
* }))
|
|
208
|
+
* .primaryKey("id")
|
|
209
|
+
* .relations((r) => ({
|
|
210
|
+
* // 역참조 (1:N)
|
|
211
|
+
* posts: r.foreignKeyTarget(() => Post, "author"),
|
|
212
|
+
* }));
|
|
213
|
+
* ```
|
|
214
|
+
*
|
|
215
|
+
* @see {@link ForeignKeyBuilder} FK 빌더
|
|
216
|
+
* @see {@link ForeignKeyTargetBuilder} FK 역참조 빌더
|
|
217
|
+
*/
|
|
218
|
+
relations<T extends RelationBuilderRecord>(fn: (r: ReturnType<typeof createRelationFactory<this, keyof TColumns & string>>) => T): TableBuilder<TColumns, T>;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 테이블 빌더 생성 팩토리 함수
|
|
222
|
+
*
|
|
223
|
+
* TableBuilder를 생성하여 Fluent API로 테이블 스키마 정의
|
|
224
|
+
*
|
|
225
|
+
* @param name - 테이블 이름
|
|
226
|
+
* @returns TableBuilder 인스턴스
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```typescript
|
|
230
|
+
* // 기본 사용
|
|
231
|
+
* const User = Table("User")
|
|
232
|
+
* .database("mydb")
|
|
233
|
+
* .columns((c) => ({
|
|
234
|
+
* id: c.bigint().autoIncrement(),
|
|
235
|
+
* name: c.varchar(100),
|
|
236
|
+
* email: c.varchar(200).nullable(),
|
|
237
|
+
* }))
|
|
238
|
+
* .primaryKey("id")
|
|
239
|
+
* .indexes((i) => [i.index("email").unique()]);
|
|
240
|
+
*
|
|
241
|
+
* // 관계 포함
|
|
242
|
+
* const Post = Table("Post")
|
|
243
|
+
* .database("mydb")
|
|
244
|
+
* .columns((c) => ({
|
|
245
|
+
* id: c.bigint().autoIncrement(),
|
|
246
|
+
* authorId: c.bigint(),
|
|
247
|
+
* title: c.varchar(200),
|
|
248
|
+
* content: c.text(),
|
|
249
|
+
* }))
|
|
250
|
+
* .primaryKey("id")
|
|
251
|
+
* .relations((r) => ({
|
|
252
|
+
* author: r.foreignKey(["authorId"], () => User),
|
|
253
|
+
* }));
|
|
254
|
+
* ```
|
|
255
|
+
*
|
|
256
|
+
* @see {@link TableBuilder} 빌더 클래스
|
|
257
|
+
*/
|
|
258
|
+
export declare function Table(name: string): TableBuilder<ColumnBuilderRecord, RelationBuilderRecord>;
|
|
259
|
+
//# sourceMappingURL=table-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-builder.d.ts","sourceRoot":"","sources":["../../../../../orm-common/src/schema/table-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import type { DbContext } from "../db-context";
|
|
2
|
+
import type { Queryable } from "../exec/queryable";
|
|
3
|
+
import type { DataRecord } from "../types/db";
|
|
4
|
+
import { createRelationFactory, type InferDeepRelations, type RelationBuilderRecord } from "./factory/relation-builder";
|
|
5
|
+
/**
|
|
6
|
+
* 데이터베이스 뷰 정의 빌더
|
|
7
|
+
*
|
|
8
|
+
* Fluent API를 통해 뷰의 쿼리, 관계를 정의
|
|
9
|
+
* DbContext에서 queryable()과 함께 사용하여 타입 안전한 쿼리 작성
|
|
10
|
+
*
|
|
11
|
+
* @template TDbContext - DbContext 타입
|
|
12
|
+
* @template TData - 뷰 데이터 레코드 타입
|
|
13
|
+
* @template TRelations - 관계 정의 레코드 타입
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // 뷰 정의
|
|
18
|
+
* const UserSummary = View("UserSummary")
|
|
19
|
+
* .database("mydb")
|
|
20
|
+
* .query((db: MyDb) =>
|
|
21
|
+
* db.user()
|
|
22
|
+
* .select(u => ({
|
|
23
|
+
* id: u.id,
|
|
24
|
+
* name: u.name,
|
|
25
|
+
* postCount: expr.subquery(
|
|
26
|
+
* db.post().where(p => [expr.eq(p.authorId, u.id)]),
|
|
27
|
+
* q => expr.count(q.id)
|
|
28
|
+
* ),
|
|
29
|
+
* }))
|
|
30
|
+
* );
|
|
31
|
+
*
|
|
32
|
+
* // DbContext에서 사용
|
|
33
|
+
* class MyDb extends DbContext {
|
|
34
|
+
* readonly userSummary = queryable(this, UserSummary);
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @see {@link View} 팩토리 함수
|
|
39
|
+
* @see {@link queryable} Queryable 생성
|
|
40
|
+
*/
|
|
41
|
+
export declare class ViewBuilder<TDbContext extends DbContext, TData extends DataRecord, TRelations extends RelationBuilderRecord> {
|
|
42
|
+
readonly meta: {
|
|
43
|
+
name: string;
|
|
44
|
+
description?: string;
|
|
45
|
+
database?: string;
|
|
46
|
+
schema?: string;
|
|
47
|
+
viewFn?: (db: TDbContext) => Queryable<TData, any>;
|
|
48
|
+
relations?: TRelations;
|
|
49
|
+
};
|
|
50
|
+
/** 관계 정의 (타입 추론용) */
|
|
51
|
+
readonly $relations: TRelations;
|
|
52
|
+
/** 전체 타입 추론 */
|
|
53
|
+
readonly $infer: TData;
|
|
54
|
+
/**
|
|
55
|
+
* @param meta - 뷰 메타데이터
|
|
56
|
+
* @param meta.name - 뷰 이름
|
|
57
|
+
* @param meta.description - 뷰 설명 (주석)
|
|
58
|
+
* @param meta.database - 데이터베이스 이름
|
|
59
|
+
* @param meta.schema - 스키마 이름 (MSSQL/PostgreSQL)
|
|
60
|
+
* @param meta.viewFn - 뷰 쿼리 정의 함수
|
|
61
|
+
* @param meta.relations - 관계 정의
|
|
62
|
+
*/
|
|
63
|
+
constructor(meta: {
|
|
64
|
+
name: string;
|
|
65
|
+
description?: string;
|
|
66
|
+
database?: string;
|
|
67
|
+
schema?: string;
|
|
68
|
+
viewFn?: (db: TDbContext) => Queryable<TData, any>;
|
|
69
|
+
relations?: TRelations;
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* 뷰 설명 설정
|
|
73
|
+
*
|
|
74
|
+
* @param desc - 뷰 설명 (DDL 주석으로 사용)
|
|
75
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
76
|
+
*/
|
|
77
|
+
description(desc: string): ViewBuilder<TDbContext, TData, TRelations>;
|
|
78
|
+
/**
|
|
79
|
+
* 데이터베이스 이름 설정
|
|
80
|
+
*
|
|
81
|
+
* @param db - 데이터베이스 이름
|
|
82
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* const UserSummary = View("UserSummary").database("mydb");
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
database(db: string): ViewBuilder<TDbContext, TData, TRelations>;
|
|
90
|
+
/**
|
|
91
|
+
* 스키마 이름 설정
|
|
92
|
+
*
|
|
93
|
+
* MSSQL, PostgreSQL에서 사용
|
|
94
|
+
*
|
|
95
|
+
* @param schema - 스키마 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
96
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
97
|
+
*/
|
|
98
|
+
schema(schema: string): ViewBuilder<TDbContext, TData, TRelations>;
|
|
99
|
+
/**
|
|
100
|
+
* 뷰 쿼리 정의
|
|
101
|
+
*
|
|
102
|
+
* SELECT 쿼리를 통해 뷰의 데이터 소스 정의
|
|
103
|
+
*
|
|
104
|
+
* @template TViewData - 뷰 데이터 타입
|
|
105
|
+
* @template TDb - DbContext 타입
|
|
106
|
+
* @param viewFn - DbContext를 받아 Queryable을 반환하는 함수
|
|
107
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const ActiveUsers = View("ActiveUsers")
|
|
112
|
+
* .database("mydb")
|
|
113
|
+
* .query((db: MyDb) =>
|
|
114
|
+
* db.user()
|
|
115
|
+
* .where(u => [expr.eq(u.status, "active")])
|
|
116
|
+
* .select(u => ({
|
|
117
|
+
* id: u.id,
|
|
118
|
+
* name: u.name,
|
|
119
|
+
* email: u.email,
|
|
120
|
+
* }))
|
|
121
|
+
* );
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
query<TViewData extends DataRecord, TDb extends DbContext>(viewFn: (db: TDb) => Queryable<TViewData, any>): ViewBuilder<TDb, TViewData, TRelations>;
|
|
125
|
+
/**
|
|
126
|
+
* 관계 정의
|
|
127
|
+
*
|
|
128
|
+
* 다른 테이블/뷰와의 관계 설정
|
|
129
|
+
*
|
|
130
|
+
* @template T - 관계 정의 타입
|
|
131
|
+
* @param fn - 관계 팩토리를 받아 관계 정의를 반환하는 함수
|
|
132
|
+
* @returns 새 ViewBuilder 인스턴스
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```typescript
|
|
136
|
+
* const UserSummary = View("UserSummary")
|
|
137
|
+
* .query((db: MyDb) => db.user().select(...))
|
|
138
|
+
* .relations((r) => ({
|
|
139
|
+
* posts: r.foreignKeyTarget(Post, "author"),
|
|
140
|
+
* }));
|
|
141
|
+
* ```
|
|
142
|
+
*
|
|
143
|
+
* @see {@link ForeignKeyBuilder} FK 빌더
|
|
144
|
+
* @see {@link ForeignKeyTargetBuilder} FK 역참조 빌더
|
|
145
|
+
*/
|
|
146
|
+
relations<T extends RelationBuilderRecord>(fn: (r: ReturnType<typeof createRelationFactory<this, keyof TData & string>>) => T): ViewBuilder<TDbContext, TData & InferDeepRelations<T>, TRelations>;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 뷰 빌더 생성 팩토리 함수
|
|
150
|
+
*
|
|
151
|
+
* ViewBuilder를 생성하여 Fluent API로 뷰 스키마 정의
|
|
152
|
+
*
|
|
153
|
+
* @param name - 뷰 이름
|
|
154
|
+
* @returns ViewBuilder 인스턴스
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```typescript
|
|
158
|
+
* // 기본 사용
|
|
159
|
+
* const ActiveUsers = View("ActiveUsers")
|
|
160
|
+
* .database("mydb")
|
|
161
|
+
* .query((db: MyDb) =>
|
|
162
|
+
* db.user()
|
|
163
|
+
* .where(u => [expr.eq(u.status, "active")])
|
|
164
|
+
* .select(u => ({ id: u.id, name: u.name }))
|
|
165
|
+
* );
|
|
166
|
+
*
|
|
167
|
+
* // 집계 뷰
|
|
168
|
+
* const UserStats = View("UserStats")
|
|
169
|
+
* .database("mydb")
|
|
170
|
+
* .query((db: MyDb) =>
|
|
171
|
+
* db.user()
|
|
172
|
+
* .groupBy(u => ({ status: u.status }))
|
|
173
|
+
* .select(u => ({
|
|
174
|
+
* status: u.status,
|
|
175
|
+
* count: expr.count(u.id),
|
|
176
|
+
* }))
|
|
177
|
+
* );
|
|
178
|
+
* ```
|
|
179
|
+
*
|
|
180
|
+
* @see {@link ViewBuilder} 빌더 클래스
|
|
181
|
+
*/
|
|
182
|
+
export declare function View(name: string): ViewBuilder<DbContext, DataRecord, RelationBuilderRecord>;
|
|
183
|
+
//# sourceMappingURL=view-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view-builder.d.ts","sourceRoot":"","sources":["../../../../../orm-common/src/schema/view-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAMxH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,WAAW,CACtB,UAAU,SAAS,SAAS,EAC5B,KAAK,SAAS,UAAU,EACxB,UAAU,SAAS,qBAAqB;IAiBtC,QAAQ,CAAC,IAAI,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACnD,SAAS,CAAC,EAAE,UAAU,CAAC;KACxB;IAtBH,qBAAqB;IACrB,QAAQ,CAAC,UAAU,EAAG,UAAU,CAAC;IACjC,eAAe;IACf,QAAQ,CAAC,MAAM,EAAG,KAAK,CAAC;IAExB;;;;;;;;OAQG;gBAEQ,IAAI,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACnD,SAAS,CAAC,EAAE,UAAU,CAAC;KACxB;IAGH;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC;IAIrE;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC;IAIhE;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC;IAIlE;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,KAAK,CAAC,SAAS,SAAS,UAAU,EAAE,GAAG,SAAS,SAAS,EACvD,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,GAC7C,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC;IAI1C;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CAAC,CAAC,SAAS,qBAAqB,EACvC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,GACjF,WAAW,CAAC,UAAU,EAAE,KAAK,GAAG,kBAAkB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;CAQtE;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,6DAEhC"}
|