@dyanet/nestjs-config-aws 1.0.1 → 1.2.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 (391) hide show
  1. package/README.md +213 -1013
  2. package/dist/cjs/config-aws/src/config-manager.js +366 -0
  3. package/dist/cjs/config-aws/src/errors/index.js +77 -0
  4. package/dist/cjs/config-aws/src/index.js +37 -0
  5. package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +3 -0
  6. package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +3 -0
  7. package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +3 -0
  8. package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +3 -0
  9. package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +3 -0
  10. package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +3 -0
  11. package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +3 -0
  12. package/dist/cjs/config-aws/src/loaders/env-file.loader.js +169 -0
  13. package/dist/cjs/config-aws/src/loaders/environment.loader.js +85 -0
  14. package/dist/cjs/config-aws/src/loaders/s3.loader.js +145 -0
  15. package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +169 -0
  16. package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +199 -0
  17. package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +98 -0
  18. package/dist/cjs/config-aws/src/utils/validation.util.js +116 -0
  19. package/dist/cjs/nestjs-config-aws/src/config.module.js +175 -0
  20. package/dist/cjs/nestjs-config-aws/src/index.js +61 -0
  21. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/index.js +1 -1
  22. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +3 -0
  23. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +3 -0
  24. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/interfaces/index.js +1 -1
  25. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +3 -0
  26. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +3 -0
  27. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +73 -0
  28. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +3 -0
  29. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +4 -0
  30. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +52 -0
  31. package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +124 -0
  32. package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +592 -0
  33. package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +385 -0
  34. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/providers/index.js +1 -1
  35. package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +366 -0
  36. package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +267 -0
  37. package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +517 -0
  38. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/services/index.js +1 -1
  39. package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +81 -0
  40. package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +465 -0
  41. package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +318 -0
  42. package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +292 -0
  43. package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +595 -0
  44. package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +283 -0
  45. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/utils/index.js +1 -1
  46. package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +11 -0
  47. package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +63 -0
  48. package/dist/cjs/nestjs-config-aws/src/interfaces/index.js +30 -0
  49. package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +3 -0
  50. package/dist/cjs/nestjs-config-aws/src/services/config.service.js +142 -0
  51. package/dist/esm/config-aws/src/config-manager.js +362 -0
  52. package/dist/esm/config-aws/src/errors/index.js +69 -0
  53. package/dist/esm/config-aws/src/index.js +21 -0
  54. package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +2 -0
  55. package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +2 -0
  56. package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +2 -0
  57. package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +2 -0
  58. package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +2 -0
  59. package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +2 -0
  60. package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +2 -0
  61. package/dist/esm/config-aws/src/loaders/env-file.loader.js +132 -0
  62. package/dist/esm/config-aws/src/loaders/environment.loader.js +81 -0
  63. package/dist/esm/config-aws/src/loaders/s3.loader.js +141 -0
  64. package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +165 -0
  65. package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +195 -0
  66. package/dist/esm/config-aws/src/utils/env-file-parser.util.js +94 -0
  67. package/dist/esm/config-aws/src/utils/validation.util.js +112 -0
  68. package/dist/esm/nestjs-config-aws/src/config.module.js +172 -0
  69. package/dist/esm/nestjs-config-aws/src/index.js +23 -0
  70. package/dist/esm/nestjs-config-aws/src/integration/index.js +7 -0
  71. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +2 -0
  72. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +2 -0
  73. package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +10 -0
  74. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +2 -0
  75. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +2 -0
  76. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +64 -0
  77. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +2 -0
  78. package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +3 -0
  79. package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +44 -0
  80. package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +121 -0
  81. package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +589 -0
  82. package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +382 -0
  83. package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +4 -0
  84. package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +363 -0
  85. package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +264 -0
  86. package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +514 -0
  87. package/dist/esm/nestjs-config-aws/src/integration/services/index.js +10 -0
  88. package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +78 -0
  89. package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +462 -0
  90. package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +315 -0
  91. package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +289 -0
  92. package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +589 -0
  93. package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +240 -0
  94. package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +3 -0
  95. package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +7 -0
  96. package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +59 -0
  97. package/dist/esm/nestjs-config-aws/src/interfaces/index.js +8 -0
  98. package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +2 -0
  99. package/dist/esm/nestjs-config-aws/src/services/config.service.js +139 -0
  100. package/dist/types/config-aws/src/config-manager.d.ts +119 -0
  101. package/dist/types/config-aws/src/config-manager.d.ts.map +1 -0
  102. package/dist/types/config-aws/src/errors/index.d.ts +43 -0
  103. package/dist/types/config-aws/src/errors/index.d.ts.map +1 -0
  104. package/dist/types/config-aws/src/index.d.ts +24 -0
  105. package/dist/types/config-aws/src/index.d.ts.map +1 -0
  106. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +33 -0
  107. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +1 -0
  108. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +86 -0
  109. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +1 -0
  110. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +12 -0
  111. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +1 -0
  112. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +10 -0
  113. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +1 -0
  114. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +14 -0
  115. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +1 -0
  116. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +12 -0
  117. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +1 -0
  118. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +14 -0
  119. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +1 -0
  120. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +69 -0
  121. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +1 -0
  122. package/dist/types/config-aws/src/loaders/environment.loader.d.ts +46 -0
  123. package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +1 -0
  124. package/dist/types/config-aws/src/loaders/s3.loader.d.ts +62 -0
  125. package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +1 -0
  126. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +68 -0
  127. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +1 -0
  128. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +78 -0
  129. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +1 -0
  130. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +45 -0
  131. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +1 -0
  132. package/dist/types/{utils → config-aws/src/utils}/validation.util.d.ts +10 -10
  133. package/dist/types/config-aws/src/utils/validation.util.d.ts.map +1 -0
  134. package/dist/types/{config.module.d.ts → nestjs-config-aws/src/config.module.d.ts} +1 -0
  135. package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +1 -0
  136. package/dist/types/{index.d.ts → nestjs-config-aws/src/index.d.ts} +2 -4
  137. package/dist/types/nestjs-config-aws/src/index.d.ts.map +1 -0
  138. package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +1 -0
  139. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +1 -0
  140. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +1 -0
  141. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +1 -0
  142. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +1 -0
  143. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +1 -0
  144. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +1 -0
  145. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +1 -0
  146. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +1 -0
  147. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +1 -0
  148. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +1 -0
  149. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +1 -0
  150. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +1 -0
  151. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +1 -0
  152. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +1 -0
  153. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +1 -0
  154. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +1 -0
  155. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +1 -0
  156. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +1 -0
  157. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +1 -0
  158. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +1 -0
  159. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +1 -0
  160. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +1 -0
  161. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +1 -0
  162. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +1 -0
  163. package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +1 -0
  164. package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/default-schema.interface.d.ts +28 -28
  165. package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +1 -0
  166. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts +5 -0
  167. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +1 -0
  168. package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +1 -0
  169. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts +88 -0
  170. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +1 -0
  171. package/package.json +20 -27
  172. package/LICENSE +0 -21
  173. package/dist/cjs/config.module.js +0 -178
  174. package/dist/cjs/config.module.js.map +0 -1
  175. package/dist/cjs/index.js +0 -47
  176. package/dist/cjs/index.js.map +0 -1
  177. package/dist/cjs/integration/index.js.map +0 -1
  178. package/dist/cjs/integration/interfaces/configuration-factory.interface.js +0 -3
  179. package/dist/cjs/integration/interfaces/configuration-factory.interface.js.map +0 -1
  180. package/dist/cjs/integration/interfaces/configuration-source.interface.js +0 -3
  181. package/dist/cjs/integration/interfaces/configuration-source.interface.js.map +0 -1
  182. package/dist/cjs/integration/interfaces/index.js.map +0 -1
  183. package/dist/cjs/integration/interfaces/integration-options.interface.js +0 -3
  184. package/dist/cjs/integration/interfaces/integration-options.interface.js.map +0 -1
  185. package/dist/cjs/integration/interfaces/integration-state.interface.js +0 -3
  186. package/dist/cjs/integration/interfaces/integration-state.interface.js.map +0 -1
  187. package/dist/cjs/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
  188. package/dist/cjs/integration/interfaces/nestjs-config-compatibility.interface.js.map +0 -1
  189. package/dist/cjs/integration/interfaces/nestjs-config-integration.interface.js +0 -3
  190. package/dist/cjs/integration/interfaces/nestjs-config-integration.interface.js.map +0 -1
  191. package/dist/cjs/integration/interfaces/typed-configuration.interface.js +0 -4
  192. package/dist/cjs/integration/interfaces/typed-configuration.interface.js.map +0 -1
  193. package/dist/cjs/integration/interfaces/utility-types.interface.js +0 -52
  194. package/dist/cjs/integration/interfaces/utility-types.interface.js.map +0 -1
  195. package/dist/cjs/integration/nestjs-config-integration.module.js +0 -124
  196. package/dist/cjs/integration/nestjs-config-integration.module.js.map +0 -1
  197. package/dist/cjs/integration/providers/aws-configuration-loader.service.js +0 -591
  198. package/dist/cjs/integration/providers/aws-configuration-loader.service.js.map +0 -1
  199. package/dist/cjs/integration/providers/configuration-factory.provider.js +0 -383
  200. package/dist/cjs/integration/providers/configuration-factory.provider.js.map +0 -1
  201. package/dist/cjs/integration/providers/index.js.map +0 -1
  202. package/dist/cjs/integration/services/async-config-helper.service.js +0 -356
  203. package/dist/cjs/integration/services/async-config-helper.service.js.map +0 -1
  204. package/dist/cjs/integration/services/error-handler.service.js +0 -265
  205. package/dist/cjs/integration/services/error-handler.service.js.map +0 -1
  206. package/dist/cjs/integration/services/factory-registration.service.js +0 -512
  207. package/dist/cjs/integration/services/factory-registration.service.js.map +0 -1
  208. package/dist/cjs/integration/services/index.js.map +0 -1
  209. package/dist/cjs/integration/services/integration-state.service.js +0 -83
  210. package/dist/cjs/integration/services/integration-state.service.js.map +0 -1
  211. package/dist/cjs/integration/services/namespace-handler.service.js +0 -467
  212. package/dist/cjs/integration/services/namespace-handler.service.js.map +0 -1
  213. package/dist/cjs/integration/services/nestjs-config-integration.service.js +0 -316
  214. package/dist/cjs/integration/services/nestjs-config-integration.service.js.map +0 -1
  215. package/dist/cjs/integration/services/precedence-handler.service.js +0 -294
  216. package/dist/cjs/integration/services/precedence-handler.service.js.map +0 -1
  217. package/dist/cjs/integration/services/validation-integration.service.js +0 -591
  218. package/dist/cjs/integration/services/validation-integration.service.js.map +0 -1
  219. package/dist/cjs/integration/utils/config-integration.util.js +0 -283
  220. package/dist/cjs/integration/utils/config-integration.util.js.map +0 -1
  221. package/dist/cjs/integration/utils/index.js.map +0 -1
  222. package/dist/cjs/interfaces/config-loader.interface.js +0 -3
  223. package/dist/cjs/interfaces/config-loader.interface.js.map +0 -1
  224. package/dist/cjs/interfaces/config-service.interface.js +0 -11
  225. package/dist/cjs/interfaces/config-service.interface.js.map +0 -1
  226. package/dist/cjs/interfaces/default-schema.interface.js +0 -63
  227. package/dist/cjs/interfaces/default-schema.interface.js.map +0 -1
  228. package/dist/cjs/interfaces/errors.interface.js +0 -77
  229. package/dist/cjs/interfaces/errors.interface.js.map +0 -1
  230. package/dist/cjs/interfaces/index.js +0 -25
  231. package/dist/cjs/interfaces/index.js.map +0 -1
  232. package/dist/cjs/interfaces/module-options.interface.js +0 -3
  233. package/dist/cjs/interfaces/module-options.interface.js.map +0 -1
  234. package/dist/cjs/loaders/environment.loader.js +0 -59
  235. package/dist/cjs/loaders/environment.loader.js.map +0 -1
  236. package/dist/cjs/loaders/secrets-manager.loader.js +0 -122
  237. package/dist/cjs/loaders/secrets-manager.loader.js.map +0 -1
  238. package/dist/cjs/loaders/ssm-parameter-store.loader.js +0 -146
  239. package/dist/cjs/loaders/ssm-parameter-store.loader.js.map +0 -1
  240. package/dist/cjs/services/config.service.js +0 -297
  241. package/dist/cjs/services/config.service.js.map +0 -1
  242. package/dist/cjs/utils/validation.util.js +0 -114
  243. package/dist/cjs/utils/validation.util.js.map +0 -1
  244. package/dist/esm/config.module.js +0 -175
  245. package/dist/esm/config.module.js.map +0 -1
  246. package/dist/esm/index.js +0 -18
  247. package/dist/esm/index.js.map +0 -1
  248. package/dist/esm/integration/index.js +0 -7
  249. package/dist/esm/integration/index.js.map +0 -1
  250. package/dist/esm/integration/interfaces/configuration-factory.interface.js +0 -2
  251. package/dist/esm/integration/interfaces/configuration-factory.interface.js.map +0 -1
  252. package/dist/esm/integration/interfaces/configuration-source.interface.js +0 -2
  253. package/dist/esm/integration/interfaces/configuration-source.interface.js.map +0 -1
  254. package/dist/esm/integration/interfaces/index.js +0 -10
  255. package/dist/esm/integration/interfaces/index.js.map +0 -1
  256. package/dist/esm/integration/interfaces/integration-options.interface.js +0 -2
  257. package/dist/esm/integration/interfaces/integration-options.interface.js.map +0 -1
  258. package/dist/esm/integration/interfaces/integration-state.interface.js +0 -2
  259. package/dist/esm/integration/interfaces/integration-state.interface.js.map +0 -1
  260. package/dist/esm/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
  261. package/dist/esm/integration/interfaces/nestjs-config-compatibility.interface.js.map +0 -1
  262. package/dist/esm/integration/interfaces/nestjs-config-integration.interface.js +0 -2
  263. package/dist/esm/integration/interfaces/nestjs-config-integration.interface.js.map +0 -1
  264. package/dist/esm/integration/interfaces/typed-configuration.interface.js +0 -3
  265. package/dist/esm/integration/interfaces/typed-configuration.interface.js.map +0 -1
  266. package/dist/esm/integration/interfaces/utility-types.interface.js +0 -44
  267. package/dist/esm/integration/interfaces/utility-types.interface.js.map +0 -1
  268. package/dist/esm/integration/nestjs-config-integration.module.js +0 -121
  269. package/dist/esm/integration/nestjs-config-integration.module.js.map +0 -1
  270. package/dist/esm/integration/providers/aws-configuration-loader.service.js +0 -588
  271. package/dist/esm/integration/providers/aws-configuration-loader.service.js.map +0 -1
  272. package/dist/esm/integration/providers/configuration-factory.provider.js +0 -380
  273. package/dist/esm/integration/providers/configuration-factory.provider.js.map +0 -1
  274. package/dist/esm/integration/providers/index.js +0 -4
  275. package/dist/esm/integration/providers/index.js.map +0 -1
  276. package/dist/esm/integration/services/async-config-helper.service.js +0 -353
  277. package/dist/esm/integration/services/async-config-helper.service.js.map +0 -1
  278. package/dist/esm/integration/services/error-handler.service.js +0 -262
  279. package/dist/esm/integration/services/error-handler.service.js.map +0 -1
  280. package/dist/esm/integration/services/factory-registration.service.js +0 -509
  281. package/dist/esm/integration/services/factory-registration.service.js.map +0 -1
  282. package/dist/esm/integration/services/index.js +0 -10
  283. package/dist/esm/integration/services/index.js.map +0 -1
  284. package/dist/esm/integration/services/integration-state.service.js +0 -80
  285. package/dist/esm/integration/services/integration-state.service.js.map +0 -1
  286. package/dist/esm/integration/services/namespace-handler.service.js +0 -464
  287. package/dist/esm/integration/services/namespace-handler.service.js.map +0 -1
  288. package/dist/esm/integration/services/nestjs-config-integration.service.js +0 -313
  289. package/dist/esm/integration/services/nestjs-config-integration.service.js.map +0 -1
  290. package/dist/esm/integration/services/precedence-handler.service.js +0 -291
  291. package/dist/esm/integration/services/precedence-handler.service.js.map +0 -1
  292. package/dist/esm/integration/services/validation-integration.service.js +0 -585
  293. package/dist/esm/integration/services/validation-integration.service.js.map +0 -1
  294. package/dist/esm/integration/utils/config-integration.util.js +0 -240
  295. package/dist/esm/integration/utils/config-integration.util.js.map +0 -1
  296. package/dist/esm/integration/utils/index.js +0 -3
  297. package/dist/esm/integration/utils/index.js.map +0 -1
  298. package/dist/esm/interfaces/config-loader.interface.js +0 -2
  299. package/dist/esm/interfaces/config-loader.interface.js.map +0 -1
  300. package/dist/esm/interfaces/config-service.interface.js +0 -7
  301. package/dist/esm/interfaces/config-service.interface.js.map +0 -1
  302. package/dist/esm/interfaces/default-schema.interface.js +0 -59
  303. package/dist/esm/interfaces/default-schema.interface.js.map +0 -1
  304. package/dist/esm/interfaces/errors.interface.js +0 -69
  305. package/dist/esm/interfaces/errors.interface.js.map +0 -1
  306. package/dist/esm/interfaces/index.js +0 -9
  307. package/dist/esm/interfaces/index.js.map +0 -1
  308. package/dist/esm/interfaces/module-options.interface.js +0 -2
  309. package/dist/esm/interfaces/module-options.interface.js.map +0 -1
  310. package/dist/esm/loaders/environment.loader.js +0 -55
  311. package/dist/esm/loaders/environment.loader.js.map +0 -1
  312. package/dist/esm/loaders/secrets-manager.loader.js +0 -118
  313. package/dist/esm/loaders/secrets-manager.loader.js.map +0 -1
  314. package/dist/esm/loaders/ssm-parameter-store.loader.js +0 -142
  315. package/dist/esm/loaders/ssm-parameter-store.loader.js.map +0 -1
  316. package/dist/esm/services/config.service.js +0 -261
  317. package/dist/esm/services/config.service.js.map +0 -1
  318. package/dist/esm/utils/validation.util.js +0 -110
  319. package/dist/esm/utils/validation.util.js.map +0 -1
  320. package/dist/types/config.module.d.ts.map +0 -1
  321. package/dist/types/index.d.ts.map +0 -1
  322. package/dist/types/integration/index.d.ts.map +0 -1
  323. package/dist/types/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
  324. package/dist/types/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
  325. package/dist/types/integration/interfaces/index.d.ts.map +0 -1
  326. package/dist/types/integration/interfaces/integration-options.interface.d.ts.map +0 -1
  327. package/dist/types/integration/interfaces/integration-state.interface.d.ts.map +0 -1
  328. package/dist/types/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
  329. package/dist/types/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
  330. package/dist/types/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
  331. package/dist/types/integration/interfaces/utility-types.interface.d.ts.map +0 -1
  332. package/dist/types/integration/nestjs-config-integration.module.d.ts.map +0 -1
  333. package/dist/types/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
  334. package/dist/types/integration/providers/configuration-factory.provider.d.ts.map +0 -1
  335. package/dist/types/integration/providers/index.d.ts.map +0 -1
  336. package/dist/types/integration/services/async-config-helper.service.d.ts.map +0 -1
  337. package/dist/types/integration/services/error-handler.service.d.ts.map +0 -1
  338. package/dist/types/integration/services/factory-registration.service.d.ts.map +0 -1
  339. package/dist/types/integration/services/index.d.ts.map +0 -1
  340. package/dist/types/integration/services/integration-state.service.d.ts.map +0 -1
  341. package/dist/types/integration/services/namespace-handler.service.d.ts.map +0 -1
  342. package/dist/types/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
  343. package/dist/types/integration/services/precedence-handler.service.d.ts.map +0 -1
  344. package/dist/types/integration/services/validation-integration.service.d.ts.map +0 -1
  345. package/dist/types/integration/utils/config-integration.util.d.ts.map +0 -1
  346. package/dist/types/integration/utils/index.d.ts.map +0 -1
  347. package/dist/types/interfaces/config-loader.interface.d.ts +0 -22
  348. package/dist/types/interfaces/config-loader.interface.d.ts.map +0 -1
  349. package/dist/types/interfaces/config-service.interface.d.ts.map +0 -1
  350. package/dist/types/interfaces/default-schema.interface.d.ts.map +0 -1
  351. package/dist/types/interfaces/errors.interface.d.ts +0 -38
  352. package/dist/types/interfaces/errors.interface.d.ts.map +0 -1
  353. package/dist/types/interfaces/index.d.ts +0 -6
  354. package/dist/types/interfaces/index.d.ts.map +0 -1
  355. package/dist/types/interfaces/module-options.interface.d.ts.map +0 -1
  356. package/dist/types/loaders/environment.loader.d.ts +0 -26
  357. package/dist/types/loaders/environment.loader.d.ts.map +0 -1
  358. package/dist/types/loaders/secrets-manager.loader.d.ts +0 -52
  359. package/dist/types/loaders/secrets-manager.loader.d.ts.map +0 -1
  360. package/dist/types/loaders/ssm-parameter-store.loader.d.ts +0 -68
  361. package/dist/types/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
  362. package/dist/types/services/config.service.d.ts +0 -94
  363. package/dist/types/services/config.service.d.ts.map +0 -1
  364. package/dist/types/utils/validation.util.d.ts.map +0 -1
  365. /package/dist/types/{integration → nestjs-config-aws/src/integration}/index.d.ts +0 -0
  366. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/configuration-factory.interface.d.ts +0 -0
  367. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/configuration-source.interface.d.ts +0 -0
  368. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/index.d.ts +0 -0
  369. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/integration-options.interface.d.ts +0 -0
  370. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/integration-state.interface.d.ts +0 -0
  371. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/nestjs-config-compatibility.interface.d.ts +0 -0
  372. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/nestjs-config-integration.interface.d.ts +0 -0
  373. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/typed-configuration.interface.d.ts +0 -0
  374. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/utility-types.interface.d.ts +0 -0
  375. /package/dist/types/{integration → nestjs-config-aws/src/integration}/nestjs-config-integration.module.d.ts +0 -0
  376. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/aws-configuration-loader.service.d.ts +0 -0
  377. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/configuration-factory.provider.d.ts +0 -0
  378. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/index.d.ts +0 -0
  379. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/async-config-helper.service.d.ts +0 -0
  380. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/error-handler.service.d.ts +0 -0
  381. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/factory-registration.service.d.ts +0 -0
  382. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/index.d.ts +0 -0
  383. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/integration-state.service.d.ts +0 -0
  384. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/namespace-handler.service.d.ts +0 -0
  385. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/nestjs-config-integration.service.d.ts +0 -0
  386. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/precedence-handler.service.d.ts +0 -0
  387. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/validation-integration.service.d.ts +0 -0
  388. /package/dist/types/{integration → nestjs-config-aws/src/integration}/utils/config-integration.util.d.ts +0 -0
  389. /package/dist/types/{integration → nestjs-config-aws/src/integration}/utils/index.d.ts +0 -0
  390. /package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/config-service.interface.d.ts +0 -0
  391. /package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/module-options.interface.d.ts +0 -0
@@ -0,0 +1,366 @@
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 AsyncConfigHelperService_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.AsyncConfigHelperService = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const factory_registration_service_1 = require("./factory-registration.service");
19
+ const nestjs_config_integration_module_1 = require("../nestjs-config-integration.module");
20
+ /**
21
+ * Helper service for async configuration support with @nestjs/config.
22
+ * This service provides utilities for creating async configuration factories
23
+ * and managing dependency injection in async scenarios.
24
+ */
25
+ let AsyncConfigHelperService = AsyncConfigHelperService_1 = class AsyncConfigHelperService {
26
+ factoryRegistrationService;
27
+ options;
28
+ logger = new common_1.Logger(AsyncConfigHelperService_1.name);
29
+ constructor(factoryRegistrationService, options = {}) {
30
+ this.factoryRegistrationService = factoryRegistrationService;
31
+ this.options = options;
32
+ }
33
+ /**
34
+ * Create an async configuration factory that loads AWS configuration.
35
+ * This factory can be used with @nestjs/config's load array.
36
+ *
37
+ * @returns Promise resolving to configuration factory
38
+ */
39
+ async createAsyncConfigFactory() {
40
+ this.logger.debug('Creating async configuration factory');
41
+ try {
42
+ // Register AWS factories and get the first one
43
+ const awsFactories = await this.factoryRegistrationService.registerFactories();
44
+ if (awsFactories.length === 0) {
45
+ this.logger.warn('No AWS factories available, creating empty factory');
46
+ return () => ({});
47
+ }
48
+ // Create a combined factory that merges all AWS factories
49
+ const combinedFactory = () => {
50
+ const combinedConfig = {};
51
+ for (const factory of awsFactories) {
52
+ try {
53
+ const factoryConfig = factory();
54
+ Object.assign(combinedConfig, factoryConfig);
55
+ }
56
+ catch (error) {
57
+ this.logger.error(`Error executing AWS factory:`, error);
58
+ }
59
+ }
60
+ return combinedConfig;
61
+ };
62
+ this.logger.debug(`Created async configuration factory with ${awsFactories.length} AWS factories`);
63
+ return combinedFactory;
64
+ }
65
+ catch (error) {
66
+ const factoryError = error instanceof Error ? error : new Error(String(error));
67
+ this.logger.error('Failed to create async configuration factory:', factoryError);
68
+ // Handle error based on options
69
+ if (this.options.failOnAwsError) {
70
+ throw factoryError;
71
+ }
72
+ // Return empty factory as fallback
73
+ if (this.options.fallbackToLocal) {
74
+ this.logger.warn('Returning empty factory due to AWS error');
75
+ return () => ({});
76
+ }
77
+ throw factoryError;
78
+ }
79
+ }
80
+ /**
81
+ * Create multiple async configuration factories for namespaces.
82
+ * This method creates separate factories for each namespace.
83
+ *
84
+ * @param namespaces - Array of namespace names
85
+ * @returns Promise resolving to array of namespaced configuration factories
86
+ */
87
+ async createAsyncNamespacedFactories(namespaces) {
88
+ this.logger.debug(`Creating async namespaced factories for: ${namespaces.join(', ')}`);
89
+ try {
90
+ const namespacedFactories = await this.factoryRegistrationService.registerNamespacedFactories(namespaces);
91
+ if (namespacedFactories.length === 0) {
92
+ this.logger.warn('No namespaced factories available, creating empty factories');
93
+ return namespaces.map(() => () => ({}));
94
+ }
95
+ this.logger.debug(`Created ${namespacedFactories.length} async namespaced factories`);
96
+ return namespacedFactories;
97
+ }
98
+ catch (error) {
99
+ const namespacedError = error instanceof Error ? error : new Error(String(error));
100
+ this.logger.error('Failed to create async namespaced factories:', namespacedError);
101
+ // Handle error based on options
102
+ if (this.options.failOnAwsError) {
103
+ throw namespacedError;
104
+ }
105
+ // Return empty factories as fallback
106
+ if (this.options.fallbackToLocal) {
107
+ this.logger.warn('Returning empty namespaced factories due to AWS error');
108
+ return namespaces.map(() => () => ({}));
109
+ }
110
+ throw namespacedError;
111
+ }
112
+ }
113
+ /**
114
+ * Create an async factory function that can be used with dependency injection.
115
+ * This method creates a factory that can receive injected dependencies.
116
+ *
117
+ * @param dependencies - Array of dependency tokens to inject
118
+ * @returns Async factory function
119
+ */
120
+ createAsyncFactoryWithDependencies(dependencies = []) {
121
+ this.logger.debug(`Creating async factory with ${dependencies.length} dependencies`);
122
+ return async (..._injectedDependencies) => {
123
+ try {
124
+ this.logger.debug('Executing async factory with dependencies');
125
+ // Create AWS configuration factory
126
+ const awsFactory = await this.createAsyncConfigFactory();
127
+ // Create enhanced configuration options
128
+ const configOptions = {
129
+ load: [awsFactory],
130
+ isGlobal: this.options.registerGlobally ?? true,
131
+ cache: this.options.factoryOptions?.cache ?? true,
132
+ expandVariables: this.options.factoryOptions?.expandVariables ?? true,
133
+ };
134
+ this.logger.debug('Async factory with dependencies executed successfully');
135
+ return configOptions;
136
+ }
137
+ catch (error) {
138
+ const dependencyError = error instanceof Error ? error : new Error(String(error));
139
+ this.logger.error('Failed to execute async factory with dependencies:', dependencyError);
140
+ // Handle error based on options
141
+ if (this.options.failOnAwsError) {
142
+ throw dependencyError;
143
+ }
144
+ // Return basic configuration as fallback
145
+ if (this.options.fallbackToLocal) {
146
+ this.logger.warn('Returning basic configuration due to dependency error');
147
+ return {
148
+ load: [],
149
+ isGlobal: this.options.registerGlobally ?? true,
150
+ cache: this.options.factoryOptions?.cache ?? true,
151
+ expandVariables: this.options.factoryOptions?.expandVariables ?? true,
152
+ };
153
+ }
154
+ throw dependencyError;
155
+ }
156
+ };
157
+ }
158
+ /**
159
+ * Create an async factory that merges with existing configuration.
160
+ * This method creates a factory that can be combined with other configuration sources.
161
+ *
162
+ * @param existingFactory - Existing configuration factory to merge with
163
+ * @returns Promise resolving to merged configuration factory
164
+ */
165
+ async createMergedAsyncFactory(existingFactory) {
166
+ this.logger.debug('Creating merged async configuration factory');
167
+ try {
168
+ // Create AWS configuration factory
169
+ const awsFactory = await this.createAsyncConfigFactory();
170
+ // If no existing factory, return AWS factory
171
+ if (!existingFactory) {
172
+ return awsFactory;
173
+ }
174
+ // Create merged factory
175
+ const mergedFactory = () => {
176
+ const awsConfig = awsFactory();
177
+ const existingConfig = existingFactory();
178
+ // Merge configurations based on precedence
179
+ const precedence = this.options.precedence || 'aws-first';
180
+ if (precedence === 'aws-first') {
181
+ return { ...existingConfig, ...awsConfig };
182
+ }
183
+ else if (precedence === 'local-first') {
184
+ return { ...awsConfig, ...existingConfig };
185
+ }
186
+ else {
187
+ // merge - deep merge both configurations
188
+ return this.deepMerge(existingConfig, awsConfig);
189
+ }
190
+ };
191
+ this.logger.debug('Created merged async configuration factory');
192
+ return mergedFactory;
193
+ }
194
+ catch (error) {
195
+ const mergeError = error instanceof Error ? error : new Error(String(error));
196
+ this.logger.error('Failed to create merged async factory:', mergeError);
197
+ // Handle error based on options
198
+ if (this.options.failOnAwsError) {
199
+ throw mergeError;
200
+ }
201
+ // Return existing factory or empty factory as fallback
202
+ if (this.options.fallbackToLocal) {
203
+ this.logger.warn('Returning existing factory due to merge error');
204
+ return existingFactory || (() => ({}));
205
+ }
206
+ throw mergeError;
207
+ }
208
+ }
209
+ /**
210
+ * Create configuration options for async module setup.
211
+ * This method creates options that can be used with ConfigModule.forRoot().
212
+ *
213
+ * @param baseOptions - Base configuration options to enhance
214
+ * @returns Promise resolving to enhanced configuration options
215
+ */
216
+ async createAsyncConfigOptions(baseOptions = {}) {
217
+ this.logger.debug('Creating async configuration options');
218
+ try {
219
+ // Create AWS configuration factory
220
+ const awsFactory = await this.createAsyncConfigFactory();
221
+ // Merge with existing load array
222
+ const existingLoad = baseOptions.load || [];
223
+ const enhancedLoad = [...existingLoad, awsFactory];
224
+ // Create enhanced options
225
+ const enhancedOptions = {
226
+ ...baseOptions,
227
+ load: enhancedLoad,
228
+ isGlobal: baseOptions.isGlobal !== undefined ? baseOptions.isGlobal : (this.options.registerGlobally ?? true),
229
+ cache: baseOptions.cache !== undefined ? baseOptions.cache : (this.options.factoryOptions?.cache ?? true),
230
+ expandVariables: baseOptions.expandVariables !== undefined ? baseOptions.expandVariables : (this.options.factoryOptions?.expandVariables ?? true),
231
+ };
232
+ this.logger.debug('Created async configuration options');
233
+ return enhancedOptions;
234
+ }
235
+ catch (error) {
236
+ const optionsError = error instanceof Error ? error : new Error(String(error));
237
+ this.logger.error('Failed to create async configuration options:', optionsError);
238
+ // Handle error based on options
239
+ if (this.options.failOnAwsError) {
240
+ throw optionsError;
241
+ }
242
+ // Return base options as fallback
243
+ if (this.options.fallbackToLocal) {
244
+ this.logger.warn('Returning base options due to async error');
245
+ return baseOptions;
246
+ }
247
+ throw optionsError;
248
+ }
249
+ }
250
+ /**
251
+ * Check if AWS configuration is available for async loading.
252
+ * This method can be used to determine if AWS integration should be enabled.
253
+ *
254
+ * @returns Promise resolving to availability status
255
+ */
256
+ async checkAsyncAvailability() {
257
+ this.logger.debug('Checking async configuration availability');
258
+ const status = {
259
+ isAvailable: false,
260
+ factoriesCount: 0,
261
+ errors: []
262
+ };
263
+ try {
264
+ // Try to register factories to check availability
265
+ const factories = await this.factoryRegistrationService.registerFactories();
266
+ status.isAvailable = factories.length > 0;
267
+ status.factoriesCount = factories.length;
268
+ this.logger.debug(`Async availability check: available=${status.isAvailable}, factories=${status.factoriesCount}`);
269
+ }
270
+ catch (error) {
271
+ const availabilityError = error instanceof Error ? error : new Error(String(error));
272
+ status.errors.push(availabilityError.message);
273
+ this.logger.error('Async availability check failed:', availabilityError);
274
+ }
275
+ return status;
276
+ }
277
+ /**
278
+ * Create a factory that loads configuration on-demand.
279
+ * This factory delays AWS configuration loading until it's actually needed.
280
+ *
281
+ * @returns Configuration factory with lazy loading
282
+ */
283
+ createLazyAsyncFactory() {
284
+ this.logger.debug('Creating lazy async configuration factory');
285
+ let cachedConfig = null;
286
+ let loadingPromise = null;
287
+ return () => {
288
+ // Return cached config if available
289
+ if (cachedConfig !== null) {
290
+ return cachedConfig;
291
+ }
292
+ // If already loading, wait for the promise
293
+ if (loadingPromise) {
294
+ // For synchronous factory, we can't wait for async operations
295
+ // Return empty config and let the promise resolve in background
296
+ this.logger.warn('Lazy factory called while loading, returning empty config');
297
+ return {};
298
+ }
299
+ // Start loading configuration and update cache when complete
300
+ loadingPromise = this.loadConfigurationLazily()
301
+ .then((config) => {
302
+ cachedConfig = config;
303
+ loadingPromise = null;
304
+ return config;
305
+ })
306
+ .catch((error) => {
307
+ loadingPromise = null;
308
+ this.logger.error('Lazy loading failed:', error);
309
+ return {};
310
+ });
311
+ // Return empty config for now (will be populated on next call)
312
+ this.logger.debug('Started lazy loading, returning empty config');
313
+ return {};
314
+ };
315
+ }
316
+ /**
317
+ * Load configuration lazily for the lazy factory.
318
+ * @returns Promise resolving to configuration data
319
+ */
320
+ async loadConfigurationLazily() {
321
+ try {
322
+ this.logger.debug('Loading configuration lazily');
323
+ const awsFactory = await this.createAsyncConfigFactory();
324
+ const config = awsFactory();
325
+ this.logger.debug('Lazy configuration loading completed');
326
+ return config;
327
+ }
328
+ catch (error) {
329
+ const lazyError = error instanceof Error ? error : new Error(String(error));
330
+ this.logger.error('Lazy configuration loading failed:', lazyError);
331
+ // Return empty config on error
332
+ return {};
333
+ }
334
+ }
335
+ /**
336
+ * Deep merge two configuration objects.
337
+ * @param target - Target object
338
+ * @param source - Source object
339
+ * @returns Merged object
340
+ */
341
+ deepMerge(target, source) {
342
+ const result = { ...target };
343
+ for (const [key, value] of Object.entries(source)) {
344
+ if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
345
+ if (result[key] && typeof result[key] === 'object' && !Array.isArray(result[key])) {
346
+ result[key] = this.deepMerge(result[key], value);
347
+ }
348
+ else {
349
+ result[key] = { ...value };
350
+ }
351
+ }
352
+ else {
353
+ result[key] = value;
354
+ }
355
+ }
356
+ return result;
357
+ }
358
+ };
359
+ exports.AsyncConfigHelperService = AsyncConfigHelperService;
360
+ exports.AsyncConfigHelperService = AsyncConfigHelperService = AsyncConfigHelperService_1 = __decorate([
361
+ (0, common_1.Injectable)(),
362
+ __param(1, (0, common_1.Optional)()),
363
+ __param(1, (0, common_1.Inject)(nestjs_config_integration_module_1.NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS)),
364
+ __metadata("design:paramtypes", [factory_registration_service_1.FactoryRegistrationService, Object])
365
+ ], AsyncConfigHelperService);
366
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtY29uZmlnLWhlbHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uL3NlcnZpY2VzL2FzeW5jLWNvbmZpZy1oZWxwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXNFO0FBRXRFLGlGQUE0RTtBQUU1RSwwRkFBNEY7QUFFNUY7Ozs7R0FJRztBQUVJLElBQU0sd0JBQXdCLGdDQUE5QixNQUFNLHdCQUF3QjtJQUloQjtJQUVBO0lBTEYsTUFBTSxHQUFHLElBQUksZUFBTSxDQUFDLDBCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBFLFlBQ21CLDBCQUFzRCxFQUV0RCxVQUE4QixFQUFFO1FBRmhDLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFFdEQsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7SUFDaEQsQ0FBQztJQUVKOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHdCQUF3QjtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQztZQUNILCtDQUErQztZQUMvQyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRS9FLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0RBQW9ELENBQUMsQ0FBQztnQkFDdkUsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLENBQUM7WUFFRCwwREFBMEQ7WUFDMUQsTUFBTSxlQUFlLEdBQWtCLEdBQUcsRUFBRTtnQkFDMUMsTUFBTSxjQUFjLEdBQXdCLEVBQUUsQ0FBQztnQkFFL0MsS0FBSyxNQUFNLE9BQU8sSUFB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QURwQyxJQUFBLG1CQUFVLEdBQUU7SUFNUixXQUFBLElBQUEsaUJBQVEsR0FBRSxDQUFBO0lBQUUsV0FBQSxJQUFBLGVBQU0sRUFBQyx3RUFBcUMsQ0FBQyxDQUFBO3FDQURiLHlEQUEwQjtHQUo5RCx3QkFBd0IsQ0FtWXBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyLCBJbmplY3QsIE9wdGlvbmFsIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb25maWdGYWN0b3J5LCBDb25maWdNb2R1bGVPcHRpb25zIH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xyXG5pbXBvcnQgeyBGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZSB9IGZyb20gJy4vZmFjdG9yeS1yZWdpc3RyYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEludGVncmF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaW50ZWdyYXRpb24tb3B0aW9ucy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBORVNUSlNfQ09ORklHX0FXU19JTlRFR1JBVElPTl9PUFRJT05TIH0gZnJvbSAnLi4vbmVzdGpzLWNvbmZpZy1pbnRlZ3JhdGlvbi5tb2R1bGUnO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBzZXJ2aWNlIGZvciBhc3luYyBjb25maWd1cmF0aW9uIHN1cHBvcnQgd2l0aCBAbmVzdGpzL2NvbmZpZy5cclxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIHV0aWxpdGllcyBmb3IgY3JlYXRpbmcgYXN5bmMgY29uZmlndXJhdGlvbiBmYWN0b3JpZXNcclxuICogYW5kIG1hbmFnaW5nIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIGFzeW5jIHNjZW5hcmlvcy5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFzeW5jQ29uZmlnSGVscGVyU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKEFzeW5jQ29uZmlnSGVscGVyU2VydmljZS5uYW1lKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlOiBGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZSxcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkVTVEpTX0NPTkZJR19BV1NfSU5URUdSQVRJT05fT1BUSU9OUykgXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IEludGVncmF0aW9uT3B0aW9ucyA9IHt9XHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gYXN5bmMgY29uZmlndXJhdGlvbiBmYWN0b3J5IHRoYXQgbG9hZHMgQVdTIGNvbmZpZ3VyYXRpb24uXHJcbiAgICogVGhpcyBmYWN0b3J5IGNhbiBiZSB1c2VkIHdpdGggQG5lc3Rqcy9jb25maWcncyBsb2FkIGFycmF5LlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGNvbmZpZ3VyYXRpb24gZmFjdG9yeVxyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZUFzeW5jQ29uZmlnRmFjdG9yeSgpOiBQcm9taXNlPENvbmZpZ0ZhY3Rvcnk+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBhc3luYyBjb25maWd1cmF0aW9uIGZhY3RvcnknKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gUmVnaXN0ZXIgQVdTIGZhY3RvcmllcyBhbmQgZ2V0IHRoZSBmaXJzdCBvbmVcclxuICAgICAgY29uc3QgYXdzRmFjdG9yaWVzID0gYXdhaXQgdGhpcy5mYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5yZWdpc3RlckZhY3RvcmllcygpO1xyXG4gICAgICBcclxuICAgICAgaWYgKGF3c0ZhY3Rvcmllcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdObyBBV1MgZmFjdG9yaWVzIGF2YWlsYWJsZSwgY3JlYXRpbmcgZW1wdHkgZmFjdG9yeScpO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiAoe30pO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgYSBjb21iaW5lZCBmYWN0b3J5IHRoYXQgbWVyZ2VzIGFsbCBBV1MgZmFjdG9yaWVzXHJcbiAgICAgIGNvbnN0IGNvbWJpbmVkRmFjdG9yeTogQ29uZmlnRmFjdG9yeSA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBjb21iaW5lZENvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAoY29uc3QgZmFjdG9yeSBvZiBhd3NGYWN0b3JpZXMpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZhY3RvcnlDb25maWcgPSBmYWN0b3J5KCk7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29tYmluZWRDb25maWcsIGZhY3RvcnlDb25maWcpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEVycm9yIGV4ZWN1dGluZyBBV1MgZmFjdG9yeTpgLCBlcnJvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBjb21iaW5lZENvbmZpZztcclxuICAgICAgfTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkIGFzeW5jIGNvbmZpZ3VyYXRpb24gZmFjdG9yeSB3aXRoICR7YXdzRmFjdG9yaWVzLmxlbmd0aH0gQVdTIGZhY3Rvcmllc2ApO1xyXG4gICAgICByZXR1cm4gY29tYmluZWRGYWN0b3J5O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgZmFjdG9yeUVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhc3luYyBjb25maWd1cmF0aW9uIGZhY3Rvcnk6JywgZmFjdG9yeUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIC8vIEhhbmRsZSBlcnJvciBiYXNlZCBvbiBvcHRpb25zXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBmYWN0b3J5RXJyb3I7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiBlbXB0eSBmYWN0b3J5IGFzIGZhbGxiYWNrXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignUmV0dXJuaW5nIGVtcHR5IGZhY3RvcnkgZHVlIHRvIEFXUyBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiAoKSA9PiAoe30pO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBmYWN0b3J5RXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgbXVsdGlwbGUgYXN5bmMgY29uZmlndXJhdGlvbiBmYWN0b3JpZXMgZm9yIG5hbWVzcGFjZXMuXHJcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBzZXBhcmF0ZSBmYWN0b3JpZXMgZm9yIGVhY2ggbmFtZXNwYWNlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2VzIC0gQXJyYXkgb2YgbmFtZXNwYWNlIG5hbWVzXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3Rvcmllc1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZUFzeW5jTmFtZXNwYWNlZEZhY3RvcmllcyhuYW1lc3BhY2VzOiBzdHJpbmdbXSk6IFByb21pc2U8Q29uZmlnRmFjdG9yeVtdPiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgYXN5bmMgbmFtZXNwYWNlZCBmYWN0b3JpZXMgZm9yOiAke25hbWVzcGFjZXMuam9pbignLCAnKX1gKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgbmFtZXNwYWNlZEZhY3RvcmllcyA9IGF3YWl0IHRoaXMuZmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UucmVnaXN0ZXJOYW1lc3BhY2VkRmFjdG9yaWVzKG5hbWVzcGFjZXMpO1xyXG4gICAgICBcclxuICAgICAgaWYgKG5hbWVzcGFjZWRGYWN0b3JpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignTm8gbmFtZXNwYWNlZCBmYWN0b3JpZXMgYXZhaWxhYmxlLCBjcmVhdGluZyBlbXB0eSBmYWN0b3JpZXMnKTtcclxuICAgICAgICByZXR1cm4gbmFtZXNwYWNlcy5tYXAoKCkgPT4gKCkgPT4gKHt9KSk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkICR7bmFtZXNwYWNlZEZhY3Rvcmllcy5sZW5ndGh9IGFzeW5jIG5hbWVzcGFjZWQgZmFjdG9yaWVzYCk7XHJcbiAgICAgIHJldHVybiBuYW1lc3BhY2VkRmFjdG9yaWVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgbmFtZXNwYWNlZEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBhc3luYyBuYW1lc3BhY2VkIGZhY3RvcmllczonLCBuYW1lc3BhY2VkRXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgLy8gSGFuZGxlIGVycm9yIGJhc2VkIG9uIG9wdGlvbnNcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWlsT25Bd3NFcnJvcikge1xyXG4gICAgICAgIHRocm93IG5hbWVzcGFjZWRFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGZhY3RvcmllcyBhcyBmYWxsYmFja1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1JldHVybmluZyBlbXB0eSBuYW1lc3BhY2VkIGZhY3RvcmllcyBkdWUgdG8gQVdTIGVycm9yJyk7XHJcbiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZXMubWFwKCgpID0+ICgpID0+ICh7fSkpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBuYW1lc3BhY2VkRXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gYXN5bmMgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24uXHJcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIGZhY3RvcnkgdGhhdCBjYW4gcmVjZWl2ZSBpbmplY3RlZCBkZXBlbmRlbmNpZXMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGRlcGVuZGVuY2llcyAtIEFycmF5IG9mIGRlcGVuZGVuY3kgdG9rZW5zIHRvIGluamVjdFxyXG4gICAqIEByZXR1cm5zIEFzeW5jIGZhY3RvcnkgZnVuY3Rpb25cclxuICAgKi9cclxuICBjcmVhdGVBc3luY0ZhY3RvcnlXaXRoRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llczogYW55W10gPSBbXSk6ICguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTxDb25maWdNb2R1bGVPcHRpb25zPiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgYXN5bmMgZmFjdG9yeSB3aXRoICR7ZGVwZW5kZW5jaWVzLmxlbmd0aH0gZGVwZW5kZW5jaWVzYCk7XHJcbiAgICBcclxuICAgIHJldHVybiBhc3luYyAoLi4uX2luamVjdGVkRGVwZW5kZW5jaWVzOiBhbnlbXSk6IFByb21pc2U8Q29uZmlnTW9kdWxlT3B0aW9ucz4gPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgYXN5bmMgZmFjdG9yeSB3aXRoIGRlcGVuZGVuY2llcycpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIENyZWF0ZSBBV1MgY29uZmlndXJhdGlvbiBmYWN0b3J5XHJcbiAgICAgICAgY29uc3QgYXdzRmFjdG9yeSA9IGF3YWl0IHRoaXMuY3JlYXRlQXN5bmNDb25maWdGYWN0b3J5KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZ09wdGlvbnM6IENvbmZpZ01vZHVsZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBsb2FkOiBbYXdzRmFjdG9yeV0sXHJcbiAgICAgICAgICBpc0dsb2JhbDogdGhpcy5vcHRpb25zLnJlZ2lzdGVyR2xvYmFsbHkgPz8gdHJ1ZSxcclxuICAgICAgICAgIGNhY2hlOiB0aGlzLm9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmNhY2hlID8/IHRydWUsXHJcbiAgICAgICAgICBleHBhbmRWYXJpYWJsZXM6IHRoaXMub3B0aW9ucy5mYWN0b3J5T3B0aW9ucz8uZXhwYW5kVmFyaWFibGVzID8/IHRydWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQXN5bmMgZmFjdG9yeSB3aXRoIGRlcGVuZGVuY2llcyBleGVjdXRlZCBzdWNjZXNzZnVsbHknKTtcclxuICAgICAgICByZXR1cm4gY29uZmlnT3B0aW9ucztcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zdCBkZXBlbmRlbmN5RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIGFzeW5jIGZhY3Rvcnkgd2l0aCBkZXBlbmRlbmNpZXM6JywgZGVwZW5kZW5jeUVycm9yKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBIYW5kbGUgZXJyb3IgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICAgIHRocm93IGRlcGVuZGVuY3lFcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUmV0dXJuIGJhc2ljIGNvbmZpZ3VyYXRpb24gYXMgZmFsbGJhY2tcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybignUmV0dXJuaW5nIGJhc2ljIGNvbmZpZ3VyYXRpb24gZHVlIHRvIGRlcGVuZGVuY3kgZXJyb3InKTtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxvYWQ6IFtdLFxyXG4gICAgICAgICAgICBpc0dsb2JhbDogdGhpcy5vcHRpb25zLnJlZ2lzdGVyR2xvYmFsbHkgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgY2FjaGU6IHRoaXMub3B0aW9ucy5mYWN0b3J5T3B0aW9ucz8uY2FjaGUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgZXhwYW5kVmFyaWFibGVzOiB0aGlzLm9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmV4cGFuZFZhcmlhYmxlcyA/PyB0cnVlLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhyb3cgZGVwZW5kZW5jeUVycm9yO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGFuIGFzeW5jIGZhY3RvcnkgdGhhdCBtZXJnZXMgd2l0aCBleGlzdGluZyBjb25maWd1cmF0aW9uLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmYWN0b3J5IHRoYXQgY2FuIGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgY29uZmlndXJhdGlvbiBzb3VyY2VzLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBleGlzdGluZ0ZhY3RvcnkgLSBFeGlzdGluZyBjb25maWd1cmF0aW9uIGZhY3RvcnkgdG8gbWVyZ2Ugd2l0aFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG1lcmdlZCBjb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVNZXJnZWRBc3luY0ZhY3RvcnkoZXhpc3RpbmdGYWN0b3J5PzogQ29uZmlnRmFjdG9yeSk6IFByb21pc2U8Q29uZmlnRmFjdG9yeT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0NyZWF0aW5nIG1lcmdlZCBhc3luYyBjb25maWd1cmF0aW9uIGZhY3RvcnknKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ3JlYXRlIEFXUyBjb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgICAgY29uc3QgYXdzRmFjdG9yeSA9IGF3YWl0IHRoaXMuY3JlYXRlQXN5bmNDb25maWdGYWN0b3J5KCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBJZiBubyBleGlzdGluZyBmYWN0b3J5LCByZXR1cm4gQVdTIGZhY3RvcnlcclxuICAgICAgaWYgKCFleGlzdGluZ0ZhY3RvcnkpIHtcclxuICAgICAgICByZXR1cm4gYXdzRmFjdG9yeTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gQ3JlYXRlIG1lcmdlZCBmYWN0b3J5XHJcbiAgICAgIGNvbnN0IG1lcmdlZEZhY3Rvcnk6IENvbmZpZ0ZhY3RvcnkgPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXdzQ29uZmlnID0gYXdzRmFjdG9yeSgpO1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gZXhpc3RpbmdGYWN0b3J5KCk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTWVyZ2UgY29uZmlndXJhdGlvbnMgYmFzZWQgb24gcHJlY2VkZW5jZVxyXG4gICAgICAgIGNvbnN0IHByZWNlZGVuY2UgPSB0aGlzLm9wdGlvbnMucHJlY2VkZW5jZSB8fCAnYXdzLWZpcnN0JztcclxuICAgICAgICBcclxuICAgICAgICBpZiAocHJlY2VkZW5jZSA9PT0gJ2F3cy1maXJzdCcpIHtcclxuICAgICAgICAgIHJldHVybiB7IC4uLmV4aXN0aW5nQ29uZmlnLCAuLi5hd3NDb25maWcgfTtcclxuICAgICAgICB9IGVsc2UgaWYgKHByZWNlZGVuY2UgPT09ICdsb2NhbC1maXJzdCcpIHtcclxuICAgICAgICAgIHJldHVybiB7IC4uLmF3c0NvbmZpZywgLi4uZXhpc3RpbmdDb25maWcgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gbWVyZ2UgLSBkZWVwIG1lcmdlIGJvdGggY29uZmlndXJhdGlvbnNcclxuICAgICAgICAgIHJldHVybiB0aGlzLmRlZXBNZXJnZShleGlzdGluZ0NvbmZpZywgYXdzQ29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRlZCBtZXJnZWQgYXN5bmMgY29uZmlndXJhdGlvbiBmYWN0b3J5Jyk7XHJcbiAgICAgIHJldHVybiBtZXJnZWRGYWN0b3J5O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgbWVyZ2VFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgbWVyZ2VkIGFzeW5jIGZhY3Rvcnk6JywgbWVyZ2VFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICAvLyBIYW5kbGUgZXJyb3IgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgbWVyZ2VFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGV4aXN0aW5nIGZhY3Rvcnkgb3IgZW1wdHkgZmFjdG9yeSBhcyBmYWxsYmFja1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ1JldHVybmluZyBleGlzdGluZyBmYWN0b3J5IGR1ZSB0byBtZXJnZSBlcnJvcicpO1xyXG4gICAgICAgIHJldHVybiBleGlzdGluZ0ZhY3RvcnkgfHwgKCgpID0+ICh7fSkpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBtZXJnZUVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYXN5bmMgbW9kdWxlIHNldHVwLlxyXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgb3B0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggQ29uZmlnTW9kdWxlLmZvclJvb3QoKS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gYmFzZU9wdGlvbnMgLSBCYXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBlbmhhbmNlXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gZW5oYW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlQXN5bmNDb25maWdPcHRpb25zKGJhc2VPcHRpb25zOiBDb25maWdNb2R1bGVPcHRpb25zID0ge30pOiBQcm9taXNlPENvbmZpZ01vZHVsZU9wdGlvbnM+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBhc3luYyBjb25maWd1cmF0aW9uIG9wdGlvbnMnKTtcclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ3JlYXRlIEFXUyBjb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgICAgY29uc3QgYXdzRmFjdG9yeSA9IGF3YWl0IHRoaXMuY3JlYXRlQXN5bmNDb25maWdGYWN0b3J5KCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBNZXJnZSB3aXRoIGV4aXN0aW5nIGxvYWQgYXJyYXlcclxuICAgICAgY29uc3QgZXhpc3RpbmdMb2FkID0gYmFzZU9wdGlvbnMubG9hZCB8fCBbXTtcclxuICAgICAgY29uc3QgZW5oYW5jZWRMb2FkID0gWy4uLmV4aXN0aW5nTG9hZCwgYXdzRmFjdG9yeV07XHJcbiAgICAgIFxyXG4gICAgICAvLyBDcmVhdGUgZW5oYW5jZWQgb3B0aW9uc1xyXG4gICAgICBjb25zdCBlbmhhbmNlZE9wdGlvbnM6IENvbmZpZ01vZHVsZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgLi4uYmFzZU9wdGlvbnMsXHJcbiAgICAgICAgbG9hZDogZW5oYW5jZWRMb2FkLFxyXG4gICAgICAgIGlzR2xvYmFsOiBiYXNlT3B0aW9ucy5pc0dsb2JhbCAhPT0gdW5kZWZpbmVkID8gYmFzZU9wdGlvbnMuaXNHbG9iYWwgOiAodGhpcy5vcHRpb25zLnJlZ2lzdGVyR2xvYmFsbHkgPz8gdHJ1ZSksXHJcbiAgICAgICAgY2FjaGU6IGJhc2VPcHRpb25zLmNhY2hlICE9PSB1bmRlZmluZWQgPyBiYXNlT3B0aW9ucy5jYWNoZSA6ICh0aGlzLm9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmNhY2hlID8/IHRydWUpLFxyXG4gICAgICAgIGV4cGFuZFZhcmlhYmxlczogYmFzZU9wdGlvbnMuZXhwYW5kVmFyaWFibGVzICE9PSB1bmRlZmluZWQgPyBiYXNlT3B0aW9ucy5leHBhbmRWYXJpYWJsZXMgOiAodGhpcy5vcHRpb25zLmZhY3RvcnlPcHRpb25zPy5leHBhbmRWYXJpYWJsZXMgPz8gdHJ1ZSksXHJcbiAgICAgIH07XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRlZCBhc3luYyBjb25maWd1cmF0aW9uIG9wdGlvbnMnKTtcclxuICAgICAgcmV0dXJuIGVuaGFuY2VkT3B0aW9ucztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbnNFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgYXN5bmMgY29uZmlndXJhdGlvbiBvcHRpb25zOicsIG9wdGlvbnNFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICAvLyBIYW5kbGUgZXJyb3IgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgb3B0aW9uc0Vycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZXR1cm4gYmFzZSBvcHRpb25zIGFzIGZhbGxiYWNrXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignUmV0dXJuaW5nIGJhc2Ugb3B0aW9ucyBkdWUgdG8gYXN5bmMgZXJyb3InKTtcclxuICAgICAgICByZXR1cm4gYmFzZU9wdGlvbnM7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRocm93IG9wdGlvbnNFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIEFXUyBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZSBmb3IgYXN5bmMgbG9hZGluZy5cclxuICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgQVdTIGludGVncmF0aW9uIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGF2YWlsYWJpbGl0eSBzdGF0dXNcclxuICAgKi9cclxuICBhc3luYyBjaGVja0FzeW5jQXZhaWxhYmlsaXR5KCk6IFByb21pc2U8e1xyXG4gICAgaXNBdmFpbGFibGU6IGJvb2xlYW47XHJcbiAgICBmYWN0b3JpZXNDb3VudDogbnVtYmVyO1xyXG4gICAgZXJyb3JzOiBzdHJpbmdbXTtcclxuICB9PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ2hlY2tpbmcgYXN5bmMgY29uZmlndXJhdGlvbiBhdmFpbGFiaWxpdHknKTtcclxuICAgIFxyXG4gICAgY29uc3Qgc3RhdHVzID0ge1xyXG4gICAgICBpc0F2YWlsYWJsZTogZmFsc2UsXHJcbiAgICAgIGZhY3Rvcmllc0NvdW50OiAwLFxyXG4gICAgICBlcnJvcnM6IFtdIGFzIHN0cmluZ1tdXHJcbiAgICB9O1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFRyeSB0byByZWdpc3RlciBmYWN0b3JpZXMgdG8gY2hlY2sgYXZhaWxhYmlsaXR5XHJcbiAgICAgIGNvbnN0IGZhY3RvcmllcyA9IGF3YWl0IHRoaXMuZmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UucmVnaXN0ZXJGYWN0b3JpZXMoKTtcclxuICAgICAgXHJcbiAgICAgIHN0YXR1cy5pc0F2YWlsYWJsZSA9IGZhY3Rvcmllcy5sZW5ndGggPiAwO1xyXG4gICAgICBzdGF0dXMuZmFjdG9yaWVzQ291bnQgPSBmYWN0b3JpZXMubGVuZ3RoO1xyXG4gICAgICBcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEFzeW5jIGF2YWlsYWJpbGl0eSBjaGVjazogYXZhaWxhYmxlPSR7c3RhdHVzLmlzQXZhaWxhYmxlfSwgZmFjdG9yaWVzPSR7c3RhdHVzLmZhY3Rvcmllc0NvdW50fWApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgYXZhaWxhYmlsaXR5RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHN0YXR1cy5lcnJvcnMucHVzaChhdmFpbGFiaWxpdHlFcnJvci5tZXNzYWdlKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0FzeW5jIGF2YWlsYWJpbGl0eSBjaGVjayBmYWlsZWQ6JywgYXZhaWxhYmlsaXR5RXJyb3IpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdGF0dXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgbG9hZHMgY29uZmlndXJhdGlvbiBvbi1kZW1hbmQuXHJcbiAgICogVGhpcyBmYWN0b3J5IGRlbGF5cyBBV1MgY29uZmlndXJhdGlvbiBsb2FkaW5nIHVudGlsIGl0J3MgYWN0dWFsbHkgbmVlZGVkLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gZmFjdG9yeSB3aXRoIGxhenkgbG9hZGluZ1xyXG4gICAqL1xyXG4gIGNyZWF0ZUxhenlBc3luY0ZhY3RvcnkoKTogQ29uZmlnRmFjdG9yeSB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRpbmcgbGF6eSBhc3luYyBjb25maWd1cmF0aW9uIGZhY3RvcnknKTtcclxuICAgIFxyXG4gICAgbGV0IGNhY2hlZENvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xyXG4gICAgbGV0IGxvYWRpbmdQcm9taXNlOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHwgbnVsbCA9IG51bGw7XHJcbiAgICBcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgIC8vIFJldHVybiBjYWNoZWQgY29uZmlnIGlmIGF2YWlsYWJsZVxyXG4gICAgICBpZiAoY2FjaGVkQ29uZmlnICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlZENvbmZpZztcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gSWYgYWxyZWFkeSBsb2FkaW5nLCB3YWl0IGZvciB0aGUgcHJvbWlzZVxyXG4gICAgICBpZiAobG9hZGluZ1Byb21pc2UpIHtcclxuICAgICAgICAvLyBGb3Igc3luY2hyb25vdXMgZmFjdG9yeSwgd2UgY2FuJ3Qgd2FpdCBmb3IgYXN5bmMgb3BlcmF0aW9uc1xyXG4gICAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgYW5kIGxldCB0aGUgcHJvbWlzZSByZXNvbHZlIGluIGJhY2tncm91bmRcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdMYXp5IGZhY3RvcnkgY2FsbGVkIHdoaWxlIGxvYWRpbmcsIHJldHVybmluZyBlbXB0eSBjb25maWcnKTtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFN0YXJ0IGxvYWRpbmcgY29uZmlndXJhdGlvbiBhbmQgdXBkYXRlIGNhY2hlIHdoZW4gY29tcGxldGVcclxuICAgICAgbG9hZGluZ1Byb21pc2UgPSB0aGlzLmxvYWRDb25maWd1cmF0aW9uTGF6aWx5KClcclxuICAgICAgICAudGhlbigoY29uZmlnKSA9PiB7XHJcbiAgICAgICAgICBjYWNoZWRDb25maWcgPSBjb25maWc7XHJcbiAgICAgICAgICBsb2FkaW5nUHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgbG9hZGluZ1Byb21pc2UgPSBudWxsO1xyXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0xhenkgbG9hZGluZyBmYWlsZWQ6JywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGNvbmZpZyBmb3Igbm93ICh3aWxsIGJlIHBvcHVsYXRlZCBvbiBuZXh0IGNhbGwpXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdTdGFydGVkIGxhenkgbG9hZGluZywgcmV0dXJuaW5nIGVtcHR5IGNvbmZpZycpO1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGxhemlseSBmb3IgdGhlIGxhenkgZmFjdG9yeS5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBjb25maWd1cmF0aW9uIGRhdGFcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGxvYWRDb25maWd1cmF0aW9uTGF6aWx5KCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ0xvYWRpbmcgY29uZmlndXJhdGlvbiBsYXppbHknKTtcclxuICAgICAgXHJcbiAgICAgIGNvbnN0IGF3c0ZhY3RvcnkgPSBhd2FpdCB0aGlzLmNyZWF0ZUFzeW5jQ29uZmlnRmFjdG9yeSgpO1xyXG4gICAgICBjb25zdCBjb25maWcgPSBhd3NGYWN0b3J5KCk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTGF6eSBjb25maWd1cmF0aW9uIGxvYWRpbmcgY29tcGxldGVkJyk7XHJcbiAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBsYXp5RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdMYXp5IGNvbmZpZ3VyYXRpb24gbG9hZGluZyBmYWlsZWQ6JywgbGF6eUVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiBlbXB0eSBjb25maWcgb24gZXJyb3JcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVlcCBtZXJnZSB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzLlxyXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUYXJnZXQgb2JqZWN0XHJcbiAgICogQHBhcmFtIHNvdXJjZSAtIFNvdXJjZSBvYmplY3RcclxuICAgKiBAcmV0dXJucyBNZXJnZWQgb2JqZWN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZWVwTWVyZ2UodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4udGFyZ2V0IH07XHJcblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xyXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICBpZiAocmVzdWx0W2tleV0gJiYgdHlwZW9mIHJlc3VsdFtrZXldID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHRba2V5XSkpIHtcclxuICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5kZWVwTWVyZ2UocmVzdWx0W2tleV0sIHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0W2tleV0gPSB7IC4uLnZhbHVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxufSJdfQ==