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