@simplysm/orm-common 14.1.2 → 14.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db-context.d.ts +11 -10
- package/dist/db-context.d.ts.map +1 -1
- package/dist/db-context.js +14 -11
- package/dist/db-context.js.map +1 -1
- package/dist/ddl/initialize.js.map +1 -1
- package/dist/ddl/relation-ddl.d.ts +1 -1
- package/dist/ddl/relation-ddl.d.ts.map +1 -1
- package/dist/ddl/relation-ddl.js.map +1 -1
- package/dist/ddl/table-ddl.d.ts +3 -3
- package/dist/ddl/table-ddl.d.ts.map +1 -1
- package/dist/ddl/table-ddl.js.map +1 -1
- package/dist/errors/db-transaction-error.d.ts +4 -5
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/errors/db-transaction-error.js +5 -6
- package/dist/errors/db-transaction-error.js.map +1 -1
- package/dist/exec/executable.d.ts +4 -13
- package/dist/exec/executable.d.ts.map +1 -1
- package/dist/exec/executable.js.map +1 -1
- package/dist/exec/queryable.d.ts +11 -9
- package/dist/exec/queryable.d.ts.map +1 -1
- package/dist/exec/queryable.js +9 -5
- package/dist/exec/queryable.js.map +1 -1
- package/dist/expr/expr.d.ts +7 -4
- package/dist/expr/expr.d.ts.map +1 -1
- package/dist/expr/expr.js +5 -2
- package/dist/expr/expr.js.map +1 -1
- package/dist/models/system-migration.d.ts +1 -1
- package/dist/models/system-migration.d.ts.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts +2 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +2 -2
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +2 -2
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
- package/dist/schema/factory/column-builder.d.ts +1 -1
- package/dist/schema/factory/column-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.d.ts +55 -49
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +12 -15
- package/dist/schema/factory/relation-builder.js.map +1 -1
- package/dist/schema/table-builder.d.ts +35 -18
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +32 -15
- package/dist/schema/table-builder.js.map +1 -1
- package/dist/schema/view-builder.d.ts +28 -24
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +18 -14
- package/dist/schema/view-builder.js.map +1 -1
- package/dist/types/column.d.ts +6 -17
- package/dist/types/column.d.ts.map +1 -1
- package/dist/types/column.js +3 -19
- package/dist/types/column.js.map +1 -1
- package/dist/types/db-context-def.d.ts +7 -7
- package/dist/types/db-context-def.d.ts.map +1 -1
- package/dist/types/query-def.d.ts +1 -1
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/utils/result-parser.d.ts.map +1 -1
- package/dist/utils/result-parser.js +3 -7
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +3 -3
- package/src/db-context.ts +23 -20
- package/src/ddl/initialize.ts +4 -4
- package/src/ddl/relation-ddl.ts +1 -1
- package/src/ddl/table-ddl.ts +3 -3
- package/src/errors/db-transaction-error.ts +6 -4
- package/src/exec/executable.ts +5 -4
- package/src/exec/queryable.ts +31 -24
- package/src/expr/expr.ts +10 -4
- package/src/query-builder/base/expr-renderer-base.ts +2 -1
- package/src/query-builder/mssql/mssql-expr-renderer.ts +5 -5
- package/src/query-builder/mysql/mysql-expr-renderer.ts +2 -2
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +5 -5
- package/src/query-builder/postgresql/postgresql-query-builder.ts +4 -3
- package/src/schema/factory/column-builder.ts +3 -3
- package/src/schema/factory/relation-builder.ts +350 -346
- package/src/schema/table-builder.ts +209 -193
- package/src/schema/view-builder.ts +148 -143
- package/src/types/column.ts +7 -26
- package/src/types/db-context-def.ts +7 -7
- package/src/types/query-def.ts +1 -1
- package/src/utils/result-parser.ts +11 -19
|
@@ -10,28 +10,29 @@ import type { ViewBuilder } from "../view-builder";
|
|
|
10
10
|
* description 설정은 factory 함수의 opts 파라미터로 전달한다.
|
|
11
11
|
* 메서드 체이닝(.description())은 TypeScript 순환 참조 시 TS7022를 유발하므로 제거됨.
|
|
12
12
|
*
|
|
13
|
-
* @template
|
|
14
|
-
*
|
|
13
|
+
* @template TTargetFn - 대상 Table builder factory 타입 (무제약)
|
|
14
|
+
*
|
|
15
|
+
* 대상 타겟을 잡는 제네릭은 **무제약**(`extends () => TableBuilder<...>` 제약 없음)이다.
|
|
16
|
+
* 제약이 있으면 모델 const 형성 중 `() => typeof X` 타겟 화살표를 eager 평가하여
|
|
17
|
+
* TS6 에서 순환 const(TS7022/7024)를 유발하기 때문이다. 대상 해소는 `$inferSelect`
|
|
18
|
+
* 접근 시점에 lazy 하게(`ExtractRelationTarget`) 이루어진다.
|
|
15
19
|
*
|
|
16
20
|
* @see {@link ForeignKeyTargetBuilder} 역참조 builder
|
|
17
21
|
* @see {@link RelationKeyBuilder} DB FK 없는 관계
|
|
18
22
|
*/
|
|
19
|
-
export declare class ForeignKeyBuilder<
|
|
23
|
+
export declare class ForeignKeyBuilder<TTargetFn> {
|
|
20
24
|
readonly meta: {
|
|
21
|
-
ownerFn: () => TOwner;
|
|
22
25
|
columns: string[];
|
|
23
26
|
targetFn: TTargetFn;
|
|
24
27
|
description?: string;
|
|
25
28
|
};
|
|
26
29
|
/**
|
|
27
30
|
* @param meta - FK 메타데이터
|
|
28
|
-
* @param meta.ownerFn - 소유 Table factory
|
|
29
31
|
* @param meta.columns - FK column 이름 배열
|
|
30
32
|
* @param meta.targetFn - 대상 Table factory
|
|
31
33
|
* @param meta.description - 관계 설명
|
|
32
34
|
*/
|
|
33
35
|
constructor(meta: {
|
|
34
|
-
ownerFn: () => TOwner;
|
|
35
36
|
columns: string[];
|
|
36
37
|
targetFn: TTargetFn;
|
|
37
38
|
description?: string;
|
|
@@ -46,12 +47,12 @@ export declare class ForeignKeyBuilder<TOwner extends TableBuilder<any, any, any
|
|
|
46
47
|
* description, single 설정은 factory 함수의 opts 파라미터로 전달한다.
|
|
47
48
|
* 메서드 체이닝(.description(), .single())은 TypeScript 순환 참조 시 TS7022를 유발하므로 제거됨.
|
|
48
49
|
*
|
|
49
|
-
* @template TTargetTableFn - 참조하는 Table builder factory 타입
|
|
50
|
+
* @template TTargetTableFn - 참조하는 Table builder factory 타입 (무제약)
|
|
50
51
|
* @template TIsSingle - 단일 객체 여부
|
|
51
52
|
*
|
|
52
53
|
* @see {@link ForeignKeyBuilder} FK builder
|
|
53
54
|
*/
|
|
54
|
-
export declare class ForeignKeyTargetBuilder<TTargetTableFn
|
|
55
|
+
export declare class ForeignKeyTargetBuilder<TTargetTableFn, TIsSingle> {
|
|
55
56
|
readonly meta: {
|
|
56
57
|
targetTableFn: TTargetTableFn;
|
|
57
58
|
relationName: string;
|
|
@@ -80,27 +81,23 @@ export declare class ForeignKeyTargetBuilder<TTargetTableFn extends () => TableB
|
|
|
80
81
|
*
|
|
81
82
|
* description 설정은 factory 함수의 opts 파라미터로 전달한다.
|
|
82
83
|
*
|
|
83
|
-
* @template
|
|
84
|
-
* @template TTargetFn - 대상 Table/View builder factory 타입
|
|
84
|
+
* @template TTargetFn - 대상 Table/View builder factory 타입 (무제약)
|
|
85
85
|
*
|
|
86
86
|
* @see {@link ForeignKeyBuilder} DB FK 생성 버전
|
|
87
87
|
*/
|
|
88
|
-
export declare class RelationKeyBuilder<
|
|
88
|
+
export declare class RelationKeyBuilder<TTargetFn> {
|
|
89
89
|
readonly meta: {
|
|
90
|
-
ownerFn: () => TOwner;
|
|
91
90
|
columns: string[];
|
|
92
91
|
targetFn: TTargetFn;
|
|
93
92
|
description?: string;
|
|
94
93
|
};
|
|
95
94
|
/**
|
|
96
95
|
* @param meta - 관계 메타데이터
|
|
97
|
-
* @param meta.ownerFn - 소유 Table/View factory
|
|
98
96
|
* @param meta.columns - 관계 column 이름 배열
|
|
99
97
|
* @param meta.targetFn - 대상 Table/View factory
|
|
100
98
|
* @param meta.description - 관계 설명
|
|
101
99
|
*/
|
|
102
100
|
constructor(meta: {
|
|
103
|
-
ownerFn: () => TOwner;
|
|
104
101
|
columns: string[];
|
|
105
102
|
targetFn: TTargetFn;
|
|
106
103
|
description?: string;
|
|
@@ -114,12 +111,12 @@ export declare class RelationKeyBuilder<TOwner extends TableBuilder<any, any, an
|
|
|
114
111
|
*
|
|
115
112
|
* description, single 설정은 factory 함수의 opts 파라미터로 전달한다.
|
|
116
113
|
*
|
|
117
|
-
* @template TTargetTableFn - 참조하는 Table/View builder factory 타입
|
|
114
|
+
* @template TTargetTableFn - 참조하는 Table/View builder factory 타입 (무제약)
|
|
118
115
|
* @template TIsSingle - 단일 객체 여부
|
|
119
116
|
*
|
|
120
117
|
* @see {@link ForeignKeyTargetBuilder} DB FK 생성 버전
|
|
121
118
|
*/
|
|
122
|
-
export declare class RelationKeyTargetBuilder<TTargetTableFn
|
|
119
|
+
export declare class RelationKeyTargetBuilder<TTargetTableFn, TIsSingle> {
|
|
123
120
|
readonly meta: {
|
|
124
121
|
targetTableFn: TTargetTableFn;
|
|
125
122
|
relationName: string;
|
|
@@ -143,20 +140,22 @@ export declare class RelationKeyTargetBuilder<TTargetTableFn extends () => Table
|
|
|
143
140
|
/**
|
|
144
141
|
* FK 관계 factory 타입 (table 전용)
|
|
145
142
|
*
|
|
146
|
-
*
|
|
143
|
+
* 컬럼 키 제약(`TColumnKey extends string`)은 self-contained 하므로 **유지**한다.
|
|
144
|
+
* 대상 타겟을 잡는 제네릭(`TTargetFn`/`TTargetTableFn`)은 **무제약**이다.
|
|
145
|
+
*
|
|
147
146
|
* @template TColumnKey - Column key 타입
|
|
148
147
|
*/
|
|
149
|
-
type RelationFkFactory<
|
|
148
|
+
export type RelationFkFactory<TColumnKey extends string> = {
|
|
150
149
|
/** N:1 FK 관계 정의 (DB FK 생성) */
|
|
151
|
-
foreignKey<TTargetFn
|
|
150
|
+
foreignKey<TTargetFn>(columns: TColumnKey[], targetFn: TTargetFn, opts?: {
|
|
152
151
|
description?: string;
|
|
153
|
-
}): ForeignKeyBuilder<
|
|
152
|
+
}): ForeignKeyBuilder<TTargetFn>;
|
|
154
153
|
/** 1:N FK 역참조 정의 (single: true → 단일 객체) */
|
|
155
|
-
foreignKeyTarget<TTargetTableFn
|
|
154
|
+
foreignKeyTarget<TTargetTableFn>(targetTableFn: TTargetTableFn, relationName: string, opts: {
|
|
156
155
|
single: true;
|
|
157
156
|
description?: string;
|
|
158
157
|
}): ForeignKeyTargetBuilder<TTargetTableFn, true>;
|
|
159
|
-
foreignKeyTarget<TTargetTableFn
|
|
158
|
+
foreignKeyTarget<TTargetTableFn>(targetTableFn: TTargetTableFn, relationName: string, opts?: {
|
|
160
159
|
single?: false;
|
|
161
160
|
description?: string;
|
|
162
161
|
}): ForeignKeyTargetBuilder<TTargetTableFn, false>;
|
|
@@ -164,68 +163,75 @@ type RelationFkFactory<TOwner extends TableBuilder<any, any, any>, TColumnKey ex
|
|
|
164
163
|
/**
|
|
165
164
|
* 논리적 관계 factory 타입 (table/View 공용)
|
|
166
165
|
*
|
|
167
|
-
* @template TOwner - 소유 Table/View builder 타입
|
|
168
166
|
* @template TColumnKey - Column key 타입
|
|
169
167
|
*/
|
|
170
|
-
type RelationRkFactory<
|
|
168
|
+
export type RelationRkFactory<TColumnKey extends string> = {
|
|
171
169
|
/** N:1 논리적 관계 정의 (DB FK 미생성) */
|
|
172
|
-
relationKey<TTargetFn
|
|
170
|
+
relationKey<TTargetFn>(columns: TColumnKey[], targetFn: TTargetFn, opts?: {
|
|
173
171
|
description?: string;
|
|
174
|
-
}): RelationKeyBuilder<
|
|
172
|
+
}): RelationKeyBuilder<TTargetFn>;
|
|
175
173
|
/** 1:N 논리적 역참조 정의 (single: true → 단일 객체) */
|
|
176
|
-
relationKeyTarget<TTargetTableFn
|
|
174
|
+
relationKeyTarget<TTargetTableFn>(targetTableFn: TTargetTableFn, relationName: string, opts: {
|
|
177
175
|
single: true;
|
|
178
176
|
description?: string;
|
|
179
177
|
}): RelationKeyTargetBuilder<TTargetTableFn, true>;
|
|
180
|
-
relationKeyTarget<TTargetTableFn
|
|
178
|
+
relationKeyTarget<TTargetTableFn>(targetTableFn: TTargetTableFn, relationName: string, opts?: {
|
|
181
179
|
single?: false;
|
|
182
180
|
description?: string;
|
|
183
181
|
}): RelationKeyTargetBuilder<TTargetTableFn, false>;
|
|
184
182
|
};
|
|
183
|
+
/**
|
|
184
|
+
* Table용 관계 factory (FK + RelationKey 모두 사용 가능)
|
|
185
|
+
*/
|
|
186
|
+
export type TableRelationFactory<TColumnKey extends string> = RelationFkFactory<TColumnKey> & RelationRkFactory<TColumnKey>;
|
|
187
|
+
/**
|
|
188
|
+
* View용 관계 factory (RelationKey만 사용 가능)
|
|
189
|
+
*/
|
|
190
|
+
export type ViewRelationFactory<TColumnKey extends string> = RelationRkFactory<TColumnKey>;
|
|
185
191
|
/**
|
|
186
192
|
* 관계 builder factory 생성
|
|
187
193
|
*
|
|
188
|
-
* TableBuilder.relations()
|
|
189
|
-
* Table은 FK + RelationKey 모두 사용 가능, View는 RelationKey만 사용
|
|
194
|
+
* `TableBuilder.relations(fn)` / `ViewBuilder.relations(fn)` 의 콜백 인자로 전달된다.
|
|
195
|
+
* Table은 FK + RelationKey 모두 사용 가능, View는 RelationKey만 사용 가능.
|
|
190
196
|
*
|
|
191
|
-
* @template TOwner - 소유 Table/View builder 타입
|
|
192
197
|
* @template TColumnKey - Column key 타입
|
|
193
|
-
* @param ownerFn - 소유 Table/View factory 함수
|
|
194
198
|
* @returns 관계 builder factory
|
|
195
199
|
*/
|
|
196
|
-
export declare function createRelationFactory<
|
|
200
|
+
export declare function createRelationFactory<TColumnKey extends string = string>(): TableRelationFactory<TColumnKey>;
|
|
197
201
|
/**
|
|
198
202
|
* 관계 builder 레코드 타입
|
|
199
203
|
*
|
|
200
|
-
* TableBuilder.relations()
|
|
204
|
+
* `TableBuilder.relations(fn)` / `ViewBuilder.relations(fn)` 콜백의 반환 타입.
|
|
201
205
|
*/
|
|
202
|
-
export type RelationBuilderRecord = Record<string, ForeignKeyBuilder<any
|
|
206
|
+
export type RelationBuilderRecord = Record<string, ForeignKeyBuilder<any> | ForeignKeyTargetBuilder<any, any> | RelationKeyBuilder<any> | RelationKeyTargetBuilder<any, any>>;
|
|
203
207
|
/**
|
|
204
|
-
* FK/RelationKey에서 대상 타입 추출 (단일
|
|
208
|
+
* FK/RelationKey에서 대상 타입 추출 (단일 객체, N:1)
|
|
205
209
|
*
|
|
206
|
-
*
|
|
210
|
+
* 대상이 Table이면 컬럼 + 심층 관계, View면 데이터 + 심층 관계를 반환한다.
|
|
207
211
|
*
|
|
208
|
-
* @template
|
|
212
|
+
* @template TRelation - FK 또는 RelationKey builder 타입
|
|
213
|
+
* @template TVisited - 순환 방지를 위한 방문 테이블/뷰명 집합
|
|
209
214
|
*/
|
|
210
|
-
export type ExtractRelationTarget<TRelation, TVisited extends string = never> = TRelation extends ForeignKeyBuilder<
|
|
215
|
+
export type ExtractRelationTarget<TRelation, TVisited extends string = never> = TRelation extends ForeignKeyBuilder<infer TTargetFn> | RelationKeyBuilder<infer TTargetFn> ? TTargetFn extends () => infer TTarget ? TTarget extends TableBuilder<infer TName, infer TCols, infer TRels> ? TName extends TVisited ? InferColumns<TCols> : InferColumns<TCols> & InferDeepRelations<TRels, TVisited | TName> : TTarget extends ViewBuilder<any, infer TVName, infer TData, infer TVRels> ? TVName extends TVisited ? TData : TData & InferDeepRelations<TVRels, TVisited | TVName> : never : never : never;
|
|
211
216
|
/**
|
|
212
|
-
* FKTarget/RelationKeyTarget에서 대상 타입 추출 (배열 또는 단일
|
|
217
|
+
* FKTarget/RelationKeyTarget에서 대상 타입 추출 (배열 또는 단일 객체, 1:N)
|
|
213
218
|
*
|
|
214
|
-
*
|
|
215
|
-
* TTargetTableFn: 순환 참조 방지를 위한 지연 평가용 () => Post 형태
|
|
219
|
+
* opts.single: true 시 단일 객체, 아니면 배열.
|
|
216
220
|
*
|
|
217
|
-
* @template
|
|
221
|
+
* @template TRelation - FKTarget 또는 RelationKeyTarget builder 타입
|
|
222
|
+
* @template TVisited - 순환 방지를 위한 방문 테이블/뷰명 집합
|
|
218
223
|
*/
|
|
219
|
-
export type ExtractRelationTargetResult<TRelation, TVisited extends string = never> = TRelation extends ForeignKeyTargetBuilder<infer TTargetTableFn, infer TIsSingle> | RelationKeyTargetBuilder<infer TTargetTableFn, infer TIsSingle> ?
|
|
224
|
+
export type ExtractRelationTargetResult<TRelation, TVisited extends string = never> = TRelation extends ForeignKeyTargetBuilder<infer TTargetTableFn, infer TIsSingle> | RelationKeyTargetBuilder<infer TTargetTableFn, infer TIsSingle> ? TTargetTableFn extends () => infer TTarget ? TTarget extends TableBuilder<infer TName, infer TCols, infer TRels> ? TName extends TVisited ? TIsSingle extends true ? InferColumns<TCols> : InferColumns<TCols>[] : TIsSingle extends true ? InferColumns<TCols> & InferDeepRelations<TRels, TVisited | TName> : (InferColumns<TCols> & InferDeepRelations<TRels, TVisited | TName>)[] : TTarget extends ViewBuilder<any, infer TVName, infer TData, infer TVRels> ? TVName extends TVisited ? TIsSingle extends true ? TData : TData[] : TIsSingle extends true ? TData & InferDeepRelations<TVRels, TVisited | TVName> : (TData & InferDeepRelations<TVRels, TVisited | TVName>)[] : never : never : never;
|
|
220
225
|
/**
|
|
221
|
-
* 관계
|
|
226
|
+
* 관계 레코드에서 심층 관계 타입 추론
|
|
222
227
|
*
|
|
223
|
-
* include() 없이 접근 시 undefined가 되도록 모든 관계를 optional로
|
|
228
|
+
* include() 없이 접근 시 undefined가 되도록 모든 관계를 optional로 설정.
|
|
229
|
+
* 입력 제약 없음(무제약) — 관계가 없는(`{}`) 테이블도 안전하게 빈 객체로 해소된다.
|
|
224
230
|
*
|
|
225
|
-
* @template TRelations - 관계 builder 레코드 타입
|
|
231
|
+
* @template TRelations - 관계 builder 레코드 타입 (무제약)
|
|
232
|
+
* @template TVisited - 순환 방지를 위한 방문 테이블/뷰명 집합
|
|
226
233
|
*/
|
|
227
|
-
export type InferDeepRelations<TRelations
|
|
234
|
+
export type InferDeepRelations<TRelations, TVisited extends string = never> = {
|
|
228
235
|
[K in keyof TRelations]?: ExtractRelationTarget<TRelations[K], TVisited> | ExtractRelationTargetResult<TRelations[K], TVisited>;
|
|
229
236
|
};
|
|
230
|
-
export {};
|
|
231
237
|
//# sourceMappingURL=relation-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relation-builder.d.ts","sourceRoot":"","sources":["../../../src/schema/factory/relation-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMnD
|
|
1
|
+
{"version":3,"file":"relation-builder.d.ts","sourceRoot":"","sources":["../../../src/schema/factory/relation-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,12 @@ import {} from "./column-builder.js";
|
|
|
11
11
|
* description 설정은 factory 함수의 opts 파라미터로 전달한다.
|
|
12
12
|
* 메서드 체이닝(.description())은 TypeScript 순환 참조 시 TS7022를 유발하므로 제거됨.
|
|
13
13
|
*
|
|
14
|
-
* @template
|
|
15
|
-
*
|
|
14
|
+
* @template TTargetFn - 대상 Table builder factory 타입 (무제약)
|
|
15
|
+
*
|
|
16
|
+
* 대상 타겟을 잡는 제네릭은 **무제약**(`extends () => TableBuilder<...>` 제약 없음)이다.
|
|
17
|
+
* 제약이 있으면 모델 const 형성 중 `() => typeof X` 타겟 화살표를 eager 평가하여
|
|
18
|
+
* TS6 에서 순환 const(TS7022/7024)를 유발하기 때문이다. 대상 해소는 `$inferSelect`
|
|
19
|
+
* 접근 시점에 lazy 하게(`ExtractRelationTarget`) 이루어진다.
|
|
16
20
|
*
|
|
17
21
|
* @see {@link ForeignKeyTargetBuilder} 역참조 builder
|
|
18
22
|
* @see {@link RelationKeyBuilder} DB FK 없는 관계
|
|
@@ -21,7 +25,6 @@ export class ForeignKeyBuilder {
|
|
|
21
25
|
meta;
|
|
22
26
|
/**
|
|
23
27
|
* @param meta - FK 메타데이터
|
|
24
|
-
* @param meta.ownerFn - 소유 Table factory
|
|
25
28
|
* @param meta.columns - FK column 이름 배열
|
|
26
29
|
* @param meta.targetFn - 대상 Table factory
|
|
27
30
|
* @param meta.description - 관계 설명
|
|
@@ -39,7 +42,7 @@ export class ForeignKeyBuilder {
|
|
|
39
42
|
* description, single 설정은 factory 함수의 opts 파라미터로 전달한다.
|
|
40
43
|
* 메서드 체이닝(.description(), .single())은 TypeScript 순환 참조 시 TS7022를 유발하므로 제거됨.
|
|
41
44
|
*
|
|
42
|
-
* @template TTargetTableFn - 참조하는 Table builder factory 타입
|
|
45
|
+
* @template TTargetTableFn - 참조하는 Table builder factory 타입 (무제약)
|
|
43
46
|
* @template TIsSingle - 단일 객체 여부
|
|
44
47
|
*
|
|
45
48
|
* @see {@link ForeignKeyBuilder} FK builder
|
|
@@ -68,8 +71,7 @@ export class ForeignKeyTargetBuilder {
|
|
|
68
71
|
*
|
|
69
72
|
* description 설정은 factory 함수의 opts 파라미터로 전달한다.
|
|
70
73
|
*
|
|
71
|
-
* @template
|
|
72
|
-
* @template TTargetFn - 대상 Table/View builder factory 타입
|
|
74
|
+
* @template TTargetFn - 대상 Table/View builder factory 타입 (무제약)
|
|
73
75
|
*
|
|
74
76
|
* @see {@link ForeignKeyBuilder} DB FK 생성 버전
|
|
75
77
|
*/
|
|
@@ -77,7 +79,6 @@ export class RelationKeyBuilder {
|
|
|
77
79
|
meta;
|
|
78
80
|
/**
|
|
79
81
|
* @param meta - 관계 메타데이터
|
|
80
|
-
* @param meta.ownerFn - 소유 Table/View factory
|
|
81
82
|
* @param meta.columns - 관계 column 이름 배열
|
|
82
83
|
* @param meta.targetFn - 대상 Table/View factory
|
|
83
84
|
* @param meta.description - 관계 설명
|
|
@@ -94,7 +95,7 @@ export class RelationKeyBuilder {
|
|
|
94
95
|
*
|
|
95
96
|
* description, single 설정은 factory 함수의 opts 파라미터로 전달한다.
|
|
96
97
|
*
|
|
97
|
-
* @template TTargetTableFn - 참조하는 Table/View builder factory 타입
|
|
98
|
+
* @template TTargetTableFn - 참조하는 Table/View builder factory 타입 (무제약)
|
|
98
99
|
* @template TIsSingle - 단일 객체 여부
|
|
99
100
|
*
|
|
100
101
|
* @see {@link ForeignKeyTargetBuilder} DB FK 생성 버전
|
|
@@ -115,19 +116,16 @@ export class RelationKeyTargetBuilder {
|
|
|
115
116
|
/**
|
|
116
117
|
* 관계 builder factory 생성
|
|
117
118
|
*
|
|
118
|
-
* TableBuilder.relations()
|
|
119
|
-
* Table은 FK + RelationKey 모두 사용 가능, View는 RelationKey만 사용
|
|
119
|
+
* `TableBuilder.relations(fn)` / `ViewBuilder.relations(fn)` 의 콜백 인자로 전달된다.
|
|
120
|
+
* Table은 FK + RelationKey 모두 사용 가능, View는 RelationKey만 사용 가능.
|
|
120
121
|
*
|
|
121
|
-
* @template TOwner - 소유 Table/View builder 타입
|
|
122
122
|
* @template TColumnKey - Column key 타입
|
|
123
|
-
* @param ownerFn - 소유 Table/View factory 함수
|
|
124
123
|
* @returns 관계 builder factory
|
|
125
124
|
*/
|
|
126
|
-
export function createRelationFactory(
|
|
125
|
+
export function createRelationFactory() {
|
|
127
126
|
return {
|
|
128
127
|
foreignKey(columns, targetFn, opts) {
|
|
129
128
|
return new ForeignKeyBuilder({
|
|
130
|
-
ownerFn: ownerFn,
|
|
131
129
|
columns,
|
|
132
130
|
targetFn,
|
|
133
131
|
description: opts?.description,
|
|
@@ -143,7 +141,6 @@ export function createRelationFactory(ownerFn) {
|
|
|
143
141
|
},
|
|
144
142
|
relationKey(columns, targetFn, opts) {
|
|
145
143
|
return new RelationKeyBuilder({
|
|
146
|
-
ownerFn: ownerFn,
|
|
147
144
|
columns,
|
|
148
145
|
targetFn,
|
|
149
146
|
description: opts?.description,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relation-builder.js","sourceRoot":"","sources":["../../../src/schema/factory/relation-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,MAAM,kBAAkB,CAAC;AAIrD,+CAA+C;AAC/C,oBAAoB;AACpB,+CAA+C;AAE/C
|
|
1
|
+
{"version":3,"file":"relation-builder.js","sourceRoot":"","sources":["../../../src/schema/factory/relation-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,MAAM,kBAAkB,CAAC;AAIrD,+CAA+C;AAC/C,oBAAoB;AACpB,+CAA+C;AAE/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,iBAAiB;IAQjB;IAPX;;;;;OAKG;IACH,YACW,IAIR;QAJQ,SAAI,GAAJ,IAAI,CAIZ;IACA,CAAC;CACL;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,uBAAuB;IASvB;IARX;;;;;;OAMG;IACH,YACW,IAKR;QALQ,SAAI,GAAJ,IAAI,CAKZ;IACA,CAAC;CACL;AAED,+CAA+C;AAC/C,iDAAiD;AACjD,+CAA+C;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,kBAAkB;IAQlB;IAPX;;;;;OAKG;IACH,YACW,IAIR;QAJQ,SAAI,GAAJ,IAAI,CAIZ;IACA,CAAC;CACL;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,wBAAwB;IASxB;IARX;;;;;;OAMG;IACH,YACW,IAKR;QALQ,SAAI,GAAJ,IAAI,CAKZ;IACA,CAAC;CACL;AAsED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAK;YACjC,OAAO,IAAI,iBAAiB,CAAC;gBAC3B,OAAO;gBACP,QAAQ;gBACR,WAAW,EAAE,IAAI,EAAE,WAAW;aAC/B,CAAC,CAAC;QACL,CAAC;QACD,gBAAgB,CAAC,aAAa,EAAE,YAAY,EAAE,IAAK;YACjD,OAAO,IAAI,uBAAuB,CAAC;gBACjC,aAAa;gBACb,YAAY;gBACZ,WAAW,EAAE,IAAI,EAAE,WAAW;gBAC9B,QAAQ,EAAE,IAAI,EAAE,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;QACD,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAK;YAClC,OAAO,IAAI,kBAAkB,CAAC;gBAC5B,OAAO;gBACP,QAAQ;gBACR,WAAW,EAAE,IAAI,EAAE,WAAW;aAC/B,CAAC,CAAC;QACL,CAAC;QACD,iBAAiB,CAAC,aAAa,EAAE,YAAY,EAAE,IAAK;YAClD,OAAO,IAAI,wBAAwB,CAAC;gBAClC,aAAa;gBACb,YAAY;gBACZ,WAAW,EAAE,IAAI,EAAE,WAAW;gBAC9B,QAAQ,EAAE,IAAI,EAAE,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;KACkC,CAAC;AACxC,CAAC"}
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
import { type ColumnBuilderRecord, createColumnFactory, type InferColumns, type InferInsertColumns, type InferUpdateColumns } from "./factory/column-builder";
|
|
2
2
|
import { createIndexFactory, type IndexBuilder } from "./factory/index-builder";
|
|
3
|
-
import {
|
|
3
|
+
import { type InferDeepRelations, type TableRelationFactory } from "./factory/relation-builder";
|
|
4
4
|
/**
|
|
5
5
|
* Database Table 정의 builder
|
|
6
6
|
*
|
|
7
7
|
* Fluent API로 Table column, PK, index, 관계를 정의
|
|
8
8
|
* DbContext의 queryable()과 함께 사용하여 타입 안전한 query 구성
|
|
9
9
|
*
|
|
10
|
+
* 관계는 `.relations((r) => ({ ... }))` 메서드 체이닝으로 정의한다.
|
|
11
|
+
* 관계를 잡는 3번째 제네릭 `TRelations` 는 **무제약**이라, `() => typeof X` 타겟
|
|
12
|
+
* 화살표가 const 형성 중 eager 평가되지 않는다(TS6 순환 회피). 관계 대상 해소는
|
|
13
|
+
* `$inferSelect` 접근 시점에 lazy 하게 이루어진다.
|
|
14
|
+
*
|
|
15
|
+
* @template TName - Table 이름
|
|
10
16
|
* @template TColumns - Column 정의 레코드 타입
|
|
11
|
-
* @template TRelations - 관계 정의 레코드 타입
|
|
17
|
+
* @template TRelations - 관계 정의 레코드 타입 (무제약, 기본값 `{}`)
|
|
12
18
|
*
|
|
13
19
|
* @see {@link Table} factory 함수
|
|
14
20
|
* @see {@link queryable} Queryable 생성
|
|
15
21
|
*/
|
|
16
|
-
export declare class TableBuilder<TName extends string, TColumns extends ColumnBuilderRecord, TRelations
|
|
22
|
+
export declare class TableBuilder<TName extends string, TColumns extends ColumnBuilderRecord, TRelations = {}> {
|
|
17
23
|
readonly meta: {
|
|
18
24
|
name: TName;
|
|
19
25
|
description?: string;
|
|
@@ -24,11 +30,12 @@ export declare class TableBuilder<TName extends string, TColumns extends ColumnB
|
|
|
24
30
|
relations?: TRelations;
|
|
25
31
|
indexes?: IndexBuilder<(keyof TColumns & string)[]>[];
|
|
26
32
|
};
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
/**
|
|
34
|
+
* 전체 타입 추론 (column + 관계).
|
|
35
|
+
*
|
|
36
|
+
* 관계는 `TRelations` 를 구조적으로 lazy walk 하여 다단계로 해소된다.
|
|
37
|
+
* (순환 감지: 같은 테이블 재방문 시 컬럼만 반환하여 끊김)
|
|
38
|
+
*/
|
|
32
39
|
readonly $inferSelect: InferColumns<TColumns> & InferDeepRelations<TRelations>;
|
|
33
40
|
/** Column 전용 타입 추론 */
|
|
34
41
|
readonly $inferColumns: InferColumns<TColumns>;
|
|
@@ -44,7 +51,7 @@ export declare class TableBuilder<TName extends string, TColumns extends ColumnB
|
|
|
44
51
|
* @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
|
|
45
52
|
* @param meta.columns - Column 정의
|
|
46
53
|
* @param meta.primaryKey - PK column 배열
|
|
47
|
-
* @param meta.relations - 관계 정의
|
|
54
|
+
* @param meta.relations - 관계 정의 (런타임: `.relations(fn)` 호출 시 부착됨)
|
|
48
55
|
* @param meta.indexes - Index 정의
|
|
49
56
|
*/
|
|
50
57
|
constructor(meta: {
|
|
@@ -105,18 +112,28 @@ export declare class TableBuilder<TName extends string, TColumns extends ColumnB
|
|
|
105
112
|
*/
|
|
106
113
|
indexes(fn: (i: ReturnType<typeof createIndexFactory<keyof TColumns & string>>) => IndexBuilder<string[]>[]): TableBuilder<TName, TColumns, TRelations>;
|
|
107
114
|
/**
|
|
108
|
-
* 관계 정의
|
|
115
|
+
* 관계 정의 (FK / FKTarget / RelationKey / RelationKeyTarget)
|
|
109
116
|
*
|
|
110
|
-
*
|
|
117
|
+
* 관계 타입 `T` 는 **무제약**으로 추론되며, 내부적으로 런타임 결과를
|
|
118
|
+
* `meta.relations` 에 저장한다(`as any`). 무제약이므로 콜백 안의 `() => typeof X`
|
|
119
|
+
* 타겟 화살표가 const 형성 중 eager 평가되지 않아 TS6 순환을 회피한다.
|
|
111
120
|
*
|
|
112
|
-
* @
|
|
113
|
-
*
|
|
114
|
-
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* export const User = Table("User")
|
|
124
|
+
* .columns((c) => ({ id: c.bigint().autoIncrement(), companyId: c.bigint().nullable() }))
|
|
125
|
+
* .primaryKey("id")
|
|
126
|
+
* .relations((r) => ({
|
|
127
|
+
* company: r.foreignKey(["companyId"], () => Company),
|
|
128
|
+
* posts: r.foreignKeyTarget(() => Post, "user"),
|
|
129
|
+
* }));
|
|
130
|
+
* ```
|
|
115
131
|
*
|
|
116
|
-
* @
|
|
117
|
-
* @
|
|
132
|
+
* @template T - 관계 정의 레코드 타입 (무제약)
|
|
133
|
+
* @param fn - 관계 factory를 받아 관계 정의를 반환하는 함수
|
|
134
|
+
* @returns 관계가 부착된 새 TableBuilder 인스턴스
|
|
118
135
|
*/
|
|
119
|
-
relations<T
|
|
136
|
+
relations<T>(fn: (r: TableRelationFactory<keyof TColumns & string>) => T): TableBuilder<TName, TColumns, T>;
|
|
120
137
|
}
|
|
121
138
|
/**
|
|
122
139
|
* Table builder factory 함수
|
|
@@ -128,5 +145,5 @@ export declare class TableBuilder<TName extends string, TColumns extends ColumnB
|
|
|
128
145
|
*
|
|
129
146
|
* @see {@link TableBuilder} builder 클래스
|
|
130
147
|
*/
|
|
131
|
-
export declare function Table<TName extends string>(name: TName): TableBuilder<TName, ColumnBuilderRecord,
|
|
148
|
+
export declare function Table<TName extends string>(name: TName): TableBuilder<TName, ColumnBuilderRecord, {}>;
|
|
132
149
|
//# sourceMappingURL=table-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-builder.d.ts","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,
|
|
1
|
+
{"version":3,"file":"table-builder.d.ts","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,19 +10,26 @@ import { createRelationFactory, } from "./factory/relation-builder.js";
|
|
|
10
10
|
* Fluent API로 Table column, PK, index, 관계를 정의
|
|
11
11
|
* DbContext의 queryable()과 함께 사용하여 타입 안전한 query 구성
|
|
12
12
|
*
|
|
13
|
+
* 관계는 `.relations((r) => ({ ... }))` 메서드 체이닝으로 정의한다.
|
|
14
|
+
* 관계를 잡는 3번째 제네릭 `TRelations` 는 **무제약**이라, `() => typeof X` 타겟
|
|
15
|
+
* 화살표가 const 형성 중 eager 평가되지 않는다(TS6 순환 회피). 관계 대상 해소는
|
|
16
|
+
* `$inferSelect` 접근 시점에 lazy 하게 이루어진다.
|
|
17
|
+
*
|
|
18
|
+
* @template TName - Table 이름
|
|
13
19
|
* @template TColumns - Column 정의 레코드 타입
|
|
14
|
-
* @template TRelations - 관계 정의 레코드 타입
|
|
20
|
+
* @template TRelations - 관계 정의 레코드 타입 (무제약, 기본값 `{}`)
|
|
15
21
|
*
|
|
16
22
|
* @see {@link Table} factory 함수
|
|
17
23
|
* @see {@link queryable} Queryable 생성
|
|
18
24
|
*/
|
|
19
25
|
export class TableBuilder {
|
|
20
26
|
meta;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
/**
|
|
28
|
+
* 전체 타입 추론 (column + 관계).
|
|
29
|
+
*
|
|
30
|
+
* 관계는 `TRelations` 를 구조적으로 lazy walk 하여 다단계로 해소된다.
|
|
31
|
+
* (순환 감지: 같은 테이블 재방문 시 컬럼만 반환하여 끊김)
|
|
32
|
+
*/
|
|
26
33
|
$inferSelect;
|
|
27
34
|
/** Column 전용 타입 추론 */
|
|
28
35
|
$inferColumns;
|
|
@@ -38,7 +45,7 @@ export class TableBuilder {
|
|
|
38
45
|
* @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
|
|
39
46
|
* @param meta.columns - Column 정의
|
|
40
47
|
* @param meta.primaryKey - PK column 배열
|
|
41
|
-
* @param meta.relations - 관계 정의
|
|
48
|
+
* @param meta.relations - 관계 정의 (런타임: `.relations(fn)` 호출 시 부착됨)
|
|
42
49
|
* @param meta.indexes - Index 정의
|
|
43
50
|
*/
|
|
44
51
|
constructor(meta) {
|
|
@@ -113,21 +120,31 @@ export class TableBuilder {
|
|
|
113
120
|
});
|
|
114
121
|
}
|
|
115
122
|
/**
|
|
116
|
-
* 관계 정의
|
|
123
|
+
* 관계 정의 (FK / FKTarget / RelationKey / RelationKeyTarget)
|
|
117
124
|
*
|
|
118
|
-
*
|
|
125
|
+
* 관계 타입 `T` 는 **무제약**으로 추론되며, 내부적으로 런타임 결과를
|
|
126
|
+
* `meta.relations` 에 저장한다(`as any`). 무제약이므로 콜백 안의 `() => typeof X`
|
|
127
|
+
* 타겟 화살표가 const 형성 중 eager 평가되지 않아 TS6 순환을 회피한다.
|
|
119
128
|
*
|
|
120
|
-
* @
|
|
121
|
-
*
|
|
122
|
-
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```ts
|
|
131
|
+
* export const User = Table("User")
|
|
132
|
+
* .columns((c) => ({ id: c.bigint().autoIncrement(), companyId: c.bigint().nullable() }))
|
|
133
|
+
* .primaryKey("id")
|
|
134
|
+
* .relations((r) => ({
|
|
135
|
+
* company: r.foreignKey(["companyId"], () => Company),
|
|
136
|
+
* posts: r.foreignKeyTarget(() => Post, "user"),
|
|
137
|
+
* }));
|
|
138
|
+
* ```
|
|
123
139
|
*
|
|
124
|
-
* @
|
|
125
|
-
* @
|
|
140
|
+
* @template T - 관계 정의 레코드 타입 (무제약)
|
|
141
|
+
* @param fn - 관계 factory를 받아 관계 정의를 반환하는 함수
|
|
142
|
+
* @returns 관계가 부착된 새 TableBuilder 인스턴스
|
|
126
143
|
*/
|
|
127
144
|
relations(fn) {
|
|
128
145
|
return new TableBuilder({
|
|
129
146
|
...this.meta,
|
|
130
|
-
relations: fn(createRelationFactory(
|
|
147
|
+
relations: fn(createRelationFactory()),
|
|
131
148
|
});
|
|
132
149
|
}
|
|
133
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-builder.js","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,GAIpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAqB,MAAM,yBAAyB,CAAC;AAChF,OAAO,EACL,qBAAqB,GAGtB,MAAM,4BAA4B,CAAC;AAEpC,+CAA+C;AAC/C,eAAe;AACf,+CAA+C;AAE/C
|
|
1
|
+
{"version":3,"file":"table-builder.js","sourceRoot":"","sources":["../../src/schema/table-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,GAIpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAqB,MAAM,yBAAyB,CAAC;AAChF,OAAO,EACL,qBAAqB,GAGtB,MAAM,4BAA4B,CAAC;AAEpC,+CAA+C;AAC/C,eAAe;AACf,+CAA+C;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,YAAY;IA+BZ;IA1BX;;;;;OAKG;IACM,YAAY,CAA2D;IAChF,sBAAsB;IACb,aAAa,CAA0B;IAChD,kEAAkE;IACzD,YAAY,CAAgC;IACrD,oCAAoC;IAC3B,YAAY,CAAgC;IAErD;;;;;;;;;;OAUG;IACH,YACW,IAUR;QAVQ,SAAI,GAAJ,IAAI,CAUZ;IACA,CAAC;IAEJ;;;;;OAKG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,EAAU;QACjB,OAAO,IAAI,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,MAAc;QACnB,OAAO,IAAI,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;;;OAQG;IACH,OAAO,CACL,EAAiE;QAEjE,OAAO,IAAI,YAAY,CAAoC;YACzD,GAAG,IAAI,CAAC,IAAI;YACZ,OAAO,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,GAAG,OAAoC;QAChD,OAAO,IAAI,YAAY,CAAC;YACtB,GAAG,IAAI,CAAC,IAAI;YACZ,UAAU,EAAE,OAAO;SACpB,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,OAAO,CACL,EAE6B;QAE7B,OAAO,IAAI,YAAY,CAAC;YACtB,GAAG,IAAI,CAAC,IAAI;YACZ,OAAO,EAAE,EAAE,CAAC,kBAAkB,EAA2B,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,SAAS,CACP,EAA2D;QAE3D,OAAO,IAAI,YAAY,CAAC;YACtB,GAAG,IAAI,CAAC,IAAI;YACZ,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAA2B,CAAQ;SACvE,CAAC,CAAC;IACL,CAAC;CACF;AAED,+CAA+C;AAC/C,WAAW;AACX,+CAA+C;AAE/C;;;;;;;;;GASG;AACH,MAAM,UAAU,KAAK,CAAuB,IAAW;IACrD,OAAO,IAAI,YAAY,CAAiC,EAAE,IAAI,EAAE,CAAC,CAAC;AACpE,CAAC"}
|