cmp-aws-database 1.1.106 → 1.1.107-dev.1

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 CHANGED
@@ -1,14 +1,232 @@
1
- # Welcome to your CDK TypeScript project
1
+ # Craft My Plate Database Package
2
2
 
3
- This is a blank project for CDK development with TypeScript.
3
+ A comprehensive, environment-aware database package for the Craft My Plate application ecosystem. This package provides DynamoDB-based data access with automatic environment configuration.
4
4
 
5
- The `cdk.json` file tells the CDK Toolkit how to execute your app.
5
+ ## 🚀 Features
6
6
 
7
- ## Useful commands
7
+ - **Environment-Aware Configuration**: Automatically adapts to development, staging, production, and test environments
8
+ - **Dynamic Table Naming**: Environment-specific table prefixes (dev-, staging-, test-)
9
+ - **Feature Flags**: Environment-specific feature toggles (parallel processing, caching, etc.)
10
+ - **TypeScript Support**: Full TypeScript definitions and type safety
11
+ - **AWS CDK Integration**: Infrastructure as Code for database tables
12
+ - **Comprehensive DAO Layer**: Generic data access objects with environment-specific optimizations
8
13
 
9
- * `npm run build` compile typescript to js
10
- * `npm run watch` watch for changes and compile
11
- * `npm run test` perform the jest unit tests
12
- * `npx cdk deploy` deploy this stack to your default AWS account/region
13
- * `npx cdk diff` compare deployed stack with current state
14
- * `npx cdk synth` emits the synthesized CloudFormation template
14
+ ## 📦 Installation
15
+
16
+ ```bash
17
+ npm install cmp-aws-database
18
+ ```
19
+
20
+ ## 🎯 Quick Start
21
+
22
+ ### Basic Usage
23
+
24
+ ```typescript
25
+ import {
26
+ envManager,
27
+ TABLE_NAMES,
28
+ UserModel,
29
+ userDAO
30
+ } from 'cmp-aws-database';
31
+
32
+ // Check current environment
33
+ console.log('Environment:', envManager.getEnvironment());
34
+
35
+ // Use environment-aware table names
36
+ const userTableName = TABLE_NAMES.USER;
37
+
38
+ // Create and save a user
39
+ const user = new UserModel();
40
+ user.userId = 'user123';
41
+ user.email = 'test@example.com';
42
+
43
+ const savedUser = await userDAO.save(user, { userSub: 'auth-user-123' });
44
+ ```
45
+
46
+ ### Environment Configuration
47
+
48
+ The package automatically detects the environment based on `NODE_ENV` or `ENVIRONMENT` variables:
49
+
50
+ ```bash
51
+ # Development
52
+ export NODE_ENV=development
53
+
54
+ # Staging
55
+ export NODE_ENV=staging
56
+
57
+ # Production
58
+ export NODE_ENV=production
59
+
60
+ # Test
61
+ export NODE_ENV=test
62
+ ```
63
+
64
+ ## 🌍 Environment-Specific Behavior
65
+
66
+ ### Development Environment
67
+ - **Database**: Local DynamoDB (http://localhost:8000)
68
+ - **Table Prefix**: `dev-`
69
+ - **Features**: Sequential processing, no caching
70
+ - **Logging**: Debug level
71
+
72
+ ### Staging Environment
73
+ - **Database**: AWS DynamoDB
74
+ - **Table Prefix**: `staging-`
75
+ - **Features**: Parallel processing, caching enabled
76
+ - **Logging**: Info level
77
+
78
+ ### Production Environment
79
+ - **Database**: AWS DynamoDB
80
+ - **Table Prefix**: None (empty)
81
+ - **Features**: Parallel processing, caching enabled
82
+ - **Logging**: Warn level
83
+
84
+ ### Test Environment
85
+ - **Database**: Local DynamoDB (http://localhost:8000)
86
+ - **Table Prefix**: `test-`
87
+ - **Features**: Sequential processing, no caching
88
+ - **Logging**: Error level
89
+
90
+ ## 📚 Available Models and DAOs
91
+
92
+ ### Customer User Models
93
+ - `UserModel` / `userDAO`
94
+ - `OrderModel` / `orderDao`
95
+ - `CartModel` / `cartDAO`
96
+ - `WalletModel` / `walletDao`
97
+ - `PaymentModel` / `paymentDao`
98
+ - And many more...
99
+
100
+ ### Internal User Models
101
+ - `InternalUserModel` / `internalUserDao`
102
+ - `ActivityLogsModel` / `activityLogsDao`
103
+ - `QuotationsModel` / `quotationsDao`
104
+
105
+ ## 🔧 Advanced Usage
106
+
107
+ ### Environment-Specific Features
108
+
109
+ ```typescript
110
+ import { envManager } from 'cmp-aws-database';
111
+
112
+ const config = envManager.getConfig();
113
+
114
+ // Check if parallel processing is enabled
115
+ if (config.features.enableParallelProcessing) {
116
+ await userDAO.parallelBatchGet(users);
117
+ } else {
118
+ await userDAO.batchGet(users);
119
+ }
120
+
121
+ // Check if caching is enabled
122
+ if (config.features.enableCaching) {
123
+ // Implement caching logic
124
+ }
125
+ ```
126
+
127
+ ### Custom Table Names
128
+
129
+ ```typescript
130
+ import { TableNameManager } from 'cmp-aws-database';
131
+
132
+ const customTableName = TableNameManager.getTableName('MyCustomTable');
133
+ // Returns: dev-MyCustomTable, staging-MyCustomTable, or MyCustomTable
134
+ ```
135
+
136
+ ### Environment Override (Testing)
137
+
138
+ ```typescript
139
+ import { envManager } from 'cmp-aws-database';
140
+
141
+ // Override environment for testing
142
+ envManager.setEnvironment('test');
143
+ ```
144
+
145
+ ## 🏗️ Infrastructure
146
+
147
+ ### CDK Stack Deployment
148
+
149
+ ```typescript
150
+ import { CustomerAppDbStack, InternalUserDbStack } from 'cmp-aws-database';
151
+
152
+ // Deploy customer app database
153
+ const customerStack = new CustomerAppDbStack(app, 'CustomerAppDbStack');
154
+
155
+ // Deploy internal user database
156
+ const internalStack = new InternalUserDbStack(app, 'InternalUserDbStack');
157
+ ```
158
+
159
+ ### Available Tables
160
+
161
+ The package includes pre-configured tables for:
162
+ - User management
163
+ - Order processing
164
+ - Payment handling
165
+ - Inventory management
166
+ - Analytics and reporting
167
+ - And much more...
168
+
169
+ ## 🔍 Debugging
170
+
171
+ ### Environment Information
172
+
173
+ ```typescript
174
+ import { envManager } from 'cmp-aws-database';
175
+
176
+ console.log('Current environment:', envManager.getEnvironment());
177
+ console.log('Database config:', envManager.getDatabaseConfig());
178
+ console.log('Features enabled:', envManager.getConfig().features);
179
+ ```
180
+
181
+ ### Table Name Resolution
182
+
183
+ ```typescript
184
+ import { TABLE_NAMES, BASE_TABLE_NAMES } from 'cmp-aws-database';
185
+
186
+ console.log('Environment-aware table names:', TABLE_NAMES);
187
+ console.log('Base table names:', BASE_TABLE_NAMES);
188
+ ```
189
+
190
+ ## 📋 Migration Guide
191
+
192
+ ### From Hardcoded Configuration
193
+
194
+ **Before:**
195
+ ```typescript
196
+ const tableName = 'UserTable';
197
+ const client = new DynamoDB({ maxAttempts: 10 });
198
+ ```
199
+
200
+ **After:**
201
+ ```typescript
202
+ import { TABLE_NAMES, DatabaseFactory } from 'cmp-aws-database';
203
+
204
+ const tableName = TABLE_NAMES.USER;
205
+ const client = DatabaseFactory.getDynamoDBClient();
206
+ ```
207
+
208
+ ## 🤝 Contributing
209
+
210
+ 1. Fork the repository
211
+ 2. Create a feature branch
212
+ 3. Make your changes
213
+ 4. Add tests for new functionality
214
+ 5. Submit a pull request
215
+
216
+ ## 📄 License
217
+
218
+ Apache-2.0
219
+
220
+ ## 🆘 Support
221
+
222
+ - **Issues**: [GitHub Issues](https://github.com/Surajpatel24-craftmyplate/craft-my-plate-database/issues)
223
+ - **Documentation**: [Package Documentation](https://github.com/Surajpatel24-craftmyplate/craft-my-plate-database#readme)
224
+
225
+ ## 🔄 Version History
226
+
227
+ - **1.1.107**: Current version with environment-aware configuration
228
+ - **Previous versions**: Legacy hardcoded configuration
229
+
230
+ ---
231
+
232
+ **Note**: This package is designed to work seamlessly across different environments while maintaining the same API. The environment-specific behavior is handled internally, so your application code remains consistent across all environments.
@@ -1,8 +1,9 @@
1
+ import { DynamoDB } from '@aws-sdk/client-dynamodb';
1
2
  import { DataMapper, ParallelScanOptions, ParallelScanWorkerOptions, QueryOptions, ReadConsistency, ScanOptions } from '@nova-odm/mapper';
2
3
  import { ZeroArgumentsConstructor } from '@nova-odm/marshaller';
3
4
  import { ConditionExpression, ConditionExpressionPredicate } from '@nova-odm/expressions';
4
5
  import { BaseModel } from './base-model';
5
- export declare const dynamoDB: any;
6
+ export declare const dynamoDB: DynamoDB;
6
7
  export declare const mapper: DataMapper;
7
8
  export declare class GenericDAO<T extends BaseModel> {
8
9
  batchUpdate(items: T[], batchSize?: number, authContext?: any): Promise<T[]>;
package/dist/base-dao.js CHANGED
@@ -1,12 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
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 });
4
+ const database_factory_1 = require("./config/database-factory");
5
+ const environment_config_1 = require("./config/environment-config");
6
+ // Use environment-aware database instances
7
+ exports.dynamoDB = database_factory_1.DatabaseFactory.getDynamoDBClient();
8
+ exports.mapper = database_factory_1.DatabaseFactory.getDataMapper();
10
9
  class GenericDAO {
11
10
  async batchUpdate(items, batchSize = 100, authContext) {
12
11
  let success = 0, totalToUpdate = items.length;
@@ -132,9 +131,12 @@ class GenericDAO {
132
131
  async delete(item) {
133
132
  return await exports.mapper.delete(item, { returnValues: "ALL_OLD" });
134
133
  }
135
- async get(item, readConsistency = "eventual") {
134
+ async get(item, readConsistency) {
135
+ // Use environment-specific read consistency if not provided
136
+ const config = environment_config_1.envManager.getDatabaseConfig();
137
+ const consistency = readConsistency || config.readConsistency;
136
138
  const res = await exports.mapper.get(item, {
137
- readConsistency: readConsistency
139
+ readConsistency: consistency
138
140
  });
139
141
  return res;
140
142
  }
@@ -159,16 +161,25 @@ class GenericDAO {
159
161
  }
160
162
  return deleteItems;
161
163
  }
162
- async batchGet(items, readConsistency = "eventual") {
164
+ async batchGet(items, readConsistency) {
165
+ // Use environment-specific read consistency if not provided
166
+ const config = environment_config_1.envManager.getDatabaseConfig();
167
+ const consistency = readConsistency || config.readConsistency;
163
168
  let getItems = [];
164
169
  for await (const item of exports.mapper.batchGet(items, {
165
- readConsistency: readConsistency
170
+ readConsistency: consistency
166
171
  })) {
167
172
  getItems.push(item);
168
173
  }
169
174
  return getItems;
170
175
  }
171
176
  async parallelBatchGet(inputItems, batchSize = 1000, maxConcurrentSegments = 20, readConsistency) {
177
+ // Check if parallel processing is enabled for this environment
178
+ const config = environment_config_1.envManager.getConfig();
179
+ if (!config.features.enableParallelProcessing) {
180
+ console.warn('Parallel processing is disabled for this environment. Using sequential processing.');
181
+ return this.batchGet(inputItems, readConsistency);
182
+ }
172
183
  let startTime = Date.now();
173
184
  let items = [];
174
185
  items = items.concat(inputItems);
@@ -242,4 +253,4 @@ class GenericDAO {
242
253
  }
243
254
  }
244
255
  exports.GenericDAO = GenericDAO;
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmFzZS1kYW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOERBQW9EO0FBQ3BELDZDQU8wQjtBQU1iLFFBQUEsUUFBUSxHQUFHLElBQUksMEJBQVEsQ0FBQztJQUNqQyxXQUFXLEVBQUUsRUFBRTtDQUNsQixDQUFRLENBQUE7QUFDSSxRQUFBLE1BQU0sR0FBRyxJQUFJLG1CQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsZ0JBQVEsRUFBRSxDQUFDLENBQUM7QUFFM0QsTUFBYSxVQUFVO0lBQ25CLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBVSxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUUsV0FBaUI7UUFDNUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQzdDLElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQTtRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3RDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtZQUM1RCxJQUFJLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUMvQixPQUFPLElBQUksQ0FBQyxDQUFBO29CQUNaLFdBQVcsQ0FBQyxJQUFJLENBQUMs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Q0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUE7SUFDcEIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsZ0JBQXFCO1FBQzlCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDM0UsQ0FBQztDQUNKO0FBclFELGdDQXFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER5bmFtb0RCIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiJztcbmltcG9ydCB7XG4gICAgRGF0YU1hcHBlcixcbiAgICBQYXJhbGxlbFNjYW5PcHRpb25zLFxuICAgIFBhcmFsbGVsU2Nhbldvcmtlck9wdGlvbnMsXG4gICAgUXVlcnlPcHRpb25zLFxuICAgIFJlYWRDb25zaXN0ZW5jeSxcbiAgICBTY2FuT3B0aW9uc1xufSBmcm9tICdAbm92YS1vZG0vbWFwcGVyJztcbmltcG9ydCB7IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvciB9IGZyb20gJ0Bub3ZhLW9kbS9tYXJzaGFsbGVyJztcbmltcG9ydCB7IENvbmRpdGlvbkV4cHJlc3Npb24sIENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfSBmcm9tICdAbm92YS1vZG0vZXhwcmVzc2lvbnMnO1xuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSAnLi9iYXNlLW1vZGVsJztcblxuXG5leHBvcnQgY29uc3QgZHluYW1vREIgPSBuZXcgRHluYW1vREIoe1xuICAgIG1heEF0dGVtcHRzOiAxMFxufSkgYXMgYW55XG5leHBvcnQgY29uc3QgbWFwcGVyID0gbmV3IERhdGFNYXBwZXIoeyBjbGllbnQ6IGR5bmFtb0RCIH0pO1xuXG5leHBvcnQgY2xhc3MgR2VuZXJpY0RBTzxUIGV4dGVuZHMgQmFzZU1vZGVsPiB7XG4gICAgYXN5bmMgYmF0Y2hVcGRhdGUoaXRlbXM6IFRbXSwgYmF0Y2hTaXplID0gMTAwLCBhdXRoQ29udGV4dD86IGFueSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gMCwgdG90YWxUb1VwZGF0ZSA9IGl0ZW1zLmxlbmd0aFxuICAgICAgICBsZXQgdXBkYXRlSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSlcbiAgICAgICAgICAgIHByb21pc2VzID0gYmF0Y2gubWFwKGl0ZW0gPT4gdGhpcy51cGRhdGUoaXRlbSwgYXV0aENvbnRleHQpKVxuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpXG4gICAgICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgKz0gMVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtcy5wdXNoKHJlc3VsdC52YWx1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7c3VjY2Vzc30vJHt0b3RhbFRvVXBkYXRlfWApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaFB1dChpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCwgYXV0aENvbnRleHQ/OiBhbnkpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCBwdXRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoUHV0KGJhdGNoLCBhdXRoQ29udGV4dC51c2VyU3ViKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2VnbWVudCBjb21wbGV0ZVwiKVxuICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHB1dEl0ZW1zID0gcHV0SXRlbXMuY29uY2F0KHJlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGltZSBmb3Igc2VnbWVudCBwdXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHB1dCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgcmV0dXJuIHB1dEl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaERlbGV0ZShpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHB1dEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hEZWxldGUoYmF0Y2gpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcHV0SXRlbXMgPSBwdXRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGRlbGV0ZSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZGVsZXRlICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcHV0SXRlbXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSB1c2VkIG9ubHkgaW4gdGhlIHNjcmlwdHMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlQ29uc3RydWN0b3IgdGhlIG1vZGVsIGNsYXNzXG4gICAgICovXG4gICAgYXN5bmMgcGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPiwgb3B0aW9ucz86IFBhcmFsbGVsU2Nhbk9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIucGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3IsIDQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICUgMTAwMDAwID09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYWQgMTAwS1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHNjYW4odmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LCBvcHRpb25zPzogU2Nhbk9wdGlvbnMgfCBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnNjYW4odmFsdWVDb25zdHJ1Y3Rvciwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlKGl0ZW06IFQsIGF1dGhDb250ZXh0PzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnB1dChpdGVtKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlKGl0ZW06IFQsIGF1dGhDb250ZXh0PzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0udXBkYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICBpdGVtLnVwZGF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnVwZGF0ZShpdGVtLCB7XG4gICAgICAgICAgICBvbk1pc3Npbmc6IFwic2tpcFwiXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoaXRlbTogVCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbWFwcGVyLmRlbGV0ZShpdGVtLCB7IHJldHVyblZhbHVlczogXCJBTExfT0xEXCIgfSlcbiAgICB9XG5cbiAgICBhc3luYyBnZXQoaXRlbTogVCwgcmVhZENvbnNpc3RlbmN5OiBSZWFkQ29uc2lzdGVuY3kgPSBcImV2ZW50dWFsXCIpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLmdldChpdGVtLCB7XG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6IHJlYWRDb25zaXN0ZW5jeVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgYmF0Y2hQdXQoaXRlbXM6IFRbXSwgYXV0aENvbnRleHQ/OiBhbnkpOiBQcm9taXNlPFRbXT4ge1xuXG4gICAgICAgIGxldCBmaW5hbEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBpdGVtcyA9IGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3VzZXIgPSBhdXRoQ29udGV4dC51c2VyU3ViXG4gICAgICAgICAgICByZXR1cm4gaXRlbVxuICAgICAgICB9KVxuICAgICAgICAvLyBjb25zb2xlLmxvZyggXCJpdGVtOlwiLCBpdGVtcyApXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIuYmF0Y2hQdXQoaXRlbXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAgICAgICAgZmluYWxJdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsSXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaERlbGV0ZShpdGVtczogVFtdKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGRlbGV0ZUl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoRGVsZXRlKGl0ZW1zKSkge1xuICAgICAgICAgICAgZGVsZXRlSXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWxldGVJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIGJhdGNoR2V0KGl0ZW1zOiBUW10sIHJlYWRDb25zaXN0ZW5jeTogUmVhZENvbnNpc3RlbmN5ID0gXCJldmVudHVhbFwiKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGdldEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLmJhdGNoR2V0KGl0ZW1zLCB7XG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6IHJlYWRDb25zaXN0ZW5jeVxuICAgICAgICB9KSkge1xuICAgICAgICAgICAgZ2V0SXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHBhcmFsbGVsQmF0Y2hHZXQoaW5wdXRJdGVtczogVFtdLCBiYXRjaFNpemU6IG51bWJlciA9IDEwMDAsIG1heENvbmN1cnJlbnRTZWdtZW50czogbnVtYmVyID0gMjAsIHJlYWRDb25zaXN0ZW5jeT86IFJlYWRDb25zaXN0ZW5jeSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHJlc3VsdEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hHZXQoYmF0Y2gsIHJlYWRDb25zaXN0ZW5jeSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInNlZ21lbnQgY29tcGxldGVcIilcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICByZXN1bHRJdGVtcyA9IHJlc3VsdEl0ZW1zLmNvbmNhdChyZXMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYHRpbWUgZm9yIHNlZ21lbnQgZ2V0ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGB0b3RhbCB0aW1lIGZvciBjb21wbGV0ZSBwYXJhbGxlbCBnZXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiByZXN1bHRJdGVtc1xuICAgIH1cbiAgICBhc3luYyBwYXJhbGxlbFF1ZXJ5KFxuICAgICAgICB2YWx1ZUNvbnN0cnVjdG9yOiBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3I8VD4sXG4gICAgICAgIGtleUNvbmRpdGlvbnM6IEFycmF5PENvbmRpdGlvbkV4cHJlc3Npb24gfCB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfCBhbnkgfT4sXG4gICAgICAgIG1heENvbmN1cnJlbnRDYWxsczogbnVtYmVyID0gMjAsXG4gICAgICAgIG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMsXG5cbiAgICApOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChrZXlDb25kaXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRDb25kaXRpb25zID0ga2V5Q29uZGl0aW9ucy5zcGxpY2UoMCwgbWF4Q29uY3VycmVudENhbGxzKVxuICAgICAgICAgICAgY29uc3QgcXVlcnlQcm9taXNlcyA9IHNlZ21lbnRDb25kaXRpb25zLm1hcCgoa2V5Q29uZGl0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tUXVlcnkodmFsdWVDb25zdHJ1Y3Rvciwga2V5Q29uZGl0aW9uLCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBxdWVyeVJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChxdWVyeVByb21pc2VzKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHF1ZXJ5UmVzdWx0IG9mIHF1ZXJ5UmVzdWx0cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCguLi5xdWVyeVJlc3VsdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgcXVlcnkgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuICAgIHByaXZhdGUgYXN5bmMgY3VzdG9tUXVlcnkoXG4gICAgICAgIHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPixcbiAgICAgICAga2V5Q29uZGl0aW9uczogQ29uZGl0aW9uRXhwcmVzc2lvbiB8IHsgW3Byb3BlcnR5TmFtZTogc3RyaW5nXTogQ29uZGl0aW9uRXhwcmVzc2lvblByZWRpY2F0ZSB8IGFueSB9LFxuICAgICAgICBvcHRpb25zPzogUXVlcnlPcHRpb25zXG4gICAgKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCBpdGVtczogVFtdID0gW11cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnF1ZXJ5KHZhbHVlQ29uc3RydWN0b3IsIGtleUNvbmRpdGlvbnMsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHF1ZXJ5ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cbiAgICBkZWNvZGUoY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoY29udGludWF0aW9uVG9rZW4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhc3RFdmFsdWF0ZWRLZXkgPSBKU09OLnBhcnNlKEJ1ZmZlci5mcm9tKGNvbnRpbnVhdGlvblRva2VuLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJJbmNvbWluZyBMYXN0IEV2YWx1YXRlZCBLZXkgXCIgKyBsYXN0RXZhbHVhdGVkS2V5KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdEV2YWx1YXRlZEtleTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvblRva2VuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGFzeW5jIGVuY29kZShsYXN0RXZhbHVhdGVkS2V5OiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkobGFzdEV2YWx1YXRlZEtleSkpLnRvU3RyaW5nKCdiYXNlNjQnKVxuICAgIH1cbn0iXX0=
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kYW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmFzZS1kYW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBWUEsZ0VBQTREO0FBQzVELG9FQUF5RDtBQUV6RCwyQ0FBMkM7QUFDOUIsUUFBQSxRQUFRLEdBQUcsa0NBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBQy9DLFFBQUEsTUFBTSxHQUFHLGtDQUFlLENBQUMsYUFBYSxFQUFFLENBQUM7QUFFdEQsTUFBYSxVQUFVO0lBQ25CLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBVSxFQUFFLFNBQVMsR0FBRyxHQUFHLEVBQUUsV0FBaUI7UUFDNUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFBO1FBQzdDLElBQUksV0FBVyxHQUFRLEVBQUUsQ0FBQTtRQUN6QixPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFBO1lBQ2pCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ3RDLFFBQVEsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtZQUM1RCxJQUFJLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUE7WUFDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO29CQUMvQixPQUFPLElBQUksQ0FBQyxDQUFBO29CQUNaLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNsQyxDQUFD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SUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFDLENBQUE7UUFFdEUsT0FBTyxLQUFLLENBQUE7SUFDaEIsQ0FBQztJQUNELE1BQU0sQ0FBQyxpQkFBcUM7UUFDeEMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQztnQkFDRCxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDN0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMvRCxPQUFPLGdCQUFnQixDQUFDO1lBQzVCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ3BCLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFxQjtRQUM5QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNFLENBQUM7Q0FDSjtBQXBSRCxnQ0FvUkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEeW5hbW9EQiB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1keW5hbW9kYic7XG5pbXBvcnQge1xuICAgIERhdGFNYXBwZXIsXG4gICAgUGFyYWxsZWxTY2FuT3B0aW9ucyxcbiAgICBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zLFxuICAgIFF1ZXJ5T3B0aW9ucyxcbiAgICBSZWFkQ29uc2lzdGVuY3ksXG4gICAgU2Nhbk9wdGlvbnNcbn0gZnJvbSAnQG5vdmEtb2RtL21hcHBlcic7XG5pbXBvcnQgeyBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3IgfSBmcm9tICdAbm92YS1vZG0vbWFyc2hhbGxlcic7XG5pbXBvcnQgeyBDb25kaXRpb25FeHByZXNzaW9uLCBDb25kaXRpb25FeHByZXNzaW9uUHJlZGljYXRlIH0gZnJvbSAnQG5vdmEtb2RtL2V4cHJlc3Npb25zJztcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4vYmFzZS1tb2RlbCc7XG5pbXBvcnQgeyBEYXRhYmFzZUZhY3RvcnkgfSBmcm9tICcuL2NvbmZpZy9kYXRhYmFzZS1mYWN0b3J5JztcbmltcG9ydCB7IGVudk1hbmFnZXIgfSBmcm9tICcuL2NvbmZpZy9lbnZpcm9ubWVudC1jb25maWcnO1xuXG4vLyBVc2UgZW52aXJvbm1lbnQtYXdhcmUgZGF0YWJhc2UgaW5zdGFuY2VzXG5leHBvcnQgY29uc3QgZHluYW1vREIgPSBEYXRhYmFzZUZhY3RvcnkuZ2V0RHluYW1vREJDbGllbnQoKTtcbmV4cG9ydCBjb25zdCBtYXBwZXIgPSBEYXRhYmFzZUZhY3RvcnkuZ2V0RGF0YU1hcHBlcigpO1xuXG5leHBvcnQgY2xhc3MgR2VuZXJpY0RBTzxUIGV4dGVuZHMgQmFzZU1vZGVsPiB7XG4gICAgYXN5bmMgYmF0Y2hVcGRhdGUoaXRlbXM6IFRbXSwgYmF0Y2hTaXplID0gMTAwLCBhdXRoQ29udGV4dD86IGFueSk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdWNjZXNzID0gMCwgdG90YWxUb1VwZGF0ZSA9IGl0ZW1zLmxlbmd0aFxuICAgICAgICBsZXQgdXBkYXRlSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIHdoaWxlIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXVxuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSlcbiAgICAgICAgICAgIHByb21pc2VzID0gYmF0Y2gubWFwKGl0ZW0gPT4gdGhpcy51cGRhdGUoaXRlbSwgYXV0aENvbnRleHQpKVxuICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpXG4gICAgICAgICAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PSBcImZ1bGZpbGxlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgKz0gMVxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtcy5wdXNoKHJlc3VsdC52YWx1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7c3VjY2Vzc30vJHt0b3RhbFRvVXBkYXRlfWApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaFB1dChpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCwgYXV0aENvbnRleHQ/OiBhbnkpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCBwdXRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoUHV0KGJhdGNoLCBhdXRoQ29udGV4dC51c2VyU3ViKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic2VnbWVudCBjb21wbGV0ZVwiKVxuICAgICAgICAgICAgcmVzdWx0LmZvckVhY2goKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIHB1dEl0ZW1zID0gcHV0SXRlbXMuY29uY2F0KHJlcylcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdGltZSBmb3Igc2VnbWVudCBwdXQgJHtEYXRlLm5vdygpIC0gc3RhcnRUaW1lfWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHB1dCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgcmV0dXJuIHB1dEl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgcGFyYWxsZWxCYXRjaERlbGV0ZShpbnB1dEl0ZW1zOiBUW10sIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgbWF4Q29uY3VycmVudFNlZ21lbnRzOiBudW1iZXIgPSAyMCk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgIGxldCBpdGVtczogVFtdID0gW11cbiAgICAgICAgaXRlbXMgPSBpdGVtcy5jb25jYXQoaW5wdXRJdGVtcylcbiAgICAgICAgbGV0IG1heFNlZ21lbnRzOiBUW11bXVtdID0gW11cbiAgICAgICAgbGV0IHB1dEl0ZW1zOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGJhdGNoID0gaXRlbXMuc3BsaWNlKDAsIGJhdGNoU2l6ZSAqIG1heENvbmN1cnJlbnRTZWdtZW50cylcbiAgICAgICAgICAgIGxldCBzZWdtZW50OiBUW11bXSA9IFtdXG4gICAgICAgICAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQucHVzaChiYXRjaC5zcGxpY2UoMCwgYmF0Y2hTaXplKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1heFNlZ21lbnRzLnB1c2goc2VnbWVudClcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNlZ21lbnQgb2YgbWF4U2VnbWVudHMpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8VFtdPltdID0gW11cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiYXRjaCBsZW5ndGggPSAke3NlZ21lbnQubGVuZ3RofWApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuYmF0Y2hEZWxldGUoYmF0Y2gpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcHV0SXRlbXMgPSBwdXRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGRlbGV0ZSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZGVsZXRlICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcHV0SXRlbXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSB1c2VkIG9ubHkgaW4gdGhlIHNjcmlwdHMuXG4gICAgICogXG4gICAgICogQHBhcmFtIHZhbHVlQ29uc3RydWN0b3IgdGhlIG1vZGVsIGNsYXNzXG4gICAgICovXG4gICAgYXN5bmMgcGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3I6IFplcm9Bcmd1bWVudHNDb25zdHJ1Y3RvcjxUPiwgb3B0aW9ucz86IFBhcmFsbGVsU2Nhbk9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIucGFyYWxsZWxTY2FuKHZhbHVlQ29uc3RydWN0b3IsIDQsIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICUgMTAwMDAwID09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlYWQgMTAwS1wiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIHNjYW4odmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LCBvcHRpb25zPzogU2Nhbk9wdGlvbnMgfCBQYXJhbGxlbFNjYW5Xb3JrZXJPcHRpb25zKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgbGV0IGl0ZW1zOiBUW10gPSBbXVxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgbWFwcGVyLnNjYW4odmFsdWVDb25zdHJ1Y3Rvciwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlKGl0ZW06IFQsIGF1dGhDb250ZXh0PzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0uY3JlYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnB1dChpdGVtKVxuICAgICAgICByZXR1cm4gcmVzXG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlKGl0ZW06IFQsIGF1dGhDb250ZXh0PzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGl0ZW0udXBkYXRlZF90aW1lID0gbmV3IERhdGUoKVxuICAgICAgICBpdGVtLnVwZGF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLnVwZGF0ZShpdGVtLCB7XG4gICAgICAgICAgICBvbk1pc3Npbmc6IFwic2tpcFwiXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGUoaXRlbTogVCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgbWFwcGVyLmRlbGV0ZShpdGVtLCB7IHJldHVyblZhbHVlczogXCJBTExfT0xEXCIgfSlcbiAgICB9XG5cbiAgICBhc3luYyBnZXQoaXRlbTogVCwgcmVhZENvbnNpc3RlbmN5PzogUmVhZENvbnNpc3RlbmN5KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIC8vIFVzZSBlbnZpcm9ubWVudC1zcGVjaWZpYyByZWFkIGNvbnNpc3RlbmN5IGlmIG5vdCBwcm92aWRlZFxuICAgICAgICBjb25zdCBjb25maWcgPSBlbnZNYW5hZ2VyLmdldERhdGFiYXNlQ29uZmlnKCk7XG4gICAgICAgIGNvbnN0IGNvbnNpc3RlbmN5ID0gcmVhZENvbnNpc3RlbmN5IHx8IGNvbmZpZy5yZWFkQ29uc2lzdGVuY3k7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbWFwcGVyLmdldChpdGVtLCB7XG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6IGNvbnNpc3RlbmN5XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICBhc3luYyBiYXRjaFB1dChpdGVtczogVFtdLCBhdXRoQ29udGV4dD86IGFueSk6IFByb21pc2U8VFtdPiB7XG5cbiAgICAgICAgbGV0IGZpbmFsSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5jcmVhdGVkX3RpbWUgPSBuZXcgRGF0ZSgpXG4gICAgICAgICAgICBpdGVtLmNyZWF0ZWRfdXNlciA9IGF1dGhDb250ZXh0LnVzZXJTdWJcbiAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgIH0pXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCBcIml0ZW06XCIsIGl0ZW1zIClcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIG1hcHBlci5iYXRjaFB1dChpdGVtcykpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGl0ZW0pXG4gICAgICAgICAgICBmaW5hbEl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxJdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIGJhdGNoRGVsZXRlKGl0ZW1zOiBUW10pOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBsZXQgZGVsZXRlSXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIuYmF0Y2hEZWxldGUoaXRlbXMpKSB7XG4gICAgICAgICAgICBkZWxldGVJdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlbGV0ZUl0ZW1zXG4gICAgfVxuXG4gICAgYXN5bmMgYmF0Y2hHZXQoaXRlbXM6IFRbXSwgcmVhZENvbnNpc3RlbmN5PzogUmVhZENvbnNpc3RlbmN5KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgLy8gVXNlIGVudmlyb25tZW50LXNwZWNpZmljIHJlYWQgY29uc2lzdGVuY3kgaWYgbm90IHByb3ZpZGVkXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGVudk1hbmFnZXIuZ2V0RGF0YWJhc2VDb25maWcoKTtcbiAgICAgICAgY29uc3QgY29uc2lzdGVuY3kgPSByZWFkQ29uc2lzdGVuY3kgfHwgY29uZmlnLnJlYWRDb25zaXN0ZW5jeTtcblxuICAgICAgICBsZXQgZ2V0SXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBtYXBwZXIuYmF0Y2hHZXQoaXRlbXMsIHtcbiAgICAgICAgICAgIHJlYWRDb25zaXN0ZW5jeTogY29uc2lzdGVuY3lcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIGdldEl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0SXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBwYXJhbGxlbEJhdGNoR2V0KGlucHV0SXRlbXM6IFRbXSwgYmF0Y2hTaXplOiBudW1iZXIgPSAxMDAwLCBtYXhDb25jdXJyZW50U2VnbWVudHM6IG51bWJlciA9IDIwLCByZWFkQ29uc2lzdGVuY3k/OiBSZWFkQ29uc2lzdGVuY3kpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICAvLyBDaGVjayBpZiBwYXJhbGxlbCBwcm9jZXNzaW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgZW52aXJvbm1lbnRcbiAgICAgICAgY29uc3QgY29uZmlnID0gZW52TWFuYWdlci5nZXRDb25maWcoKTtcbiAgICAgICAgaWYgKCFjb25maWcuZmVhdHVyZXMuZW5hYmxlUGFyYWxsZWxQcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1BhcmFsbGVsIHByb2Nlc3NpbmcgaXMgZGlzYWJsZWQgZm9yIHRoaXMgZW52aXJvbm1lbnQuIFVzaW5nIHNlcXVlbnRpYWwgcHJvY2Vzc2luZy4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhdGNoR2V0KGlucHV0SXRlbXMsIHJlYWRDb25zaXN0ZW5jeSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBsZXQgaXRlbXM6IFRbXSA9IFtdXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuY29uY2F0KGlucHV0SXRlbXMpXG4gICAgICAgIGxldCBtYXhTZWdtZW50czogVFtdW11bXSA9IFtdXG4gICAgICAgIGxldCByZXN1bHRJdGVtczogVFtdID0gW11cbiAgICAgICAgd2hpbGUgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBiYXRjaCA9IGl0ZW1zLnNwbGljZSgwLCBiYXRjaFNpemUgKiBtYXhDb25jdXJyZW50U2VnbWVudHMpXG4gICAgICAgICAgICBsZXQgc2VnbWVudDogVFtdW10gPSBbXVxuICAgICAgICAgICAgd2hpbGUgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZWdtZW50LnB1c2goYmF0Y2guc3BsaWNlKDAsIGJhdGNoU2l6ZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXhTZWdtZW50cy5wdXNoKHNlZ21lbnQpXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBzZWdtZW50IG9mIG1heFNlZ21lbnRzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPFRbXT5bXSA9IFtdXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgYmF0Y2ggbGVuZ3RoID0gJHtzZWdtZW50Lmxlbmd0aH1gKVxuICAgICAgICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmJhdGNoR2V0KGJhdGNoLCByZWFkQ29uc2lzdGVuY3kpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzZWdtZW50IGNvbXBsZXRlXCIpXG4gICAgICAgICAgICByZXN1bHQuZm9yRWFjaCgocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzdWx0SXRlbXMgPSByZXN1bHRJdGVtcy5jb25jYXQocmVzKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGB0aW1lIGZvciBzZWdtZW50IGdldCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhgdG90YWwgdGltZSBmb3IgY29tcGxldGUgcGFyYWxsZWwgZ2V0ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0SXRlbXNcbiAgICB9XG4gICAgYXN5bmMgcGFyYWxsZWxRdWVyeShcbiAgICAgICAgdmFsdWVDb25zdHJ1Y3RvcjogWmVyb0FyZ3VtZW50c0NvbnN0cnVjdG9yPFQ+LFxuICAgICAgICBrZXlDb25kaXRpb25zOiBBcnJheTxDb25kaXRpb25FeHByZXNzaW9uIHwgeyBbcHJvcGVydHlOYW1lOiBzdHJpbmddOiBDb25kaXRpb25FeHByZXNzaW9uUHJlZGljYXRlIHwgYW55IH0+LFxuICAgICAgICBtYXhDb25jdXJyZW50Q2FsbHM6IG51bWJlciA9IDIwLFxuICAgICAgICBvcHRpb25zPzogUXVlcnlPcHRpb25zLFxuXG4gICAgKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgICAgICBjb25zdCByZXN1bHRzOiBUW10gPSBbXVxuICAgICAgICB3aGlsZSAoa2V5Q29uZGl0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBzZWdtZW50Q29uZGl0aW9ucyA9IGtleUNvbmRpdGlvbnMuc3BsaWNlKDAsIG1heENvbmN1cnJlbnRDYWxscylcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5UHJvbWlzZXMgPSBzZWdtZW50Q29uZGl0aW9ucy5tYXAoKGtleUNvbmRpdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVF1ZXJ5KHZhbHVlQ29uc3RydWN0b3IsIGtleUNvbmRpdGlvbiwgb3B0aW9ucylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgcXVlcnlSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocXVlcnlQcm9taXNlcylcblxuICAgICAgICAgICAgZm9yIChjb25zdCBxdWVyeVJlc3VsdCBvZiBxdWVyeVJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goLi4ucXVlcnlSZXN1bHQpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coYHRvdGFsIHRpbWUgZm9yIGNvbXBsZXRlIHBhcmFsbGVsIHF1ZXJ5ICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1gKVxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cbiAgICBwcml2YXRlIGFzeW5jIGN1c3RvbVF1ZXJ5KFxuICAgICAgICB2YWx1ZUNvbnN0cnVjdG9yOiBaZXJvQXJndW1lbnRzQ29uc3RydWN0b3I8VD4sXG4gICAgICAgIGtleUNvbmRpdGlvbnM6IENvbmRpdGlvbkV4cHJlc3Npb24gfCB7IFtwcm9wZXJ0eU5hbWU6IHN0cmluZ106IENvbmRpdGlvbkV4cHJlc3Npb25QcmVkaWNhdGUgfCBhbnkgfSxcbiAgICAgICAgb3B0aW9ucz86IFF1ZXJ5T3B0aW9uc1xuICAgICk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAgICAgY29uc3QgaXRlbXM6IFRbXSA9IFtdXG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIG1hcHBlci5xdWVyeSh2YWx1ZUNvbnN0cnVjdG9yLCBrZXlDb25kaXRpb25zLCBvcHRpb25zKSkge1xuICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKGB0b3RhbCB0aW1lIGZvciBjb21wbGV0ZSBxdWVyeSAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9YClcblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG4gICAgZGVjb2RlKGNvbnRpbnVhdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGNvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBsYXN0RXZhbHVhdGVkS2V5ID0gSlNPTi5wYXJzZShCdWZmZXIuZnJvbShjb250aW51YXRpb25Ub2tlbiwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSW5jb21pbmcgTGFzdCBFdmFsdWF0ZWQgS2V5IFwiICsgbGFzdEV2YWx1YXRlZEtleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RFdmFsdWF0ZWRLZXk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb250aW51YXRpb25Ub2tlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBhc3luYyBlbmNvZGUobGFzdEV2YWx1YXRlZEtleTogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGxhc3RFdmFsdWF0ZWRLZXkpKS50b1N0cmluZygnYmFzZTY0JylcbiAgICB9XG59Il19
@@ -0,0 +1,12 @@
1
+ import { DynamoDB } from '@aws-sdk/client-dynamodb';
2
+ import { DataMapper } from '@nova-odm/mapper';
3
+ export declare class DatabaseFactory {
4
+ private static dynamoDBInstance;
5
+ private static mapperInstance;
6
+ static getDynamoDBClient(): DynamoDB;
7
+ static getDataMapper(): DataMapper;
8
+ static getTableName(baseTableName: string): string;
9
+ static resetInstances(): void;
10
+ }
11
+ export declare const dynamoDB: DynamoDB;
12
+ export declare const mapper: DataMapper;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapper = exports.dynamoDB = exports.DatabaseFactory = void 0;
4
+ const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
5
+ const mapper_1 = require("@nova-odm/mapper");
6
+ const environment_config_1 = require("./environment-config");
7
+ class DatabaseFactory {
8
+ static getDynamoDBClient() {
9
+ if (!DatabaseFactory.dynamoDBInstance) {
10
+ const config = environment_config_1.envManager.getDatabaseConfig();
11
+ const dynamoConfig = {
12
+ region: config.region,
13
+ maxAttempts: config.maxAttempts
14
+ };
15
+ // Add endpoint for local development
16
+ if (config.endpoint) {
17
+ dynamoConfig.endpoint = config.endpoint;
18
+ }
19
+ DatabaseFactory.dynamoDBInstance = new client_dynamodb_1.DynamoDB(dynamoConfig);
20
+ }
21
+ return DatabaseFactory.dynamoDBInstance;
22
+ }
23
+ static getDataMapper() {
24
+ if (!DatabaseFactory.mapperInstance) {
25
+ const client = DatabaseFactory.getDynamoDBClient();
26
+ DatabaseFactory.mapperInstance = new mapper_1.DataMapper({ client });
27
+ }
28
+ return DatabaseFactory.mapperInstance;
29
+ }
30
+ static getTableName(baseTableName) {
31
+ const config = environment_config_1.envManager.getDatabaseConfig();
32
+ return `${config.tablePrefix}${baseTableName}`;
33
+ }
34
+ static resetInstances() {
35
+ DatabaseFactory.dynamoDBInstance = undefined;
36
+ DatabaseFactory.mapperInstance = undefined;
37
+ }
38
+ }
39
+ exports.DatabaseFactory = DatabaseFactory;
40
+ // Export singleton instances for backward compatibility
41
+ exports.dynamoDB = DatabaseFactory.getDynamoDBClient();
42
+ exports.mapper = DatabaseFactory.getDataMapper();
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvZGF0YWJhc2UtZmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4REFBb0Q7QUFDcEQsNkNBQThDO0FBQzlDLDZEQUFrRTtBQUVsRSxNQUFhLGVBQWU7SUFJakIsTUFBTSxDQUFDLGlCQUFpQjtRQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEMsTUFBTSxNQUFNLEdBQUcsK0JBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRTlDLE1BQU0sWUFBWSxHQUFRO2dCQUN0QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVzthQUNsQyxDQUFDO1lBRUYscUNBQXFDO1lBQ3JDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixZQUFZLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDNUMsQ0FBQztZQUVELGVBQWUsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLDBCQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELE9BQU8sZUFBZSxDQUFDLGdCQUFnQixDQUFDO0lBQzVDLENBQUM7SUFFTSxNQUFNLENBQUMsYUFBYTtRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ25ELGVBQWUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxtQkFBVSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxlQUFlLENBQUMsY0FBYyxDQUFDO0lBQzFDLENBQUM7SUFFTSxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQXFCO1FBQzVDLE1BQU0sTUFBTSxHQUFHLCtCQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM5QyxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWM7UUFDeEIsZUFBZSxDQUFDLGdCQUFnQixHQUFHLFNBQWdCLENBQUM7UUFDcEQsZUFBZSxDQUFDLGNBQWMsR0FBRyxTQUFnQixDQUFDO0lBQ3RELENBQUM7Q0FDSjtBQTFDRCwwQ0EwQ0M7QUFFRCx3REFBd0Q7QUFDM0MsUUFBQSxRQUFRLEdBQUcsZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUM7QUFDL0MsUUFBQSxNQUFNLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHluYW1vREIgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZHluYW1vZGInO1xuaW1wb3J0IHsgRGF0YU1hcHBlciB9IGZyb20gJ0Bub3ZhLW9kbS9tYXBwZXInO1xuaW1wb3J0IHsgZW52TWFuYWdlciwgRGF0YWJhc2VDb25maWcgfSBmcm9tICcuL2Vudmlyb25tZW50LWNvbmZpZyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZUZhY3Rvcnkge1xuICAgIHByaXZhdGUgc3RhdGljIGR5bmFtb0RCSW5zdGFuY2U6IER5bmFtb0RCO1xuICAgIHByaXZhdGUgc3RhdGljIG1hcHBlckluc3RhbmNlOiBEYXRhTWFwcGVyO1xuXG4gICAgcHVibGljIHN0YXRpYyBnZXREeW5hbW9EQkNsaWVudCgpOiBEeW5hbW9EQiB7XG4gICAgICAgIGlmICghRGF0YWJhc2VGYWN0b3J5LmR5bmFtb0RCSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGVudk1hbmFnZXIuZ2V0RGF0YWJhc2VDb25maWcoKTtcblxuICAgICAgICAgICAgY29uc3QgZHluYW1vQ29uZmlnOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgcmVnaW9uOiBjb25maWcucmVnaW9uLFxuICAgICAgICAgICAgICAgIG1heEF0dGVtcHRzOiBjb25maWcubWF4QXR0ZW1wdHNcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vIEFkZCBlbmRwb2ludCBmb3IgbG9jYWwgZGV2ZWxvcG1lbnRcbiAgICAgICAgICAgIGlmIChjb25maWcuZW5kcG9pbnQpIHtcbiAgICAgICAgICAgICAgICBkeW5hbW9Db25maWcuZW5kcG9pbnQgPSBjb25maWcuZW5kcG9pbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIERhdGFiYXNlRmFjdG9yeS5keW5hbW9EQkluc3RhbmNlID0gbmV3IER5bmFtb0RCKGR5bmFtb0NvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRGF0YWJhc2VGYWN0b3J5LmR5bmFtb0RCSW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREYXRhTWFwcGVyKCk6IERhdGFNYXBwZXIge1xuICAgICAgICBpZiAoIURhdGFiYXNlRmFjdG9yeS5tYXBwZXJJbnN0YW5jZSkge1xuICAgICAgICAgICAgY29uc3QgY2xpZW50ID0gRGF0YWJhc2VGYWN0b3J5LmdldER5bmFtb0RCQ2xpZW50KCk7XG4gICAgICAgICAgICBEYXRhYmFzZUZhY3RvcnkubWFwcGVySW5zdGFuY2UgPSBuZXcgRGF0YU1hcHBlcih7IGNsaWVudCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBEYXRhYmFzZUZhY3RvcnkubWFwcGVySW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRUYWJsZU5hbWUoYmFzZVRhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZW52TWFuYWdlci5nZXREYXRhYmFzZUNvbmZpZygpO1xuICAgICAgICByZXR1cm4gYCR7Y29uZmlnLnRhYmxlUHJlZml4fSR7YmFzZVRhYmxlTmFtZX1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVzZXRJbnN0YW5jZXMoKTogdm9pZCB7XG4gICAgICAgIERhdGFiYXNlRmFjdG9yeS5keW5hbW9EQkluc3RhbmNlID0gdW5kZWZpbmVkIGFzIGFueTtcbiAgICAgICAgRGF0YWJhc2VGYWN0b3J5Lm1hcHBlckluc3RhbmNlID0gdW5kZWZpbmVkIGFzIGFueTtcbiAgICB9XG59XG5cbi8vIEV4cG9ydCBzaW5nbGV0b24gaW5zdGFuY2VzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5leHBvcnQgY29uc3QgZHluYW1vREIgPSBEYXRhYmFzZUZhY3RvcnkuZ2V0RHluYW1vREJDbGllbnQoKTtcbmV4cG9ydCBjb25zdCBtYXBwZXIgPSBEYXRhYmFzZUZhY3RvcnkuZ2V0RGF0YU1hcHBlcigpO1xuIl19
@@ -0,0 +1,38 @@
1
+ export type Environment = 'DEV' | 'PRODDEBUG' | 'PROD' | 'test';
2
+ export interface DatabaseConfig {
3
+ region: string;
4
+ endpoint?: string;
5
+ maxAttempts: number;
6
+ tablePrefix: string;
7
+ enableLogging: boolean;
8
+ readConsistency: 'eventual' | 'strong';
9
+ }
10
+ export interface EnvironmentConfig {
11
+ environment: Environment;
12
+ database: DatabaseConfig;
13
+ features: {
14
+ enableParallelProcessing: boolean;
15
+ enableBatchOperations: boolean;
16
+ enableCaching: boolean;
17
+ };
18
+ monitoring: {
19
+ enableMetrics: boolean;
20
+ logLevel: 'debug' | 'info' | 'warn' | 'error';
21
+ };
22
+ }
23
+ export declare class EnvironmentManager {
24
+ private static instance;
25
+ private currentConfig;
26
+ private constructor();
27
+ static getInstance(): EnvironmentManager;
28
+ private loadEnvironmentConfig;
29
+ getConfig(): EnvironmentConfig;
30
+ getDatabaseConfig(): DatabaseConfig;
31
+ getEnvironment(): Environment;
32
+ isDEV(): boolean;
33
+ isPROD(): boolean;
34
+ isPRODDEBUG(): boolean;
35
+ isTest(): boolean;
36
+ setEnvironment(environment: Environment): void;
37
+ }
38
+ export declare const envManager: EnvironmentManager;
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.envManager = exports.EnvironmentManager = void 0;
4
+ // Environment-specific configurations
5
+ const environmentConfigs = {
6
+ DEV: {
7
+ environment: 'DEV',
8
+ database: {
9
+ region: 'us-east-1',
10
+ endpoint: 'http://localhost:8000', // Local DynamoDB
11
+ maxAttempts: 3,
12
+ tablePrefix: 'dev-',
13
+ enableLogging: true,
14
+ readConsistency: 'eventual'
15
+ },
16
+ features: {
17
+ enableParallelProcessing: false,
18
+ enableBatchOperations: true,
19
+ enableCaching: false
20
+ },
21
+ monitoring: {
22
+ enableMetrics: false,
23
+ logLevel: 'debug'
24
+ }
25
+ },
26
+ PRODDEBUG: {
27
+ environment: 'PRODDEBUG',
28
+ database: {
29
+ region: 'us-east-1',
30
+ maxAttempts: 5,
31
+ tablePrefix: 'proddebug-',
32
+ enableLogging: true,
33
+ readConsistency: 'eventual'
34
+ },
35
+ features: {
36
+ enableParallelProcessing: true,
37
+ enableBatchOperations: true,
38
+ enableCaching: true
39
+ },
40
+ monitoring: {
41
+ enableMetrics: true,
42
+ logLevel: 'info'
43
+ }
44
+ },
45
+ PROD: {
46
+ environment: 'PROD',
47
+ database: {
48
+ region: 'us-east-1',
49
+ maxAttempts: 10,
50
+ tablePrefix: '',
51
+ enableLogging: false,
52
+ readConsistency: 'strong'
53
+ },
54
+ features: {
55
+ enableParallelProcessing: true,
56
+ enableBatchOperations: true,
57
+ enableCaching: true
58
+ },
59
+ monitoring: {
60
+ enableMetrics: true,
61
+ logLevel: 'warn'
62
+ }
63
+ },
64
+ test: {
65
+ environment: 'test',
66
+ database: {
67
+ region: 'us-east-1',
68
+ endpoint: 'http://localhost:8000',
69
+ maxAttempts: 1,
70
+ tablePrefix: 'test-',
71
+ enableLogging: false,
72
+ readConsistency: 'eventual'
73
+ },
74
+ features: {
75
+ enableParallelProcessing: false,
76
+ enableBatchOperations: false,
77
+ enableCaching: false
78
+ },
79
+ monitoring: {
80
+ enableMetrics: false,
81
+ logLevel: 'error'
82
+ }
83
+ }
84
+ };
85
+ class EnvironmentManager {
86
+ constructor() {
87
+ this.currentConfig = this.loadEnvironmentConfig();
88
+ }
89
+ static getInstance() {
90
+ if (!EnvironmentManager.instance) {
91
+ EnvironmentManager.instance = new EnvironmentManager();
92
+ }
93
+ return EnvironmentManager.instance;
94
+ }
95
+ loadEnvironmentConfig() {
96
+ // Priority order: NODE_ENV -> ENVIRONMENT -> default to DEV
97
+ const env = (process.env.NODE_ENV || process.env.ENVIRONMENT || 'DEV');
98
+ if (!environmentConfigs[env]) {
99
+ console.warn(`Unknown environment: ${env}. Falling back to DEV.`);
100
+ return environmentConfigs.DEV;
101
+ }
102
+ return environmentConfigs[env];
103
+ }
104
+ getConfig() {
105
+ return this.currentConfig;
106
+ }
107
+ getDatabaseConfig() {
108
+ return this.currentConfig.database;
109
+ }
110
+ getEnvironment() {
111
+ return this.currentConfig.environment;
112
+ }
113
+ isDEV() {
114
+ return this.currentConfig.environment === 'DEV';
115
+ }
116
+ isPROD() {
117
+ return this.currentConfig.environment === 'PROD';
118
+ }
119
+ isPRODDEBUG() {
120
+ return this.currentConfig.environment === 'PRODDEBUG';
121
+ }
122
+ isTest() {
123
+ return this.currentConfig.environment === 'test';
124
+ }
125
+ // Method to override environment at runtime (useful for testing)
126
+ setEnvironment(environment) {
127
+ this.currentConfig = environmentConfigs[environment];
128
+ }
129
+ }
130
+ exports.EnvironmentManager = EnvironmentManager;
131
+ // Export singleton instance
132
+ exports.envManager = EnvironmentManager.getInstance();
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9lbnZpcm9ubWVudC1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBeUJBLHNDQUFzQztBQUN0QyxNQUFNLGtCQUFrQixHQUEyQztJQUMvRCxHQUFHLEVBQUU7UUFDRCxXQUFXLEVBQUUsS0FBSztRQUNsQixRQUFRLEVBQUU7WUFDTixNQUFNLEVBQUUsV0FBVztZQUNuQixRQUFRLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCO1lBQ3BELFdBQVcsRUFBRSxDQUFDO1lBQ2QsV0FBVyxFQUFFLE1BQU07WUFDbkIsYUFBYSxFQUFFLElBQUk7WUFDbkIsZUFBZSxFQUFFLFVBQVU7U0FDOUI7UUFDRCxRQUFRLEVBQUU7WUFDTix3QkFBd0IsRUFBRSxLQUFLO1lBQy9CLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsYUFBYSxFQUFFLEtBQUs7U0FDdkI7UUFDRCxVQUFVLEVBQUU7WUFDUixhQUFhLEVBQUUsS0FBSztZQUNwQixRQUFRLEVBQUUsT0FBTztTQUNwQjtLQUNKO0lBQ0QsU0FBUyxFQUFFO1FBQ1AsV0FBVyxFQUFFLFdBQVc7UUFDeEIsUUFBUSxFQUFFO1lBQ04sTUFBTSxFQUFFLFdBQVc7WUFDbkIsV0FBVyxFQUFFLENBQUM7WUFDZCxXQUFXLEVBQUUsWUFBWTtZQUN6QixhQUFhLEVBQUUsSUFBSTtZQUNuQixlQUFlLEVBQUUsVUFBVTtTQUM5QjtRQUNELFFBQVEsRUFBRTtZQUNOLHdCQUF3QixFQUFFLElBQUk7WUFDOUIscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixhQUFhLEVBQUUsSUFBSTtTQUN0QjtRQUNELFVBQVUsRUFBRTtZQUNSLGFBQWEsRUFBRSxJQUFJO1lBQ25CLFFBQVEsRUFBRSxNQUFNO1NBQ25CO0tBQ0o7SUFDRCxJQUFJLEVBQUU7UUFDRixXQUFXLEVBQUUsTUFBTTtRQUNuQixRQUFRLEVBQUU7WUFDTixNQUFNLEVBQUUsV0FBVztZQUNuQixXQUFXLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSxFQUFFO1lBQ2YsYUFBYSxFQUFFLEtBQUs7WUFDcEIsZUFBZSxFQUFFLFFBQVE7U0FDNUI7UUFDRCxRQUFRLEVBQUU7WUFDTix3QkFBd0IsRUFBRSxJQUFJO1lBQzlCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsYUFBYSxFQUFFLElBQUk7U0FDdEI7UUFDRCxVQUFVLEVBQUU7WUFDUixhQUFhLEVBQUUsSUFBSTtZQUNuQixRQUFRLEVBQUUsTUFBTTtTQUNuQjtLQUNKO0lBQ0QsSUFBSSxFQUFFO1FBQ0YsV0FBVyxFQUFFLE1BQU07UUFDbkIsUUFBUSxFQUFFO1lBQ04sTUFBTSxFQUFFLFdBQVc7WUFDbkIsUUFBUSxFQUFFLHVCQUF1QjtZQUNqQyxXQUFXLEVBQUUsQ0FBQztZQUNkLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLGVBQWUsRUFBRSxVQUFVO1NBQzlCO1FBQ0QsUUFBUSxFQUFFO1lBQ04sd0JBQXdCLEVBQUUsS0FBSztZQUMvQixxQkFBcUIsRUFBRSxLQUFLO1lBQzVCLGFBQWEsRUFBRSxLQUFLO1NBQ3ZCO1FBQ0QsVUFBVSxFQUFFO1lBQ1IsYUFBYSxFQUFFLEtBQUs7WUFDcEIsUUFBUSxFQUFFLE9BQU87U0FDcEI7S0FDSjtDQUNKLENBQUM7QUFFRixNQUFhLGtCQUFrQjtJQUkzQjtRQUNJLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDdEQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXO1FBQ3JCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQixrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztJQUN2QyxDQUFDO0lBRU8scUJBQXFCO1FBQ3pCLDREQUE0RDtRQUM1RCxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBZ0IsQ0FBQztRQUV0RixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDLENBQUM7WUFDbEUsT0FBTyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7UUFDbEMsQ0FBQztRQUVELE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLFNBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVNLGlCQUFpQjtRQUNwQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ3ZDLENBQUM7SUFFTSxjQUFjO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7SUFDMUMsQ0FBQztJQUVNLEtBQUs7UUFDUixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQztJQUNwRCxDQUFDO0lBRU0sTUFBTTtRQUNULE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDO0lBQ3JELENBQUM7SUFFTSxXQUFXO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQUM7SUFDMUQsQ0FBQztJQUVNLE1BQU07UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxLQUFLLE1BQU0sQ0FBQztJQUNyRCxDQUFDO0lBRUQsaUVBQWlFO0lBQzFELGNBQWMsQ0FBQyxXQUF3QjtRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDSjtBQTNERCxnREEyREM7QUFFRCw0QkFBNEI7QUFDZixRQUFBLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEVudmlyb25tZW50ID0gJ0RFVicgfCAnUFJPRERFQlVHJyB8ICdQUk9EJyB8ICd0ZXN0JztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZUNvbmZpZyB7XG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gICAgbWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgICB0YWJsZVByZWZpeDogc3RyaW5nO1xuICAgIGVuYWJsZUxvZ2dpbmc6IGJvb2xlYW47XG4gICAgcmVhZENvbnNpc3RlbmN5OiAnZXZlbnR1YWwnIHwgJ3N0cm9uZyc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRDb25maWcge1xuICAgIGVudmlyb25tZW50OiBFbnZpcm9ubWVudDtcbiAgICBkYXRhYmFzZTogRGF0YWJhc2VDb25maWc7XG4gICAgZmVhdHVyZXM6IHtcbiAgICAgICAgZW5hYmxlUGFyYWxsZWxQcm9jZXNzaW5nOiBib29sZWFuO1xuICAgICAgICBlbmFibGVCYXRjaE9wZXJhdGlvbnM6IGJvb2xlYW47XG4gICAgICAgIGVuYWJsZUNhY2hpbmc6IGJvb2xlYW47XG4gICAgfTtcbiAgICBtb25pdG9yaW5nOiB7XG4gICAgICAgIGVuYWJsZU1ldHJpY3M6IGJvb2xlYW47XG4gICAgICAgIGxvZ0xldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJztcbiAgICB9O1xufVxuXG4vLyBFbnZpcm9ubWVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uc1xuY29uc3QgZW52aXJvbm1lbnRDb25maWdzOiBSZWNvcmQ8RW52aXJvbm1lbnQsIEVudmlyb25tZW50Q29uZmlnPiA9IHtcbiAgICBERVY6IHtcbiAgICAgICAgZW52aXJvbm1lbnQ6ICdERVYnLFxuICAgICAgICBkYXRhYmFzZToge1xuICAgICAgICAgICAgcmVnaW9uOiAndXMtZWFzdC0xJyxcbiAgICAgICAgICAgIGVuZHBvaW50OiAnaHR0cDovL2xvY2FsaG9zdDo4MDAwJywgLy8gTG9jYWwgRHluYW1vREJcbiAgICAgICAgICAgIG1heEF0dGVtcHRzOiAzLFxuICAgICAgICAgICAgdGFibGVQcmVmaXg6ICdkZXYtJyxcbiAgICAgICAgICAgIGVuYWJsZUxvZ2dpbmc6IHRydWUsXG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6ICdldmVudHVhbCdcbiAgICAgICAgfSxcbiAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIGVuYWJsZVBhcmFsbGVsUHJvY2Vzc2luZzogZmFsc2UsXG4gICAgICAgICAgICBlbmFibGVCYXRjaE9wZXJhdGlvbnM6IHRydWUsXG4gICAgICAgICAgICBlbmFibGVDYWNoaW5nOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBtb25pdG9yaW5nOiB7XG4gICAgICAgICAgICBlbmFibGVNZXRyaWNzOiBmYWxzZSxcbiAgICAgICAgICAgIGxvZ0xldmVsOiAnZGVidWcnXG4gICAgICAgIH1cbiAgICB9LFxuICAgIFBST0RERUJVRzoge1xuICAgICAgICBlbnZpcm9ubWVudDogJ1BST0RERUJVRycsXG4gICAgICAgIGRhdGFiYXNlOiB7XG4gICAgICAgICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgICAgICAgbWF4QXR0ZW1wdHM6IDUsXG4gICAgICAgICAgICB0YWJsZVByZWZpeDogJ3Byb2RkZWJ1Zy0nLFxuICAgICAgICAgICAgZW5hYmxlTG9nZ2luZzogdHJ1ZSxcbiAgICAgICAgICAgIHJlYWRDb25zaXN0ZW5jeTogJ2V2ZW50dWFsJ1xuICAgICAgICB9LFxuICAgICAgICBmZWF0dXJlczoge1xuICAgICAgICAgICAgZW5hYmxlUGFyYWxsZWxQcm9jZXNzaW5nOiB0cnVlLFxuICAgICAgICAgICAgZW5hYmxlQmF0Y2hPcGVyYXRpb25zOiB0cnVlLFxuICAgICAgICAgICAgZW5hYmxlQ2FjaGluZzogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBtb25pdG9yaW5nOiB7XG4gICAgICAgICAgICBlbmFibGVNZXRyaWNzOiB0cnVlLFxuICAgICAgICAgICAgbG9nTGV2ZWw6ICdpbmZvJ1xuICAgICAgICB9XG4gICAgfSxcbiAgICBQUk9EOiB7XG4gICAgICAgIGVudmlyb25tZW50OiAnUFJPRCcsXG4gICAgICAgIGRhdGFiYXNlOiB7XG4gICAgICAgICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgICAgICAgbWF4QXR0ZW1wdHM6IDEwLFxuICAgICAgICAgICAgdGFibGVQcmVmaXg6ICcnLFxuICAgICAgICAgICAgZW5hYmxlTG9nZ2luZzogZmFsc2UsXG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6ICdzdHJvbmcnXG4gICAgICAgIH0sXG4gICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICBlbmFibGVQYXJhbGxlbFByb2Nlc3Npbmc6IHRydWUsXG4gICAgICAgICAgICBlbmFibGVCYXRjaE9wZXJhdGlvbnM6IHRydWUsXG4gICAgICAgICAgICBlbmFibGVDYWNoaW5nOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIG1vbml0b3Jpbmc6IHtcbiAgICAgICAgICAgIGVuYWJsZU1ldHJpY3M6IHRydWUsXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3dhcm4nXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRlc3Q6IHtcbiAgICAgICAgZW52aXJvbm1lbnQ6ICd0ZXN0JyxcbiAgICAgICAgZGF0YWJhc2U6IHtcbiAgICAgICAgICAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICAgICAgICBlbmRwb2ludDogJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMCcsXG4gICAgICAgICAgICBtYXhBdHRlbXB0czogMSxcbiAgICAgICAgICAgIHRhYmxlUHJlZml4OiAndGVzdC0nLFxuICAgICAgICAgICAgZW5hYmxlTG9nZ2luZzogZmFsc2UsXG4gICAgICAgICAgICByZWFkQ29uc2lzdGVuY3k6ICdldmVudHVhbCdcbiAgICAgICAgfSxcbiAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIGVuYWJsZVBhcmFsbGVsUHJvY2Vzc2luZzogZmFsc2UsXG4gICAgICAgICAgICBlbmFibGVCYXRjaE9wZXJhdGlvbnM6IGZhbHNlLFxuICAgICAgICAgICAgZW5hYmxlQ2FjaGluZzogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgbW9uaXRvcmluZzoge1xuICAgICAgICAgICAgZW5hYmxlTWV0cmljczogZmFsc2UsXG4gICAgICAgICAgICBsb2dMZXZlbDogJ2Vycm9yJ1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50TWFuYWdlciB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEVudmlyb25tZW50TWFuYWdlcjtcbiAgICBwcml2YXRlIGN1cnJlbnRDb25maWc6IEVudmlyb25tZW50Q29uZmlnO1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0gdGhpcy5sb2FkRW52aXJvbm1lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IEVudmlyb25tZW50TWFuYWdlciB7XG4gICAgICAgIGlmICghRW52aXJvbm1lbnRNYW5hZ2VyLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBFbnZpcm9ubWVudE1hbmFnZXIuaW5zdGFuY2UgPSBuZXcgRW52aXJvbm1lbnRNYW5hZ2VyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50TWFuYWdlci5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRFbnZpcm9ubWVudENvbmZpZygpOiBFbnZpcm9ubWVudENvbmZpZyB7XG4gICAgICAgIC8vIFByaW9yaXR5IG9yZGVyOiBOT0RFX0VOViAtPiBFTlZJUk9OTUVOVCAtPiBkZWZhdWx0IHRvIERFVlxuICAgICAgICBjb25zdCBlbnYgPSAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHwgcHJvY2Vzcy5lbnYuRU5WSVJPTk1FTlQgfHwgJ0RFVicpIGFzIEVudmlyb25tZW50O1xuXG4gICAgICAgIGlmICghZW52aXJvbm1lbnRDb25maWdzW2Vudl0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biBlbnZpcm9ubWVudDogJHtlbnZ9LiBGYWxsaW5nIGJhY2sgdG8gREVWLmApO1xuICAgICAgICAgICAgcmV0dXJuIGVudmlyb25tZW50Q29uZmlncy5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW52aXJvbm1lbnRDb25maWdzW2Vudl07XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbmZpZygpOiBFbnZpcm9ubWVudENvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDb25maWc7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERhdGFiYXNlQ29uZmlnKCk6IERhdGFiYXNlQ29uZmlnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5kYXRhYmFzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW52aXJvbm1lbnQoKTogRW52aXJvbm1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Q29uZmlnLmVudmlyb25tZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0RFVigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5lbnZpcm9ubWVudCA9PT0gJ0RFVic7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUFJPRCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5lbnZpcm9ubWVudCA9PT0gJ1BST0QnO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BST0RERUJVRygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5lbnZpcm9ubWVudCA9PT0gJ1BST0RERUJVRyc7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVGVzdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZy5lbnZpcm9ubWVudCA9PT0gJ3Rlc3QnO1xuICAgIH1cblxuICAgIC8vIE1ldGhvZCB0byBvdmVycmlkZSBlbnZpcm9ubWVudCBhdCBydW50aW1lICh1c2VmdWwgZm9yIHRlc3RpbmcpXG4gICAgcHVibGljIHNldEVudmlyb25tZW50KGVudmlyb25tZW50OiBFbnZpcm9ubWVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSBlbnZpcm9ubWVudENvbmZpZ3NbZW52aXJvbm1lbnRdO1xuICAgIH1cbn1cblxuLy8gRXhwb3J0IHNpbmdsZXRvbiBpbnN0YW5jZVxuZXhwb3J0IGNvbnN0IGVudk1hbmFnZXIgPSBFbnZpcm9ubWVudE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiJdfQ==
@@ -0,0 +1,3 @@
1
+ export * from './environment-config';
2
+ export * from './database-factory';
3
+ export * from './table-names';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ // Export all configuration modules
18
+ __exportStar(require("./environment-config"), exports);
19
+ __exportStar(require("./database-factory"), exports);
20
+ __exportStar(require("./table-names"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBbUM7QUFDbkMsdURBQXFDO0FBQ3JDLHFEQUFtQztBQUNuQyxnREFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBFeHBvcnQgYWxsIGNvbmZpZ3VyYXRpb24gbW9kdWxlc1xuZXhwb3J0ICogZnJvbSAnLi9lbnZpcm9ubWVudC1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZS1mYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vdGFibGUtbmFtZXMnO1xuIl19
@@ -0,0 +1,100 @@
1
+ export declare const BASE_TABLE_NAMES: {
2
+ readonly APP_FEEDBACK: "AppFeedbackTable";
3
+ readonly LSQ_CRM: "LsqCrmTable";
4
+ readonly CUTLERY: "CutleryTable";
5
+ readonly ITEM_ACCOMPANIMENTS: "ItemAccompanimentsTable";
6
+ readonly CUISINE: "CuisineTable";
7
+ readonly TIER_DETAILS: "TierDetailsTable";
8
+ readonly USER_ORDER_SUMMARY: "UserOrderSummaryTable";
9
+ readonly TIER_REFERRAL: "TierReferralTable";
10
+ readonly USER_ADDRESS_REQUEST: "UserAddressRequestTable";
11
+ readonly COMMON_FEEDBACK: "CommonFeedbackTable";
12
+ readonly GUEST_FEEDBACK: "GuestFeedbackTable";
13
+ readonly COUNTER: "CounterTable";
14
+ readonly REQUEST_INVOICE: "RequestInvoiceTable";
15
+ readonly PLATTER_SEARCH_EVENTS: "PlatterSearchEventsTable";
16
+ readonly ORDER_REVIEW_FEEDBACK: "OrderReviewFeedbackTable";
17
+ readonly CATERING_REQUEST: "CateringRequestTable";
18
+ readonly ORDER: "OrderTable";
19
+ readonly ORDER_ADDRESS: "OrderAddressTable";
20
+ readonly ORDER_REVIEW: "OrderReviewTable";
21
+ readonly PAYMENT: "PaymentTable";
22
+ readonly PLATE_ORDER: "PlateOrderTable";
23
+ readonly TRACKING: "TrackingTable";
24
+ readonly USER_ADDRESS: "UserAddressTable";
25
+ readonly ADD_ONS: "AddOnsTable";
26
+ readonly BANK_DETAILS: "BankDetailsTable";
27
+ readonly CART: "CartTable";
28
+ readonly CART_CATEGORIES: "CartCategoriesTable";
29
+ readonly CATEGORY: "CategoryTable";
30
+ readonly CATERING: "CateringTable";
31
+ readonly CONTENT: "ContentTable";
32
+ readonly COUPONS: "CouponsTable";
33
+ readonly DEFAULT_PLATTER: "DefaultPlatterTable";
34
+ readonly DEFAULT_PLATTER_CATEGORIES: "DefaultPlatterCategoriesTable";
35
+ readonly DEFAULT_PLATTER_ITEMS: "DefaultPlatterItemsTable";
36
+ readonly EVENT_EXECUTIVES: "EventExecutivesTable";
37
+ readonly ITEMS: "ItemsTable";
38
+ readonly LEAD: "LeadTable";
39
+ readonly OCCASION: "OccasionTable";
40
+ readonly REFERRAL_CONTENT: "ReferralContentTable";
41
+ readonly USER: "UserTable";
42
+ readonly WALLET: "WalletTable";
43
+ readonly WALLET_TRANSACTION: "WalletTransactionTable";
44
+ readonly WITHDRAWN: "WithdrawnTable";
45
+ readonly INTERNAL_USER: "InternalUserTable";
46
+ readonly ACTIVITY_LOGS: "ActivityLogsTable";
47
+ readonly QUOTATIONS: "QuotationsTable";
48
+ };
49
+ export declare class TableNameManager {
50
+ static getTableName(baseTableName: string): string;
51
+ static getAllTableNames(): Record<string, string>;
52
+ }
53
+ export declare const TABLE_NAMES: {
54
+ readonly APP_FEEDBACK: string;
55
+ readonly LSQ_CRM: string;
56
+ readonly CUTLERY: string;
57
+ readonly ITEM_ACCOMPANIMENTS: string;
58
+ readonly CUISINE: string;
59
+ readonly TIER_DETAILS: string;
60
+ readonly USER_ORDER_SUMMARY: string;
61
+ readonly TIER_REFERRAL: string;
62
+ readonly USER_ADDRESS_REQUEST: string;
63
+ readonly COMMON_FEEDBACK: string;
64
+ readonly GUEST_FEEDBACK: string;
65
+ readonly COUNTER: string;
66
+ readonly REQUEST_INVOICE: string;
67
+ readonly PLATTER_SEARCH_EVENTS: string;
68
+ readonly ORDER_REVIEW_FEEDBACK: string;
69
+ readonly CATERING_REQUEST: string;
70
+ readonly ORDER: string;
71
+ readonly ORDER_ADDRESS: string;
72
+ readonly ORDER_REVIEW: string;
73
+ readonly PAYMENT: string;
74
+ readonly PLATE_ORDER: string;
75
+ readonly TRACKING: string;
76
+ readonly USER_ADDRESS: string;
77
+ readonly ADD_ONS: string;
78
+ readonly BANK_DETAILS: string;
79
+ readonly CART: string;
80
+ readonly CART_CATEGORIES: string;
81
+ readonly CATEGORY: string;
82
+ readonly CATERING: string;
83
+ readonly CONTENT: string;
84
+ readonly COUPONS: string;
85
+ readonly DEFAULT_PLATTER: string;
86
+ readonly DEFAULT_PLATTER_CATEGORIES: string;
87
+ readonly DEFAULT_PLATTER_ITEMS: string;
88
+ readonly EVENT_EXECUTIVES: string;
89
+ readonly ITEMS: string;
90
+ readonly LEAD: string;
91
+ readonly OCCASION: string;
92
+ readonly REFERRAL_CONTENT: string;
93
+ readonly USER: string;
94
+ readonly WALLET: string;
95
+ readonly WALLET_TRANSACTION: string;
96
+ readonly WITHDRAWN: string;
97
+ readonly INTERNAL_USER: string;
98
+ readonly ACTIVITY_LOGS: string;
99
+ readonly QUOTATIONS: string;
100
+ };
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TABLE_NAMES = exports.TableNameManager = exports.BASE_TABLE_NAMES = void 0;
4
+ const database_factory_1 = require("./database-factory");
5
+ // Base table names (without environment prefix)
6
+ exports.BASE_TABLE_NAMES = {
7
+ // Customer App Tables
8
+ APP_FEEDBACK: 'AppFeedbackTable',
9
+ LSQ_CRM: 'LsqCrmTable',
10
+ CUTLERY: 'CutleryTable',
11
+ ITEM_ACCOMPANIMENTS: 'ItemAccompanimentsTable',
12
+ CUISINE: 'CuisineTable',
13
+ TIER_DETAILS: 'TierDetailsTable',
14
+ USER_ORDER_SUMMARY: 'UserOrderSummaryTable',
15
+ TIER_REFERRAL: 'TierReferralTable',
16
+ USER_ADDRESS_REQUEST: 'UserAddressRequestTable',
17
+ COMMON_FEEDBACK: 'CommonFeedbackTable',
18
+ GUEST_FEEDBACK: 'GuestFeedbackTable',
19
+ COUNTER: 'CounterTable',
20
+ REQUEST_INVOICE: 'RequestInvoiceTable',
21
+ PLATTER_SEARCH_EVENTS: 'PlatterSearchEventsTable',
22
+ ORDER_REVIEW_FEEDBACK: 'OrderReviewFeedbackTable',
23
+ CATERING_REQUEST: 'CateringRequestTable',
24
+ // Order Module Tables
25
+ ORDER: 'OrderTable',
26
+ ORDER_ADDRESS: 'OrderAddressTable',
27
+ ORDER_REVIEW: 'OrderReviewTable',
28
+ PAYMENT: 'PaymentTable',
29
+ PLATE_ORDER: 'PlateOrderTable',
30
+ TRACKING: 'TrackingTable',
31
+ USER_ADDRESS: 'UserAddressTable',
32
+ // Other Customer Tables
33
+ ADD_ONS: 'AddOnsTable',
34
+ BANK_DETAILS: 'BankDetailsTable',
35
+ CART: 'CartTable',
36
+ CART_CATEGORIES: 'CartCategoriesTable',
37
+ CATEGORY: 'CategoryTable',
38
+ CATERING: 'CateringTable',
39
+ CONTENT: 'ContentTable',
40
+ COUPONS: 'CouponsTable',
41
+ DEFAULT_PLATTER: 'DefaultPlatterTable',
42
+ DEFAULT_PLATTER_CATEGORIES: 'DefaultPlatterCategoriesTable',
43
+ DEFAULT_PLATTER_ITEMS: 'DefaultPlatterItemsTable',
44
+ EVENT_EXECUTIVES: 'EventExecutivesTable',
45
+ ITEMS: 'ItemsTable',
46
+ LEAD: 'LeadTable',
47
+ OCCASION: 'OccasionTable',
48
+ REFERRAL_CONTENT: 'ReferralContentTable',
49
+ USER: 'UserTable',
50
+ WALLET: 'WalletTable',
51
+ WALLET_TRANSACTION: 'WalletTransactionTable',
52
+ WITHDRAWN: 'WithdrawnTable',
53
+ // Internal User Tables
54
+ INTERNAL_USER: 'InternalUserTable',
55
+ ACTIVITY_LOGS: 'ActivityLogsTable',
56
+ QUOTATIONS: 'QuotationsTable'
57
+ };
58
+ // Environment-aware table name getter
59
+ class TableNameManager {
60
+ static getTableName(baseTableName) {
61
+ return database_factory_1.DatabaseFactory.getTableName(baseTableName);
62
+ }
63
+ static getAllTableNames() {
64
+ const tableNames = {};
65
+ Object.entries(exports.BASE_TABLE_NAMES).forEach(([key, value]) => {
66
+ tableNames[key] = this.getTableName(value);
67
+ });
68
+ return tableNames;
69
+ }
70
+ }
71
+ exports.TableNameManager = TableNameManager;
72
+ // Export environment-aware table names
73
+ exports.TABLE_NAMES = {
74
+ // Customer App Tables
75
+ APP_FEEDBACK: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.APP_FEEDBACK),
76
+ LSQ_CRM: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.LSQ_CRM),
77
+ CUTLERY: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.CUTLERY),
78
+ ITEM_ACCOMPANIMENTS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.ITEM_ACCOMPANIMENTS),
79
+ CUISINE: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.CUISINE),
80
+ TIER_DETAILS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.TIER_DETAILS),
81
+ USER_ORDER_SUMMARY: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.USER_ORDER_SUMMARY),
82
+ TIER_REFERRAL: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.TIER_REFERRAL),
83
+ USER_ADDRESS_REQUEST: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.USER_ADDRESS_REQUEST),
84
+ COMMON_FEEDBACK: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.COMMON_FEEDBACK),
85
+ GUEST_FEEDBACK: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.GUEST_FEEDBACK),
86
+ COUNTER: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.COUNTER),
87
+ REQUEST_INVOICE: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.REQUEST_INVOICE),
88
+ PLATTER_SEARCH_EVENTS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.PLATTER_SEARCH_EVENTS),
89
+ ORDER_REVIEW_FEEDBACK: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.ORDER_REVIEW_FEEDBACK),
90
+ CATERING_REQUEST: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.CATERING_REQUEST),
91
+ // Order Module Tables
92
+ ORDER: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.ORDER),
93
+ ORDER_ADDRESS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.ORDER_ADDRESS),
94
+ ORDER_REVIEW: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.ORDER_REVIEW),
95
+ PAYMENT: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.PAYMENT),
96
+ PLATE_ORDER: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.PLATE_ORDER),
97
+ TRACKING: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.TRACKING),
98
+ USER_ADDRESS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.USER_ADDRESS),
99
+ // Other Customer Tables
100
+ ADD_ONS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.ADD_ONS),
101
+ BANK_DETAILS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.BANK_DETAILS),
102
+ CART: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.CART),
103
+ CART_CATEGORIES: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.CART_CATEGORIES),
104
+ CATEGORY: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.CATEGORY),
105
+ CATERING: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.CATERING),
106
+ CONTENT: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.CONTENT),
107
+ COUPONS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.COUPONS),
108
+ DEFAULT_PLATTER: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.DEFAULT_PLATTER),
109
+ DEFAULT_PLATTER_CATEGORIES: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.DEFAULT_PLATTER_CATEGORIES),
110
+ DEFAULT_PLATTER_ITEMS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.DEFAULT_PLATTER_ITEMS),
111
+ EVENT_EXECUTIVES: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.EVENT_EXECUTIVES),
112
+ ITEMS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.ITEMS),
113
+ LEAD: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.LEAD),
114
+ OCCASION: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.OCCASION),
115
+ REFERRAL_CONTENT: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.REFERRAL_CONTENT),
116
+ USER: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.USER),
117
+ WALLET: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.WALLET),
118
+ WALLET_TRANSACTION: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.WALLET_TRANSACTION),
119
+ WITHDRAWN: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.WITHDRAWN),
120
+ // Internal User Tables
121
+ INTERNAL_USER: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.INTERNAL_USER),
122
+ ACTIVITY_LOGS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.ACTIVITY_LOGS),
123
+ QUOTATIONS: TableNameManager.getTableName(exports.BASE_TABLE_NAMES.QUOTATIONS)
124
+ };
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtbmFtZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3RhYmxlLW5hbWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlEQUFxRDtBQUVyRCxnREFBZ0Q7QUFDbkMsUUFBQSxnQkFBZ0IsR0FBRztJQUM1QixzQkFBc0I7SUFDdEIsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxPQUFPLEVBQUUsYUFBYTtJQUN0QixPQUFPLEVBQUUsY0FBYztJQUN2QixtQkFBbUIsRUFBRSx5QkFBeUI7SUFDOUMsT0FBTyxFQUFFLGNBQWM7SUFDdkIsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxrQkFBa0IsRUFBRSx1QkFBdUI7SUFDM0MsYUFBYSxFQUFFLG1CQUFtQjtJQUNsQyxvQkFBb0IsRUFBRSx5QkFBeUI7SUFDL0MsZUFBZSxFQUFFLHFCQUFxQjtJQUN0QyxjQUFjLEVBQUUsb0JBQW9CO0lBQ3BDLE9BQU8sRUFBRSxjQUFjO0lBQ3ZCLGVBQWUsRUFBRSxxQkFBcUI7SUFDdEMscUJBQXFCLEVBQUUsMEJBQTBCO0lBQ2pELHFCQUFxQixFQUFFLDBCQUEwQjtJQUNqRCxnQkFBZ0IsRUFBRSxzQkFBc0I7SUFFeEMsc0JBQXNCO0lBQ3RCLEtBQUssRUFBRSxZQUFZO0lBQ25CLGFBQWEsRUFBRSxtQkFBbUI7SUFDbEMsWUFBWSxFQUFFLGtCQUFrQjtJQUNoQyxPQUFPLEVBQUUsY0FBYztJQUN2QixXQUFXLEVBQUUsaUJBQWlCO0lBQzlCLFFBQVEsRUFBRSxlQUFlO0lBQ3pCLFlBQVksRUFBRSxrQkFBa0I7SUFFaEMsd0JBQXdCO0lBQ3hCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFlBQVksRUFBRSxrQkFBa0I7SUFDaEMsSUFBSSxFQUFFLFdBQVc7SUFDakIsZUFBZSxFQUFFLHFCQUFxQjtJQUN0QyxRQUFRLEVBQUUsZUFBZTtJQUN6QixRQUFRLEVBQUUsZUFBZTtJQUN6QixPQUFPLEVBQUUsY0FBYztJQUN2QixPQUFP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YUFBYSxDQUFDO0lBQzVFLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsd0JBQWdCLENBQUMsVUFBVSxDQUFDO0NBQ2hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhYmFzZUZhY3RvcnkgfSBmcm9tICcuL2RhdGFiYXNlLWZhY3RvcnknO1xuXG4vLyBCYXNlIHRhYmxlIG5hbWVzICh3aXRob3V0IGVudmlyb25tZW50IHByZWZpeClcbmV4cG9ydCBjb25zdCBCQVNFX1RBQkxFX05BTUVTID0ge1xuICAgIC8vIEN1c3RvbWVyIEFwcCBUYWJsZXNcbiAgICBBUFBfRkVFREJBQ0s6ICdBcHBGZWVkYmFja1RhYmxlJyxcbiAgICBMU1FfQ1JNOiAnTHNxQ3JtVGFibGUnLFxuICAgIENVVExFUlk6ICdDdXRsZXJ5VGFibGUnLFxuICAgIElURU1fQUNDT01QQU5JTUVOVFM6ICdJdGVtQWNjb21wYW5pbWVudHNUYWJsZScsXG4gICAgQ1VJU0lORTogJ0N1aXNpbmVUYWJsZScsXG4gICAgVElFUl9ERVRBSUxTOiAnVGllckRldGFpbHNUYWJsZScsXG4gICAgVVNFUl9PUkRFUl9TVU1NQVJZOiAnVXNlck9yZGVyU3VtbWFyeVRhYmxlJyxcbiAgICBUSUVSX1JFRkVSUkFMOiAnVGllclJlZmVycmFsVGFibGUnLFxuICAgIFVTRVJfQUREUkVTU19SRVFVRVNUOiAnVXNlckFkZHJlc3NSZXF1ZXN0VGFibGUnLFxuICAgIENPTU1PTl9GRUVEQkFDSzogJ0NvbW1vbkZlZWRiYWNrVGFibGUnLFxuICAgIEdVRVNUX0ZFRURCQUNLOiAnR3Vlc3RGZWVkYmFja1RhYmxlJyxcbiAgICBDT1VOVEVSOiAnQ291bnRlclRhYmxlJyxcbiAgICBSRVFVRVNUX0lOVk9JQ0U6ICdSZXF1ZXN0SW52b2ljZVRhYmxlJyxcbiAgICBQTEFUVEVSX1NFQVJDSF9FVkVOVFM6ICdQbGF0dGVyU2VhcmNoRXZlbnRzVGFibGUnLFxuICAgIE9SREVSX1JFVklFV19GRUVEQkFDSzogJ09yZGVyUmV2aWV3RmVlZGJhY2tUYWJsZScsXG4gICAgQ0FURVJJTkdfUkVRVUVTVDogJ0NhdGVyaW5nUmVxdWVzdFRhYmxlJyxcblxuICAgIC8vIE9yZGVyIE1vZHVsZSBUYWJsZXNcbiAgICBPUkRFUjogJ09yZGVyVGFibGUnLFxuICAgIE9SREVSX0FERFJFU1M6ICdPcmRlckFkZHJlc3NUYWJsZScsXG4gICAgT1JERVJfUkVWSUVXOiAnT3JkZXJSZXZpZXdUYWJsZScsXG4gICAgUEFZTUVOVDogJ1BheW1lbnRUYWJsZScsXG4gICAgUExBVEVfT1JERVI6ICdQbGF0ZU9yZGVyVGFibGUnLFxuICAgIFRSQUNLSU5HOiAnVHJhY2tpbmdUYWJsZScsXG4gICAgVVNFUl9BRERSRVNTOiAnVXNlckFkZHJlc3NUYWJsZScsXG5cbiAgICAvLyBPdGhlciBDdXN0b21lciBUYWJsZXNcbiAgICBBRERfT05TOiAnQWRkT25zVGFibGUnLFxuICAgIEJBTktfREVUQUlMUzogJ0JhbmtEZXRhaWxzVGFibGUnLFxuICAgIENBUlQ6ICdDYXJ0VGFibGUnLFxuICAgIENBUlRfQ0FURUdPUklFUzogJ0NhcnRDYXRlZ29yaWVzVGFibGUnLFxuICAgIENBVEVHT1JZOiAnQ2F0ZWdvcnlUYWJsZScsXG4gICAgQ0FURVJJTkc6ICdDYXRlcmluZ1RhYmxlJyxcbiAgICBDT05URU5UOiAnQ29udGVudFRhYmxlJyxcbiAgICBDT1VQT05TOiAnQ291cG9uc1RhYmxlJyxcbiAgICBERUZBVUxUX1BMQVRURVI6ICdEZWZhdWx0UGxhdHRlclRhYmxlJyxcbiAgICBERUZBVUxUX1BMQVRURVJfQ0FURUdPUklFUzogJ0RlZmF1bHRQbGF0dGVyQ2F0ZWdvcmllc1RhYmxlJyxcbiAgICBERUZBVUxUX1BMQVRURVJfSVRFTVM6ICdEZWZhdWx0UGxhdHRlckl0ZW1zVGFibGUnLFxuICAgIEVWRU5UX0VYRUNVVElWRVM6ICdFdmVudEV4ZWN1dGl2ZXNUYWJsZScsXG4gICAgSVRFTVM6ICdJdGVtc1RhYmxlJyxcbiAgICBMRUFEOiAnTGVhZFRhYmxlJyxcbiAgICBPQ0NBU0lPTjogJ09jY2FzaW9uVGFibGUnLFxuICAgIFJFRkVSUkFMX0NPTlRFTlQ6ICdSZWZlcnJhbENvbnRlbnRUYWJsZScsXG4gICAgVVNFUjogJ1VzZXJUYWJsZScsXG4gICAgV0FMTEVUOiAnV2FsbGV0VGFibGUnLFxuICAgIFdBTExFVF9UUkFOU0FDVElPTjogJ1dhbGxldFRyYW5zYWN0aW9uVGFibGUnLFxuICAgIFdJVEhEUkFXTjogJ1dpdGhkcmF3blRhYmxlJyxcblxuICAgIC8vIEludGVybmFsIFVzZXIgVGFibGVzXG4gICAgSU5URVJOQUxfVVNFUjogJ0ludGVybmFsVXNlclRhYmxlJyxcbiAgICBBQ1RJVklUWV9MT0dTOiAnQWN0aXZpdHlMb2dzVGFibGUnLFxuICAgIFFVT1RBVElPTlM6ICdRdW90YXRpb25zVGFibGUnXG59IGFzIGNvbnN0O1xuXG4vLyBFbnZpcm9ubWVudC1hd2FyZSB0YWJsZSBuYW1lIGdldHRlclxuZXhwb3J0IGNsYXNzIFRhYmxlTmFtZU1hbmFnZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFibGVOYW1lKGJhc2VUYWJsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBEYXRhYmFzZUZhY3RvcnkuZ2V0VGFibGVOYW1lKGJhc2VUYWJsZU5hbWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsVGFibGVOYW1lcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKEJBU0VfVEFCTEVfTkFNRVMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGFibGVOYW1lc1trZXldID0gdGhpcy5nZXRUYWJsZU5hbWUodmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGFibGVOYW1lcztcbiAgICB9XG59XG5cbi8vIEV4cG9ydCBlbnZpcm9ubWVudC1hd2FyZSB0YWJsZSBuYW1lc1xuZXhwb3J0IGNvbnN0IFRBQkxFX05BTUVTID0ge1xuICAgIC8vIEN1c3RvbWVyIEFwcCBUYWJsZXNcbiAgICBBUFBfRkVFREJBQ0s6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuQVBQX0ZFRURCQUNLKSxcbiAgICBMU1FfQ1JNOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkxTUV9DUk0pLFxuICAgIENVVExFUlk6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuQ1VUTEVSWSksXG4gICAgSVRFTV9BQ0NPTVBBTklNRU5UUzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5JVEVNX0FDQ09NUEFOSU1FTlRTKSxcbiAgICBDVUlTSU5FOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkNVSVNJTkUpLFxuICAgIFRJRVJfREVUQUlMUzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5USUVSX0RFVEFJTFMpLFxuICAgIFVTRVJfT1JERVJfU1VNTUFSWTogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5VU0VSX09SREVSX1NVTU1BUlkpLFxuICAgIFRJRVJfUkVGRVJSQUw6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuVElFUl9SRUZFUlJBTCksXG4gICAgVVNFUl9BRERSRVNTX1JFUVVFU1Q6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuVVNFUl9BRERSRVNTX1JFUVVFU1QpLFxuICAgIENPTU1PTl9GRUVEQkFDSzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5DT01NT05fRkVFREJBQ0spLFxuICAgIEdVRVNUX0ZFRURCQUNLOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkdVRVNUX0ZFRURCQUNLKSxcbiAgICBDT1VOVEVSOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkNPVU5URVIpLFxuICAgIFJFUVVFU1RfSU5WT0lDRTogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5SRVFVRVNUX0lOVk9JQ0UpLFxuICAgIFBMQVRURVJfU0VBUkNIX0VWRU5UUzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5QTEFUVEVSX1NFQVJDSF9FVkVOVFMpLFxuICAgIE9SREVSX1JFVklFV19GRUVEQkFDSzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5PUkRFUl9SRVZJRVdfRkVFREJBQ0spLFxuICAgIENBVEVSSU5HX1JFUVVFU1Q6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuQ0FURVJJTkdfUkVRVUVTVCksXG5cbiAgICAvLyBPcmRlciBNb2R1bGUgVGFibGVzXG4gICAgT1JERVI6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuT1JERVIpLFxuICAgIE9SREVSX0FERFJFU1M6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuT1JERVJfQUREUkVTUyksXG4gICAgT1JERVJfUkVWSUVXOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLk9SREVSX1JFVklFVyksXG4gICAgUEFZTUVOVDogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5QQVlNRU5UKSxcbiAgICBQTEFURV9PUkRFUjogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5QTEFURV9PUkRFUiksXG4gICAgVFJBQ0tJTkc6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuVFJBQ0tJTkcpLFxuICAgIFVTRVJfQUREUkVTUzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5VU0VSX0FERFJFU1MpLFxuXG4gICAgLy8gT3RoZXIgQ3VzdG9tZXIgVGFibGVzXG4gICAgQUREX09OUzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5BRERfT05TKSxcbiAgICBCQU5LX0RFVEFJTFM6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuQkFOS19ERVRBSUxTKSxcbiAgICBDQVJUOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkNBUlQpLFxuICAgIENBUlRfQ0FURUdPUklFUzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5DQVJUX0NBVEVHT1JJRVMpLFxuICAgIENBVEVHT1JZOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkNBVEVHT1JZKSxcbiAgICBDQVRFUklORzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5DQVRFUklORyksXG4gICAgQ09OVEVOVDogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5DT05URU5UKSxcbiAgICBDT1VQT05TOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkNPVVBPTlMpLFxuICAgIERFRkFVTFRfUExBVFRFUjogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5ERUZBVUxUX1BMQVRURVIpLFxuICAgIERFRkFVTFRfUExBVFRFUl9DQVRFR09SSUVTOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkRFRkFVTFRfUExBVFRFUl9DQVRFR09SSUVTKSxcbiAgICBERUZBVUxUX1BMQVRURVJfSVRFTVM6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuREVGQVVMVF9QTEFUVEVSX0lURU1TKSxcbiAgICBFVkVOVF9FWEVDVVRJVkVTOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkVWRU5UX0VYRUNVVElWRVMpLFxuICAgIElURU1TOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLklURU1TKSxcbiAgICBMRUFEOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLkxFQUQpLFxuICAgIE9DQ0FTSU9OOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLk9DQ0FTSU9OKSxcbiAgICBSRUZFUlJBTF9DT05URU5UOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLlJFRkVSUkFMX0NPTlRFTlQpLFxuICAgIFVTRVI6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuVVNFUiksXG4gICAgV0FMTEVUOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLldBTExFVCksXG4gICAgV0FMTEVUX1RSQU5TQUNUSU9OOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLldBTExFVF9UUkFOU0FDVElPTiksXG4gICAgV0lUSERSQVdOOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLldJVEhEUkFXTiksXG5cbiAgICAvLyBJbnRlcm5hbCBVc2VyIFRhYmxlc1xuICAgIElOVEVSTkFMX1VTRVI6IFRhYmxlTmFtZU1hbmFnZXIuZ2V0VGFibGVOYW1lKEJBU0VfVEFCTEVfTkFNRVMuSU5URVJOQUxfVVNFUiksXG4gICAgQUNUSVZJVFlfTE9HUzogVGFibGVOYW1lTWFuYWdlci5nZXRUYWJsZU5hbWUoQkFTRV9UQUJMRV9OQU1FUy5BQ1RJVklUWV9MT0dTKSxcbiAgICBRVU9UQVRJT05TOiBUYWJsZU5hbWVNYW5hZ2VyLmdldFRhYmxlTmFtZShCQVNFX1RBQkxFX05BTUVTLlFVT1RBVElPTlMpXG59IGFzIGNvbnN0O1xuIl19
@@ -22,7 +22,7 @@ __decorate([
22
22
  (0, annotations_1.attribute)()
23
23
  ], TierRefererModel.prototype, "referralName", void 0);
24
24
  __decorate([
25
- (0, annotations_1.attribute)()
25
+ (0, annotations_1.attribute)({ indexKeyConfigurations: { "sentToIndex": "HASH" }, type: 'String' })
26
26
  ], TierRefererModel.prototype, "sentTo", void 0);
27
27
  __decorate([
28
28
  (0, annotations_1.attribute)()
@@ -36,4 +36,4 @@ __decorate([
36
36
  exports.TierRefererModel = TierRefererModel = __decorate([
37
37
  (0, annotations_1.table)("TierReferralTable")
38
38
  ], TierRefererModel);
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllci1yZWZlcnJhbC1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jdXN0b21lci11c2VyL3RpZXItcmVmZXJyYWwvdGllci1yZWZlcnJhbC1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSx1REFBK0U7QUFDL0UsaURBQTZDO0FBR3RDLElBQU0sZ0JBQWdCLEdBQXRCLE1BQU0sZ0JBQWlCLFNBQVEsc0JBQVM7Q0FxQjlDLENBQUE7QUFyQlksNENBQWdCO0FBRXpCO0lBREMsSUFBQSxrQ0FBb0IsRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzt3REFDbEI7QUFHdkI7SUFEQyxJQUFBLHVCQUFTLEVBQUMsRUFBRSxzQkFBc0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0RBQ2xFO0FBR2Y7SUFEQyxJQUFBLHVCQUFTLEdBQUU7c0RBQ1U7QUFHdEI7SUFEQyxJQUFBLHVCQUFTLEdBQUU7Z0RBQ0c7QUFHZjtJQURDLElBQUEsdUJBQVMsR0FBRTtnREFDRztBQUdmO0lBREMsSUFBQSx1QkFBUyxHQUFFO3NEQUNTO0FBR3JCO0lBREMsSUFBQSx1QkFBUyxFQUFDLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7cURBQ2xFOzJCQXBCWCxnQkFBZ0I7SUFENUIsSUFBQSxtQkFBSyxFQUFDLG1CQUFtQixDQUFDO0dBQ2QsZ0JBQWdCLENBcUI1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF0dHJpYnV0ZSwgYXV0b0dlbmVyYXRlZEhhc2hLZXksIHRhYmxlIH0gZnJvbSBcIkBub3ZhLW9kbS9hbm5vdGF0aW9uc1wiO1xuaW1wb3J0IHsgQmFzZU1vZGVsIH0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcblxuQHRhYmxlKFwiVGllclJlZmVycmFsVGFibGVcIilcbmV4cG9ydCBjbGFzcyBUaWVyUmVmZXJlck1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgICBAYXV0b0dlbmVyYXRlZEhhc2hLZXkoeyB0eXBlOiAnU3RyaW5nJyB9KVxuICAgIHRpZXJSZWZlcnJhbElkOiBzdHJpbmc7XG5cbiAgICBAYXR0cmlidXRlKHsgaW5kZXhLZXlDb25maWd1cmF0aW9uczogeyBcInVzZXJJZEluZGV4XCI6IFwiSEFTSFwiIH0sIHR5cGU6ICdTdHJpbmcnIH0pXG4gICAgdXNlcklkOiBzdHJpbmc7XG5cbiAgICBAYXR0cmlidXRlKClcbiAgICByZWZlcnJhbE5hbWU/OiBzdHJpbmc7XG5cbiAgICBAYXR0cmlidXRlKClcbiAgICBzZW50VG86IHN0cmluZzsgLy8gTW9iaWxlIE51bWJlclxuXG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgc3RhdHVzOiBzdHJpbmc7IC8vIFJFUVVFU1RFRCwgSk9JTkVELCBFQVJORURcblxuICAgIEBhdHRyaWJ1dGUoKVxuICAgIHNlbmRlZEFtb3VudDogbnVtYmVyOyAvLyBWMiBVcGRhdGUgdG8gcGFzcyBhY3R1YWwgc2VudCBhbW91bnQgZm9yIHNpZ25VcCtvcmRlcnZhbHVlIDEwJVxuXG4gICAgQGF0dHJpYnV0ZSh7IGluZGV4S2V5Q29uZmlndXJhdGlvbnM6IHsgXCJhcHBsaWVkQ29kZUluZGV4XCI6IFwiSEFTSFwiIH0sIHR5cGU6ICdTdHJpbmcnIH0pXG4gICAgYXBwbGllZENvZGU6IHN0cmluZzsgLy8gQXBwbGllZCBDb2RlXG59Il19
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGllci1yZWZlcnJhbC1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jdXN0b21lci11c2VyL3RpZXItcmVmZXJyYWwvdGllci1yZWZlcnJhbC1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSx1REFBK0U7QUFDL0UsaURBQTZDO0FBR3RDLElBQU0sZ0JBQWdCLEdBQXRCLE1BQU0sZ0JBQWlCLFNBQVEsc0JBQVM7Q0FxQjlDLENBQUE7QUFyQlksNENBQWdCO0FBRXpCO0lBREMsSUFBQSxrQ0FBb0IsRUFBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzt3REFDbEI7QUFHdkI7SUFEQyxJQUFBLHVCQUFTLEVBQUMsRUFBRSxzQkFBc0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0RBQ2xFO0FBR2Y7SUFEQyxJQUFBLHVCQUFTLEdBQUU7c0RBQ1U7QUFHdEI7SUFEQyxJQUFBLHVCQUFTLEVBQUMsRUFBRSxzQkFBc0IsRUFBRSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0RBQ2xFO0FBR2Y7SUFEQyxJQUFBLHVCQUFTLEdBQUU7Z0RBQ0c7QUFHZjtJQURDLElBQUEsdUJBQVMsR0FBRTtzREFDUztBQUdyQjtJQURDLElBQUEsdUJBQVMsRUFBQyxFQUFFLHNCQUFzQixFQUFFLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO3FEQUNsRTsyQkFwQlgsZ0JBQWdCO0lBRDVCLElBQUEsbUJBQUssRUFBQyxtQkFBbUIsQ0FBQztHQUNkLGdCQUFnQixDQXFCNUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhdHRyaWJ1dGUsIGF1dG9HZW5lcmF0ZWRIYXNoS2V5LCB0YWJsZSB9IGZyb20gXCJAbm92YS1vZG0vYW5ub3RhdGlvbnNcIjtcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsXCI7XG5cbkB0YWJsZShcIlRpZXJSZWZlcnJhbFRhYmxlXCIpXG5leHBvcnQgY2xhc3MgVGllclJlZmVyZXJNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gICAgQGF1dG9HZW5lcmF0ZWRIYXNoS2V5KHsgdHlwZTogJ1N0cmluZycgfSlcbiAgICB0aWVyUmVmZXJyYWxJZDogc3RyaW5nO1xuXG4gICAgQGF0dHJpYnV0ZSh7IGluZGV4S2V5Q29uZmlndXJhdGlvbnM6IHsgXCJ1c2VySWRJbmRleFwiOiBcIkhBU0hcIiB9LCB0eXBlOiAnU3RyaW5nJyB9KVxuICAgIHVzZXJJZDogc3RyaW5nO1xuXG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgcmVmZXJyYWxOYW1lPzogc3RyaW5nO1xuXG4gICAgQGF0dHJpYnV0ZSh7IGluZGV4S2V5Q29uZmlndXJhdGlvbnM6IHsgXCJzZW50VG9JbmRleFwiOiBcIkhBU0hcIiB9LCB0eXBlOiAnU3RyaW5nJyB9KVxuICAgIHNlbnRUbzogc3RyaW5nOyAvLyBNb2JpbGUgTnVtYmVyXG5cbiAgICBAYXR0cmlidXRlKClcbiAgICBzdGF0dXM6IHN0cmluZzsgLy8gUkVRVUVTVEVELCBKT0lORUQsIEVBUk5FRFxuXG4gICAgQGF0dHJpYnV0ZSgpXG4gICAgc2VuZGVkQW1vdW50OiBudW1iZXI7IC8vIFYyIFVwZGF0ZSB0byBwYXNzIGFjdHVhbCBzZW50IGFtb3VudCBmb3Igc2lnblVwK29yZGVydmFsdWUgMTAlXG5cbiAgICBAYXR0cmlidXRlKHsgaW5kZXhLZXlDb25maWd1cmF0aW9uczogeyBcImFwcGxpZWRDb2RlSW5kZXhcIjogXCJIQVNIXCIgfSwgdHlwZTogJ1N0cmluZycgfSlcbiAgICBhcHBsaWVkQ29kZTogc3RyaW5nOyAvLyBBcHBsaWVkIENvZGVcbn0iXX0=
package/index.js CHANGED
@@ -1,3 +1,9 @@
1
+ // Environment Configuration
2
+ export { envManager, EnvironmentManager } from './dist/config/environment-config';
3
+ export { DatabaseFactory } from './dist/config/database-factory';
4
+ export { TableNameManager, TABLE_NAMES, BASE_TABLE_NAMES } from './dist/config/table-names';
5
+
6
+ // Core Database Components
1
7
  export { InternalUserModel } from './dist/internal-user/internal-user-model';
2
8
  export { internalUserDao } from './dist/internal-user/internal-user-dao';
3
9
  export { GenericDAO } from './dist/base-dao';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cmp-aws-database",
3
- "version": "1.1.106",
3
+ "version": "1.1.107-dev.1",
4
4
  "bin": {
5
5
  "craft-my-plate-database": "bin/craft-my-plate-database.js"
6
6
  },
@@ -8,7 +8,17 @@
8
8
  "build": "tsc",
9
9
  "watch": "tsc -w",
10
10
  "test": "jest",
11
- "cdk": "cdk"
11
+ "cdk": "cdk",
12
+ "version:info": "node scripts/version-strategy.js info",
13
+ "version:increment": "node scripts/version-strategy.js increment",
14
+ "version:sync": "node scripts/version-strategy.js sync",
15
+ "deploy:dev": "./scripts/deploy-environment.sh -e DEV",
16
+ "deploy:proddebug": "./scripts/deploy-environment.sh -e PRODDEBUG",
17
+ "deploy:prod": "./scripts/deploy-environment.sh -e PROD",
18
+ "deploy:dev:skip-tests": "./scripts/deploy-environment.sh -e DEV --skip-tests",
19
+ "deploy:proddebug:skip-tests": "./scripts/deploy-environment.sh -e PRODDEBUG --skip-tests",
20
+ "deploy:prod:skip-tests": "./scripts/deploy-environment.sh -e PROD --skip-tests",
21
+ "create-branches": "./scripts/create-environment-branches.sh"
12
22
  },
13
23
  "devDependencies": {
14
24
  "@types/jest": "^29.5.14",
@@ -1,6 +0,0 @@
1
- import { GenericDAO } from "../../../base-dao";
2
- import { PaymentModel } from "./payment-model";
3
- declare class PaymentDAO extends GenericDAO<PaymentModel> {
4
- }
5
- export declare const paymentDao: PaymentDAO;
6
- export {};
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.paymentDao = void 0;
4
- const base_dao_1 = require("../../../base-dao");
5
- class PaymentDAO extends base_dao_1.GenericDAO {
6
- }
7
- exports.paymentDao = new PaymentDAO();
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF5bWV0LWRhby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jdXN0b21lci11c2VyL29yZGVyLW1vZHVsZS9wYXltZW50L3BheW1ldC1kYW8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQStDO0FBRy9DLE1BQU0sVUFBVyxTQUFRLHFCQUF3QjtDQUVoRDtBQUVZLFFBQUEsVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZW5lcmljREFPIH0gZnJvbSBcIi4uLy4uLy4uL2Jhc2UtZGFvXCI7XG5pbXBvcnQgeyBQYXltZW50TW9kZWwgfSBmcm9tIFwiLi9wYXltZW50LW1vZGVsXCI7XG5cbmNsYXNzIFBheW1lbnREQU8gZXh0ZW5kcyBHZW5lcmljREFPPFBheW1lbnRNb2RlbD4ge1xuXG59XG5cbmV4cG9ydCBjb25zdCBwYXltZW50RGFvID0gbmV3IFBheW1lbnREQU8oKTsiXX0=