@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,142 @@
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 ConfigServiceImpl_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.ConfigServiceImpl = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const config_aws_1 = require("@dyanet/config-aws");
16
+ const config_service_interface_1 = require("../interfaces/config-service.interface");
17
+ /**
18
+ * NestJS Injectable wrapper around ConfigManager from @dyanet/config-aws.
19
+ * Provides type-safe configuration access with NestJS dependency injection support.
20
+ *
21
+ * This is a thin adapter layer that delegates all configuration loading and
22
+ * management to the framework-agnostic ConfigManager from config-aws.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { ConfigServiceImpl } from '@dyanet/nestjs-config-aws';
27
+ * import { z } from 'zod';
28
+ *
29
+ * const schema = z.object({
30
+ * DATABASE_URL: z.string(),
31
+ * PORT: z.coerce.number().default(3000),
32
+ * });
33
+ *
34
+ * const configService = new ConfigServiceImpl({
35
+ * loaders: [new EnvironmentLoader()],
36
+ * schema,
37
+ * });
38
+ *
39
+ * await configService.initialize();
40
+ * const dbUrl = configService.get('DATABASE_URL');
41
+ * ```
42
+ */
43
+ let ConfigServiceImpl = ConfigServiceImpl_1 = class ConfigServiceImpl extends config_service_interface_1.ConfigService {
44
+ logger = new common_1.Logger(ConfigServiceImpl_1.name);
45
+ configManager;
46
+ enableNestLogging;
47
+ constructor(options = {}) {
48
+ super();
49
+ this.enableNestLogging = options.enableNestLogging ?? true;
50
+ // Create ConfigManager from config-aws with provided options
51
+ this.configManager = new config_aws_1.ConfigManager({
52
+ loaders: options.loaders,
53
+ schema: options.schema,
54
+ precedence: options.precedence,
55
+ validateOnLoad: options.validateOnLoad,
56
+ enableLogging: options.enableLogging,
57
+ logger: options.logger,
58
+ verbose: options.verbose,
59
+ });
60
+ }
61
+ /**
62
+ * Initialize the configuration service by loading configuration from all sources.
63
+ * This method should be called during application startup.
64
+ *
65
+ * @throws ConfigurationError if loading or validation fails
66
+ */
67
+ async initialize() {
68
+ if (this.configManager.isLoaded()) {
69
+ return;
70
+ }
71
+ try {
72
+ if (this.enableNestLogging) {
73
+ this.logger.log('Initializing configuration service...');
74
+ }
75
+ await this.configManager.load();
76
+ if (this.enableNestLogging) {
77
+ this.logger.log('Configuration service initialized successfully');
78
+ }
79
+ }
80
+ catch (error) {
81
+ const errorMessage = `Failed to initialize configuration service: ${error instanceof Error ? error.message : String(error)}`;
82
+ this.logger.error(errorMessage);
83
+ throw error;
84
+ }
85
+ }
86
+ /**
87
+ * Get a configuration value by key with type safety.
88
+ *
89
+ * @param key - The configuration key to retrieve
90
+ * @returns The configuration value with proper typing
91
+ * @throws ConfigurationError if configuration is not initialized
92
+ */
93
+ get(key) {
94
+ if (!this.configManager.isLoaded()) {
95
+ throw new config_aws_1.ConfigurationError('Configuration service not initialized. Call initialize() first.');
96
+ }
97
+ return this.configManager.get(key);
98
+ }
99
+ /**
100
+ * Check if the configuration service has been initialized.
101
+ *
102
+ * @returns True if the service is ready to serve configuration values
103
+ */
104
+ isInitialized() {
105
+ return this.configManager.isLoaded();
106
+ }
107
+ /**
108
+ * Get all configuration values.
109
+ *
110
+ * @returns The complete configuration object
111
+ * @throws ConfigurationError if configuration is not initialized
112
+ */
113
+ getAll() {
114
+ if (!this.configManager.isLoaded()) {
115
+ throw new config_aws_1.ConfigurationError('Configuration service not initialized. Call initialize() first.');
116
+ }
117
+ return this.configManager.getAll();
118
+ }
119
+ /**
120
+ * Get the current application environment.
121
+ *
122
+ * @returns The APP_ENV value or 'development' as default
123
+ */
124
+ getAppEnv() {
125
+ return this.configManager.getAppEnv();
126
+ }
127
+ /**
128
+ * Get the underlying ConfigManager instance.
129
+ * Useful for advanced use cases that need direct access to ConfigManager features.
130
+ *
131
+ * @returns The ConfigManager instance from @dyanet/config-aws
132
+ */
133
+ getConfigManager() {
134
+ return this.configManager;
135
+ }
136
+ };
137
+ exports.ConfigServiceImpl = ConfigServiceImpl;
138
+ exports.ConfigServiceImpl = ConfigServiceImpl = ConfigServiceImpl_1 = __decorate([
139
+ (0, common_1.Injectable)(),
140
+ __metadata("design:paramtypes", [Object])
141
+ ], ConfigServiceImpl);
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY29uZmlnLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUFvRDtBQUNwRCxtREFBdUU7QUFHdkUscUZBQXVFO0FBY3ZFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBRUksSUFBTSxpQkFBaUIseUJBQXZCLE1BQU0saUJBQStDLFNBQVEsd0NBQWdCO0lBQ2pFLE1BQU0sR0FBRyxJQUFJLGVBQU0sQ0FBQyxtQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxhQUFhLENBQW1CO0lBQ2hDLGlCQUFpQixDQUFVO0lBRTVDLFlBQVksVUFBbUMsRUFBRTtRQUMvQyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDO1FBRTNELDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksMEJBQWEsQ0FBSTtZQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7WUFDdEMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhO1lBQ3BDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDM0QsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVoQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sWUFBWSxHQUFHLCtDQUErQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3SCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNoQyxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsR0FBRyxDQUFvQixHQUFNO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbkMsTUFBTSxJQUFJLCtCQUFrQixDQUMxQixpRUFBaUUsQ0FDbEUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksK0JBQWtCLENBQzFCLGlFQUFpRSxDQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFBO0FBNUdZLDhDQUFpQjs0QkFBakIsaUJBQWlCO0lBRDdCLElBQUEsbUJBQVUsR0FBRTs7R0FDQSxpQkFBaUIsQ0E0RzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb25maWdNYW5hZ2VyLCBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tICdAZHlhbmV0L2NvbmZpZy1hd3MnO1xyXG5pbXBvcnQgdHlwZSB7IENvbmZpZ01hbmFnZXJPcHRpb25zIH0gZnJvbSAnQGR5YW5ldC9jb25maWctYXdzJztcclxuXHJcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy1zZXJ2aWNlLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBOZXN0SlMgQ29uZmlnU2VydmljZSB3cmFwcGVyLlxyXG4gKiBFeHRlbmRzIENvbmZpZ01hbmFnZXJPcHRpb25zIGZyb20gQGR5YW5ldC9jb25maWctYXdzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb25maWdTZXJ2aWNlT3B0aW9uczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IGV4dGVuZHMgQ29uZmlnTWFuYWdlck9wdGlvbnM8VD4ge1xyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIE5lc3RKUyBsb2dnaW5nXHJcbiAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAqL1xyXG4gIGVuYWJsZU5lc3RMb2dnaW5nPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIE5lc3RKUyBJbmplY3RhYmxlIHdyYXBwZXIgYXJvdW5kIENvbmZpZ01hbmFnZXIgZnJvbSBAZHlhbmV0L2NvbmZpZy1hd3MuXHJcbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBjb25maWd1cmF0aW9uIGFjY2VzcyB3aXRoIE5lc3RKUyBkZXBlbmRlbmN5IGluamVjdGlvbiBzdXBwb3J0LlxyXG4gKiBcclxuICogVGhpcyBpcyBhIHRoaW4gYWRhcHRlciBsYXllciB0aGF0IGRlbGVnYXRlcyBhbGwgY29uZmlndXJhdGlvbiBsb2FkaW5nIGFuZFxyXG4gKiBtYW5hZ2VtZW50IHRvIHRoZSBmcmFtZXdvcmstYWdub3N0aWMgQ29uZmlnTWFuYWdlciBmcm9tIGNvbmZpZy1hd3MuXHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGltcG9ydCB7IENvbmZpZ1NlcnZpY2VJbXBsIH0gZnJvbSAnQGR5YW5ldC9uZXN0anMtY29uZmlnLWF3cyc7XHJcbiAqIGltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xyXG4gKiBcclxuICogY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xyXG4gKiAgIERBVEFCQVNFX1VSTDogei5zdHJpbmcoKSxcclxuICogICBQT1JUOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDMwMDApLFxyXG4gKiB9KTtcclxuICogXHJcbiAqIGNvbnN0IGNvbmZpZ1NlcnZpY2UgPSBuZXcgQ29uZmlnU2VydmljZUltcGwoe1xyXG4gKiAgIGxvYWRlcnM6IFtuZXcgRW52aXJvbm1lbnRMb2FkZXIoKV0sXHJcbiAqICAgc2NoZW1hLFxyXG4gKiB9KTtcclxuICogXHJcbiAqIGF3YWl0IGNvbmZpZ1NlcnZpY2UuaW5pdGlhbGl6ZSgpO1xyXG4gKiBjb25zdCBkYlVybCA9IGNvbmZpZ1NlcnZpY2UuZ2V0KCdEQVRBQkFTRV9VUkwnKTtcclxuICogYGBgXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb25maWdTZXJ2aWNlSW1wbDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IGV4dGVuZHMgQ29uZmlnU2VydmljZTxUPiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKENvbmZpZ1NlcnZpY2VJbXBsLm5hbWUpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnTWFuYWdlcjogQ29uZmlnTWFuYWdlcjxUPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZU5lc3RMb2dnaW5nOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb25maWdTZXJ2aWNlT3B0aW9uczxUPiA9IHt9KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgXHJcbiAgICB0aGlzLmVuYWJsZU5lc3RMb2dnaW5nID0gb3B0aW9ucy5lbmFibGVOZXN0TG9nZ2luZyA/PyB0cnVlO1xyXG4gICAgXHJcbiAgICAvLyBDcmVhdGUgQ29uZmlnTWFuYWdlciBmcm9tIGNvbmZpZy1hd3Mgd2l0aCBwcm92aWRlZCBvcHRpb25zXHJcbiAgICB0aGlzLmNvbmZpZ01hbmFnZXIgPSBuZXcgQ29uZmlnTWFuYWdlcjxUPih7XHJcbiAgICAgIGxvYWRlcnM6IG9wdGlvbnMubG9hZGVycyxcclxuICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSxcclxuICAgICAgcHJlY2VkZW5jZTogb3B0aW9ucy5wcmVjZWRlbmNlLFxyXG4gICAgICB2YWxpZGF0ZU9uTG9hZDogb3B0aW9ucy52YWxpZGF0ZU9uTG9hZCxcclxuICAgICAgZW5hYmxlTG9nZ2luZzogb3B0aW9ucy5lbmFibGVMb2dnaW5nLFxyXG4gICAgICBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyLFxyXG4gICAgICB2ZXJib3NlOiBvcHRpb25zLnZlcmJvc2UsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gc2VydmljZSBieSBsb2FkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBhbGwgc291cmNlcy5cclxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwLlxyXG4gICAqIFxyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIGlmIGxvYWRpbmcgb3IgdmFsaWRhdGlvbiBmYWlsc1xyXG4gICAqL1xyXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdNYW5hZ2VyLmlzTG9hZGVkKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZU5lc3RMb2dnaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKCdJbml0aWFsaXppbmcgY29uZmlndXJhdGlvbiBzZXJ2aWNlLi4uJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci5sb2FkKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5lbmFibGVOZXN0TG9nZ2luZykge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZygnQ29uZmlndXJhdGlvbiBzZXJ2aWNlIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBzZXJ2aWNlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIGNvbmZpZ3VyYXRpb24gdmFsdWUgYnkga2V5IHdpdGggdHlwZSBzYWZldHkuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGtleSAtIFRoZSBjb25maWd1cmF0aW9uIGtleSB0byByZXRyaWV2ZVxyXG4gICAqIEByZXR1cm5zIFRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHdpdGggcHJvcGVyIHR5cGluZ1xyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIGlmIGNvbmZpZ3VyYXRpb24gaXMgbm90IGluaXRpYWxpemVkXHJcbiAgICovXHJcbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEspOiBUW0tdIHtcclxuICAgIGlmICghdGhpcy5jb25maWdNYW5hZ2VyLmlzTG9hZGVkKCkpIHtcclxuICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcclxuICAgICAgICAnQ29uZmlndXJhdGlvbiBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnTWFuYWdlci5nZXQoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc2VydmljZSBpcyByZWFkeSB0byBzZXJ2ZSBjb25maWd1cmF0aW9uIHZhbHVlc1xyXG4gICAqL1xyXG4gIGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWdNYW5hZ2VyLmlzTG9hZGVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRoZSBjb21wbGV0ZSBjb25maWd1cmF0aW9uIG9iamVjdFxyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIGlmIGNvbmZpZ3VyYXRpb24gaXMgbm90IGluaXRpYWxpemVkXHJcbiAgICovXHJcbiAgZ2V0QWxsKCk6IFQge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZ01hbmFnZXIuaXNMb2FkZWQoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxyXG4gICAgICAgICdDb25maWd1cmF0aW9uIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXRpYWxpemUoKSBmaXJzdC4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWdNYW5hZ2VyLmdldEFsbCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGVudmlyb25tZW50LlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRoZSBBUFBfRU5WIHZhbHVlIG9yICdkZXZlbG9wbWVudCcgYXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIGdldEFwcEVudigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnTWFuYWdlci5nZXRBcHBFbnYoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBDb25maWdNYW5hZ2VyIGluc3RhbmNlLlxyXG4gICAqIFVzZWZ1bCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzIHRoYXQgbmVlZCBkaXJlY3QgYWNjZXNzIHRvIENvbmZpZ01hbmFnZXIgZmVhdHVyZXMuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVGhlIENvbmZpZ01hbmFnZXIgaW5zdGFuY2UgZnJvbSBAZHlhbmV0L2NvbmZpZy1hd3NcclxuICAgKi9cclxuICBnZXRDb25maWdNYW5hZ2VyKCk6IENvbmZpZ01hbmFnZXI8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnTWFuYWdlcjtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,362 @@
1
+ import { ConfigurationError, ConfigurationLoadError, ValidationError } from './errors';
2
+ /**
3
+ * Default console logger implementation
4
+ */
5
+ const defaultLogger = {
6
+ log: (message) => console.log(message),
7
+ error: (message) => console.error(message),
8
+ warn: (message) => console.warn(message),
9
+ debug: (message) => console.debug(message),
10
+ };
11
+ /**
12
+ * Default sensitive keys that should always be masked
13
+ */
14
+ const DEFAULT_SENSITIVE_KEYS = ['password', 'secret', 'key', 'token', 'credential', 'api_key', 'apikey'];
15
+ /**
16
+ * Default verbose options
17
+ */
18
+ const DEFAULT_VERBOSE_OPTIONS = {
19
+ logKeys: true,
20
+ logValues: false,
21
+ logOverrides: true,
22
+ logTiming: true,
23
+ maskValues: true,
24
+ sensitiveKeys: DEFAULT_SENSITIVE_KEYS,
25
+ };
26
+ /**
27
+ * Predefined precedence orders for common strategies
28
+ * Higher index = higher priority (later loaders override earlier ones)
29
+ */
30
+ const PRECEDENCE_ORDERS = {
31
+ // AWS wins: env -> envFile -> s3 -> secretsManager -> ssm
32
+ 'aws-first': [
33
+ 'EnvironmentLoader',
34
+ 'EnvFileLoader',
35
+ 'S3Loader',
36
+ 'SecretsManagerLoader',
37
+ 'SSMParameterStoreLoader',
38
+ ],
39
+ // Local wins: ssm -> secretsManager -> s3 -> envFile -> env
40
+ 'local-first': [
41
+ 'SSMParameterStoreLoader',
42
+ 'SecretsManagerLoader',
43
+ 'S3Loader',
44
+ 'EnvFileLoader',
45
+ 'EnvironmentLoader',
46
+ ],
47
+ };
48
+ /**
49
+ * ConfigManager orchestrates loading configuration from multiple sources
50
+ * with configurable precedence and validation.
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * import { ConfigManager, EnvironmentLoader, SecretsManagerLoader } from '@dyanet/config-aws';
55
+ * import { z } from 'zod';
56
+ *
57
+ * const schema = z.object({
58
+ * DATABASE_URL: z.string(),
59
+ * API_KEY: z.string(),
60
+ * PORT: z.coerce.number().default(3000),
61
+ * });
62
+ *
63
+ * const manager = new ConfigManager({
64
+ * loaders: [
65
+ * new EnvironmentLoader({ prefix: 'APP_' }),
66
+ * new SecretsManagerLoader({ secretName: '/my-app/config' }),
67
+ * ],
68
+ * schema,
69
+ * precedence: 'aws-first',
70
+ * verbose: true,
71
+ * });
72
+ *
73
+ * await manager.load();
74
+ * const dbUrl = manager.get('DATABASE_URL');
75
+ * ```
76
+ */
77
+ export class ConfigManager {
78
+ /** @internal */
79
+ _options;
80
+ /** @internal */
81
+ _logger;
82
+ /** @internal */
83
+ _verboseOptions;
84
+ config = null;
85
+ loadResult = null;
86
+ loaded = false;
87
+ constructor(options = {}) {
88
+ this._options = {
89
+ loaders: options.loaders ?? [],
90
+ schema: options.schema,
91
+ precedence: options.precedence ?? 'aws-first',
92
+ validateOnLoad: options.validateOnLoad ?? true,
93
+ enableLogging: options.enableLogging ?? false,
94
+ logger: options.logger,
95
+ verbose: options.verbose,
96
+ };
97
+ this._logger = options.logger ?? defaultLogger;
98
+ this._verboseOptions = this.resolveVerboseOptions(options.verbose);
99
+ }
100
+ /**
101
+ * Resolve verbose options from boolean or object
102
+ */
103
+ resolveVerboseOptions(verbose) {
104
+ if (verbose === undefined || verbose === false) {
105
+ return null;
106
+ }
107
+ if (verbose === true) {
108
+ return { ...DEFAULT_VERBOSE_OPTIONS };
109
+ }
110
+ return {
111
+ logKeys: verbose.logKeys ?? DEFAULT_VERBOSE_OPTIONS.logKeys,
112
+ logValues: verbose.logValues ?? DEFAULT_VERBOSE_OPTIONS.logValues,
113
+ logOverrides: verbose.logOverrides ?? DEFAULT_VERBOSE_OPTIONS.logOverrides,
114
+ logTiming: verbose.logTiming ?? DEFAULT_VERBOSE_OPTIONS.logTiming,
115
+ maskValues: verbose.maskValues ?? DEFAULT_VERBOSE_OPTIONS.maskValues,
116
+ sensitiveKeys: verbose.sensitiveKeys ?? DEFAULT_VERBOSE_OPTIONS.sensitiveKeys,
117
+ };
118
+ }
119
+ /**
120
+ * Log a message if logging is enabled
121
+ */
122
+ log(message) {
123
+ if (this._options.enableLogging || this._verboseOptions) {
124
+ this._logger.log(`[config-aws] ${message}`);
125
+ }
126
+ }
127
+ /**
128
+ * Mask a value for logging
129
+ */
130
+ maskValue(key, value) {
131
+ if (!this._verboseOptions?.logValues) {
132
+ return '';
133
+ }
134
+ const strValue = String(value);
135
+ const lowerKey = key.toLowerCase();
136
+ // Check if key contains any sensitive patterns
137
+ const isSensitive = this._verboseOptions.sensitiveKeys.some((pattern) => lowerKey.includes(pattern.toLowerCase()));
138
+ if (this._verboseOptions.maskValues || isSensitive) {
139
+ if (strValue.length <= 4) {
140
+ return '****';
141
+ }
142
+ return `${strValue.slice(0, 2)}**...${strValue.slice(-2)}`;
143
+ }
144
+ return strValue;
145
+ }
146
+ /**
147
+ * Get the loading order for loaders based on precedence strategy.
148
+ * Returns loaders sorted by priority (lower priority first, so higher priority loads last and wins).
149
+ */
150
+ getLoadOrder() {
151
+ const { loaders, precedence } = this._options;
152
+ if (!loaders || loaders.length === 0) {
153
+ return [];
154
+ }
155
+ // If precedence is a custom array, use it
156
+ if (Array.isArray(precedence)) {
157
+ return this.sortByCustomPrecedence(loaders, precedence);
158
+ }
159
+ // Use predefined precedence order
160
+ const order = PRECEDENCE_ORDERS[precedence];
161
+ return this.sortByPredefinedOrder(loaders, order);
162
+ }
163
+ /**
164
+ * Sort loaders by custom precedence configuration
165
+ */
166
+ sortByCustomPrecedence(loaders, precedence) {
167
+ const priorityMap = new Map();
168
+ for (const p of precedence) {
169
+ priorityMap.set(p.loader, p.priority);
170
+ }
171
+ // Sort by priority (lower first, so higher priority loads last and wins)
172
+ return [...loaders].sort((a, b) => {
173
+ const priorityA = priorityMap.get(a.getName()) ?? 0;
174
+ const priorityB = priorityMap.get(b.getName()) ?? 0;
175
+ return priorityA - priorityB;
176
+ });
177
+ }
178
+ /**
179
+ * Sort loaders by predefined order
180
+ */
181
+ sortByPredefinedOrder(loaders, order) {
182
+ const orderMap = new Map();
183
+ order.forEach((name, index) => orderMap.set(name, index));
184
+ // Sort by order index (lower first, so higher index loads last and wins)
185
+ return [...loaders].sort((a, b) => {
186
+ const indexA = orderMap.get(a.getName()) ?? -1;
187
+ const indexB = orderMap.get(b.getName()) ?? -1;
188
+ return indexA - indexB;
189
+ });
190
+ }
191
+ /**
192
+ * Load configuration from all configured loaders.
193
+ * Loaders are executed in precedence order, with later loaders overriding earlier ones.
194
+ */
195
+ async load() {
196
+ const startTime = Date.now();
197
+ const sources = [];
198
+ let mergedConfig = {};
199
+ const keyOrigins = new Map(); // Track which loader set each key
200
+ this.log('Loading configuration...');
201
+ const orderedLoaders = this.getLoadOrder();
202
+ for (const loader of orderedLoaders) {
203
+ const loaderName = loader.getName();
204
+ const loaderStartTime = Date.now();
205
+ try {
206
+ // Check if loader is available
207
+ const isAvailable = await loader.isAvailable();
208
+ if (!isAvailable) {
209
+ if (this._verboseOptions?.logTiming) {
210
+ this.log(`${loaderName}: skipped (not available)`);
211
+ }
212
+ continue;
213
+ }
214
+ // Load configuration from this loader
215
+ const loaderConfig = await loader.load();
216
+ const keysLoaded = Object.keys(loaderConfig);
217
+ const duration = Date.now() - loaderStartTime;
218
+ // Track source info
219
+ sources.push({
220
+ loader: loaderName,
221
+ keysLoaded,
222
+ duration,
223
+ });
224
+ // Log timing and keys
225
+ if (this._verboseOptions?.logTiming) {
226
+ this.log(`${loaderName}: loaded ${keysLoaded.length} keys in ${duration}ms`);
227
+ }
228
+ // Log individual keys and track overrides
229
+ for (const key of keysLoaded) {
230
+ const previousLoader = keyOrigins.get(key);
231
+ const isOverride = previousLoader !== undefined;
232
+ if (this._verboseOptions?.logKeys) {
233
+ let logLine = ` - ${key}`;
234
+ if (this._verboseOptions.logValues) {
235
+ logLine += ` = "${this.maskValue(key, loaderConfig[key])}"`;
236
+ }
237
+ if (isOverride && this._verboseOptions.logOverrides) {
238
+ logLine += ` (overrides ${previousLoader})`;
239
+ }
240
+ this.log(logLine);
241
+ }
242
+ keyOrigins.set(key, loaderName);
243
+ }
244
+ // Merge configuration (later loaders override earlier ones)
245
+ mergedConfig = { ...mergedConfig, ...loaderConfig };
246
+ }
247
+ catch (error) {
248
+ throw new ConfigurationLoadError(`Failed to load configuration from ${loaderName}: ${error instanceof Error ? error.message : String(error)}`, loaderName, error instanceof Error ? error : undefined);
249
+ }
250
+ }
251
+ // Count overrides
252
+ const totalKeys = Object.keys(mergedConfig).length;
253
+ const totalDuration = Date.now() - startTime;
254
+ const overrideCount = sources.reduce((acc, s) => acc + s.keysLoaded.length, 0) - totalKeys;
255
+ if (this._verboseOptions?.logTiming) {
256
+ this.log(`Configuration loaded: ${totalKeys} total keys, ${overrideCount} overrides, ${totalDuration}ms total`);
257
+ }
258
+ // Validate if schema is provided and validation is enabled
259
+ if (this._options.schema && this._options.validateOnLoad) {
260
+ const result = this._options.schema.safeParse(mergedConfig);
261
+ if (!result.success) {
262
+ const zodError = result.error;
263
+ throw new ValidationError(`Configuration validation failed: ${zodError.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`, zodError.errors, undefined);
264
+ }
265
+ this.config = result.data;
266
+ }
267
+ else {
268
+ this.config = mergedConfig;
269
+ }
270
+ this.loadResult = {
271
+ config: this.config,
272
+ sources,
273
+ loadedAt: new Date(),
274
+ };
275
+ this.loaded = true;
276
+ }
277
+ /**
278
+ * Get a specific configuration value by key.
279
+ * @param key The configuration key
280
+ * @returns The configuration value
281
+ * @throws ConfigurationError if configuration is not loaded
282
+ */
283
+ get(key) {
284
+ if (!this.loaded || this.config === null) {
285
+ throw new ConfigurationError('Configuration not loaded. Call load() first.');
286
+ }
287
+ // Non-null assertion is safe here because we've checked this.config !== null above
288
+ return this.config[key];
289
+ }
290
+ /**
291
+ * Get all configuration values.
292
+ * @returns The complete configuration object
293
+ * @throws ConfigurationError if configuration is not loaded
294
+ */
295
+ getAll() {
296
+ if (!this.loaded || this.config === null) {
297
+ throw new ConfigurationError('Configuration not loaded. Call load() first.');
298
+ }
299
+ return this.config;
300
+ }
301
+ /**
302
+ * Check if configuration has been loaded.
303
+ * @returns true if configuration is loaded
304
+ */
305
+ isLoaded() {
306
+ return this.loaded;
307
+ }
308
+ /**
309
+ * Get the current application environment.
310
+ * @returns The APP_ENV value or 'development' as default
311
+ */
312
+ getAppEnv() {
313
+ return process.env['APP_ENV'] ?? 'development';
314
+ }
315
+ /**
316
+ * Get the load result with source information.
317
+ * @returns The load result or null if not loaded
318
+ */
319
+ getLoadResult() {
320
+ return this.loadResult;
321
+ }
322
+ /**
323
+ * Serialize the current configuration to JSON string.
324
+ * @returns JSON string representation of the configuration
325
+ * @throws ConfigurationError if configuration is not loaded
326
+ */
327
+ serialize() {
328
+ if (!this.loaded || this.config === null) {
329
+ throw new ConfigurationError('Configuration not loaded. Call load() first.');
330
+ }
331
+ return JSON.stringify(this.config);
332
+ }
333
+ /**
334
+ * Create a new ConfigManager with configuration loaded from a JSON string.
335
+ * This is useful for restoring configuration from a serialized state.
336
+ * @param json JSON string to deserialize
337
+ * @param options Optional ConfigManager options (schema will be used for validation)
338
+ * @returns A new ConfigManager instance with the deserialized configuration
339
+ */
340
+ static deserialize(json, options = {}) {
341
+ const parsed = JSON.parse(json);
342
+ // Validate if schema is provided
343
+ if (options.schema) {
344
+ const result = options.schema.safeParse(parsed);
345
+ if (!result.success) {
346
+ const zodError = result.error;
347
+ throw new ValidationError(`Deserialization validation failed: ${zodError.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`, zodError.errors, undefined);
348
+ }
349
+ }
350
+ // Create a new ConfigManager and set its internal state
351
+ const manager = new ConfigManager(options);
352
+ manager.config = parsed;
353
+ manager.loaded = true;
354
+ manager.loadResult = {
355
+ config: parsed,
356
+ sources: [{ loader: 'deserialize', keysLoaded: Object.keys(parsed), duration: 0 }],
357
+ loadedAt: new Date(),
358
+ };
359
+ return manager;
360
+ }
361
+ }
362
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9jb25maWctYXdzL3NyYy9jb25maWctbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFVQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXZGOztHQUVHO0FBQ0gsTUFBTSxhQUFhLEdBQVc7SUFDNUIsR0FBRyxFQUFFLENBQUMsT0FBZSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUM5QyxLQUFLLEVBQUUsQ0FBQyxPQUFlLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0lBQ2xELElBQUksRUFBRSxDQUFDLE9BQWUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDaEQsS0FBSyxFQUFFLENBQUMsT0FBZSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztDQUNuRCxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFFekc7O0dBRUc7QUFDSCxNQUFNLHVCQUF1QixHQUE2QjtJQUN4RCxPQUFPLEVBQUUsSUFBSTtJQUNiLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsVUFBVSxFQUFFLElBQUk7SUFDaEIsYUFBYSxFQUFFLHNCQUFzQjtDQUN0QyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBa0Q7SUFDdkUsMERBQTBEO0lBQzFELFdBQVcsRUFBRTtRQUNYLG1CQUFtQjtRQUNuQixl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QXNDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUNsSCxRQUFRLENBQUMsTUFBTSxFQUNmLFNBQVMsQ0FDVixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUksT0FBTyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFXLENBQUM7UUFDN0IsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDdEIsT0FBTyxDQUFDLFVBQVUsR0FBRztZQUNuQixNQUFNLEVBQUUsTUFBVztZQUNuQixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2xGLFFBQVEsRUFBRSxJQUFJLElBQUksRUFBRTtTQUNyQixDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBab2RFcnJvciB9IGZyb20gJ3pvZCc7XHJcbmltcG9ydCB0eXBlIHsgQ29uZmlnTG9hZGVyIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbmZpZy1sb2FkZXIuaW50ZXJmYWNlJztcclxuaW1wb3J0IHR5cGUge1xyXG4gIENvbmZpZ01hbmFnZXJPcHRpb25zLFxyXG4gIENvbmZpZ0xvYWRSZXN1bHQsXHJcbiAgQ29uZmlnU291cmNlSW5mbyxcclxuICBMb2dnZXIsXHJcbiAgTG9hZGVyUHJlY2VkZW5jZSxcclxuICBWZXJib3NlT3B0aW9ucyxcclxufSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLW1hbmFnZXIuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yLCBDb25maWd1cmF0aW9uTG9hZEVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBjb25zb2xlIGxvZ2dlciBpbXBsZW1lbnRhdGlvblxyXG4gKi9cclxuY29uc3QgZGVmYXVsdExvZ2dlcjogTG9nZ2VyID0ge1xyXG4gIGxvZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gY29uc29sZS5sb2cobWVzc2FnZSksXHJcbiAgZXJyb3I6IChtZXNzYWdlOiBzdHJpbmcpID0+IGNvbnNvbGUuZXJyb3IobWVzc2FnZSksXHJcbiAgd2FybjogKG1lc3NhZ2U6IHN0cmluZykgPT4gY29uc29sZS53YXJuKG1lc3NhZ2UpLFxyXG4gIGRlYnVnOiAobWVzc2FnZTogc3RyaW5nKSA9PiBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpLFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgc2Vuc2l0aXZlIGtleXMgdGhhdCBzaG91bGQgYWx3YXlzIGJlIG1hc2tlZFxyXG4gKi9cclxuY29uc3QgREVGQVVMVF9TRU5TSVRJVkVfS0VZUyA9IFsncGFzc3dvcmQnLCAnc2VjcmV0JywgJ2tleScsICd0b2tlbicsICdjcmVkZW50aWFsJywgJ2FwaV9rZXknLCAnYXBpa2V5J107XHJcblxyXG4vKipcclxuICogRGVmYXVsdCB2ZXJib3NlIG9wdGlvbnNcclxuICovXHJcbmNvbnN0IERFRkFVTFRfVkVSQk9TRV9PUFRJT05TOiBSZXF1aXJlZDxWZXJib3NlT3B0aW9ucz4gPSB7XHJcbiAgbG9nS2V5czogdHJ1ZSxcclxuICBsb2dWYWx1ZXM6IGZhbHNlLFxyXG4gIGxvZ092ZXJyaWRlczogdHJ1ZSxcclxuICBsb2dUaW1pbmc6IHRydWUsXHJcbiAgbWFza1ZhbHVlczogdHJ1ZSxcclxuICBzZW5zaXRpdmVLZXlzOiBERUZBVUxUX1NFTlNJVElWRV9LRVlTLFxyXG59O1xyXG5cclxuLyoqXHJcbiAqIFByZWRlZmluZWQgcHJlY2VkZW5jZSBvcmRlcnMgZm9yIGNvbW1vbiBzdHJhdGVnaWVzXHJcbiAqIEhpZ2hlciBpbmRleCA9IGhpZ2hlciBwcmlvcml0eSAobGF0ZXIgbG9hZGVycyBvdmVycmlkZSBlYXJsaWVyIG9uZXMpXHJcbiAqL1xyXG5jb25zdCBQUkVDRURFTkNFX09SREVSUzogUmVjb3JkPCdhd3MtZmlyc3QnIHwgJ2xvY2FsLWZpcnN0Jywgc3RyaW5nW10+ID0ge1xyXG4gIC8vIEFXUyB3aW5zOiBlbnYgLT4gZW52RmlsZSAtPiBzMyAtPiBzZWNyZXRzTWFuYWdlciAtPiBzc21cclxuICAnYXdzLWZpcnN0JzogW1xyXG4gICAgJ0Vudmlyb25tZW50TG9hZGVyJyxcclxuICAgICdFbnZGaWxlTG9hZGVyJyxcclxuICAgICdTM0xvYWRlcicsXHJcbiAgICAnU2VjcmV0c01hbmFnZXJMb2FkZXInLFxyXG4gICAgJ1NTTVBhcmFtZXRlclN0b3JlTG9hZGVyJyxcclxuICBdLFxyXG4gIC8vIExvY2FsIHdpbnM6IHNzbSAtPiBzZWNyZXRzTWFuYWdlciAtPiBzMyAtPiBlbnZGaWxlIC0+IGVudlxyXG4gICdsb2NhbC1maXJzdCc6IFtcclxuICAgICdTU01QYXJhbWV0ZXJTdG9yZUxvYWRlcicsXHJcbiAgICAnU2VjcmV0c01hbmFnZXJMb2FkZXInLFxyXG4gICAgJ1MzTG9hZGVyJyxcclxuICAgICdFbnZGaWxlTG9hZGVyJyxcclxuICAgICdFbnZpcm9ubWVudExvYWRlcicsXHJcbiAgXSxcclxufTtcclxuXHJcblxyXG4vKipcclxuICogQ29uZmlnTWFuYWdlciBvcmNoZXN0cmF0ZXMgbG9hZGluZyBjb25maWd1cmF0aW9uIGZyb20gbXVsdGlwbGUgc291cmNlc1xyXG4gKiB3aXRoIGNvbmZpZ3VyYWJsZSBwcmVjZWRlbmNlIGFuZCB2YWxpZGF0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGltcG9ydCB7IENvbmZpZ01hbmFnZXIsIEVudmlyb25tZW50TG9hZGVyLCBTZWNyZXRzTWFuYWdlckxvYWRlciB9IGZyb20gJ0BkeWFuZXQvY29uZmlnLWF3cyc7XHJcbiAqIGltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xyXG4gKlxyXG4gKiBjb25zdCBzY2hlbWEgPSB6Lm9iamVjdCh7XHJcbiAqICAgREFUQUJBU0VfVVJMOiB6LnN0cmluZygpLFxyXG4gKiAgIEFQSV9LRVk6IHouc3RyaW5nKCksXHJcbiAqICAgUE9SVDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgzMDAwKSxcclxuICogfSk7XHJcbiAqXHJcbiAqIGNvbnN0IG1hbmFnZXIgPSBuZXcgQ29uZmlnTWFuYWdlcih7XHJcbiAqICAgbG9hZGVyczogW1xyXG4gKiAgICAgbmV3IEVudmlyb25tZW50TG9hZGVyKHsgcHJlZml4OiAnQVBQXycgfSksXHJcbiAqICAgICBuZXcgU2VjcmV0c01hbmFnZXJMb2FkZXIoeyBzZWNyZXROYW1lOiAnL215LWFwcC9jb25maWcnIH0pLFxyXG4gKiAgIF0sXHJcbiAqICAgc2NoZW1hLFxyXG4gKiAgIHByZWNlZGVuY2U6ICdhd3MtZmlyc3QnLFxyXG4gKiAgIHZlcmJvc2U6IHRydWUsXHJcbiAqIH0pO1xyXG4gKlxyXG4gKiBhd2FpdCBtYW5hZ2VyLmxvYWQoKTtcclxuICogY29uc3QgZGJVcmwgPSBtYW5hZ2VyLmdldCgnREFUQUJBU0VfVVJMJyk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbmZpZ01hbmFnZXI8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBfb3B0aW9uczogUmVxdWlyZWQ8T21pdDxDb25maWdNYW5hZ2VyT3B0aW9uczxUPiwgJ3NjaGVtYScgfCAnbG9nZ2VyJyB8ICd2ZXJib3NlJz4+ICYge1xyXG4gICAgc2NoZW1hPzogQ29uZmlnTWFuYWdlck9wdGlvbnM8VD5bJ3NjaGVtYSddO1xyXG4gICAgbG9nZ2VyPzogTG9nZ2VyO1xyXG4gICAgdmVyYm9zZT86IFZlcmJvc2VPcHRpb25zIHwgYm9vbGVhbjtcclxuICB9O1xyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2xvZ2dlcjogTG9nZ2VyO1xyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3ZlcmJvc2VPcHRpb25zOiBSZXF1aXJlZDxWZXJib3NlT3B0aW9ucz4gfCBudWxsO1xyXG5cclxuICBwcml2YXRlIGNvbmZpZzogVCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZFJlc3VsdDogQ29uZmlnTG9hZFJlc3VsdDxUPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZGVkID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbmZpZ01hbmFnZXJPcHRpb25zPFQ+ID0ge30pIHtcclxuICAgIHRoaXMuX29wdGlvbnMgPSB7XHJcbiAgICAgIGxvYWRlcnM6IG9wdGlvbnMubG9hZGVycyA/PyBbXSxcclxuICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSxcclxuICAgICAgcHJlY2VkZW5jZTogb3B0aW9ucy5wcmVjZWRlbmNlID8/ICdhd3MtZmlyc3QnLFxyXG4gICAgICB2YWxpZGF0ZU9uTG9hZDogb3B0aW9ucy52YWxpZGF0ZU9uTG9hZCA/PyB0cnVlLFxyXG4gICAgICBlbmFibGVMb2dnaW5nOiBvcHRpb25zLmVuYWJsZUxvZ2dpbmcgPz8gZmFsc2UsXHJcbiAgICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIsXHJcbiAgICAgIHZlcmJvc2U6IG9wdGlvbnMudmVyYm9zZSxcclxuICAgIH07XHJcbiAgICB0aGlzLl9sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyO1xyXG4gICAgdGhpcy5fdmVyYm9zZU9wdGlvbnMgPSB0aGlzLnJlc29sdmVWZXJib3NlT3B0aW9ucyhvcHRpb25zLnZlcmJvc2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZSB2ZXJib3NlIG9wdGlvbnMgZnJvbSBib29sZWFuIG9yIG9iamVjdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzb2x2ZVZlcmJvc2VPcHRpb25zKHZlcmJvc2U/OiBWZXJib3NlT3B0aW9ucyB8IGJvb2xlYW4pOiBSZXF1aXJlZDxWZXJib3NlT3B0aW9ucz4gfCBudWxsIHtcclxuICAgIGlmICh2ZXJib3NlID09PSB1bmRlZmluZWQgfHwgdmVyYm9zZSA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodmVyYm9zZSA9PT0gdHJ1ZSkge1xyXG4gICAgICByZXR1cm4geyAuLi5ERUZBVUxUX1ZFUkJPU0VfT1BUSU9OUyB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbG9nS2V5czogdmVyYm9zZS5sb2dLZXlzID8/IERFRkFVTFRfVkVSQk9TRV9PUFRJT05TLmxvZ0tleXMsXHJcbiAgICAgIGxvZ1ZhbHVlczogdmVyYm9zZS5sb2dWYWx1ZXMgPz8gREVGQVVMVF9WRVJCT1NFX09QVElPTlMubG9nVmFsdWVzLFxyXG4gICAgICBsb2dPdmVycmlkZXM6IHZlcmJvc2UubG9nT3ZlcnJpZGVzID8/IERFRkFVTFRfVkVSQk9TRV9PUFRJT05TLmxvZ092ZXJyaWRlcyxcclxuICAgICAgbG9nVGltaW5nOiB2ZXJib3NlLmxvZ1RpbWluZyA/PyBERUZBVUxUX1ZFUkJPU0VfT1BUSU9OUy5sb2dUaW1pbmcsXHJcbiAgICAgIG1hc2tWYWx1ZXM6IHZlcmJvc2UubWFza1ZhbHVlcyA/PyBERUZBVUxUX1ZFUkJPU0VfT1BUSU9OUy5tYXNrVmFsdWVzLFxyXG4gICAgICBzZW5zaXRpdmVLZXlzOiB2ZXJib3NlLnNlbnNpdGl2ZUtleXMgPz8gREVGQVVMVF9WRVJCT1NFX09QVElPTlMuc2Vuc2l0aXZlS2V5cyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2cgYSBtZXNzYWdlIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9nKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuZW5hYmxlTG9nZ2luZyB8fCB0aGlzLl92ZXJib3NlT3B0aW9ucykge1xyXG4gICAgICB0aGlzLl9sb2dnZXIubG9nKGBbY29uZmlnLWF3c10gJHttZXNzYWdlfWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFzayBhIHZhbHVlIGZvciBsb2dnaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtYXNrVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5fdmVyYm9zZU9wdGlvbnM/LmxvZ1ZhbHVlcykge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RyVmFsdWUgPSBTdHJpbmcodmFsdWUpO1xyXG4gICAgY29uc3QgbG93ZXJLZXkgPSBrZXkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBrZXkgY29udGFpbnMgYW55IHNlbnNpdGl2ZSBwYXR0ZXJuc1xyXG4gICAgY29uc3QgaXNTZW5zaXRpdmUgPSB0aGlzLl92ZXJib3NlT3B0aW9ucy5zZW5zaXRpdmVLZXlzLnNvbWUoXHJcbiAgICAgIChwYXR0ZXJuKSA9PiBsb3dlcktleS5pbmNsdWRlcyhwYXR0ZXJuLnRvTG93ZXJDYXNlKCkpXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0aGlzLl92ZXJib3NlT3B0aW9ucy5tYXNrVmFsdWVzIHx8IGlzU2Vuc2l0aXZlKSB7XHJcbiAgICAgIGlmIChzdHJWYWx1ZS5sZW5ndGggPD0gNCkge1xyXG4gICAgICAgIHJldHVybiAnKioqKic7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGAke3N0clZhbHVlLnNsaWNlKDAsIDIpfSoqLi4uJHtzdHJWYWx1ZS5zbGljZSgtMil9YDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RyVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBsb2FkaW5nIG9yZGVyIGZvciBsb2FkZXJzIGJhc2VkIG9uIHByZWNlZGVuY2Ugc3RyYXRlZ3kuXHJcbiAgICogUmV0dXJucyBsb2FkZXJzIHNvcnRlZCBieSBwcmlvcml0eSAobG93ZXIgcHJpb3JpdHkgZmlyc3QsIHNvIGhpZ2hlciBwcmlvcml0eSBsb2FkcyBsYXN0IGFuZCB3aW5zKS5cclxuICAgKi9cclxuICBwcml2YXRlIGdldExvYWRPcmRlcigpOiBDb25maWdMb2FkZXJbXSB7XHJcbiAgICBjb25zdCB7IGxvYWRlcnMsIHByZWNlZGVuY2UgfSA9IHRoaXMuX29wdGlvbnM7XHJcblxyXG4gICAgaWYgKCFsb2FkZXJzIHx8IGxvYWRlcnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBwcmVjZWRlbmNlIGlzIGEgY3VzdG9tIGFycmF5LCB1c2UgaXRcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHByZWNlZGVuY2UpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNvcnRCeUN1c3RvbVByZWNlZGVuY2UobG9hZGVycywgcHJlY2VkZW5jZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXNlIHByZWRlZmluZWQgcHJlY2VkZW5jZSBvcmRlclxyXG4gICAgY29uc3Qgb3JkZXIgPSBQUkVDRURFTkNFX09SREVSU1twcmVjZWRlbmNlXTtcclxuICAgIHJldHVybiB0aGlzLnNvcnRCeVByZWRlZmluZWRPcmRlcihsb2FkZXJzLCBvcmRlcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTb3J0IGxvYWRlcnMgYnkgY3VzdG9tIHByZWNlZGVuY2UgY29uZmlndXJhdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydEJ5Q3VzdG9tUHJlY2VkZW5jZShsb2FkZXJzOiBDb25maWdMb2FkZXJbXSwgcHJlY2VkZW5jZTogTG9hZGVyUHJlY2VkZW5jZVtdKTogQ29uZmlnTG9hZGVyW10ge1xyXG4gICAgY29uc3QgcHJpb3JpdHlNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xyXG4gICAgZm9yIChjb25zdCBwIG9mIHByZWNlZGVuY2UpIHtcclxuICAgICAgcHJpb3JpdHlNYXAuc2V0KHAubG9hZGVyLCBwLnByaW9yaXR5KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IChsb3dlciBmaXJzdCwgc28gaGlnaGVyIHByaW9yaXR5IGxvYWRzIGxhc3QgYW5kIHdpbnMpXHJcbiAgICByZXR1cm4gWy4uLmxvYWRlcnNdLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgcHJpb3JpdHlBID0gcHJpb3JpdHlNYXAuZ2V0KGEuZ2V0TmFtZSgpKSA/PyAwO1xyXG4gICAgICBjb25zdCBwcmlvcml0eUIgPSBwcmlvcml0eU1hcC5nZXQoYi5nZXROYW1lKCkpID8/IDA7XHJcbiAgICAgIHJldHVybiBwcmlvcml0eUEgLSBwcmlvcml0eUI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvcnQgbG9hZGVycyBieSBwcmVkZWZpbmVkIG9yZGVyXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzb3J0QnlQcmVkZWZpbmVkT3JkZXIobG9hZGVyczogQ29uZmlnTG9hZGVyW10sIG9yZGVyOiBzdHJpbmdbXSk6IENvbmZpZ0xvYWRlcltdIHtcclxuICAgIGNvbnN0IG9yZGVyTWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcclxuICAgIG9yZGVyLmZvckVhY2goKG5hbWUsIGluZGV4KSA9PiBvcmRlck1hcC5zZXQobmFtZSwgaW5kZXgpKTtcclxuXHJcbiAgICAvLyBTb3J0IGJ5IG9yZGVyIGluZGV4IChsb3dlciBmaXJzdCwgc28gaGlnaGVyIGluZGV4IGxvYWRzIGxhc3QgYW5kIHdpbnMpXHJcbiAgICByZXR1cm4gWy4uLmxvYWRlcnNdLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgaW5kZXhBID0gb3JkZXJNYXAuZ2V0KGEuZ2V0TmFtZSgpKSA/PyAtMTtcclxuICAgICAgY29uc3QgaW5kZXhCID0gb3JkZXJNYXAuZ2V0KGIuZ2V0TmFtZSgpKSA/PyAtMTtcclxuICAgICAgcmV0dXJuIGluZGV4QSAtIGluZGV4QjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZyb20gYWxsIGNvbmZpZ3VyZWQgbG9hZGVycy5cclxuICAgKiBMb2FkZXJzIGFyZSBleGVjdXRlZCBpbiBwcmVjZWRlbmNlIG9yZGVyLCB3aXRoIGxhdGVyIGxvYWRlcnMgb3ZlcnJpZGluZyBlYXJsaWVyIG9uZXMuXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcbiAgICBjb25zdCBzb3VyY2VzOiBDb25maWdTb3VyY2VJbmZvW10gPSBbXTtcclxuICAgIGxldCBtZXJnZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICBjb25zdCBrZXlPcmlnaW5zOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpOyAvLyBUcmFjayB3aGljaCBsb2FkZXIgc2V0IGVhY2gga2V5XHJcblxyXG4gICAgdGhpcy5sb2coJ0xvYWRpbmcgY29uZmlndXJhdGlvbi4uLicpO1xyXG5cclxuICAgIGNvbnN0IG9yZGVyZWRMb2FkZXJzID0gdGhpcy5nZXRMb2FkT3JkZXIoKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBvcmRlcmVkTG9hZGVycykge1xyXG4gICAgICBjb25zdCBsb2FkZXJOYW1lID0gbG9hZGVyLmdldE5hbWUoKTtcclxuICAgICAgY29uc3QgbG9hZGVyU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgbG9hZGVyIGlzIGF2YWlsYWJsZVxyXG4gICAgICAgIGNvbnN0IGlzQXZhaWxhYmxlID0gYXdhaXQgbG9hZGVyLmlzQXZhaWxhYmxlKCk7XHJcbiAgICAgICAgaWYgKCFpc0F2YWlsYWJsZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3ZlcmJvc2VPcHRpb25zPy5sb2dUaW1pbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2coYCR7bG9hZGVyTmFtZX06IHNraXBwZWQgKG5vdCBhdmFpbGFibGUpYCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIHRoaXMgbG9hZGVyXHJcbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gYXdhaXQgbG9hZGVyLmxvYWQoKTtcclxuICAgICAgICBjb25zdCBrZXlzTG9hZGVkID0gT2JqZWN0LmtleXMobG9hZGVyQ29uZmlnKTtcclxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBsb2FkZXJTdGFydFRpbWU7XHJcblxyXG4gICAgICAgIC8vIFRyYWNrIHNvdXJjZSBpbmZvXHJcbiAgICAgICAgc291cmNlcy5wdXNoKHtcclxuICAgICAgICAgIGxvYWRlcjogbG9hZGVyTmFtZSxcclxuICAgICAgICAgIGtleXNMb2FkZWQsXHJcbiAgICAgICAgICBkdXJhdGlvbixcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gTG9nIHRpbWluZyBhbmQga2V5c1xyXG4gICAgICAgIGlmICh0aGlzLl92ZXJib3NlT3B0aW9ucz8ubG9nVGltaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmxvZyhgJHtsb2FkZXJOYW1lfTogbG9hZGVkICR7a2V5c0xvYWRlZC5sZW5ndGh9IGtleXMgaW4gJHtkdXJhdGlvbn1tc2ApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTG9nIGluZGl2aWR1YWwga2V5cyBhbmQgdHJhY2sgb3ZlcnJpZGVzXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c0xvYWRlZCkge1xyXG4gICAgICAgICAgY29uc3QgcHJldmlvdXNMb2FkZXIgPSBrZXlPcmlnaW5zLmdldChrZXkpO1xyXG4gICAgICAgICAgY29uc3QgaXNPdmVycmlkZSA9IHByZXZpb3VzTG9hZGVyICE9PSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3ZlcmJvc2VPcHRpb25zPy5sb2dLZXlzKSB7XHJcbiAgICAgICAgICAgIGxldCBsb2dMaW5lID0gYCAgLSAke2tleX1gO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fdmVyYm9zZU9wdGlvbnMubG9nVmFsdWVzKSB7XHJcbiAgICAgICAgICAgICAgbG9nTGluZSArPSBgID0gXCIke3RoaXMubWFza1ZhbHVlKGtleSwgbG9hZGVyQ29uZmlnW2tleV0pfVwiYDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNPdmVycmlkZSAmJiB0aGlzLl92ZXJib3NlT3B0aW9ucy5sb2dPdmVycmlkZXMpIHtcclxuICAgICAgICAgICAgICBsb2dMaW5lICs9IGAgKG92ZXJyaWRlcyAke3ByZXZpb3VzTG9hZGVyfSlgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubG9nKGxvZ0xpbmUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGtleU9yaWdpbnMuc2V0KGtleSwgbG9hZGVyTmFtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBNZXJnZSBjb25maWd1cmF0aW9uIChsYXRlciBsb2FkZXJzIG92ZXJyaWRlIGVhcmxpZXIgb25lcylcclxuICAgICAgICBtZXJnZWRDb25maWcgPSB7IC4uLm1lcmdlZENvbmZpZywgLi4ubG9hZGVyQ29uZmlnIH07XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25Mb2FkRXJyb3IoXHJcbiAgICAgICAgICBgRmFpbGVkIHRvIGxvYWQgY29uZmlndXJhdGlvbiBmcm9tICR7bG9hZGVyTmFtZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXHJcbiAgICAgICAgICBsb2FkZXJOYW1lLFxyXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENvdW50IG92ZXJyaWRlc1xyXG4gICAgY29uc3QgdG90YWxLZXlzID0gT2JqZWN0LmtleXMobWVyZ2VkQ29uZmlnKS5sZW5ndGg7XHJcbiAgICBjb25zdCB0b3RhbER1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcclxuICAgIGNvbnN0IG92ZXJyaWRlQ291bnQgPSBzb3VyY2VzLnJlZHVjZSgoYWNjLCBzKSA9PiBhY2MgKyBzLmtleXNMb2FkZWQubGVuZ3RoLCAwKSAtIHRvdGFsS2V5cztcclxuXHJcbiAgICBpZiAodGhpcy5fdmVyYm9zZU9wdGlvbnM/LmxvZ1RpbWluZykge1xyXG4gICAgICB0aGlzLmxvZyhgQ29uZmlndXJhdGlvbiBsb2FkZWQ6ICR7dG90YWxLZXlzfSB0b3RhbCBrZXlzLCAke292ZXJyaWRlQ291bnR9IG92ZXJyaWRlcywgJHt0b3RhbER1cmF0aW9ufW1zIHRvdGFsYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgaWYgc2NoZW1hIGlzIHByb3ZpZGVkIGFuZCB2YWxpZGF0aW9uIGlzIGVuYWJsZWRcclxuICAgIGlmICh0aGlzLl9vcHRpb25zLnNjaGVtYSAmJiB0aGlzLl9vcHRpb25zLnZhbGlkYXRlT25Mb2FkKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX29wdGlvbnMuc2NoZW1hLnNhZmVQYXJzZShtZXJnZWRDb25maWcpO1xyXG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgY29uc3Qgem9kRXJyb3IgPSByZXN1bHQuZXJyb3IgYXMgWm9kRXJyb3I7XHJcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcclxuICAgICAgICAgIGBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiAke3pvZEVycm9yLmVycm9ycy5tYXAoKGUpID0+IGAke2UucGF0aC5qb2luKCcuJyl9OiAke2UubWVzc2FnZX1gKS5qb2luKCcsICcpfWAsXHJcbiAgICAgICAgICB6b2RFcnJvci5lcnJvcnMsXHJcbiAgICAgICAgICB1bmRlZmluZWRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY29uZmlnID0gcmVzdWx0LmRhdGEgYXMgVDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29uZmlnID0gbWVyZ2VkQ29uZmlnIGFzIFQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkUmVzdWx0ID0ge1xyXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxyXG4gICAgICBzb3VyY2VzLFxyXG4gICAgICBsb2FkZWRBdDogbmV3IERhdGUoKSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gdmFsdWUgYnkga2V5LlxyXG4gICAqIEBwYXJhbSBrZXkgVGhlIGNvbmZpZ3VyYXRpb24ga2V5XHJcbiAgICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24gdmFsdWVcclxuICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FcnJvciBpZiBjb25maWd1cmF0aW9uIGlzIG5vdCBsb2FkZWRcclxuICAgKi9cclxuICBnZXQ8SyBleHRlbmRzIGtleW9mIFQ+KGtleTogSyk6IFRbS10ge1xyXG4gICAgaWYgKCF0aGlzLmxvYWRlZCB8fCB0aGlzLmNvbmZpZyA9PT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdDb25maWd1cmF0aW9uIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGZpcnN0LicpO1xyXG4gICAgfVxyXG4gICAgLy8gTm9uLW51bGwgYXNzZXJ0aW9uIGlzIHNhZmUgaGVyZSBiZWNhdXNlIHdlJ3ZlIGNoZWNrZWQgdGhpcy5jb25maWcgIT09IG51bGwgYWJvdmVcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZyFba2V5XTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgY29uZmlndXJhdGlvbiB2YWx1ZXMuXHJcbiAgICogQHJldHVybnMgVGhlIGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXJyb3IgaWYgY29uZmlndXJhdGlvbiBpcyBub3QgbG9hZGVkXHJcbiAgICovXHJcbiAgZ2V0QWxsKCk6IFQge1xyXG4gICAgaWYgKCF0aGlzLmxvYWRlZCB8fCB0aGlzLmNvbmZpZyA9PT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdDb25maWd1cmF0aW9uIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGZpcnN0LicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBsb2FkZWQuXHJcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBjb25maWd1cmF0aW9uIGlzIGxvYWRlZFxyXG4gICAqL1xyXG4gIGlzTG9hZGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGVudmlyb25tZW50LlxyXG4gICAqIEByZXR1cm5zIFRoZSBBUFBfRU5WIHZhbHVlIG9yICdkZXZlbG9wbWVudCcgYXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIGdldEFwcEVudigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHByb2Nlc3MuZW52WydBUFBfRU5WJ10gPz8gJ2RldmVsb3BtZW50JztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgbG9hZCByZXN1bHQgd2l0aCBzb3VyY2UgaW5mb3JtYXRpb24uXHJcbiAgICogQHJldHVybnMgVGhlIGxvYWQgcmVzdWx0IG9yIG51bGwgaWYgbm90IGxvYWRlZFxyXG4gICAqL1xyXG4gIGdldExvYWRSZXN1bHQoKTogQ29uZmlnTG9hZFJlc3VsdDxUPiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZFJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlcmlhbGl6ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIEpTT04gc3RyaW5nLlxyXG4gICAqIEByZXR1cm5zIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uXHJcbiAgICogQHRocm93cyBDb25maWd1cmF0aW9uRXJyb3IgaWYgY29uZmlndXJhdGlvbiBpcyBub3QgbG9hZGVkXHJcbiAgICovXHJcbiAgc2VyaWFsaXplKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMubG9hZGVkIHx8IHRoaXMuY29uZmlnID09PSBudWxsKSB7XHJcbiAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ0NvbmZpZ3VyYXRpb24gbm90IGxvYWRlZC4gQ2FsbCBsb2FkKCkgZmlyc3QuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IENvbmZpZ01hbmFnZXIgd2l0aCBjb25maWd1cmF0aW9uIGxvYWRlZCBmcm9tIGEgSlNPTiBzdHJpbmcuXHJcbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIHJlc3RvcmluZyBjb25maWd1cmF0aW9uIGZyb20gYSBzZXJpYWxpemVkIHN0YXRlLlxyXG4gICAqIEBwYXJhbSBqc29uIEpTT04gc3RyaW5nIHRvIGRlc2VyaWFsaXplXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9uYWwgQ29uZmlnTWFuYWdlciBvcHRpb25zIChzY2hlbWEgd2lsbCBiZSB1c2VkIGZvciB2YWxpZGF0aW9uKVxyXG4gICAqIEByZXR1cm5zIEEgbmV3IENvbmZpZ01hbmFnZXIgaW5zdGFuY2Ugd2l0aCB0aGUgZGVzZXJpYWxpemVkIGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBzdGF0aWMgZGVzZXJpYWxpemU8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcclxuICAgIGpzb246IHN0cmluZyxcclxuICAgIG9wdGlvbnM6IENvbmZpZ01hbmFnZXJPcHRpb25zPFQ+ID0ge31cclxuICApOiBDb25maWdNYW5hZ2VyPFQ+IHtcclxuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoanNvbik7XHJcblxyXG4gICAgLy8gVmFsaWRhdGUgaWYgc2NoZW1hIGlzIHByb3ZpZGVkXHJcbiAgICBpZiAob3B0aW9ucy5zY2hlbWEpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9ucy5zY2hlbWEuc2FmZVBhcnNlKHBhcnNlZCk7XHJcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICBjb25zdCB6b2RFcnJvciA9IHJlc3VsdC5lcnJvciBhcyBab2RFcnJvcjtcclxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxyXG4gICAgICAgICAgYERlc2VyaWFsaXphdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDogJHt6b2RFcnJvci5lcnJvcnMubWFwKChlKSA9PiBgJHtlLnBhdGguam9pbignLicpfTogJHtlLm1lc3NhZ2V9YCkuam9pbignLCAnKX1gLFxyXG4gICAgICAgICAgem9kRXJyb3IuZXJyb3JzLFxyXG4gICAgICAgICAgdW5kZWZpbmVkXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIENyZWF0ZSBhIG5ldyBDb25maWdNYW5hZ2VyIGFuZCBzZXQgaXRzIGludGVybmFsIHN0YXRlXHJcbiAgICBjb25zdCBtYW5hZ2VyID0gbmV3IENvbmZpZ01hbmFnZXI8VD4ob3B0aW9ucyk7XHJcbiAgICBtYW5hZ2VyLmNvbmZpZyA9IHBhcnNlZCBhcyBUO1xyXG4gICAgbWFuYWdlci5sb2FkZWQgPSB0cnVlO1xyXG4gICAgbWFuYWdlci5sb2FkUmVzdWx0ID0ge1xyXG4gICAgICBjb25maWc6IHBhcnNlZCBhcyBULFxyXG4gICAgICBzb3VyY2VzOiBbeyBsb2FkZXI6ICdkZXNlcmlhbGl6ZScsIGtleXNMb2FkZWQ6IE9iamVjdC5rZXlzKHBhcnNlZCksIGR1cmF0aW9uOiAwIH1dLFxyXG4gICAgICBsb2FkZWRBdDogbmV3IERhdGUoKSxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG1hbmFnZXI7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Base error class for all configuration-related errors
3
+ */
4
+ export class ConfigurationError extends Error {
5
+ /** The underlying cause of this error */
6
+ cause;
7
+ constructor(message, cause) {
8
+ super(message);
9
+ this.name = 'ConfigurationError';
10
+ this.cause = cause;
11
+ Object.setPrototypeOf(this, ConfigurationError.prototype);
12
+ }
13
+ }
14
+ /**
15
+ * Error thrown when configuration validation fails
16
+ */
17
+ export class ValidationError extends ConfigurationError {
18
+ /** Detailed validation errors from Zod */
19
+ validationErrors;
20
+ constructor(message, validationErrors, cause) {
21
+ super(message, cause);
22
+ this.name = 'ValidationError';
23
+ this.validationErrors = validationErrors;
24
+ Object.setPrototypeOf(this, ValidationError.prototype);
25
+ }
26
+ }
27
+ /**
28
+ * Error thrown when an AWS service operation fails
29
+ */
30
+ export class AWSServiceError extends ConfigurationError {
31
+ /** The AWS service that failed */
32
+ service;
33
+ /** The operation that failed */
34
+ operation;
35
+ constructor(message, service, operation, cause) {
36
+ super(message, cause);
37
+ this.name = 'AWSServiceError';
38
+ this.service = service;
39
+ this.operation = operation;
40
+ Object.setPrototypeOf(this, AWSServiceError.prototype);
41
+ }
42
+ }
43
+ /**
44
+ * Error thrown when a configuration loader fails to load
45
+ */
46
+ export class ConfigurationLoadError extends ConfigurationError {
47
+ /** The name of the loader that failed */
48
+ loader;
49
+ constructor(message, loader, cause) {
50
+ super(message, cause);
51
+ this.name = 'ConfigurationLoadError';
52
+ this.loader = loader;
53
+ Object.setPrototypeOf(this, ConfigurationLoadError.prototype);
54
+ }
55
+ }
56
+ /**
57
+ * Error thrown when required configuration keys are missing
58
+ */
59
+ export class MissingConfigurationError extends ConfigurationError {
60
+ /** The keys that are missing */
61
+ missingKeys;
62
+ constructor(message, missingKeys, cause) {
63
+ super(message, cause);
64
+ this.name = 'MissingConfigurationError';
65
+ this.missingKeys = missingKeys;
66
+ Object.setPrototypeOf(this, MissingConfigurationError.prototype);
67
+ }
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9jb25maWctYXdzL3NyYy9lcnJvcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsS0FBSztJQUMzQyx5Q0FBeUM7SUFDekIsS0FBSyxDQUFTO0lBRTlCLFlBQVksT0FBZSxFQUFFLEtBQWE7UUFDeEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLGtCQUFrQjtJQUNyRCwwQ0FBMEM7SUFDMUIsZ0JBQWdCLENBQVU7SUFFMUMsWUFBWSxPQUFlLEVBQUUsZ0JBQXlCLEVBQUUsS0FBYTtRQUNuRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDOUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6RCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLGtCQUFrQjtJQUNyRCxrQ0FBa0M7SUFDbEIsT0FBTyxDQUFTO0lBQ2hDLGdDQUFnQztJQUNoQixTQUFTLENBQVM7SUFFbEMsWUFBWSxPQUFlLEVBQUUsT0FBZSxFQUFFLFNBQWlCLEVBQUUsS0FBYTtRQUM1RSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGtCQUFrQjtJQUM1RCx5Q0FBeUM7SUFDekIsTUFBTSxDQUFTO0lBRS9CLFlBQVksT0FBZSxFQUFFLE1BQWMsRUFBRSxLQUFhO1FBQ3hELEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyx3QkFBd0IsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRSxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxrQkFBa0I7SUFDL0QsZ0NBQWdDO0lBQ2hCLFdBQVcsQ0FBVztJQUV0QyxZQUFZLE9BQWUsRUFBRSxXQUFxQixFQUFFLEtBQWE7UUFDL0QsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLDJCQUEyQixDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciBhbGwgY29uZmlndXJhdGlvbi1yZWxhdGVkIGVycm9yc1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAvKiogVGhlIHVuZGVybHlpbmcgY2F1c2Ugb2YgdGhpcyBlcnJvciAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBjYXVzZT86IEVycm9yO1xyXG5cclxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNhdXNlPzogRXJyb3IpIHtcclxuICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ3VyYXRpb25FcnJvcic7XHJcbiAgICB0aGlzLmNhdXNlID0gY2F1c2U7XHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQ29uZmlndXJhdGlvbkVycm9yLnByb3RvdHlwZSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRXJyb3IgdGhyb3duIHdoZW4gY29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIGZhaWxzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkVycm9yIHtcclxuICAvKiogRGV0YWlsZWQgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBab2QgKi9cclxuICBwdWJsaWMgcmVhZG9ubHkgdmFsaWRhdGlvbkVycm9yczogdW5rbm93bjtcclxuXHJcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCB2YWxpZGF0aW9uRXJyb3JzOiB1bmtub3duLCBjYXVzZT86IEVycm9yKSB7XHJcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XHJcbiAgICB0aGlzLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJztcclxuICAgIHRoaXMudmFsaWRhdGlvbkVycm9ycyA9IHZhbGlkYXRpb25FcnJvcnM7XHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogRXJyb3IgdGhyb3duIHdoZW4gYW4gQVdTIHNlcnZpY2Ugb3BlcmF0aW9uIGZhaWxzXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQVdTU2VydmljZUVycm9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkVycm9yIHtcclxuICAvKiogVGhlIEFXUyBzZXJ2aWNlIHRoYXQgZmFpbGVkICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHNlcnZpY2U6IHN0cmluZztcclxuICAvKiogVGhlIG9wZXJhdGlvbiB0aGF0IGZhaWxlZCAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nLCBjYXVzZT86IEVycm9yKSB7XHJcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7XHJcbiAgICB0aGlzLm5hbWUgPSAnQVdTU2VydmljZUVycm9yJztcclxuICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7XHJcbiAgICB0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBBV1NTZXJ2aWNlRXJyb3IucHJvdG90eXBlKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFcnJvciB0aHJvd24gd2hlbiBhIGNvbmZpZ3VyYXRpb24gbG9hZGVyIGZhaWxzIHRvIGxvYWRcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uTG9hZEVycm9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkVycm9yIHtcclxuICAvKiogVGhlIG5hbWUgb2YgdGhlIGxvYWRlciB0aGF0IGZhaWxlZCAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBsb2FkZXI6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBsb2FkZXI6IHN0cmluZywgY2F1c2U/OiBFcnJvcikge1xyXG4gICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpO1xyXG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ3VyYXRpb25Mb2FkRXJyb3InO1xyXG4gICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7XHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQ29uZmlndXJhdGlvbkxvYWRFcnJvci5wcm90b3R5cGUpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEVycm9yIHRocm93biB3aGVuIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb24ga2V5cyBhcmUgbWlzc2luZ1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIE1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBDb25maWd1cmF0aW9uRXJyb3Ige1xyXG4gIC8qKiBUaGUga2V5cyB0aGF0IGFyZSBtaXNzaW5nICovXHJcbiAgcHVibGljIHJlYWRvbmx5IG1pc3NpbmdLZXlzOiBzdHJpbmdbXTtcclxuXHJcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBtaXNzaW5nS2V5czogc3RyaW5nW10sIGNhdXNlPzogRXJyb3IpIHtcclxuICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcclxuICAgIHRoaXMubmFtZSA9ICdNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yJztcclxuICAgIHRoaXMubWlzc2luZ0tleXMgPSBtaXNzaW5nS2V5cztcclxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNaXNzaW5nQ29uZmlndXJhdGlvbkVycm9yLnByb3RvdHlwZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==