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