@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,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SSMParameterStoreLoader = void 0;
4
+ const client_ssm_1 = require("@aws-sdk/client-ssm");
5
+ const credential_providers_1 = require("@aws-sdk/credential-providers");
6
+ const errors_1 = require("../errors");
7
+ /**
8
+ * Loader that reads configuration from AWS SSM Parameter Store.
9
+ * Supports environment-aware path construction, pagination, and decryption options.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Basic usage
14
+ * const loader = new SSMParameterStoreLoader({
15
+ * parameterPath: '/my-app/config',
16
+ * region: 'us-east-1'
17
+ * });
18
+ *
19
+ * // With environment mapping
20
+ * const loader = new SSMParameterStoreLoader({
21
+ * parameterPath: '/my-app/config',
22
+ * environmentMapping: {
23
+ * development: 'dev',
24
+ * staging: 'stg',
25
+ * production: 'prod'
26
+ * }
27
+ * });
28
+ * ```
29
+ */
30
+ class SSMParameterStoreLoader {
31
+ /** @internal */
32
+ _client;
33
+ /** @internal */
34
+ _config;
35
+ /** @internal */
36
+ _appEnv;
37
+ constructor(config = {}) {
38
+ this._appEnv = process.env['APP_ENV'] || process.env['NODE_ENV'] || 'local';
39
+ // Set default configuration
40
+ this._config = {
41
+ parameterPath: config.parameterPath || '/config-aws',
42
+ region: config.region || process.env['AWS_REGION'] || 'us-east-1',
43
+ environmentMapping: config.environmentMapping || {
44
+ development: 'dev',
45
+ test: 'test',
46
+ production: 'production',
47
+ },
48
+ withDecryption: config.withDecryption ?? true,
49
+ };
50
+ // Initialize AWS SSM client
51
+ this._client = new client_ssm_1.SSMClient({
52
+ credentials: (0, credential_providers_1.fromNodeProviderChain)(),
53
+ region: this._config.region,
54
+ });
55
+ }
56
+ /**
57
+ * Get the name of this loader for logging and debugging.
58
+ * @returns The loader name with parameter path
59
+ */
60
+ getName() {
61
+ try {
62
+ const parameterPath = this.buildParameterPath();
63
+ return `SSMParameterStoreLoader(${parameterPath})`;
64
+ }
65
+ catch {
66
+ // Fallback if path construction fails (e.g., missing env mapping)
67
+ return `SSMParameterStoreLoader(${this._config.parameterPath})`;
68
+ }
69
+ }
70
+ /**
71
+ * Check if this loader is available in the current environment.
72
+ * @returns Promise resolving to true if not in local environment and AWS credentials are available
73
+ */
74
+ async isAvailable() {
75
+ // Skip in local environment
76
+ if (this._appEnv === 'local') {
77
+ return false;
78
+ }
79
+ try {
80
+ // Test AWS credentials by attempting to get caller identity
81
+ await this._client.config.credentials();
82
+ return true;
83
+ }
84
+ catch {
85
+ return false;
86
+ }
87
+ }
88
+ /**
89
+ * Load configuration from AWS SSM Parameter Store.
90
+ * Implements recursive parameter fetching with NextToken handling for pagination.
91
+ * @returns Promise resolving to configuration key-value pairs from parameters
92
+ * @throws AWSServiceError if AWS operation fails
93
+ * @throws ConfigurationLoadError if parameter path cannot be constructed
94
+ */
95
+ async load() {
96
+ // Skip loading in local environment
97
+ if (this._appEnv === 'local') {
98
+ return {};
99
+ }
100
+ const parameterPath = this.buildParameterPath();
101
+ const result = {};
102
+ let nextToken;
103
+ try {
104
+ do {
105
+ const command = new client_ssm_1.GetParametersByPathCommand({
106
+ Path: parameterPath,
107
+ Recursive: true,
108
+ WithDecryption: this._config.withDecryption,
109
+ NextToken: nextToken,
110
+ });
111
+ const response = await this._client.send(command);
112
+ if (!response.Parameters) {
113
+ // No parameters found - this is not necessarily an error
114
+ break;
115
+ }
116
+ // Process each parameter
117
+ for (const param of response.Parameters) {
118
+ const key = this.transformParameterName(param.Name, parameterPath);
119
+ if (key && param.Value !== undefined) {
120
+ result[key] = param.Value;
121
+ }
122
+ }
123
+ nextToken = response.NextToken;
124
+ } while (nextToken);
125
+ return result;
126
+ }
127
+ catch (error) {
128
+ // Handle specific AWS errors
129
+ if (error instanceof Error) {
130
+ if (error.name === 'ResourceNotFoundException' || error.name === 'ParameterNotFound') {
131
+ // No parameters found at path - this is not necessarily an error
132
+ return {};
133
+ }
134
+ if (error.name === 'AccessDeniedException') {
135
+ throw new errors_1.AWSServiceError(`Access denied when retrieving parameters from path '${parameterPath}'. Check AWS credentials and permissions.`, 'SSM', 'GetParametersByPath', error);
136
+ }
137
+ if (error.name === 'InvalidFilterKey' || error.name === 'InvalidFilterValue') {
138
+ throw new errors_1.AWSServiceError(`Invalid parameter path '${parameterPath}'. Check path format.`, 'SSM', 'GetParametersByPath', error);
139
+ }
140
+ }
141
+ // For other errors, wrap in AWSServiceError
142
+ throw new errors_1.AWSServiceError(`Failed to retrieve parameters from path '${parameterPath}' in AWS SSM Parameter Store: ${error instanceof Error ? error.message : String(error)}`, 'SSM', 'GetParametersByPath', error instanceof Error ? error : undefined);
143
+ }
144
+ }
145
+ /**
146
+ * Build the environment-aware parameter path.
147
+ * @returns The full parameter path with environment prefix
148
+ * @throws ConfigurationLoadError if no environment mapping found
149
+ */
150
+ buildParameterPath() {
151
+ const envPrefix = this._config.environmentMapping[this._appEnv];
152
+ if (!envPrefix) {
153
+ throw new errors_1.ConfigurationLoadError(`No environment mapping found for APP_ENV '${this._appEnv}'. ` +
154
+ `Available environments: ${Object.keys(this._config.environmentMapping).join(', ')}`, this.getName());
155
+ }
156
+ return `/${envPrefix}${this._config.parameterPath}`;
157
+ }
158
+ /**
159
+ * Transform parameter name by removing the prefix and converting to uppercase.
160
+ * Example: '/dev/config-aws/database/host' -> 'DATABASE_HOST'
161
+ * @param parameterName The full parameter name from AWS
162
+ * @param pathPrefix The path prefix to remove
163
+ * @returns The transformed parameter name or null if invalid
164
+ */
165
+ transformParameterName(parameterName, pathPrefix) {
166
+ if (!parameterName) {
167
+ return null;
168
+ }
169
+ // Remove the path prefix
170
+ let key = parameterName;
171
+ if (key.startsWith(pathPrefix)) {
172
+ key = key.substring(pathPrefix.length);
173
+ }
174
+ // Remove leading slash if present
175
+ if (key.startsWith('/')) {
176
+ key = key.substring(1);
177
+ }
178
+ // Convert slashes to underscores and uppercase
179
+ key = key.replace(/\//g, '_').toUpperCase();
180
+ // Return null for empty keys
181
+ return key || null;
182
+ }
183
+ /**
184
+ * Get the current app environment.
185
+ * @returns The current APP_ENV or NODE_ENV value
186
+ */
187
+ getAppEnv() {
188
+ return this._appEnv;
189
+ }
190
+ /**
191
+ * Get the environment mapping configuration.
192
+ * @returns The environment mapping record
193
+ */
194
+ getEnvironmentMapping() {
195
+ return { ...this._config.environmentMapping };
196
+ }
197
+ }
198
+ exports.SSMParameterStoreLoader = SSMParameterStoreLoader;
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NtLXBhcmFtZXRlci1zdG9yZS5sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9jb25maWctYXdzL3NyYy9sb2FkZXJzL3NzbS1wYXJhbWV0ZXItc3RvcmUubG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG9EQUE0RTtBQUM1RSx3RUFBc0U7QUFJdEUsc0NBQW9FO0FBRXBFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBYSx1QkFBdUI7SUFDbEMsZ0JBQWdCO0lBQ0csT0FBTyxDQUFZO0lBQ3RDLGdCQUFnQjtJQUNHLE9BQU8sQ0FBMEM7SUFDcEUsZ0JBQWdCO0lBQ0csT0FBTyxDQUFTO0lBRW5DLFlBQVksU0FBd0MsRUFBRTtRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUM7UUFFNUUsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsSUFBSSxhQUFhO1lBQ3BELE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksV0FBVztZQUNqRSxrQkFBa0IsRUFBRSxNQUFNLENBQUMsa0JBQWtCLElBQUk7Z0JBQy9DLFdBQVcsRUFBRSxLQUFLO2dCQUNsQixJQUFJLEVBQUUsTUFBTTtnQkFDWixVQUFVLEVBQUUsWUFBWTthQUN6QjtZQUNELGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxJQUFJLElBQUk7U0FDOUMsQ0FBQztRQUVGLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksc0JBQVMsQ0FBQztZQUMzQixXQUFXLEVBQUUsSUFBQSw0Q0FBcUIsR0FBRTtZQUNwQyxNQUFNLEVBQUUs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QUM7SUFDdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLHNCQUFzQixDQUFDLGFBQWlDLEVBQUUsVUFBa0I7UUFDbEYsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELHlCQUF5QjtRQUN6QixJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUM7UUFDeEIsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDL0IsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUVELCtDQUErQztRQUMvQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFNUMsNkJBQTZCO1FBQzdCLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gscUJBQXFCO1FBQ25CLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFwTkQsMERBb05DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2V0UGFyYW1ldGVyc0J5UGF0aENvbW1hbmQsIFNTTUNsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zc20nO1xyXG5pbXBvcnQgeyBmcm9tTm9kZVByb3ZpZGVyQ2hhaW4gfSBmcm9tICdAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVycyc7XHJcblxyXG5pbXBvcnQgdHlwZSB7IENvbmZpZ0xvYWRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLWxvYWRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgdHlwZSB7IFNTTVBhcmFtZXRlclN0b3JlTG9hZGVyQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zc20tcGFyYW1ldGVyLXN0b3JlLWxvYWRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBBV1NTZXJ2aWNlRXJyb3IsIENvbmZpZ3VyYXRpb25Mb2FkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xyXG5cclxuLyoqXHJcbiAqIExvYWRlciB0aGF0IHJlYWRzIGNvbmZpZ3VyYXRpb24gZnJvbSBBV1MgU1NNIFBhcmFtZXRlciBTdG9yZS5cclxuICogU3VwcG9ydHMgZW52aXJvbm1lbnQtYXdhcmUgcGF0aCBjb25zdHJ1Y3Rpb24sIHBhZ2luYXRpb24sIGFuZCBkZWNyeXB0aW9uIG9wdGlvbnMuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogLy8gQmFzaWMgdXNhZ2VcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFNTTVBhcmFtZXRlclN0b3JlTG9hZGVyKHtcclxuICogICBwYXJhbWV0ZXJQYXRoOiAnL215LWFwcC9jb25maWcnLFxyXG4gKiAgIHJlZ2lvbjogJ3VzLWVhc3QtMSdcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIFdpdGggZW52aXJvbm1lbnQgbWFwcGluZ1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgU1NNUGFyYW1ldGVyU3RvcmVMb2FkZXIoe1xyXG4gKiAgIHBhcmFtZXRlclBhdGg6ICcvbXktYXBwL2NvbmZpZycsXHJcbiAqICAgZW52aXJvbm1lbnRNYXBwaW5nOiB7XHJcbiAqICAgICBkZXZlbG9wbWVudDogJ2RldicsXHJcbiAqICAgICBzdGFnaW5nOiAnc3RnJyxcclxuICogICAgIHByb2R1Y3Rpb246ICdwcm9kJ1xyXG4gKiAgIH1cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNTTVBhcmFtZXRlclN0b3JlTG9hZGVyIGltcGxlbWVudHMgQ29uZmlnTG9hZGVyIHtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnQ6IFNTTUNsaWVudDtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb25maWc6IFJlcXVpcmVkPFNTTVBhcmFtZXRlclN0b3JlTG9hZGVyQ29uZmlnPjtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9hcHBFbnY6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBTU01QYXJhbWV0ZXJTdG9yZUxvYWRlckNvbmZpZyA9IHt9KSB7XHJcbiAgICB0aGlzLl9hcHBFbnYgPSBwcm9jZXNzLmVudlsnQVBQX0VOViddIHx8IHByb2Nlc3MuZW52WydOT0RFX0VOViddIHx8ICdsb2NhbCc7XHJcblxyXG4gICAgLy8gU2V0IGRlZmF1bHQgY29uZmlndXJhdGlvblxyXG4gICAgdGhpcy5fY29uZmlnID0ge1xyXG4gICAgICBwYXJhbWV0ZXJQYXRoOiBjb25maWcucGFyYW1ldGVyUGF0aCB8fCAnL2NvbmZpZy1hd3MnLFxyXG4gICAgICByZWdpb246IGNvbmZpZy5yZWdpb24gfHwgcHJvY2Vzcy5lbnZbJ0FXU19SRUdJT04nXSB8fCAndXMtZWFzdC0xJyxcclxuICAgICAgZW52aXJvbm1lbnRNYXBwaW5nOiBjb25maWcuZW52aXJvbm1lbnRNYXBwaW5nIHx8IHtcclxuICAgICAgICBkZXZlbG9wbWVudDogJ2RldicsXHJcbiAgICAgICAgdGVzdDogJ3Rlc3QnLFxyXG4gICAgICAgIHByb2R1Y3Rpb246ICdwcm9kdWN0aW9uJyxcclxuICAgICAgfSxcclxuICAgICAgd2l0aERlY3J5cHRpb246IGNvbmZpZy53aXRoRGVjcnlwdGlvbiA/PyB0cnVlLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBJbml0aWFsaXplIEFXUyBTU00gY2xpZW50XHJcbiAgICB0aGlzLl9jbGllbnQgPSBuZXcgU1NNQ2xpZW50KHtcclxuICAgICAgY3JlZGVudGlhbHM6IGZyb21Ob2RlUHJvdmlkZXJDaGFpbigpLFxyXG4gICAgICByZWdpb246IHRoaXMuX2NvbmZpZy5yZWdpb24sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBsb2FkZXIgZm9yIGxvZ2dpbmcgYW5kIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVyIG5hbWUgd2l0aCBwYXJhbWV0ZXIgcGF0aFxyXG4gICAqL1xyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcmFtZXRlclBhdGggPSB0aGlzLmJ1aWxkUGFyYW1ldGVyUGF0aCgpO1xyXG4gICAgICByZXR1cm4gYFNTTVBhcmFtZXRlclN0b3JlTG9hZGVyKCR7cGFyYW1ldGVyUGF0aH0pYDtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBGYWxsYmFjayBpZiBwYXRoIGNvbnN0cnVjdGlvbiBmYWlscyAoZS5nLiwgbWlzc2luZyBlbnYgbWFwcGluZylcclxuICAgICAgcmV0dXJuIGBTU01QYXJhbWV0ZXJTdG9yZUxvYWRlcigke3RoaXMuX2NvbmZpZy5wYXJhbWV0ZXJQYXRofSlgO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgdGhpcyBsb2FkZXIgaXMgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRydWUgaWYgbm90IGluIGxvY2FsIGVudmlyb25tZW50IGFuZCBBV1MgY3JlZGVudGlhbHMgYXJlIGF2YWlsYWJsZVxyXG4gICAqL1xyXG4gIGFzeW5jIGlzQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgLy8gU2tpcCBpbiBsb2NhbCBlbnZpcm9ubWVudFxyXG4gICAgaWYgKHRoaXMuX2FwcEVudiA9PT0gJ2xvY2FsJykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gVGVzdCBBV1MgY3JlZGVudGlhbHMgYnkgYXR0ZW1wdGluZyB0byBnZXQgY2FsbGVyIGlkZW50aXR5XHJcbiAgICAgIGF3YWl0IHRoaXMuX2NsaWVudC5jb25maWcuY3JlZGVudGlhbHMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZyb20gQVdTIFNTTSBQYXJhbWV0ZXIgU3RvcmUuXHJcbiAgICogSW1wbGVtZW50cyByZWN1cnNpdmUgcGFyYW1ldGVyIGZldGNoaW5nIHdpdGggTmV4dFRva2VuIGhhbmRsaW5nIGZvciBwYWdpbmF0aW9uLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGNvbmZpZ3VyYXRpb24ga2V5LXZhbHVlIHBhaXJzIGZyb20gcGFyYW1ldGVyc1xyXG4gICAqIEB0aHJvd3MgQVdTU2VydmljZUVycm9yIGlmIEFXUyBvcGVyYXRpb24gZmFpbHNcclxuICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25Mb2FkRXJyb3IgaWYgcGFyYW1ldGVyIHBhdGggY2Fubm90IGJlIGNvbnN0cnVjdGVkXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XHJcbiAgICAvLyBTa2lwIGxvYWRpbmcgaW4gbG9jYWwgZW52aXJvbm1lbnRcclxuICAgIGlmICh0aGlzLl9hcHBFbnYgPT09ICdsb2NhbCcpIHtcclxuICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHBhcmFtZXRlclBhdGggPSB0aGlzLmJ1aWxkUGFyYW1ldGVyUGF0aCgpO1xyXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XHJcbiAgICBsZXQgbmV4dFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgZG8ge1xyXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgR2V0UGFyYW1ldGVyc0J5UGF0aENvbW1hbmQoe1xyXG4gICAgICAgICAgUGF0aDogcGFyYW1ldGVyUGF0aCxcclxuICAgICAgICAgIFJlY3Vyc2l2ZTogdHJ1ZSxcclxuICAgICAgICAgIFdpdGhEZWNyeXB0aW9uOiB0aGlzLl9jb25maWcud2l0aERlY3J5cHRpb24sXHJcbiAgICAgICAgICBOZXh0VG9rZW46IG5leHRUb2tlbixcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9jbGllbnQuc2VuZChjb21tYW5kKTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXNwb25zZS5QYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgICAvLyBObyBwYXJhbWV0ZXJzIGZvdW5kIC0gdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3JcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHBhcmFtZXRlclxyXG4gICAgICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcmVzcG9uc2UuUGFyYW1ldGVycykge1xyXG4gICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy50cmFuc2Zvcm1QYXJhbWV0ZXJOYW1lKHBhcmFtLk5hbWUsIHBhcmFtZXRlclBhdGgpO1xyXG5cclxuICAgICAgICAgIGlmIChrZXkgJiYgcGFyYW0uVmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHBhcmFtLlZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV4dFRva2VuID0gcmVzcG9uc2UuTmV4dFRva2VuO1xyXG4gICAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xyXG5cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBzcGVjaWZpYyBBV1MgZXJyb3JzXHJcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uJyB8fCBlcnJvci5uYW1lID09PSAnUGFyYW1ldGVyTm90Rm91bmQnKSB7XHJcbiAgICAgICAgICAvLyBObyBwYXJhbWV0ZXJzIGZvdW5kIGF0IHBhdGggLSB0aGlzIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBlcnJvclxyXG4gICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdBY2Nlc3NEZW5pZWRFeGNlcHRpb24nKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgQVdTU2VydmljZUVycm9yKFxyXG4gICAgICAgICAgICBgQWNjZXNzIGRlbmllZCB3aGVuIHJldHJpZXZpbmcgcGFyYW1ldGVycyBmcm9tIHBhdGggJyR7cGFyYW1ldGVyUGF0aH0nLiBDaGVjayBBV1MgY3JlZGVudGlhbHMgYW5kIHBlcm1pc3Npb25zLmAsXHJcbiAgICAgICAgICAgICdTU00nLFxyXG4gICAgICAgICAgICAnR2V0UGFyYW1ldGVyc0J5UGF0aCcsXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnSW52YWxpZEZpbHRlcktleScgfHwgZXJyb3IubmFtZSA9PT0gJ0ludmFsaWRGaWx0ZXJWYWx1ZScpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBBV1NTZXJ2aWNlRXJyb3IoXHJcbiAgICAgICAgICAgIGBJbnZhbGlkIHBhcmFtZXRlciBwYXRoICcke3BhcmFtZXRlclBhdGh9Jy4gQ2hlY2sgcGF0aCBmb3JtYXQuYCxcclxuICAgICAgICAgICAgJ1NTTScsXHJcbiAgICAgICAgICAgICdHZXRQYXJhbWV0ZXJzQnlQYXRoJyxcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gRm9yIG90aGVyIGVycm9ycywgd3JhcCBpbiBBV1NTZXJ2aWNlRXJyb3JcclxuICAgICAgdGhyb3cgbmV3IEFXU1NlcnZpY2VFcnJvcihcclxuICAgICAgICBgRmFpbGVkIHRvIHJldHJpZXZlIHBhcmFtZXRlcnMgZnJvbSBwYXRoICcke3BhcmFtZXRlclBhdGh9JyBpbiBBV1MgU1NNIFBhcmFtZXRlciBTdG9yZTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcclxuICAgICAgICAnU1NNJyxcclxuICAgICAgICAnR2V0UGFyYW1ldGVyc0J5UGF0aCcsXHJcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIHRoZSBlbnZpcm9ubWVudC1hd2FyZSBwYXJhbWV0ZXIgcGF0aC5cclxuICAgKiBAcmV0dXJucyBUaGUgZnVsbCBwYXJhbWV0ZXIgcGF0aCB3aXRoIGVudmlyb25tZW50IHByZWZpeFxyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkxvYWRFcnJvciBpZiBubyBlbnZpcm9ubWVudCBtYXBwaW5nIGZvdW5kXHJcbiAgICovXHJcbiAgYnVpbGRQYXJhbWV0ZXJQYXRoKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBlbnZQcmVmaXggPSB0aGlzLl9jb25maWcuZW52aXJvbm1lbnRNYXBwaW5nW3RoaXMuX2FwcEVudl07XHJcblxyXG4gICAgaWYgKCFlbnZQcmVmaXgpIHtcclxuICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25Mb2FkRXJyb3IoXHJcbiAgICAgICAgYE5vIGVudmlyb25tZW50IG1hcHBpbmcgZm91bmQgZm9yIEFQUF9FTlYgJyR7dGhpcy5fYXBwRW52fScuIGAgK1xyXG4gICAgICAgICAgYEF2YWlsYWJsZSBlbnZpcm9ubWVudHM6ICR7T2JqZWN0LmtleXModGhpcy5fY29uZmlnLmVudmlyb25tZW50TWFwcGluZykuam9pbignLCAnKX1gLFxyXG4gICAgICAgIHRoaXMuZ2V0TmFtZSgpLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBgLyR7ZW52UHJlZml4fSR7dGhpcy5fY29uZmlnLnBhcmFtZXRlclBhdGh9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybSBwYXJhbWV0ZXIgbmFtZSBieSByZW1vdmluZyB0aGUgcHJlZml4IGFuZCBjb252ZXJ0aW5nIHRvIHVwcGVyY2FzZS5cclxuICAgKiBFeGFtcGxlOiAnL2Rldi9jb25maWctYXdzL2RhdGFiYXNlL2hvc3QnIC0+ICdEQVRBQkFTRV9IT1NUJ1xyXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lIFRoZSBmdWxsIHBhcmFtZXRlciBuYW1lIGZyb20gQVdTXHJcbiAgICogQHBhcmFtIHBhdGhQcmVmaXggVGhlIHBhdGggcHJlZml4IHRvIHJlbW92ZVxyXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lZCBwYXJhbWV0ZXIgbmFtZSBvciBudWxsIGlmIGludmFsaWRcclxuICAgKi9cclxuICBwcml2YXRlIHRyYW5zZm9ybVBhcmFtZXRlck5hbWUocGFyYW1ldGVyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwYXRoUHJlZml4OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGlmICghcGFyYW1ldGVyTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgdGhlIHBhdGggcHJlZml4XHJcbiAgICBsZXQga2V5ID0gcGFyYW1ldGVyTmFtZTtcclxuICAgIGlmIChrZXkuc3RhcnRzV2l0aChwYXRoUHJlZml4KSkge1xyXG4gICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKHBhdGhQcmVmaXgubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgbGVhZGluZyBzbGFzaCBpZiBwcmVzZW50XHJcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgICBrZXkgPSBrZXkuc3Vic3RyaW5nKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbnZlcnQgc2xhc2hlcyB0byB1bmRlcnNjb3JlcyBhbmQgdXBwZXJjYXNlXHJcbiAgICBrZXkgPSBrZXkucmVwbGFjZSgvXFwvL2csICdfJykudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAvLyBSZXR1cm4gbnVsbCBmb3IgZW1wdHkga2V5c1xyXG4gICAgcmV0dXJuIGtleSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IGFwcCBlbnZpcm9ubWVudC5cclxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBBUFBfRU5WIG9yIE5PREVfRU5WIHZhbHVlXHJcbiAgICovXHJcbiAgZ2V0QXBwRW52KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXBwRW52O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlbnZpcm9ubWVudCBtYXBwaW5nIGNvbmZpZ3VyYXRpb24uXHJcbiAgICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IG1hcHBpbmcgcmVjb3JkXHJcbiAgICovXHJcbiAgZ2V0RW52aXJvbm1lbnRNYXBwaW5nKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5fY29uZmlnLmVudmlyb25tZW50TWFwcGluZyB9O1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnvFileParser = void 0;
4
+ /**
5
+ * Parser for AWS ECS-compatible environment files.
6
+ *
7
+ * Format rules (per AWS ECS documentation):
8
+ * - Lines beginning with # are comments and ignored
9
+ * - Blank lines are ignored
10
+ * - Format: VARIABLE=VALUE (no spaces around =)
11
+ * - Variable names must match /^[a-zA-Z_][a-zA-Z0-9_]*$/
12
+ * - Values are literal (no quote processing, no interpolation)
13
+ * - One variable per line
14
+ * - Lines without = are ignored
15
+ * - Maximum line length: 32KB
16
+ *
17
+ * @see https://docs.aws.amazon.com/AmazonECS/latest/developerguide/use-environment-file.html
18
+ */
19
+ class EnvFileParser {
20
+ /** Maximum line length per AWS ECS specification */
21
+ static MAX_LINE_LENGTH = 32 * 1024; // 32KB
22
+ /** Valid variable name pattern: alphanumeric + underscore, cannot start with digit */
23
+ static VARIABLE_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
24
+ /**
25
+ * Parse environment file content into key-value pairs.
26
+ * @param content The raw content of the environment file
27
+ * @returns Record of environment variable names to values
28
+ */
29
+ static parse(content) {
30
+ const result = {};
31
+ // Handle empty content
32
+ if (!content) {
33
+ return result;
34
+ }
35
+ const lines = content.split(/\r?\n/);
36
+ for (const line of lines) {
37
+ // Skip lines exceeding max length
38
+ if (line.length > this.MAX_LINE_LENGTH) {
39
+ continue;
40
+ }
41
+ // Skip blank lines
42
+ if (line.trim() === '') {
43
+ continue;
44
+ }
45
+ // Skip comment lines (lines starting with # after optional whitespace)
46
+ if (line.trimStart().startsWith('#')) {
47
+ continue;
48
+ }
49
+ // Find the first = sign
50
+ const equalsIndex = line.indexOf('=');
51
+ if (equalsIndex === -1) {
52
+ // Lines without = are ignored
53
+ continue;
54
+ }
55
+ const key = line.substring(0, equalsIndex);
56
+ const value = line.substring(equalsIndex + 1);
57
+ // Validate variable name (must not be empty and must match pattern)
58
+ if (key.length === 0 || !this.VARIABLE_NAME_PATTERN.test(key)) {
59
+ continue;
60
+ }
61
+ result[key] = value;
62
+ }
63
+ return result;
64
+ }
65
+ /**
66
+ * Check if a variable name is valid per AWS ECS format.
67
+ * Variable names must:
68
+ * - Start with a letter (a-z, A-Z) or underscore (_)
69
+ * - Contain only alphanumeric characters and underscores
70
+ * - Not be empty
71
+ *
72
+ * @param name The variable name to check
73
+ * @returns true if the name is valid
74
+ */
75
+ static isValidVariableName(name) {
76
+ if (!name || name.length === 0) {
77
+ return false;
78
+ }
79
+ return this.VARIABLE_NAME_PATTERN.test(name);
80
+ }
81
+ /**
82
+ * Serialize a configuration object to AWS ECS-compatible env file format.
83
+ * @param config The configuration object to serialize
84
+ * @returns The serialized env file content
85
+ */
86
+ static serialize(config) {
87
+ const lines = [];
88
+ for (const [key, value] of Object.entries(config)) {
89
+ // Only include valid variable names
90
+ if (this.isValidVariableName(key)) {
91
+ lines.push(`${key}=${value}`);
92
+ }
93
+ }
94
+ return lines.join('\n');
95
+ }
96
+ }
97
+ exports.EnvFileParser = EnvFileParser;
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWZpbGUtcGFyc2VyLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9jb25maWctYXdzL3NyYy91dGlscy9lbnYtZmlsZS1wYXJzZXIudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQWEsYUFBYTtJQUN4QixvREFBb0Q7SUFDNUMsTUFBTSxDQUFVLGVBQWUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTztJQUU1RCxzRkFBc0Y7SUFDOUUsTUFBTSxDQUFVLHFCQUFxQixHQUFHLDBCQUEwQixDQUFDO0lBRTNFOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQWU7UUFDMUIsTUFBTSxNQUFNLEdBQTJCLEVBQUUsQ0FBQztRQUUxQyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFckMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixrQ0FBa0M7WUFDbEMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdkMsU0FBUztZQUNYLENBQUM7WUFFRCxtQkFBbUI7WUFDbkIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ3ZCLFNBQVM7WUFDWCxDQUFDO1lBRUQsdUVBQXVFO1lBQ3ZFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxTQUFTO1lBQ1gsQ0FBQztZQUVELHdCQUF3QjtZQUN4QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RDLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLDhCQUE4QjtnQkFDOUIsU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUU5QyxvRUFBb0U7WUFDcEUsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsU0FBUztZQUNYLENBQUM7WUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQVk7UUFDckMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBOEI7UUFDN0MsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBRTNCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEQsb0NBQW9DO1lBQ3BDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDOztBQTVGSCxzQ0E2RkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUGFyc2VyIGZvciBBV1MgRUNTLWNvbXBhdGlibGUgZW52aXJvbm1lbnQgZmlsZXMuXHJcbiAqXHJcbiAqIEZvcm1hdCBydWxlcyAocGVyIEFXUyBFQ1MgZG9jdW1lbnRhdGlvbik6XHJcbiAqIC0gTGluZXMgYmVnaW5uaW5nIHdpdGggIyBhcmUgY29tbWVudHMgYW5kIGlnbm9yZWRcclxuICogLSBCbGFuayBsaW5lcyBhcmUgaWdub3JlZFxyXG4gKiAtIEZvcm1hdDogVkFSSUFCTEU9VkFMVUUgKG5vIHNwYWNlcyBhcm91bmQgPSlcclxuICogLSBWYXJpYWJsZSBuYW1lcyBtdXN0IG1hdGNoIC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvXHJcbiAqIC0gVmFsdWVzIGFyZSBsaXRlcmFsIChubyBxdW90ZSBwcm9jZXNzaW5nLCBubyBpbnRlcnBvbGF0aW9uKVxyXG4gKiAtIE9uZSB2YXJpYWJsZSBwZXIgbGluZVxyXG4gKiAtIExpbmVzIHdpdGhvdXQgPSBhcmUgaWdub3JlZFxyXG4gKiAtIE1heGltdW0gbGluZSBsZW5ndGg6IDMyS0JcclxuICpcclxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9kZXZlbG9wZXJndWlkZS91c2UtZW52aXJvbm1lbnQtZmlsZS5odG1sXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRW52RmlsZVBhcnNlciB7XHJcbiAgLyoqIE1heGltdW0gbGluZSBsZW5ndGggcGVyIEFXUyBFQ1Mgc3BlY2lmaWNhdGlvbiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9MSU5FX0xFTkdUSCA9IDMyICogMTAyNDsgLy8gMzJLQlxyXG5cclxuICAvKiogVmFsaWQgdmFyaWFibGUgbmFtZSBwYXR0ZXJuOiBhbHBoYW51bWVyaWMgKyB1bmRlcnNjb3JlLCBjYW5ub3Qgc3RhcnQgd2l0aCBkaWdpdCAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFZBUklBQkxFX05BTUVfUEFUVEVSTiA9IC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKiQvO1xyXG5cclxuICAvKipcclxuICAgKiBQYXJzZSBlbnZpcm9ubWVudCBmaWxlIGNvbnRlbnQgaW50byBrZXktdmFsdWUgcGFpcnMuXHJcbiAgICogQHBhcmFtIGNvbnRlbnQgVGhlIHJhdyBjb250ZW50IG9mIHRoZSBlbnZpcm9ubWVudCBmaWxlXHJcbiAgICogQHJldHVybnMgUmVjb3JkIG9mIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzIHRvIHZhbHVlc1xyXG4gICAqL1xyXG4gIHN0YXRpYyBwYXJzZShjb250ZW50OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcclxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xyXG5cclxuICAgIC8vIEhhbmRsZSBlbXB0eSBjb250ZW50XHJcbiAgICBpZiAoIWNvbnRlbnQpIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoL1xccj9cXG4vKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcclxuICAgICAgLy8gU2tpcCBsaW5lcyBleGNlZWRpbmcgbWF4IGxlbmd0aFxyXG4gICAgICBpZiAobGluZS5sZW5ndGggPiB0aGlzLk1BWF9MSU5FX0xFTkdUSCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBTa2lwIGJsYW5rIGxpbmVzXHJcbiAgICAgIGlmIChsaW5lLnRyaW0oKSA9PT0gJycpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2tpcCBjb21tZW50IGxpbmVzIChsaW5lcyBzdGFydGluZyB3aXRoICMgYWZ0ZXIgb3B0aW9uYWwgd2hpdGVzcGFjZSlcclxuICAgICAgaWYgKGxpbmUudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgnIycpKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZpbmQgdGhlIGZpcnN0ID0gc2lnblxyXG4gICAgICBjb25zdCBlcXVhbHNJbmRleCA9IGxpbmUuaW5kZXhPZignPScpO1xyXG4gICAgICBpZiAoZXF1YWxzSW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgLy8gTGluZXMgd2l0aG91dCA9IGFyZSBpZ25vcmVkXHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGVxdWFsc0luZGV4KTtcclxuICAgICAgY29uc3QgdmFsdWUgPSBsaW5lLnN1YnN0cmluZyhlcXVhbHNJbmRleCArIDEpO1xyXG5cclxuICAgICAgLy8gVmFsaWRhdGUgdmFyaWFibGUgbmFtZSAobXVzdCBub3QgYmUgZW1wdHkgYW5kIG11c3QgbWF0Y2ggcGF0dGVybilcclxuICAgICAgaWYgKGtleS5sZW5ndGggPT09IDAgfHwgIXRoaXMuVkFSSUFCTEVfTkFNRV9QQVRURVJOLnRlc3Qoa2V5KSkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIHZhcmlhYmxlIG5hbWUgaXMgdmFsaWQgcGVyIEFXUyBFQ1MgZm9ybWF0LlxyXG4gICAqIFZhcmlhYmxlIG5hbWVzIG11c3Q6XHJcbiAgICogLSBTdGFydCB3aXRoIGEgbGV0dGVyIChhLXosIEEtWikgb3IgdW5kZXJzY29yZSAoXylcclxuICAgKiAtIENvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXNcclxuICAgKiAtIE5vdCBiZSBlbXB0eVxyXG4gICAqXHJcbiAgICogQHBhcmFtIG5hbWUgVGhlIHZhcmlhYmxlIG5hbWUgdG8gY2hlY2tcclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lIGlzIHZhbGlkXHJcbiAgICovXHJcbiAgc3RhdGljIGlzVmFsaWRWYXJpYWJsZU5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIW5hbWUgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuVkFSSUFCTEVfTkFNRV9QQVRURVJOLnRlc3QobmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXJpYWxpemUgYSBjb25maWd1cmF0aW9uIG9iamVjdCB0byBBV1MgRUNTLWNvbXBhdGlibGUgZW52IGZpbGUgZm9ybWF0LlxyXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRvIHNlcmlhbGl6ZVxyXG4gICAqIEByZXR1cm5zIFRoZSBzZXJpYWxpemVkIGVudiBmaWxlIGNvbnRlbnRcclxuICAgKi9cclxuICBzdGF0aWMgc2VyaWFsaXplKGNvbmZpZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcpKSB7XHJcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSB2YWxpZCB2YXJpYWJsZSBuYW1lc1xyXG4gICAgICBpZiAodGhpcy5pc1ZhbGlkVmFyaWFibGVOYW1lKGtleSkpIHtcclxuICAgICAgICBsaW5lcy5wdXNoKGAke2tleX09JHt2YWx1ZX1gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigValidationUtil = void 0;
4
+ const errors_1 = require("../errors");
5
+ /**
6
+ * Framework-agnostic validation utility for configuration values.
7
+ * Provides methods for validating configuration objects against Zod schemas.
8
+ */
9
+ class ConfigValidationUtil {
10
+ /**
11
+ * Validates a value against a Zod schema.
12
+ * @param schema The Zod schema to validate against
13
+ * @param value The value to validate
14
+ * @param context Optional context for error messages
15
+ * @returns The validated and transformed value
16
+ * @throws ValidationError if validation fails
17
+ */
18
+ static validate(schema, value, context) {
19
+ const result = schema.safeParse(value);
20
+ if (result.success) {
21
+ return result.data;
22
+ }
23
+ const errors = this.formatValidationErrors(result.error);
24
+ const contextMessage = context
25
+ ? `Configuration validation failed for ${context}`
26
+ : 'Configuration validation failed';
27
+ throw new errors_1.ValidationError(contextMessage, errors);
28
+ }
29
+ /**
30
+ * Safely validates a value against a Zod schema without throwing.
31
+ * @param schema The Zod schema to validate against
32
+ * @param value The value to validate
33
+ * @returns Object with success flag and either data or error
34
+ */
35
+ static safeValidate(schema, value) {
36
+ const result = schema.safeParse(value);
37
+ if (result.success) {
38
+ return { success: true, data: result.data };
39
+ }
40
+ const errors = this.formatValidationErrors(result.error);
41
+ const validationError = new errors_1.ValidationError('Configuration validation failed', errors);
42
+ return { success: false, error: validationError };
43
+ }
44
+ /**
45
+ * Formats Zod validation errors into a structured format.
46
+ * @param error The ZodError to format
47
+ * @returns Formatted error object or string
48
+ */
49
+ static formatValidationErrors(error) {
50
+ // If there's only one error at the root level, return just the message
51
+ if (error.issues.length === 1) {
52
+ const issue = error.issues[0];
53
+ if (issue && Array.isArray(issue.path) && issue.path.length === 0) {
54
+ return issue.message;
55
+ }
56
+ }
57
+ // For multiple errors or nested paths, create a structured object
58
+ return error.issues.reduce((errors, issue) => {
59
+ const path = issue.path.join('.');
60
+ const key = path || 'root';
61
+ if (!errors[key]) {
62
+ errors[key] = [];
63
+ }
64
+ errors[key].push({
65
+ message: issue.message,
66
+ code: issue.code,
67
+ path: issue.path,
68
+ });
69
+ return errors;
70
+ }, {});
71
+ }
72
+ /**
73
+ * Creates a detailed error message for configuration validation failures.
74
+ * @param error The ZodError to create a message for
75
+ * @param context Optional context for the error
76
+ * @returns Detailed error message string
77
+ */
78
+ static createDetailedErrorMessage(error, context) {
79
+ const contextPrefix = context ? `${context}: ` : '';
80
+ if (error.issues.length === 1) {
81
+ const issue = error.issues[0];
82
+ if (issue) {
83
+ const pathStr = issue.path.length > 0 ? ` at '${issue.path.join('.')}'` : '';
84
+ return `${contextPrefix}${issue.message}${pathStr}`;
85
+ }
86
+ }
87
+ const errorMessages = error.issues.map((issue) => {
88
+ const pathStr = issue.path.length > 0 ? ` at '${issue.path.join('.')}'` : '';
89
+ return ` - ${issue.message}${pathStr}`;
90
+ });
91
+ return `${contextPrefix}Multiple validation errors:\n${errorMessages.join('\n')}`;
92
+ }
93
+ /**
94
+ * Validates configuration with enhanced error context.
95
+ * @param schema The Zod schema to validate against
96
+ * @param value The configuration object to validate
97
+ * @param source The source of the configuration (e.g., 'environment', 'secrets-manager')
98
+ * @returns The validated configuration
99
+ * @throws ValidationError with enhanced context
100
+ */
101
+ static validateConfiguration(schema, value, source) {
102
+ try {
103
+ return this.validate(schema, value, `${source} configuration`);
104
+ }
105
+ catch (error) {
106
+ if (error instanceof errors_1.ValidationError) {
107
+ // Enhance the error with source information
108
+ const enhancedMessage = `Configuration validation failed for source '${source}': ${error.message}`;
109
+ throw new errors_1.ValidationError(enhancedMessage, error.validationErrors);
110
+ }
111
+ throw error;
112
+ }
113
+ }
114
+ }
115
+ exports.ConfigValidationUtil = ConfigValidationUtil;
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vY29uZmlnLWF3cy9zcmMvdXRpbHMvdmFsaWRhdGlvbi51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHNDQUE0QztBQUU1Qzs7O0dBR0c7QUFDSCxNQUFhLG9CQUFvQjtJQUMvQjs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FDYixNQUFTLEVBQ1QsS0FBYyxFQUNkLE9BQWdCO1FBRWhCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3JCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sY0FBYyxHQUFHLE9BQU87WUFDNUIsQ0FBQyxDQUFDLHVDQUF1QyxPQUFPLEVBQUU7WUFDbEQsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDO1FBRXRDLE1BQU0sSUFBSSx3QkFBZSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsWUFBWSxDQUNqQixNQUFTLEVBQ1QsS0FBYztRQUVkLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkMsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5QyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLGVBQWUsR0FBRyxJQUFJLHdCQUFlLENBQUMsaUNBQWlDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQWU7UUFDM0MsdUVBQXVFO1FBQ3ZFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ3ZCLENBQUM7UUFDSCxDQUFDO1FBRUQsa0VBQWtFO1FBQ2xFLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ3hCLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxNQUFNLENBQUM7WUFFM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25CLENBQUM7WUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNmLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztnQkFDdEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7YUFDakIsQ0FBQyxDQUFDO1lBRUgsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxFQUNELEVBQXlGLENBQzFGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsMEJBQTBCLENBQUMsS0FBZSxFQUFFLE9BQWdCO1FBQ2pFLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXBELElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdFLE9BQU8sR0FBRyxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RSxPQUFPLE9BQU8sS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxhQUFhLGdDQUFnQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDcEYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQzFCLE1BQVMsRUFDVCxLQUFjLEVBQ2QsTUFBYztRQUVkLElBQUksQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksd0JBQWUsRUFBRSxDQUFDO2dCQUNyQyw0Q0FBNEM7Z0JBQzVDLE1BQU0sZUFBZSxHQUFHLCtDQUErQyxNQUFNLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuRyxNQUFNLElBQUksd0JBQWUsQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDckUsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXZJRCxvREF1SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFpvZFR5cGUsIFpvZEVycm9yLCBUeXBlT2YgfSBmcm9tICd6b2QnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xyXG5cclxuLyoqXHJcbiAqIEZyYW1ld29yay1hZ25vc3RpYyB2YWxpZGF0aW9uIHV0aWxpdHkgZm9yIGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxyXG4gKiBQcm92aWRlcyBtZXRob2RzIGZvciB2YWxpZGF0aW5nIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyBhZ2FpbnN0IFpvZCBzY2hlbWFzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbmZpZ1ZhbGlkYXRpb25VdGlsIHtcclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgYSB2YWx1ZSBhZ2FpbnN0IGEgWm9kIHNjaGVtYS5cclxuICAgKiBAcGFyYW0gc2NoZW1hIFRoZSBab2Qgc2NoZW1hIHRvIHZhbGlkYXRlIGFnYWluc3RcclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHZhbGlkYXRlXHJcbiAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgY29udGV4dCBmb3IgZXJyb3IgbWVzc2FnZXNcclxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIGFuZCB0cmFuc2Zvcm1lZCB2YWx1ZVxyXG4gICAqIEB0aHJvd3MgVmFsaWRhdGlvbkVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcclxuICAgKi9cclxuICBzdGF0aWMgdmFsaWRhdGU8VCBleHRlbmRzIFpvZFR5cGU+KFxyXG4gICAgc2NoZW1hOiBULFxyXG4gICAgdmFsdWU6IHVua25vd24sXHJcbiAgICBjb250ZXh0Pzogc3RyaW5nLFxyXG4gICk6IFR5cGVPZjxUPiB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcclxuXHJcbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGVycm9ycyA9IHRoaXMuZm9ybWF0VmFsaWRhdGlvbkVycm9ycyhyZXN1bHQuZXJyb3IpO1xyXG4gICAgY29uc3QgY29udGV4dE1lc3NhZ2UgPSBjb250ZXh0XHJcbiAgICAgID8gYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQgZm9yICR7Y29udGV4dH1gXHJcbiAgICAgIDogJ0NvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQnO1xyXG5cclxuICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoY29udGV4dE1lc3NhZ2UsIGVycm9ycyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTYWZlbHkgdmFsaWRhdGVzIGEgdmFsdWUgYWdhaW5zdCBhIFpvZCBzY2hlbWEgd2l0aG91dCB0aHJvd2luZy5cclxuICAgKiBAcGFyYW0gc2NoZW1hIFRoZSBab2Qgc2NoZW1hIHRvIHZhbGlkYXRlIGFnYWluc3RcclxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHZhbGlkYXRlXHJcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggc3VjY2VzcyBmbGFnIGFuZCBlaXRoZXIgZGF0YSBvciBlcnJvclxyXG4gICAqL1xyXG4gIHN0YXRpYyBzYWZlVmFsaWRhdGU8VCBleHRlbmRzIFpvZFR5cGU+KFxyXG4gICAgc2NoZW1hOiBULFxyXG4gICAgdmFsdWU6IHVua25vd24sXHJcbiAgKTogeyBzdWNjZXNzOiB0cnVlOyBkYXRhOiBUeXBlT2Y8VD4gfSB8IHsgc3VjY2VzczogZmFsc2U7IGVycm9yOiBWYWxpZGF0aW9uRXJyb3IgfSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBzY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcclxuXHJcbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogcmVzdWx0LmRhdGEgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmZvcm1hdFZhbGlkYXRpb25FcnJvcnMocmVzdWx0LmVycm9yKTtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ0NvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQnLCBlcnJvcnMpO1xyXG5cclxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogdmFsaWRhdGlvbkVycm9yIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JtYXRzIFpvZCB2YWxpZGF0aW9uIGVycm9ycyBpbnRvIGEgc3RydWN0dXJlZCBmb3JtYXQuXHJcbiAgICogQHBhcmFtIGVycm9yIFRoZSBab2RFcnJvciB0byBmb3JtYXRcclxuICAgKiBAcmV0dXJucyBGb3JtYXR0ZWQgZXJyb3Igb2JqZWN0IG9yIHN0cmluZ1xyXG4gICAqL1xyXG4gIHN0YXRpYyBmb3JtYXRWYWxpZGF0aW9uRXJyb3JzKGVycm9yOiBab2RFcnJvcik6IHVua25vd24ge1xyXG4gICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBlcnJvciBhdCB0aGUgcm9vdCBsZXZlbCwgcmV0dXJuIGp1c3QgdGhlIG1lc3NhZ2VcclxuICAgIGlmIChlcnJvci5pc3N1ZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIGNvbnN0IGlzc3VlID0gZXJyb3IuaXNzdWVzWzBdO1xyXG4gICAgICBpZiAoaXNzdWUgJiYgQXJyYXkuaXNBcnJheShpc3N1ZS5wYXRoKSAmJiBpc3N1ZS5wYXRoLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiBpc3N1ZS5tZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRm9yIG11bHRpcGxlIGVycm9ycyBvciBuZXN0ZWQgcGF0aHMsIGNyZWF0ZSBhIHN0cnVjdHVyZWQgb2JqZWN0XHJcbiAgICByZXR1cm4gZXJyb3IuaXNzdWVzLnJlZHVjZShcclxuICAgICAgKGVycm9ycywgaXNzdWUpID0+IHtcclxuICAgICAgICBjb25zdCBwYXRoID0gaXNzdWUucGF0aC5qb2luKCcuJyk7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gcGF0aCB8fCAncm9vdCc7XHJcblxyXG4gICAgICAgIGlmICghZXJyb3JzW2tleV0pIHtcclxuICAgICAgICAgIGVycm9yc1trZXldID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlcnJvcnNba2V5XS5wdXNoKHtcclxuICAgICAgICAgIG1lc3NhZ2U6IGlzc3VlLm1lc3NhZ2UsXHJcbiAgICAgICAgICBjb2RlOiBpc3N1ZS5jb2RlLFxyXG4gICAgICAgICAgcGF0aDogaXNzdWUucGF0aCxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgICAgfSxcclxuICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgQXJyYXk8eyBtZXNzYWdlOiBzdHJpbmc7IGNvZGU6IHN0cmluZzsgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSB9Pj4sXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhIGRldGFpbGVkIGVycm9yIG1lc3NhZ2UgZm9yIGNvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsdXJlcy5cclxuICAgKiBAcGFyYW0gZXJyb3IgVGhlIFpvZEVycm9yIHRvIGNyZWF0ZSBhIG1lc3NhZ2UgZm9yXHJcbiAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgY29udGV4dCBmb3IgdGhlIGVycm9yXHJcbiAgICogQHJldHVybnMgRGV0YWlsZWQgZXJyb3IgbWVzc2FnZSBzdHJpbmdcclxuICAgKi9cclxuICBzdGF0aWMgY3JlYXRlRGV0YWlsZWRFcnJvck1lc3NhZ2UoZXJyb3I6IFpvZEVycm9yLCBjb250ZXh0Pzogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGNvbnRleHRQcmVmaXggPSBjb250ZXh0ID8gYCR7Y29udGV4dH06IGAgOiAnJztcclxuXHJcbiAgICBpZiAoZXJyb3IuaXNzdWVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBjb25zdCBpc3N1ZSA9IGVycm9yLmlzc3Vlc1swXTtcclxuICAgICAgaWYgKGlzc3VlKSB7XHJcbiAgICAgICAgY29uc3QgcGF0aFN0ciA9IGlzc3VlLnBhdGgubGVuZ3RoID4gMCA/IGAgYXQgJyR7aXNzdWUucGF0aC5qb2luKCcuJyl9J2AgOiAnJztcclxuICAgICAgICByZXR1cm4gYCR7Y29udGV4dFByZWZpeH0ke2lzc3VlLm1lc3NhZ2V9JHtwYXRoU3RyfWA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlcnJvck1lc3NhZ2VzID0gZXJyb3IuaXNzdWVzLm1hcCgoaXNzdWUpID0+IHtcclxuICAgICAgY29uc3QgcGF0aFN0ciA9IGlzc3VlLnBhdGgubGVuZ3RoID4gMCA/IGAgYXQgJyR7aXNzdWUucGF0aC5qb2luKCcuJyl9J2AgOiAnJztcclxuICAgICAgcmV0dXJuIGAgIC0gJHtpc3N1ZS5tZXNzYWdlfSR7cGF0aFN0cn1gO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGAke2NvbnRleHRQcmVmaXh9TXVsdGlwbGUgdmFsaWRhdGlvbiBlcnJvcnM6XFxuJHtlcnJvck1lc3NhZ2VzLmpvaW4oJ1xcbicpfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgY29uZmlndXJhdGlvbiB3aXRoIGVuaGFuY2VkIGVycm9yIGNvbnRleHQuXHJcbiAgICogQHBhcmFtIHNjaGVtYSBUaGUgWm9kIHNjaGVtYSB0byB2YWxpZGF0ZSBhZ2FpbnN0XHJcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB0byB2YWxpZGF0ZVxyXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgY29uZmlndXJhdGlvbiAoZS5nLiwgJ2Vudmlyb25tZW50JywgJ3NlY3JldHMtbWFuYWdlcicpXHJcbiAgICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBjb25maWd1cmF0aW9uXHJcbiAgICogQHRocm93cyBWYWxpZGF0aW9uRXJyb3Igd2l0aCBlbmhhbmNlZCBjb250ZXh0XHJcbiAgICovXHJcbiAgc3RhdGljIHZhbGlkYXRlQ29uZmlndXJhdGlvbjxUIGV4dGVuZHMgWm9kVHlwZT4oXHJcbiAgICBzY2hlbWE6IFQsXHJcbiAgICB2YWx1ZTogdW5rbm93bixcclxuICAgIHNvdXJjZTogc3RyaW5nLFxyXG4gICk6IFR5cGVPZjxUPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZShzY2hlbWEsIHZhbHVlLCBgJHtzb3VyY2V9IGNvbmZpZ3VyYXRpb25gKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xyXG4gICAgICAgIC8vIEVuaGFuY2UgdGhlIGVycm9yIHdpdGggc291cmNlIGluZm9ybWF0aW9uXHJcbiAgICAgICAgY29uc3QgZW5oYW5jZWRNZXNzYWdlID0gYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQgZm9yIHNvdXJjZSAnJHtzb3VyY2V9JzogJHtlcnJvci5tZXNzYWdlfWA7XHJcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlbmhhbmNlZE1lc3NhZ2UsIGVycm9yLnZhbGlkYXRpb25FcnJvcnMpO1xyXG4gICAgICB9XHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=