@dyanet/nestjs-config-aws 1.2.0 → 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 -0
  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 +12 -6
  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,315 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- var __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- var NestjsConfigIntegrationService_1;
14
- import { Injectable, Logger, Inject, Optional } from '@nestjs/common';
15
- import { ConfigModule } from '@nestjs/config';
16
- import { FactoryRegistrationService } from './factory-registration.service';
17
- import { NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS } from '../nestjs-config-integration.module';
18
- /**
19
- * Service that provides integration utilities for working with @nestjs/config.
20
- * This service creates ConfigModule configurations that include AWS-sourced factories.
21
- */
22
- let NestjsConfigIntegrationService = NestjsConfigIntegrationService_1 = class NestjsConfigIntegrationService {
23
- factoryRegistrationService;
24
- options;
25
- logger = new Logger(NestjsConfigIntegrationService_1.name);
26
- constructor(factoryRegistrationService, options = {}) {
27
- this.factoryRegistrationService = factoryRegistrationService;
28
- this.options = options;
29
- }
30
- /**
31
- * Create a ConfigModule configuration with AWS-sourced factories.
32
- * This method can be used to enhance existing @nestjs/config setups.
33
- *
34
- * @param baseOptions - Base ConfigModule options to enhance
35
- * @returns Promise resolving to enhanced ConfigModule options
36
- */
37
- async createConfigModuleOptions(baseOptions = {}) {
38
- this.logger.debug('Creating ConfigModule options with AWS integration');
39
- try {
40
- // Register AWS configuration factories
41
- const awsFactories = await this.factoryRegistrationService.registerFactories();
42
- // Merge AWS factories with existing load array
43
- const existingLoad = baseOptions.load || [];
44
- const enhancedLoad = [...existingLoad, ...awsFactories];
45
- // Create enhanced options
46
- const enhancedOptions = {
47
- ...baseOptions,
48
- load: enhancedLoad,
49
- // Apply integration-specific options with proper precedence
50
- isGlobal: baseOptions.isGlobal !== undefined ? baseOptions.isGlobal : (this.options.registerGlobally ?? true),
51
- cache: baseOptions.cache !== undefined ? baseOptions.cache : (this.options.factoryOptions?.cache ?? true),
52
- expandVariables: baseOptions.expandVariables !== undefined ? baseOptions.expandVariables : (this.options.factoryOptions?.expandVariables ?? true),
53
- };
54
- this.logger.log(`Enhanced ConfigModule options with ${awsFactories.length} AWS factories`);
55
- return enhancedOptions;
56
- }
57
- catch (error) {
58
- const enhancementError = error instanceof Error ? error : new Error(String(error));
59
- this.logger.error('Failed to create enhanced ConfigModule options:', enhancementError);
60
- // Handle enhancement failure based on options
61
- if (this.options.failOnAwsError) {
62
- throw enhancementError;
63
- }
64
- // Return base options if fallback is enabled
65
- if (this.options.fallbackToLocal) {
66
- this.logger.warn('Falling back to base ConfigModule options due to AWS error');
67
- return baseOptions;
68
- }
69
- throw enhancementError;
70
- }
71
- }
72
- /**
73
- * Create a ConfigModule configuration for async setup.
74
- * This method works with ConfigModule.forRootAsync() pattern.
75
- *
76
- * @param baseOptions - Base async ConfigModule options to enhance
77
- * @returns Promise resolving to enhanced async ConfigModule options
78
- */
79
- async createAsyncConfigModuleOptions(baseOptions = {}) {
80
- this.logger.debug('Creating async ConfigModule options with AWS integration');
81
- try {
82
- // Create a factory function that includes AWS configuration
83
- const enhancedUseFactory = async (...args) => {
84
- // Call original factory if it exists
85
- let baseConfig = {};
86
- if (baseOptions.useFactory) {
87
- baseConfig = await baseOptions.useFactory(...args);
88
- }
89
- // Enhance with AWS configuration
90
- return await this.createConfigModuleOptions(baseConfig);
91
- };
92
- // Create enhanced async options
93
- const enhancedAsyncOptions = {
94
- ...baseOptions,
95
- useFactory: enhancedUseFactory,
96
- // Ensure our service is injected
97
- inject: [...(baseOptions.inject || []), FactoryRegistrationService],
98
- };
99
- this.logger.debug('Created enhanced async ConfigModule options');
100
- return enhancedAsyncOptions;
101
- }
102
- catch (error) {
103
- const asyncError = error instanceof Error ? error : new Error(String(error));
104
- this.logger.error('Failed to create async ConfigModule options:', asyncError);
105
- if (this.options.failOnAwsError) {
106
- throw asyncError;
107
- }
108
- // Return base options if fallback is enabled
109
- if (this.options.fallbackToLocal) {
110
- this.logger.warn('Falling back to base async ConfigModule options due to AWS error');
111
- return baseOptions;
112
- }
113
- throw asyncError;
114
- }
115
- }
116
- /**
117
- * Create a complete ConfigModule with AWS integration.
118
- * This method returns a ready-to-use DynamicModule.
119
- *
120
- * @param baseOptions - Base ConfigModule options
121
- * @returns Promise resolving to DynamicModule with AWS integration
122
- */
123
- async createIntegratedConfigModule(baseOptions = {}) {
124
- this.logger.debug('Creating integrated ConfigModule with AWS support');
125
- try {
126
- // Create enhanced options
127
- const enhancedOptions = await this.createConfigModuleOptions(baseOptions);
128
- // Create the ConfigModule with enhanced options
129
- const configModule = await ConfigModule.forRoot(enhancedOptions);
130
- this.logger.log('Created integrated ConfigModule with AWS support');
131
- return configModule;
132
- }
133
- catch (error) {
134
- const moduleError = error instanceof Error ? error : new Error(String(error));
135
- this.logger.error('Failed to create integrated ConfigModule:', moduleError);
136
- if (this.options.failOnAwsError) {
137
- throw moduleError;
138
- }
139
- // Return basic ConfigModule if fallback is enabled
140
- if (this.options.fallbackToLocal) {
141
- this.logger.warn('Falling back to basic ConfigModule due to AWS error');
142
- return await ConfigModule.forRoot(baseOptions);
143
- }
144
- throw moduleError;
145
- }
146
- }
147
- /**
148
- * Create an async integrated ConfigModule.
149
- * This method returns a ready-to-use async DynamicModule.
150
- *
151
- * @param baseOptions - Base async ConfigModule options
152
- * @returns Promise resolving to DynamicModule with async AWS integration
153
- */
154
- async createAsyncIntegratedConfigModule(baseOptions = {}) {
155
- this.logger.debug('Creating async integrated ConfigModule with AWS support');
156
- try {
157
- // Create enhanced options with AWS integration
158
- const enhancedOptions = await this.createConfigModuleOptions(baseOptions);
159
- // Create the ConfigModule with enhanced options
160
- const asyncConfigModule = await ConfigModule.forRoot(enhancedOptions);
161
- this.logger.log('Created async integrated ConfigModule with AWS support');
162
- return asyncConfigModule;
163
- }
164
- catch (error) {
165
- const asyncModuleError = error instanceof Error ? error : new Error(String(error));
166
- this.logger.error('Failed to create async integrated ConfigModule:', asyncModuleError);
167
- if (this.options.failOnAwsError) {
168
- throw asyncModuleError;
169
- }
170
- // Return basic async ConfigModule if fallback is enabled
171
- if (this.options.fallbackToLocal) {
172
- this.logger.warn('Falling back to basic async ConfigModule due to AWS error');
173
- return await ConfigModule.forRoot(baseOptions);
174
- }
175
- throw asyncModuleError;
176
- }
177
- }
178
- /**
179
- * Get configuration factories for manual registration.
180
- * This method allows developers to manually register AWS factories with their own ConfigModule setup.
181
- *
182
- * @returns Promise resolving to array of configuration factories
183
- */
184
- async getConfigurationFactories() {
185
- this.logger.debug('Getting configuration factories for manual registration');
186
- try {
187
- const factories = await this.factoryRegistrationService.registerFactories();
188
- this.logger.debug(`Retrieved ${factories.length} configuration factories`);
189
- return factories;
190
- }
191
- catch (error) {
192
- const factoryError = error instanceof Error ? error : new Error(String(error));
193
- this.logger.error('Failed to get configuration factories:', factoryError);
194
- if (this.options.failOnAwsError) {
195
- throw factoryError;
196
- }
197
- // Return empty array if fallback is enabled
198
- if (this.options.fallbackToLocal) {
199
- this.logger.warn('Returning empty factories array due to AWS error');
200
- return [];
201
- }
202
- throw factoryError;
203
- }
204
- }
205
- /**
206
- * Get namespaced configuration factories.
207
- * This method returns factories for specific namespaces only.
208
- *
209
- * @param namespaces - Array of namespace names to get factories for
210
- * @returns Promise resolving to array of namespaced configuration factories
211
- */
212
- async getNamespacedFactories(namespaces) {
213
- this.logger.debug(`Getting namespaced factories for: ${namespaces.join(', ')}`);
214
- try {
215
- const factories = await this.factoryRegistrationService.registerNamespacedFactories(namespaces);
216
- this.logger.debug(`Retrieved ${factories.length} namespaced factories`);
217
- return factories;
218
- }
219
- catch (error) {
220
- const namespacedError = error instanceof Error ? error : new Error(String(error));
221
- this.logger.error('Failed to get namespaced factories:', namespacedError);
222
- if (this.options.failOnAwsError) {
223
- throw namespacedError;
224
- }
225
- // Return empty array if fallback is enabled
226
- if (this.options.fallbackToLocal) {
227
- this.logger.warn('Returning empty namespaced factories array due to AWS error');
228
- return [];
229
- }
230
- throw namespacedError;
231
- }
232
- }
233
- /**
234
- * Create a configuration factory for immediate use.
235
- * This method creates a single factory that can be used directly with @nestjs/config.
236
- *
237
- * @param namespace - Optional namespace for the factory
238
- * @param config - Optional configuration data to use
239
- * @returns Configuration factory
240
- */
241
- createImmediateFactory(namespace, config) {
242
- this.logger.debug(`Creating immediate factory for namespace: ${namespace || 'default'}`);
243
- try {
244
- const factory = this.factoryRegistrationService.createSyncFactory(namespace, config);
245
- this.logger.debug(`Created immediate factory: ${namespace || 'default'}`);
246
- return factory;
247
- }
248
- catch (error) {
249
- const immediateError = error instanceof Error ? error : new Error(String(error));
250
- this.logger.error('Failed to create immediate factory:', immediateError);
251
- if (this.options.failOnAwsError) {
252
- throw immediateError;
253
- }
254
- // Return empty factory if fallback is enabled
255
- if (this.options.fallbackToLocal) {
256
- this.logger.warn('Creating empty factory due to error');
257
- return () => config || {};
258
- }
259
- throw immediateError;
260
- }
261
- }
262
- /**
263
- * Check if AWS integration is available and working.
264
- * This method can be used to verify the integration status.
265
- *
266
- * @returns Promise resolving to integration status
267
- */
268
- async checkIntegrationStatus() {
269
- this.logger.debug('Checking AWS integration status');
270
- const status = {
271
- isAvailable: false,
272
- factoriesRegistered: 0,
273
- errors: []
274
- };
275
- try {
276
- // Check if factories are initialized
277
- const isInitialized = this.factoryRegistrationService.isFactoriesInitialized();
278
- if (isInitialized) {
279
- const registeredFactories = this.factoryRegistrationService.getRegisteredFactories();
280
- status.factoriesRegistered = registeredFactories.size;
281
- status.isAvailable = true;
282
- }
283
- else {
284
- // Try to register factories to check availability
285
- const factories = await this.factoryRegistrationService.registerFactories();
286
- status.factoriesRegistered = factories.length;
287
- status.isAvailable = true;
288
- }
289
- this.logger.debug(`Integration status: available=${status.isAvailable}, factories=${status.factoriesRegistered}`);
290
- }
291
- catch (error) {
292
- const statusError = error instanceof Error ? error : new Error(String(error));
293
- status.errors.push(statusError.message);
294
- this.logger.error('Integration status check failed:', statusError);
295
- }
296
- return status;
297
- }
298
- /**
299
- * Reset the integration state.
300
- * This method clears all registered factories and resets the integration.
301
- */
302
- resetIntegration() {
303
- this.logger.debug('Resetting AWS integration state');
304
- this.factoryRegistrationService.reset();
305
- this.logger.debug('AWS integration state reset complete');
306
- }
307
- };
308
- NestjsConfigIntegrationService = NestjsConfigIntegrationService_1 = __decorate([
309
- Injectable(),
310
- __param(1, Optional()),
311
- __param(1, Inject(NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS)),
312
- __metadata("design:paramtypes", [FactoryRegistrationService, Object])
313
- ], NestjsConfigIntegrationService);
314
- export { NestjsConfigIntegrationService };
315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVzdGpzLWNvbmZpZy1pbnRlZ3JhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uL3NlcnZpY2VzL25lc3Rqcy1jb25maWctaW50ZWdyYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RFLE9BQU8sRUFBaUIsWUFBWSxFQUF1QixNQUFNLGdCQUFnQixDQUFDO0FBRWxGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTVGOzs7R0FHRztBQUVJLElBQU0sOEJBQThCLHNDQUFwQyxNQUFNLDhCQUE4QjtJQUl0QjtJQUVBO0lBTEYsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLGdDQUE4QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTFFLFlBQ21CLDBCQUFzRCxFQUV0RCxVQUE4QixFQUFFO1FBRmhDLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFFdEQsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7SUFDaEQsQ0FBQztJQUVKOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxjQUFtQyxFQUFFO1FBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFFeEUsSUFBSSxDQUFDO1lBQ0gsdUNBQXVDO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFFL0UsK0NBQStDO1lBQy9DLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lB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QUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUM5RSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQzVELENBQUM7Q0FDRixDQUFBO0FBNVVZLDhCQUE4QjtJQUQxQyxVQUFVLEVBQUU7SUFNUixXQUFBLFFBQVEsRUFBRSxDQUFBO0lBQUUsV0FBQSxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQTtxQ0FEYiwwQkFBMEI7R0FKOUQsOEJBQThCLENBNFUxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIExvZ2dlciwgSW5qZWN0LCBPcHRpb25hbCB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgQ29uZmlnRmFjdG9yeSwgQ29uZmlnTW9kdWxlLCBDb25maWdNb2R1bGVPcHRpb25zIH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZSB9IGZyb20gJy4vZmFjdG9yeS1yZWdpc3RyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEludGVncmF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaW50ZWdyYXRpb24tb3B0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBORVNUSlNfQ09ORklHX0FXU19JTlRFR1JBVElPTl9PUFRJT05TIH0gZnJvbSAnLi4vbmVzdGpzLWNvbmZpZy1pbnRlZ3JhdGlvbi5tb2R1bGUnO1xyXG5cclxuLyoqXHJcbiAqIFNlcnZpY2UgdGhhdCBwcm92aWRlcyBpbnRlZ3JhdGlvbiB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBAbmVzdGpzL2NvbmZpZy5cclxuICogVGhpcyBzZXJ2aWNlIGNyZWF0ZXMgQ29uZmlnTW9kdWxlIGNvbmZpZ3VyYXRpb25zIHRoYXQgaW5jbHVkZSBBV1Mtc291cmNlZCBmYWN0b3JpZXMuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOZXN0anNDb25maWdJbnRlZ3JhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihOZXN0anNDb25maWdJbnRlZ3JhdGlvblNlcnZpY2UubmFtZSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBmYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZTogRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5FU1RKU19DT05GSUdfQVdTX0lOVEVHUkFUSU9OX09QVElPTlMpIFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbnRlZ3JhdGlvbk9wdGlvbnMgPSB7fVxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgQ29uZmlnTW9kdWxlIGNvbmZpZ3VyYXRpb24gd2l0aCBBV1Mtc291cmNlZCBmYWN0b3JpZXMuXHJcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZW5oYW5jZSBleGlzdGluZyBAbmVzdGpzL2NvbmZpZyBzZXR1cHMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGJhc2VPcHRpb25zIC0gQmFzZSBDb25maWdNb2R1bGUgb3B0aW9ucyB0byBlbmhhbmNlXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gZW5oYW5jZWQgQ29uZmlnTW9kdWxlIG9wdGlvbnNcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVDb25maWdNb2R1bGVPcHRpb25zKGJhc2VPcHRpb25zOiBDb25maWdNb2R1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPENvbmZpZ01vZHVsZU9wdGlvbnM+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBDb25maWdNb2R1bGUgb3B0aW9ucyB3aXRoIEFXUyBpbnRlZ3JhdGlvbicpO1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBSZWdpc3RlciBBV1MgY29uZmlndXJhdGlvbiBmYWN0b3JpZXNcclxuICAgICAgY29uc3QgYXdzRmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3RlckZhY3RvcmllcygpO1xyXG4gICAgICBcclxuICAgICAgLy8gTWVyZ2UgQVdTIGZhY3RvcmllcyB3aXRoIGV4aXN0aW5nIGxvYWQgYXJyYXlcclxuICAgICAgY29uc3QgZXhpc3RpbmdMb2FkID0gYmFzZU9wdGlvbnMubG9hZCB8fCBbXTtcclxuICAgICAgY29uc3QgZW5oYW5jZWRMb2FkID0gWy4uLmV4aXN0aW5nTG9hZCwgLi4uYXdzRmFjdG9yaWVzXTtcclxuICAgICAgXHJcbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBvcHRpb25zXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkT3B0aW9uczogQ29uZmlnTW9kdWxlT3B0aW9ucyA9IHtcclxuICAgICAgICAuLi5iYXNlT3B0aW9ucyxcclxuICAgICAgICBsb2FkOiBlbmhhbmNlZExvYWQsXHJcbiAgICAgICAgLy8gQXBwbHkgaW50ZWdyYXRpb24tc3BlY2lmaWMgb3B0aW9ucyB3aXRoIHByb3BlciBwcmVjZWRlbmNlXHJcbiAgICAgICAgaXNHbG9iYWw6IGJhc2VPcHRpb25zLmlzR2xvYmFsICE9PSB1bmRlZmluZWQgPyBiYXNlT3B0aW9ucy5pc0dsb2JhbCA6ICh0aGlzLm9wdGlvbnMucmVnaXN0ZXJHbG9iYWxseSA/PyB0cnVlKSxcclxuICAgICAgICBjYWNoZTogYmFzZU9wdGlvbnMuY2FjaGUgIT09IHVuZGVmaW5lZCA/IGJhc2VPcHRpb25zLmNhY2hlIDogKHRoaXMub3B0aW9ucy5mYWN0b3J5T3B0aW9ucz8uY2FjaGUgPz8gdHJ1ZSksXHJcbiAgICAgICAgZXhwYW5kVmFyaWFibGVzOiBiYXNlT3B0aW9ucy5leHBhbmRWYXJpYWJsZXMgIT09IHVuZGVmaW5lZCA/IGJhc2VPcHRpb25zLmV4cGFuZFZhcmlhYmxlcyA6ICh0aGlzLm9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmV4cGFuZFZhcmlhYmxlcyA/PyB0cnVlKSxcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhgRW5oYW5jZWQgQ29uZmlnTW9kdWxlIG9wdGlvbnMgd2l0aCAke2F3c0ZhY3Rvcmllcy5sZW5ndGh9IEFXUyBmYWN0b3JpZXNgKTtcclxuICAgICAgcmV0dXJuIGVuaGFuY2VkT3B0aW9ucztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IGVuaGFuY2VtZW50RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGVuaGFuY2VkIENvbmZpZ01vZHVsZSBvcHRpb25zOicsIGVuaGFuY2VtZW50RXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgLy8gSGFuZGxlIGVuaGFuY2VtZW50IGZhaWx1cmUgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgZW5oYW5jZW1lbnRFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGJhc2Ugb3B0aW9ucyBpZiBmYWxsYmFjayBpcyBlbmFibGVkXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignRmFsbGluZyBiYWNrIHRvIGJhc2UgQ29uZmlnTW9kdWxlIG9wdGlvbnMgZHVlIHRvIEFXUyBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiBiYXNlT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgZW5oYW5jZW1lbnRFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIENvbmZpZ01vZHVsZSBjb25maWd1cmF0aW9uIGZvciBhc3luYyBzZXR1cC5cclxuICAgKiBUaGlzIG1ldGhvZCB3b3JrcyB3aXRoIENvbmZpZ01vZHVsZS5mb3JSb290QXN5bmMoKSBwYXR0ZXJuLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBiYXNlT3B0aW9ucyAtIEJhc2UgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnMgdG8gZW5oYW5jZVxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGVuaGFuY2VkIGFzeW5jIENvbmZpZ01vZHVsZSBvcHRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlQXN5bmNDb25maWdNb2R1bGVPcHRpb25zKGJhc2VPcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRpbmcgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnMgd2l0aCBBV1MgaW50ZWdyYXRpb24nKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ3JlYXRlIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGluY2x1ZGVzIEFXUyBjb25maWd1cmF0aW9uXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkVXNlRmFjdG9yeSA9IGFzeW5jICguLi5hcmdzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZmFjdG9yeSBpZiBpdCBleGlzdHNcclxuICAgICAgICBsZXQgYmFzZUNvbmZpZzogQ29uZmlnTW9kdWxlT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIGlmIChiYXNlT3B0aW9ucy51c2VGYWN0b3J5KSB7XHJcbiAgICAgICAgICBiYXNlQ29uZmlnID0gYXdhaXQgYmFzZU9wdGlvbnMudXNlRmFjdG9yeSguLi5hcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRW5oYW5jZSB3aXRoIEFXUyBjb25maWd1cmF0aW9uXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQ29uZmlnTW9kdWxlT3B0aW9ucyhiYXNlQ29uZmlnKTtcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBhc3luYyBvcHRpb25zXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkQXN5bmNPcHRpb25zID0ge1xyXG4gICAgICAgIC4uLmJhc2VPcHRpb25zLFxyXG4gICAgICAgIHVzZUZhY3Rvcnk6IGVuaGFuY2VkVXNlRmFjdG9yeSxcclxuICAgICAgICAvLyBFbnN1cmUgb3VyIHNlcnZpY2UgaXMgaW5qZWN0ZWRcclxuICAgICAgICBpbmplY3Q6IFsuLi4oYmFzZU9wdGlvbnMuaW5qZWN0IHx8IFtdKSwgRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2VdLFxyXG4gICAgICB9O1xyXG4gICAgICBcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NyZWF0ZWQgZW5oYW5jZWQgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnMnKTtcclxuICAgICAgcmV0dXJuIGVuaGFuY2VkQXN5bmNPcHRpb25zO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgYXN5bmNFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnM6JywgYXN5bmNFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgYXN5bmNFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGJhc2Ugb3B0aW9ucyBpZiBmYWxsYmFjayBpcyBlbmFibGVkXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignRmFsbGluZyBiYWNrIHRvIGJhc2UgYXN5bmMgQ29uZmlnTW9kdWxlIG9wdGlvbnMgZHVlIHRvIEFXUyBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiBiYXNlT3B0aW9ucztcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgYXN5bmNFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIGNvbXBsZXRlIENvbmZpZ01vZHVsZSB3aXRoIEFXUyBpbnRlZ3JhdGlvbi5cclxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVhZHktdG8tdXNlIER5bmFtaWNNb2R1bGUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGJhc2VPcHRpb25zIC0gQmFzZSBDb25maWdNb2R1bGUgb3B0aW9uc1xyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIER5bmFtaWNNb2R1bGUgd2l0aCBBV1MgaW50ZWdyYXRpb25cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVJbnRlZ3JhdGVkQ29uZmlnTW9kdWxlKGJhc2VPcHRpb25zOiBDb25maWdNb2R1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBpbnRlZ3JhdGVkIENvbmZpZ01vZHVsZSB3aXRoIEFXUyBzdXBwb3J0Jyk7XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBvcHRpb25zXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkT3B0aW9ucyA9IGF3YWl0IHRoaXMuY3JlYXRlQ29uZmlnTW9kdWxlT3B0aW9ucyhiYXNlT3B0aW9ucyk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgdGhlIENvbmZpZ01vZHVsZSB3aXRoIGVuaGFuY2VkIG9wdGlvbnNcclxuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgQ29uZmlnTW9kdWxlLmZvclJvb3QoZW5oYW5jZWRPcHRpb25zKTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmxvZygnQ3JlYXRlZCBpbnRlZ3JhdGVkIENvbmZpZ01vZHVsZSB3aXRoIEFXUyBzdXBwb3J0Jyk7XHJcbiAgICAgIHJldHVybiBjb25maWdNb2R1bGU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBtb2R1bGVFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgaW50ZWdyYXRlZCBDb25maWdNb2R1bGU6JywgbW9kdWxlRXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWlsT25Bd3NFcnJvcikge1xyXG4gICAgICAgIHRocm93IG1vZHVsZUVycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZXR1cm4gYmFzaWMgQ29uZmlnTW9kdWxlIGlmIGZhbGxiYWNrIGlzIGVuYWJsZWRcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWxsYmFja1RvTG9jYWwpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdGYWxsaW5nIGJhY2sgdG8gYmFzaWMgQ29uZmlnTW9kdWxlIGR1ZSB0byBBV1MgZXJyb3InKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgQ29uZmlnTW9kdWxlLmZvclJvb3QoYmFzZU9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBtb2R1bGVFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbiBhc3luYyBpbnRlZ3JhdGVkIENvbmZpZ01vZHVsZS5cclxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcmVhZHktdG8tdXNlIGFzeW5jIER5bmFtaWNNb2R1bGUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGJhc2VPcHRpb25zIC0gQmFzZSBhc3luYyBDb25maWdNb2R1bGUgb3B0aW9uc1xyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIER5bmFtaWNNb2R1bGUgd2l0aCBhc3luYyBBV1MgaW50ZWdyYXRpb25cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVBc3luY0ludGVncmF0ZWRDb25maWdNb2R1bGUoYmFzZU9wdGlvbnM6IENvbmZpZ01vZHVsZU9wdGlvbnMgPSB7fSk6IFByb21pc2U8RHluYW1pY01vZHVsZT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NyZWF0aW5nIGFzeW5jIGludGVncmF0ZWQgQ29uZmlnTW9kdWxlIHdpdGggQVdTIHN1cHBvcnQnKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ3JlYXRlIGVuaGFuY2VkIG9wdGlvbnMgd2l0aCBBV1MgaW50ZWdyYXRpb25cclxuICAgICAgY29uc3QgZW5oYW5jZWRPcHRpb25zID0gYXdhaXQgdGhpcy5jcmVhdGVDb25maWdNb2R1bGVPcHRpb25zKGJhc2VPcHRpb25zKTtcclxuICAgICAgXHJcbiAgICAgIC8vIENyZWF0ZSB0aGUgQ29uZmlnTW9kdWxlIHdpdGggZW5oYW5jZWQgb3B0aW9uc1xyXG4gICAgICBjb25zdCBhc3luY0NvbmZpZ01vZHVsZSA9IGF3YWl0IENvbmZpZ01vZHVsZS5mb3JSb290KGVuaGFuY2VkT3B0aW9ucyk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coJ0NyZWF0ZWQgYXN5bmMgaW50ZWdyYXRlZCBDb25maWdNb2R1bGUgd2l0aCBBV1Mgc3VwcG9ydCcpO1xyXG4gICAgICByZXR1cm4gYXN5bmNDb25maWdNb2R1bGU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBhc3luY01vZHVsZUVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhc3luYyBpbnRlZ3JhdGVkIENvbmZpZ01vZHVsZTonLCBhc3luY01vZHVsZUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBhc3luY01vZHVsZUVycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZXR1cm4gYmFzaWMgYXN5bmMgQ29uZmlnTW9kdWxlIGlmIGZhbGxiYWNrIGlzIGVuYWJsZWRcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWxsYmFja1RvTG9jYWwpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdGYWxsaW5nIGJhY2sgdG8gYmFzaWMgYXN5bmMgQ29uZmlnTW9kdWxlIGR1ZSB0byBBV1MgZXJyb3InKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgQ29uZmlnTW9kdWxlLmZvclJvb3QoYmFzZU9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBhc3luY01vZHVsZUVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzIGZvciBtYW51YWwgcmVnaXN0cmF0aW9uLlxyXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBkZXZlbG9wZXJzIHRvIG1hbnVhbGx5IHJlZ2lzdGVyIEFXUyBmYWN0b3JpZXMgd2l0aCB0aGVpciBvd24gQ29uZmlnTW9kdWxlIHNldHVwLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q29uZmlndXJhdGlvbkZhY3RvcmllcygpOiBQcm9taXNlPENvbmZpZ0ZhY3RvcnlbXT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0dldHRpbmcgY29uZmlndXJhdGlvbiBmYWN0b3JpZXMgZm9yIG1hbnVhbCByZWdpc3RyYXRpb24nKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3RlckZhY3RvcmllcygpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgUmV0cmlldmVkICR7ZmFjdG9yaWVzLmxlbmd0aH0gY29uZmlndXJhdGlvbiBmYWN0b3JpZXNgKTtcclxuICAgICAgcmV0dXJuIGZhY3RvcmllcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IGZhY3RvcnlFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBnZXQgY29uZmlndXJhdGlvbiBmYWN0b3JpZXM6JywgZmFjdG9yeUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBmYWN0b3J5RXJyb3I7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiBlbXB0eSBhcnJheSBpZiBmYWxsYmFjayBpcyBlbmFibGVkXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignUmV0dXJuaW5nIGVtcHR5IGZhY3RvcmllcyBhcnJheSBkdWUgdG8gQVdTIGVycm9yJyk7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBmYWN0b3J5RXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3Rvcmllcy5cclxuICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGZhY3RvcmllcyBmb3Igc3BlY2lmaWMgbmFtZXNwYWNlcyBvbmx5LlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2VzIC0gQXJyYXkgb2YgbmFtZXNwYWNlIG5hbWVzIHRvIGdldCBmYWN0b3JpZXMgZm9yXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3Rvcmllc1xyXG4gICAqL1xyXG4gIGFzeW5jIGdldE5hbWVzcGFjZWRGYWN0b3JpZXMobmFtZXNwYWNlczogc3RyaW5nW10pOiBQcm9taXNlPENvbmZpZ0ZhY3RvcnlbXT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYEdldHRpbmcgbmFtZXNwYWNlZCBmYWN0b3JpZXMgZm9yOiAke25hbWVzcGFjZXMuam9pbignLCAnKX1gKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3Rlck5hbWVzcGFjZWRGYWN0b3JpZXMobmFtZXNwYWNlcyk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBSZXRyaWV2ZWQgJHtmYWN0b3JpZXMubGVuZ3RofSBuYW1lc3BhY2VkIGZhY3Rvcmllc2ApO1xyXG4gICAgICByZXR1cm4gZmFjdG9yaWVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgbmFtZXNwYWNlZEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGdldCBuYW1lc3BhY2VkIGZhY3RvcmllczonLCBuYW1lc3BhY2VkRXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWlsT25Bd3NFcnJvcikge1xyXG4gICAgICAgIHRocm93IG5hbWVzcGFjZWRFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGFycmF5IGlmIGZhbGxiYWNrIGlzIGVuYWJsZWRcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWxsYmFja1RvTG9jYWwpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdSZXR1cm5pbmcgZW1wdHkgbmFtZXNwYWNlZCBmYWN0b3JpZXMgYXJyYXkgZHVlIHRvIEFXUyBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgbmFtZXNwYWNlZEVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgY29uZmlndXJhdGlvbiBmYWN0b3J5IGZvciBpbW1lZGlhdGUgdXNlLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBzaW5nbGUgZmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIGRpcmVjdGx5IHdpdGggQG5lc3Rqcy9jb25maWcuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIE9wdGlvbmFsIG5hbWVzcGFjZSBmb3IgdGhlIGZhY3RvcnlcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBkYXRhIHRvIHVzZVxyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gZmFjdG9yeVxyXG4gICAqL1xyXG4gIGNyZWF0ZUltbWVkaWF0ZUZhY3RvcnkobmFtZXNwYWNlPzogc3RyaW5nLCBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogQ29uZmlnRmFjdG9yeSB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgaW1tZWRpYXRlIGZhY3RvcnkgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnfWApO1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5jcmVhdGVTeW5jRmFjdG9yeShuYW1lc3BhY2UsIGNvbmZpZyk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkIGltbWVkaWF0ZSBmYWN0b3J5OiAke25hbWVzcGFjZSB8fCAnZGVmYXVsdCd9YCk7XHJcbiAgICAgIHJldHVybiBmYWN0b3J5O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgaW1tZWRpYXRlRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGltbWVkaWF0ZSBmYWN0b3J5OicsIGltbWVkaWF0ZUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBpbW1lZGlhdGVFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGZhY3RvcnkgaWYgZmFsbGJhY2sgaXMgZW5hYmxlZFxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0NyZWF0aW5nIGVtcHR5IGZhY3RvcnkgZHVlIHRvIGVycm9yJyk7XHJcbiAgICAgICAgcmV0dXJuICgpID0+IGNvbmZpZyB8fCB7fTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgaW1tZWRpYXRlRXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBBV1MgaW50ZWdyYXRpb24gaXMgYXZhaWxhYmxlIGFuZCB3b3JraW5nLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgaW50ZWdyYXRpb24gc3RhdHVzLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGludGVncmF0aW9uIHN0YXR1c1xyXG4gICAqL1xyXG4gIGFzeW5jIGNoZWNrSW50ZWdyYXRpb25TdGF0dXMoKTogUHJvbWlzZTx7XHJcbiAgICBpc0F2YWlsYWJsZTogYm9vbGVhbjtcclxuICAgIGZhY3Rvcmllc1JlZ2lzdGVyZWQ6IG51bWJlcjtcclxuICAgIGVycm9yczogc3RyaW5nW107XHJcbiAgfT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NoZWNraW5nIEFXUyBpbnRlZ3JhdGlvbiBzdGF0dXMnKTtcclxuICAgIFxyXG4gICAgY29uc3Qgc3RhdHVzID0ge1xyXG4gICAgICBpc0F2YWlsYWJsZTogZmFsc2UsXHJcbiAgICAgIGZhY3Rvcmllc1JlZ2lzdGVyZWQ6IDAsXHJcbiAgICAgIGVycm9yczogW10gYXMgc3RyaW5nW11cclxuICAgIH07XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ2hlY2sgaWYgZmFjdG9yaWVzIGFyZSBpbml0aWFsaXplZFxyXG4gICAgICBjb25zdCBpc0luaXRpYWxpemVkID0gdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5pc0ZhY3Rvcmllc0luaXRpYWxpemVkKCk7XHJcbiAgICAgIFxyXG4gICAgICBpZiAoaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRGYWN0b3JpZXMgPSB0aGlzLmZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlLmdldFJlZ2lzdGVyZWRGYWN0b3JpZXMoKTtcclxuICAgICAgICBzdGF0dXMuZmFjdG9yaWVzUmVnaXN0ZXJlZCA9IHJlZ2lzdGVyZWRGYWN0b3JpZXMuc2l6ZTtcclxuICAgICAgICBzdGF0dXMuaXNBdmFpbGFibGUgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmYWN0b3JpZXMgdG8gY2hlY2sgYXZhaWxhYmlsaXR5XHJcbiAgICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3RlckZhY3RvcmllcygpO1xyXG4gICAgICAgIHN0YXR1cy5mYWN0b3JpZXNSZWdpc3RlcmVkID0gZmFjdG9yaWVzLmxlbmd0aDtcclxuICAgICAgICBzdGF0dXMuaXNBdmFpbGFibGUgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgSW50ZWdyYXRpb24gc3RhdHVzOiBhdmFpbGFibGU9JHtzdGF0dXMuaXNBdmFpbGFibGV9LCBmYWN0b3JpZXM9JHtzdGF0dXMuZmFjdG9yaWVzUmVnaXN0ZXJlZH1gKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IHN0YXR1c0Vycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICBzdGF0dXMuZXJyb3JzLnB1c2goc3RhdHVzRXJyb3IubWVzc2FnZSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdJbnRlZ3JhdGlvbiBzdGF0dXMgY2hlY2sgZmFpbGVkOicsIHN0YXR1c0Vycm9yKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgdGhlIGludGVncmF0aW9uIHN0YXRlLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgcmVnaXN0ZXJlZCBmYWN0b3JpZXMgYW5kIHJlc2V0cyB0aGUgaW50ZWdyYXRpb24uXHJcbiAgICovXHJcbiAgcmVzZXRJbnRlZ3JhdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdSZXNldHRpbmcgQVdTIGludGVncmF0aW9uIHN0YXRlJyk7XHJcbiAgICB0aGlzLmZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlLnJlc2V0KCk7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQVdTIGludGVncmF0aW9uIHN0YXRlIHJlc2V0IGNvbXBsZXRlJyk7XHJcbiAgfVxyXG59Il19