@elsikora/nestjs-crud-automator 1.5.2 → 1.5.4
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 +66 -47
- package/dist/enum/exception.enum.d.ts +1 -2
- package/dist/enum/exception.enum.js +2 -2
- package/dist/enum/exception.enum.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/utility/is-error-of-type.utility.d.ts +1 -1
- package/dist/utility/is-error-of-type.utility.js +30 -33
- package/dist/utility/is-error-of-type.utility.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# API Controller Configuration Documentation
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
|
+
|
|
4
5
|
The API Controller configuration is a TypeScript-based configuration system that provides a comprehensive way to define API endpoints with authentication, request/response handling, validation, and data transformation capabilities.
|
|
5
6
|
|
|
6
7
|
## Table of Contents
|
|
8
|
+
|
|
7
9
|
- [Basic Configuration Structure](#basic-configuration-structure)
|
|
8
10
|
- [Route Configuration](#route-configuration)
|
|
9
11
|
- [Authentication](#authentication)
|
|
@@ -20,16 +22,17 @@ The base configuration object follows this interface:
|
|
|
20
22
|
|
|
21
23
|
```typescript
|
|
22
24
|
interface IApiControllerProperties<E> {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
entity: IApiBaseEntity;
|
|
26
|
+
name?: string;
|
|
27
|
+
path?: string;
|
|
28
|
+
routes: {
|
|
29
|
+
[R in EApiRouteType]?: TApiControllerPropertiesRoute<E, R>;
|
|
30
|
+
};
|
|
29
31
|
}
|
|
30
32
|
```
|
|
31
33
|
|
|
32
34
|
### Properties:
|
|
35
|
+
|
|
33
36
|
- `entity`: The base entity class for the controller
|
|
34
37
|
- `name`: Optional name for the controller
|
|
35
38
|
- `path`: Optional URL path for the controller
|
|
@@ -38,6 +41,7 @@ interface IApiControllerProperties<E> {
|
|
|
38
41
|
## Route Configuration
|
|
39
42
|
|
|
40
43
|
Routes are defined using the `EApiRouteType` enum, which includes:
|
|
44
|
+
|
|
41
45
|
- CREATE
|
|
42
46
|
- GET
|
|
43
47
|
- GET_LIST
|
|
@@ -46,6 +50,7 @@ Routes are defined using the `EApiRouteType` enum, which includes:
|
|
|
46
50
|
- DELETE
|
|
47
51
|
|
|
48
52
|
Each route can be configured with:
|
|
53
|
+
|
|
49
54
|
- Authentication settings
|
|
50
55
|
- Request handling
|
|
51
56
|
- Response handling
|
|
@@ -53,6 +58,7 @@ Each route can be configured with:
|
|
|
53
58
|
- Validation rules
|
|
54
59
|
|
|
55
60
|
Example:
|
|
61
|
+
|
|
56
62
|
```typescript
|
|
57
63
|
{
|
|
58
64
|
[EApiRouteType.CREATE]: {
|
|
@@ -66,6 +72,7 @@ Example:
|
|
|
66
72
|
## Authentication
|
|
67
73
|
|
|
68
74
|
Authentication configuration allows you to specify:
|
|
75
|
+
|
|
69
76
|
- Bearer token strategies
|
|
70
77
|
- Security strategies
|
|
71
78
|
- Authentication guards
|
|
@@ -73,14 +80,15 @@ Authentication configuration allows you to specify:
|
|
|
73
80
|
|
|
74
81
|
```typescript
|
|
75
82
|
interface IApiControllerPropertiesRouteAuthentication {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
83
|
+
bearerStrategies?: Array<string>;
|
|
84
|
+
guard: Type<IAuthGuard>;
|
|
85
|
+
securityStrategies?: Array<string>;
|
|
86
|
+
type: EApiAuthenticationType;
|
|
80
87
|
}
|
|
81
88
|
```
|
|
82
89
|
|
|
83
90
|
Example:
|
|
91
|
+
|
|
84
92
|
```typescript
|
|
85
93
|
authentication: {
|
|
86
94
|
bearerStrategies: ["accountAuthorization"],
|
|
@@ -93,21 +101,23 @@ authentication: {
|
|
|
93
101
|
## Request Handling
|
|
94
102
|
|
|
95
103
|
Request configuration includes:
|
|
104
|
+
|
|
96
105
|
- Relations loading
|
|
97
106
|
- Data transformation
|
|
98
107
|
- Request validation
|
|
99
108
|
|
|
100
109
|
```typescript
|
|
101
110
|
interface IApiControllerPropertiesRouteBaseRequest<E, R> {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
111
|
+
relations?: TApiControllerPropertiesRouteBaseRequestRelations<E>;
|
|
112
|
+
transformers?: TApiControllerPropertiesRouteBaseRequestTransformers<E, R>;
|
|
113
|
+
validators?: Array<IApiRequestValidator<E>>;
|
|
105
114
|
}
|
|
106
115
|
```
|
|
107
116
|
|
|
108
117
|
### Relations Loading Strategies
|
|
109
118
|
|
|
110
119
|
Two strategies are available:
|
|
120
|
+
|
|
111
121
|
1. **AUTO**: Automatically loads relations
|
|
112
122
|
2. **MANUAL**: Manually specify relations to load
|
|
113
123
|
|
|
@@ -126,17 +136,19 @@ relations: {
|
|
|
126
136
|
## Response Handling
|
|
127
137
|
|
|
128
138
|
Response configuration allows you to:
|
|
139
|
+
|
|
129
140
|
- Specify relations to include
|
|
130
141
|
- Transform response data
|
|
131
142
|
|
|
132
143
|
```typescript
|
|
133
144
|
interface IApiControllerPropertiesRouteBaseResponse<E, R> {
|
|
134
|
-
|
|
135
|
-
|
|
145
|
+
relations?: FindOptionsRelations<E>;
|
|
146
|
+
transformers?: TApiControllerPropertiesRouteBaseResponseTransformers<E, R>;
|
|
136
147
|
}
|
|
137
148
|
```
|
|
138
149
|
|
|
139
150
|
Example:
|
|
151
|
+
|
|
140
152
|
```typescript
|
|
141
153
|
response: {
|
|
142
154
|
relations: {
|
|
@@ -158,55 +170,58 @@ response: {
|
|
|
158
170
|
## Data Transformation
|
|
159
171
|
|
|
160
172
|
Transformers can be configured for different DTO types:
|
|
173
|
+
|
|
161
174
|
- BODY
|
|
162
175
|
- QUERY
|
|
163
176
|
- REQUEST
|
|
164
177
|
- RESPONSE
|
|
165
178
|
|
|
166
179
|
Two types of transformers are available:
|
|
180
|
+
|
|
167
181
|
1. **DYNAMIC**: Uses predefined constants
|
|
168
182
|
2. **STATIC**: Uses static values
|
|
169
183
|
|
|
170
184
|
```typescript
|
|
171
185
|
type TApiRequestTransformer<E> = {
|
|
172
|
-
|
|
186
|
+
key: keyof IApiGetListResponseResult<E> | keyof Partial<E> | keyof TApiFunctionGetListProperties<E>;
|
|
173
187
|
} & (
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
188
|
+
| {
|
|
189
|
+
type: EApiControllerRequestTransformerType.DYNAMIC;
|
|
190
|
+
value: (typeof TRANSFORMER_VALUE_DTO_CONSTANT)[keyof typeof TRANSFORMER_VALUE_DTO_CONSTANT];
|
|
191
|
+
}
|
|
192
|
+
| {
|
|
193
|
+
type: EApiControllerRequestTransformerType.STATIC;
|
|
194
|
+
value: string;
|
|
195
|
+
}
|
|
182
196
|
);
|
|
183
197
|
```
|
|
184
198
|
|
|
185
199
|
## Validation
|
|
186
200
|
|
|
187
201
|
Validators can be configured for requests with:
|
|
202
|
+
|
|
188
203
|
- Error type
|
|
189
204
|
- Exception class
|
|
190
205
|
- Validation function
|
|
191
206
|
|
|
192
207
|
```typescript
|
|
193
208
|
interface IApiRequestValidator<E> {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
209
|
+
errorType: EErrorStringAction;
|
|
210
|
+
exception: TApiException;
|
|
211
|
+
validationFunction: (entity: DeepPartial<E> | Partial<E> | TApiFunctionGetListProperties<E>) => boolean | Promise<boolean>;
|
|
197
212
|
}
|
|
198
213
|
```
|
|
199
214
|
|
|
200
215
|
Example:
|
|
216
|
+
|
|
201
217
|
```typescript
|
|
202
218
|
validators: [
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
]
|
|
219
|
+
{
|
|
220
|
+
errorType: EErrorStringAction.ADDRESS_NOT_MATCH_PATTERN,
|
|
221
|
+
exception: BadRequestException,
|
|
222
|
+
validationFunction: (account: Partial<Account>): boolean => (account.id?.includes("7") ? account.id.includes("AAAA") : true),
|
|
223
|
+
},
|
|
224
|
+
];
|
|
210
225
|
```
|
|
211
226
|
|
|
212
227
|
## Auto DTO Configuration
|
|
@@ -220,6 +235,7 @@ autoDto?: {
|
|
|
220
235
|
```
|
|
221
236
|
|
|
222
237
|
Example:
|
|
238
|
+
|
|
223
239
|
```typescript
|
|
224
240
|
autoDto: {
|
|
225
241
|
[EApiDtoType.REQUEST]: {
|
|
@@ -268,7 +284,7 @@ Here's a complete example of a route configuration:
|
|
|
268
284
|
{
|
|
269
285
|
errorType: EErrorStringAction.ADDRESS_NOT_MATCH_PATTERN,
|
|
270
286
|
exception: BadRequestException,
|
|
271
|
-
validationFunction: (account: Partial<Account>): boolean =>
|
|
287
|
+
validationFunction: (account: Partial<Account>): boolean =>
|
|
272
288
|
(account.id?.includes("7") ? account.id.includes("AAAA") : true)
|
|
273
289
|
}
|
|
274
290
|
]
|
|
@@ -294,24 +310,27 @@ Here's a complete example of a route configuration:
|
|
|
294
310
|
## Best Practices
|
|
295
311
|
|
|
296
312
|
1. **Authentication**
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
313
|
+
|
|
314
|
+
- Always specify appropriate bearer and security strategies
|
|
315
|
+
- Use proper guards for route protection
|
|
316
|
+
- Choose the correct authentication type
|
|
300
317
|
|
|
301
318
|
2. **Relations**
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
319
|
+
|
|
320
|
+
- Use MANUAL strategy when you need precise control over relation loading
|
|
321
|
+
- Use AUTO strategy for simpler cases
|
|
322
|
+
- Always specify required services when using MANUAL strategy
|
|
305
323
|
|
|
306
324
|
3. **Validation**
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
325
|
+
|
|
326
|
+
- Implement comprehensive validation rules
|
|
327
|
+
- Use appropriate error types and exceptions
|
|
328
|
+
- Consider both sync and async validation functions
|
|
310
329
|
|
|
311
330
|
4. **Transformation**
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
331
|
+
- Use DYNAMIC transformers for runtime values
|
|
332
|
+
- Use STATIC transformers for constant values
|
|
333
|
+
- Consider the DTO type when applying transformations
|
|
315
334
|
|
|
316
335
|
## Notes
|
|
317
336
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare enum EException {
|
|
1
|
+
export declare enum EException {
|
|
2
2
|
NOT_FOUND = "NOT_FOUND",
|
|
3
3
|
UNAUTHORIZED = "UNAUTHORIZED",
|
|
4
4
|
FORBIDDEN = "FORBIDDEN",
|
|
@@ -28,4 +28,3 @@ declare enum EException {
|
|
|
28
28
|
HTTP_VERSION_NOT_SUPPORTED = "HTTP_VERSION_NOT_SUPPORTED",
|
|
29
29
|
NETWORK_AUTHENTICATION_REQUIRED = "NETWORK_AUTHENTICATION_REQUIRED"
|
|
30
30
|
}
|
|
31
|
-
export default EException;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EException = void 0;
|
|
3
4
|
var EException;
|
|
4
5
|
(function (EException) {
|
|
5
6
|
EException["NOT_FOUND"] = "NOT_FOUND";
|
|
@@ -30,6 +31,5 @@ var EException;
|
|
|
30
31
|
EException["IM_A_TEAPOT"] = "IM_A_TEAPOT";
|
|
31
32
|
EException["HTTP_VERSION_NOT_SUPPORTED"] = "HTTP_VERSION_NOT_SUPPORTED";
|
|
32
33
|
EException["NETWORK_AUTHENTICATION_REQUIRED"] = "NETWORK_AUTHENTICATION_REQUIRED";
|
|
33
|
-
})(EException || (EException = {}));
|
|
34
|
-
exports.default = EException;
|
|
34
|
+
})(EException || (exports.EException = EException = {}));
|
|
35
35
|
//# sourceMappingURL=exception.enum.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exception.enum.js","sourceRoot":"","sources":["../../src/enum/exception.enum.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"exception.enum.js","sourceRoot":"","sources":["../../src/enum/exception.enum.ts"],"names":[],"mappings":";;;AAAA,IAAY,UA6BX;AA7BD,WAAY,UAAU;IACrB,qCAAuB,CAAA;IACvB,2CAA6B,CAAA;IAC7B,qCAAuB,CAAA;IACvB,yCAA2B,CAAA;IAC3B,mCAAqB,CAAA;IACrB,6DAA+C,CAAA;IAC/C,yDAA2C,CAAA;IAC3C,iDAAmC,CAAA;IACnC,qDAAuC,CAAA;IACvC,qDAAuC,CAAA;IACvC,iDAAmC,CAAA;IACnC,+CAAiC,CAAA;IACjC,2CAA6B,CAAA;IAC7B,iDAAmC,CAAA;IACnC,yDAA2C,CAAA;IAC3C,iFAAmE,CAAA;IACnE,iDAAmC,CAAA;IACnC,2DAA6C,CAAA;IAC7C,+DAAiD,CAAA;IACjD,mDAAqC,CAAA;IACrC,2DAA6C,CAAA;IAC7C,mDAAqC,CAAA;IACrC,uDAAyC,CAAA;IACzC,2BAAa,CAAA;IACb,uDAAyC,CAAA;IACzC,yCAA2B,CAAA;IAC3B,uEAAyD,CAAA;IACzD,iFAAmE,CAAA;AACpE,CAAC,EA7BW,UAAU,0BAAV,UAAU,QA6BrB"}
|
package/dist/package.json
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import EException from "../enum
|
|
1
|
+
import { EException } from "../enum";
|
|
2
2
|
export declare function IsErrorOfType(error: unknown, type: EException): boolean;
|
|
@@ -1,48 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.IsErrorOfType = IsErrorOfType;
|
|
7
4
|
const common_1 = require("@nestjs/common");
|
|
8
5
|
const throttler_1 = require("@nestjs/throttler");
|
|
9
|
-
const
|
|
6
|
+
const enum_1 = require("../enum");
|
|
10
7
|
const ExceptionMap = {
|
|
11
|
-
[
|
|
12
|
-
[
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
[
|
|
17
|
-
[
|
|
18
|
-
[
|
|
19
|
-
[
|
|
20
|
-
[
|
|
21
|
-
[
|
|
22
|
-
[
|
|
23
|
-
[
|
|
24
|
-
[
|
|
25
|
-
[
|
|
26
|
-
[
|
|
27
|
-
[
|
|
28
|
-
[
|
|
29
|
-
[
|
|
30
|
-
[
|
|
31
|
-
[
|
|
32
|
-
[
|
|
33
|
-
[
|
|
34
|
-
[
|
|
35
|
-
[
|
|
36
|
-
[
|
|
37
|
-
[
|
|
38
|
-
[
|
|
8
|
+
[enum_1.EException.NOT_FOUND]: common_1.NotFoundException,
|
|
9
|
+
[enum_1.EException.UNAUTHORIZED]: common_1.UnauthorizedException,
|
|
10
|
+
[enum_1.EException.FORBIDDEN]: common_1.ForbiddenException,
|
|
11
|
+
[enum_1.EException.BAD_REQUEST]: common_1.BadRequestException,
|
|
12
|
+
[enum_1.EException.CONFLICT]: common_1.ConflictException,
|
|
13
|
+
[enum_1.EException.INTERNAL_SERVER_ERROR]: common_1.InternalServerErrorException,
|
|
14
|
+
[enum_1.EException.SERVICE_UNAVAILABLE]: common_1.ServiceUnavailableException,
|
|
15
|
+
[enum_1.EException.GATEWAY_TIMEOUT]: common_1.GatewayTimeoutException,
|
|
16
|
+
[enum_1.EException.PAYLOAD_TOO_LARGE]: common_1.PayloadTooLargeException,
|
|
17
|
+
[enum_1.EException.TOO_MANY_REQUESTS]: throttler_1.ThrottlerException,
|
|
18
|
+
[enum_1.EException.NOT_IMPLEMENTED]: common_1.NotImplementedException,
|
|
19
|
+
[enum_1.EException.NOT_ACCEPTABLE]: common_1.NotAcceptableException,
|
|
20
|
+
[enum_1.EException.NOT_EXTENDED]: undefined,
|
|
21
|
+
[enum_1.EException.LENGTH_REQUIRED]: undefined,
|
|
22
|
+
[enum_1.EException.PRECONDITION_FAILED]: common_1.PreconditionFailedException,
|
|
23
|
+
[enum_1.EException.REQUEST_HEADER_FIELDS_TOO_LARGE]: undefined,
|
|
24
|
+
[enum_1.EException.REQUEST_TIMEOUT]: common_1.RequestTimeoutException,
|
|
25
|
+
[enum_1.EException.REQUEST_URI_TOO_LONG]: undefined,
|
|
26
|
+
[enum_1.EException.UNSUPPORTED_MEDIA_TYPE]: common_1.UnsupportedMediaTypeException,
|
|
27
|
+
[enum_1.EException.UPGRADE_REQUIRED]: undefined,
|
|
28
|
+
[enum_1.EException.UNPROCESSABLE_ENTITY]: common_1.UnprocessableEntityException,
|
|
29
|
+
[enum_1.EException.PAYMENT_REQUIRED]: undefined,
|
|
30
|
+
[enum_1.EException.METHOD_NOT_ALLOWED]: common_1.MethodNotAllowedException,
|
|
31
|
+
[enum_1.EException.GONE]: common_1.GoneException,
|
|
32
|
+
[enum_1.EException.EXPECTATION_FAILED]: undefined,
|
|
33
|
+
[enum_1.EException.IM_A_TEAPOT]: common_1.ImATeapotException,
|
|
34
|
+
[enum_1.EException.HTTP_VERSION_NOT_SUPPORTED]: common_1.HttpVersionNotSupportedException,
|
|
35
|
+
[enum_1.EException.NETWORK_AUTHENTICATION_REQUIRED]: undefined,
|
|
39
36
|
};
|
|
40
37
|
function IsErrorOfType(error, type) {
|
|
41
38
|
const ExceptionClass = ExceptionMap[type];
|
|
42
39
|
if (!ExceptionClass) {
|
|
43
40
|
return false;
|
|
44
41
|
}
|
|
45
|
-
if (!error || typeof error !==
|
|
42
|
+
if (!error || typeof error !== "object") {
|
|
46
43
|
return false;
|
|
47
44
|
}
|
|
48
45
|
if (error instanceof ExceptionClass) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-error-of-type.utility.js","sourceRoot":"","sources":["../../src/utility/is-error-of-type.utility.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"is-error-of-type.utility.js","sourceRoot":"","sources":["../../src/utility/is-error-of-type.utility.ts"],"names":[],"mappings":";;AA0DA,sCAqBC;AA7ED,2CAoBwB;AAExB,iDAAuD;AACvD,kCAAmC;AAEnC,MAAM,YAAY,GAA4B;IAC7C,CAAC,iBAAU,CAAC,SAAS,CAAC,EAAE,0BAAiB;IACzC,CAAC,iBAAU,CAAC,YAAY,CAAC,EAAE,8BAAqB;IAChD,CAAC,iBAAU,CAAC,SAAS,CAAC,EAAE,2BAAkB;IAC1C,CAAC,iBAAU,CAAC,WAAW,CAAC,EAAE,4BAAmB;IAC7C,CAAC,iBAAU,CAAC,QAAQ,CAAC,EAAE,0BAAiB;IACxC,CAAC,iBAAU,CAAC,qBAAqB,CAAC,EAAE,qCAA4B;IAChE,CAAC,iBAAU,CAAC,mBAAmB,CAAC,EAAE,oCAA2B;IAC7D,CAAC,iBAAU,CAAC,eAAe,CAAC,EAAE,gCAAuB;IACrD,CAAC,iBAAU,CAAC,iBAAiB,CAAC,EAAE,iCAAwB;IACxD,CAAC,iBAAU,CAAC,iBAAiB,CAAC,EAAE,8BAAkB;IAClD,CAAC,iBAAU,CAAC,eAAe,CAAC,EAAE,gCAAuB;IACrD,CAAC,iBAAU,CAAC,cAAc,CAAC,EAAE,+BAAsB;IACnD,CAAC,iBAAU,CAAC,YAAY,CAAC,EAAE,SAAS;IACpC,CAAC,iBAAU,CAAC,eAAe,CAAC,EAAE,SAAS;IACvC,CAAC,iBAAU,CAAC,mBAAmB,CAAC,EAAE,oCAA2B;IAC7D,CAAC,iBAAU,CAAC,+BAA+B,CAAC,EAAE,SAAS;IACvD,CAAC,iBAAU,CAAC,eAAe,CAAC,EAAE,gCAAuB;IACrD,CAAC,iBAAU,CAAC,oBAAoB,CAAC,EAAE,SAAS;IAC5C,CAAC,iBAAU,CAAC,sBAAsB,CAAC,EAAE,sCAA6B;IAClE,CAAC,iBAAU,CAAC,gBAAgB,CAAC,EAAE,SAAS;IACxC,CAAC,iBAAU,CAAC,oBAAoB,CAAC,EAAE,qCAA4B;IAC/D,CAAC,iBAAU,CAAC,gBAAgB,CAAC,EAAE,SAAS;IACxC,CAAC,iBAAU,CAAC,kBAAkB,CAAC,EAAE,kCAAyB;IAC1D,CAAC,iBAAU,CAAC,IAAI,CAAC,EAAE,sBAAa;IAChC,CAAC,iBAAU,CAAC,kBAAkB,CAAC,EAAE,SAAS;IAC1C,CAAC,iBAAU,CAAC,WAAW,CAAC,EAAE,2BAAkB;IAC5C,CAAC,iBAAU,CAAC,0BAA0B,CAAC,EAAE,yCAAgC;IACzE,CAAC,iBAAU,CAAC,+BAA+B,CAAC,EAAE,SAAS;CACvD,CAAC;AAEF,SAAgB,aAAa,CAAC,KAAc,EAAE,IAAgB;IAC7D,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC,cAAc,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,KAA0B,CAAC;IAE1C,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
|