@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,169 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.EnvFileLoader = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const env_file_parser_util_1 = require("../utils/env-file-parser.util");
40
+ const errors_1 = require("../errors");
41
+ /**
42
+ * Loader that reads configuration from .env files on the filesystem.
43
+ * Uses AWS ECS-compatible format for parsing.
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * // Load from default paths (.env, .env.local)
48
+ * const loader = new EnvFileLoader();
49
+ *
50
+ * // Load from specific paths
51
+ * const loader = new EnvFileLoader({
52
+ * paths: ['.env', '.env.production']
53
+ * });
54
+ *
55
+ * // Disable override (first file wins)
56
+ * const loader = new EnvFileLoader({
57
+ * paths: ['.env', '.env.local'],
58
+ * override: false
59
+ * });
60
+ * ```
61
+ *
62
+ * @see https://docs.aws.amazon.com/AmazonECS/latest/developerguide/use-environment-file.html
63
+ */
64
+ class EnvFileLoader {
65
+ /** @internal */
66
+ _config;
67
+ /** Default paths to search for .env files */
68
+ static DEFAULT_PATHS = ['.env', '.env.local'];
69
+ /** Default file encoding */
70
+ static DEFAULT_ENCODING = 'utf-8';
71
+ constructor(config = {}) {
72
+ this._config = {
73
+ paths: config.paths ?? EnvFileLoader.DEFAULT_PATHS,
74
+ encoding: config.encoding ?? EnvFileLoader.DEFAULT_ENCODING,
75
+ override: config.override ?? true,
76
+ };
77
+ }
78
+ getName() {
79
+ return 'EnvFileLoader';
80
+ }
81
+ /**
82
+ * Check if at least one of the configured .env files exists.
83
+ * @returns Promise resolving to true if any file exists
84
+ */
85
+ async isAvailable() {
86
+ for (const filePath of this._config.paths) {
87
+ const resolvedPath = this.resolvePath(filePath);
88
+ if (await this.fileExists(resolvedPath)) {
89
+ return true;
90
+ }
91
+ }
92
+ return false;
93
+ }
94
+ /**
95
+ * Load configuration from .env files.
96
+ *
97
+ * Files are processed in order. When override is true (default),
98
+ * later files override earlier ones. When override is false,
99
+ * earlier files take precedence.
100
+ *
101
+ * Missing files are silently skipped.
102
+ *
103
+ * @returns Promise resolving to the merged configuration
104
+ * @throws ConfigurationLoadError if a file exists but cannot be read
105
+ */
106
+ async load() {
107
+ const result = {};
108
+ for (const filePath of this._config.paths) {
109
+ const resolvedPath = this.resolvePath(filePath);
110
+ if (!(await this.fileExists(resolvedPath))) {
111
+ // Skip missing files silently
112
+ continue;
113
+ }
114
+ try {
115
+ const content = await this.readFile(resolvedPath);
116
+ const parsed = env_file_parser_util_1.EnvFileParser.parse(content);
117
+ // Merge based on override setting
118
+ if (this._config.override) {
119
+ // Later files override earlier ones
120
+ Object.assign(result, parsed);
121
+ }
122
+ else {
123
+ // Earlier files take precedence - only add keys that don't exist
124
+ for (const [key, value] of Object.entries(parsed)) {
125
+ if (!(key in result)) {
126
+ result[key] = value;
127
+ }
128
+ }
129
+ }
130
+ }
131
+ catch (error) {
132
+ throw new errors_1.ConfigurationLoadError(`Failed to read env file: ${resolvedPath}`, this.getName(), error instanceof Error ? error : undefined);
133
+ }
134
+ }
135
+ return result;
136
+ }
137
+ /**
138
+ * Resolve a file path relative to the current working directory.
139
+ * @internal
140
+ */
141
+ resolvePath(filePath) {
142
+ if (path.isAbsolute(filePath)) {
143
+ return filePath;
144
+ }
145
+ return path.resolve(process.cwd(), filePath);
146
+ }
147
+ /**
148
+ * Check if a file exists.
149
+ * @internal
150
+ */
151
+ async fileExists(filePath) {
152
+ try {
153
+ await fs.promises.access(filePath, fs.constants.R_OK);
154
+ return true;
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ }
160
+ /**
161
+ * Read a file's contents.
162
+ * @internal
163
+ */
164
+ async readFile(filePath) {
165
+ return fs.promises.readFile(filePath, { encoding: this._config.encoding });
166
+ }
167
+ }
168
+ exports.EnvFileLoader = EnvFileLoader;
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWZpbGUubG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vY29uZmlnLWF3cy9zcmMvbG9hZGVycy9lbnYtZmlsZS5sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUc3Qix3RUFBOEQ7QUFDOUQsc0NBQW1EO0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBYSxhQUFhO0lBQ3hCLGdCQUFnQjtJQUNHLE9BQU8sQ0FBZ0M7SUFFMUQsNkNBQTZDO0lBQ3JDLE1BQU0sQ0FBVSxhQUFhLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFL0QsNEJBQTRCO0lBQ3BCLE1BQU0sQ0FBVSxnQkFBZ0IsR0FBbUIsT0FBTyxDQUFDO0lBRW5FLFlBQVksU0FBOEIsRUFBRTtRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLElBQUksYUFBYSxDQUFDLGFBQWE7WUFDbEQsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLGdCQUFnQjtZQUMzRCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFHRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsV0FBVztRQUNmLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMxQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hELElBQUksTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILEtBQUssQ0FBQyxJQUFJO1FBQ1IsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQztRQUUzQyxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVoRCxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzQyw4QkFBOEI7Z0JBQzlCLFNBQVM7WUFDWCxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxNQUFNLEdBQUcsb0NBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTVDLGtDQUFrQztnQkFDbEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUMxQixvQ0FBb0M7b0JBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNoQyxDQUFDO3FCQUFNLENBQUM7b0JBQ04saUVBQWlFO29CQUNqRSxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUNsRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQzs0QkFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQzt3QkFDdEIsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksK0JBQXNCLENBQzlCLDRCQUE0QixZQUFZLEVBQUUsRUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUNkLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUMzQyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sV0FBVyxDQUFDLFFBQWdCO1FBQ3BDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7O09BR0c7SUFDTyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWdCO1FBQ3pDLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxRQUFRLENBQUMsUUFBZ0I7UUFDdkMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLENBQUM7O0FBdEhILHNDQXVIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcclxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcclxuaW1wb3J0IHR5cGUgeyBDb25maWdMb2FkZXIgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy1sb2FkZXIuaW50ZXJmYWNlJztcclxuaW1wb3J0IHR5cGUgeyBFbnZGaWxlTG9hZGVyQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lbnYtZmlsZS1sb2FkZXIuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgRW52RmlsZVBhcnNlciB9IGZyb20gJy4uL3V0aWxzL2Vudi1maWxlLXBhcnNlci51dGlsJztcclxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkxvYWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XHJcblxyXG4vKipcclxuICogTG9hZGVyIHRoYXQgcmVhZHMgY29uZmlndXJhdGlvbiBmcm9tIC5lbnYgZmlsZXMgb24gdGhlIGZpbGVzeXN0ZW0uXHJcbiAqIFVzZXMgQVdTIEVDUy1jb21wYXRpYmxlIGZvcm1hdCBmb3IgcGFyc2luZy5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiAvLyBMb2FkIGZyb20gZGVmYXVsdCBwYXRocyAoLmVudiwgLmVudi5sb2NhbClcclxuICogY29uc3QgbG9hZGVyID0gbmV3IEVudkZpbGVMb2FkZXIoKTtcclxuICpcclxuICogLy8gTG9hZCBmcm9tIHNwZWNpZmljIHBhdGhzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBFbnZGaWxlTG9hZGVyKHtcclxuICogICBwYXRoczogWycuZW52JywgJy5lbnYucHJvZHVjdGlvbiddXHJcbiAqIH0pO1xyXG4gKlxyXG4gKiAvLyBEaXNhYmxlIG92ZXJyaWRlIChmaXJzdCBmaWxlIHdpbnMpXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBFbnZGaWxlTG9hZGVyKHtcclxuICogICBwYXRoczogWycuZW52JywgJy5lbnYubG9jYWwnXSxcclxuICogICBvdmVycmlkZTogZmFsc2VcclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL3VzZS1lbnZpcm9ubWVudC1maWxlLmh0bWxcclxuICovXHJcbmV4cG9ydCBjbGFzcyBFbnZGaWxlTG9hZGVyIGltcGxlbWVudHMgQ29uZmlnTG9hZGVyIHtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb25maWc6IFJlcXVpcmVkPEVudkZpbGVMb2FkZXJDb25maWc+O1xyXG5cclxuICAvKiogRGVmYXVsdCBwYXRocyB0byBzZWFyY2ggZm9yIC5lbnYgZmlsZXMgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1BBVEhTID0gWycuZW52JywgJy5lbnYubG9jYWwnXTtcclxuXHJcbiAgLyoqIERlZmF1bHQgZmlsZSBlbmNvZGluZyAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfRU5DT0RJTkc6IEJ1ZmZlckVuY29kaW5nID0gJ3V0Zi04JztcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBFbnZGaWxlTG9hZGVyQ29uZmlnID0ge30pIHtcclxuICAgIHRoaXMuX2NvbmZpZyA9IHtcclxuICAgICAgcGF0aHM6IGNvbmZpZy5wYXRocyA/PyBFbnZGaWxlTG9hZGVyLkRFRkFVTFRfUEFUSFMsXHJcbiAgICAgIGVuY29kaW5nOiBjb25maWcuZW5jb2RpbmcgPz8gRW52RmlsZUxvYWRlci5ERUZBVUxUX0VOQ09ESU5HLFxyXG4gICAgICBvdmVycmlkZTogY29uZmlnLm92ZXJyaWRlID8/IHRydWUsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuICdFbnZGaWxlTG9hZGVyJztcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGNvbmZpZ3VyZWQgLmVudiBmaWxlcyBleGlzdHMuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdHJ1ZSBpZiBhbnkgZmlsZSBleGlzdHNcclxuICAgKi9cclxuICBhc3luYyBpc0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5fY29uZmlnLnBhdGhzKSB7XHJcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xyXG4gICAgICBpZiAoYXdhaXQgdGhpcy5maWxlRXhpc3RzKHJlc29sdmVkUGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBjb25maWd1cmF0aW9uIGZyb20gLmVudiBmaWxlcy5cclxuICAgKlxyXG4gICAqIEZpbGVzIGFyZSBwcm9jZXNzZWQgaW4gb3JkZXIuIFdoZW4gb3ZlcnJpZGUgaXMgdHJ1ZSAoZGVmYXVsdCksXHJcbiAgICogbGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzLiBXaGVuIG92ZXJyaWRlIGlzIGZhbHNlLFxyXG4gICAqIGVhcmxpZXIgZmlsZXMgdGFrZSBwcmVjZWRlbmNlLlxyXG4gICAqXHJcbiAgICogTWlzc2luZyBmaWxlcyBhcmUgc2lsZW50bHkgc2tpcHBlZC5cclxuICAgKlxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBtZXJnZWQgY29uZmlndXJhdGlvblxyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkxvYWRFcnJvciBpZiBhIGZpbGUgZXhpc3RzIGJ1dCBjYW5ub3QgYmUgcmVhZFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5fY29uZmlnLnBhdGhzKSB7XHJcbiAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5maWxlRXhpc3RzKHJlc29sdmVkUGF0aCkpKSB7XHJcbiAgICAgICAgLy8gU2tpcCBtaXNzaW5nIGZpbGVzIHNpbGVudGx5XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMucmVhZEZpbGUocmVzb2x2ZWRQYXRoKTtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBFbnZGaWxlUGFyc2VyLnBhcnNlKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAvLyBNZXJnZSBiYXNlZCBvbiBvdmVycmlkZSBzZXR0aW5nXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5vdmVycmlkZSkge1xyXG4gICAgICAgICAgLy8gTGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzXHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgcGFyc2VkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gRWFybGllciBmaWxlcyB0YWtlIHByZWNlZGVuY2UgLSBvbmx5IGFkZCBrZXlzIHRoYXQgZG9uJ3QgZXhpc3RcclxuICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlZCkpIHtcclxuICAgICAgICAgICAgaWYgKCEoa2V5IGluIHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uTG9hZEVycm9yKFxyXG4gICAgICAgICAgYEZhaWxlZCB0byByZWFkIGVudiBmaWxlOiAke3Jlc29sdmVkUGF0aH1gLFxyXG4gICAgICAgICAgdGhpcy5nZXROYW1lKCksXHJcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlIGEgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCByZXNvbHZlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmIChwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpKSB7XHJcbiAgICAgIHJldHVybiBmaWxlUGF0aDtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZmlsZVBhdGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgYSBmaWxlIGV4aXN0cy5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgZmlsZUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCBmcy5wcm9taXNlcy5hY2Nlc3MoZmlsZVBhdGgsIGZzLmNvbnN0YW50cy5SX09LKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVhZCBhIGZpbGUncyBjb250ZW50cy5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgcmVhZEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IHRoaXMuX2NvbmZpZy5lbmNvZGluZyB9KTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnvironmentLoader = void 0;
4
+ /**
5
+ * Loader that reads configuration from process.env.
6
+ * Supports prefix filtering and exclusion lists.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // Load all environment variables
11
+ * const loader = new EnvironmentLoader();
12
+ *
13
+ * // Load only variables starting with 'APP_', stripping the prefix
14
+ * const loader = new EnvironmentLoader({ prefix: 'APP_' });
15
+ *
16
+ * // Load all except specific variables
17
+ * const loader = new EnvironmentLoader({ exclude: ['PATH', 'HOME'] });
18
+ *
19
+ * // Combine prefix and exclusion
20
+ * const loader = new EnvironmentLoader({
21
+ * prefix: 'APP_',
22
+ * exclude: ['APP_DEBUG']
23
+ * });
24
+ * ```
25
+ */
26
+ class EnvironmentLoader {
27
+ /** @internal */
28
+ _config;
29
+ constructor(config = {}) {
30
+ this._config = config;
31
+ }
32
+ getName() {
33
+ return 'EnvironmentLoader';
34
+ }
35
+ async isAvailable() {
36
+ return true;
37
+ }
38
+ /**
39
+ * Load configuration from process.env.
40
+ *
41
+ * When a prefix is specified:
42
+ * - Only variables starting with the prefix are included
43
+ * - The prefix is stripped from the resulting key names
44
+ *
45
+ * When an exclusion list is specified:
46
+ * - Variables in the list are excluded from the result
47
+ * - Exclusion is checked against the original key (before prefix stripping)
48
+ *
49
+ * @returns Promise resolving to the loaded configuration
50
+ */
51
+ async load() {
52
+ const result = {};
53
+ const { prefix, exclude = [] } = this._config;
54
+ const excludeSet = new Set(exclude);
55
+ for (const [key, value] of Object.entries(process.env)) {
56
+ // Skip undefined values
57
+ if (value === undefined) {
58
+ continue;
59
+ }
60
+ // Check exclusion list (against original key)
61
+ if (excludeSet.has(key)) {
62
+ continue;
63
+ }
64
+ // Handle prefix filtering
65
+ if (prefix) {
66
+ if (key.startsWith(prefix)) {
67
+ // Strip prefix from key
68
+ const strippedKey = key.slice(prefix.length);
69
+ // Only include if there's a key remaining after stripping
70
+ if (strippedKey) {
71
+ result[strippedKey] = value;
72
+ }
73
+ }
74
+ // Skip keys that don't match the prefix
75
+ }
76
+ else {
77
+ // No prefix - include all non-excluded keys
78
+ result[key] = value;
79
+ }
80
+ }
81
+ return result;
82
+ }
83
+ }
84
+ exports.EnvironmentLoader = EnvironmentLoader;
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQubG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vY29uZmlnLWF3cy9zcmMvbG9hZGVycy9lbnZpcm9ubWVudC5sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQWEsaUJBQWlCO0lBQzVCLGdCQUFnQjtJQUNHLE9BQU8sQ0FBMEI7SUFFcEQsWUFBWSxTQUFrQyxFQUFFO1FBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDZixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxLQUFLLENBQUMsSUFBSTtRQUNSLE1BQU0sTUFBTSxHQUE0QixFQUFFLENBQUM7UUFDM0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM5QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2RCx3QkFBd0I7WUFDeEIsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hCLFNBQVM7WUFDWCxDQUFDO1lBRUQsOENBQThDO1lBQzlDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixTQUFTO1lBQ1gsQ0FBQztZQUVELDBCQUEwQjtZQUMxQixJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUMzQix3QkFBd0I7b0JBQ3hCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM3QywwREFBMEQ7b0JBQzFELElBQUksV0FBVyxFQUFFLENBQUM7d0JBQ2hCLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQzlCLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCx3Q0FBd0M7WUFDMUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLDRDQUE0QztnQkFDNUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN0QixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQWhFRCw4Q0FnRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbmZpZ0xvYWRlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLWxvYWRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgdHlwZSB7IEVudmlyb25tZW50TG9hZGVyQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9lbnZpcm9ubWVudC1sb2FkZXIuaW50ZXJmYWNlJztcclxuXHJcbi8qKlxyXG4gKiBMb2FkZXIgdGhhdCByZWFkcyBjb25maWd1cmF0aW9uIGZyb20gcHJvY2Vzcy5lbnYuXHJcbiAqIFN1cHBvcnRzIHByZWZpeCBmaWx0ZXJpbmcgYW5kIGV4Y2x1c2lvbiBsaXN0cy5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiAvLyBMb2FkIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICogY29uc3QgbG9hZGVyID0gbmV3IEVudmlyb25tZW50TG9hZGVyKCk7XHJcbiAqXHJcbiAqIC8vIExvYWQgb25seSB2YXJpYWJsZXMgc3RhcnRpbmcgd2l0aCAnQVBQXycsIHN0cmlwcGluZyB0aGUgcHJlZml4XHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBFbnZpcm9ubWVudExvYWRlcih7IHByZWZpeDogJ0FQUF8nIH0pO1xyXG4gKlxyXG4gKiAvLyBMb2FkIGFsbCBleGNlcHQgc3BlY2lmaWMgdmFyaWFibGVzXHJcbiAqIGNvbnN0IGxvYWRlciA9IG5ldyBFbnZpcm9ubWVudExvYWRlcih7IGV4Y2x1ZGU6IFsnUEFUSCcsICdIT01FJ10gfSk7XHJcbiAqXHJcbiAqIC8vIENvbWJpbmUgcHJlZml4IGFuZCBleGNsdXNpb25cclxuICogY29uc3QgbG9hZGVyID0gbmV3IEVudmlyb25tZW50TG9hZGVyKHtcclxuICogICBwcmVmaXg6ICdBUFBfJyxcclxuICogICBleGNsdWRlOiBbJ0FQUF9ERUJVRyddXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICovXHJcbmV4cG9ydCBjbGFzcyBFbnZpcm9ubWVudExvYWRlciBpbXBsZW1lbnRzIENvbmZpZ0xvYWRlciB7XHJcbiAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBfY29uZmlnOiBFbnZpcm9ubWVudExvYWRlckNvbmZpZztcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBFbnZpcm9ubWVudExvYWRlckNvbmZpZyA9IHt9KSB7XHJcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XHJcbiAgfVxyXG5cclxuICBnZXROYW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gJ0Vudmlyb25tZW50TG9hZGVyJztcclxuICB9XHJcblxyXG4gIGFzeW5jIGlzQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBwcm9jZXNzLmVudi5cclxuICAgKlxyXG4gICAqIFdoZW4gYSBwcmVmaXggaXMgc3BlY2lmaWVkOlxyXG4gICAqIC0gT25seSB2YXJpYWJsZXMgc3RhcnRpbmcgd2l0aCB0aGUgcHJlZml4IGFyZSBpbmNsdWRlZFxyXG4gICAqIC0gVGhlIHByZWZpeCBpcyBzdHJpcHBlZCBmcm9tIHRoZSByZXN1bHRpbmcga2V5IG5hbWVzXHJcbiAgICpcclxuICAgKiBXaGVuIGFuIGV4Y2x1c2lvbiBsaXN0IGlzIHNwZWNpZmllZDpcclxuICAgKiAtIFZhcmlhYmxlcyBpbiB0aGUgbGlzdCBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgcmVzdWx0XHJcbiAgICogLSBFeGNsdXNpb24gaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBrZXkgKGJlZm9yZSBwcmVmaXggc3RyaXBwaW5nKVxyXG4gICAqXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGxvYWRlZCBjb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XHJcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICBjb25zdCB7IHByZWZpeCwgZXhjbHVkZSA9IFtdIH0gPSB0aGlzLl9jb25maWc7XHJcbiAgICBjb25zdCBleGNsdWRlU2V0ID0gbmV3IFNldChleGNsdWRlKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9jZXNzLmVudikpIHtcclxuICAgICAgLy8gU2tpcCB1bmRlZmluZWQgdmFsdWVzXHJcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENoZWNrIGV4Y2x1c2lvbiBsaXN0IChhZ2FpbnN0IG9yaWdpbmFsIGtleSlcclxuICAgICAgaWYgKGV4Y2x1ZGVTZXQuaGFzKGtleSkpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSGFuZGxlIHByZWZpeCBmaWx0ZXJpbmdcclxuICAgICAgaWYgKHByZWZpeCkge1xyXG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAgICAvLyBTdHJpcCBwcmVmaXggZnJvbSBrZXlcclxuICAgICAgICAgIGNvbnN0IHN0cmlwcGVkS2V5ID0ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xyXG4gICAgICAgICAgLy8gT25seSBpbmNsdWRlIGlmIHRoZXJlJ3MgYSBrZXkgcmVtYWluaW5nIGFmdGVyIHN0cmlwcGluZ1xyXG4gICAgICAgICAgaWYgKHN0cmlwcGVkS2V5KSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtzdHJpcHBlZEtleV0gPSB2YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gU2tpcCBrZXlzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIHByZWZpeFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIE5vIHByZWZpeCAtIGluY2x1ZGUgYWxsIG5vbi1leGNsdWRlZCBrZXlzXHJcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.S3Loader = void 0;
4
+ const client_s3_1 = require("@aws-sdk/client-s3");
5
+ const credential_providers_1 = require("@aws-sdk/credential-providers");
6
+ const env_file_parser_util_1 = require("../utils/env-file-parser.util");
7
+ const errors_1 = require("../errors");
8
+ /**
9
+ * Loader that reads configuration from S3 buckets.
10
+ * Supports JSON and .env file formats with auto-detection.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Load JSON config from S3
15
+ * const loader = new S3Loader({
16
+ * bucket: 'my-config-bucket',
17
+ * key: 'config/app.json',
18
+ * format: 'json'
19
+ * });
20
+ *
21
+ * // Load .env file from S3 with auto-detection
22
+ * const loader = new S3Loader({
23
+ * bucket: 'my-config-bucket',
24
+ * key: 'config/.env'
25
+ * });
26
+ * ```
27
+ *
28
+ * @see https://docs.aws.amazon.com/AmazonECS/latest/developerguide/use-environment-file.html
29
+ */
30
+ class S3Loader {
31
+ /** @internal */
32
+ _config;
33
+ /** @internal */
34
+ _client;
35
+ constructor(config) {
36
+ this._config = {
37
+ bucket: config.bucket,
38
+ key: config.key,
39
+ region: config.region || process.env['AWS_REGION'] || 'us-east-1',
40
+ format: config.format || 'auto',
41
+ };
42
+ this._client = new client_s3_1.S3Client({
43
+ credentials: (0, credential_providers_1.fromNodeProviderChain)(),
44
+ region: this._config.region,
45
+ });
46
+ }
47
+ getName() {
48
+ return `S3Loader(s3://${this._config.bucket}/${this._config.key})`;
49
+ }
50
+ /**
51
+ * Check if this loader is available by verifying AWS credentials.
52
+ * @returns Promise resolving to true if AWS credentials are available
53
+ */
54
+ async isAvailable() {
55
+ try {
56
+ await this._client.config.credentials();
57
+ return true;
58
+ }
59
+ catch {
60
+ return false;
61
+ }
62
+ }
63
+ /**
64
+ * Load configuration from S3.
65
+ * @returns Promise resolving to configuration key-value pairs
66
+ * @throws AWSServiceError if S3 operation fails
67
+ * @throws ConfigurationLoadError if content cannot be parsed
68
+ */
69
+ async load() {
70
+ try {
71
+ const command = new client_s3_1.GetObjectCommand({
72
+ Bucket: this._config.bucket,
73
+ Key: this._config.key,
74
+ });
75
+ const response = await this._client.send(command);
76
+ if (!response.Body) {
77
+ return {};
78
+ }
79
+ const content = await response.Body.transformToString();
80
+ if (!content || content.trim() === '') {
81
+ return {};
82
+ }
83
+ return this.parseContent(content);
84
+ }
85
+ catch (error) {
86
+ if (error instanceof errors_1.ConfigurationLoadError) {
87
+ throw error;
88
+ }
89
+ if (error instanceof Error) {
90
+ if (error.name === 'NoSuchKey' || error.name === 'NoSuchBucket') {
91
+ // Object or bucket doesn't exist - return empty config
92
+ return {};
93
+ }
94
+ if (error.name === 'AccessDenied') {
95
+ throw new errors_1.AWSServiceError(`Access denied when retrieving s3://${this._config.bucket}/${this._config.key}. Check AWS credentials and permissions.`, 'S3', 'GetObject', error);
96
+ }
97
+ }
98
+ throw new errors_1.AWSServiceError(`Failed to retrieve s3://${this._config.bucket}/${this._config.key}: ${error instanceof Error ? error.message : String(error)}`, 'S3', 'GetObject', error instanceof Error ? error : undefined);
99
+ }
100
+ }
101
+ /**
102
+ * Parse content based on format setting or auto-detection.
103
+ * @internal
104
+ */
105
+ parseContent(content) {
106
+ const format = this._config.format === 'auto' ? this.detectFormat(content) : this._config.format;
107
+ if (format === 'json') {
108
+ return this.parseJson(content);
109
+ }
110
+ else {
111
+ return env_file_parser_util_1.EnvFileParser.parse(content);
112
+ }
113
+ }
114
+ /**
115
+ * Detect content format based on structure.
116
+ * JSON content starts with '{' after trimming whitespace.
117
+ * @internal
118
+ */
119
+ detectFormat(content) {
120
+ const trimmed = content.trim();
121
+ if (trimmed.startsWith('{')) {
122
+ return 'json';
123
+ }
124
+ return 'env';
125
+ }
126
+ /**
127
+ * Parse JSON content.
128
+ * @internal
129
+ */
130
+ parseJson(content) {
131
+ try {
132
+ const parsed = JSON.parse(content);
133
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
134
+ return parsed;
135
+ }
136
+ // If not an object, wrap it
137
+ return { CONFIG_VALUE: parsed };
138
+ }
139
+ catch (error) {
140
+ throw new errors_1.ConfigurationLoadError(`Failed to parse JSON from s3://${this._config.bucket}/${this._config.key}: ${error instanceof Error ? error.message : String(error)}`, this.getName(), error instanceof Error ? error : undefined);
141
+ }
142
+ }
143
+ }
144
+ exports.S3Loader = S3Loader;
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMubG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vY29uZmlnLWF3cy9zcmMvbG9hZGVycy9zMy5sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0RBQWdFO0FBQ2hFLHdFQUFzRTtBQUd0RSx3RUFBOEQ7QUFDOUQsc0NBQW9FO0FBRXBFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFhLFFBQVE7SUFDbkIsZ0JBQWdCO0lBQ0csT0FBTyxDQUEyQjtJQUNyRCxnQkFBZ0I7SUFDRyxPQUFPLENBQVc7SUFFckMsWUFBWSxNQUFzQjtRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztZQUNmLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksV0FBVztZQUNqRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNO1NBQ2hDLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksb0JBQVEsQ0FBQztZQUMxQixXQUFXLEVBQUUsSUFBQSw0Q0FBcUIsR0FBRTtZQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1NBQzVCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPO1FBQ0wsT0FBTyxpQkFBaUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNyRSxDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDZixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDO1FB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LENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFNBQVMsQ0FBQyxPQUFlO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbkMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDNUUsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUVELDRCQUE0QjtZQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLCtCQUFzQixDQUM5QixrQ0FBa0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQ3RJLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFDZCxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDM0MsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUEvSUQsNEJBK0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgR2V0T2JqZWN0Q29tbWFuZCwgUzNDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xyXG5pbXBvcnQgeyBmcm9tTm9kZVByb3ZpZGVyQ2hhaW4gfSBmcm9tICdAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVycyc7XHJcbmltcG9ydCB0eXBlIHsgQ29uZmlnTG9hZGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWctbG9hZGVyLmludGVyZmFjZSc7XHJcbmltcG9ydCB0eXBlIHsgUzNMb2FkZXJDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3MzLWxvYWRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBFbnZGaWxlUGFyc2VyIH0gZnJvbSAnLi4vdXRpbHMvZW52LWZpbGUtcGFyc2VyLnV0aWwnO1xyXG5pbXBvcnQgeyBBV1NTZXJ2aWNlRXJyb3IsIENvbmZpZ3VyYXRpb25Mb2FkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xyXG5cclxuLyoqXHJcbiAqIExvYWRlciB0aGF0IHJlYWRzIGNvbmZpZ3VyYXRpb24gZnJvbSBTMyBidWNrZXRzLlxyXG4gKiBTdXBwb3J0cyBKU09OIGFuZCAuZW52IGZpbGUgZm9ybWF0cyB3aXRoIGF1dG8tZGV0ZWN0aW9uLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIC8vIExvYWQgSlNPTiBjb25maWcgZnJvbSBTM1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgUzNMb2FkZXIoe1xyXG4gKiAgIGJ1Y2tldDogJ215LWNvbmZpZy1idWNrZXQnLFxyXG4gKiAgIGtleTogJ2NvbmZpZy9hcHAuanNvbicsXHJcbiAqICAgZm9ybWF0OiAnanNvbidcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIExvYWQgLmVudiBmaWxlIGZyb20gUzMgd2l0aCBhdXRvLWRldGVjdGlvblxyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgUzNMb2FkZXIoe1xyXG4gKiAgIGJ1Y2tldDogJ215LWNvbmZpZy1idWNrZXQnLFxyXG4gKiAgIGtleTogJ2NvbmZpZy8uZW52J1xyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvdXNlLWVudmlyb25tZW50LWZpbGUuaHRtbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFMzTG9hZGVyIGltcGxlbWVudHMgQ29uZmlnTG9hZGVyIHtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb25maWc6IFJlcXVpcmVkPFMzTG9hZGVyQ29uZmlnPjtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnQ6IFMzQ2xpZW50O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFMzTG9hZGVyQ29uZmlnKSB7XHJcbiAgICB0aGlzLl9jb25maWcgPSB7XHJcbiAgICAgIGJ1Y2tldDogY29uZmlnLmJ1Y2tldCxcclxuICAgICAga2V5OiBjb25maWcua2V5LFxyXG4gICAgICByZWdpb246IGNvbmZpZy5yZWdpb24gfHwgcHJvY2Vzcy5lbnZbJ0FXU19SRUdJT04nXSB8fCAndXMtZWFzdC0xJyxcclxuICAgICAgZm9ybWF0OiBjb25maWcuZm9ybWF0IHx8ICdhdXRvJyxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5fY2xpZW50ID0gbmV3IFMzQ2xpZW50KHtcclxuICAgICAgY3JlZGVudGlhbHM6IGZyb21Ob2RlUHJvdmlkZXJDaGFpbigpLFxyXG4gICAgICByZWdpb246IHRoaXMuX2NvbmZpZy5yZWdpb24sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgUzNMb2FkZXIoczM6Ly8ke3RoaXMuX2NvbmZpZy5idWNrZXR9LyR7dGhpcy5fY29uZmlnLmtleX0pYDtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGlzIGxvYWRlciBpcyBhdmFpbGFibGUgYnkgdmVyaWZ5aW5nIEFXUyBjcmVkZW50aWFscy5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0cnVlIGlmIEFXUyBjcmVkZW50aWFscyBhcmUgYXZhaWxhYmxlXHJcbiAgICovXHJcbiAgYXN5bmMgaXNBdmFpbGFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9jbGllbnQuY29uZmlnLmNyZWRlbnRpYWxzKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIFMzLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGNvbmZpZ3VyYXRpb24ga2V5LXZhbHVlIHBhaXJzXHJcbiAgICogQHRocm93cyBBV1NTZXJ2aWNlRXJyb3IgaWYgUzMgb3BlcmF0aW9uIGZhaWxzXHJcbiAgICogQHRocm93cyBDb25maWd1cmF0aW9uTG9hZEVycm9yIGlmIGNvbnRlbnQgY2Fubm90IGJlIHBhcnNlZFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyBHZXRPYmplY3RDb21tYW5kKHtcclxuICAgICAgICBCdWNrZXQ6IHRoaXMuX2NvbmZpZy5idWNrZXQsXHJcbiAgICAgICAgS2V5OiB0aGlzLl9jb25maWcua2V5LFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fY2xpZW50LnNlbmQoY29tbWFuZCk7XHJcblxyXG4gICAgICBpZiAoIXJlc3BvbnNlLkJvZHkpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZXNwb25zZS5Cb2R5LnRyYW5zZm9ybVRvU3RyaW5nKCk7XHJcblxyXG4gICAgICBpZiAoIWNvbnRlbnQgfHwgY29udGVudC50cmltKCkgPT09ICcnKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5wYXJzZUNvbnRlbnQoY29udGVudCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uTG9hZEVycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdOb1N1Y2hLZXknIHx8IGVycm9yLm5hbWUgPT09ICdOb1N1Y2hCdWNrZXQnKSB7XHJcbiAgICAgICAgICAvLyBPYmplY3Qgb3IgYnVja2V0IGRvZXNuJ3QgZXhpc3QgLSByZXR1cm4gZW1wdHkgY29uZmlnXHJcbiAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0FjY2Vzc0RlbmllZCcpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBBV1NTZXJ2aWNlRXJyb3IoXHJcbiAgICAgICAgICAgIGBBY2Nlc3MgZGVuaWVkIHdoZW4gcmV0cmlldmluZyBzMzovLyR7dGhpcy5fY29uZmlnLmJ1Y2tldH0vJHt0aGlzLl9jb25maWcua2V5fS4gQ2hlY2sgQVdTIGNyZWRlbnRpYWxzIGFuZCBwZXJtaXNzaW9ucy5gLFxyXG4gICAgICAgICAgICAnUzMnLFxyXG4gICAgICAgICAgICAnR2V0T2JqZWN0JyxcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhyb3cgbmV3IEFXU1NlcnZpY2VFcnJvcihcclxuICAgICAgICBgRmFpbGVkIHRvIHJldHJpZXZlIHMzOi8vJHt0aGlzLl9jb25maWcuYnVja2V0fS8ke3RoaXMuX2NvbmZpZy5rZXl9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxyXG4gICAgICAgICdTMycsXHJcbiAgICAgICAgJ0dldE9iamVjdCcsXHJcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFyc2UgY29udGVudCBiYXNlZCBvbiBmb3JtYXQgc2V0dGluZyBvciBhdXRvLWRldGVjdGlvbi5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgcGFyc2VDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMuX2NvbmZpZy5mb3JtYXQgPT09ICdhdXRvJyA/IHRoaXMuZGV0ZWN0Rm9ybWF0KGNvbnRlbnQpIDogdGhpcy5fY29uZmlnLmZvcm1hdDtcclxuXHJcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGFyc2VKc29uKGNvbnRlbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIEVudkZpbGVQYXJzZXIucGFyc2UoY29udGVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXRlY3QgY29udGVudCBmb3JtYXQgYmFzZWQgb24gc3RydWN0dXJlLlxyXG4gICAqIEpTT04gY29udGVudCBzdGFydHMgd2l0aCAneycgYWZ0ZXIgdHJpbW1pbmcgd2hpdGVzcGFjZS5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZGV0ZWN0Rm9ybWF0KGNvbnRlbnQ6IHN0cmluZyk6ICdqc29uJyB8ICdlbnYnIHtcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBjb250ZW50LnRyaW0oKTtcclxuICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoJ3snKSkge1xyXG4gICAgICByZXR1cm4gJ2pzb24nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICdlbnYnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGFyc2UgSlNPTiBjb250ZW50LlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBwYXJzZUpzb24oY29udGVudDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShjb250ZW50KTtcclxuXHJcbiAgICAgIGlmICh0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJiBwYXJzZWQgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xyXG4gICAgICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIG5vdCBhbiBvYmplY3QsIHdyYXAgaXRcclxuICAgICAgcmV0dXJuIHsgQ09ORklHX1ZBTFVFOiBwYXJzZWQgfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uTG9hZEVycm9yKFxyXG4gICAgICAgIGBGYWlsZWQgdG8gcGFyc2UgSlNPTiBmcm9tIHMzOi8vJHt0aGlzLl9jb25maWcuYnVja2V0fS8ke3RoaXMuX2NvbmZpZy5rZXl9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gLFxyXG4gICAgICAgIHRoaXMuZ2V0TmFtZSgpLFxyXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IHVuZGVmaW5lZCxcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecretsManagerLoader = void 0;
4
+ const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
5
+ const credential_providers_1 = require("@aws-sdk/credential-providers");
6
+ const errors_1 = require("../errors");
7
+ /**
8
+ * Loader that reads configuration from AWS Secrets Manager.
9
+ * Supports environment-aware path construction.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // Basic usage
14
+ * const loader = new SecretsManagerLoader({
15
+ * secretName: '/my-app/config',
16
+ * region: 'us-east-1'
17
+ * });
18
+ *
19
+ * // With environment mapping
20
+ * const loader = new SecretsManagerLoader({
21
+ * secretName: '/my-app/config',
22
+ * environmentMapping: {
23
+ * development: 'dev',
24
+ * staging: 'stg',
25
+ * production: 'prod'
26
+ * }
27
+ * });
28
+ * ```
29
+ */
30
+ class SecretsManagerLoader {
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
+ secretName: config.secretName || '/nestjs-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
+ };
49
+ // Initialize AWS Secrets Manager client
50
+ this._client = new client_secrets_manager_1.SecretsManagerClient({
51
+ credentials: (0, credential_providers_1.fromNodeProviderChain)(),
52
+ region: this._config.region,
53
+ });
54
+ }
55
+ /**
56
+ * Get the name of this loader for logging and debugging.
57
+ * @returns The loader name with secret path or base secret name if path cannot be built
58
+ */
59
+ getName() {
60
+ // Avoid calling buildSecretName() to prevent stack overflow when
61
+ // environment mapping is missing - buildSecretName() throws an error
62
+ // that includes getName() in the message, causing infinite recursion.
63
+ const envPrefix = this._config.environmentMapping[this._appEnv];
64
+ if (envPrefix) {
65
+ return `SecretsManagerLoader(/${envPrefix}${this._config.secretName})`;
66
+ }
67
+ // Fallback to base secret name when environment mapping is unavailable
68
+ return `SecretsManagerLoader(${this._config.secretName})`;
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 Secrets Manager.
90
+ * @returns Promise resolving to configuration key-value pairs from the secret
91
+ * @throws AWSServiceError if AWS operation fails
92
+ * @throws ConfigurationLoadError if secret cannot be parsed
93
+ */
94
+ async load() {
95
+ // Skip loading in local environment
96
+ if (this._appEnv === 'local') {
97
+ return {};
98
+ }
99
+ const secretName = this.buildSecretName();
100
+ try {
101
+ const command = new client_secrets_manager_1.GetSecretValueCommand({ SecretId: secretName });
102
+ const response = await this._client.send(command);
103
+ if (!response.SecretString) {
104
+ return {};
105
+ }
106
+ // Try to parse as JSON, fallback to string value
107
+ try {
108
+ const parsed = JSON.parse(response.SecretString);
109
+ // Ensure we return an object for configuration merging
110
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
111
+ return parsed;
112
+ }
113
+ else {
114
+ // If it's not an object, wrap it in a configuration object
115
+ return { SECRET_VALUE: parsed };
116
+ }
117
+ }
118
+ catch {
119
+ // If JSON parsing fails, treat as a single string value
120
+ return { SECRET_VALUE: response.SecretString };
121
+ }
122
+ }
123
+ catch (error) {
124
+ // Handle specific AWS errors
125
+ if (error instanceof Error) {
126
+ if (error.name === 'ResourceNotFoundException') {
127
+ // Secret doesn't exist - this is not necessarily an error in all environments
128
+ return {};
129
+ }
130
+ if (error.name === 'AccessDeniedException') {
131
+ throw new errors_1.AWSServiceError(`Access denied when retrieving secret '${secretName}'. Check AWS credentials and permissions.`, 'SecretsManager', 'GetSecretValue', error);
132
+ }
133
+ if (error.name === 'InvalidRequestException') {
134
+ throw new errors_1.AWSServiceError(`Invalid request when retrieving secret '${secretName}'. Check secret name format.`, 'SecretsManager', 'GetSecretValue', error);
135
+ }
136
+ }
137
+ // For other errors, wrap in AWSServiceError
138
+ throw new errors_1.AWSServiceError(`Failed to retrieve secret '${secretName}' from AWS Secrets Manager: ${error instanceof Error ? error.message : String(error)}`, 'SecretsManager', 'GetSecretValue', error instanceof Error ? error : undefined);
139
+ }
140
+ }
141
+ /**
142
+ * Build the environment-aware secret name/path.
143
+ * @returns The full secret name with environment prefix
144
+ */
145
+ buildSecretName() {
146
+ const envPrefix = this._config.environmentMapping[this._appEnv];
147
+ if (!envPrefix) {
148
+ throw new errors_1.ConfigurationLoadError(`No environment mapping found for APP_ENV '${this._appEnv}'. ` +
149
+ `Available environments: ${Object.keys(this._config.environmentMapping).join(', ')}`, this.getName());
150
+ }
151
+ return `/${envPrefix}${this._config.secretName}`;
152
+ }
153
+ /**
154
+ * Get the current app environment.
155
+ * @returns The current APP_ENV or NODE_ENV value
156
+ */
157
+ getAppEnv() {
158
+ return this._appEnv;
159
+ }
160
+ /**
161
+ * Get the environment mapping configuration.
162
+ * @returns The environment mapping record
163
+ */
164
+ getEnvironmentMapping() {
165
+ return { ...this._config.environmentMapping };
166
+ }
167
+ }
168
+ exports.SecretsManagerLoader = SecretsManagerLoader;
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjcmV0cy1tYW5hZ2VyLmxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2NvbmZpZy1hd3Mvc3JjL2xvYWRlcnMvc2VjcmV0cy1tYW5hZ2VyLmxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw0RUFBOEY7QUFDOUYsd0VBQXNFO0FBSXRFLHNDQUFvRTtBQUVwRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQWEsb0JBQW9CO0lBQy9CLGdCQUFnQjtJQUNHLE9BQU8sQ0FBdUI7SUFDakQsZ0JBQWdCO0lBQ0csT0FBTyxDQUF1QztJQUNqRSxnQkFBZ0I7SUFDRyxPQUFPLENBQVM7SUFFbkMsWUFBWSxTQUFxQyxFQUFFO1FBQ2pELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sQ0FBQztRQUU1RSw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRztZQUNiLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLG9CQUFvQjtZQUNyRCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLFdBQVc7WUFDakUsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLGtCQUFrQixJQUFJO2dCQUMvQyxXQUFXLEVBQUUsS0FBSztnQkFDbEIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osVUFBVSxFQUFFLFlBQVk7YUFDekI7U0FDRixDQUFDO1FBRUYsd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSw2Q0FBb0IsQ0FBQztZQUN0QyxXQUFXLEVBQUUsSUFBQSw0Q0FBcUIsR0FBRTtZQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO1NBQzVCLENBQUMsQ0FBQztJQUNM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SSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ2hELENBQUM7Q0FDRjtBQTVLRCxvREE0S0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XHJcbmltcG9ydCB7IGZyb21Ob2RlUHJvdmlkZXJDaGFpbiB9IGZyb20gJ0Bhd3Mtc2RrL2NyZWRlbnRpYWwtcHJvdmlkZXJzJztcclxuXHJcbmltcG9ydCB0eXBlIHsgQ29uZmlnTG9hZGVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWctbG9hZGVyLmludGVyZmFjZSc7XHJcbmltcG9ydCB0eXBlIHsgU2VjcmV0c01hbmFnZXJMb2FkZXJDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NlY3JldHMtbWFuYWdlci1sb2FkZXIuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgQVdTU2VydmljZUVycm9yLCBDb25maWd1cmF0aW9uTG9hZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcclxuXHJcbi8qKlxyXG4gKiBMb2FkZXIgdGhhdCByZWFkcyBjb25maWd1cmF0aW9uIGZyb20gQVdTIFNlY3JldHMgTWFuYWdlci5cclxuICogU3VwcG9ydHMgZW52aXJvbm1lbnQtYXdhcmUgcGF0aCBjb25zdHJ1Y3Rpb24uXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogLy8gQmFzaWMgdXNhZ2VcclxuICogY29uc3QgbG9hZGVyID0gbmV3IFNlY3JldHNNYW5hZ2VyTG9hZGVyKHtcclxuICogICBzZWNyZXROYW1lOiAnL215LWFwcC9jb25maWcnLFxyXG4gKiAgIHJlZ2lvbjogJ3VzLWVhc3QtMSdcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIFdpdGggZW52aXJvbm1lbnQgbWFwcGluZ1xyXG4gKiBjb25zdCBsb2FkZXIgPSBuZXcgU2VjcmV0c01hbmFnZXJMb2FkZXIoe1xyXG4gKiAgIHNlY3JldE5hbWU6ICcvbXktYXBwL2NvbmZpZycsXHJcbiAqICAgZW52aXJvbm1lbnRNYXBwaW5nOiB7XHJcbiAqICAgICBkZXZlbG9wbWVudDogJ2RldicsXHJcbiAqICAgICBzdGFnaW5nOiAnc3RnJyxcclxuICogICAgIHByb2R1Y3Rpb246ICdwcm9kJ1xyXG4gKiAgIH1cclxuICogfSk7XHJcbiAqIGBgYFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNlY3JldHNNYW5hZ2VyTG9hZGVyIGltcGxlbWVudHMgQ29uZmlnTG9hZGVyIHtcclxuICAvKiogQGludGVybmFsICovXHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jbGllbnQ6IFNlY3JldHNNYW5hZ2VyQ2xpZW50O1xyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2NvbmZpZzogUmVxdWlyZWQ8U2VjcmV0c01hbmFnZXJMb2FkZXJDb25maWc+O1xyXG4gIC8qKiBAaW50ZXJuYWwgKi9cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2FwcEVudjogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFNlY3JldHNNYW5hZ2VyTG9hZGVyQ29uZmlnID0ge30pIHtcclxuICAgIHRoaXMuX2FwcEVudiA9IHByb2Nlc3MuZW52WydBUFBfRU5WJ10gfHwgcHJvY2Vzcy5lbnZbJ05PREVfRU5WJ10gfHwgJ2xvY2FsJztcclxuXHJcbiAgICAvLyBTZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uXHJcbiAgICB0aGlzLl9jb25maWcgPSB7XHJcbiAgICAgIHNlY3JldE5hbWU6IGNvbmZpZy5zZWNyZXROYW1lIHx8ICcvbmVzdGpzLWNvbmZpZy1hd3MnLFxyXG4gICAgICByZWdpb246IGNvbmZpZy5yZWdpb24gfHwgcHJvY2Vzcy5lbnZbJ0FXU19SRUdJT04nXSB8fCAndXMtZWFzdC0xJyxcclxuICAgICAgZW52aXJvbm1lbnRNYXBwaW5nOiBjb25maWcuZW52aXJvbm1lbnRNYXBwaW5nIHx8IHtcclxuICAgICAgICBkZXZlbG9wbWVudDogJ2RldicsXHJcbiAgICAgICAgdGVzdDogJ3Rlc3QnLFxyXG4gICAgICAgIHByb2R1Y3Rpb246ICdwcm9kdWN0aW9uJyxcclxuICAgICAgfSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBBV1MgU2VjcmV0cyBNYW5hZ2VyIGNsaWVudFxyXG4gICAgdGhpcy5fY2xpZW50ID0gbmV3IFNlY3JldHNNYW5hZ2VyQ2xpZW50KHtcclxuICAgICAgY3JlZGVudGlhbHM6IGZyb21Ob2RlUHJvdmlkZXJDaGFpbigpLFxyXG4gICAgICByZWdpb246IHRoaXMuX2NvbmZpZy5yZWdpb24sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBsb2FkZXIgZm9yIGxvZ2dpbmcgYW5kIGRlYnVnZ2luZy5cclxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVyIG5hbWUgd2l0aCBzZWNyZXQgcGF0aCBvciBiYXNlIHNlY3JldCBuYW1lIGlmIHBhdGggY2Fubm90IGJlIGJ1aWx0XHJcbiAgICovXHJcbiAgZ2V0TmFtZSgpOiBzdHJpbmcge1xyXG4gICAgLy8gQXZvaWQgY2FsbGluZyBidWlsZFNlY3JldE5hbWUoKSB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93IHdoZW5cclxuICAgIC8vIGVudmlyb25tZW50IG1hcHBpbmcgaXMgbWlzc2luZyAtIGJ1aWxkU2VjcmV0TmFtZSgpIHRocm93cyBhbiBlcnJvclxyXG4gICAgLy8gdGhhdCBpbmNsdWRlcyBnZXROYW1lKCkgaW4gdGhlIG1lc3NhZ2UsIGNhdXNpbmcgaW5maW5pdGUgcmVjdXJzaW9uLlxyXG4gICAgY29uc3QgZW52UHJlZml4ID0gdGhpcy5fY29uZmlnLmVudmlyb25tZW50TWFwcGluZ1t0aGlzLl9hcHBFbnZdO1xyXG4gICAgaWYgKGVudlByZWZpeCkge1xyXG4gICAgICByZXR1cm4gYFNlY3JldHNNYW5hZ2VyTG9hZGVyKC8ke2VudlByZWZpeH0ke3RoaXMuX2NvbmZpZy5zZWNyZXROYW1lfSlgO1xyXG4gICAgfVxyXG4gICAgLy8gRmFsbGJhY2sgdG8gYmFzZSBzZWNyZXQgbmFtZSB3aGVuIGVudmlyb25tZW50IG1hcHBpbmcgaXMgdW5hdmFpbGFibGVcclxuICAgIHJldHVybiBgU2VjcmV0c01hbmFnZXJMb2FkZXIoJHt0aGlzLl9jb25maWcuc2VjcmV0TmFtZX0pYDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoaXMgbG9hZGVyIGlzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0cnVlIGlmIG5vdCBpbiBsb2NhbCBlbnZpcm9ubWVudCBhbmQgQVdTIGNyZWRlbnRpYWxzIGFyZSBhdmFpbGFibGVcclxuICAgKi9cclxuICBhc3luYyBpc0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIFNraXAgaW4gbG9jYWwgZW52aXJvbm1lbnRcclxuICAgIGlmICh0aGlzLl9hcHBFbnYgPT09ICdsb2NhbCcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFRlc3QgQVdTIGNyZWRlbnRpYWxzIGJ5IGF0dGVtcHRpbmcgdG8gZ2V0IGNhbGxlciBpZGVudGl0eVxyXG4gICAgICBhd2FpdCB0aGlzLl9jbGllbnQuY29uZmlnLmNyZWRlbnRpYWxzKCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gY29uZmlndXJhdGlvbiBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgc2VjcmV0XHJcbiAgICogQHRocm93cyBBV1NTZXJ2aWNlRXJyb3IgaWYgQVdTIG9wZXJhdGlvbiBmYWlsc1xyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkxvYWRFcnJvciBpZiBzZWNyZXQgY2Fubm90IGJlIHBhcnNlZFxyXG4gICAqL1xyXG4gIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xyXG4gICAgLy8gU2tpcCBsb2FkaW5nIGluIGxvY2FsIGVudmlyb25tZW50XHJcbiAgICBpZiAodGhpcy5fYXBwRW52ID09PSAnbG9jYWwnKSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWNyZXROYW1lID0gdGhpcy5idWlsZFNlY3JldE5hbWUoKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjb21tYW5kID0gbmV3IEdldFNlY3JldFZhbHVlQ29tbWFuZCh7IFNlY3JldElkOiBzZWNyZXROYW1lIH0pO1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2NsaWVudC5zZW5kKGNvbW1hbmQpO1xyXG5cclxuICAgICAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRyeSB0byBwYXJzZSBhcyBKU09OLCBmYWxsYmFjayB0byBzdHJpbmcgdmFsdWVcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHJlc3BvbnNlLlNlY3JldFN0cmluZyk7XHJcblxyXG4gICAgICAgIC8vIEVuc3VyZSB3ZSByZXR1cm4gYW4gb2JqZWN0IGZvciBjb25maWd1cmF0aW9uIG1lcmdpbmdcclxuICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiYgcGFyc2VkICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHBhcnNlZCkpIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIElmIGl0J3Mgbm90IGFuIG9iamVjdCwgd3JhcCBpdCBpbiBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICAgICAgICByZXR1cm4geyBTRUNSRVRfVkFMVUU6IHBhcnNlZCB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgLy8gSWYgSlNPTiBwYXJzaW5nIGZhaWxzLCB0cmVhdCBhcyBhIHNpbmdsZSBzdHJpbmcgdmFsdWVcclxuICAgICAgICByZXR1cm4geyBTRUNSRVRfVkFMVUU6IHJlc3BvbnNlLlNlY3JldFN0cmluZyB9O1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyBIYW5kbGUgc3BlY2lmaWMgQVdTIGVycm9yc1xyXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgIGlmIChlcnJvci5uYW1lID09PSAnUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbicpIHtcclxuICAgICAgICAgIC8vIFNlY3JldCBkb2Vzbid0IGV4aXN0IC0gdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IgaW4gYWxsIGVudmlyb25tZW50c1xyXG4gICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdBY2Nlc3NEZW5pZWRFeGNlcHRpb24nKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgQVdTU2VydmljZUVycm9yKFxyXG4gICAgICAgICAgICBgQWNjZXNzIGRlbmllZCB3aGVuIHJldHJpZXZpbmcgc2VjcmV0ICcke3NlY3JldE5hbWV9Jy4gQ2hlY2sgQVdTIGNyZWRlbnRpYWxzIGFuZCBwZXJtaXNzaW9ucy5gLFxyXG4gICAgICAgICAgICAnU2VjcmV0c01hbmFnZXInLFxyXG4gICAgICAgICAgICAnR2V0U2VjcmV0VmFsdWUnLFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0ludmFsaWRSZXF1ZXN0RXhjZXB0aW9uJykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEFXU1NlcnZpY2VFcnJvcihcclxuICAgICAgICAgICAgYEludmFsaWQgcmVxdWVzdCB3aGVuIHJldHJpZXZpbmcgc2VjcmV0ICcke3NlY3JldE5hbWV9Jy4gQ2hlY2sgc2VjcmV0IG5hbWUgZm9ybWF0LmAsXHJcbiAgICAgICAgICAgICdTZWNyZXRzTWFuYWdlcicsXHJcbiAgICAgICAgICAgICdHZXRTZWNyZXRWYWx1ZScsXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEZvciBvdGhlciBlcnJvcnMsIHdyYXAgaW4gQVdTU2VydmljZUVycm9yXHJcbiAgICAgIHRocm93IG5ldyBBV1NTZXJ2aWNlRXJyb3IoXHJcbiAgICAgICAgYEZhaWxlZCB0byByZXRyaWV2ZSBzZWNyZXQgJyR7c2VjcmV0TmFtZX0nIGZyb20gQVdTIFNlY3JldHMgTWFuYWdlcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcclxuICAgICAgICAnU2VjcmV0c01hbmFnZXInLFxyXG4gICAgICAgICdHZXRTZWNyZXRWYWx1ZScsXHJcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogdW5kZWZpbmVkLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGQgdGhlIGVudmlyb25tZW50LWF3YXJlIHNlY3JldCBuYW1lL3BhdGguXHJcbiAgICogQHJldHVybnMgVGhlIGZ1bGwgc2VjcmV0IG5hbWUgd2l0aCBlbnZpcm9ubWVudCBwcmVmaXhcclxuICAgKi9cclxuICBidWlsZFNlY3JldE5hbWUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGVudlByZWZpeCA9IHRoaXMuX2NvbmZpZy5lbnZpcm9ubWVudE1hcHBpbmdbdGhpcy5fYXBwRW52XTtcclxuXHJcbiAgICBpZiAoIWVudlByZWZpeCkge1xyXG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkxvYWRFcnJvcihcclxuICAgICAgICBgTm8gZW52aXJvbm1lbnQgbWFwcGluZyBmb3VuZCBmb3IgQVBQX0VOViAnJHt0aGlzLl9hcHBFbnZ9Jy4gYCArXHJcbiAgICAgICAgICBgQXZhaWxhYmxlIGVudmlyb25tZW50czogJHtPYmplY3Qua2V5cyh0aGlzLl9jb25maWcuZW52aXJvbm1lbnRNYXBwaW5nKS5qb2luKCcsICcpfWAsXHJcbiAgICAgICAgdGhpcy5nZXROYW1lKCksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAvJHtlbnZQcmVmaXh9JHt0aGlzLl9jb25maWcuc2VjcmV0TmFtZX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IGFwcCBlbnZpcm9ubWVudC5cclxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBBUFBfRU5WIG9yIE5PREVfRU5WIHZhbHVlXHJcbiAgICovXHJcbiAgZ2V0QXBwRW52KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXBwRW52O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBlbnZpcm9ubWVudCBtYXBwaW5nIGNvbmZpZ3VyYXRpb24uXHJcbiAgICogQHJldHVybnMgVGhlIGVudmlyb25tZW50IG1hcHBpbmcgcmVjb3JkXHJcbiAgICovXHJcbiAgZ2V0RW52aXJvbm1lbnRNYXBwaW5nKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5fY29uZmlnLmVudmlyb25tZW50TWFwcGluZyB9O1xyXG4gIH1cclxufVxyXG4iXX0=