@dyanet/nestjs-config-aws 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -43
  3. package/dist/cjs/aws-config-loader.js +57 -0
  4. package/dist/cjs/build-loaders.js +58 -0
  5. package/dist/cjs/config.module.js +138 -0
  6. package/dist/cjs/index.js +46 -0
  7. package/dist/cjs/interfaces/config-service.interface.js +11 -0
  8. package/dist/cjs/interfaces/default-schema.interface.js +63 -0
  9. package/dist/cjs/{nestjs-config-aws/src/interfaces → interfaces}/index.js +1 -1
  10. package/dist/cjs/interfaces/module-options.interface.js +3 -0
  11. package/dist/cjs/package.json +3 -0
  12. package/dist/cjs/services/config.service.js +142 -0
  13. package/dist/esm/aws-config-loader.js +54 -0
  14. package/dist/esm/build-loaders.js +55 -0
  15. package/dist/esm/config.module.js +135 -0
  16. package/dist/esm/index.js +18 -0
  17. package/dist/esm/interfaces/config-service.interface.js +7 -0
  18. package/dist/esm/interfaces/default-schema.interface.js +59 -0
  19. package/dist/esm/interfaces/index.js +8 -0
  20. package/dist/esm/interfaces/module-options.interface.js +2 -0
  21. package/dist/esm/package.json +3 -0
  22. package/dist/esm/services/config.service.js +139 -0
  23. package/dist/types/aws-config-loader.d.ts +74 -0
  24. package/dist/types/aws-config-loader.d.ts.map +1 -0
  25. package/dist/types/build-loaders.d.ts +30 -0
  26. package/dist/types/build-loaders.d.ts.map +1 -0
  27. package/dist/types/{nestjs-config-aws/src/config.module.d.ts → config.module.d.ts} +2 -8
  28. package/dist/types/config.module.d.ts.map +1 -0
  29. package/dist/types/index.d.ts +10 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/interfaces/config-service.interface.d.ts.map +1 -0
  32. package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/default-schema.interface.d.ts +14 -14
  33. package/dist/types/interfaces/default-schema.interface.d.ts.map +1 -0
  34. package/dist/types/interfaces/index.d.ts.map +1 -0
  35. package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/module-options.interface.d.ts +22 -3
  36. package/dist/types/interfaces/module-options.interface.d.ts.map +1 -0
  37. package/dist/types/services/config.service.d.ts.map +1 -0
  38. package/package.json +12 -6
  39. package/dist/cjs/config-aws/src/config-manager.js +0 -366
  40. package/dist/cjs/config-aws/src/errors/index.js +0 -77
  41. package/dist/cjs/config-aws/src/index.js +0 -37
  42. package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +0 -3
  43. package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +0 -3
  44. package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +0 -3
  45. package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +0 -3
  46. package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +0 -3
  47. package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -3
  48. package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -3
  49. package/dist/cjs/config-aws/src/loaders/env-file.loader.js +0 -169
  50. package/dist/cjs/config-aws/src/loaders/environment.loader.js +0 -85
  51. package/dist/cjs/config-aws/src/loaders/s3.loader.js +0 -145
  52. package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +0 -169
  53. package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -199
  54. package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +0 -98
  55. package/dist/cjs/config-aws/src/utils/validation.util.js +0 -116
  56. package/dist/cjs/nestjs-config-aws/src/config.module.js +0 -175
  57. package/dist/cjs/nestjs-config-aws/src/index.js +0 -61
  58. package/dist/cjs/nestjs-config-aws/src/integration/index.js +0 -23
  59. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -3
  60. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -3
  61. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/index.js +0 -26
  62. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -3
  63. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -3
  64. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
  65. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -3
  66. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -4
  67. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -52
  68. package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -124
  69. package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -592
  70. package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -385
  71. package/dist/cjs/nestjs-config-aws/src/integration/providers/index.js +0 -20
  72. package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -366
  73. package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -267
  74. package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -517
  75. package/dist/cjs/nestjs-config-aws/src/integration/services/index.js +0 -26
  76. package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -81
  77. package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -465
  78. package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -318
  79. package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -292
  80. package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -595
  81. package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -283
  82. package/dist/cjs/nestjs-config-aws/src/integration/utils/index.js +0 -19
  83. package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -11
  84. package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -63
  85. package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -3
  86. package/dist/cjs/nestjs-config-aws/src/services/config.service.js +0 -142
  87. package/dist/esm/config-aws/src/config-manager.js +0 -362
  88. package/dist/esm/config-aws/src/errors/index.js +0 -69
  89. package/dist/esm/config-aws/src/index.js +0 -21
  90. package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +0 -2
  91. package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +0 -2
  92. package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +0 -2
  93. package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +0 -2
  94. package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +0 -2
  95. package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -2
  96. package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -2
  97. package/dist/esm/config-aws/src/loaders/env-file.loader.js +0 -132
  98. package/dist/esm/config-aws/src/loaders/environment.loader.js +0 -81
  99. package/dist/esm/config-aws/src/loaders/s3.loader.js +0 -141
  100. package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +0 -165
  101. package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -195
  102. package/dist/esm/config-aws/src/utils/env-file-parser.util.js +0 -94
  103. package/dist/esm/config-aws/src/utils/validation.util.js +0 -112
  104. package/dist/esm/nestjs-config-aws/src/config.module.js +0 -172
  105. package/dist/esm/nestjs-config-aws/src/index.js +0 -23
  106. package/dist/esm/nestjs-config-aws/src/integration/index.js +0 -7
  107. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -2
  108. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -2
  109. package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +0 -10
  110. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -2
  111. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -2
  112. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
  113. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -2
  114. package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -3
  115. package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -44
  116. package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -121
  117. package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -589
  118. package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -382
  119. package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +0 -4
  120. package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -363
  121. package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -264
  122. package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -514
  123. package/dist/esm/nestjs-config-aws/src/integration/services/index.js +0 -10
  124. package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -78
  125. package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -462
  126. package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -315
  127. package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -289
  128. package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -589
  129. package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -240
  130. package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +0 -3
  131. package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -7
  132. package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -59
  133. package/dist/esm/nestjs-config-aws/src/interfaces/index.js +0 -8
  134. package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -2
  135. package/dist/esm/nestjs-config-aws/src/services/config.service.js +0 -139
  136. package/dist/types/config-aws/src/config-manager.d.ts +0 -119
  137. package/dist/types/config-aws/src/config-manager.d.ts.map +0 -1
  138. package/dist/types/config-aws/src/errors/index.d.ts +0 -43
  139. package/dist/types/config-aws/src/errors/index.d.ts.map +0 -1
  140. package/dist/types/config-aws/src/index.d.ts +0 -24
  141. package/dist/types/config-aws/src/index.d.ts.map +0 -1
  142. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +0 -33
  143. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +0 -1
  144. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +0 -86
  145. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +0 -1
  146. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +0 -12
  147. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +0 -1
  148. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +0 -10
  149. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +0 -1
  150. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +0 -14
  151. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +0 -1
  152. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +0 -12
  153. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +0 -1
  154. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +0 -14
  155. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +0 -1
  156. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +0 -69
  157. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +0 -1
  158. package/dist/types/config-aws/src/loaders/environment.loader.d.ts +0 -46
  159. package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +0 -1
  160. package/dist/types/config-aws/src/loaders/s3.loader.d.ts +0 -62
  161. package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +0 -1
  162. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +0 -68
  163. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +0 -1
  164. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +0 -78
  165. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
  166. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +0 -45
  167. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +0 -1
  168. package/dist/types/config-aws/src/utils/validation.util.d.ts +0 -53
  169. package/dist/types/config-aws/src/utils/validation.util.d.ts.map +0 -1
  170. package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +0 -1
  171. package/dist/types/nestjs-config-aws/src/index.d.ts +0 -11
  172. package/dist/types/nestjs-config-aws/src/index.d.ts.map +0 -1
  173. package/dist/types/nestjs-config-aws/src/integration/index.d.ts +0 -6
  174. package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +0 -1
  175. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts +0 -71
  176. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
  177. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts +0 -24
  178. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
  179. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts +0 -9
  180. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +0 -1
  181. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts +0 -66
  182. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +0 -1
  183. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts +0 -17
  184. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +0 -1
  185. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts +0 -332
  186. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
  187. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts +0 -259
  188. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
  189. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts +0 -209
  190. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
  191. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts +0 -249
  192. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +0 -1
  193. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts +0 -36
  194. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +0 -1
  195. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts +0 -134
  196. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
  197. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts +0 -119
  198. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +0 -1
  199. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts +0 -3
  200. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +0 -1
  201. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts +0 -84
  202. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +0 -1
  203. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts +0 -84
  204. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +0 -1
  205. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts +0 -158
  206. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +0 -1
  207. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts +0 -9
  208. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +0 -1
  209. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts +0 -41
  210. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +0 -1
  211. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts +0 -192
  212. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +0 -1
  213. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts +0 -87
  214. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
  215. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts +0 -103
  216. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +0 -1
  217. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts +0 -222
  218. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +0 -1
  219. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts +0 -81
  220. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +0 -1
  221. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts +0 -2
  222. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +0 -1
  223. package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +0 -1
  224. package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +0 -1
  225. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +0 -1
  226. package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +0 -1
  227. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +0 -1
  228. /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/config-service.interface.d.ts +0 -0
  229. /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/index.d.ts +0 -0
  230. /package/dist/types/{nestjs-config-aws/src/services → services}/config.service.d.ts +0 -0
@@ -1,169 +0,0 @@
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
@@ -1,85 +0,0 @@
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==
@@ -1,145 +0,0 @@
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
@@ -1,169 +0,0 @@
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=