@squiz/db-lib 1.71.1 → 1.71.3
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/CHANGELOG.md +14 -0
- package/lib/AbstractRepository.d.ts +57 -0
- package/lib/AbstractRepository.d.ts.map +1 -0
- package/lib/AbstractRepository.integration.spec.d.ts +2 -0
- package/lib/AbstractRepository.integration.spec.d.ts.map +1 -0
- package/lib/AbstractRepository.integration.spec.js +118 -0
- package/lib/AbstractRepository.integration.spec.js.map +1 -0
- package/lib/AbstractRepository.js +187 -0
- package/lib/AbstractRepository.js.map +1 -0
- package/lib/ConnectionManager.d.ts +26 -0
- package/lib/ConnectionManager.d.ts.map +1 -0
- package/lib/ConnectionManager.js +58 -0
- package/lib/ConnectionManager.js.map +1 -0
- package/lib/Migrator.d.ts +25 -0
- package/lib/Migrator.d.ts.map +1 -0
- package/lib/Migrator.js +160 -0
- package/lib/Migrator.js.map +1 -0
- package/lib/PostgresErrorCodes.d.ts +269 -0
- package/lib/PostgresErrorCodes.d.ts.map +1 -0
- package/lib/PostgresErrorCodes.js +274 -0
- package/lib/PostgresErrorCodes.js.map +1 -0
- package/lib/Repositories.d.ts +3 -0
- package/lib/Repositories.d.ts.map +1 -0
- package/lib/Repositories.js +3 -0
- package/lib/Repositories.js.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts +162 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.d.ts.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.js +367 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.js.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts +27 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.d.ts.map +1 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.js +698 -0
- package/lib/dynamodb/AbstractDynamoDbRepository.spec.js.map +1 -0
- package/lib/dynamodb/DynamoDbManager.d.ts +19 -0
- package/lib/dynamodb/DynamoDbManager.d.ts.map +1 -0
- package/lib/dynamodb/DynamoDbManager.js +66 -0
- package/lib/dynamodb/DynamoDbManager.js.map +1 -0
- package/lib/dynamodb/getDynamoDbOptions.d.ts +13 -0
- package/lib/dynamodb/getDynamoDbOptions.d.ts.map +1 -0
- package/lib/dynamodb/getDynamoDbOptions.js +15 -0
- package/lib/dynamodb/getDynamoDbOptions.js.map +1 -0
- package/lib/error/DuplicateItemError.d.ts +6 -0
- package/lib/error/DuplicateItemError.d.ts.map +1 -0
- package/lib/error/DuplicateItemError.js +12 -0
- package/lib/error/DuplicateItemError.js.map +1 -0
- package/lib/error/InvalidDataFormatError.d.ts +6 -0
- package/lib/error/InvalidDataFormatError.d.ts.map +1 -0
- package/lib/error/InvalidDataFormatError.js +12 -0
- package/lib/error/InvalidDataFormatError.js.map +1 -0
- package/lib/error/InvalidDbSchemaError.d.ts +6 -0
- package/lib/error/InvalidDbSchemaError.d.ts.map +1 -0
- package/lib/error/InvalidDbSchemaError.js +12 -0
- package/lib/error/InvalidDbSchemaError.js.map +1 -0
- package/lib/error/MissingKeyValuesError.d.ts +6 -0
- package/lib/error/MissingKeyValuesError.d.ts.map +1 -0
- package/lib/error/MissingKeyValuesError.js +12 -0
- package/lib/error/MissingKeyValuesError.js.map +1 -0
- package/lib/error/TransactionError.d.ts +6 -0
- package/lib/error/TransactionError.d.ts.map +1 -0
- package/lib/error/TransactionError.js +12 -0
- package/lib/error/TransactionError.js.map +1 -0
- package/lib/getConnectionInfo.d.ts +6 -0
- package/lib/getConnectionInfo.d.ts.map +1 -0
- package/lib/getConnectionInfo.js +30 -0
- package/lib/getConnectionInfo.js.map +1 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +34 -0
- package/lib/index.js.map +1 -0
- package/package.json +5 -5
- package/src/AbstractRepository.ts +26 -20
- package/src/dynamodb/AbstractDynamoDbRepository.ts +1 -1
- package/src/dynamodb/getDynamoDbOptions.ts +1 -1
- package/tsconfig.json +5 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/build.js +0 -31
@@ -0,0 +1,367 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.AbstractDynamoDbRepository = void 0;
|
4
|
+
const __1 = require("..");
|
5
|
+
const InvalidDataFormatError_1 = require("../error/InvalidDataFormatError");
|
6
|
+
class AbstractDynamoDbRepository {
|
7
|
+
constructor(tableName, dbManager, entityName, entityDefinition, classRef) {
|
8
|
+
this.tableName = tableName;
|
9
|
+
this.dbManager = dbManager;
|
10
|
+
this.entityName = entityName;
|
11
|
+
this.entityDefinition = entityDefinition;
|
12
|
+
this.classRef = classRef;
|
13
|
+
this.client = dbManager.client;
|
14
|
+
this.keys = entityDefinition.keys;
|
15
|
+
this.indexes = entityDefinition.indexes;
|
16
|
+
this.fieldsAsJsonString = entityDefinition.fieldsAsJsonString;
|
17
|
+
this.keysFormat = {
|
18
|
+
[this.keys.pk.attributeName]: this.keys.pk.format,
|
19
|
+
[this.keys.sk.attributeName]: this.keys.sk.format,
|
20
|
+
};
|
21
|
+
Object.keys(this.indexes).forEach((key) => {
|
22
|
+
const index = this.indexes[key];
|
23
|
+
this.keysFormat[index.pk.attributeName] = index.pk.format;
|
24
|
+
this.keysFormat[index.sk.attributeName] = index.sk.format;
|
25
|
+
});
|
26
|
+
}
|
27
|
+
/**
|
28
|
+
* Get the single item matching the key fields value in the given
|
29
|
+
* partial item. Will throw MissingKeyValuesError if key field values
|
30
|
+
* are missing
|
31
|
+
*
|
32
|
+
* @param item
|
33
|
+
*
|
34
|
+
* @throws MissingKeyValuesError
|
35
|
+
*/
|
36
|
+
async getItem(item) {
|
37
|
+
const output = await this.client.get({
|
38
|
+
TableName: this.tableName,
|
39
|
+
Key: {
|
40
|
+
[this.keys.pk.attributeName]: this.getPk(item),
|
41
|
+
[this.keys.sk.attributeName]: this.getSk(item),
|
42
|
+
},
|
43
|
+
});
|
44
|
+
if (output.Item === undefined) {
|
45
|
+
return undefined;
|
46
|
+
}
|
47
|
+
return this.hydrateItem(output.Item);
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* Finds all the items matching the partition key or
|
51
|
+
* the gsi key (when gsi index name is specified)
|
52
|
+
*
|
53
|
+
* @param item
|
54
|
+
* @param useSortKey
|
55
|
+
* @param index
|
56
|
+
* @throws MissingKeyValuesError
|
57
|
+
*/
|
58
|
+
async queryItems(item, useSortKey = false, index) {
|
59
|
+
let pkName = this.keys.pk.attributeName;
|
60
|
+
let skName = this.keys.sk.attributeName;
|
61
|
+
let indexName = null;
|
62
|
+
if (index) {
|
63
|
+
if (this.indexes[index] === undefined) {
|
64
|
+
throw new __1.MissingKeyValuesError(`Table index '${index}' not defined on entity ${this.entityName}`);
|
65
|
+
}
|
66
|
+
indexName = index;
|
67
|
+
pkName = this.indexes[index].pk.attributeName;
|
68
|
+
skName = this.indexes[index].sk.attributeName;
|
69
|
+
}
|
70
|
+
const pk = this.getKey(item, pkName);
|
71
|
+
const keyConditionExpression = ['#pkName = :pkValue'];
|
72
|
+
const expressionAttributeNames = { '#pkName': pkName };
|
73
|
+
const expressionAttributeValues = { ':pkValue': pk };
|
74
|
+
if (useSortKey) {
|
75
|
+
const sk = this.getKey(item, skName);
|
76
|
+
keyConditionExpression.push('#skName = :skValue');
|
77
|
+
expressionAttributeNames['#skName'] = skName;
|
78
|
+
expressionAttributeValues[':skValue'] = sk;
|
79
|
+
}
|
80
|
+
const queryCommandInput = {
|
81
|
+
TableName: this.tableName,
|
82
|
+
KeyConditionExpression: keyConditionExpression.join(' AND '),
|
83
|
+
ExpressionAttributeNames: expressionAttributeNames,
|
84
|
+
ExpressionAttributeValues: expressionAttributeValues,
|
85
|
+
};
|
86
|
+
if (indexName) {
|
87
|
+
queryCommandInput['IndexName'] = String(indexName);
|
88
|
+
}
|
89
|
+
const output = await this.client.query(queryCommandInput);
|
90
|
+
return !output.Items ? [] : output.Items.map((item) => this.hydrateItem(item));
|
91
|
+
}
|
92
|
+
/**
|
93
|
+
* Update the existing item matching the key fields value
|
94
|
+
* in the passed in partialItem
|
95
|
+
* @param partialItem
|
96
|
+
* @param newValue
|
97
|
+
* @param transaction
|
98
|
+
*
|
99
|
+
* @returns Promise<SHAPE | undefined>
|
100
|
+
* @throws MissingKeyValuesError
|
101
|
+
*/
|
102
|
+
async updateItem(partialItem, newValue, transaction = {}) {
|
103
|
+
var _a, _b;
|
104
|
+
const oldValue = await this.getItem(partialItem);
|
105
|
+
if (oldValue === undefined) {
|
106
|
+
return undefined;
|
107
|
+
}
|
108
|
+
const value = { ...oldValue, ...newValue };
|
109
|
+
this.assertValueMatchesModel(value);
|
110
|
+
this.convertSelectedValuesToJsonString(newValue);
|
111
|
+
const updateExpression = [];
|
112
|
+
const expressionAttributeNames = {};
|
113
|
+
const expressionAttributeValues = {};
|
114
|
+
for (const modelProperty of Object.keys(newValue)) {
|
115
|
+
const propName = `#${modelProperty}`;
|
116
|
+
const propValue = `:${modelProperty}`;
|
117
|
+
updateExpression.push(`${propName} = ${propValue}`);
|
118
|
+
expressionAttributeNames[propName] = modelProperty;
|
119
|
+
expressionAttributeValues[propValue] = (_a = newValue[modelProperty]) !== null && _a !== void 0 ? _a : null;
|
120
|
+
}
|
121
|
+
const updateCommandInput = {
|
122
|
+
TableName: this.tableName,
|
123
|
+
Key: {
|
124
|
+
[this.keys.pk.attributeName]: this.getPk(partialItem),
|
125
|
+
[this.keys.sk.attributeName]: this.getSk(partialItem),
|
126
|
+
},
|
127
|
+
UpdateExpression: 'SET ' + updateExpression.join(','),
|
128
|
+
ExpressionAttributeValues: expressionAttributeValues,
|
129
|
+
ExpressionAttributeNames: expressionAttributeNames,
|
130
|
+
ConditionExpression: `attribute_exists(${this.keys.pk.attributeName})`,
|
131
|
+
};
|
132
|
+
if ((_b = transaction.id) === null || _b === void 0 ? void 0 : _b.length) {
|
133
|
+
// this command will be executed together with
|
134
|
+
// other db write commands in the "transaction" block
|
135
|
+
this.dbManager.addWriteTransactionItem(transaction.id, {
|
136
|
+
Update: updateCommandInput,
|
137
|
+
});
|
138
|
+
return new this.classRef(value);
|
139
|
+
}
|
140
|
+
let output;
|
141
|
+
try {
|
142
|
+
output = await this.client.update({
|
143
|
+
...updateCommandInput,
|
144
|
+
ReturnValues: 'ALL_NEW',
|
145
|
+
});
|
146
|
+
}
|
147
|
+
catch (e) {
|
148
|
+
if (e && e.name === 'ConditionalCheckFailedException') {
|
149
|
+
return undefined;
|
150
|
+
}
|
151
|
+
throw e;
|
152
|
+
}
|
153
|
+
let item = undefined;
|
154
|
+
if (output.Attributes) {
|
155
|
+
item = this.hydrateItem(output.Attributes);
|
156
|
+
}
|
157
|
+
return item ? item : undefined;
|
158
|
+
}
|
159
|
+
/**
|
160
|
+
* Adds new item to the table
|
161
|
+
*
|
162
|
+
* @param value
|
163
|
+
* @param transaction
|
164
|
+
*
|
165
|
+
* @returns Promise<SHAPE>
|
166
|
+
* @throws DuplicateItemError
|
167
|
+
* @throws MissingKeyValuesError
|
168
|
+
*/
|
169
|
+
async createItem(value, transaction = {}) {
|
170
|
+
var _a;
|
171
|
+
this.assertValueMatchesModel(value);
|
172
|
+
const columns = {};
|
173
|
+
for (const modelProperty of Object.keys(value)) {
|
174
|
+
columns[modelProperty] = value[modelProperty];
|
175
|
+
}
|
176
|
+
this.convertSelectedValuesToJsonString(columns);
|
177
|
+
const keyFields = {
|
178
|
+
[this.keys.pk.attributeName]: this.getPk(value),
|
179
|
+
[this.keys.sk.attributeName]: this.getSk(value),
|
180
|
+
};
|
181
|
+
Object.keys(this.indexes).forEach((key) => {
|
182
|
+
const index = this.indexes[key];
|
183
|
+
keyFields[index.pk.attributeName] = this.getKey(value, index.pk.attributeName);
|
184
|
+
keyFields[index.sk.attributeName] = this.getKey(value, index.sk.attributeName);
|
185
|
+
});
|
186
|
+
const putCommandInput = {
|
187
|
+
TableName: this.tableName,
|
188
|
+
Item: {
|
189
|
+
...keyFields,
|
190
|
+
...columns,
|
191
|
+
},
|
192
|
+
ConditionExpression: `attribute_not_exists(${this.keys.pk.attributeName})`,
|
193
|
+
};
|
194
|
+
if ((_a = transaction.id) === null || _a === void 0 ? void 0 : _a.length) {
|
195
|
+
// this command will be executed together with
|
196
|
+
// other db write commands in the "transaction block"
|
197
|
+
this.dbManager.addWriteTransactionItem(transaction.id, {
|
198
|
+
Put: putCommandInput,
|
199
|
+
});
|
200
|
+
return value;
|
201
|
+
}
|
202
|
+
await this.client.put(putCommandInput);
|
203
|
+
return value;
|
204
|
+
}
|
205
|
+
/**
|
206
|
+
* Deletes an item from the table
|
207
|
+
*
|
208
|
+
* @param partialItem
|
209
|
+
* @param transaction
|
210
|
+
* @returns number
|
211
|
+
* @throw MissingKeyValuesError
|
212
|
+
*/
|
213
|
+
async deleteItem(partialItem, transaction = {}) {
|
214
|
+
var _a;
|
215
|
+
const deleteCommandInput = {
|
216
|
+
TableName: this.tableName,
|
217
|
+
Key: {
|
218
|
+
[this.keys.pk.attributeName]: this.getPk(partialItem),
|
219
|
+
[this.keys.sk.attributeName]: this.getSk(partialItem),
|
220
|
+
},
|
221
|
+
ConditionExpression: `attribute_exists(${this.keys.pk.attributeName})`,
|
222
|
+
};
|
223
|
+
if ((_a = transaction.id) === null || _a === void 0 ? void 0 : _a.length) {
|
224
|
+
// For transaction block, don't worry if the item being deleted does not exist
|
225
|
+
delete deleteCommandInput.ConditionExpression;
|
226
|
+
// this command will be executed together with
|
227
|
+
// other db write commands in the "transaction block"
|
228
|
+
this.dbManager.addWriteTransactionItem(transaction.id, {
|
229
|
+
Delete: deleteCommandInput,
|
230
|
+
});
|
231
|
+
return 1;
|
232
|
+
}
|
233
|
+
try {
|
234
|
+
await this.client.delete(deleteCommandInput);
|
235
|
+
}
|
236
|
+
catch (e) {
|
237
|
+
if (e && e.name === 'ConditionalCheckFailedException') {
|
238
|
+
return 0;
|
239
|
+
}
|
240
|
+
throw e;
|
241
|
+
}
|
242
|
+
return 1;
|
243
|
+
}
|
244
|
+
/**
|
245
|
+
* Return repo model object from the db value
|
246
|
+
* @param item
|
247
|
+
* @returns
|
248
|
+
*/
|
249
|
+
hydrateItem(item) {
|
250
|
+
for (const fieldName of Object.keys(item)) {
|
251
|
+
if (this.fieldsAsJsonString.includes(fieldName)) {
|
252
|
+
if (typeof item[fieldName] === 'string') {
|
253
|
+
item[fieldName] = JSON.parse(item[fieldName]);
|
254
|
+
}
|
255
|
+
else {
|
256
|
+
throw new InvalidDataFormatError_1.InvalidDataFormatError(`Field '${fieldName}' defined as JSON String has a non-string data`);
|
257
|
+
}
|
258
|
+
}
|
259
|
+
}
|
260
|
+
return new this.classRef(item);
|
261
|
+
}
|
262
|
+
convertSelectedValuesToJsonString(item) {
|
263
|
+
for (const fieldName of Object.keys(item)) {
|
264
|
+
if (this.fieldsAsJsonString.includes(fieldName)) {
|
265
|
+
item[fieldName] = JSON.stringify(item[fieldName]);
|
266
|
+
}
|
267
|
+
}
|
268
|
+
}
|
269
|
+
/**
|
270
|
+
* Evaluate the partition key value from the partial item
|
271
|
+
* @param item
|
272
|
+
* @returns string
|
273
|
+
* @throw MissingKeyValuesError
|
274
|
+
*/
|
275
|
+
getPk(item) {
|
276
|
+
return this.getKey(item, this.keys.pk.attributeName);
|
277
|
+
}
|
278
|
+
/**
|
279
|
+
* Evaluate the sort key value from the partial item
|
280
|
+
* @param item
|
281
|
+
* @returns string
|
282
|
+
*
|
283
|
+
* @throw MissingKeyValuesError
|
284
|
+
*/
|
285
|
+
getSk(item) {
|
286
|
+
return this.getKey(item, this.keys.sk.attributeName);
|
287
|
+
}
|
288
|
+
/**
|
289
|
+
* Evaluate the key value from the
|
290
|
+
*
|
291
|
+
* Example 1:
|
292
|
+
* Input:
|
293
|
+
* - item: {id: foo, name: 'some-name' }
|
294
|
+
* - attributeName: pk
|
295
|
+
* - this.keysFormat = { pk: 'item#{id}', 'sk': '#meta', ... }
|
296
|
+
* Output:
|
297
|
+
* - 'item#foo'
|
298
|
+
*
|
299
|
+
* Example 2:
|
300
|
+
* Input:
|
301
|
+
* - item: {id: foo, name: 'some-name', itemType: 'A' }
|
302
|
+
* - attributeName: sk
|
303
|
+
* - this.keysFormat = { pk: 'item#{id}', 'sk': 'type#{itemType}', ... }
|
304
|
+
* Output:
|
305
|
+
* - 'type#A'
|
306
|
+
*
|
307
|
+
* Example 3:
|
308
|
+
* Input:
|
309
|
+
* - item: {id: foo, name: 'some-name' }
|
310
|
+
* - attributeName: sk
|
311
|
+
* - this.keysFormat = { pk: 'item#{id}', 'sk': 'name-type#{itemType}{name}', ... }
|
312
|
+
* Output:
|
313
|
+
* - Error: "Key field "itemType" must be specified in the input item"
|
314
|
+
*
|
315
|
+
* @param item
|
316
|
+
* @param attributeName
|
317
|
+
*
|
318
|
+
* @returns string
|
319
|
+
* @throw MissingKeyValuesError
|
320
|
+
*/
|
321
|
+
getKey(item, attributeName) {
|
322
|
+
var _a;
|
323
|
+
let keyFormat = this.keysFormat[attributeName];
|
324
|
+
if (keyFormat == undefined || !keyFormat.length) {
|
325
|
+
throw new __1.MissingKeyValuesError(`Key format not defined or empty for key attribute '${attributeName}' in entity ${this.entityName}`);
|
326
|
+
}
|
327
|
+
const matches = keyFormat.match(/{[a-zA-Z]+?}/g);
|
328
|
+
const replacements = !matches
|
329
|
+
? []
|
330
|
+
: matches.map((match) => {
|
331
|
+
return {
|
332
|
+
property: match.slice(1, -1),
|
333
|
+
placeholder: match,
|
334
|
+
};
|
335
|
+
});
|
336
|
+
for (let i = 0; i < replacements.length; i++) {
|
337
|
+
const field = replacements[i].property;
|
338
|
+
if (item[field] === undefined) {
|
339
|
+
throw new __1.MissingKeyValuesError(`Key field "${String(field)}" must be specified in the input item in entity ${this.entityName}`);
|
340
|
+
}
|
341
|
+
keyFormat = keyFormat.replace(replacements[i].placeholder, String((_a = item[field]) !== null && _a !== void 0 ? _a : ''));
|
342
|
+
}
|
343
|
+
const moreMatches = keyFormat.match(/{[a-zA-Z]+?}/g);
|
344
|
+
if (moreMatches === null || moreMatches === void 0 ? void 0 : moreMatches.length) {
|
345
|
+
throw new __1.MissingKeyValuesError(`Cannot resolve key placeholder(s) for key attribute format '${this.keysFormat[attributeName]} in entity ${this.entityName}: '${moreMatches.join("','")}'`);
|
346
|
+
}
|
347
|
+
return keyFormat;
|
348
|
+
}
|
349
|
+
/**
|
350
|
+
* Validate the data matches with "DATA_MODEL"
|
351
|
+
* @param value
|
352
|
+
* @return void
|
353
|
+
*/
|
354
|
+
assertValueMatchesModel(value) {
|
355
|
+
// Trigger AssertionError if model instantiation fails
|
356
|
+
// see the DATA_CLASS model class
|
357
|
+
const obj = new this.classRef(value);
|
358
|
+
const inputProperties = Object.keys(value);
|
359
|
+
const modelProperties = Object.keys(obj);
|
360
|
+
const excessProperties = inputProperties.filter((prop) => !modelProperties.includes(prop));
|
361
|
+
if (excessProperties.length > 0) {
|
362
|
+
throw new __1.InvalidDbSchemaError(`Excess properties in entity ${this.entityName}: ${excessProperties.join(', ')}`);
|
363
|
+
}
|
364
|
+
}
|
365
|
+
}
|
366
|
+
exports.AbstractDynamoDbRepository = AbstractDynamoDbRepository;
|
367
|
+
//# sourceMappingURL=AbstractDynamoDbRepository.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"AbstractDynamoDbRepository.js","sourceRoot":"","sources":["../../src/dynamodb/AbstractDynamoDbRepository.ts"],"names":[],"mappings":";;;AAQA,0BAA+F;AAC/F,4EAAyE;AAsCzE,MAAsB,0BAA0B;IAY9C,YACY,SAAiB,EACjB,SAAwC,EACxC,UAAkB,EAClB,gBAAkC,EAClC,QAA8D;QAJ9D,cAAS,GAAT,SAAS,CAAQ;QACjB,cAAS,GAAT,SAAS,CAA+B;QACxC,eAAU,GAAV,UAAU,CAAQ;QAClB,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,aAAQ,GAAR,QAAQ,CAAsD;QAExE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAE/B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,kBAAkB,CAAC;QAE9D,IAAI,CAAC,UAAU,GAAG;YAChB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM;YACjD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM;SAClD,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;YAC1D,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,OAAO,CAAC,IAAoB;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,EAAE;gBACH,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;aAC/C;SACF,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE;YAC7B,OAAO,SAAS,CAAC;SAClB;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,UAAU,CACrB,IAAoB,EACpB,aAAsB,KAAK,EAC3B,KAA0B;QAE1B,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;QACxC,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;QACxC,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,IAAI,KAAK,EAAE;YACT,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;gBACrC,MAAM,IAAI,yBAAqB,CAAC,gBAAgB,KAAK,2BAA2B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;aACpG;YACD,SAAS,GAAG,KAAK,CAAC;YAClB,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC;SAC/C;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,MAAM,sBAAsB,GAAG,CAAC,oBAAoB,CAAC,CAAC;QACtD,MAAM,wBAAwB,GAA2B,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC/E,MAAM,yBAAyB,GAA4B,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QAC9E,IAAI,UAAU,EAAE;YACd,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrC,sBAAsB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAClD,wBAAwB,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;YAC7C,yBAAyB,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;SAC5C;QAED,MAAM,iBAAiB,GAAsB;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,sBAAsB,EAAE,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;YAC5D,wBAAwB,EAAE,wBAAwB;YAClD,yBAAyB,EAAE,yBAAyB;SACrD,CAAC;QACF,IAAI,SAAS,EAAE;YACb,iBAAiB,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;SACpD;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAE1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,UAAU,CACrB,WAA2B,EAC3B,QAAwD,EACxD,cAA2B,EAAE;;QAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,OAAO,SAAS,CAAC;SAClB;QAED,MAAM,KAAK,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC3C,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAEpC,IAAI,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC;QAEjD,MAAM,gBAAgB,GAAG,EAAE,CAAC;QAC5B,MAAM,wBAAwB,GAA2B,EAAE,CAAC;QAC5D,MAAM,yBAAyB,GAA4B,EAAE,CAAC;QAC9D,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACjD,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;YAEtC,gBAAgB,CAAC,IAAI,CAAC,GAAG,QAAQ,MAAM,SAAS,EAAE,CAAC,CAAC;YACpD,wBAAwB,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;YAEnD,yBAAyB,CAAC,SAAS,CAAC,GAAG,MAAA,QAAQ,CAAC,aAA4B,CAAC,mCAAI,IAAI,CAAC;SACvF;QAED,MAAM,kBAAkB,GAAG;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,EAAE;gBACH,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBACrD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;aACtD;YACD,gBAAgB,EAAE,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;YACrD,yBAAyB,EAAE,yBAAyB;YACpD,wBAAwB,EAAE,wBAAwB;YAClD,mBAAmB,EAAE,oBAAoB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,GAAG;SACvE,CAAC;QAEF,IAAI,MAAA,WAAW,CAAC,EAAE,0CAAE,MAAM,EAAE;YAC1B,8CAA8C;YAC9C,qDAAqD;YACrD,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,EAAE;gBACrD,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;YACH,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACjC;QAED,IAAI,MAA2B,CAAC;QAChC,IAAI;YACF,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBAChC,GAAG,kBAAkB;gBACrB,YAAY,EAAE,SAAS;aACxB,CAAC,CAAC;SACJ;QAAC,OAAO,CAAM,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,iCAAiC,EAAE;gBACrD,OAAO,SAAS,CAAC;aAClB;YACD,MAAM,CAAC,CAAC;SACT;QAED,IAAI,IAAI,GAA2B,SAAS,CAAC;QAC7C,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;SAC5C;QACD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjC,CAAC;IAED;;;;;;;;;OASG;IACI,KAAK,CAAC,UAAU,CAAC,KAAiB,EAAE,cAA2B,EAAE;;QACtE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAEpC,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,KAAK,MAAM,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC9C,OAAO,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,aAAiC,CAAC,CAAC;SACnE;QACD,IAAI,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,SAAS,GAA4B;YACzC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YAC/C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;SAChD,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;YAC/E,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,MAAM,eAAe,GAAoB;YACvC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE;gBACJ,GAAG,SAAS;gBACZ,GAAG,OAAO;aACX;YACD,mBAAmB,EAAE,wBAAwB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,GAAG;SAC3E,CAAC;QAEF,IAAI,MAAA,WAAW,CAAC,EAAE,0CAAE,MAAM,EAAE;YAC1B,8CAA8C;YAC9C,qDAAqD;YACrD,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,EAAE;gBACrD,GAAG,EAAE,eAAe;aACrB,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;SACd;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAEvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,UAAU,CAAC,WAA2B,EAAE,cAA2B,EAAE;;QAChF,MAAM,kBAAkB,GAAuB;YAC7C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,EAAE;gBACH,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBACrD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;aACtD;YACD,mBAAmB,EAAE,oBAAoB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,GAAG;SACvE,CAAC;QAEF,IAAI,MAAA,WAAW,CAAC,EAAE,0CAAE,MAAM,EAAE;YAC1B,8EAA8E;YAC9E,OAAO,kBAAkB,CAAC,mBAAmB,CAAC;YAC9C,8CAA8C;YAC9C,qDAAqD;YACrD,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,WAAW,CAAC,EAAE,EAAE;gBACrD,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;YACH,OAAO,CAAC,CAAC;SACV;QAED,IAAI;YACF,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;SAC9C;QAAC,OAAO,CAAM,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,iCAAiC,EAAE;gBACrD,OAAO,CAAC,CAAC;aACV;YACD,MAAM,CAAC,CAAC;SACT;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;;;OAIG;IACO,WAAW,CAAC,IAA6B;QACjD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzC,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;gBAC/C,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE;oBACvC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAW,CAAC,CAAC;iBACzD;qBAAM;oBACL,MAAM,IAAI,+CAAsB,CAAC,UAAU,SAAS,gDAAgD,CAAC,CAAC;iBACvG;aACF;SACF;QACD,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAES,iCAAiC,CAAC,IAA6B;QACvE,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACzC,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;gBAC/C,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;aACnD;SACF;IACH,CAAC;IAED;;;;;OAKG;IACO,KAAK,CAAC,IAAoB;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;OAMG;IACO,KAAK,CAAC,IAAoB;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACO,MAAM,CAAC,IAAoB,EAAE,aAA+B;;QACpE,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,SAAS,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YAC/C,MAAM,IAAI,yBAAqB,CAC7B,sDAAsD,aAAa,eAAe,IAAI,CAAC,UAAU,EAAE,CACpG,CAAC;SACH;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,YAAY,GAAqD,CAAC,OAAO;YAC7E,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,OAAO;oBACL,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAgB;oBAC3C,WAAW,EAAE,KAAK;iBACnB,CAAC;YACJ,CAAC,CAAC,CAAC;QAEP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YACvC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;gBAC7B,MAAM,IAAI,yBAAqB,CAC7B,cAAc,MAAM,CAAC,KAAK,CAAC,mDAAmD,IAAI,CAAC,UAAU,EAAE,CAChG,CAAC;aACH;YACD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,MAAA,IAAI,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC;SACvF;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACrD,IAAI,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,EAAE;YACvB,MAAM,IAAI,yBAAqB,CAC7B,+DAA+D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,cAC3F,IAAI,CAAC,UACP,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CACjC,CAAC;SACH;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACK,uBAAuB,CAAC,KAAc;QAC5C,sDAAsD;QACtD,iCAAiC;QACjC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,KAA4B,CAAC,CAAC;QAC5D,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;QACrD,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzC,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3F,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/B,MAAM,IAAI,wBAAoB,CAAC,+BAA+B,IAAI,CAAC,UAAU,KAAK,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAClH;IACH,CAAC;CACF;AAlaD,gEAkaC"}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import { AbstractDynamoDbRepository } from './AbstractDynamoDbRepository';
|
2
|
+
import { DynamoDbManager } from './DynamoDbManager';
|
3
|
+
import 'aws-sdk-client-mock-jest';
|
4
|
+
interface ITestItem {
|
5
|
+
name: string;
|
6
|
+
age: number;
|
7
|
+
country: string;
|
8
|
+
data?: object;
|
9
|
+
data2?: object;
|
10
|
+
}
|
11
|
+
declare class TestItem implements ITestItem {
|
12
|
+
name: string;
|
13
|
+
age: number;
|
14
|
+
country: string;
|
15
|
+
data: object;
|
16
|
+
data2?: object;
|
17
|
+
constructor(data?: Partial<ITestItem>);
|
18
|
+
}
|
19
|
+
export type TestRepositories = {
|
20
|
+
testItem: TestItemRepository;
|
21
|
+
};
|
22
|
+
export type TestDbManager = DynamoDbManager<TestRepositories>;
|
23
|
+
declare class TestItemRepository extends AbstractDynamoDbRepository<ITestItem, TestItem> {
|
24
|
+
constructor(tableName: string, dbManager: TestDbManager);
|
25
|
+
}
|
26
|
+
export {};
|
27
|
+
//# sourceMappingURL=AbstractDynamoDbRepository.spec.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"AbstractDynamoDbRepository.spec.d.ts","sourceRoot":"","sources":["../../src/dynamodb/AbstractDynamoDbRepository.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAkB1E,OAAO,EAAE,eAAe,EAAe,MAAM,mBAAmB,CAAC;AAIjE,OAAO,0BAA0B,CAAC;AAQlC,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,cAAM,QAAS,YAAW,SAAS;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;gBAEV,IAAI,GAAE,OAAO,CAAC,SAAS,CAAM;CAoB1C;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;CAC9B,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC,gBAAgB,CAAC,CAAC;AAgC9D,cAAM,kBAAmB,SAAQ,0BAA0B,CAAC,SAAS,EAAE,QAAQ,CAAC;gBAClE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa;CAGxD"}
|