@dyanet/nestjs-config-aws 1.2.1 → 2.0.0

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.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -43
  3. package/dist/cjs/aws-config-loader.js +57 -0
  4. package/dist/cjs/build-loaders.js +58 -0
  5. package/dist/cjs/config.module.js +138 -0
  6. package/dist/cjs/index.js +46 -0
  7. package/dist/cjs/interfaces/config-service.interface.js +11 -0
  8. package/dist/cjs/interfaces/default-schema.interface.js +63 -0
  9. package/dist/cjs/{nestjs-config-aws/src/interfaces → interfaces}/index.js +1 -1
  10. package/dist/cjs/interfaces/module-options.interface.js +3 -0
  11. package/dist/cjs/package.json +3 -0
  12. package/dist/cjs/services/config.service.js +142 -0
  13. package/dist/esm/aws-config-loader.js +54 -0
  14. package/dist/esm/build-loaders.js +55 -0
  15. package/dist/esm/config.module.js +135 -0
  16. package/dist/esm/index.js +18 -0
  17. package/dist/esm/interfaces/config-service.interface.js +7 -0
  18. package/dist/esm/interfaces/default-schema.interface.js +59 -0
  19. package/dist/esm/interfaces/index.js +8 -0
  20. package/dist/esm/interfaces/module-options.interface.js +2 -0
  21. package/dist/esm/package.json +3 -1
  22. package/dist/esm/services/config.service.js +139 -0
  23. package/dist/types/aws-config-loader.d.ts +74 -0
  24. package/dist/types/aws-config-loader.d.ts.map +1 -0
  25. package/dist/types/build-loaders.d.ts +30 -0
  26. package/dist/types/build-loaders.d.ts.map +1 -0
  27. package/dist/types/{nestjs-config-aws/src/config.module.d.ts → config.module.d.ts} +2 -8
  28. package/dist/types/config.module.d.ts.map +1 -0
  29. package/dist/types/index.d.ts +10 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/interfaces/config-service.interface.d.ts.map +1 -0
  32. package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/default-schema.interface.d.ts +14 -14
  33. package/dist/types/interfaces/default-schema.interface.d.ts.map +1 -0
  34. package/dist/types/interfaces/index.d.ts.map +1 -0
  35. package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/module-options.interface.d.ts +22 -3
  36. package/dist/types/interfaces/module-options.interface.d.ts.map +1 -0
  37. package/dist/types/services/config.service.d.ts.map +1 -0
  38. package/package.json +13 -7
  39. package/dist/cjs/config-aws/src/config-manager.js +0 -366
  40. package/dist/cjs/config-aws/src/errors/index.js +0 -77
  41. package/dist/cjs/config-aws/src/index.js +0 -37
  42. package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +0 -3
  43. package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +0 -3
  44. package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +0 -3
  45. package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +0 -3
  46. package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +0 -3
  47. package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -3
  48. package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -3
  49. package/dist/cjs/config-aws/src/loaders/env-file.loader.js +0 -169
  50. package/dist/cjs/config-aws/src/loaders/environment.loader.js +0 -85
  51. package/dist/cjs/config-aws/src/loaders/s3.loader.js +0 -145
  52. package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +0 -169
  53. package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -199
  54. package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +0 -98
  55. package/dist/cjs/config-aws/src/utils/validation.util.js +0 -116
  56. package/dist/cjs/nestjs-config-aws/src/config.module.js +0 -175
  57. package/dist/cjs/nestjs-config-aws/src/index.js +0 -61
  58. package/dist/cjs/nestjs-config-aws/src/integration/index.js +0 -23
  59. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -3
  60. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -3
  61. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/index.js +0 -26
  62. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -3
  63. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -3
  64. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
  65. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -3
  66. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -4
  67. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -52
  68. package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -124
  69. package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -592
  70. package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -385
  71. package/dist/cjs/nestjs-config-aws/src/integration/providers/index.js +0 -20
  72. package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -366
  73. package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -267
  74. package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -517
  75. package/dist/cjs/nestjs-config-aws/src/integration/services/index.js +0 -26
  76. package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -81
  77. package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -465
  78. package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -318
  79. package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -292
  80. package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -595
  81. package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -283
  82. package/dist/cjs/nestjs-config-aws/src/integration/utils/index.js +0 -19
  83. package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -11
  84. package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -63
  85. package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -3
  86. package/dist/cjs/nestjs-config-aws/src/services/config.service.js +0 -142
  87. package/dist/esm/config-aws/src/config-manager.js +0 -362
  88. package/dist/esm/config-aws/src/errors/index.js +0 -69
  89. package/dist/esm/config-aws/src/index.js +0 -21
  90. package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +0 -2
  91. package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +0 -2
  92. package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +0 -2
  93. package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +0 -2
  94. package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +0 -2
  95. package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -2
  96. package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -2
  97. package/dist/esm/config-aws/src/loaders/env-file.loader.js +0 -132
  98. package/dist/esm/config-aws/src/loaders/environment.loader.js +0 -81
  99. package/dist/esm/config-aws/src/loaders/s3.loader.js +0 -141
  100. package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +0 -165
  101. package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -195
  102. package/dist/esm/config-aws/src/utils/env-file-parser.util.js +0 -94
  103. package/dist/esm/config-aws/src/utils/validation.util.js +0 -112
  104. package/dist/esm/nestjs-config-aws/src/config.module.js +0 -172
  105. package/dist/esm/nestjs-config-aws/src/index.js +0 -23
  106. package/dist/esm/nestjs-config-aws/src/integration/index.js +0 -7
  107. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -2
  108. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -2
  109. package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +0 -10
  110. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -2
  111. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -2
  112. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
  113. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -2
  114. package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -3
  115. package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -44
  116. package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -121
  117. package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -589
  118. package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -382
  119. package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +0 -4
  120. package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -363
  121. package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -264
  122. package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -514
  123. package/dist/esm/nestjs-config-aws/src/integration/services/index.js +0 -10
  124. package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -78
  125. package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -462
  126. package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -315
  127. package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -289
  128. package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -589
  129. package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -240
  130. package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +0 -3
  131. package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -7
  132. package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -59
  133. package/dist/esm/nestjs-config-aws/src/interfaces/index.js +0 -8
  134. package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -2
  135. package/dist/esm/nestjs-config-aws/src/services/config.service.js +0 -139
  136. package/dist/types/config-aws/src/config-manager.d.ts +0 -119
  137. package/dist/types/config-aws/src/config-manager.d.ts.map +0 -1
  138. package/dist/types/config-aws/src/errors/index.d.ts +0 -43
  139. package/dist/types/config-aws/src/errors/index.d.ts.map +0 -1
  140. package/dist/types/config-aws/src/index.d.ts +0 -24
  141. package/dist/types/config-aws/src/index.d.ts.map +0 -1
  142. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +0 -33
  143. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +0 -1
  144. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +0 -86
  145. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +0 -1
  146. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +0 -12
  147. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +0 -1
  148. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +0 -10
  149. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +0 -1
  150. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +0 -14
  151. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +0 -1
  152. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +0 -12
  153. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +0 -1
  154. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +0 -14
  155. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +0 -1
  156. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +0 -69
  157. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +0 -1
  158. package/dist/types/config-aws/src/loaders/environment.loader.d.ts +0 -46
  159. package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +0 -1
  160. package/dist/types/config-aws/src/loaders/s3.loader.d.ts +0 -62
  161. package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +0 -1
  162. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +0 -68
  163. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +0 -1
  164. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +0 -78
  165. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
  166. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +0 -45
  167. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +0 -1
  168. package/dist/types/config-aws/src/utils/validation.util.d.ts +0 -53
  169. package/dist/types/config-aws/src/utils/validation.util.d.ts.map +0 -1
  170. package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +0 -1
  171. package/dist/types/nestjs-config-aws/src/index.d.ts +0 -11
  172. package/dist/types/nestjs-config-aws/src/index.d.ts.map +0 -1
  173. package/dist/types/nestjs-config-aws/src/integration/index.d.ts +0 -6
  174. package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +0 -1
  175. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts +0 -71
  176. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
  177. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts +0 -24
  178. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
  179. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts +0 -9
  180. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +0 -1
  181. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts +0 -66
  182. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +0 -1
  183. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts +0 -17
  184. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +0 -1
  185. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts +0 -332
  186. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
  187. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts +0 -259
  188. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
  189. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts +0 -209
  190. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
  191. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts +0 -249
  192. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +0 -1
  193. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts +0 -36
  194. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +0 -1
  195. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts +0 -134
  196. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
  197. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts +0 -119
  198. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +0 -1
  199. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts +0 -3
  200. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +0 -1
  201. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts +0 -84
  202. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +0 -1
  203. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts +0 -84
  204. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +0 -1
  205. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts +0 -158
  206. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +0 -1
  207. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts +0 -9
  208. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +0 -1
  209. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts +0 -41
  210. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +0 -1
  211. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts +0 -192
  212. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +0 -1
  213. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts +0 -87
  214. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
  215. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts +0 -103
  216. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +0 -1
  217. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts +0 -222
  218. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +0 -1
  219. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts +0 -81
  220. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +0 -1
  221. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts +0 -2
  222. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +0 -1
  223. package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +0 -1
  224. package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +0 -1
  225. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +0 -1
  226. package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +0 -1
  227. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +0 -1
  228. /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/config-service.interface.d.ts +0 -0
  229. /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/index.d.ts +0 -0
  230. /package/dist/types/{nestjs-config-aws/src/services → services}/config.service.d.ts +0 -0
@@ -1,385 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- var __param = (this && this.__param) || function (paramIndex, decorator) {
12
- return function (target, key) { decorator(target, key, paramIndex); }
13
- };
14
- var ConfigurationFactoryProviderImpl_1;
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.ConfigurationFactoryProviderImpl = void 0;
17
- const common_1 = require("@nestjs/common");
18
- const config_1 = require("@nestjs/config");
19
- const precedence_handler_service_1 = require("../services/precedence-handler.service");
20
- const nestjs_config_integration_module_1 = require("../nestjs-config-integration.module");
21
- /**
22
- * Implementation of ConfigurationFactoryProvider that creates configuration factories
23
- * for @nestjs/config integration with AWS configuration sources.
24
- */
25
- let ConfigurationFactoryProviderImpl = ConfigurationFactoryProviderImpl_1 = class ConfigurationFactoryProviderImpl {
26
- precedenceHandler;
27
- options;
28
- logger = new common_1.Logger(ConfigurationFactoryProviderImpl_1.name);
29
- constructor(precedenceHandler, options) {
30
- this.precedenceHandler = precedenceHandler;
31
- this.options = options;
32
- }
33
- /**
34
- * Create a configuration factory for a specific namespace.
35
- * @param namespace - The namespace for the configuration
36
- * @param config - The configuration data
37
- * @returns A configuration factory that can be used with @nestjs/config
38
- */
39
- createFactory(namespace, config) {
40
- this.logger.debug(`Creating configuration factory for namespace: ${namespace}`);
41
- // Create a factory function that returns the configuration
42
- const factory = () => {
43
- this.logger.debug(`Factory called for namespace: ${namespace}`);
44
- const processedConfig = this.processConfigurationValues(config);
45
- // Add metadata for debugging and introspection
46
- if (this.options?.enableLogging) {
47
- this.logger.debug(`Factory returning ${Object.keys(processedConfig).length} configuration keys for namespace: ${namespace}`);
48
- }
49
- return processedConfig;
50
- };
51
- // If namespace is provided, use registerAs to create a namespaced factory
52
- if (namespace && namespace.trim() !== '') {
53
- const namespacedFactory = (0, config_1.registerAs)(namespace, factory);
54
- // Enhance the factory with additional metadata for better integration
55
- namespacedFactory.__namespace = namespace;
56
- namespacedFactory.__isAwsFactory = true;
57
- namespacedFactory.__configKeys = Object.keys(config);
58
- return namespacedFactory;
59
- }
60
- // For non-namespaced factories, add metadata as well
61
- factory.__isAwsFactory = true;
62
- factory.__configKeys = Object.keys(config);
63
- return factory;
64
- }
65
- /**
66
- * Create multiple namespaced configuration factories from a configuration object.
67
- * @param config - The configuration data organized by namespace
68
- * @returns Array of configuration factories
69
- */
70
- createNamespacedFactories(config) {
71
- this.logger.debug(`Creating namespaced factories for ${Object.keys(config).length} namespaces`);
72
- const factories = [];
73
- for (const [namespace, namespaceConfig] of Object.entries(config)) {
74
- if (this.isValidNamespaceConfig(namespace, namespaceConfig)) {
75
- try {
76
- const factory = this.createFactory(namespace, namespaceConfig);
77
- factories.push(factory);
78
- this.logger.debug(`Created factory for namespace: ${namespace}`);
79
- }
80
- catch (error) {
81
- this.logger.error(`Failed to create factory for namespace ${namespace}:`, error);
82
- }
83
- }
84
- else {
85
- this.logger.warn(`Skipping invalid namespace configuration: ${namespace}`);
86
- }
87
- }
88
- return factories;
89
- }
90
- /**
91
- * Merge AWS configuration with existing local configuration using precedence rules.
92
- * @param awsConfig - Configuration loaded from AWS sources
93
- * @param localConfig - Local configuration data
94
- * @returns Merged configuration data
95
- */
96
- mergeWithExisting(awsConfig, localConfig) {
97
- this.logger.debug('Merging AWS configuration with local configuration');
98
- // Create configuration sources for precedence handling
99
- const sources = [
100
- {
101
- name: 'local-config',
102
- type: 'local-file',
103
- priority: 1,
104
- data: localConfig,
105
- loadedAt: new Date()
106
- },
107
- {
108
- name: 'aws-config',
109
- type: 'secrets-manager', // Assume AWS config is from secrets manager for now
110
- priority: 2,
111
- data: awsConfig,
112
- loadedAt: new Date()
113
- }
114
- ];
115
- // Use AWS-first precedence by default
116
- const merged = this.precedenceHandler.applyPrecedenceRules(sources, 'aws-first');
117
- this.logger.debug(`Merged configuration with ${Object.keys(merged).length} top-level keys`);
118
- return merged;
119
- }
120
- /**
121
- * Create an enhanced AWS configuration factory with metadata.
122
- * @param namespace - Optional namespace for the configuration
123
- * @param config - The configuration data
124
- * @param sources - Sources that contributed to this configuration
125
- * @param precedenceRule - Precedence rule applied to this configuration
126
- * @returns Enhanced AWS configuration factory
127
- */
128
- createAwsConfigurationFactory(namespace, config, sources, precedenceRule) {
129
- const baseFactory = namespace
130
- ? this.createFactory(namespace, config)
131
- : this.createFactory('', config);
132
- // Enhance the factory with AWS-specific metadata
133
- const awsFactory = baseFactory;
134
- awsFactory.namespace = namespace;
135
- awsFactory.sources = sources;
136
- awsFactory.precedenceRule = precedenceRule;
137
- this.logger.debug(`Created AWS configuration factory with ${sources.length} sources and precedence: ${precedenceRule}`);
138
- return awsFactory;
139
- }
140
- /**
141
- * Create configuration factories from multiple sources with proper organization.
142
- * @param sourceConfigs - Map of source name to configuration data
143
- * @param namespaces - Optional list of namespaces to organize configuration
144
- * @returns Array of configuration factories organized by namespace
145
- */
146
- createFactoriesFromSources(sourceConfigs, namespaces) {
147
- this.logger.debug(`Creating factories from ${sourceConfigs.size} sources`);
148
- const factories = [];
149
- if (namespaces && namespaces.length > 0) {
150
- // Create namespaced factories
151
- for (const namespace of namespaces) {
152
- const namespaceConfig = this.extractNamespaceConfig(sourceConfigs, namespace);
153
- if (Object.keys(namespaceConfig).length > 0) {
154
- const factory = this.createFactory(namespace, namespaceConfig);
155
- factories.push(factory);
156
- }
157
- }
158
- }
159
- else {
160
- // Create a single factory with all configuration
161
- const mergedConfig = this.mergeSourceConfigs(sourceConfigs);
162
- if (Object.keys(mergedConfig).length > 0) {
163
- const factory = this.createFactory('', mergedConfig);
164
- factories.push(factory);
165
- }
166
- }
167
- this.logger.debug(`Created ${factories.length} factories from sources`);
168
- return factories;
169
- }
170
- /**
171
- * Create configuration factories from sources with precedence rules.
172
- * @param sources - Array of configuration sources
173
- * @param precedenceRule - Precedence rule to apply
174
- * @param namespaces - Optional list of namespaces to organize configuration
175
- * @returns Array of configuration factories
176
- */
177
- createFactoriesWithPrecedence(sources, precedenceRule, namespaces) {
178
- this.logger.debug(`Creating factories with precedence rule: ${precedenceRule}`);
179
- // Validate sources first
180
- const validation = this.precedenceHandler.validateSources(sources);
181
- if (!validation.valid) {
182
- this.logger.error('Invalid sources provided:', validation.issues);
183
- throw new Error(`Invalid configuration sources: ${validation.issues.join(', ')}`);
184
- }
185
- const factories = [];
186
- if (namespaces && namespaces.length > 0) {
187
- // Create namespaced factories with precedence
188
- for (const namespace of namespaces) {
189
- const namespaceSources = this.extractNamespaceSources(sources, namespace);
190
- if (namespaceSources.length > 0) {
191
- const mergedConfig = this.precedenceHandler.applyPrecedenceRules(namespaceSources, precedenceRule);
192
- const factory = this.createAwsConfigurationFactory(namespace, mergedConfig, namespaceSources, precedenceRule);
193
- factories.push(factory);
194
- }
195
- }
196
- }
197
- else {
198
- // Create a single factory with all configuration
199
- const mergedConfig = this.precedenceHandler.applyPrecedenceRules(sources, precedenceRule);
200
- const factory = this.createAwsConfigurationFactory(undefined, mergedConfig, sources, precedenceRule);
201
- factories.push(factory);
202
- }
203
- this.logger.debug(`Created ${factories.length} factories with precedence`);
204
- return factories;
205
- }
206
- /**
207
- * Merge configuration with explicit precedence rule.
208
- * @param sources - Configuration sources
209
- * @param precedenceRule - Precedence rule to apply
210
- * @returns Merged configuration data
211
- */
212
- mergeWithPrecedence(sources, precedenceRule) {
213
- this.logger.debug(`Merging ${sources.length} sources with precedence: ${precedenceRule}`);
214
- const validation = this.precedenceHandler.validateSources(sources);
215
- if (!validation.valid) {
216
- this.logger.error('Invalid sources provided:', validation.issues);
217
- throw new Error(`Invalid configuration sources: ${validation.issues.join(', ')}`);
218
- }
219
- return this.precedenceHandler.applyPrecedenceRules(sources, precedenceRule);
220
- }
221
- /**
222
- * Process configuration values to handle special cases and transformations.
223
- * @param config - Raw configuration object
224
- * @returns Processed configuration object
225
- */
226
- processConfigurationValues(config) {
227
- const processed = {};
228
- for (const [key, value] of Object.entries(config)) {
229
- processed[key] = this.processValue(value);
230
- }
231
- return processed;
232
- }
233
- /**
234
- * Process individual configuration values.
235
- * @param value - The value to process
236
- * @returns Processed value
237
- */
238
- processValue(value) {
239
- if (value === null || value === undefined) {
240
- return value;
241
- }
242
- // Handle string values that might need type conversion
243
- if (typeof value === 'string') {
244
- return this.convertStringValue(value);
245
- }
246
- // Handle nested objects
247
- if (typeof value === 'object' && !Array.isArray(value)) {
248
- return this.processConfigurationValues(value);
249
- }
250
- // Handle arrays
251
- if (Array.isArray(value)) {
252
- return value.map(item => this.processValue(item));
253
- }
254
- return value;
255
- }
256
- /**
257
- * Convert string values to appropriate types.
258
- * @param value - String value to convert
259
- * @returns Converted value
260
- */
261
- convertStringValue(value) {
262
- // Handle boolean strings
263
- if (value.toLowerCase() === 'true')
264
- return true;
265
- if (value.toLowerCase() === 'false')
266
- return false;
267
- // Handle numeric strings
268
- if (/^\d+$/.test(value)) {
269
- const num = parseInt(value, 10);
270
- return isNaN(num) ? value : num;
271
- }
272
- if (/^\d*\.\d+$/.test(value)) {
273
- const num = parseFloat(value);
274
- return isNaN(num) ? value : num;
275
- }
276
- // Handle JSON strings
277
- if ((value.startsWith('{') && value.endsWith('}')) ||
278
- (value.startsWith('[') && value.endsWith(']'))) {
279
- try {
280
- return JSON.parse(value);
281
- }
282
- catch {
283
- // If parsing fails, return as string
284
- return value;
285
- }
286
- }
287
- return value;
288
- }
289
- /**
290
- * Validate if a namespace configuration is valid.
291
- * @param namespace - The namespace name
292
- * @param config - The configuration data
293
- * @returns True if valid, false otherwise
294
- */
295
- isValidNamespaceConfig(namespace, config) {
296
- return typeof namespace === 'string' &&
297
- namespace.trim() !== '' &&
298
- config !== null &&
299
- config !== undefined &&
300
- typeof config === 'object' &&
301
- !Array.isArray(config);
302
- }
303
- /**
304
- * Deep merge two configuration objects.
305
- * @param target - Target object
306
- * @param source - Source object
307
- * @returns Merged object
308
- */
309
- deepMerge(target, source) {
310
- const result = { ...target };
311
- for (const [key, value] of Object.entries(source)) {
312
- if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
313
- if (result[key] && typeof result[key] === 'object' && !Array.isArray(result[key])) {
314
- result[key] = this.deepMerge(result[key], value);
315
- }
316
- else {
317
- result[key] = { ...value };
318
- }
319
- }
320
- else {
321
- result[key] = value;
322
- }
323
- }
324
- return result;
325
- }
326
- /**
327
- * Extract configuration for a specific namespace from multiple sources.
328
- * @param sourceConfigs - Map of source configurations
329
- * @param namespace - Target namespace
330
- * @returns Configuration for the namespace
331
- */
332
- extractNamespaceConfig(sourceConfigs, namespace) {
333
- let namespaceConfig = {};
334
- for (const [sourceName, config] of sourceConfigs) {
335
- if (config[namespace]) {
336
- namespaceConfig = this.deepMerge(namespaceConfig, config[namespace]);
337
- this.logger.debug(`Extracted ${namespace} config from source: ${sourceName}`);
338
- }
339
- }
340
- return namespaceConfig;
341
- }
342
- /**
343
- * Merge configuration from multiple sources.
344
- * @param sourceConfigs - Map of source configurations
345
- * @returns Merged configuration
346
- */
347
- mergeSourceConfigs(sourceConfigs) {
348
- let mergedConfig = {};
349
- for (const [sourceName, config] of sourceConfigs) {
350
- mergedConfig = this.deepMerge(mergedConfig, config);
351
- this.logger.debug(`Merged config from source: ${sourceName}`);
352
- }
353
- return mergedConfig;
354
- }
355
- /**
356
- * Extract sources for a specific namespace.
357
- * @param sources - All configuration sources
358
- * @param namespace - Target namespace
359
- * @returns Sources filtered for the namespace
360
- */
361
- extractNamespaceSources(sources, namespace) {
362
- const namespaceSources = [];
363
- for (const source of sources) {
364
- if (source.namespace === namespace || source.data[namespace]) {
365
- const namespaceData = source.namespace === namespace ? source.data : source.data[namespace];
366
- if (namespaceData && typeof namespaceData === 'object') {
367
- namespaceSources.push({
368
- ...source,
369
- data: namespaceData,
370
- namespace: namespace
371
- });
372
- }
373
- }
374
- }
375
- return namespaceSources;
376
- }
377
- };
378
- exports.ConfigurationFactoryProviderImpl = ConfigurationFactoryProviderImpl;
379
- exports.ConfigurationFactoryProviderImpl = ConfigurationFactoryProviderImpl = ConfigurationFactoryProviderImpl_1 = __decorate([
380
- (0, common_1.Injectable)(),
381
- __param(1, (0, common_1.Optional)()),
382
- __param(1, (0, common_1.Inject)(nestjs_config_integration_module_1.NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS)),
383
- __metadata("design:paramtypes", [precedence_handler_service_1.PrecedenceHandlerService, Object])
384
- ], ConfigurationFactoryProviderImpl);
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1mYWN0b3J5LnByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uL3Byb3ZpZGVycy9jb25maWd1cmF0aW9uLWZhY3RvcnkucHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFzRTtBQUN0RSwyQ0FBMkQ7QUFJM0QsdUZBQWtGO0FBQ2xGLDBGQUE0RjtBQUU1Rjs7O0dBR0c7QUFFSSxJQUFNLGdDQUFnQyx3Q0FBdEMsTUFBTSxnQ0FBZ0M7SUFJeEI7SUFFQTtJQUxGLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxrQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUU1RSxZQUNtQixpQkFBMkMsRUFFM0MsT0FBNEI7UUFGNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUEwQjtRQUUzQyxZQUFPLEdBQVAsT0FBTyxDQUFxQjtJQUM1QyxDQUFDO0lBRUo7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsU0FBaUIsRUFBRSxNQUEyQjtRQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUVoRiwyREFBMkQ7UUFDM0QsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVoRSwrQ0FBK0M7WUFDL0MsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxNQUFNLHNDQUFzQyxTQUFT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QUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxnQkFBZ0IsQ0FBQztJQUMxQixDQUFDO0NBQ0YsQ0FBQTtBQXRhWSw0RUFBZ0M7MkNBQWhDLGdDQUFnQztJQUQ1QyxJQUFBLG1CQUFVLEdBQUU7SUFNUixXQUFBLElBQUEsaUJBQVEsR0FBRSxDQUFBO0lBQUUsV0FBQSxJQUFBLGVBQU0sRUFBQyx3RUFBcUMsQ0FBQyxDQUFBO3FDQUR0QixxREFBd0I7R0FKbkQsZ0NBQWdDLENBc2E1QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgQ29uZmlnRmFjdG9yeSwgcmVnaXN0ZXJBcyB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlciwgQXdzQ29uZmlndXJhdGlvbkZhY3RvcnkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24tZmFjdG9yeS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uU291cmNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLXNvdXJjZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBQcmVjZWRlbmNlUnVsZSwgSW50ZWdyYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pbnRlZ3JhdGlvbi1vcHRpb25zLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFByZWNlZGVuY2VIYW5kbGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ByZWNlZGVuY2UtaGFuZGxlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTkVTVEpTX0NPTkZJR19BV1NfSU5URUdSQVRJT05fT1BUSU9OUyB9IGZyb20gJy4uL25lc3Rqcy1jb25maWctaW50ZWdyYXRpb24ubW9kdWxlJztcclxuXHJcbi8qKlxyXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBDb25maWd1cmF0aW9uRmFjdG9yeVByb3ZpZGVyIHRoYXQgY3JlYXRlcyBjb25maWd1cmF0aW9uIGZhY3Rvcmllc1xyXG4gKiBmb3IgQG5lc3Rqcy9jb25maWcgaW50ZWdyYXRpb24gd2l0aCBBV1MgY29uZmlndXJhdGlvbiBzb3VyY2VzLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlckltcGwgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uRmFjdG9yeVByb3ZpZGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlciA9IG5ldyBMb2dnZXIoQ29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlckltcGwubmFtZSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVjZWRlbmNlSGFuZGxlcjogUHJlY2VkZW5jZUhhbmRsZXJTZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChORVNUSlNfQ09ORklHX0FXU19JTlRFR1JBVElPTl9PUFRJT05TKSBcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucz86IEludGVncmF0aW9uT3B0aW9uc1xyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgY29uZmlndXJhdGlvbiBmYWN0b3J5IGZvciBhIHNwZWNpZmljIG5hbWVzcGFjZS5cclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGNvbmZpZ3VyYXRpb25cclxuICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gZGF0YVxyXG4gICAqIEByZXR1cm5zIEEgY29uZmlndXJhdGlvbiBmYWN0b3J5IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBAbmVzdGpzL2NvbmZpZ1xyXG4gICAqL1xyXG4gIGNyZWF0ZUZhY3RvcnkobmFtZXNwYWNlOiBzdHJpbmcsIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IENvbmZpZ0ZhY3Rvcnkge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0aW5nIGNvbmZpZ3VyYXRpb24gZmFjdG9yeSBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZX1gKTtcclxuICAgIFxyXG4gICAgLy8gQ3JlYXRlIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb25cclxuICAgIGNvbnN0IGZhY3RvcnkgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBGYWN0b3J5IGNhbGxlZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZX1gKTtcclxuICAgICAgY29uc3QgcHJvY2Vzc2VkQ29uZmlnID0gdGhpcy5wcm9jZXNzQ29uZmlndXJhdGlvblZhbHVlcyhjb25maWcpO1xyXG4gICAgICBcclxuICAgICAgLy8gQWRkIG1ldGFkYXRhIGZvciBkZWJ1Z2dpbmcgYW5kIGludHJvc3BlY3Rpb25cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucz8uZW5hYmxlTG9nZ2luZykge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBGYWN0b3J5IHJldHVybmluZyAke09iamVjdC5rZXlzKHByb2Nlc3NlZENvbmZpZykubGVuZ3RofSBjb25maWd1cmF0aW9uIGtleXMgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2V9YCk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHJldHVybiBwcm9jZXNzZWRDb25maWc7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIElmIG5hbWVzcGFjZSBpcyBwcm92aWRlZCwgdXNlIHJlZ2lzdGVyQXMgdG8gY3JlYXRlIGEgbmFtZXNwYWNlZCBmYWN0b3J5XHJcbiAgICBpZiAobmFtZXNwYWNlICYmIG5hbWVzcGFjZS50cmltKCkgIT09ICcnKSB7XHJcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWRGYWN0b3J5ID0gcmVnaXN0ZXJBcyhuYW1lc3BhY2UsIGZhY3RvcnkpO1xyXG4gICAgICBcclxuICAgICAgLy8gRW5oYW5jZSB0aGUgZmFjdG9yeSB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEgZm9yIGJldHRlciBpbnRlZ3JhdGlvblxyXG4gICAgICAobmFtZXNwYWNlZEZhY3RvcnkgYXMgYW55KS5fX25hbWVzcGFjZSA9IG5hbWVzcGFjZTtcclxuICAgICAgKG5hbWVzcGFjZWRGYWN0b3J5IGFzIGFueSkuX19pc0F3c0ZhY3RvcnkgPSB0cnVlO1xyXG4gICAgICAobmFtZXNwYWNlZEZhY3RvcnkgYXMgYW55KS5fX2NvbmZpZ0tleXMgPSBPYmplY3Qua2V5cyhjb25maWcpO1xyXG4gICAgICBcclxuICAgICAgcmV0dXJuIG5hbWVzcGFjZWRGYWN0b3J5O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvciBub24tbmFtZXNwYWNlZCBmYWN0b3JpZXMsIGFkZCBtZXRhZGF0YSBhcyB3ZWxsXHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9faXNBd3NGYWN0b3J5ID0gdHJ1ZTtcclxuICAgIChmYWN0b3J5IGFzIGFueSkuX19jb25maWdLZXlzID0gT2JqZWN0LmtleXMoY29uZmlnKTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgbXVsdGlwbGUgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3RvcmllcyBmcm9tIGEgY29uZmlndXJhdGlvbiBvYmplY3QuXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBjb25maWd1cmF0aW9uIGRhdGEgb3JnYW5pemVkIGJ5IG5hbWVzcGFjZVxyXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzXHJcbiAgICovXHJcbiAgY3JlYXRlTmFtZXNwYWNlZEZhY3Rvcmllcyhjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBDb25maWdGYWN0b3J5W10ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0aW5nIG5hbWVzcGFjZWQgZmFjdG9yaWVzIGZvciAke09iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RofSBuYW1lc3BhY2VzYCk7XHJcbiAgICBjb25zdCBmYWN0b3JpZXM6IENvbmZpZ0ZhY3RvcnlbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IFtuYW1lc3BhY2UsIG5hbWVzcGFjZUNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnKSkge1xyXG4gICAgICBpZiAodGhpcy5pc1ZhbGlkTmFtZXNwYWNlQ29uZmlnKG5hbWVzcGFjZSwgbmFtZXNwYWNlQ29uZmlnKSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5jcmVhdGVGYWN0b3J5KG5hbWVzcGFjZSwgbmFtZXNwYWNlQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pO1xyXG4gICAgICAgICAgZmFjdG9yaWVzLnB1c2goZmFjdG9yeSk7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRlZCBmYWN0b3J5IGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlfWApO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBmYWN0b3J5IGZvciBuYW1lc3BhY2UgJHtuYW1lc3BhY2V9OmAsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihgU2tpcHBpbmcgaW52YWxpZCBuYW1lc3BhY2UgY29uZmlndXJhdGlvbjogJHtuYW1lc3BhY2V9YCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIGZhY3RvcmllcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1lcmdlIEFXUyBjb25maWd1cmF0aW9uIHdpdGggZXhpc3RpbmcgbG9jYWwgY29uZmlndXJhdGlvbiB1c2luZyBwcmVjZWRlbmNlIHJ1bGVzLlxyXG4gICAqIEBwYXJhbSBhd3NDb25maWcgLSBDb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIEFXUyBzb3VyY2VzXHJcbiAgICogQHBhcmFtIGxvY2FsQ29uZmlnIC0gTG9jYWwgY29uZmlndXJhdGlvbiBkYXRhXHJcbiAgICogQHJldHVybnMgTWVyZ2VkIGNvbmZpZ3VyYXRpb24gZGF0YVxyXG4gICAqL1xyXG4gIG1lcmdlV2l0aEV4aXN0aW5nKFxyXG4gICAgYXdzQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBcclxuICAgIGxvY2FsQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XHJcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTWVyZ2luZyBBV1MgY29uZmlndXJhdGlvbiB3aXRoIGxvY2FsIGNvbmZpZ3VyYXRpb24nKTtcclxuICAgIFxyXG4gICAgLy8gQ3JlYXRlIGNvbmZpZ3VyYXRpb24gc291cmNlcyBmb3IgcHJlY2VkZW5jZSBoYW5kbGluZ1xyXG4gICAgY29uc3Qgc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ2xvY2FsLWNvbmZpZycsXHJcbiAgICAgICAgdHlwZTogJ2xvY2FsLWZpbGUnLFxyXG4gICAgICAgIHByaW9yaXR5OiAxLFxyXG4gICAgICAgIGRhdGE6IGxvY2FsQ29uZmlnLFxyXG4gICAgICAgIGxvYWRlZEF0OiBuZXcgRGF0ZSgpXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnYXdzLWNvbmZpZycsXHJcbiAgICAgICAgdHlwZTogJ3NlY3JldHMtbWFuYWdlcicsIC8vIEFzc3VtZSBBV1MgY29uZmlnIGlzIGZyb20gc2VjcmV0cyBtYW5hZ2VyIGZvciBub3dcclxuICAgICAgICBwcmlvcml0eTogMixcclxuICAgICAgICBkYXRhOiBhd3NDb25maWcsXHJcbiAgICAgICAgbG9hZGVkQXQ6IG5ldyBEYXRlKClcclxuICAgICAgfVxyXG4gICAgXTtcclxuXHJcbiAgICAvLyBVc2UgQVdTLWZpcnN0IHByZWNlZGVuY2UgYnkgZGVmYXVsdFxyXG4gICAgY29uc3QgbWVyZ2VkID0gdGhpcy5wcmVjZWRlbmNlSGFuZGxlci5hcHBseVByZWNlZGVuY2VSdWxlcyhzb3VyY2VzLCAnYXdzLWZpcnN0Jyk7XHJcbiAgICBcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBNZXJnZWQgY29uZmlndXJhdGlvbiB3aXRoICR7T2JqZWN0LmtleXMobWVyZ2VkKS5sZW5ndGh9IHRvcC1sZXZlbCBrZXlzYCk7XHJcbiAgICByZXR1cm4gbWVyZ2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGVuaGFuY2VkIEFXUyBjb25maWd1cmF0aW9uIGZhY3Rvcnkgd2l0aCBtZXRhZGF0YS5cclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gT3B0aW9uYWwgbmFtZXNwYWNlIGZvciB0aGUgY29uZmlndXJhdGlvblxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBkYXRhXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBTb3VyY2VzIHRoYXQgY29udHJpYnV0ZWQgdG8gdGhpcyBjb25maWd1cmF0aW9uXHJcbiAgICogQHBhcmFtIHByZWNlZGVuY2VSdWxlIC0gUHJlY2VkZW5jZSBydWxlIGFwcGxpZWQgdG8gdGhpcyBjb25maWd1cmF0aW9uXHJcbiAgICogQHJldHVybnMgRW5oYW5jZWQgQVdTIGNvbmZpZ3VyYXRpb24gZmFjdG9yeVxyXG4gICAqL1xyXG4gIGNyZWF0ZUF3c0NvbmZpZ3VyYXRpb25GYWN0b3J5KFxyXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXHJcbiAgICBzb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW10sXHJcbiAgICBwcmVjZWRlbmNlUnVsZTogUHJlY2VkZW5jZVJ1bGVcclxuICApOiBBd3NDb25maWd1cmF0aW9uRmFjdG9yeSB7XHJcbiAgICBjb25zdCBiYXNlRmFjdG9yeSA9IG5hbWVzcGFjZSBcclxuICAgICAgPyB0aGlzLmNyZWF0ZUZhY3RvcnkobmFtZXNwYWNlLCBjb25maWcpXHJcbiAgICAgIDogdGhpcy5jcmVhdGVGYWN0b3J5KCcnLCBjb25maWcpO1xyXG5cclxuICAgIC8vIEVuaGFuY2UgdGhlIGZhY3Rvcnkgd2l0aCBBV1Mtc3BlY2lmaWMgbWV0YWRhdGFcclxuICAgIGNvbnN0IGF3c0ZhY3RvcnkgPSBiYXNlRmFjdG9yeSBhcyBBd3NDb25maWd1cmF0aW9uRmFjdG9yeTtcclxuICAgIGF3c0ZhY3RvcnkubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xyXG4gICAgYXdzRmFjdG9yeS5zb3VyY2VzID0gc291cmNlcztcclxuICAgIGF3c0ZhY3RvcnkucHJlY2VkZW5jZVJ1bGUgPSBwcmVjZWRlbmNlUnVsZTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRlZCBBV1MgY29uZmlndXJhdGlvbiBmYWN0b3J5IHdpdGggJHtzb3VyY2VzLmxlbmd0aH0gc291cmNlcyBhbmQgcHJlY2VkZW5jZTogJHtwcmVjZWRlbmNlUnVsZX1gKTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGF3c0ZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgY29uZmlndXJhdGlvbiBmYWN0b3JpZXMgZnJvbSBtdWx0aXBsZSBzb3VyY2VzIHdpdGggcHJvcGVyIG9yZ2FuaXphdGlvbi5cclxuICAgKiBAcGFyYW0gc291cmNlQ29uZmlncyAtIE1hcCBvZiBzb3VyY2UgbmFtZSB0byBjb25maWd1cmF0aW9uIGRhdGFcclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlcyAtIE9wdGlvbmFsIGxpc3Qgb2YgbmFtZXNwYWNlcyB0byBvcmdhbml6ZSBjb25maWd1cmF0aW9uXHJcbiAgICogQHJldHVybnMgQXJyYXkgb2YgY29uZmlndXJhdGlvbiBmYWN0b3JpZXMgb3JnYW5pemVkIGJ5IG5hbWVzcGFjZVxyXG4gICAqL1xyXG4gIGNyZWF0ZUZhY3Rvcmllc0Zyb21Tb3VyY2VzKFxyXG4gICAgc291cmNlQ29uZmlnczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4sXHJcbiAgICBuYW1lc3BhY2VzPzogc3RyaW5nW11cclxuICApOiBDb25maWdGYWN0b3J5W10ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0aW5nIGZhY3RvcmllcyBmcm9tICR7c291cmNlQ29uZmlncy5zaXplfSBzb3VyY2VzYCk7XHJcbiAgICBjb25zdCBmYWN0b3JpZXM6IENvbmZpZ0ZhY3RvcnlbXSA9IFtdO1xyXG5cclxuICAgIGlmIChuYW1lc3BhY2VzICYmIG5hbWVzcGFjZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBDcmVhdGUgbmFtZXNwYWNlZCBmYWN0b3JpZXNcclxuICAgICAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgbmFtZXNwYWNlcykge1xyXG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZUNvbmZpZyA9IHRoaXMuZXh0cmFjdE5hbWVzcGFjZUNvbmZpZyhzb3VyY2VDb25maWdzLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhuYW1lc3BhY2VDb25maWcpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNyZWF0ZUZhY3RvcnkobmFtZXNwYWNlLCBuYW1lc3BhY2VDb25maWcpO1xyXG4gICAgICAgICAgZmFjdG9yaWVzLnB1c2goZmFjdG9yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBDcmVhdGUgYSBzaW5nbGUgZmFjdG9yeSB3aXRoIGFsbCBjb25maWd1cmF0aW9uXHJcbiAgICAgIGNvbnN0IG1lcmdlZENvbmZpZyA9IHRoaXMubWVyZ2VTb3VyY2VDb25maWdzKHNvdXJjZUNvbmZpZ3MpO1xyXG4gICAgICBpZiAoT2JqZWN0LmtleXMobWVyZ2VkQ29uZmlnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuY3JlYXRlRmFjdG9yeSgnJywgbWVyZ2VkQ29uZmlnKTtcclxuICAgICAgICBmYWN0b3JpZXMucHVzaChmYWN0b3J5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkICR7ZmFjdG9yaWVzLmxlbmd0aH0gZmFjdG9yaWVzIGZyb20gc291cmNlc2ApO1xyXG4gICAgcmV0dXJuIGZhY3RvcmllcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBjb25maWd1cmF0aW9uIGZhY3RvcmllcyBmcm9tIHNvdXJjZXMgd2l0aCBwcmVjZWRlbmNlIHJ1bGVzLlxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQXJyYXkgb2YgY29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHBhcmFtIHByZWNlZGVuY2VSdWxlIC0gUHJlY2VkZW5jZSBydWxlIHRvIGFwcGx5XHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZXMgLSBPcHRpb25hbCBsaXN0IG9mIG5hbWVzcGFjZXMgdG8gb3JnYW5pemUgY29uZmlndXJhdGlvblxyXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzXHJcbiAgICovXHJcbiAgY3JlYXRlRmFjdG9yaWVzV2l0aFByZWNlZGVuY2UoXHJcbiAgICBzb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW10sXHJcbiAgICBwcmVjZWRlbmNlUnVsZTogUHJlY2VkZW5jZVJ1bGUsXHJcbiAgICBuYW1lc3BhY2VzPzogc3RyaW5nW11cclxuICApOiBDb25maWdGYWN0b3J5W10ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0aW5nIGZhY3RvcmllcyB3aXRoIHByZWNlZGVuY2UgcnVsZTogJHtwcmVjZWRlbmNlUnVsZX1gKTtcclxuICAgIFxyXG4gICAgLy8gVmFsaWRhdGUgc291cmNlcyBmaXJzdFxyXG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucHJlY2VkZW5jZUhhbmRsZXIudmFsaWRhdGVTb3VyY2VzKHNvdXJjZXMpO1xyXG4gICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdJbnZhbGlkIHNvdXJjZXMgcHJvdmlkZWQ6JywgdmFsaWRhdGlvbi5pc3N1ZXMpO1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29uZmlndXJhdGlvbiBzb3VyY2VzOiAke3ZhbGlkYXRpb24uaXNzdWVzLmpvaW4oJywgJyl9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZmFjdG9yaWVzOiBDb25maWdGYWN0b3J5W10gPSBbXTtcclxuXHJcbiAgICBpZiAobmFtZXNwYWNlcyAmJiBuYW1lc3BhY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gQ3JlYXRlIG5hbWVzcGFjZWQgZmFjdG9yaWVzIHdpdGggcHJlY2VkZW5jZVxyXG4gICAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZSBvZiBuYW1lc3BhY2VzKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlU291cmNlcyA9IHRoaXMuZXh0cmFjdE5hbWVzcGFjZVNvdXJjZXMoc291cmNlcywgbmFtZXNwYWNlKTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlU291cmNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBjb25zdCBtZXJnZWRDb25maWcgPSB0aGlzLnByZWNlZGVuY2VIYW5kbGVyLmFwcGx5UHJlY2VkZW5jZVJ1bGVzKG5hbWVzcGFjZVNvdXJjZXMsIHByZWNlZGVuY2VSdWxlKTtcclxuICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNyZWF0ZUF3c0NvbmZpZ3VyYXRpb25GYWN0b3J5KG5hbWVzcGFjZSwgbWVyZ2VkQ29uZmlnLCBuYW1lc3BhY2VTb3VyY2VzLCBwcmVjZWRlbmNlUnVsZSk7XHJcbiAgICAgICAgICBmYWN0b3JpZXMucHVzaChmYWN0b3J5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIENyZWF0ZSBhIHNpbmdsZSBmYWN0b3J5IHdpdGggYWxsIGNvbmZpZ3VyYXRpb25cclxuICAgICAgY29uc3QgbWVyZ2VkQ29uZmlnID0gdGhpcy5wcmVjZWRlbmNlSGFuZGxlci5hcHBseVByZWNlZGVuY2VSdWxlcyhzb3VyY2VzLCBwcmVjZWRlbmNlUnVsZSk7XHJcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNyZWF0ZUF3c0NvbmZpZ3VyYXRpb25GYWN0b3J5KHVuZGVmaW5lZCwgbWVyZ2VkQ29uZmlnLCBzb3VyY2VzLCBwcmVjZWRlbmNlUnVsZSk7XHJcbiAgICAgIGZhY3Rvcmllcy5wdXNoKGZhY3RvcnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkICR7ZmFjdG9yaWVzLmxlbmd0aH0gZmFjdG9yaWVzIHdpdGggcHJlY2VkZW5jZWApO1xyXG4gICAgcmV0dXJuIGZhY3RvcmllcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1lcmdlIGNvbmZpZ3VyYXRpb24gd2l0aCBleHBsaWNpdCBwcmVjZWRlbmNlIHJ1bGUuXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcGFyYW0gcHJlY2VkZW5jZVJ1bGUgLSBQcmVjZWRlbmNlIHJ1bGUgdG8gYXBwbHlcclxuICAgKiBAcmV0dXJucyBNZXJnZWQgY29uZmlndXJhdGlvbiBkYXRhXHJcbiAgICovXHJcbiAgbWVyZ2VXaXRoUHJlY2VkZW5jZShcclxuICAgIHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSxcclxuICAgIHByZWNlZGVuY2VSdWxlOiBQcmVjZWRlbmNlUnVsZVxyXG4gICk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYE1lcmdpbmcgJHtzb3VyY2VzLmxlbmd0aH0gc291cmNlcyB3aXRoIHByZWNlZGVuY2U6ICR7cHJlY2VkZW5jZVJ1bGV9YCk7XHJcbiAgICBcclxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnByZWNlZGVuY2VIYW5kbGVyLnZhbGlkYXRlU291cmNlcyhzb3VyY2VzKTtcclxuICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignSW52YWxpZCBzb3VyY2VzIHByb3ZpZGVkOicsIHZhbGlkYXRpb24uaXNzdWVzKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gc291cmNlczogJHt2YWxpZGF0aW9uLmlzc3Vlcy5qb2luKCcsICcpfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnByZWNlZGVuY2VIYW5kbGVyLmFwcGx5UHJlY2VkZW5jZVJ1bGVzKHNvdXJjZXMsIHByZWNlZGVuY2VSdWxlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2Nlc3MgY29uZmlndXJhdGlvbiB2YWx1ZXMgdG8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgYW5kIHRyYW5zZm9ybWF0aW9ucy5cclxuICAgKiBAcGFyYW0gY29uZmlnIC0gUmF3IGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICogQHJldHVybnMgUHJvY2Vzc2VkIGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwcm9jZXNzQ29uZmlndXJhdGlvblZhbHVlcyhjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIGNvbnN0IHByb2Nlc3NlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZykpIHtcclxuICAgICAgcHJvY2Vzc2VkW2tleV0gPSB0aGlzLnByb2Nlc3NWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2Nlc3MgaW5kaXZpZHVhbCBjb25maWd1cmF0aW9uIHZhbHVlcy5cclxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcHJvY2Vzc1xyXG4gICAqIEByZXR1cm5zIFByb2Nlc3NlZCB2YWx1ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcHJvY2Vzc1ZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBzdHJpbmcgdmFsdWVzIHRoYXQgbWlnaHQgbmVlZCB0eXBlIGNvbnZlcnNpb25cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRTdHJpbmdWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBvYmplY3RzXHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0NvbmZpZ3VyYXRpb25WYWx1ZXModmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEhhbmRsZSBhcnJheXNcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWUubWFwKGl0ZW0gPT4gdGhpcy5wcm9jZXNzVmFsdWUoaXRlbSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgc3RyaW5nIHZhbHVlcyB0byBhcHByb3ByaWF0ZSB0eXBlcy5cclxuICAgKiBAcGFyYW0gdmFsdWUgLSBTdHJpbmcgdmFsdWUgdG8gY29udmVydFxyXG4gICAqIEByZXR1cm5zIENvbnZlcnRlZCB2YWx1ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29udmVydFN0cmluZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgLy8gSGFuZGxlIGJvb2xlYW4gc3RyaW5nc1xyXG4gICAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJykgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAodmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ2ZhbHNlJykgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8vIEhhbmRsZSBudW1lcmljIHN0cmluZ3NcclxuICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xyXG4gICAgICBjb25zdCBudW0gPSBwYXJzZUludCh2YWx1ZSwgMTApO1xyXG4gICAgICByZXR1cm4gaXNOYU4obnVtKSA/IHZhbHVlIDogbnVtO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgvXlxcZCpcXC5cXGQrJC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdCh2YWx1ZSk7XHJcbiAgICAgIHJldHVybiBpc05hTihudW0pID8gdmFsdWUgOiBudW07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSGFuZGxlIEpTT04gc3RyaW5nc1xyXG4gICAgaWYgKCh2YWx1ZS5zdGFydHNXaXRoKCd7JykgJiYgdmFsdWUuZW5kc1dpdGgoJ30nKSkgfHwgXHJcbiAgICAgICAgKHZhbHVlLnN0YXJ0c1dpdGgoJ1snKSAmJiB2YWx1ZS5lbmRzV2l0aCgnXScpKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgLy8gSWYgcGFyc2luZyBmYWlscywgcmV0dXJuIGFzIHN0cmluZ1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGlmIGEgbmFtZXNwYWNlIGNvbmZpZ3VyYXRpb24gaXMgdmFsaWQuXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2UgbmFtZVxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBkYXRhXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1ZhbGlkTmFtZXNwYWNlQ29uZmlnKG5hbWVzcGFjZTogc3RyaW5nLCBjb25maWc6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnICYmIFxyXG4gICAgICAgICAgIG5hbWVzcGFjZS50cmltKCkgIT09ICcnICYmXHJcbiAgICAgICAgICAgY29uZmlnICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgY29uZmlnICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICAgICB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICAgICAgICFBcnJheS5pc0FycmF5KGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWVwIG1lcmdlIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMuXHJcbiAgICogQHBhcmFtIHRhcmdldCAtIFRhcmdldCBvYmplY3RcclxuICAgKiBAcGFyYW0gc291cmNlIC0gU291cmNlIG9iamVjdFxyXG4gICAqIEByZXR1cm5zIE1lcmdlZCBvYmplY3RcclxuICAgKi9cclxuICBwcml2YXRlIGRlZXBNZXJnZSh0YXJnZXQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZTogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi50YXJnZXQgfTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2UpKSB7XHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgIGlmIChyZXN1bHRba2V5XSAmJiB0eXBlb2YgcmVzdWx0W2tleV0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlc3VsdFtrZXldKSkge1xyXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLmRlZXBNZXJnZShyZXN1bHRba2V5XSwgdmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHRba2V5XSA9IHsgLi4udmFsdWUgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHRyYWN0IGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlIGZyb20gbXVsdGlwbGUgc291cmNlcy5cclxuICAgKiBAcGFyYW0gc291cmNlQ29uZmlncyAtIE1hcCBvZiBzb3VyY2UgY29uZmlndXJhdGlvbnNcclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGFyZ2V0IG5hbWVzcGFjZVxyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBuYW1lc3BhY2VcclxuICAgKi9cclxuICBwcml2YXRlIGV4dHJhY3ROYW1lc3BhY2VDb25maWcoXHJcbiAgICBzb3VyY2VDb25maWdzOiBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcclxuICAgIG5hbWVzcGFjZTogc3RyaW5nXHJcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICBsZXQgbmFtZXNwYWNlQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XHJcblxyXG4gICAgZm9yIChjb25zdCBbc291cmNlTmFtZSwgY29uZmlnXSBvZiBzb3VyY2VDb25maWdzKSB7XHJcbiAgICAgIGlmIChjb25maWdbbmFtZXNwYWNlXSkge1xyXG4gICAgICAgIG5hbWVzcGFjZUNvbmZpZyA9IHRoaXMuZGVlcE1lcmdlKG5hbWVzcGFjZUNvbmZpZywgY29uZmlnW25hbWVzcGFjZV0pO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBFeHRyYWN0ZWQgJHtuYW1lc3BhY2V9IGNvbmZpZyBmcm9tIHNvdXJjZTogJHtzb3VyY2VOYW1lfWApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5hbWVzcGFjZUNvbmZpZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1lcmdlIGNvbmZpZ3VyYXRpb24gZnJvbSBtdWx0aXBsZSBzb3VyY2VzLlxyXG4gICAqIEBwYXJhbSBzb3VyY2VDb25maWdzIC0gTWFwIG9mIHNvdXJjZSBjb25maWd1cmF0aW9uc1xyXG4gICAqIEByZXR1cm5zIE1lcmdlZCBjb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZVNvdXJjZUNvbmZpZ3Moc291cmNlQ29uZmlnczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pj4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIGxldCBtZXJnZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtzb3VyY2VOYW1lLCBjb25maWddIG9mIHNvdXJjZUNvbmZpZ3MpIHtcclxuICAgICAgbWVyZ2VkQ29uZmlnID0gdGhpcy5kZWVwTWVyZ2UobWVyZ2VkQ29uZmlnLCBjb25maWcpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTWVyZ2VkIGNvbmZpZyBmcm9tIHNvdXJjZTogJHtzb3VyY2VOYW1lfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtZXJnZWRDb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFeHRyYWN0IHNvdXJjZXMgZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlLlxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQWxsIGNvbmZpZ3VyYXRpb24gc291cmNlc1xyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUYXJnZXQgbmFtZXNwYWNlXHJcbiAgICogQHJldHVybnMgU291cmNlcyBmaWx0ZXJlZCBmb3IgdGhlIG5hbWVzcGFjZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZXh0cmFjdE5hbWVzcGFjZVNvdXJjZXMoc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdLCBuYW1lc3BhY2U6IHN0cmluZyk6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSB7XHJcbiAgICBjb25zdCBuYW1lc3BhY2VTb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XHJcbiAgICAgIGlmIChzb3VyY2UubmFtZXNwYWNlID09PSBuYW1lc3BhY2UgfHwgc291cmNlLmRhdGFbbmFtZXNwYWNlXSkge1xyXG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZURhdGEgPSBzb3VyY2UubmFtZXNwYWNlID09PSBuYW1lc3BhY2UgPyBzb3VyY2UuZGF0YSA6IHNvdXJjZS5kYXRhW25hbWVzcGFjZV07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZURhdGEgJiYgdHlwZW9mIG5hbWVzcGFjZURhdGEgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICBuYW1lc3BhY2VTb3VyY2VzLnB1c2goe1xyXG4gICAgICAgICAgICAuLi5zb3VyY2UsXHJcbiAgICAgICAgICAgIGRhdGE6IG5hbWVzcGFjZURhdGEsXHJcbiAgICAgICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmFtZXNwYWNlU291cmNlcztcclxuICB9XHJcbn0iXX0=
@@ -1,20 +0,0 @@
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
- // Integration providers exports
18
- __exportStar(require("./configuration-factory.provider"), exports);
19
- __exportStar(require("./aws-configuration-loader.service"), exports);
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvaW50ZWdyYXRpb24vcHJvdmlkZXJzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnQ0FBZ0M7QUFDaEMsbUVBQWlEO0FBQ2pELHFFQUFtRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEludGVncmF0aW9uIHByb3ZpZGVycyBleHBvcnRzXHJcbmV4cG9ydCAqIGZyb20gJy4vY29uZmlndXJhdGlvbi1mYWN0b3J5LnByb3ZpZGVyJztcclxuZXhwb3J0ICogZnJvbSAnLi9hd3MtY29uZmlndXJhdGlvbi1sb2FkZXIuc2VydmljZSc7Il19