cmp-aws-database 0.1.0 → 0.1.2

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.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const cdk = require("aws-cdk-lib");
5
+ const internal_user_db_stack_1 = require("../lib/oms/internal-user-db-stack");
6
+ const app = new cdk.App();
7
+ new internal_user_db_stack_1.InternalUserDbStack(app, 'InternalUserDbStack', {});
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JhZnQtbXktcGxhdGUtZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjcmFmdC1teS1wbGF0ZS1kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxtQ0FBbUM7QUFDbkMsOEVBQXdFO0FBRXhFLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBRTFCLElBQUksNENBQW1CLENBQUMsR0FBRyxFQUFFLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEludGVybmFsVXNlckRiU3RhY2sgfSBmcm9tICcuLi9saWIvb21zL2ludGVybmFsLXVzZXItZGItc3RhY2snO1xuXG5jb25zdCBhcHAgPSBuZXcgY2RrLkFwcCgpO1xuXG5uZXcgSW50ZXJuYWxVc2VyRGJTdGFjayhhcHAsICdJbnRlcm5hbFVzZXJEYlN0YWNrJywge30pXG4iXX0=
package/index.js CHANGED
@@ -1,5 +1,4 @@
1
- export * from './oms/internal-user-db-stack';
2
- export * from './oms/internal-user-dao';
3
- export * from './oms/internal-user-model';
4
- export * from './base-dao';
5
- export * from './base-model';
1
+ export * from './dist/internal-user/internal-user-model';
2
+ export * from './dist/internal-user/internal-user-dao';
3
+ export * from './dist/base-dao';
4
+ export * from './dist/base-model';
@@ -0,0 +1,7 @@
1
+ import { Stack, StackProps } from "aws-cdk-lib";
2
+ import { Table } from "aws-cdk-lib/aws-dynamodb";
3
+ import { Construct } from "constructs";
4
+ export declare class InternalUserDbStack extends Stack {
5
+ internalUserTable: Table;
6
+ constructor(scope: Construct, id: string, props?: StackProps);
7
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InternalUserDbStack = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
6
+ class InternalUserDbStack extends aws_cdk_lib_1.Stack {
7
+ constructor(scope, id, props) {
8
+ super(scope, id, props);
9
+ // New Sales and Oprational Team User Table Defined
10
+ this.internalUserTable = new aws_dynamodb_1.Table(this, "InternalUserTable", {
11
+ tableName: "InternalUserTable",
12
+ billingMode: aws_dynamodb_1.BillingMode.PAY_PER_REQUEST,
13
+ partitionKey: {
14
+ name: "userId",
15
+ type: aws_dynamodb_1.AttributeType.STRING
16
+ }
17
+ });
18
+ this.internalUserTable.addGlobalSecondaryIndex({
19
+ indexName: 'emailIndex',
20
+ partitionKey: { name: 'emailId', type: aws_dynamodb_1.AttributeType.STRING },
21
+ });
22
+ }
23
+ }
24
+ exports.InternalUserDbStack = InternalUserDbStack;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtdXNlci1kYi1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVybmFsLXVzZXItZGItc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQWdEO0FBQ2hELDJEQUE2RTtBQUc3RSxNQUFhLG1CQUFvQixTQUFRLG1CQUFLO0lBRzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0I7UUFDeEQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLG9CQUFLLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQzFELFNBQVMsRUFBRSxtQkFBbUI7WUFDOUIsV0FBVyxFQUFFLDBCQUFXLENBQUMsZUFBZTtZQUN4QyxZQUFZLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLDRCQUFhLENBQUMsTUFBTTthQUU3QjtTQUNKLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQztZQUMzQyxTQUFTLEVBQUUsWUFBWTtZQUN2QixZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSw0QkFBYSxDQUFDLE1BQU0sRUFBRTtTQUNoRSxDQUFDLENBQUE7SUFFTixDQUFDO0NBQ0o7QUF2QkQsa0RBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEF0dHJpYnV0ZVR5cGUsIEJpbGxpbmdNb2RlLCBUYWJsZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbFVzZXJEYlN0YWNrIGV4dGVuZHMgU3RhY2sge1xuICAgIGludGVybmFsVXNlclRhYmxlOiBUYWJsZTtcblxuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogU3RhY2tQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgICAgICAvLyBOZXcgU2FsZXMgYW5kIE9wcmF0aW9uYWwgVGVhbSBVc2VyIFRhYmxlIERlZmluZWRcbiAgICAgICAgdGhpcy5pbnRlcm5hbFVzZXJUYWJsZSA9IG5ldyBUYWJsZSh0aGlzLCBcIkludGVybmFsVXNlclRhYmxlXCIsIHtcbiAgICAgICAgICAgIHRhYmxlTmFtZTogXCJJbnRlcm5hbFVzZXJUYWJsZVwiLFxuICAgICAgICAgICAgYmlsbGluZ01vZGU6IEJpbGxpbmdNb2RlLlBBWV9QRVJfUkVRVUVTVCxcbiAgICAgICAgICAgIHBhcnRpdGlvbktleToge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwidXNlcklkXCIsXG4gICAgICAgICAgICAgICAgdHlwZTogQXR0cmlidXRlVHlwZS5TVFJJTkdcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuaW50ZXJuYWxVc2VyVGFibGUuYWRkR2xvYmFsU2Vjb25kYXJ5SW5kZXgoe1xuICAgICAgICAgICAgaW5kZXhOYW1lOiAnZW1haWxJbmRleCcsXG4gICAgICAgICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogJ2VtYWlsSWQnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgICB9KVxuXG4gICAgfVxufSJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cmp-aws-database",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "bin": {
5
5
  "craft-my-plate-database": "bin/craft-my-plate-database.js"
6
6
  },
@@ -44,4 +44,4 @@
44
44
  "url": "https://github.com/Surajpatel24-craftmyplate/craft-my-plate-database/issues"
45
45
  },
46
46
  "homepage": "https://github.com/Surajpatel24-craftmyplate/craft-my-plate-database#readme"
47
- }
47
+ }
@@ -0,0 +1,32 @@
1
+ import { DataMapper, ParallelScanOptions, ParallelScanWorkerOptions, QueryOptions, ReadConsistency, ScanOptions } from '@nova-odm/mapper';
2
+ import { ZeroArgumentsConstructor } from '@nova-odm/marshaller';
3
+ import { ConditionExpression, ConditionExpressionPredicate } from '@nova-odm/expressions';
4
+ import { BaseModel } from './base-model';
5
+ export declare const dynamoDB: any;
6
+ export declare const mapper: DataMapper;
7
+ export declare class GenericDAO<T extends BaseModel> {
8
+ batchUpdate(items: T[], batchSize?: number): Promise<T[]>;
9
+ parallelBatchPut(inputItems: T[], batchSize?: number, maxConcurrentSegments?: number): Promise<T[]>;
10
+ parallelBatchDelete(inputItems: T[], batchSize?: number, maxConcurrentSegments?: number): Promise<T[]>;
11
+ /**
12
+ * This function has to be used only in the scripts.
13
+ *
14
+ * @param valueConstructor the model class
15
+ */
16
+ parallelScan(valueConstructor: ZeroArgumentsConstructor<T>, options?: ParallelScanOptions): Promise<T[]>;
17
+ scan(valueConstructor: ZeroArgumentsConstructor<T>, options?: ScanOptions | ParallelScanWorkerOptions): Promise<T[]>;
18
+ save(item: T): Promise<T>;
19
+ update(item: T): Promise<T>;
20
+ delete(item: T): Promise<T | undefined>;
21
+ get(item: T, readConsistency?: ReadConsistency): Promise<T>;
22
+ batchPut(items: T[]): Promise<T[]>;
23
+ batchDelete(items: T[]): Promise<T[]>;
24
+ batchGet(items: T[], readConsistency?: ReadConsistency): Promise<T[]>;
25
+ parallelBatchGet(inputItems: T[], batchSize?: number, maxConcurrentSegments?: number, readConsistency?: ReadConsistency): Promise<T[]>;
26
+ parallelQuery(valueConstructor: ZeroArgumentsConstructor<T>, keyConditions: Array<ConditionExpression | {
27
+ [propertyName: string]: ConditionExpressionPredicate | any;
28
+ }>, maxConcurrentCalls?: number, options?: QueryOptions): Promise<T[]>;
29
+ private customQuery;
30
+ decode(continuationToken: string | undefined): any;
31
+ encode(lastEvaluatedKey: any): Promise<string>;
32
+ }
@@ -0,0 +1,245 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GenericDAO = exports.mapper = exports.dynamoDB = void 0;
4
+ const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
5
+ const mapper_1 = require("@nova-odm/mapper");
6
+ exports.dynamoDB = new client_dynamodb_1.DynamoDB({
7
+ maxAttempts: 10
8
+ });
9
+ exports.mapper = new mapper_1.DataMapper({ client: exports.dynamoDB });
10
+ class GenericDAO {
11
+ async batchUpdate(items, batchSize = 100) {
12
+ let success = 0, totalToUpdate = items.length;
13
+ let updateItems = [];
14
+ while (items.length > 0) {
15
+ let promises = [];
16
+ let batch = items.splice(0, batchSize);
17
+ promises = batch.map(item => this.update(item));
18
+ let results = await Promise.allSettled(promises);
19
+ results.forEach(result => {
20
+ if (result.status == "fulfilled") {
21
+ success += 1;
22
+ updateItems.push(result.value);
23
+ }
24
+ });
25
+ console.log(`${success}/${totalToUpdate}`);
26
+ }
27
+ return updateItems;
28
+ }
29
+ async parallelBatchPut(inputItems, batchSize = 1000, maxConcurrentSegments = 20) {
30
+ let startTime = Date.now();
31
+ let items = [];
32
+ items = items.concat(inputItems);
33
+ items = items.map(item => {
34
+ item.created_time = new Date();
35
+ // item.created_user = authContext.userSub
36
+ return item;
37
+ });
38
+ let maxSegments = [];
39
+ let putItems = [];
40
+ while (items.length > 0) {
41
+ let batch = items.splice(0, batchSize * maxConcurrentSegments);
42
+ let segment = [];
43
+ while (batch.length > 0) {
44
+ segment.push(batch.splice(0, batchSize));
45
+ }
46
+ maxSegments.push(segment);
47
+ }
48
+ for (const segment of maxSegments) {
49
+ let startTime = Date.now();
50
+ let promises = [];
51
+ console.log(`batch length = ${segment.length}`);
52
+ for (const batch of segment) {
53
+ promises.push(this.batchPut(batch));
54
+ }
55
+ let result = await Promise.all(promises);
56
+ console.log("segment complete");
57
+ result.forEach((res) => {
58
+ putItems = putItems.concat(res);
59
+ });
60
+ console.log(`time for segment put ${Date.now() - startTime}`);
61
+ }
62
+ console.log(`total time for complete parallel put ${Date.now() - startTime}`);
63
+ return putItems;
64
+ }
65
+ async parallelBatchDelete(inputItems, batchSize = 1000, maxConcurrentSegments = 20) {
66
+ let startTime = Date.now();
67
+ let items = [];
68
+ items = items.concat(inputItems);
69
+ let maxSegments = [];
70
+ let putItems = [];
71
+ while (items.length > 0) {
72
+ let batch = items.splice(0, batchSize * maxConcurrentSegments);
73
+ let segment = [];
74
+ while (batch.length > 0) {
75
+ segment.push(batch.splice(0, batchSize));
76
+ }
77
+ maxSegments.push(segment);
78
+ }
79
+ for (const segment of maxSegments) {
80
+ let startTime = Date.now();
81
+ let promises = [];
82
+ console.log(`batch length = ${segment.length}`);
83
+ for (const batch of segment) {
84
+ promises.push(this.batchDelete(batch));
85
+ }
86
+ let result = await Promise.all(promises);
87
+ console.log("segment complete");
88
+ result.forEach((res) => {
89
+ putItems = putItems.concat(res);
90
+ });
91
+ console.log(`time for segment delete ${Date.now() - startTime}`);
92
+ }
93
+ console.log(`total time for complete parallel delete ${Date.now() - startTime}`);
94
+ return putItems;
95
+ }
96
+ /**
97
+ * This function has to be used only in the scripts.
98
+ *
99
+ * @param valueConstructor the model class
100
+ */
101
+ async parallelScan(valueConstructor, options) {
102
+ let items = [];
103
+ for await (const item of exports.mapper.parallelScan(valueConstructor, 4, options)) {
104
+ items.push(item);
105
+ if (items.length % 100000 == 0) {
106
+ console.log("read 100K");
107
+ }
108
+ }
109
+ return items;
110
+ }
111
+ async scan(valueConstructor, options) {
112
+ let items = [];
113
+ for await (const item of exports.mapper.scan(valueConstructor, options)) {
114
+ items.push(item);
115
+ }
116
+ return items;
117
+ }
118
+ async save(item) {
119
+ item.created_time = new Date();
120
+ // item.created_user = authContext.userSub
121
+ const res = await exports.mapper.put(item);
122
+ return res;
123
+ }
124
+ async update(item) {
125
+ item.updated_time = new Date();
126
+ // item.updated_user = authContext.userSub
127
+ const res = await exports.mapper.update(item, {
128
+ onMissing: "skip"
129
+ });
130
+ return res;
131
+ }
132
+ async delete(item) {
133
+ return await exports.mapper.delete(item, { returnValues: "ALL_OLD" });
134
+ }
135
+ async get(item, readConsistency = "eventual") {
136
+ const res = await exports.mapper.get(item, {
137
+ readConsistency: readConsistency
138
+ });
139
+ return res;
140
+ }
141
+ async batchPut(items) {
142
+ let finalItems = [];
143
+ items = items.map(item => {
144
+ item.created_time = new Date();
145
+ // item.created_user = authContext.userSub
146
+ return item;
147
+ });
148
+ // console.log( "item:", items )
149
+ for await (const item of exports.mapper.batchPut(items)) {
150
+ console.log(item);
151
+ finalItems.push(item);
152
+ }
153
+ return finalItems;
154
+ }
155
+ async batchDelete(items) {
156
+ let deleteItems = [];
157
+ for await (const item of exports.mapper.batchDelete(items)) {
158
+ deleteItems.push(item);
159
+ }
160
+ return deleteItems;
161
+ }
162
+ async batchGet(items, readConsistency = "eventual") {
163
+ let getItems = [];
164
+ for await (const item of exports.mapper.batchGet(items, {
165
+ readConsistency: readConsistency
166
+ })) {
167
+ getItems.push(item);
168
+ }
169
+ return getItems;
170
+ }
171
+ async parallelBatchGet(inputItems, batchSize = 1000, maxConcurrentSegments = 20, readConsistency) {
172
+ let startTime = Date.now();
173
+ let items = [];
174
+ items = items.concat(inputItems);
175
+ let maxSegments = [];
176
+ let resultItems = [];
177
+ while (items.length > 0) {
178
+ let batch = items.splice(0, batchSize * maxConcurrentSegments);
179
+ let segment = [];
180
+ while (batch.length > 0) {
181
+ segment.push(batch.splice(0, batchSize));
182
+ }
183
+ maxSegments.push(segment);
184
+ }
185
+ for (const segment of maxSegments) {
186
+ let startTime = Date.now();
187
+ let promises = [];
188
+ console.log(`batch length = ${segment.length}`);
189
+ for (const batch of segment) {
190
+ promises.push(this.batchGet(batch, readConsistency));
191
+ }
192
+ let result = await Promise.all(promises);
193
+ console.log("segment complete");
194
+ result.forEach((res) => {
195
+ resultItems = resultItems.concat(res);
196
+ });
197
+ console.log(`time for segment get ${Date.now() - startTime}`);
198
+ }
199
+ console.log(`total time for complete parallel get ${Date.now() - startTime}`);
200
+ return resultItems;
201
+ }
202
+ async parallelQuery(valueConstructor, keyConditions, maxConcurrentCalls = 20, options) {
203
+ const startTime = Date.now();
204
+ const results = [];
205
+ while (keyConditions.length > 0) {
206
+ const segmentConditions = keyConditions.splice(0, maxConcurrentCalls);
207
+ const queryPromises = segmentConditions.map((keyCondition) => {
208
+ return this.customQuery(valueConstructor, keyCondition, options);
209
+ });
210
+ const queryResults = await Promise.all(queryPromises);
211
+ for (const queryResult of queryResults) {
212
+ results.push(...queryResult);
213
+ }
214
+ }
215
+ console.log(`total time for complete parallel query ${Date.now() - startTime}`);
216
+ return results;
217
+ }
218
+ async customQuery(valueConstructor, keyConditions, options) {
219
+ const startTime = Date.now();
220
+ const items = [];
221
+ for await (const item of exports.mapper.query(valueConstructor, keyConditions, options)) {
222
+ items.push(item);
223
+ }
224
+ console.log(`total time for complete query ${Date.now() - startTime}`);
225
+ return items;
226
+ }
227
+ decode(continuationToken) {
228
+ if (continuationToken) {
229
+ try {
230
+ let lastEvaluatedKey = JSON.parse(Buffer.from(continuationToken, 'base64').toString('utf8'));
231
+ console.log("Incoming Last Evaluated Key " + lastEvaluatedKey);
232
+ return lastEvaluatedKey;
233
+ }
234
+ catch (error) {
235
+ throw new Error('Invalid continuationToken');
236
+ }
237
+ }
238
+ return undefined;
239
+ }
240
+ async encode(lastEvaluatedKey) {
241
+ return Buffer.from(JSON.stringify(lastEvaluatedKey)).toString('base64');
242
+ }
243
+ }
244
+ exports.GenericDAO = GenericDAO;
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJiYXNlLWRhby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4REFBb0Q7QUFDcEQsNkNBTzBCO0FBTWIsUUFBQSxRQUFRLEdBQUcsSUFBSSwwQkFBUSxDQUFDO0lBQ2pDLFdBQVcsRUFBRSxFQUFFO0NBQ2xCLENBQVEsQ0FBQTtBQUNJLFFBQUEsTUFBTSxHQUFHLElBQUksbUJBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxnQkFBUSxFQUFFLENBQUMsQ0FBQztBQUUzRCxNQUFhLFVBQVU7SUFDbkIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFVLEVBQUUsU0FBUyxHQUFHLEdBQUc7UUFDekMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQzdDLElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQTtRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3RDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQy9DLElBQUksT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNoRCxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQy9CLE9BQU8sSUFBSSxDQUFDLENBQUE7b0JBQ1osV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JB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LGdDQXFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER5bmFtb0RCIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiJztcbmltcG9ydCB7XG4gICAgRGF0YU1hcHBlcixcbiAgICBQYXJhbGxlbFNjYW5PcHRpb25zLFxuICAgIFBhcmFsbGVsU2Nhbldvcmtlck9wdGlvbnMsXG4gICAgUXVlcnlPcHRpb25zLFxuICAgIFJlYWRDb25zaXN0ZW5jeSxcbiAgICBTY2FuT3B0aW9uc1xufSBmcm9tICdAbm92YS1vZG0vbWFwcGVyJztcbmltcG9ydCB7IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvciB9IGZyb20gJ0Bub3ZhLW9kbS9tYXJzaGFsbGVyJztcbmltcG9ydCB7IENvbmRpdGlvbkV4cHJlc3Npb24sIENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfSBmcm9tICdAbm92YS1vZG0vZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSAnLi9iYXNlLW1vZGVsJztcblxuXG5leHBvcnQgY29uc3QgZHluYW1vREIgPSBuZXcgRHluYW1vREIoe1xuICAgIG1heEF0dGVtcHRzOiAxMFxufSkgYXMgYW55XG5leHBvcnQgY29uc3QgbWFwcGVyID0gbmV3IERhdGFNYXBwZXIoeyBjbGllbnQ6IGR5bmFtb0RCIH0pO1xuXG5leHBvcnQgY2xhc3MgR2VuZXJpY0RBTzxUIGV4dGVuZHMgQmFzZU1vZGVsPiB7XG4gICAgYXN5bmMgYmF0Y2hVcGRhdGUoaXRlbXM6IFRbXSwgYmF0Y2hTaXplID0gMTAwKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IHN1Y2Nlc3MgPSAwLCB0b3RhbFRvVXBkYXRlID0gaXRlbXMubGVuZ3RoXG4gICAgICAgIGxldCB1cGRhdGVJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcm9taXNlcyA9IFtdXG4gICAgICAgICAgICBsZXQgYmF0Y2ggPSBpdGVtcy5zcGxpY2UoMCwgYmF0Y2hTaXplKVxuICAgICAgICAgICAgcHJvbWlzZXMgPSBiYXRjaC5tYXAoaXRlbSA9PiB0aGlzLnVwZGF0ZShpdGVtKSlcbiAgICAgICAgICAgIGxldCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHByb21pc2VzKVxuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzICs9IDFcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbXMucHVzaChyZXN1bHQudmFsdWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAke3N1Y2Nlc3N9LyR7dG90YWxUb1VwZGF0ZX1gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cGRhdGVJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHBhcmFsbGVsQmF0Y2hQdXQoaW5wdXRJdGVtczogVFtdLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIG1heENvbmN1cnJlbnRTZWdtZW50czogbnVtYmVyID0gMjApOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgICAvLyBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCBwdXRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoUHV0KGJhdGNoKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2VnbWVudCBjb21wbGV0ZVwiKVxuICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHB1dEl0ZW1zID0gcHV0SXRlbXMuY29uY2F0KHJlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGltZSBmb3Igc2VnbWVudCBwdXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHB1dCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgcmV0dXJuIHB1dEl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaERlbGV0ZShpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHB1dEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hEZWxldGUoYmF0Y2gpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcHV0SXRlbXMgPSBwdXRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGRlbGV0ZSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZGVsZXRlICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcHV0SXRlbXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSB1c2VkIG9ubHkgaW4gdGhlIHNjcmlwdHMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlQ29uc3RydWN0b3IgdGhlIG1vZGVsIGNsYXNzXG4gICAgICovXG4gICAgYXN5bmMgcGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPiwgb3B0aW9ucz86IFBhcmFsbGVsU2Nhbk9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIucGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3IsIDQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICUgMTAwMDAwID09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYWQgMTAwS1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHNjYW4odmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LCBvcHRpb25zPzogU2Nhbk9wdGlvbnMgfCBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnNjYW4odmFsdWVDb25zdHJ1Y3Rvciwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlKGl0ZW06IFQpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgIC8vIGl0ZW0uY3JlYXRlZF91c2VyID0gYXV0aENvbnRleHQudXNlclN1YlxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBtYXBwZXIucHV0KGl0ZW0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyB1cGRhdGUoaXRlbTogVCk6IFByb21pc2U8VD4ge1xuICAgICAgICBpdGVtLnVwZGF0ZWRfdGltZSA9IG5ldyBEYXRlKClcbiAgICAgICAgLy8gaXRlbS51cGRhdGVkX3VzZXIgPSBhdXRoQ29udGV4dC51c2VyU3ViXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG1hcHBlci51cGRhdGUoaXRlbSwge1xuICAgICAgICAgICAgb25NaXNzaW5nOiBcInNraXBcIlxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlKGl0ZW06IFQpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG1hcHBlci5kZWxldGUoaXRlbSwgeyByZXR1cm5WYWx1ZXM6IFwiQUxMX09MRFwiIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0KGl0ZW06IFQsIHJlYWRDb25zaXN0ZW5jeTogUmVhZENvbnNpc3RlbmN5ID0gXCJldmVudHVhbFwiKTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG1hcHBlci5nZXQoaXRlbSwge1xuICAgICAgICAgICAgcmVhZENvbnNpc3RlbmN5OiByZWFkQ29uc2lzdGVuY3lcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgIH1cblxuICAgIGFzeW5jIGJhdGNoUHV0KGl0ZW1zOiBUW10pOiBQcm9taXNlPFRbXT4ge1xuXG4gICAgICAgIGxldCBmaW5hbEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBpdGVtcyA9IGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICAgICAgLy8gaXRlbS5jcmVhdGVkX3VzZXIgPSBhdXRoQ29udGV4dC51c2VyU3ViXG4gICAgICAgICAgICByZXR1cm4gaXRlbVxuICAgICAgICB9KVxuICAgICAgICAvLyBjb25zb2xlLmxvZyggXCJpdGVtOlwiLCBpdGVtcyApXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIuYmF0Y2hQdXQoaXRlbXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAgICAgICAgZmluYWxJdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsSXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaERlbGV0ZShpdGVtczogVFtdKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGRlbGV0ZUl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoRGVsZXRlKGl0ZW1zKSkge1xuICAgICAgICAgICAgZGVsZXRlSXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIGJhdGNoR2V0KGl0ZW1zOiBUW10sIHJlYWRDb25zaXN0ZW5jeTogUmVhZENvbnNpc3RlbmN5ID0gXCJldmVudHVhbFwiKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGdldEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoR2V0KGl0ZW1zLCB7XG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6IHJlYWRDb25zaXN0ZW5jeVxuICAgICAgICB9KSkge1xuICAgICAgICAgICAgZ2V0SXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHBhcmFsbGVsQmF0Y2hHZXQoaW5wdXRJdGVtczogVFtdLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIG1heENvbmN1cnJlbnRTZWdtZW50czogbnVtYmVyID0gMjAsIHJlYWRDb25zaXN0ZW5jeT86IFJlYWRDb25zaXN0ZW5jeSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHJlc3VsdEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hHZXQoYmF0Y2gsIHJlYWRDb25zaXN0ZW5jeSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNlZ21lbnQgY29tcGxldGVcIilcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRJdGVtcyA9IHJlc3VsdEl0ZW1zLmNvbmNhdChyZXMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYHRpbWUgZm9yIHNlZ21lbnQgZ2V0ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGB0b3RhbCB0aW1lIGZvciBjb21wbGV0ZSBwYXJhbGxlbCBnZXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiByZXN1bHRJdGVtc1xuICAgIH1cbiAgICBhc3luYyBwYXJhbGxlbFF1ZXJ5KFxuICAgICAgICB2YWx1ZUNvbnN0cnVjdG9yOiBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3I8VD4sXG4gICAgICAgIGtleUNvbmRpdGlvbnM6IEFycmF5PENvbmRpdGlvbkV4cHJlc3Npb24gfCB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfCBhbnkgfT4sXG4gICAgICAgIG1heENvbmN1cnJlbnRDYWxsczogbnVtYmVyID0gMjAsXG4gICAgICAgIG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMsXG5cbiAgICApOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChrZXlDb25kaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRDb25kaXRpb25zID0ga2V5Q29uZGl0aW9ucy5zcGxpY2UoMCwgbWF4Q29uY3VycmVudENhbGxzKVxuICAgICAgICAgICAgY29uc3QgcXVlcnlQcm9taXNlcyA9IHNlZ21lbnRDb25kaXRpb25zLm1hcCgoa2V5Q29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tUXVlcnkodmFsdWVDb25zdHJ1Y3Rvciwga2V5Q29uZGl0aW9uLCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyeVByb21pc2VzKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHF1ZXJ5UmVzdWx0IG9mIHF1ZXJ5UmVzdWx0cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5xdWVyeVJlc3VsdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgcXVlcnkgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgY3VzdG9tUXVlcnkoXG4gICAgICAgIHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPixcbiAgICAgICAga2V5Q29uZGl0aW9uczogQ29uZGl0aW9uRXhwcmVzc2lvbiB8IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogQ29uZGl0aW9uRXhwcmVzc2lvblByZWRpY2F0ZSB8IGFueSB9LFxuICAgICAgICBvcHRpb25zPzogUXVlcnlPcHRpb25zXG4gICAgKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBpdGVtczogVFtdID0gW11cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnF1ZXJ5KHZhbHVlQ29uc3RydWN0b3IsIGtleUNvbmRpdGlvbnMsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHF1ZXJ5ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cbiAgICBkZWNvZGUoY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoY29udGludWF0aW9uVG9rZW4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RFdmFsdWF0ZWRLZXkgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGNvbnRpbnVhdGlvblRva2VuLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJbmNvbWluZyBMYXN0IEV2YWx1YXRlZCBLZXkgXCIgKyBsYXN0RXZhbHVhdGVkS2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdEV2YWx1YXRlZEtleTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvblRva2VuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGFzeW5jIGVuY29kZShsYXN0RXZhbHVhdGVkS2V5OiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkobGFzdEV2YWx1YXRlZEtleSkpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIH1cbn0iXX0=
@@ -0,0 +1,6 @@
1
+ export declare class BaseModel {
2
+ created_time?: Date;
3
+ updated_time?: Date;
4
+ created_user?: string;
5
+ updated_user?: string;
6
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.BaseModel = void 0;
10
+ const annotations_1 = require("@nova-odm/annotations");
11
+ class BaseModel {
12
+ }
13
+ exports.BaseModel = BaseModel;
14
+ __decorate([
15
+ (0, annotations_1.attribute)({ type: 'Date' })
16
+ ], BaseModel.prototype, "created_time", void 0);
17
+ __decorate([
18
+ (0, annotations_1.attribute)({ type: 'Date' })
19
+ ], BaseModel.prototype, "updated_time", void 0);
20
+ __decorate([
21
+ (0, annotations_1.attribute)()
22
+ ], BaseModel.prototype, "created_user", void 0);
23
+ __decorate([
24
+ (0, annotations_1.attribute)()
25
+ ], BaseModel.prototype, "updated_user", void 0);
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJhc2UtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsdURBQWtEO0FBRWxELE1BQWEsU0FBUztDQVNyQjtBQVRELDhCQVNDO0FBUEc7SUFEQyxJQUFBLHVCQUFTLEVBQUMsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUM7K0NBQ047QUFFcEI7SUFEQyxJQUFBLHVCQUFTLEVBQUMsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUM7K0NBQ047QUFFcEI7SUFEQyxJQUFBLHVCQUFTLEdBQUU7K0NBQ1c7QUFFdkI7SUFEQyxJQUFBLHVCQUFTLEdBQUU7K0NBQ1ciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhdHRyaWJ1dGUgfSBmcm9tIFwiQG5vdmEtb2RtL2Fubm90YXRpb25zXCI7XG5cbmV4cG9ydCBjbGFzcyBCYXNlTW9kZWwge1xuICAgIEBhdHRyaWJ1dGUoe3R5cGU6ICdEYXRlJ30pXG4gICAgY3JlYXRlZF90aW1lPzogRGF0ZTtcbiAgICBAYXR0cmlidXRlKHt0eXBlOiAnRGF0ZSd9KVxuICAgIHVwZGF0ZWRfdGltZT86IERhdGU7XG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgY3JlYXRlZF91c2VyPzogc3RyaW5nIDtcbiAgICBAYXR0cmlidXRlKClcbiAgICB1cGRhdGVkX3VzZXI/OiBzdHJpbmcgO1xufSJdfQ==
@@ -0,0 +1,7 @@
1
+ import { GenericDAO } from "../base-dao";
2
+ import { InternalUserModel } from "./internal-user-model";
3
+ declare class InternalUserDAO extends GenericDAO<InternalUserModel> {
4
+ checkEmailExists(email: String): Promise<void>;
5
+ }
6
+ export declare const internalUserDao: InternalUserDAO;
7
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.internalUserDao = void 0;
4
+ const base_dao_1 = require("../base-dao");
5
+ const internal_user_model_1 = require("./internal-user-model");
6
+ class InternalUserDAO extends base_dao_1.GenericDAO {
7
+ async checkEmailExists(email) {
8
+ const Items = base_dao_1.mapper.query(internal_user_model_1.InternalUserModel, { emailId: email }, { indexName: 'emailIndex' });
9
+ const allItems = [];
10
+ for await (const item of Items) {
11
+ allItems.push(item);
12
+ }
13
+ if (allItems.length > 0) {
14
+ throw (new Error(`${email}:Email already Taken`));
15
+ }
16
+ }
17
+ }
18
+ exports.internalUserDao = new InternalUserDAO();
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtdXNlci1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlcm5hbC11c2VyLWRhby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwQ0FBaUQ7QUFDakQsK0RBQTBEO0FBRzFELE1BQU0sZUFBZ0IsU0FBUSxxQkFBNkI7SUFFdkQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWE7UUFDaEMsTUFBTSxLQUFLLEdBQUcsaUJBQU0sQ0FBQyxLQUFLLENBQUMsdUNBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQTtRQUM5RixNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO1FBRXpDLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQzdCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBRUwsQ0FBQztDQUNKO0FBRVksUUFBQSxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdlbmVyaWNEQU8sIG1hcHBlciB9IGZyb20gXCIuLi9iYXNlLWRhb1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxVc2VyTW9kZWwgfSBmcm9tIFwiLi9pbnRlcm5hbC11c2VyLW1vZGVsXCI7XG5cblxuY2xhc3MgSW50ZXJuYWxVc2VyREFPIGV4dGVuZHMgR2VuZXJpY0RBTzxJbnRlcm5hbFVzZXJNb2RlbD4ge1xuXG4gICAgYXN5bmMgY2hlY2tFbWFpbEV4aXN0cyhlbWFpbDogU3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IEl0ZW1zID0gbWFwcGVyLnF1ZXJ5KEludGVybmFsVXNlck1vZGVsLCB7IGVtYWlsSWQ6IGVtYWlsIH0sIHsgaW5kZXhOYW1lOiAnZW1haWxJbmRleCcgfSlcbiAgICAgICAgY29uc3QgYWxsSXRlbXM6IEludGVybmFsVXNlck1vZGVsW10gPSBbXTtcblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgSXRlbXMpIHtcbiAgICAgICAgICAgIGFsbEl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhyb3cgKG5ldyBFcnJvcihgJHtlbWFpbH06RW1haWwgYWxyZWFkeSBUYWtlbmApKTtcbiAgICAgICAgfVxuXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaW50ZXJuYWxVc2VyRGFvID0gbmV3IEludGVybmFsVXNlckRBTygpOyJdfQ==
@@ -0,0 +1,11 @@
1
+ import { BaseModel } from "../base-model";
2
+ export declare class InternalUserModel extends BaseModel {
3
+ userId: string;
4
+ role?: string;
5
+ department?: string;
6
+ userName?: string;
7
+ phoneNumber: string;
8
+ emailId?: string;
9
+ dob?: string;
10
+ gender?: string;
11
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.InternalUserModel = void 0;
10
+ const annotations_1 = require("@nova-odm/annotations");
11
+ const base_model_1 = require("../base-model");
12
+ let InternalUserModel = class InternalUserModel extends base_model_1.BaseModel {
13
+ };
14
+ exports.InternalUserModel = InternalUserModel;
15
+ __decorate([
16
+ (0, annotations_1.hashKey)({ type: 'String' })
17
+ ], InternalUserModel.prototype, "userId", void 0);
18
+ __decorate([
19
+ (0, annotations_1.attribute)()
20
+ ], InternalUserModel.prototype, "role", void 0);
21
+ __decorate([
22
+ (0, annotations_1.attribute)()
23
+ ], InternalUserModel.prototype, "department", void 0);
24
+ __decorate([
25
+ (0, annotations_1.attribute)()
26
+ ], InternalUserModel.prototype, "userName", void 0);
27
+ __decorate([
28
+ (0, annotations_1.attribute)()
29
+ ], InternalUserModel.prototype, "phoneNumber", void 0);
30
+ __decorate([
31
+ (0, annotations_1.attribute)({
32
+ indexKeyConfigurations: { "emailIndex": "HASH" }, type: 'String'
33
+ })
34
+ ], InternalUserModel.prototype, "emailId", void 0);
35
+ __decorate([
36
+ (0, annotations_1.attribute)()
37
+ ], InternalUserModel.prototype, "dob", void 0);
38
+ __decorate([
39
+ (0, annotations_1.attribute)()
40
+ ], InternalUserModel.prototype, "gender", void 0);
41
+ exports.InternalUserModel = InternalUserModel = __decorate([
42
+ (0, annotations_1.table)("InternalUserTable")
43
+ ], InternalUserModel);
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtdXNlci1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImludGVybmFsLXVzZXItbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0EsdURBQWtFO0FBQ2xFLDhDQUEwQztBQUduQyxJQUFNLGlCQUFpQixHQUF2QixNQUFNLGlCQUFrQixTQUFRLHNCQUFTO0NBcUIvQyxDQUFBO0FBckJZLDhDQUFpQjtBQUUxQjtJQURDLElBQUEscUJBQU8sRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztpREFDYjtBQUVmO0lBREMsSUFBQSx1QkFBUyxHQUFFOytDQUNFO0FBRWQ7SUFEQyxJQUFBLHVCQUFTLEdBQUU7cURBQ1E7QUFFcEI7SUFEQyxJQUFBLHVCQUFTLEdBQUU7bURBQ007QUFFbEI7SUFEQyxJQUFBLHVCQUFTLEdBQUU7c0RBQ1E7QUFNcEI7SUFMQyxJQUFBLHVCQUFTLEVBQ047UUFDSSxzQkFBc0IsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUTtLQUNuRSxDQUNKO2tEQUNnQjtBQUVqQjtJQURDLElBQUEsdUJBQVMsR0FBRTs4Q0FDQztBQUViO0lBREMsSUFBQSx1QkFBUyxHQUFFO2lEQUNJOzRCQXBCUCxpQkFBaUI7SUFEN0IsSUFBQSxtQkFBSyxFQUFDLG1CQUFtQixDQUFDO0dBQ2QsaUJBQWlCLENBcUI3QiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgYXR0cmlidXRlLCBoYXNoS2V5LCB0YWJsZSB9IGZyb20gXCJAbm92YS1vZG0vYW5ub3RhdGlvbnNcIjtcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCIuLi9iYXNlLW1vZGVsXCI7XG5cbkB0YWJsZShcIkludGVybmFsVXNlclRhYmxlXCIpXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxVc2VyTW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICAgIEBoYXNoS2V5KHsgdHlwZTogJ1N0cmluZycgfSlcbiAgICB1c2VySWQ6IHN0cmluZztcbiAgICBAYXR0cmlidXRlKClcbiAgICByb2xlPzogc3RyaW5nO1xuICAgIEBhdHRyaWJ1dGUoKVxuICAgIGRlcGFydG1lbnQ/OiBzdHJpbmc7XG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgdXNlck5hbWU/OiBzdHJpbmc7XG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgcGhvbmVOdW1iZXI6IHN0cmluZztcbiAgICBAYXR0cmlidXRlKFxuICAgICAgICB7XG4gICAgICAgICAgICBpbmRleEtleUNvbmZpZ3VyYXRpb25zOiB7IFwiZW1haWxJbmRleFwiOiBcIkhBU0hcIiB9LCB0eXBlOiAnU3RyaW5nJ1xuICAgICAgICB9XG4gICAgKVxuICAgIGVtYWlsSWQ/OiBzdHJpbmc7XG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgZG9iPzogc3RyaW5nO1xuICAgIEBhdHRyaWJ1dGUoKVxuICAgIGdlbmRlcj86IHN0cmluZztcbn0iXX0=
File without changes
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ // import * as cdk from 'aws-cdk-lib';
3
+ // import { Template } from 'aws-cdk-lib/assertions';
4
+ // import * as CraftMyPlateDatabase from '../lib/craft-my-plate-database-stack';
5
+ // example test. To run these tests, uncomment this file along with the
6
+ // example resource in lib/craft-my-plate-database-stack.ts
7
+ test('SQS Queue Created', () => {
8
+ // const app = new cdk.App();
9
+ // // WHEN
10
+ // const stack = new CraftMyPlateDatabase.CraftMyPlateDatabaseStack(app, 'MyTestStack');
11
+ // // THEN
12
+ // const template = Template.fromStack(stack);
13
+ // template.hasResourceProperties('AWS::SQS::Queue', {
14
+ // VisibilityTimeout: 300
15
+ // });
16
+ });
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JhZnQtbXktcGxhdGUtZGF0YWJhc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNyYWZ0LW15LXBsYXRlLWRhdGFiYXNlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHNDQUFzQztBQUN0QyxxREFBcUQ7QUFDckQsZ0ZBQWdGO0FBRWhGLHVFQUF1RTtBQUN2RSwyREFBMkQ7QUFDM0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUMvQiwrQkFBK0I7SUFDL0IsY0FBYztJQUNkLDBGQUEwRjtJQUMxRixjQUFjO0lBQ2QsZ0RBQWdEO0lBRWhELHdEQUF3RDtJQUN4RCw2QkFBNkI7SUFDN0IsUUFBUTtBQUNSLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbi8vIGltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG4vLyBpbXBvcnQgKiBhcyBDcmFmdE15UGxhdGVEYXRhYmFzZSBmcm9tICcuLi9saWIvY3JhZnQtbXktcGxhdGUtZGF0YWJhc2Utc3RhY2snO1xuXG4vLyBleGFtcGxlIHRlc3QuIFRvIHJ1biB0aGVzZSB0ZXN0cywgdW5jb21tZW50IHRoaXMgZmlsZSBhbG9uZyB3aXRoIHRoZVxuLy8gZXhhbXBsZSByZXNvdXJjZSBpbiBsaWIvY3JhZnQtbXktcGxhdGUtZGF0YWJhc2Utc3RhY2sudHNcbnRlc3QoJ1NRUyBRdWV1ZSBDcmVhdGVkJywgKCkgPT4ge1xuLy8gICBjb25zdCBhcHAgPSBuZXcgY2RrLkFwcCgpO1xuLy8gICAgIC8vIFdIRU5cbi8vICAgY29uc3Qgc3RhY2sgPSBuZXcgQ3JhZnRNeVBsYXRlRGF0YWJhc2UuQ3JhZnRNeVBsYXRlRGF0YWJhc2VTdGFjayhhcHAsICdNeVRlc3RTdGFjaycpO1xuLy8gICAgIC8vIFRIRU5cbi8vICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4vLyAgIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTUVM6OlF1ZXVlJywge1xuLy8gICAgIFZpc2liaWxpdHlUaW1lb3V0OiAzMDBcbi8vICAgfSk7XG59KTtcbiJdfQ==
package/tsconfig.json CHANGED
@@ -1,5 +1,9 @@
1
1
  {
2
2
  "compilerOptions": {
3
+ "outDir": "./dist",
4
+ "rootDir": "./src",
5
+ "esModuleInterop": true,
6
+ "skipLibCheck": true,
3
7
  "target": "ES2020",
4
8
  "module": "commonjs",
5
9
  "lib": [
@@ -24,8 +28,11 @@
24
28
  "./node_modules/@types"
25
29
  ]
26
30
  },
31
+ "include": [
32
+ "src/**/*"
33
+ ],
27
34
  "exclude": [
28
35
  "node_modules",
29
36
  "cdk.out"
30
37
  ]
31
- }
38
+ }